Types bugfixes and name change

This commit is contained in:
Lalle 2023-05-05 04:15:53 +02:00
parent e4dda4dbf8
commit cdc878e1f2
No known key found for this signature in database
GPG Key ID: A6583D207A8F6B0D
29 changed files with 2751 additions and 464 deletions

View File

@ -3,7 +3,7 @@ clean:
sneed: clean sneed: clean
npm run build npm run build
cat ./dist/4chan-XT.user.js | xclip -selection clipboard cat ./dist/4chan-XZ.user.js | xclip -selection clipboard
diagnostic: diagnostic:
tsc >> temp.txt tsc >> temp.txt

2585
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
{ {
"name": "4chan-XT", "name": "4chanxz",
"description": "4chan XT is a script that adds various features to anonymous imageboards.", "description": "4chan XZ is a script that adds various features to anonymous imageboards.",
"meta": { "meta": {
"name": "4chan XT", "name": "4chan XZ",
"path": "4chan-XT", "path": "4chan-XZ",
"fork": "TuxedoTako", "fork": "LalleSX",
"page": "https://github.com/TuxedoTako/4chan-xt", "page": "https://github.com/TuxedoTako/4chan-xt",
"downloads": "https://github.com/TuxedoTako/4chan-xt/releases", "downloads": "https://github.com/TuxedoTako/4chan-xt/releases",
"oldVersions": "https://raw.githubusercontent.com/ccd0/4chan-x/", "oldVersions": "https://raw.githubusercontent.com/ccd0/4chan-x/",
@ -107,13 +107,8 @@
"@types/node": "^18.14.5", "@types/node": "^18.14.5",
"@violentmonkey/types": "^0.1.5", "@violentmonkey/types": "^0.1.5",
"chrome-webstore-upload": "^1.0.0", "chrome-webstore-upload": "^1.0.0",
"esprima": "^4.0.1",
"font-awesome": "=4.7.0", "font-awesome": "=4.7.0",
"jshint": "^2.13.4",
"jszip": "^3.10.0",
"lodash.template": "^4.5.0", "lodash.template": "^4.5.0",
"markdown-it": "^12.3.2",
"markdown-it-anchor": "^7.1.0",
"request": "^2.88.2", "request": "^2.88.2",
"rollup": "^3.17.2", "rollup": "^3.17.2",
"tslib": "^2.5.0", "tslib": "^2.5.0",

248
pnpm-lock.yaml generated
View File

@ -51,27 +51,12 @@ devDependencies:
chrome-webstore-upload: chrome-webstore-upload:
specifier: ^1.0.0 specifier: ^1.0.0
version: 1.0.0 version: 1.0.0
esprima:
specifier: ^4.0.1
version: 4.0.1
font-awesome: font-awesome:
specifier: '=4.7.0' specifier: '=4.7.0'
version: 4.7.0 version: 4.7.0
jshint:
specifier: ^2.13.4
version: 2.13.4
jszip:
specifier: ^3.10.0
version: 3.10.0
lodash.template: lodash.template:
specifier: ^4.5.0 specifier: ^4.5.0
version: 4.5.0 version: 4.5.0
markdown-it:
specifier: ^12.3.2
version: 12.3.2
markdown-it-anchor:
specifier: ^7.1.0
version: 7.1.0(markdown-it@12.3.2)
request: request:
specifier: ^2.88.2 specifier: ^2.88.2
version: 2.88.2 version: 2.88.2
@ -499,6 +484,7 @@ packages:
/argparse@2.0.1: /argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: false
/array-buffer-byte-length@1.0.0: /array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
@ -573,6 +559,7 @@ packages:
/balanced-match@1.0.2: /balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: false
/bcrypt-pbkdf@1.0.2: /bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
@ -585,6 +572,7 @@ packages:
dependencies: dependencies:
balanced-match: 1.0.2 balanced-match: 1.0.2
concat-map: 0.0.1 concat-map: 0.0.1
dev: false
/braces@3.0.2: /braces@3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
@ -648,14 +636,6 @@ packages:
got: 11.8.6 got: 11.8.6
dev: true dev: true
/cli@1.0.1:
resolution: {integrity: sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==}
engines: {node: '>=0.2.5'}
dependencies:
exit: 0.1.2
glob: 7.2.3
dev: true
/clone-response@1.0.3: /clone-response@1.0.3:
resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
dependencies: dependencies:
@ -682,21 +662,12 @@ packages:
/concat-map@0.0.1: /concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: false
/console-browserify@1.1.0:
resolution: {integrity: sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==}
dependencies:
date-now: 0.1.4
dev: true
/core-util-is@1.0.2: /core-util-is@1.0.2:
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
dev: true dev: true
/core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
dev: true
/create-require@1.1.1: /create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
dev: false dev: false
@ -717,10 +688,6 @@ packages:
assert-plus: 1.0.0 assert-plus: 1.0.0
dev: true dev: true
/date-now@0.1.4:
resolution: {integrity: sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==}
dev: true
/debug@3.2.7: /debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies: peerDependencies:
@ -799,34 +766,6 @@ packages:
esutils: 2.0.3 esutils: 2.0.3
dev: false dev: false
/dom-serializer@0.2.2:
resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
dependencies:
domelementtype: 2.3.0
entities: 2.2.0
dev: true
/domelementtype@1.3.1:
resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
dev: true
/domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
dev: true
/domhandler@2.3.0:
resolution: {integrity: sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==}
dependencies:
domelementtype: 1.3.1
dev: true
/domutils@1.5.1:
resolution: {integrity: sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==}
dependencies:
dom-serializer: 0.2.2
domelementtype: 1.3.1
dev: true
/ecc-jsbn@0.1.2: /ecc-jsbn@0.1.2:
resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
dependencies: dependencies:
@ -840,18 +779,6 @@ packages:
once: 1.4.0 once: 1.4.0
dev: true dev: true
/entities@1.0.0:
resolution: {integrity: sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==}
dev: true
/entities@2.1.0:
resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==}
dev: true
/entities@2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
dev: true
/es-abstract@1.21.2: /es-abstract@1.21.2:
resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -1180,12 +1107,6 @@ packages:
eslint-visitor-keys: 3.4.0 eslint-visitor-keys: 3.4.0
dev: false dev: false
/esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
hasBin: true
dev: true
/esquery@1.5.0: /esquery@1.5.0:
resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
engines: {node: '>=0.10'} engines: {node: '>=0.10'}
@ -1219,11 +1140,6 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: false dev: false
/exit@0.1.2:
resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
engines: {node: '>= 0.8.0'}
dev: true
/extend@3.0.2: /extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
dev: true dev: true
@ -1320,6 +1236,7 @@ packages:
/fs.realpath@1.0.0: /fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: false
/fsevents@2.3.2: /fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
@ -1398,6 +1315,7 @@ packages:
minimatch: 3.1.2 minimatch: 3.1.2
once: 1.4.0 once: 1.4.0
path-is-absolute: 1.0.1 path-is-absolute: 1.0.1
dev: false
/globals@13.20.0: /globals@13.20.0:
resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
@ -1504,16 +1422,6 @@ packages:
dependencies: dependencies:
function-bind: 1.1.1 function-bind: 1.1.1
/htmlparser2@3.8.3:
resolution: {integrity: sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==}
dependencies:
domelementtype: 1.3.1
domhandler: 2.3.0
domutils: 1.5.1
entities: 1.0.0
readable-stream: 1.1.14
dev: true
/http-cache-semantics@4.1.1: /http-cache-semantics@4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
dev: true dev: true
@ -1540,10 +1448,6 @@ packages:
engines: {node: '>= 4'} engines: {node: '>= 4'}
dev: false dev: false
/immediate@3.0.6:
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
dev: true
/import-fresh@3.3.0: /import-fresh@3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -1562,9 +1466,11 @@ packages:
dependencies: dependencies:
once: 1.4.0 once: 1.4.0
wrappy: 1.0.2 wrappy: 1.0.2
dev: false
/inherits@2.0.4: /inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
dev: false
/internal-slot@1.0.5: /internal-slot@1.0.5:
resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
@ -1697,14 +1603,6 @@ packages:
call-bind: 1.0.2 call-bind: 1.0.2
dev: false dev: false
/isarray@0.0.1:
resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
dev: true
/isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
dev: true
/isexe@2.0.0: /isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: false dev: false
@ -1728,19 +1626,6 @@ packages:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
dev: true dev: true
/jshint@2.13.4:
resolution: {integrity: sha512-HO3bosL84b2qWqI0q+kpT/OpRJwo0R4ivgmxaO848+bo10rc50SkPnrtwSFXttW0ym4np8jbJvLwk5NziB7jIw==}
hasBin: true
dependencies:
cli: 1.0.1
console-browserify: 1.1.0
exit: 0.1.2
htmlparser2: 3.8.3
lodash: 4.17.21
minimatch: 3.0.8
strip-json-comments: 1.0.4
dev: true
/json-buffer@3.0.1: /json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
dev: true dev: true
@ -1777,15 +1662,6 @@ packages:
verror: 1.10.0 verror: 1.10.0
dev: true dev: true
/jszip@3.10.0:
resolution: {integrity: sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==}
dependencies:
lie: 3.3.0
pako: 1.0.11
readable-stream: 2.3.8
setimmediate: 1.0.5
dev: true
/keyv@4.5.2: /keyv@4.5.2:
resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==}
dependencies: dependencies:
@ -1800,18 +1676,6 @@ packages:
type-check: 0.4.0 type-check: 0.4.0
dev: false dev: false
/lie@3.3.0:
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
dependencies:
immediate: 3.0.6
dev: true
/linkify-it@3.0.3:
resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==}
dependencies:
uc.micro: 1.0.6
dev: true
/locate-path@6.0.0: /locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -1840,10 +1704,6 @@ packages:
lodash._reinterpolate: 3.0.0 lodash._reinterpolate: 3.0.0
dev: true dev: true
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true
/lowercase-keys@2.0.0: /lowercase-keys@2.0.0:
resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -1860,29 +1720,6 @@ packages:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
dev: false dev: false
/markdown-it-anchor@7.1.0(markdown-it@12.3.2):
resolution: {integrity: sha512-loQggrwsIkkP7TOrESvmYkV2ikbQNNKhHcWyqC7/C2CmfHl1tkUizJJU8C5aGgg7J6oXVQJx17gk7i47tNn/lQ==}
peerDependencies:
markdown-it: '*'
dependencies:
markdown-it: 12.3.2
dev: true
/markdown-it@12.3.2:
resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==}
hasBin: true
dependencies:
argparse: 2.0.1
entities: 2.1.0
linkify-it: 3.0.3
mdurl: 1.0.1
uc.micro: 1.0.6
dev: true
/mdurl@1.0.1:
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
dev: true
/merge2@1.4.1: /merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -1918,16 +1755,11 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/minimatch@3.0.8:
resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
dependencies:
brace-expansion: 1.1.11
dev: true
/minimatch@3.1.2: /minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies: dependencies:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
dev: false
/minimist@1.2.8: /minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
@ -2018,10 +1850,6 @@ packages:
p-limit: 3.1.0 p-limit: 3.1.0
dev: false dev: false
/pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
dev: true
/parent-module@1.0.1: /parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -2037,6 +1865,7 @@ packages:
/path-is-absolute@1.0.1: /path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: false
/path-key@3.1.1: /path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@ -2064,10 +1893,6 @@ packages:
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
dev: false dev: false
/process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: true
/psl@1.9.0: /psl@1.9.0:
resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
dev: true dev: true
@ -2097,27 +1922,6 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/readable-stream@1.1.14:
resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
dependencies:
core-util-is: 1.0.3
inherits: 2.0.4
isarray: 0.0.1
string_decoder: 0.10.31
dev: true
/readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
dependencies:
core-util-is: 1.0.3
inherits: 2.0.4
isarray: 1.0.0
process-nextick-args: 2.0.1
safe-buffer: 5.1.2
string_decoder: 1.1.1
util-deprecate: 1.0.2
dev: true
/regexp.prototype.flags@1.5.0: /regexp.prototype.flags@1.5.0:
resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2208,10 +2012,6 @@ packages:
queue-microtask: 1.2.3 queue-microtask: 1.2.3
dev: false dev: false
/safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
dev: true
/safe-buffer@5.2.1: /safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: true dev: true
@ -2241,10 +2041,6 @@ packages:
lru-cache: 6.0.0 lru-cache: 6.0.0
dev: false dev: false
/setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
dev: true
/shebang-command@2.0.0: /shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2311,16 +2107,6 @@ packages:
es-abstract: 1.21.2 es-abstract: 1.21.2
dev: false dev: false
/string_decoder@0.10.31:
resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
dev: true
/string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
safe-buffer: 5.1.2
dev: true
/strip-ansi@6.0.1: /strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2333,12 +2119,6 @@ packages:
engines: {node: '>=4'} engines: {node: '>=4'}
dev: false dev: false
/strip-json-comments@1.0.4:
resolution: {integrity: sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==}
engines: {node: '>=0.8.0'}
hasBin: true
dev: true
/strip-json-comments@3.1.1: /strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2467,10 +2247,6 @@ packages:
engines: {node: '>=4.2.0'} engines: {node: '>=4.2.0'}
hasBin: true hasBin: true
/uc.micro@1.0.6:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
dev: true
/unbox-primitive@1.0.2: /unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
dependencies: dependencies:
@ -2485,10 +2261,6 @@ packages:
dependencies: dependencies:
punycode: 2.3.0 punycode: 2.3.0
/util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
dev: true
/uuid@3.4.0: /uuid@3.4.0:
resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.

