Project Linting (#209)

* More setup for ESLint

* Initial linting

* Fix: "Unexpected use of 'location': no-restricted-globals"

* Fix: "Prop 'sidebarItems' should define at least its type"

* Fix: "import/no-unresolved"

* Fix: "import/no-extraneous-dependencies"

* Fix: "Unexpected require() 'global-require'"

* Fix: "vue/require-prop-types"

* Line disable: "radix"

* Line disable: "no-param-reassign"

* Line disable: "no-shadow"

This should usually be an actual problem but I don't think so in this case as the next prompt is basically just a one-action warning.

* Add markdown linting support

* Replace single quotes with double

* Fix indentation for all files

* Fix second level quotation marks

* Change accordingly

I'd still rather keep 4-tab for MD when applicable though, the alternative is a non-standard 3-space indent, which makes three different indentations to keep track of.
This commit is contained in:
Soitora 2020-05-21 04:47:01 +02:00 committed by GitHub
parent 8c2459d492
commit b520d4e448
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 5704 additions and 3998 deletions

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
!.vuepress

View File

@ -5,18 +5,28 @@
}, },
"extends": [ "extends": [
"plugin:vue/essential", "plugin:vue/essential",
"vuepress", "airbnb-base",
"prettier" "prettier",
"vuepress"
], ],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": { "parserOptions": {
"ecmaVersion": 2018, "ecmaVersion": 2018,
"sourceType": "module" "sourceType": "module"
}, },
"plugins": [ "plugins": [
"vue", "vue",
"prettier" "prettier",
"markdown"
], ],
"rules": { "rules": {
"prettier/prettier": ["error"] "prettier/prettier": "error",
"import/no-unresolved": [
2,
{ "ignore": ["^@"] }
]
} }
} }

View File

@ -31,6 +31,6 @@ jobs:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
publish_branch: gh-pages publish_branch: gh-pages
publish_dir: ./public publish_dir: ./public
user_name: 'github-actions[bot]' user_name: "github-actions[bot]"
user_email: 'github-actions[bot]@users.noreply.github.com' user_email: "github-actions[bot]@users.noreply.github.com"
commit_message: ${{ github.event.head_commit.message }} commit_message: ${{ github.event.head_commit.message }}

View File

@ -1,9 +1,11 @@
<div>
<h1 align="center"><img src="./src/.vuepress/public/assets/media/tachiyomi.png">Tachiyomi Website</h1> <h1 align="center"><img src="./src/.vuepress/public/assets/media/tachiyomi.png">Tachiyomi Website</h1>
<p align="center"> <p align="center">
<a href="https://discord.gg/tachiyomi"> <a href="https://discord.gg/tachiyomi">
<img src="https://img.shields.io/discord/349436576037732353.svg?label=Discord&labelColor=7289da&color=2c2f33&style=flat" alt="Discord"> <img src="https://img.shields.io/discord/349436576037732353.svg?label=Discord&labelColor=7289da&color=2c2f33&style=flat" alt="Discord">
</a> </a>
</p> </p>
</div>
## Contributing ## Contributing

257
package-lock.json generated
View File

