├── .commitlintrc.js ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── question.md ├── PULL_REQUEST_TEMPLATE.md ├── lock.yml ├── stale.yml └── workflows │ └── check.yml ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── jest.config.js ├── lerna.json ├── package.json ├── packages ├── docs │ ├── .gitignore │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── .vuepress │ │ │ ├── components │ │ │ │ ├── GitHubLink.vue │ │ │ │ └── NpmLink.vue │ │ │ ├── config.js │ │ │ ├── ecosystem.js │ │ │ ├── public │ │ │ │ └── logo │ │ │ │ │ └── 600x600.png │ │ │ └── styles │ │ │ │ ├── container.styl │ │ │ │ ├── content.styl │ │ │ │ ├── index.styl │ │ │ │ └── mathjax.styl │ │ ├── en │ │ │ ├── README.md │ │ │ ├── plugins │ │ │ │ ├── clean-urls.md │ │ │ │ ├── container.md │ │ │ │ ├── copyright.md │ │ │ │ ├── dehydrate.md │ │ │ │ ├── git-log.md │ │ │ │ ├── mathjax.md │ │ │ │ ├── medium-zoom.md │ │ │ │ ├── migrate.md │ │ │ │ ├── named-chunks.md │ │ │ │ ├── nprogress.md │ │ │ │ ├── redirect.md │ │ │ │ ├── serve.md │ │ │ │ ├── smooth-scroll.md │ │ │ │ ├── table-of-contents.md │ │ │ │ ├── typescript.md │ │ │ │ └── zooming.md │ │ │ └── tools │ │ │ │ ├── mergeable.md │ │ │ │ └── types.md │ │ └── zh │ │ │ ├── README.md │ │ │ ├── plugins │ │ │ ├── clean-urls.md │ │ │ ├── container.md │ │ │ ├── copyright.md │ │ │ ├── dehydrate.md │ │ │ ├── git-log.md │ │ │ ├── mathjax.md │ │ │ ├── medium-zoom.md │ │ │ ├── migrate.md │ │ │ ├── named-chunks.md │ │ │ ├── nprogress.md │ │ │ ├── redirect.md │ │ │ ├── serve.md │ │ │ ├── smooth-scroll.md │ │ │ ├── table-of-contents.md │ │ │ ├── typescript.md │ │ │ └── zooming.md │ │ │ └── tools │ │ │ ├── mergeable.md │ │ │ └── types.md │ └── tsconfig.json ├── vuepress-mergeable │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-clean-urls │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-container │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── markdown-it-container.ts │ ├── test │ │ └── e2e │ │ │ ├── __fragments__ │ │ │ ├── hint-default.md │ │ │ ├── hint-locale-jp.md │ │ │ ├── hint-override.md │ │ │ └── theorem.md │ │ │ ├── __snapshots__ │ │ │ └── index.spec.ts.snap │ │ │ └── index.spec.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-dehydrate │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ └── index.ts │ ├── test │ │ └── e2e │ │ │ ├── __snapshots__ │ │ │ └── index.spec.ts.snap │ │ │ ├── docs │ │ │ ├── .vuepress │ │ │ │ ├── config.js │ │ │ │ └── theme │ │ │ │ │ └── layouts │ │ │ │ │ └── Layout.vue │ │ │ ├── README.md │ │ │ └── noscript.md │ │ │ └── index.spec.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-medium-zoom │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── VuepressMediumZoom.ts │ │ ├── clientRootMixin.ts │ │ └── index.ts │ ├── styles │ │ └── index.styl │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-named-chunks │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ └── index.ts │ ├── test │ │ └── e2e │ │ │ ├── __snapshots__ │ │ │ └── index.spec.ts.snap │ │ │ ├── docs │ │ │ ├── .vuepress │ │ │ │ ├── config.js │ │ │ │ └── theme │ │ │ │ │ └── layouts │ │ │ │ │ ├── Custom.vue │ │ │ │ │ └── Layout.vue │ │ │ ├── README.md │ │ │ └── custom.md │ │ │ └── index.spec.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-nprogress │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── clientRootMixin.ts │ │ └── index.ts │ ├── styles │ │ └── index.styl │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-redirect │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── enhanceApp.ts │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-serve │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-smooth-scroll │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── clientRootMixin.ts │ │ ├── enhanceApp.ts │ │ └── index.ts │ ├── styles │ │ └── index.styl │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-table-of-contents │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── components │ │ │ └── TableOfContents.ts │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-typescript │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ └── index.ts │ ├── test │ │ ├── .eslintrc.js │ │ └── e2e │ │ │ ├── __snapshots__ │ │ │ └── index.spec.ts.snap │ │ │ ├── docs │ │ │ ├── .vuepress │ │ │ │ ├── config.js │ │ │ │ ├── shims-vue.d.ts │ │ │ │ └── theme │ │ │ │ │ ├── components │ │ │ │ │ ├── Test.vue │ │ │ │ │ ├── TestIndexTsFile │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── TestTsFile.ts │ │ │ │ │ ├── enhanceApp.ts │ │ │ │ │ └── layouts │ │ │ │ │ └── Layout.vue │ │ │ ├── README.md │ │ │ ├── enhance-app-ts.md │ │ │ └── ts-in-md.md │ │ │ ├── index.spec.ts │ │ │ └── tsconfig.json │ ├── tsconfig.build.json │ └── tsconfig.json ├── vuepress-plugin-zooming │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── VuepressZooming.ts │ │ ├── clientRootMixin.ts │ │ └── index.ts │ ├── tsconfig.build.json │ └── tsconfig.json └── vuepress-types │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── tsconfig.json │ └── types │ ├── computed.d.ts │ ├── config.d.ts │ ├── context.d.ts │ ├── core.d.ts │ ├── enhance-app.d.ts │ ├── index.d.ts │ ├── markdown.d.ts │ ├── page.d.ts │ ├── plugin-api.d.ts │ ├── plugin.d.ts │ ├── store.d.ts │ ├── theme-api.d.ts │ └── theme.d.ts ├── tsconfig.json └── yarn.lock /.commitlintrc.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | 4 | const packages = fs 5 | .readdirSync(path.resolve(__dirname, 'packages')) 6 | .filter(name => !['docs'].includes(name)) 7 | 8 | module.exports = { 9 | extends: ['@commitlint/config-conventional'], 10 | rules: { 11 | 'scope-enum': [ 12 | 2, 13 | 'always', 14 | packages.map(name => name.replace(/^vuepress-/, '')), 15 | ], 16 | }, 17 | } 18 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | !.vuepress/ 3 | !.eslintrc.js 4 | !.commitlintrc.js 5 | lib/ 6 | dist/ 7 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: 'vuepress', 4 | overrides: [ 5 | { 6 | files: ['*.ts'], 7 | extends: 'vuepress-typescript', 8 | rules: { 9 | '@typescript-eslint/no-var-requires': 'off', 10 | }, 11 | }, 12 | { 13 | files: ['packages/*/test/**/*.ts'], 14 | env: { 15 | jest: true, 16 | }, 17 | rules: { 18 | '@typescript-eslint/explicit-function-return-type': 'off', 19 | }, 20 | }, 21 | ], 22 | } 23 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | *.txt text eol=crlf 3 | 4 | *.png binary 5 | *.jpg binary 6 | *.jpeg binary 7 | *.ico binary 8 | *.tff binary 9 | *.woff binary 10 | *.woff2 binary 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a bug report to help us improve 4 | title: '[Bug Report] ' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | ## Environment 10 | 11 | 12 | 13 | 20 | 21 | - Package version: 22 | - VuePress version: 23 | - OS: 24 | - Browser: 25 | 26 | ## Describe the bug 27 | 28 | 29 | 30 | ## Steps To Reproduce 31 | 32 | 33 | 34 | 41 | 42 | ## Screenshots 43 | 44 | 45 | 46 | ## Expected behavior 47 | 48 | 49 | 50 | ## Additional context 51 | 52 | 53 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea 4 | title: '[Feature Request] ' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | ## What problem does the feature solve? 10 | 11 | 12 | 13 | ## Proposed solution 14 | 15 | 16 | 17 | ## Alternative solutions 18 | 19 | 20 | 21 | ## Additional context 22 | 23 | 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Any Questions or Problems 4 | title: '[Question] ' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | ## Environment 10 | 11 | 12 | 13 | 20 | 21 | - Package version: 22 | - VuePress version: 23 | - OS: 24 | - Browser: 25 | 26 | ## What's your question? 27 | 28 | 29 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | **Summary** 7 | 8 | **Which package does this PR involve?** (check one) 9 | 10 | - [ ] root project 11 | - [ ] vuepress-plugin-clean-urls 12 | - [ ] vuepress-plugin-container 13 | - [ ] vuepress-plugin-dehydrate 14 | - [ ] vuepress-plugin-medium-zoom 15 | - [ ] vuepress-plugin-named-chunks 16 | - [ ] vuepress-plugin-nprogress 17 | - [ ] vuepress-plugin-redirect 18 | - [ ] vuepress-plugin-smooth-scroll 19 | - [ ] vuepress-plugin-table-of-contents 20 | - [ ] vuepress-plugin-typescript 21 | - [ ] vuepress-plugin-zooming 22 | - [ ] vuepress-mergeable 23 | - [ ] vuepress-types 24 | 25 | **What kind of change does this PR introduce?** (check at least one) 26 | 27 | - [ ] Bugfix (fix) 28 | - [ ] Feature (feat) 29 | - [ ] Performance enhancement (perf) 30 | - [ ] Code Style (style) 31 | - [ ] Refactor (refactor) 32 | - [ ] Docs (docs) 33 | - [ ] Build-related changes (build) 34 | - [ ] CI-related changes (ci) 35 | - [ ] Testing (test) 36 | - [ ] Other, please describe: 37 | 38 | **Does this PR introduce a breaking change?** (check one) 39 | 40 | - [ ] Yes 41 | - [ ] No 42 | 43 | If yes, please describe the impact and migration path for existing applications: 44 | 45 | **The PR fulfills these requirements:** 46 | 47 | - [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number) 48 | 49 | **Other information:** 50 | -------------------------------------------------------------------------------- /.github/lock.yml: -------------------------------------------------------------------------------- 1 | # Configuration for Lock Threads - https://github.com/dessant/lock-threads 2 | 3 | # Number of days of inactivity before a closed issue or pull request is locked 4 | daysUntilLock: 120 5 | 6 | # Skip issues and pull requests created before a given timestamp. Timestamp must 7 | # follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable 8 | skipCreatedBefore: false 9 | 10 | # Issues and pull requests with these labels will be ignored. Set to `[]` to disable 11 | exemptLabels: [] 12 | 13 | # Label to add before locking, such as `outdated`. Set to `false` to disable 14 | lockLabel: false 15 | 16 | # Comment to post before locking. Set to `false` to disable 17 | lockComment: > 18 | This thread has been automatically locked since there has not been 19 | any recent activity after it was closed. Please open a new issue for 20 | related bugs. 21 | 22 | # Assign `resolved` as the reason for locking. Set to `false` to disable 23 | setLockReason: true 24 | # Limit to only `issues` or `pulls` 25 | # only: issues 26 | 27 | # Optionally, specify configuration settings just for `issues` or `pulls` 28 | # issues: 29 | # exemptLabels: 30 | # - help-wanted 31 | # lockLabel: outdated 32 | 33 | # pulls: 34 | # daysUntilLock: 30 35 | 36 | # Repository to extend settings from 37 | # _extends: repo 38 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Configuration for probot-stale - https://github.com/probot/stale 2 | 3 | # Number of days of inactivity before an Issue or Pull Request becomes stale 4 | daysUntilStale: 60 5 | 6 | # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. 7 | # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. 8 | daysUntilClose: 7 9 | 10 | # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) 11 | onlyLabels: [] 12 | 13 | # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable 14 | exemptLabels: 15 | - bug 16 | 17 | # Set to true to ignore issues in a project (defaults to false) 18 | exemptProjects: false 19 | 20 | # Set to true to ignore issues in a milestone (defaults to false) 21 | exemptMilestones: false 22 | 23 | # Set to true to ignore issues with an assignee (defaults to false) 24 | exemptAssignees: false 25 | 26 | # Label to use when marking as stale 27 | staleLabel: stale 28 | 29 | # Comment to post when marking as stale. Set to `false` to disable 30 | markComment: > 31 | This issue has been automatically marked as stale because it has not had 32 | recent activity. It will be closed if no further activity occurs. Thank you 33 | for your contributions. 34 | 35 | # Comment to post when removing the stale label. 36 | # unmarkComment: > 37 | # Your comment here. 38 | 39 | # Comment to post when closing a stale Issue or Pull Request. 40 | # closeComment: > 41 | # Your comment here. 42 | 43 | # Limit the number of actions per hour, from 1-30. Default is 30 44 | limitPerRun: 30 45 | # Limit to only `issues` or `pulls` 46 | # only: issues 47 | 48 | # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': 49 | # pulls: 50 | # daysUntilStale: 30 51 | # markComment: > 52 | # This pull request has been automatically marked as stale because it has not had 53 | # recent activity. It will be closed if no further activity occurs. Thank you 54 | # for your contributions. 55 | 56 | # issues: 57 | # exemptLabels: 58 | # - confirmed 59 | -------------------------------------------------------------------------------- /.github/workflows/check.yml: -------------------------------------------------------------------------------- 1 | name: check 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | check: 12 | strategy: 13 | matrix: 14 | os: [ubuntu-latest, windows-latest, macos-latest] 15 | node: [12.x, 14.x] 16 | 17 | runs-on: ${{ matrix.os }} 18 | 19 | steps: 20 | - uses: actions/checkout@v2 21 | 22 | - name: Use Node.js ${{ matrix.node }} 23 | uses: actions/setup-node@v1 24 | with: 25 | node-version: ${{ matrix.node }} 26 | 27 | - name: Cache dependencies 28 | uses: actions/cache@v2 29 | id: yarn-cache 30 | with: 31 | path: | 32 | **/node_modules 33 | key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} 34 | restore-keys: | 35 | ${{ runner.os }}-yarn- 36 | 37 | - name: Install dependencies 38 | if: steps.yarn-cache.outputs.cache-hit != 'true' 39 | run: yarn --frozen-lockfile 40 | 41 | - name: Lint 42 | run: yarn lint 43 | 44 | - name: Build 45 | run: yarn build 46 | 47 | - name: Test 48 | run: yarn test 49 | 50 | - name: Docs build 51 | run: yarn build:docs 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dist files 2 | lib/ 3 | 4 | # Node modules 5 | node_modules/ 6 | 7 | # MacOS Desktop Services Store 8 | .DS_Store 9 | 10 | # Log files 11 | *.log 12 | 13 | # Typescript build info 14 | *.tsbuildinfo 15 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.insertSpaces": true, 3 | "editor.tabSize": 2, 4 | "files.encoding": "utf8", 5 | "files.eol": "\n", 6 | "files.trimFinalNewlines": true, 7 | "files.trimTrailingWhitespace": true, 8 | "[markdown]": { 9 | "files.trimTrailingWhitespace": false 10 | }, 11 | "eslint.validate": [ 12 | "javascript", 13 | "javascriptreact", 14 | "typescript", 15 | "typescriptreact", 16 | "vue" 17 | ], 18 | "vetur.validation.template": false, 19 | "cSpell.words": [ 20 | "frontmatter", 21 | "globby", 22 | "mathjax", 23 | "mergeable", 24 | "netlify", 25 | "nprogress", 26 | "prefetch", 27 | "preload", 28 | "redirector", 29 | "redirectors", 30 | "serializers", 31 | "vuepress", 32 | "zoomable" 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019-present VuePress Community 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
26 | Community supported ecosystem for VuePress 27 |
28 | 29 | ## Documentation 30 | 31 | [vuepress-community.netlify.app](https://vuepress-community.netlify.app) 32 | 33 | ## License 34 | 35 | [MIT](https://github.com/vuepress/vuepress-community/blob/main/LICENSE) © [VuePress Community](https://github.com/vuepress) 36 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | const { resolve } = require('path') 2 | const { readdirSync } = require('fs') 3 | 4 | const packages = readdirSync(resolve(__dirname, 'packages'), { 5 | withFileTypes: true, 6 | }) 7 | .filter(item => item.isDirectory()) 8 | .map(({ name }) => name) 9 | 10 | module.exports = { 11 | rootDir: resolve(__dirname), 12 | testEnvironment: 'node', 13 | preset: 'ts-jest', 14 | globals: { 15 | 'ts-jest': { 16 | tsConfig: '${info}
`, 37 | after: '75 | Copyright © VuePress Community Link: 76 | {{ location }} 77 |
78 | 79 |77 | 著作权归 VuePress Community 所有。 链接:{{ 78 | location 79 | }} 80 |
81 | 82 |比如,当你在浏览器地址栏中键入 {{ location }}
时,页面将自动重定向到这里。
💡 HINT
6 |This is a hint.
7 |ヒント
13 |これはヒントです。
14 |提示
20 |这是一句提示。
21 |Newton's First Law
27 |In an inertial frame of reference, an object either remains at rest or continues to move at a constant velocity, unless acted upon by a force.
28 |${info}
`, 30 | after: 'readme
59 |noscript
88 |Custom
30 |readme
69 |