View File

@ -32,6 +32,8 @@ import NavLinksPage from './Index/NavLinks.html'
import PageList from './Index/PageList.html' import PageList from './Index/PageList.html'
import UI from './UI' import UI from './UI'
interface Index { interface Index {
enabled: any
menu: any
req: boolean req: boolean
liveThreadData: any liveThreadData: any
pageNum: any pageNum: any

View File

@ -315,7 +315,7 @@ Enable it on boards.${location.hostname.split('.')[1]}.org in your browser's pri
} }
} }
return ($.delete(['hiddenThreads', 'hiddenPosts'], dict()) return ($.delete(['hiddenThreads', 'hiddenPosts'], dict())
}) )})
}) })
return $.after($('input[name="Stubs"]', section).parentNode.parentNode, div) return $.after($('input[name="Stubs"]', section).parentNode.parentNode, div)
}, },

View File

@ -430,7 +430,7 @@ const Gallery = {
$.rmClass(doc, 'gallery-open') $.rmClass(doc, 'gallery-open')
if (Conf['Fullscreen Gallery']) { if (Conf['Fullscreen Gallery']) {
$.off(d, 'fullscreenchange mozfullscreenchange webkitfullscreenchange', Gallery.cb.close) $.off(d, 'fullscreenchange mozfullscreenchange webkitfullscreenchange', Gallery.cb.close)
d.mozCancelFullScreen?.() document.mozCancelFullScreen?.()
d.webkitExitFullscreen?.() d.webkitExitFullscreen?.()
} }
delete Gallery.nodes delete Gallery.nodes

View File

@ -3,18 +3,12 @@ import Notice from "../classes/Notice"
import { Conf, d, g } from "../globals/globals" import { Conf, d, g } from "../globals/globals"
import $ from "../platform/$" import $ from "../platform/$"
import CrossOrigin from "../platform/CrossOrigin" import CrossOrigin from "../platform/CrossOrigin"
import { dict } from "../platform/helpers"
import ImageHost from "./ImageHost" import ImageHost from "./ImageHost"
import Volume from "./Volume" import Volume from "./Volume"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS104: Avoid inline assignments
* DS204: Change includes calls to have a more natural evaluation order
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const ImageCommon = { const ImageCommon = {
cache: null,
// Pause and mute video in preparation for removing the element from the document. // Pause and mute video in preparation for removing the element from the document.
pause(video) { pause(video) {
if (video.nodeName !== 'VIDEO') { return } if (video.nodeName !== 'VIDEO') { return }

View File

@ -1,18 +1,13 @@
import Callbacks from "../classes/Callbacks" import Callbacks from "../classes/Callbacks"
import Post from "../classes/Post"
import Header from "../General/Header" import Header from "../General/Header"
import UI from "../General/UI" import UI from "../General/UI"
import { Conf, doc, g } from "../globals/globals" import { Conf, doc, g } from "../globals/globals"
import $ from "../platform/$" import $ from "../platform/$"
import { SECOND } from "../platform/helpers" import { SECOND } from "../platform/helpers"
import type { File } from "../types/globals"
import ImageCommon from "./ImageCommon" import ImageCommon from "./ImageCommon"
import Volume from "./Volume" import Volume from "./Volume"
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const ImageHover = { const ImageHover = {
init() { init() {
if (!['index', 'thread'].includes(g.VIEW)) { return } if (!['index', 'thread'].includes(g.VIEW)) { return }
@ -31,7 +26,7 @@ const ImageHover = {
}, },
node() { node() {
return this.files.filter((file) => (file.isImage || file.isVideo) && file.thumb).map((file) => return this.files.filter((file) => (file.isImage || file.isVideo) && file.thumb).map((file: File) =>
$.on(file.thumb, 'mouseover', ImageHover.mouseover(this, file))) $.on(file.thumb, 'mouseover', ImageHover.mouseover(this, file)))
}, },
@ -47,19 +42,24 @@ const ImageHover = {
return $.on(this.nodes.thumb, 'mouseover', hover) return $.on(this.nodes.thumb, 'mouseover', hover)
}, },
mouseover(post, file) { mouseover(post: Post, file: File) {
return function (e) { return function (e) {
let el, height, width let el, height, width
// @ts-ignore
if (!doc.contains(this)) { return } if (!doc.contains(this)) { return }
const { isVideo } = file const { isVideo } = file
if (file.isExpanding || file.isExpanded || g.SITE.isThumbExpanded?.(file)) { return } if (file.isExpanding || file.isExpanded || g.SITE.isThumbExpanded?.(file)) { return }
const error = ImageHover.error(post, file) const error = ImageHover.error(this.post, file)
if (ImageCommon.cache?.dataset.fileID === `${post.fullID}.${file.index}`) { if (ImageCommon.cache?.dataset.fileID === `${post.fullID}.${file.index}`) {
el = ImageCommon.popCache() el = ImageCommon.popCache()
$.on(el, 'error', error) $.on(el, 'error', error)
} else { } else {
el = $.el((isVideo ? 'video' : 'img')) el = $.el((isVideo ? 'video' : 'img'), {
className: 'ihover',
style: {
maxWidth: '100%',
maxHeight: '100%'
}
})
el.dataset.fileID = `${post.fullID}.${file.index}` el.dataset.fileID = `${post.fullID}.${file.index}`
$.on(el, 'error', error) $.on(el, 'error', error)
el.src = file.url el.src = file.url
@ -77,7 +77,6 @@ const ImageHover = {
Volume.setup(el) Volume.setup(el)
if (Conf['Autoplay']) { if (Conf['Autoplay']) {
el.play() el.play()
// @ts-ignore
if (this.nodeName === 'VIDEO') { this.currentTime = el.currentTime } if (this.nodeName === 'VIDEO') { this.currentTime = el.currentTime }
} }
} }
@ -111,7 +110,7 @@ const ImageHover = {
} }
}, },
error(post, file) { error(post: HTMLElement, file: File) {
return function () { return function () {
if (ImageCommon.decodeError(this, file)) { return } if (ImageCommon.decodeError(this, file)) { return }
return ImageCommon.error(this, post, file, 3 * SECOND, URL => { return ImageCommon.error(this, post, file, 3 * SECOND, URL => {

View File

@ -2,12 +2,7 @@ import DataBoard from "../classes/DataBoard"
import { Conf, d, g } from "../globals/globals" import { Conf, d, g } from "../globals/globals"
import $ from "../platform/$" import $ from "../platform/$"
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const PostSuccessful = { const PostSuccessful = {
init() { init() {
if (!Conf['Remember Your Posts']) { return } if (!Conf['Remember Your Posts']) { return }
@ -18,16 +13,16 @@ const PostSuccessful = {
if (d.title !== 'Post successful!') { return } if (d.title !== 'Post successful!') { return }
let [_, threadID, postID] = Array.from($('h1').nextSibling.textContent.match(/thread:(\d+),no:(\d+)/)) let [_, threadID, postID] = Array.from($('h1').nextSibling.textContent.match(/thread:(\d+),no:(\d+)/))
postID = +postID postID = +postID
threadID = +threadID || postID threadID = +threadID || postID
const db = new DataBoard('yourPosts') const db = new DataBoard('yourPosts', true, true)
return db.set({ return db.set({
boardID: g.BOARD.ID, boardID: g.BOARD.ID,
threadID, threadID,
postID, postID,
val: true val: true
}) }, true)
} }
} }
export default PostSuccessful export default PostSuccessful

View File

@ -16,14 +16,7 @@ import { DAY, dict, SECOND } from '../platform/helpers'
import Captcha from './Captcha' import Captcha from './Captcha'
import QuickReplyPage from './QR/QuickReply.html' import QuickReplyPage from './QR/QuickReply.html'
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS202: Simplify dynamic range loops
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const QR = { const QR = {
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'], mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'],

View File

@ -6,11 +6,7 @@ import QuoteInline from "./QuoteInline"
import QuotePreview from "./QuotePreview" import QuotePreview from "./QuotePreview"
import QuoteYou from "./QuoteYou" import QuoteYou from "./QuoteYou"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const QuoteBacklink = { const QuoteBacklink = {
// Backlinks appending need to work for: // Backlinks appending need to work for:
// - previous, same, and following posts. // - previous, same, and following posts.

View File

@ -4,11 +4,7 @@ import { Conf, g } from "../globals/globals"
import ExpandComment from "../Miscellaneous/ExpandComment" import ExpandComment from "../Miscellaneous/ExpandComment"
import $ from "../platform/$" import $ from "../platform/$"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const QuoteCT = { const QuoteCT = {
init() { init() {
if (!['index', 'thread'].includes(g.VIEW) || !Conf['Mark Cross-thread Quotes']) { return } if (!['index', 'thread'].includes(g.VIEW) || !Conf['Mark Cross-thread Quotes']) { return }

View File

@ -6,12 +6,7 @@ import ExpandComment from "../Miscellaneous/ExpandComment"
import Unread from "../Monitoring/Unread" import Unread from "../Monitoring/Unread"
import $ from "../platform/$" import $ from "../platform/$"
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const QuoteInline = { const QuoteInline = {
init() { init() {
if (!['index', 'thread'].includes(g.VIEW) || !Conf['Quote Inlining']) { return } if (!['index', 'thread'].includes(g.VIEW) || !Conf['Quote Inlining']) { return }

View File

@ -1,13 +1,9 @@
import Callbacks from "../classes/Callbacks" import Callbacks from "../classes/Callbacks"
import Get from "../General/Get" import Get from "../General/Get"
import { Conf,g } from "../globals/globals" import { Conf, g } from "../globals/globals"
import $ from "../platform/$" import $ from "../platform/$"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const QuoteStrikeThrough = { const QuoteStrikeThrough = {
init() { init() {
if (!['index', 'thread'].includes(g.VIEW) || if (!['index', 'thread'].includes(g.VIEW) ||
@ -15,14 +11,14 @@ const QuoteStrikeThrough = {
return Callbacks.Post.push({ return Callbacks.Post.push({
name: 'Strike-through Quotes', name: 'Strike-through Quotes',
cb: this.node cb: this.node
}) })
}, },
node() { node() {
if (this.isClone) { return } if (this.isClone) { return }
for (const quotelink of this.nodes.quotelinks) { for (const quotelink of this.nodes.quotelinks) {
const {boardID, postID} = Get.postDataFromLink(quotelink) const { boardID, postID } = Get.postDataFromLink(quotelink)
if (g.posts.get(`${boardID}.${postID}`)?.isHidden) { if (g.posts.get(`${boardID}.${postID}`)?.isHidden) {
$.addClass(quotelink, 'filtered') $.addClass(quotelink, 'filtered')
} }

View File

@ -7,11 +7,7 @@ import Unread from "../Monitoring/Unread"
import $ from "../platform/$" import $ from "../platform/$"
import { dict } from "../platform/helpers" import { dict } from "../platform/helpers"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
/* /*
<3 aeosynth <3 aeosynth
*/ */

View File

@ -10,16 +10,13 @@ import $ from "../platform/$"
import $$ from "../platform/$$" import $$ from "../platform/$$"
import PostRedirect from "../Posting/PostRedirect" import PostRedirect from "../Posting/PostRedirect"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const QuoteYou = { const QuoteYou = {
db: DataBoard,
init() { init() {
if (!Conf['Remember Your Posts']) { return } if (!Conf['Remember Your Posts']) { return }
this.db = new DataBoard('yourPosts') this.db = new DataBoard('yourPosts', true, true)
$.sync('Remember Your Posts', enabled => Conf['Remember Your Posts'] = enabled) $.sync('Remember Your Posts', enabled => Conf['Remember Your Posts'] = enabled)
$.on(d, 'QRPostSuccessful', function (e) { $.on(d, 'QRPostSuccessful', function (e) {
const cb = PostRedirect.delay() const cb = PostRedirect.delay()

View File

@ -6,12 +6,7 @@ import ExpandComment from "../Miscellaneous/ExpandComment"
import $ from "../platform/$" import $ from "../platform/$"
import $$ from "../platform/$$" import $$ from "../platform/$$"
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const Quotify = { const Quotify = {
init() { init() {
if (!['index', 'thread'].includes(g.VIEW) || !Conf['Resurrect Quotes']) { return } if (!['index', 'thread'].includes(g.VIEW) || !Conf['Resurrect Quotes']) { return }

View File

@ -8,7 +8,7 @@ import Thread from "./Thread"
export default class Board { export default class Board {
ID: string ID: string
boardID: number | string boardID: number | string
siteID: number siteID: string
threads: SimpleDict<Thread> threads: SimpleDict<Thread>
posts: SimpleDict<Post> posts: SimpleDict<Post>
config: any config: any

View File

@ -11,6 +11,12 @@ import { dict, HOUR } from "../platform/helpers"
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md * Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/ */
export default class DataBoard { export default class DataBoard {
static set(data, cb) {
this.set(data, cb)
}
static get(cb) {
this.get(cb)
}
static keys: string[] static keys: string[]
static changes: string[] static changes: string[]
key: string key: string
@ -22,7 +28,7 @@ export default class DataBoard {
this.changes = [] this.changes = []
} }
constructor(key, sync, dontClean) { constructor(key: string, sync: boolean, dontClean: boolean) {
this.onSync = this.onSync.bind(this) this.onSync = this.onSync.bind(this)
this.key = key this.key = key
this.initData(Conf[this.key]) this.initData(Conf[this.key])
@ -33,7 +39,7 @@ export default class DataBoard {
// so we only start syncing when we're ready. // so we only start syncing when we're ready.
const init = () => { const init = () => {
$.off(d, '4chanXInitFinished', init) $.off(d, '4chanXInitFinished', init)
return this.sync = sync return this.sync = () => this.forceSync()
} }
$.on(d, '4chanXInitFinished', init) $.on(d, '4chanXInitFinished', init)
} }
@ -70,7 +76,7 @@ export default class DataBoard {
}) })
} }
forceSync(cb) { forceSync(cb?) {
return $.get(this.key, { boards: dict() }, items => { return $.get(this.key, { boards: dict() }, items => {
if ((items[this.key].version || 0) > (this.data.version || 0)) { if ((items[this.key].version || 0) > (this.data.version || 0)) {
this.initData(items[this.key]) this.initData(items[this.key])

View File

@ -3,7 +3,7 @@ import { d } from "../globals/globals"
import $ from "../platform/$" import $ from "../platform/$"
import { SECOND } from "../platform/helpers" import { SECOND } from "../platform/helpers"
type NoticeType = "success" | "warning" | "error" type NoticeType = "success" | "warning" | "error" | "info"
export default class Notice { export default class Notice {
private el: HTMLDivElement private el: HTMLDivElement

View File

@ -3,6 +3,7 @@ import { Conf, g } from "../globals/globals"
import ImageExpand from "../Images/ImageExpand" import ImageExpand from "../Images/ImageExpand"
import $ from "../platform/$" import $ from "../platform/$"
import $$ from "../platform/$$" import $$ from "../platform/$$"
import type { File } from "../types/globals"
import type Board from "./Board" import type Board from "./Board"
import Callbacks from "./Callbacks" import Callbacks from "./Callbacks"
import type Thread from "./Thread" import type Thread from "./Thread"
@ -27,8 +28,8 @@ export default class Post {
declare isFetchedQuote: boolean declare isFetchedQuote: boolean
declare isClone: boolean declare isClone: boolean
declare quotes: string[] declare quotes: string[]
declare file: ReturnType<Post['parseFile']> declare file: File
declare files: ReturnType<Post['parseFile']>[] declare files: File[]
declare info: { declare info: {
subject: string, subject: string,
@ -267,7 +268,7 @@ export default class Post {
} }
parseFiles() { parseFiles() {
let file let file: File
this.files = [] this.files = []
const fileRoots = this.fileRoots() const fileRoots = this.fileRoots()
let index = 0 let index = 0
@ -293,15 +294,6 @@ export default class Post {
} }
parseFile(fileRoot: HTMLElement) { parseFile(fileRoot: HTMLElement) {
interface File {
text: string,
link: HTMLAnchorElement,
thumb: HTMLElement,
thumbLink: HTMLElement,
size: string,
sizeInBytes: number,
isDead: boolean,
}
const file: Partial<File> = { isDead: false } const file: Partial<File> = { isDead: false }
for (const key in g.SITE.selectors.file) { for (const key in g.SITE.selectors.file) {
@ -327,7 +319,7 @@ export default class Post {
return file as File return file as File
} }
kill(file: any, index = 0) { kill(file: File, index = 0) {
let strong: { textContent: string } let strong: { textContent: string }
if (file) { if (file) {
if (this.isDead || this.files[index].isDead) { return } if (this.isDead || this.files[index].isDead) { return }

View File

@ -1,10 +1,12 @@
import { g } from "../globals/globals" import { g } from "../globals/globals"
import $ from "../platform/$" import $ from "../platform/$"
import Board from "./Board" import Board from "./Board"
import CatalogThreadNative from "./CatalogThreadNative"
import Post from "./Post" import Post from "./Post"
import SimpleDict from "./SimpleDict" import SimpleDict from "./SimpleDict"
export default class Thread { export default class Thread {
catalogViewNative: CatalogThreadNative
ID: number | string ID: number | string
OP: Post OP: Post
isArchived: boolean isArchived: boolean

View File

@ -7,6 +7,7 @@ import type SWTinyboard from "../site/SW.tinyboard"
declare global { declare global {
interface Window { interface Window {
wrappedJSObject: any
Tegaki: any Tegaki: any
FCX: any FCX: any
} }
@ -61,7 +62,7 @@ export const g: {
VERSION: version.version, VERSION: version.version,
NAMESPACE: meta.name, NAMESPACE: meta.name,
sites: Object.create(null), sites: Object.create(null),
boards: Object.create(null) boards: Object.create(null),
} }
export const E = (function () { export const E = (function () {
@ -97,4 +98,4 @@ export const c = console
export const docSet = function () { export const docSet = function () {
// return (doc = d.documentElement); // return (doc = d.documentElement);
return doc return doc
} }

View File

@ -75,7 +75,6 @@ import UnreadIndex from "../Monitoring/UnreadIndex"
import $ from "../platform/$" import $ from "../platform/$"
import $$ from "../platform/$$" import $$ from "../platform/$$"
import { dict, platform } from "../platform/helpers" import { dict, platform } from "../platform/helpers"
import Captcha from "../Posting/Captcha"
import CaptchaReplace from "../Posting/Captcha.replace" import CaptchaReplace from "../Posting/Captcha.replace"
import PassLink from "../Posting/PassLink" import PassLink from "../Posting/PassLink"
import PostRedirect from "../Posting/PostRedirect" import PostRedirect from "../Posting/PostRedirect"
@ -102,6 +101,7 @@ import SW from "../site/SW"
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md * Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/ */
const Main = { const Main = {
expectInitFinished: true,
init() { init() {
// XXX dwb userscripts extension reloads scripts run at document-start when replaceState/pushState is called. // XXX dwb userscripts extension reloads scripts run at document-start when replaceState/pushState is called.
// XXX Firefox reinjects WebExtension content scripts when extension is updated / reloaded. // XXX Firefox reinjects WebExtension content scripts when extension is updated / reloaded.
@ -115,7 +115,7 @@ const Main = {
// Don't run inside ad iframes. // Don't run inside ad iframes.
try { try {
if (window.frameElement && ['', 'about:blank'].includes(window.frameElement.src)) { return } if (window.frameElement && ['', 'about:blank'].includes(window.location.href)) { return }
} catch (error1) { /* empty */ } } catch (error1) { /* empty */ }
// Detect multiple copies of 4chan X // Detect multiple copies of 4chan X
@ -136,12 +136,12 @@ const Main = {
// Detect "mounted" event from Kissu // Detect "mounted" event from Kissu
const mountedCB = function () { const mountedCB = function () {
d.removeEventListener('mounted', mountedCB, true) d.removeEventListener('mounted', mountedCB, true)
Main.isMounted = true Main.mounted(true)
return Main.mountedCBs.map((cb) => return Main.mountedCBs.map((cb) =>
(() => { (() => {
try { try {
return cb() return cb()
} catch (error2) { } } catch (error2) { /* empty */ }
})()) })())
} }
d.addEventListener('mounted', mountedCB, true) d.addEventListener('mounted', mountedCB, true)
@ -167,12 +167,13 @@ const Main = {
return String.fromCharCode = function () { return String.fromCharCode = function () {
if (document.body) { if (document.body) {
String.fromCharCode = fromCharCode0 String.fromCharCode = fromCharCode0
} else if (document.currentScript && !document.currentScript.src) { } else if (document.currentScript && !document.location.href) {
throw Error() throw Error()
} }
// eslint-disable-next-line prefer-rest-params
return fromCharCode0.apply(this, arguments) return fromCharCode0.apply(this, arguments)
} }
}) }, 'String.fromCharCode')
$.asap(docSet, () => $.onExists(doc, 'iframe[srcdoc]', $.rm)) $.asap(docSet, () => $.onExists(doc, 'iframe[srcdoc]', $.rm))
} }
@ -211,7 +212,7 @@ const Main = {
!SW.yotsuba.regexp.captcha.test(location.href) && !SW.yotsuba.regexp.captcha.test(location.href) &&
!$$('script:not([src])', d).filter(s => /this\[/.test(s.textContent)).length !$$('script:not([src])', d).filter(s => /this\[/.test(s.textContent)).length
) { ) {
($.getSync || $.get)({ 'jsWhitelist': Conf['jsWhitelist'] }, ({ jsWhitelist }) => $.addCSP(`script-src ${jsWhitelist.replace(/^#.*$/mg, '').replace(/[\s;]+/g, ' ').trim()}`)) ($.getSync || $.get)({ 'jsWhitelist': Conf['jsWhitelist'] }, ({ jsWhitelist }) => $.addCSP(`script-src ${jsWhitelist.replace(/^#.*$/mg, '').replace(/[\s;]+/g, ' ').trim()}`), 'jsWhitelist')
} }
// Get saved values as items // Get saved values as items
@ -233,8 +234,9 @@ const Main = {
} else if ((items.previousversion == null)) { } else if ((items.previousversion == null)) {
Main.isFirstRun = true Main.isFirstRun = true
Main.ready(function () { Main.ready(function () {
$.set('previousversion', g.VERSION) $.set('previousversion', g.VERSION, function () {
return Settings.open() return Settings.open(true)
})
}) })
// Migrate old settings // Migrate old settings
@ -250,8 +252,14 @@ const Main = {
return Site.init(Main.initFeatures) return Site.init(Main.initFeatures)
}) })
}, function () {
return Main.ready(function () {
return Settings.open(true)
})
}) })
}, },
isFirstRun: true,
bgColorStyle: null,
upgrade(items) { upgrade(items) {
const { previousversion } = items const { previousversion } = items
@ -263,11 +271,13 @@ const Main = {
{ innerHTML: `${meta.name} has been updated to <a href="${meta.changelog}" target="_blank">version ${g.VERSION}</a>.` }) { innerHTML: `${meta.name} has been updated to <a href="${meta.changelog}" target="_blank">version ${g.VERSION}</a>.` })
return new Notice('info', el, 15) return new Notice('info', el, 15)
} }
}, function () {
return console.warn('Failed to save settings.')
}) })
}, },
parseURL(site = g.SITE, url = location) { parseURL(site = g.SITE, url = location) {
const r = {} const r = dict()
if (!site) { return r } if (!site) { return r }
r.siteID = site.ID r.siteID = site.ID
@ -294,11 +304,13 @@ const Main = {
} }
return r return r
}, },
jsEnabled: false,
initFeatures() { initFeatures() {
$.global(function () { $.global(function () {
document.documentElement.classList.add('js-enabled') document.documentElement.classList.add('js-enabled')
return window.FCX = {} return window.FCX = {}
}, function () {
return window.FCX = {}
}) })
Main.jsEnabled = $.hasClass(doc, 'js-enabled') Main.jsEnabled = $.hasClass(doc, 'js-enabled')
@ -321,7 +333,7 @@ const Main = {
return Redirect.navigate('file', { return Redirect.navigate('file', {
boardID: g.BOARD.ID, boardID: g.BOARD.ID,
filename: pathname[pathname.length - 1] filename: pathname[pathname.length - 1]
}) }, { replace: true })
} else if (video = $('video')) { } else if (video = $('video')) {
if (Conf['Volume in New Tab']) { if (Conf['Volume in New Tab']) {
Volume.setup(video) Volume.setup(video)
@ -351,7 +363,7 @@ const Main = {
feature.init() feature.init()
} catch (err) { } catch (err) {
Main.handleErrors({ Main.handleErrors({
message: `\"${name}\" initialization crashed.`, message: `"${name}" initialization crashed.`,
error: err error: err
}) })
} }
@ -378,7 +390,7 @@ const Main = {
$.ready(function () { $.ready(function () {
if ((d.body.clientHeight > doc.clientHeight) && ((window.innerWidth === doc.clientWidth) !== Conf['Autohiding Scrollbar'])) { if ((d.body.clientHeight > doc.clientHeight) && ((window.innerWidth === doc.clientWidth) !== Conf['Autohiding Scrollbar'])) {
Conf['Autohiding Scrollbar'] = !Conf['Autohiding Scrollbar'] Conf['Autohiding Scrollbar'] = !Conf['Autohiding Scrollbar']
$.set('Autohiding Scrollbar', Conf['Autohiding Scrollbar']) $.set('Autohiding Scrollbar', Conf['Autohiding Scrollbar'], true)
return $.toggleClass(doc, 'autohiding-scrollbar') return $.toggleClass(doc, 'autohiding-scrollbar')
} }
}) })
@ -447,7 +459,7 @@ const Main = {
background: ${bgColor}; background: ${bgColor};
} }
.unread-mark-read { .unread-mark-read {
background-color: rgba(${rgb.slice(0, 3).join(', ')}, ${0.5 * (rgb[3] || 1)}); background-color: rgba(${rgb.slice(0, 3).join(', ')}, ${0.5 * (1 - $.luma(rgb))}) !important;
}\ }\
` `
if ($.luma(rgb) < 100) { if ($.luma(rgb) < 100) {
@ -517,9 +529,11 @@ const Main = {
} }
} else { } else {
Main.expectInitFinished = true Main.expectInitFinished = true
return $.event('4chanXInitFinished') return $.event('4chanXInitFinished', { detail: { board: g.BOARD } })
} }
}, },
addThreadsObserver: null,
addPostsObserver: null,
initThread() { initThread() {
let board let board
@ -552,17 +566,17 @@ const Main = {
return Main.callbackNodesDB('Post', posts, function () { return Main.callbackNodesDB('Post', posts, function () {
for (const post of posts) { QuoteThreading.insert(post) } for (const post of posts) { QuoteThreading.insert(post) }
Main.expectInitFinished = true Main.expectInitFinished = true
return $.event('4chanXInitFinished') return $.event('4chanXInitFinished', { board: g.BOARD, threads, posts })
}) })
} else { } else {
Main.expectInitFinished = true Main.expectInitFinished = true
return $.event('4chanXInitFinished') return $.event('4chanXInitFinished', { board: g.BOARD })
} }
}, },
parseThreads(threadRoots, threads, posts, errors) { parseThreads(threadRoots, threads, posts, errors) {
for (var threadRoot of threadRoots) { for (const threadRoot of threadRoots) {
const boardObj = (() => { const boardObj = (() => {
let boardID let boardID
if (boardID = threadRoot.dataset.board) { if (boardID = threadRoot.dataset.board) {
@ -662,6 +676,7 @@ const Main = {
} }
}) })
}, },
addCatalogThreadsObserver: null,
initCatalog() { initCatalog() {
let board let board
@ -680,7 +695,7 @@ const Main = {
} }
Main.expectInitFinished = true Main.expectInitFinished = true
return $.event('4chanXInitFinished') return $.event('4chanXInitFinished', { board: g.BOARD })
}, },
parseCatalogThreads(threadRoots, threads, errors) { parseCatalogThreads(threadRoots, threads, errors) {
@ -762,7 +777,7 @@ const Main = {
// Detect conflicts with native extension // Detect conflicts with native extension
if (g.SITE.testNativeExtension && !$.hasClass(doc, 'tainted')) { if (g.SITE.testNativeExtension && !$.hasClass(doc, 'tainted')) {
const { enabled } = g.SITE.testNativeExtension() const enabled = g.SITE.testNativeExtension()
if (enabled) { if (enabled) {
$.addClass(doc, 'tainted') $.addClass(doc, 'tainted')
if (Conf['Disable Native Extension'] && !Main.isFirstRun) { if (Conf['Disable Native Extension'] && !Main.isFirstRun) {
@ -796,13 +811,13 @@ const Main = {
)), ref )), ref
}) })
var logs = $.el('div', const logs = $.el('div',
{ hidden: true }) { hidden: true })
for (error of errors) { for (error of errors) {
$.add(logs, Main.parseError(error)) $.add(logs, Main.parseError(error, Main.reportLink([error])))
} }
return new Notice('error', [div, logs], 30) return new Notice('error', [div, logs], 15)
}, },
parseError(data, reportLink) { parseError(data, reportLink) {
@ -869,7 +884,7 @@ User agent: ${navigator.userAgent}\
}, },
mounted(cb) { mounted(cb) {
if (Main.isMounted) { if (Main.mounted) {
return cb() return cb()
} else { } else {
return Main.mountedCBs.push(cb) return Main.mountedCBs.push(cb)

View File

@ -4,15 +4,15 @@ import $ from "../platform/$"
import $$ from "../platform/$$" import $$ from "../platform/$$"
import { dict } from "../platform/helpers" import { dict } from "../platform/helpers"
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const SWTinyboard = { const SWTinyboard = {
name: 'Tinyboard',
isOPContainerThread: true, isOPContainerThread: true,
mayLackJSON: true, mayLackJSON: true,
threadModTimeIgnoresSage: true, threadModTimeIgnoresSage: true,
testNativeExtension() {
return false
},
disabledFeatures: [ disabledFeatures: [
'Resurrect Quotes', 'Resurrect Quotes',
@ -40,7 +40,7 @@ const SWTinyboard = {
detect() { detect() {
for (const script of $$('script:not([src])', d.head)) { for (const script of $$('script:not([src])', d.head)) {
var m let m
if (m = script.textContent.match(/\bvar configRoot=(".*?")/)) { if (m = script.textContent.match(/\bvar configRoot=(".*?")/)) {
const properties = dict() const properties = dict()
try { try {
@ -50,13 +50,31 @@ const SWTinyboard = {
} else if (/^https?:/.test(root)) { } else if (/^https?:/.test(root)) {
properties.root = root properties.root = root
} }
} catch (error) { } } catch (error) { /* empty */ }
return properties return properties
} }
} }
return false return false
}, },
ID: 'sw-tinyboard',
parseThreadMetadata(el: HTMLElement) {
const thread = dict()
const op = el.querySelector('.op')
thread.id = op.id
thread.threadID = op.id.match(/^thread_(\d+)$/)[1]
thread.boardID = Conf.BOARD.boardID
thread.siteID = Conf.BOARD.siteID
thread.isArchived = !!el.closest('.archive')
},
isAuxiliaryPage(url) {
return url.pathname === '/catalog.html'
},
isBoardlessPage(url) {
return url.pathname === '/catalog.html'
},
initAuxiliary() {
return Main.mounted(true)
},
awaitBoard(cb) { awaitBoard(cb) {
let reactUI let reactUI
if (reactUI = $.id('react-ui')) { if (reactUI = $.id('react-ui')) {
@ -104,6 +122,11 @@ const SWTinyboard = {
}, },
selectors: { selectors: {
boardFor: {
index: '.page-container',
catalog: '.page-container',
thread: '.page-container'
},
board: 'form[name="postcontrols"]', board: 'form[name="postcontrols"]',
thread: 'input[name="board"] ~ div[id^="thread_"]', thread: 'input[name="board"] ~ div[id^="thread_"]',
threadDivider: 'div[id^="thread_"] > hr:last-child', threadDivider: 'div[id^="thread_"] > hr:last-child',
@ -181,7 +204,7 @@ const SWTinyboard = {
$\ $\
`), `),
quotelinkHTML: quotelinkHTML:
/<a [^>]*\bhref="[^"]*\/([^\/]+)\/res\/(\d+)(?:\.\w+)?#(\d+)"/g /<a [^>]*\bhref="[^"]*\/([^/]+)\/res\/(\d+)(?:\.\w+)?#(\d+)"/g
}, },
Build: { Build: {
@ -226,7 +249,7 @@ $\
}, },
isFileURL(url) { isFileURL(url) {
return /\/src\/[^\/]+/.test(url.pathname) return /\/src\/[^/]+/.test(url.pathname)
}, },
preParsingFixes(board) { preParsingFixes(board) {
@ -267,6 +290,12 @@ $\
return undefined return undefined
}, },
is404() {
return !!$('#error')
},
isIncomplete() {
return !!$('#incomplete')
},
parseFile(post, file) { parseFile(post, file) {
let info, infoNode let info, infoNode
const { text, link, thumb } = file const { text, link, thumb } = file

View File

@ -1,7 +1,8 @@
import Redirect from "../Archive/Redirect" import Redirect from "../Archive/Redirect"
import Callbacks from "../classes/Callbacks"
import CSS from "../css/CSS" import CSS from "../css/CSS"
import BoardConfig from "../General/BoardConfig" import BoardConfig from "../General/BoardConfig"
import { Conf, d, doc,E, g } from "../globals/globals" import { Conf, d, doc, g } from "../globals/globals"
import h, { hFragment, isEscaped } from "../globals/jsx" import h, { hFragment, isEscaped } from "../globals/jsx"
import ImageHost from "../Images/ImageHost" import ImageHost from "../Images/ImageHost"
import PassMessage from "../Miscellaneous/PassMessage" import PassMessage from "../Miscellaneous/PassMessage"
@ -15,13 +16,7 @@ import generateCatalogThreadHtml from "./SW.yotsuba.Build/CatalogThreadHtml"
import generateFileHtml from "./SW.yotsuba.Build/FileHtml" import generateFileHtml from "./SW.yotsuba.Build/FileHtml"
import generatePostInfoHtml from './SW.yotsuba.Build/PostInfoHtml' import generatePostInfoHtml from './SW.yotsuba.Build/PostInfoHtml'
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS205: Consider reworking code to avoid use of IIFEs
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
*/
const SWYotsuba = { const SWYotsuba = {
isOPContainerThread: false, isOPContainerThread: false,
hasIPCount: true, hasIPCount: true,
@ -177,17 +172,17 @@ $\
}, },
initAuxiliary() { initAuxiliary() {
const pathname = location.pathname.split(/\/+/)
switch (location.hostname) { switch (location.hostname) {
case 'www.4chan.org': case 'www.4channel.org': case 'www.4chan.org': case 'www.4channel.org':
if (SWYotsuba.regexp.pass.test(location.href)) { if (SWYotsuba.regexp.pass.test(location.href)) {
PassMessage.init() PassMessage.init()
} else { } else {
$.onExists(doc, 'body', () => $.addStyle(CSS.www)) $.onExists(doc, 'body', () => $.addStyle(CSS.www, 'www-css'))
Captcha.replace.init() Captcha.replace.init()
} }
return return
case 'sys.4chan.org': case 'sys.4channel.org': case 'sys.4chan.org': case 'sys.4channel.org':
var pathname = location.pathname.split(/\/+/)
if (pathname[2] === 'imgboard.php') { if (pathname[2] === 'imgboard.php') {
let match let match
if (/\bmode=report\b/.test(location.search)) { if (/\bmode=report\b/.test(location.search)) {
@ -198,7 +193,7 @@ $\
return Redirect.navigate('thread', { return Redirect.navigate('thread', {
boardID: g.BOARD.ID, boardID: g.BOARD.ID,
postID: +match[1] postID: +match[1]
}) }, {replace: true})
}}) }})
} }
} else if (pathname[2] === 'post') { } else if (pathname[2] === 'post') {
@ -231,18 +226,18 @@ $\
return file.text.dataset.md5 = (file.MD5 = this.response.posts[0].md5) return file.text.dataset.md5 = (file.MD5 = this.response.posts[0].md5)
} }
} }
} }, Callbacks.call('parseThreadMetadata'))
)
} }
}, },
parseNodes(post, nodes) { parseNodes(post, nodes) {
// Add CSS classes to sticky/closed icons on /f/ to match other boards. // Add CSS classes to sticky/closed icons on /f/ to match other boards.
if (post.boardID === 'f') { if (post.boardID === 'f') {
return (() => { return (() => {
const result = [] const result = []
for (const type of ['Sticky', 'Closed']) { for (const type of ['Sticky', 'Closed']) {
var icon let icon
if (icon = $(`img[alt=${type}]`, nodes.info)) { if (icon = $(`img[alt=${type}]`, nodes.info)) {
result.push($.addClass(icon, `${type.toLowerCase()}Icon`, 'retina')) result.push($.addClass(icon, `${type.toLowerCase()}Icon`, 'retina'))
} }
@ -290,7 +285,7 @@ $\
$.rm(node) $.rm(node)
} }
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
var br let br
if ((br = abbr.previousSibling) && (br.nodeName === 'BR')) { $.rm(br) } if ((br = abbr.previousSibling) && (br.nodeName === 'BR')) { $.rm(br) }
} }
return $.rm(abbr) return $.rm(abbr)
@ -337,7 +332,7 @@ $\
testNativeExtension() { testNativeExtension() {
return $.global(function() { return $.global(function() {
if (window.Parser?.postMenuIcon) { return this.enabled = 'true' } if (window.Parser?.postMenuIcon) { return this.enabled = 'true' }
}) }, null)
}, },
transformBoardList() { transformBoardList() {
@ -347,6 +342,7 @@ $\
const items = $.X('.//a|.//text()[not(ancestor::a)]', $(SWYotsuba.selectors.boardList)) const items = $.X('.//a|.//text()[not(ancestor::a)]', $(SWYotsuba.selectors.boardList))
let i = 0 let i = 0
while ((node = items.snapshotItem(i++))) { while ((node = items.snapshotItem(i++))) {
const a = node.cloneNode(true)
switch (node.nodeName) { switch (node.nodeName) {
case '#text': case '#text':
for (const chr of node.nodeValue) { for (const chr of node.nodeValue) {
@ -358,7 +354,6 @@ $\
} }
break break
case 'A': case 'A':
var a = node.cloneNode(true)
nodes.push(a) nodes.push(a)
break break
} }
@ -372,7 +367,7 @@ $\
spoilerRange: Object.create(null), spoilerRange: Object.create(null),
shortFilename(filename) { shortFilename(filename) {
const ext = filename.match(/\.?[^\.]*$/)[0] const ext = filename.match(/\.?[^.]*$/)[0]
if ((filename.length - ext.length) > 30) { if ((filename.length - ext.length) > 30) {
return `${filename.match(/(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[^]){0,25}/)[0]}(...)${ext}` return `${filename.match(/(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[^]){0,25}/)[0]}(...)${ext}`
} else { } else {
@ -423,22 +418,27 @@ $\
isArchived: !!data.archived, isArchived: !!data.archived,
// file status // file status
fileDeleted: !!data.filedeleted, fileDeleted: !!data.filedeleted,
filesDeleted: data.filedeleted ? [0] : [] filesDeleted: data.filedeleted ? [0] : [],
} info: {
o.info = { subject: $.unescape(data.sub),
subject: $.unescape(data.sub), email: $.unescape(data.email),
email: $.unescape(data.email), name: $.unescape(data.name) || '',
name: $.unescape(data.name) || '', tripcode: data.trip,
tripcode: data.trip, pass: (data.since4pass != null) ? `${data.since4pass}` : undefined,
pass: (data.since4pass != null) ? `${data.since4pass}` : undefined, uniqueID: data.id,
uniqueID: data.id, flagCode: data.country,
flagCode: data.country, flagCodeTroll: data.board_flag,
flagCodeTroll: data.board_flag, flag: $.unescape((data.country_name || data.flag_name)),
flag: $.unescape((data.country_name || data.flag_name)), dateUTC: data.time,
dateUTC: data.time, dateText: data.now,
dateText: data.now, capcode: null,
// Yes, we use the raw string here // Yes, we use the raw string here
commentHTML: { innerHTML: data.com || '', [isEscaped]: true } commentHTML: { innerHTML: data.com || '', [isEscaped]: true }},
files: [],
file: null,
capcodeHighlight: !!data.capcode_highlight,
extra: {}
} }
if (data.capcode) { if (data.capcode) {
o.info.capcode = data.capcode.replace(/_highlight$/, '').replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()) o.info.capcode = data.capcode.replace(/_highlight$/, '').replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase())
@ -478,7 +478,8 @@ $\
twidth: data.tn_w, twidth: data.tn_w,
isSpoiler: !!data.spoiler, isSpoiler: !!data.spoiler,
tag: data.tag, tag: data.tag,
hasDownscale: !!data.m_img hasDownscale: !!data.m_img,
dimensions: null
} }
if ((data.h != null) && !/\.pdf$/.test(o.url)) { o.dimensions = `${o.width}x${o.height}` } if ((data.h != null) && !/\.pdf$/.test(o.url)) { o.dimensions = `${o.width}x${o.height}` }
return o return o
@ -585,7 +586,7 @@ $\
quote.href = this.threadURL(boardID, threadID) + href quote.href = this.threadURL(boardID, threadID) + href
} }
} else { } else {
var match let match
if ((match = quote.href.match(SWYotsuba.regexp.quotelink)) && (this.sameThread(match[1], match[2]))) { if ((match = quote.href.match(SWYotsuba.regexp.quotelink)) && (this.sameThread(match[1], match[2]))) {
quote.href = href.match(/(#[^#]*)?$/)[0] || '#' quote.href = href.match(/(#[^#]*)?$/)[0] || '#'
} }

View File

@ -1,2 +1,19 @@
declare const cloneInto: Function declare const cloneInto: Function
declare const XPCNativeWrapper: any declare const XPCNativeWrapper: any
export interface File {
isImage: boolean
isVideo: boolean
thumb: HTMLElement
url: string
dimensions: string
index: number
isExpanding: boolean
isExpanded: boolean
text: string,
link: HTMLAnchorElement
thumbLink: HTMLElement
size: string
sizeInBytes: number
isDead: boolean
docIndex: number
}

View File

@ -26,7 +26,7 @@
"outDir": "builds/test/crx/tsOutput", "outDir": "builds/test/crx/tsOutput",
}, },
"exclude": [ "exclude": [
"node_modules", "/node_modules/*",
"tools/*", "tools/*",
"dist/*", "dist/*",
"src/meta/*", "src/meta/*",