@ -2189,6 +2189,12 @@
"object.assign": "^4.1.0" "object.assign": "^4.1.0"
} }
}, },
"bail": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
"integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
"dev": true
},
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@ -2873,6 +2879,24 @@
"supports-color": "^5.3.0" "supports-color": "^5.3.0"
} }
}, },
"character-entities": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true
},
"character-entities-legacy": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
"integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
"dev": true
},
"character-reference-invalid": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
"integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
"dev": true
},
"chardet": { "chardet": {
"version": "0.7.0", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
@ -3099,6 +3123,12 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true "dev": true
}, },
"collapse-white-space": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
"integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
"dev": true
},
"collection-visit": { "collection-visit": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@ -4716,6 +4746,17 @@
} }
} }
}, },
"eslint-plugin-markdown": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.2.tgz",
"integrity": "sha512-BfvXKsO0K+zvdarNc801jsE/NTLmig4oKhZ1U3aSUgTf2dB/US5+CrfGxMsCK2Ki1vS1R3HPok+uYpufFndhzw==",
"dev": true,
"requires": {
"object-assign": "^4.0.1",
"remark-parse": "^5.0.0",
"unified": "^6.1.2"
}
},
"eslint-plugin-node": { "eslint-plugin-node": {
"version": "10.0.0", "version": "10.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz",
@ -6490,6 +6531,22 @@
} }
} }
}, },
"is-alphabetical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
"integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
"dev": true,
"requires": {
"is-alphabetical": "^1.0.0",
"is-decimal": "^1.0.0"
}
},
"is-arguments": { "is-arguments": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
@ -6580,6 +6637,12 @@
"integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
"dev": true "dev": true
}, },
"is-decimal": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
"integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
"dev": true
},
"is-descriptor": { "is-descriptor": {
"version": "0.1.6", "version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
@ -6638,6 +6701,12 @@
"is-extglob": "^2.1.1" "is-extglob": "^2.1.1"
} }
}, },
"is-hexadecimal": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
"integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
"dev": true
},
"is-installed-globally": { "is-installed-globally": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
@ -6784,12 +6853,24 @@
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true "dev": true
}, },
"is-whitespace-character": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
"integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
"dev": true
},
"is-windows": { "is-windows": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true "dev": true
}, },
"is-word-character": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
"integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
"dev": true
},
"is-wsl": { "is-wsl": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
@ -7111,8 +7192,7 @@
"lodash.orderby": { "lodash.orderby": {
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz", "resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz",
"integrity": "sha1-5pfwTOXXhSL1TZM4syuBozk+TrM=", "integrity": "sha1-5pfwTOXXhSL1TZM4syuBozk+TrM="
"dev": true
}, },
"lodash.padstart": { "lodash.padstart": {
"version": "4.6.1", "version": "4.6.1",
@ -7146,8 +7226,7 @@
"lodash.throttle": { "lodash.throttle": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
"dev": true
}, },
"lodash.uniq": { "lodash.uniq": {
"version": "4.5.0", "version": "4.5.0",
@ -7247,6 +7326,12 @@
"object-visit": "^1.0.0" "object-visit": "^1.0.0"
} }
}, },
"markdown-escapes": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
"integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
"dev": true
},
"markdown-it": { "markdown-it": {
"version": "8.4.2", "version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
@ -8375,6 +8460,20 @@
"safe-buffer": "^5.1.1" "safe-buffer": "^5.1.1"
} }
}, },
"parse-entities": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
"integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
"dev": true,
"requires": {
"character-entities": "^1.0.0",
"character-entities-legacy": "^1.0.0",
"character-reference-invalid": "^1.0.0",
"is-alphanumerical": "^1.0.0",
"is-decimal": "^1.0.0",
"is-hexadecimal": "^1.0.0"
}
},
"parse-json": { "parse-json": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@ -9627,6 +9726,29 @@
"integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
"dev": true "dev": true
}, },
"remark-parse": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz",
"integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==",
"dev": true,
"requires": {
"collapse-white-space": "^1.0.2",
"is-alphabetical": "^1.0.0",
"is-decimal": "^1.0.0",
"is-whitespace-character": "^1.0.0",
"is-word-character": "^1.0.0",
"markdown-escapes": "^1.0.0",
"parse-entities": "^1.1.0",
"repeat-string": "^1.5.4",
"state-toggle": "^1.0.0",
"trim": "0.0.1",
"trim-trailing-lines": "^1.0.0",
"unherit": "^1.0.4",
"unist-util-remove-position": "^1.0.0",
"vfile-location": "^2.0.0",
"xtend": "^4.0.1"
}
},
"remove-trailing-separator": { "remove-trailing-separator": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@ -9712,6 +9834,12 @@
"is-finite": "^1.0.0" "is-finite": "^1.0.0"
} }
}, },
"replace-ext": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
},
"request": { "request": {
"version": "2.88.2", "version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@ -10665,6 +10793,12 @@
"integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
"dev": true "dev": true
}, },
"state-toggle": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
"integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
"dev": true
},
"static-extend": { "static-extend": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@ -11268,12 +11402,30 @@
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
}, },
"trim": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
"integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
"dev": true
},
"trim-newlines": { "trim-newlines": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
"integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
"dev": true "dev": true
}, },
"trim-trailing-lines": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
"integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
"dev": true
},
"trough": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
"integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
"dev": true
},
"true-case-path": { "true-case-path": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
@ -11380,6 +11532,16 @@
} }
} }
}, },
"unherit": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
"integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
"dev": true,
"requires": {
"inherits": "^2.0.0",
"xtend": "^4.0.0"
}
},
"unicode-canonical-property-names-ecmascript": { "unicode-canonical-property-names-ecmascript": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@ -11408,6 +11570,20 @@
"integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
"dev": true "dev": true
}, },
"unified": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
"integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
"dev": true,
"requires": {
"bail": "^1.0.0",
"extend": "^3.0.0",
"is-plain-obj": "^1.1.0",
"trough": "^1.0.0",
"vfile": "^2.0.0",
"x-is-string": "^0.1.0"
}
},
"union-value": { "union-value": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
@ -11459,6 +11635,45 @@
"crypto-random-string": "^2.0.0" "crypto-random-string": "^2.0.0"
} }
}, },
"unist-util-is": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
"integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
"dev": true
},
"unist-util-remove-position": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
"integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
"dev": true,
"requires": {
"unist-util-visit": "^1.1.0"
}
},
"unist-util-stringify-position": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
"integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
"dev": true
},
"unist-util-visit": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
"integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
"dev": true,
"requires": {
"unist-util-visit-parents": "^2.0.0"
}
},
"unist-util-visit-parents": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
"integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
"dev": true,
"requires": {
"unist-util-is": "^3.0.0"
}
},
"universalify": { "universalify": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@ -11776,6 +11991,33 @@
"extsprintf": "^1.2.0" "extsprintf": "^1.2.0"
} }
}, },
"vfile": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
"integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
"dev": true,
"requires": {
"is-buffer": "^1.1.4",
"replace-ext": "1.0.0",
"unist-util-stringify-position": "^1.0.0",
"vfile-message": "^1.0.0"
}
},
"vfile-location": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
"integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
"dev": true
},
"vfile-message": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
"integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
"dev": true,
"requires": {
"unist-util-stringify-position": "^1.1.1"
}
},
"vm-browserify": { "vm-browserify": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@ -11792,7 +12034,6 @@
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/vue-agile/-/vue-agile-1.1.3.tgz", "resolved": "https://registry.npmjs.org/vue-agile/-/vue-agile-1.1.3.tgz",
"integrity": "sha512-RnvKK6ZoXNAk2Q6h/ux+bhqYs4uflFew3xcsNfysQa+GVLKHfizAaeKHJndqGjSXA+qg+kJuYd4RDY/ry8RY4w==", "integrity": "sha512-RnvKK6ZoXNAk2Q6h/ux+bhqYs4uflFew3xcsNfysQa+GVLKHfizAaeKHJndqGjSXA+qg+kJuYd4RDY/ry8RY4w==",
"dev": true,
"requires": { "requires": {
"lodash.orderby": "^4.6.0", "lodash.orderby": "^4.6.0",
"lodash.throttle": "^4.1.1" "lodash.throttle": "^4.1.1"
@ -12624,6 +12865,12 @@
"async-limiter": "~1.0.0" "async-limiter": "~1.0.0"
} }
}, },
"x-is-string": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
"integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
"dev": true
},
"xdg-basedir": { "xdg-basedir": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",

View File

@ -16,13 +16,16 @@
"@vuepress/plugin-google-analytics": "^1.5.0", "@vuepress/plugin-google-analytics": "^1.5.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-config-airbnb": "^18.1.0", "eslint-config-airbnb": "^18.1.0",
"eslint-config-airbnb-base": "^14.1.0",
"eslint-config-prettier": "^6.11.0", "eslint-config-prettier": "^6.11.0",
"eslint-config-vuepress": "^2.2.0", "eslint-config-vuepress": "^2.2.0",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-markdown": "^1.0.2",
"eslint-plugin-prettier": "^3.1.3", "eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^6.2.2",
"node-sass": "^4.14.1", "node-sass": "^4.14.1",
"prettier": "^2.0.5", "prettier": "^2.0.5",
"sass-loader": "^8.0.2", "sass-loader": "^8.0.2",
"vue-agile": "^1.1.3",
"vuepress": "^1.5.0", "vuepress": "^1.5.0",
"vuepress-plugin-clean-urls": "^1.1.1", "vuepress-plugin-clean-urls": "^1.1.1",
"vuepress-plugin-container": "^2.1.3" "vuepress-plugin-container": "^2.1.3"
@ -33,6 +36,7 @@
"lodash.groupby": "^4.6.0", "lodash.groupby": "^4.6.0",
"lodash.sortby": "^4.7.0", "lodash.sortby": "^4.7.0",
"material-design-icons": "^3.0.1", "material-design-icons": "^3.0.1",
"vue-agile": "^1.1.3",
"vue-material-design-icons": "^4.6.0", "vue-material-design-icons": "^4.6.0",
"vue-sweetalert2": "^3.0.5", "vue-sweetalert2": "^3.0.5",
"vuepress-plugin-sitemap": "^2.3.1" "vuepress-plugin-sitemap": "^2.3.1"

View File

@ -16,18 +16,18 @@ export default {
props: { props: {
name: { name: {
type: String, type: String,
default: "carousel" default: "carousel",
}, },
config: { config: {
type: Object, type: Object,
default: function() { default() {
return { return {
navButtons: true, navButtons: true,
centerMode: true centerMode: true,
}; };
} },
} },
} },
}; };
</script> </script>

View File

@ -10,9 +10,9 @@ export default {
props: { props: {
name: { name: {
type: String, type: String,
default: "carousel-cell" default: "carousel-cell",
} },
} },
}; };
</script> </script>

View File

@ -15,35 +15,34 @@ import axios from "axios";
const RELEASE_URL = const RELEASE_URL =
"https://api.github.com/repos/inorichi/tachiyomi/releases/latest"; "https://api.github.com/repos/inorichi/tachiyomi/releases/latest";
const PREVIEW_URL = const PREVIEW_URL = "https://tachiyomi.kanade.eu/latest";
"https://tachiyomi.kanade.eu/latest";
export default { export default {
props: { props: {
downloadStableTag: { downloadStableTag: {
type: String, type: String,
required: true required: true,
}, },
downloadPreviewTag: { downloadPreviewTag: {
type: String, type: String,
required: true required: true,
}, },
downloadStableLabel: { downloadStableLabel: {
type: String, type: String,
default: "Stable" default: "Stable",
}, },
downloadPreviewLabel: { downloadPreviewLabel: {
type: String, type: String,
default: "Preview" default: "Preview",
}, },
downloadStableUrl: { downloadStableUrl: {
type: String, type: String,
default: undefined default: undefined,
}, },
downloadPreviewUrl: { downloadPreviewUrl: {
type: String, type: String,
default: undefined default: undefined,
} },
}, },
data() { data() {
@ -56,7 +55,7 @@ export default {
async mounted() { async mounted() {
const { data } = await axios.get(RELEASE_URL); const { data } = await axios.get(RELEASE_URL);
// Maybe eventually some release has more than the apk in assets. // Maybe eventually some release has more than the apk in assets.
const apkAsset = data.assets.find(a => a.name.includes(".apk")); const apkAsset = data.assets.find((a) => a.name.includes(".apk"));
// Set the values. // Set the values.
this.$data.tagName = data.tag_name; this.$data.tagName = data.tag_name;
this.$data.browserDownloadUrl = apkAsset.browser_download_url; this.$data.browserDownloadUrl = apkAsset.browser_download_url;
@ -66,7 +65,7 @@ export default {
downloadStable() { downloadStable() {
this.$swal({ this.$swal({
title: "Downloading", title: "Downloading",
text: this.downloadStableLabel + " version is being downloaded.", text: `${this.downloadStableLabel} version is being downloaded.`,
icon: "success", icon: "success",
focusConfirm: false, focusConfirm: false,
focusCancel: false, focusCancel: false,
@ -74,24 +73,32 @@ export default {
timerProgressBar: true, timerProgressBar: true,
customClass: { customClass: {
confirmButton: "download-confirm-button", confirmButton: "download-confirm-button",
container: "download-container" container: "download-container",
}, },
showClass: { showClass: {
popup: "animated pulse faster" popup: "animated pulse faster",
}, },
hideClass: { hideClass: {
popup: "animated zoomOut faster" popup: "animated zoomOut faster",
} },
}); });
window.location.assign( window.location.assign(
this.$props.downloadStableUrl || this.$data.browserDownloadUrl || RELEASE_URL this.$props.downloadStableUrl ||
this.$data.browserDownloadUrl ||
RELEASE_URL
);
window.ga(
"send",
"event",
"Action",
"Download",
this.downloadStableTag
); );
window.ga("send", "event", "Action", "Download", this.downloadStableTag);
}, },
downloadPreview() { downloadPreview() {
this.$swal({ this.$swal({
title: "Downloading", title: "Downloading",
text: this.downloadPreviewLabel + " version is being downloaded.", text: `${this.downloadPreviewLabel} version is being downloaded.`,
icon: "success", icon: "success",
focusConfirm: false, focusConfirm: false,
focusCancel: false, focusCancel: false,
@ -99,21 +106,27 @@ export default {
timerProgressBar: true, timerProgressBar: true,
customClass: { customClass: {
confirmButton: "download-confirm-button", confirmButton: "download-confirm-button",
container: "download-container" container: "download-container",
}, },
showClass: { showClass: {
popup: "animated pulse faster" popup: "animated pulse faster",
}, },
hideClass: { hideClass: {
popup: "animated zoomOut faster" popup: "animated zoomOut faster",
} },
}); });
window.location.assign( window.location.assign(
this.$props.downloadPreviewUrl || PREVIEW_URL this.$props.downloadPreviewUrl || PREVIEW_URL
); );
window.ga("send", "event", "Action", "Download", this.downloadPreviewTag); window.ga(
} "send",
} "event",
"Action",
"Download",
this.downloadPreviewTag
);
},
},
}; };
</script> </script>

View File

@ -54,24 +54,26 @@ const EXTENSION_JSON =
export default { export default {
data() { data() {
return { return {
extensions: [] extensions: [],
}; };
}, },
async beforeMount() { async beforeMount() {
const { data } = await axios.get(EXTENSION_JSON); const { data } = await axios.get(EXTENSION_JSON);
const values = Object.values(groupBy(data, "lang")); const values = Object.values(groupBy(data, "lang"));
this.$data.extensions = sortBy(values, [g => this.langName(g[0].lang)]); this.$data.extensions = sortBy(values, [
(g) => this.langName(g[0].lang),
]);
}, },
updated() { updated() {
if (location.hash) { if (window.ocation.hash) {
location.replace(location.hash); window.location.replace(window.location.hash);
} }
}, },
methods: { methods: {
langName: code => langName: (code) =>
code === "all" code === "all"
? "All" ? "All"
: `${ISO6391.getName(code)} (${ISO6391.getNativeName(code)})`, : `${ISO6391.getName(code)} (${ISO6391.getNativeName(code)})`,
@ -79,9 +81,9 @@ export default {
const pkgName = pkg.substring(0, pkg.lastIndexOf(".")); const pkgName = pkg.substring(0, pkg.lastIndexOf("."));
return `https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/icon/${pkgName}.png`; return `https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/icon/${pkgName}.png`;
}, },
apkUrl: apk => apkUrl: (apk) =>
`https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/apk/${apk}` `https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/apk/${apk}`,
} },
}; };
</script> </script>

View File

@ -1,9 +1,17 @@
<template> <template>
<div class="downloadContainer"> <div class="downloadContainer">
<button class="downloadForkButton" :style="downloadForkStyle" @click="downloadFork"> <button
class="downloadForkButton"
:style="downloadForkStyle"
@click="downloadFork"
>
{{ downloadForkLabel }} {{ downloadForkLabel }}
</button> </button>
<button class="githubForkButton" :style="githubForkStyle" :onclick="githubForkLink"> <button
class="githubForkButton"
:style="githubForkStyle"
:onclick="githubForkLink"
>
{{ githubForkLabel }} {{ githubForkLabel }}
</button> </button>
</div> </div>
@ -16,44 +24,44 @@ export default {
props: { props: {
forkName: { forkName: {
type: String, type: String,
required: true required: true,
}, },
downloadForkLabel: { downloadForkLabel: {
type: String, type: String,
default: "Download" default: "Download",
}, },
downloadForkLink: { downloadForkLink: {
type: String, type: String,
required: true required: true,
}, },
downloadForkStyle: { downloadForkStyle: {
type: String, type: String,
default: "" default: "",
}, },
githubForkLabel: { githubForkLabel: {
type: String, type: String,
default: "GitHub" default: "GitHub",
}, },
githubForkLink: { githubForkLink: {
type: String, type: String,
required: true required: true,
}, },
githubForkStyle: { githubForkStyle: {
type: String, type: String,
default: "" default: "",
} },
}, },
data() { data() {
return { return {
tagName: "", tagName: "",
browserDownloadUrl: "" browserDownloadUrl: "",
}; };
}, },
async mounted() { async mounted() {
const { data } = await axios.get(this.$props.downloadForkLink); const { data } = await axios.get(this.$props.downloadForkLink);
// Maybe eventually some release has more than the apk in assets. // Maybe eventually some release has more than the apk in assets.
const apkAsset = data.assets.find(a => a.name.includes(".apk")); const apkAsset = data.assets.find((a) => a.name.includes(".apk"));
// Set the values. // Set the values.
this.$data.tagName = data.tag_name; this.$data.tagName = data.tag_name;
this.$data.browserDownloadUrl = apkAsset.browser_download_url; this.$data.browserDownloadUrl = apkAsset.browser_download_url;
@ -63,7 +71,7 @@ export default {
downloadFork() { downloadFork() {
this.$swal({ this.$swal({
title: "Downloading", title: "Downloading",
text: this.$props.forkName + " is being downloaded.", text: `${this.$props.forkName} is being downloaded.`,
icon: "success", icon: "success",
focusConfirm: false, focusConfirm: false,
focusCancel: false, focusCancel: false,
@ -71,21 +79,27 @@ export default {
timerProgressBar: true, timerProgressBar: true,
customClass: { customClass: {
confirmButton: "download-confirm-button", confirmButton: "download-confirm-button",
container: "download-container" container: "download-container",
}, },
showClass: { showClass: {
popup: "animated pulse faster" popup: "animated pulse faster",
}, },
hideClass: { hideClass: {
popup: "animated zoomOut faster" popup: "animated zoomOut faster",
} },
}); });
window.location.assign( window.location.assign(
this.$data.browserDownloadUrl || this.$props.downloadForkLink this.$data.browserDownloadUrl || this.$props.downloadForkLink
); );
window.ga("send", "event", "Action", "Download", this.$props.forkName); window.ga(
} "send",
} "event",
"Action",
"Download",
this.$props.forkName
);
},
},
}; };
</script> </script>

View File

@ -6,22 +6,18 @@
<Content class="theme-default-content" /> <Content class="theme-default-content" />
<PageEdit /> <PageEdit />
<PageNav v-bind="{ sidebarItems }" />
<slot name="bottom" /> <slot name="bottom" />
</main> </main>
</Layout> </Layout>
</template> </template>
<script> <script>
import Layout from '@theme/layouts/Layout.vue' import Layout from "@theme/layouts/Layout.vue";
import PageEdit from '@theme/components/PageEdit.vue' import PageEdit from "@theme/components/PageEdit.vue";
import PageNav from '@theme/components/PageNav.vue'
export default { export default {
components: { PageEdit, PageNav, Layout }, components: { PageEdit, Layout },
props: ['sidebarItems'] };
}
</script> </script>
<style lang="stylus"> <style lang="stylus">

View File

@ -275,7 +275,7 @@ export default {
grid-auto-rows 1fr grid-auto-rows 1fr
grid-gap 1rem grid-gap 1rem
&:after &:after
content '' content ""
display table display table
clear both clear both

View File

@ -14,17 +14,17 @@ export default {
props: { props: {
iconOnly: { iconOnly: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
name: { name: {
type: String, type: String,
default: "" default: "",
}, },
iconName: { iconName: {
type: String, type: String,
required: true required: true,
} },
} },
}; };
</script> </script>
@ -37,7 +37,7 @@ export default {
display inline display inline
.material-icons .material-icons
font-family 'Material Icons' font-family "Material Icons"
font-size 1.35em font-size 1.35em
font-style normal font-style normal
position relative position relative
@ -50,7 +50,6 @@ export default {
white-space nowrap white-space nowrap
word-wrap normal word-wrap normal
direction ltr direction ltr
font-feature-settings 'liga' font-feature-settings "liga"
-webkit-font-smoothing antialiased -webkit-font-smoothing antialiased
</style> </style>

View File

@ -1,13 +1,27 @@
<template> <template>
<span v-if="nav.link" class="app-navigation" :class="nav.class" title="App navigation"> <span
v-if="nav.link"
class="app-navigation"
:class="nav.class"
title="App navigation"
>
<a class="app-link" :href="nav.link + entry"> <a class="app-link" :href="nav.link + entry">
<MaterialIcon v-if="nav.icon" class="app-icon" :iconName="nav.icon" /> <MaterialIcon
v-if="nav.icon"
class="app-icon"
:icon-name="nav.icon"
/>
<span class="app-label">{{ nav.text }}</span> <span class="app-label">{{ nav.text }}</span>
<slot /> <slot />
</a> </a>
</span> </span>
<span v-else class="app-navigation" :class="nav.class" title="App navigation"> <span
<MaterialIcon v-if="nav.icon" class="app-icon" :iconName="nav.icon" /> v-else
class="app-navigation"
:class="nav.class"
title="App navigation"
>
<MaterialIcon v-if="nav.icon" class="app-icon" :icon-name="nav.icon" />
<span class="app-label">{{ nav.text }}</span> <span class="app-label">{{ nav.text }}</span>
<slot /> <slot />
</span> </span>

View File

@ -1,6 +1,6 @@
<template> <template>
<span v-if="fileName" class="fileNameContainer" title="File name"> <span v-if="fileName" class="fileNameContainer" title="File name">
<MaterialIcon class="fileNameIcon" iconName="get_app" /> <MaterialIcon class="fileNameIcon" icon-name="get_app" />
<span class="fileName">tachiyomi-{{ this.$data.tagName }}.apk</span> <span class="fileName">tachiyomi-{{ this.$data.tagName }}.apk</span>
<slot /> <slot />
</span> </span>
@ -18,8 +18,8 @@ const RELEASE_URL =
export default { export default {
props: { props: {
fileName: { fileName: {
type: Boolean type: Boolean,
} },
}, },
data() { data() {

View File

@ -1,52 +1,53 @@
module.exports = { const pluginsConfig = require("./config/plugins");
dest: './public', const navBarConfig = require("./config/navBar");
temp: './node_modules/.temp/theme', const sideBarConfig = require("./config/sideBar");
title: 'Tachiyomi', module.exports = {
description: 'Free and open source manga reader for Android', dest: "./public",
temp: "./node_modules/.temp/theme",
title: "Tachiyomi",
description: "Free and open source manga reader for Android",
// prettier-ignore // prettier-ignore
head: [ head: [
// Embed headers // Embed headers
['link', { rel: 'icon', href: '/favicon.ico' }], ["link", { rel: "icon", href: "/favicon.ico" }],
['link', { rel: 'manifest', href: '/manifest.json' }], ["link", { rel: "manifest", href: "/manifest.json" }],
['meta', { name: 'theme-color', content: '#2e84bf' }], ["meta", { name: "theme-color", content: "#2e84bf" }],
['meta', { prefix: 'og: http://ogp.me/ns#', property: 'og:image', content: 'https://tachiyomi.org/icons/logo.png' }], ["meta", { prefix: "og: http://ogp.me/ns#", property: "og:image", content: "https://tachiyomi.org/icons/logo.png" }],
// Custom headers // Custom headers
['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin:''}], ["link", { rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin:""}],
['link', { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Open+Sans'}], ["link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css?family=Open+Sans"}],
], ],
themeConfig: { themeConfig: {
logo: '/icons/logo.svg', logo: "/icons/logo.svg",
repo: 'inorichi/tachiyomi', repo: "inorichi/tachiyomi",
docsRepo: 'tachiyomiorg/website', docsRepo: "tachiyomiorg/website",
docsDir: 'src', docsDir: "src",
smoothScroll: true, smoothScroll: true,
algolia: { algolia: {
apiKey: 'fc1c45b5a3835e1882cbbf0751dfe705', apiKey: "fc1c45b5a3835e1882cbbf0751dfe705",
indexName: 'tachiyomi' indexName: "tachiyomi",
}, },
searchPlaceholder: 'Search...', searchPlaceholder: "Search...",
editLinks: true, editLinks: true,
editLinkText: 'Help us improve this page', editLinkText: "Help us improve this page",
lastUpdated: 'Last Updated', lastUpdated: "Last Updated",
nav: require('./config/nav'), nav: navBarConfig,
sidebar: { sidebar: {
'/help/guides/': require('./config/sidebar/guides'), "/help/guides/": sideBarConfig.guides,
'/help/faq/': require('./config/sidebar/faq'), "/help/faq/": sideBarConfig.faq,
'/help/contribution': require('./config/sidebar/contribution'), "/help/contribution": sideBarConfig.contribution,
'/extensions': require('./config/sidebar/extensions'), "/extensions": sideBarConfig.extensions,
'/forks': require('./config/sidebar/forks') "/forks": sideBarConfig.forks,
}
}, },
plugins: require('./config/plugins'), },
plugins: pluginsConfig,
extraWatchFiles: [ extraWatchFiles: [
'.vuepress/config/nav.js', ".vuepress/config/plugins.js",
'.vuepress/config/plugins.js', ".vuepress/config/navBar.js",
'.vuepress/config/sidebar/guides.js', ".vuepress/config/sideBar.js",
'.vuepress/config/sidebar/faq.js', ],
'.vuepress/config/sidebar/contribution.js', };
'.vuepress/config/sidebar/extensions.js'
]
}

View File

@ -3,50 +3,50 @@ module.exports = [
[ [
"clean-urls", "clean-urls",
{ {
normalSuffix: "/" normalSuffix: "/",
} },
], ],
[ [
"@vuepress/google-analytics", "@vuepress/google-analytics",
{ {
ga: "UA-148212082-1" ga: "UA-148212082-1",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "expander", type: "expander",
before: info => before: (info) =>
`<details class="expander"><summary class="expansion">${info}</summary>`, `<details class="expander"><summary class="expansion">${info}</summary>`,
after: "</details>" after: "</details>",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "guide", type: "guide",
before: info => `<div class="guide"><p class="title">${info}</p>`, before: (info) => `<div class="guide"><p class="title">${info}</p>`,
after: "</div>" after: "</div>",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "aside", type: "aside",
defaultTitle: "" defaultTitle: "",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "aside-guide", type: "aside-guide",
defaultTitle: "" defaultTitle: "",
} },
], ],
[ [
"vuepress-plugin-sitemap", "vuepress-plugin-sitemap",
{ {
hostname: "https://tachiyomi.org" hostname: "https://tachiyomi.org",
} },
] ],
]; ];

View File

@ -0,0 +1,148 @@
module.exports = {
guides: [
"/",
{
title: "Guides",
collapsable: false,
sidebarDepth: 2,
children: [
{
title: "General",
collapsable: false,
sidebarDepth: 2,
children: [
"/help/guides/getting-started",
"/help/guides/source-problems",
"/help/guides/source-migration",
"/help/guides/creating-backups",
"/help/guides/reading-local-manga",
"/help/guides/categories",
],
},
{
title: "Settings",
collapsable: false,
sidebarDepth: 2,
children: [
"/help/guides/settings/general",
"/help/guides/settings/reader",
"/help/guides/settings/downloads",
"/help/guides/settings/tracking",
"/help/guides/settings/backup",
"/help/guides/settings/advanced",
],
},
],
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Contribution",
path: "/help/contribution",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
faq: [
"/",
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Contribution",
path: "/help/contribution",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
contribution: [
"/",
{
title: "Contribution",
collapsable: false,
sidebarDepth: 1,
children: ["/help/contribution"],
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
extensions: [
"/",
{
title: "Available extensions",
path: "/extensions/",
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Contribution",
path: "/help/contribution",
},
],
forks: [
"/",
{
title: "Forks",
path: "/forks/",
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Contribution",
path: "/help/contribution",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
};

View File

@ -1,27 +0,0 @@
module.exports = [
'/',
{
title: 'Contribution',
collapsable: false,
sidebarDepth: 1,
children: [
'/help/contribution'
]
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,23 +0,0 @@
module.exports = [
'/',
{
title: 'Available extensions',
path: '/extensions/'
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Contribution',
path: '/help/contribution'
}
];

View File

@ -1,23 +0,0 @@
module.exports = [
'/',
{
title: 'Frequently Asked Questions',
path: '/help/faq/'
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Contribution',
path: '/help/contribution'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,23 +0,0 @@
module.exports = [
'/',
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Contribution',
path: '/help/contribution'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,52 +0,0 @@
module.exports = [
'/',
{
title: 'Guides',
collapsable: false,
sidebarDepth: 2,
children: [
{
title: 'General',
collapsable: false,
sidebarDepth: 2,
children: [
'/help/guides/getting-started',
'/help/guides/source-problems',
'/help/guides/source-migration',
'/help/guides/creating-backups',
'/help/guides/reading-local-manga',
'/help/guides/categories'
]
},
{
title: 'Settings',
collapsable: false,
sidebarDepth: 2,
children: [
'/help/guides/settings/general',
'/help/guides/settings/reader',
'/help/guides/settings/downloads',
'/help/guides/settings/tracking',
'/help/guides/settings/backup',
'/help/guides/settings/advanced'
]
}
]
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Contribution',
path: '/help/contribution'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,18 +1,18 @@
import './styles/fonts.styl' import "./styles/fonts.styl";
import './styles/animate.css' import "./styles/animate.css";
import 'sweetalert2/dist/sweetalert2.min.css'; import "./styles/sweetalert2.css";
import 'vue-material-design-icons/styles.css'; import "vue-material-design-icons/styles.css";
import { VueAgile } from 'vue-agile'; import { VueAgile } from "vue-agile";
import VueSweetalert2 from 'vue-sweetalert2'; import VueSweetalert2 from "vue-sweetalert2";
export default ({ export default ({
Vue, // the version of Vue being used in the VuePress app Vue, // the version of Vue being used in the VuePress app
options, // the options for the root Vue instance options, // the options for the root Vue instance
router, // the router instance for the app router, // the router instance for the app
siteData // site metadata siteData, // site metadata
}) => { }) => {
// eslint-disable-next-line vue/match-component-file-name // eslint-disable-next-line vue/match-component-file-name
Vue.component('Agile', VueAgile); Vue.component("Agile", VueAgile);
Vue.use(VueSweetalert2); Vue.use(VueSweetalert2);
}; };

View File

@ -106,7 +106,7 @@
animation-iteration-count: 1 !important; animation-iteration-count: 1 !important;
} }
.animate__animated[class*='Out'] { .animate__animated[class*="Out"] {
opacity: 0; opacity: 0;
} }
} }

View File

@ -1,6 +1,6 @@
@font-face @font-face
font-family 'Material Icons' font-family "Material Icons"
font-style normal font-style normal
font-weight 400 font-weight 400
src url('~material-design-icons/iconfont/MaterialIcons-Regular.eot') src url("~material-design-icons/iconfont/MaterialIcons-Regular.eot")
src local('Material Icons'), local('MaterialIcons-Regular'), url('~material-design-icons/iconfont/MaterialIcons-Regular.woff2') format('woff2'), url('~material-design-icons/iconfont/MaterialIcons-Regular.woff') format('woff'), url('~material-design-icons/iconfont/MaterialIcons-Regular.ttf') format('truetype'), url('~material-design-icons/iconfont/MaterialIcons-Regular.svg#MaterialIcons-Regular') format('svg') src local("Material Icons"), local("MaterialIcons-Regular"), url("~material-design-icons/iconfont/MaterialIcons-Regular.woff2") format("woff2"), url("~material-design-icons/iconfont/MaterialIcons-Regular.woff") format("woff"), url("~material-design-icons/iconfont/MaterialIcons-Regular.ttf") format("truetype"), url("~material-design-icons/iconfont/MaterialIcons-Regular.svg#MaterialIcons-Regular") format("svg")

View File

@ -72,7 +72,7 @@ font-feature-settings()
font-weight normal font-weight normal
&::before &::before
&::after &::after
content '' content ""
left 0 left 0
position absolute position absolute
&::before &::before

View File

@ -23,8 +23,8 @@ $MQNarrow = 959px
$MQMobile = 767px $MQMobile = 767px
$MQMobileNarrow = 419px $MQMobileNarrow = 419px
// Fonts // Fonts
$buttonFontFamily = 'Open Sans', Roboto, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif $buttonFontFamily = "Open Sans", Roboto, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif
$codeFontFamily = source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace $codeFontFamily = source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace
// Forks // Forks
$nekoAccentColor = #3DDA83 $nekoAccentColor = #3DDA83
$j2kAccentColor = $accentColor $j2kAccentColor = $accentColor

File diff suppressed because it is too large Load Diff

View File

@ -8,70 +8,84 @@
id="algolia-search-input" id="algolia-search-input"
class="search-query" class="search-query"
:placeholder="placeholder" :placeholder="placeholder"
> />
</form> </form>
</template> </template>
<script> <script>
export default { export default {
name: 'AlgoliaSearchBox', name: "AlgoliaSearchBox",
props: ['options'], props: {
options: {
type: Object,
default: () => {},
},
},
data() { data() {
return { return {
placeholder: undefined placeholder: undefined,
} };
}, },
watch: { watch: {
$lang(newValue) { $lang(newValue) {
this.update(this.options, newValue) this.update(this.options, newValue);
}, },
options(newValue) { options(newValue) {
this.update(newValue, this.$lang) this.update(newValue, this.$lang);
} },
}, },
mounted() { mounted() {
this.initialize(this.options, this.$lang) this.initialize(this.options, this.$lang);
this.placeholder = this.$site.themeConfig.searchPlaceholder || '' this.placeholder = this.$site.themeConfig.searchPlaceholder || "";
}, },
methods: { methods: {
initialize(userOptions, lang) { initialize(userOptions, lang) {
Promise.all([ Promise.all([
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.js'), import(
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.css') /* webpackChunkName: "docsearch" */ "docsearch.js/dist/cdn/docsearch.min.js"
),
import(
/* webpackChunkName: "docsearch" */ "docsearch.js/dist/cdn/docsearch.min.css"
),
]).then(([docsearch]) => { ]).then(([docsearch]) => {
docsearch = docsearch.default // eslint-disable-next-line no-param-reassign
const { algoliaOptions = {}} = userOptions docsearch = docsearch.default;
docsearch(Object.assign( const { algoliaOptions = {} } = userOptions;
{}, docsearch({
userOptions, ...userOptions,
{ inputSelector: "#algolia-search-input",
inputSelector: '#algolia-search-input',
// #697 Make docsearch work well at i18n mode. // #697 Make docsearch work well at i18n mode.
algoliaOptions: Object.assign({ algoliaOptions: {
'facetFilters': [`lang:${lang}`].concat(algoliaOptions.facetFilters || []) facetFilters: [`lang:${lang}`].concat(
}, algoliaOptions), algoliaOptions.facetFilters || []
),
...algoliaOptions,
},
handleSelected: (input, event, suggestion) => { handleSelected: (input, event, suggestion) => {
const { pathname, hash } = new URL(suggestion.url) const { pathname, hash } = new URL(suggestion.url);
const routepath = pathname.replace(this.$site.base, '/') const routepath = pathname.replace(
this.$router.push(`${routepath}${hash}`) this.$site.base,
} "/"
} );
)) this.$router.push(`${routepath}${hash}`);
}) },
});
});
}, },
update(options, lang) { update(options, lang) {
this.$el.innerHTML = '<input id="algolia-search-input" class="search-query">' this.$el.innerHTML =
this.initialize(options, lang) '<input id="algolia-search-input" class="search-query">';
} this.initialize(options, lang);
} },
} },
};
</script> </script>
<style lang="stylus"> <style lang="stylus">
@ -178,5 +192,4 @@ export default {
width 5px width 5px
margin -3px 3px 0 margin -3px 3px 0
vertical-align middle vertical-align middle
</style> </style>

View File

@ -230,6 +230,7 @@ export default {
popup: popup:
"animate__animated animate__faster animate__zoomOut", "animate__animated animate__faster animate__zoomOut",
}, },
// eslint-disable-next-line no-shadow
}).then((result) => { }).then((result) => {
if (result.value) { if (result.value) {
this.$swal({ this.$swal({

View File

@ -2,94 +2,113 @@
<header class="navbar"> <header class="navbar">
<SidebarButton @toggle-sidebar="$emit('toggle-sidebar')" /> <SidebarButton @toggle-sidebar="$emit('toggle-sidebar')" />
<RouterLink <RouterLink :to="$localePath" class="home-link">
:to="$localePath"
class="home-link"
>
<img <img
v-if="$site.themeConfig.logo" v-if="$site.themeConfig.logo"
class="logo" class="logo"
:src="$withBase($site.themeConfig.logo)" :src="$withBase($site.themeConfig.logo)"
:alt="$siteTitle" :alt="$siteTitle"
> />
<span <span
v-if="$siteTitle" v-if="$siteTitle"
ref="siteName" ref="siteName"
class="site-name" class="site-name"
:class="{ 'can-hide': $site.themeConfig.logo }" :class="{ 'can-hide': $site.themeConfig.logo }"
>{{ $siteTitle }}</span> >{{ $siteTitle }}</span
>
</RouterLink> </RouterLink>
<div <div
class="links" class="links"
:style="linksWrapMaxWidth ? { :style="
'max-width': linksWrapMaxWidth + 'px' linksWrapMaxWidth
} : {}" ? {
'max-width': linksWrapMaxWidth + 'px',
}
: {}
"
> >
<div v-if="$page.frontmatter.hideSearch" /> <div v-if="$page.frontmatter.hideSearch" />
<AlgoliaSearchBox <AlgoliaSearchBox v-else-if="isAlgoliaSearch" :options="algolia" />
v-else-if="isAlgoliaSearch" <SearchBox
:options="algolia" v-else-if="
$site.themeConfig.search !== false &&
$page.frontmatter.search !== false
"
/> />
<SearchBox v-else-if="$site.themeConfig.search !== false && $page.frontmatter.search !== false" />
<NavLinks class="can-hide" /> <NavLinks class="can-hide" />
</div> </div>
</header> </header>
</template> </template>
<script> <script>
import AlgoliaSearchBox from './AlgoliaSearchBox.vue' import SearchBox from "@SearchBox";
import SearchBox from '@SearchBox' import SidebarButton from "@theme/components/SidebarButton.vue";
import SidebarButton from '@theme/components/SidebarButton.vue' import NavLinks from "@theme/components/NavLinks.vue";
import NavLinks from '@theme/components/NavLinks.vue' import AlgoliaSearchBox from "./AlgoliaSearchBox.vue";
export default { export default {
name: 'Navbar', name: "Navbar",
components: { components: {
SidebarButton, SidebarButton,
NavLinks, NavLinks,
SearchBox, SearchBox,
AlgoliaSearchBox AlgoliaSearchBox,
}, },
data() { data() {
return { return {
linksWrapMaxWidth: null linksWrapMaxWidth: null,
} };
}, },
computed: { computed: {
algolia() { algolia() {
return this.$themeLocaleConfig.algolia || this.$site.themeConfig.algolia || {} return (
this.$themeLocaleConfig.algolia ||
this.$site.themeConfig.algolia ||
{}
);
}, },
isAlgoliaSearch() { isAlgoliaSearch() {
return this.algolia && this.algolia.apiKey && this.algolia.indexName return (
} this.algolia && this.algolia.apiKey && this.algolia.indexName
);
},
}, },
mounted() { mounted() {
const MOBILE_DESKTOP_BREAKPOINT = 719 // refer to config.styl const MOBILE_DESKTOP_BREAKPOINT = 719; // refer to config.styl
const NAVBAR_VERTICAL_PADDING = parseInt(css(this.$el, 'paddingLeft')) + parseInt(css(this.$el, 'paddingRight')) const NAVBAR_VERTICAL_PADDING =
// eslint-disable-next-line radix
parseInt(css(this.$el, "paddingLeft")) +
// eslint-disable-next-line radix
parseInt(css(this.$el, "paddingRight"));
const handleLinksWrapWidth = () => { const handleLinksWrapWidth = () => {
if (document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT) { if (
this.linksWrapMaxWidth = null document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT
) {
this.linksWrapMaxWidth = null;
} else { } else {
this.linksWrapMaxWidth = this.$el.offsetWidth - NAVBAR_VERTICAL_PADDING this.linksWrapMaxWidth =
- (this.$refs.siteName && this.$refs.siteName.offsetWidth || 0) this.$el.offsetWidth -
} NAVBAR_VERTICAL_PADDING -
} ((this.$refs.siteName && this.$refs.siteName.offsetWidth) ||
handleLinksWrapWidth() 0);
window.addEventListener('resize', handleLinksWrapWidth, false)
}
} }
};
handleLinksWrapWidth();
window.addEventListener("resize", handleLinksWrapWidth, false);
},
};
function css(el, property) { function css(el, property) {
// NOTE: Known bug, will return 'auto' if style value is 'auto' // NOTE: Known bug, will return "auto" if style value is "auto"
const win = el.ownerDocument.defaultView const win = el.ownerDocument.defaultView;
// null means not to return pseudo styles // null means not to return pseudo styles
return win.getComputedStyle(el, null)[property] return win.getComputedStyle(el, null)[property];
} }
</script> </script>

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
extend: "@vuepress/theme-default" extend: "@vuepress/theme-default",
}; };

View File

@ -47,6 +47,6 @@ Visit our translation project [here](https://hosted.weblate.org/projects/tachiyo
## Donation ## Donation
If you can't contribute code or translations but you still wish to help, then you can choose to contribute directly to the projects founder, [Inorichi](https://github.com/inorichi/) by using the button below, or going [directly to Ko-Fi](https://ko-fi.com/inorichi). If you can't contribute code or translations but you still wish to help, then you can choose to contribute directly to the projects founder, [Inorichi](https://github.com/inorichi/) by using the button below, or going [directly to Ko-Fi](https://ko-fi.com/inorichi).
*** ***
<a href='https://ko-fi.com/inorichi' target='_blank' rel='noopener'> <a href="https://ko-fi.com/inorichi" target="_blank" rel="noopener">
<img height='36' style='border:0px;height:36px;' src='https://cdn.ko-fi.com/cdn/kofi1.png?v=2' border='0' alt='Buy Me a Coffee at ko-fi.com' /> <img height="36" style="border:0px;height:36px;" src="https://cdn.ko-fi.com/cdn/kofi1.png?v=2" border="0" alt="Buy Me a Coffee at ko-fi.com" />
</a> </a>

View File

@ -12,8 +12,7 @@ Migration is the process of moving manga from one source to another while keepin
1. Go to <Navigation item="more"/> and tap <Navigation item="source_migration"/>. 1. Go to <Navigation item="more"/> and tap <Navigation item="source_migration"/>.
1. Select the **Source** you're migrating from. 1. Select the **Source** you're migrating from.
1. Find and select the title that you want to migrate. 1. Find and select the title that you want to migrate.
> **Tachiyomi** will do a global search of all the sources you have installed and enabled. If you don't find the manga you want, try searching for other titles it might go under.
**Tachiyomi** will do a global search of all the sources you have installed and enabled. If you don't find the manga you want, try searching for other titles it might go under.
1. Once you find the manga you want to migrate, select it and then choose which data you want to transfer over, and you're done. 1. Once you find the manga you want to migrate, select it and then choose which data you want to transfer over, and you're done.
::: :::