├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github └── workflows │ └── nodejs.yml ├── .gitignore ├── .husky └── pre-commit ├── CHANGELOG.md ├── LICENSE ├── README.md ├── examples └── simple │ ├── .gitignore │ ├── custom-typograf-example.js │ ├── example.js │ ├── example.md │ ├── package-lock.json │ └── package.json ├── index.js ├── jest.config.js ├── package-lock.json ├── package.json ├── remark-typograf.js ├── remark-typograf.test.js └── scripts ├── before.md ├── generate.js └── publishSite.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | coverage 3 | node_modules 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | commonjs: true, 4 | es6: true, 5 | node: true, 6 | }, 7 | extends: ["eslint:recommended", "plugin:jest/recommended"], 8 | globals: { 9 | Atomics: "readonly", 10 | SharedArrayBuffer: "readonly", 11 | }, 12 | parserOptions: { 13 | ecmaVersion: 2018, 14 | }, 15 | rules: {}, 16 | }; 17 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [master] 9 | pull_request: 10 | branches: [master] 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | strategy: 17 | matrix: 18 | node-version: [12.x] 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | - name: Use Node.js ${{ matrix.node-version }} 23 | uses: actions/setup-node@v1 24 | with: 25 | node-version: ${{ matrix.node-version }} 26 | - run: npm ci 27 | - run: npm run lint 28 | - run: npm test 29 | env: 30 | CI: true 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # Snowpack dependency directory (https://snowpack.dev/) 47 | web_modules/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Microbundle cache 59 | .rpt2_cache/ 60 | .rts2_cache_cjs/ 61 | .rts2_cache_es/ 62 | .rts2_cache_umd/ 63 | 64 | # Optional REPL history 65 | .node_repl_history 66 | 67 | # Output of 'npm pack' 68 | *.tgz 69 | 70 | # Yarn Integrity file 71 | .yarn-integrity 72 | 73 | # dotenv environment variables file 74 | .env 75 | .env.test 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | .parcel-cache 80 | 81 | # Next.js build output 82 | .next 83 | 84 | # Nuxt.js build / generate output 85 | .nuxt 86 | dist 87 | 88 | # Gatsby files 89 | .cache/ 90 | # Comment in the public line in if your project uses Gatsby and not Next.js 91 | # https://nextjs.org/blog/next-9-1#public-directory-support 92 | # public 93 | 94 | # vuepress build output 95 | .vuepress/dist 96 | 97 | # Serverless directories 98 | .serverless/ 99 | 100 | # FuseBox cache 101 | .fusebox/ 102 | 103 | # DynamoDB Local files 104 | .dynamodb/ 105 | 106 | # TernJS port file 107 | .tern-port 108 | 109 | # Stores VSCode versions used for testing VSCode extensions 110 | .vscode-test 111 | 112 | # yarn v2 113 | 114 | .yarn/cache 115 | .yarn/unplugged 116 | .yarn/build-state.yml 117 | .pnp.* 118 | .idea 119 | 120 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | npx --no-install pretty-quick --staged 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 2.1.6 (May 5, 2020) 2 | 3 | update dev dependencies 4 | 5 | ## 2.1.5 (May 5, 2020) 6 | 7 | fix case with inline code 8 | 9 | ## 2.1.4 (May 5, 2020) 10 | 11 | use visit method instead of own tree walker 12 | 13 | ## 2.1.3 (May 5, 2020) 14 | 15 | use files section in package.json instead of .npmignore 16 | 17 | ## 2.1.2 (May 5, 2020) 18 | 19 | Fix case with mark and punctuation. Before the fix, plugin add an unnecessary comma. 20 | 21 | ``` 22 | **Categories,** а у родительского тега // original markdonw 23 | **Categories,**, а у родительского тега // before the fix 24 | **Categories,** а у родительского тега // after the fix 25 | ``` 26 | 27 | ## 2.1.1 (Apr 26, 2020) 28 | 29 | Fix readme 30 | 31 | ## 2.1.0 (Apr 26, 2020) 32 | 33 | Add `keywords` config. Strings from this config will be not typografed. 34 | 35 | ## 2.0.1 (Apr 24, 2020) 36 | 37 | Now typograf is built-in to plugin. Also was added remark-cli support. 38 | 39 | ### Breaking Changes 40 | 41 | Plugin use builtIn typograf. If you want use custom typograf set `builtIn`option to false. 42 | 43 | ## 1.0.0 (Apr 20, 2020) 44 | 45 | Initial version. 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Konstantin Krivlenia 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # remarkjs-typograf 2 | 3 | Plugin for [remark](https://github.com/remarkjs/remark) to make your typography better with [typograf](https://github.com/typograf/typograf) 4 | 5 | Example https://mavrin.github.io/remark-typograf/ 6 | 7 | ## Install 8 | 9 | [npm](https://docs.npmjs.com/cli/install): 10 | 11 | ```sh 12 | npm install @mavrin/remark-typograf remark 13 | ``` 14 | 15 | ## Use 16 | 17 | Say we have the following file, `example.md`: 18 | 19 | ````markdown 20 | ## spread operator `...` 21 | 22 | It is test... 23 | 24 | ```js 25 | function test(...args) { 26 | return args; 27 | } 28 | ``` 29 | ```` 30 | 31 | You probably want to use it on the CLI through a config file: 32 | 33 | ```diff 34 | … 35 | "remarkConfig": { 36 | "plugins": [ 37 | [ 38 | "@mavrin/remark-typograf", 39 | { 40 | "locale": ["ru"] 41 | } 42 | ] 43 | ] 44 | } 45 | … 46 | ``` 47 | 48 | Or use it on the CLI directly (ru locale will be used as default) 49 | 50 | ```sh 51 | remark -u @mavrin/remark-typograf example.md -o processed-example.md 52 | ``` 53 | 54 | Or use this on the API: 55 | 56 | ```js 57 | const fs = require("fs"); 58 | const path = require("path"); 59 | const remark = require("remark"); 60 | const remarkTypograf = require("@mavrin/remark-typograf"); 61 | 62 | const processed = remark() 63 | .use(remarkTypograf, { locale: ["en-US"], keywords: [":)"] }) 64 | .processSync(fs.readFileSync(path.resolve(__dirname, "example.md"))); 65 | 66 | fs.writeFileSync(path.resolve(__dirname, "processed-example.md"), processed); 67 | ``` 68 | 69 | or with custom typograf: 70 | 71 | ```js 72 | const fs = require("fs"); 73 | const path = require("path"); 74 | const remark = require("remark"); 75 | const remarkTypograf = require("@mavrin/remark-typograf"); 76 | const Typograf = require("typograf"); 77 | 78 | const processed = remark() 79 | .use(remarkTypograf, { 80 | typograf: new Typograf({ locale: ["en-US"] }), 81 | keywords: [":)"], 82 | builtIn: false, 83 | }) 84 | .processSync(fs.readFileSync(path.resolve(__dirname, "example.md"))); 85 | 86 | fs.writeFileSync(path.resolve(__dirname, "processed-example.md"), processed); 87 | ``` 88 | 89 | Yields: 90 | 91 | ````markdown 92 | ## spread operator `...` 93 | 94 | It is test… 95 | 96 | ```js 97 | function test(...args) { 98 | return args; 99 | } 100 | ``` 101 | ```` 102 | 103 | [Example source code](/examples/simple) 104 | -------------------------------------------------------------------------------- /examples/simple/.gitignore: -------------------------------------------------------------------------------- 1 | processed-example.md 2 | -------------------------------------------------------------------------------- /examples/simple/custom-typograf-example.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const remark = require("remark"); 4 | const remarkTypograf = require("@mavrin/remark-typograf"); 5 | const Typograf = require("typograf"); 6 | 7 | const processed = remark() 8 | .use(remarkTypograf, { 9 | typograf: new Typograf({ locale: ["en-US"] }), 10 | builtIn: false, 11 | }) 12 | .processSync(fs.readFileSync(path.resolve(__dirname, "example.md"))); 13 | 14 | fs.writeFileSync(path.resolve(__dirname, "processed-example.md"), processed.toString()); 15 | -------------------------------------------------------------------------------- /examples/simple/example.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const remark = require("remark"); 4 | const remarkTypograf = require("@mavrin/remark-typograf"); 5 | const Typograf = require("typograf"); 6 | 7 | const processed = remark() 8 | .use(remarkTypograf, { 9 | typograf: new Typograf({ locale: ["en-US"] }), 10 | keywords: [":)"], 11 | builtIn: false, 12 | }) 13 | .processSync(fs.readFileSync(path.resolve(__dirname, "example.md"))); 14 | 15 | fs.writeFileSync(path.resolve(__dirname, "processed-example.md"), processed.toString()); 16 | -------------------------------------------------------------------------------- /examples/simple/example.md: -------------------------------------------------------------------------------- 1 | ## spread operator `...` 2 | 3 | It is test... :) 4 | 5 | ```js 6 | function test(...args) { 7 | return args; 8 | } 9 | ``` 10 | -------------------------------------------------------------------------------- /examples/simple/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remark-typograf-simple-expample", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@babel/code-frame": { 7 | "version": "7.12.13", 8 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", 9 | "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", 10 | "requires": { 11 | "@babel/highlight": "^7.12.13" 12 | } 13 | }, 14 | "@babel/helper-validator-identifier": { 15 | "version": "7.12.11", 16 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", 17 | "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" 18 | }, 19 | "@babel/highlight": { 20 | "version": "7.13.10", 21 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", 22 | "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", 23 | "requires": { 24 | "@babel/helper-validator-identifier": "^7.12.11", 25 | "chalk": "^2.0.0", 26 | "js-tokens": "^4.0.0" 27 | }, 28 | "dependencies": { 29 | "ansi-styles": { 30 | "version": "3.2.1", 31 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 32 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 33 | "requires": { 34 | "color-convert": "^1.9.0" 35 | } 36 | }, 37 | "chalk": { 38 | "version": "2.4.2", 39 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 40 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 41 | "requires": { 42 | "ansi-styles": "^3.2.1", 43 | "escape-string-regexp": "^1.0.5", 44 | "supports-color": "^5.3.0" 45 | } 46 | }, 47 | "color-convert": { 48 | "version": "1.9.3", 49 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 50 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 51 | "requires": { 52 | "color-name": "1.1.3" 53 | } 54 | }, 55 | "color-name": { 56 | "version": "1.1.3", 57 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 58 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 59 | }, 60 | "has-flag": { 61 | "version": "3.0.0", 62 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 63 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 64 | }, 65 | "supports-color": { 66 | "version": "5.5.0", 67 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 68 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 69 | "requires": { 70 | "has-flag": "^3.0.0" 71 | } 72 | } 73 | } 74 | }, 75 | "@mavrin/remark-typograf": { 76 | "version": "2.1.6", 77 | "resolved": "https://registry.npmjs.org/@mavrin/remark-typograf/-/remark-typograf-2.1.6.tgz", 78 | "integrity": "sha512-6fOVtmX7U1ytwYJh9pd8HbDq2T4SodVkp6bZpe6aYfnieHlujvmyBMtogl+TkA8rPX3BEhNEBCDG07Kesk8y9Q==", 79 | "requires": { 80 | "lodash.escaperegexp": "^4.1.2", 81 | "typograf": "^6.11.0", 82 | "unist-util-visit": "^2.0.2" 83 | } 84 | }, 85 | "@types/mdast": { 86 | "version": "3.0.3", 87 | "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", 88 | "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", 89 | "requires": { 90 | "@types/unist": "*" 91 | } 92 | }, 93 | "@types/unist": { 94 | "version": "2.0.3", 95 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", 96 | "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" 97 | }, 98 | "ansi-regex": { 99 | "version": "5.0.1", 100 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 101 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 102 | }, 103 | "ansi-styles": { 104 | "version": "4.3.0", 105 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 106 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 107 | "requires": { 108 | "color-convert": "^2.0.1" 109 | } 110 | }, 111 | "anymatch": { 112 | "version": "3.1.2", 113 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 114 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 115 | "requires": { 116 | "normalize-path": "^3.0.0", 117 | "picomatch": "^2.0.4" 118 | } 119 | }, 120 | "argparse": { 121 | "version": "1.0.10", 122 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 123 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 124 | "requires": { 125 | "sprintf-js": "~1.0.2" 126 | } 127 | }, 128 | "bail": { 129 | "version": "1.0.5", 130 | "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", 131 | "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" 132 | }, 133 | "balanced-match": { 134 | "version": "1.0.2", 135 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 136 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 137 | }, 138 | "binary-extensions": { 139 | "version": "2.2.0", 140 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 141 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 142 | }, 143 | "brace-expansion": { 144 | "version": "1.1.11", 145 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 146 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 147 | "requires": { 148 | "balanced-match": "^1.0.0", 149 | "concat-map": "0.0.1" 150 | } 151 | }, 152 | "braces": { 153 | "version": "3.0.2", 154 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 155 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 156 | "requires": { 157 | "fill-range": "^7.0.1" 158 | } 159 | }, 160 | "buffer-from": { 161 | "version": "1.1.1", 162 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 163 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 164 | }, 165 | "camelcase": { 166 | "version": "5.3.1", 167 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 168 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 169 | }, 170 | "chalk": { 171 | "version": "3.0.0", 172 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 173 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 174 | "requires": { 175 | "ansi-styles": "^4.1.0", 176 | "supports-color": "^7.1.0" 177 | } 178 | }, 179 | "character-entities": { 180 | "version": "1.2.4", 181 | "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", 182 | "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" 183 | }, 184 | "character-entities-legacy": { 185 | "version": "1.1.4", 186 | "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", 187 | "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" 188 | }, 189 | "character-reference-invalid": { 190 | "version": "1.1.4", 191 | "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", 192 | "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" 193 | }, 194 | "chokidar": { 195 | "version": "3.5.1", 196 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 197 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 198 | "requires": { 199 | "anymatch": "~3.1.1", 200 | "braces": "~3.0.2", 201 | "fsevents": "~2.3.1", 202 | "glob-parent": "~5.1.0", 203 | "is-binary-path": "~2.1.0", 204 | "is-glob": "~4.0.1", 205 | "normalize-path": "~3.0.0", 206 | "readdirp": "~3.5.0" 207 | } 208 | }, 209 | "color-convert": { 210 | "version": "2.0.1", 211 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 212 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 213 | "requires": { 214 | "color-name": "~1.1.4" 215 | } 216 | }, 217 | "color-name": { 218 | "version": "1.1.4", 219 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 220 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 221 | }, 222 | "concat-map": { 223 | "version": "0.0.1", 224 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 225 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 226 | }, 227 | "concat-stream": { 228 | "version": "2.0.0", 229 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 230 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 231 | "requires": { 232 | "buffer-from": "^1.0.0", 233 | "inherits": "^2.0.3", 234 | "readable-stream": "^3.0.2", 235 | "typedarray": "^0.0.6" 236 | } 237 | }, 238 | "debug": { 239 | "version": "4.3.1", 240 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 241 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 242 | "requires": { 243 | "ms": "2.1.2" 244 | } 245 | }, 246 | "emoji-regex": { 247 | "version": "8.0.0", 248 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 249 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 250 | }, 251 | "error-ex": { 252 | "version": "1.3.2", 253 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 254 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 255 | "requires": { 256 | "is-arrayish": "^0.2.1" 257 | } 258 | }, 259 | "escape-string-regexp": { 260 | "version": "1.0.5", 261 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 262 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 263 | }, 264 | "esprima": { 265 | "version": "4.0.1", 266 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 267 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 268 | }, 269 | "extend": { 270 | "version": "3.0.2", 271 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 272 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 273 | }, 274 | "fault": { 275 | "version": "1.0.4", 276 | "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", 277 | "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", 278 | "requires": { 279 | "format": "^0.2.0" 280 | } 281 | }, 282 | "figgy-pudding": { 283 | "version": "3.5.2", 284 | "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", 285 | "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" 286 | }, 287 | "figures": { 288 | "version": "3.2.0", 289 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 290 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 291 | "requires": { 292 | "escape-string-regexp": "^1.0.5" 293 | } 294 | }, 295 | "fill-range": { 296 | "version": "7.0.1", 297 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 298 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 299 | "requires": { 300 | "to-regex-range": "^5.0.1" 301 | } 302 | }, 303 | "find-up": { 304 | "version": "3.0.0", 305 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 306 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 307 | "requires": { 308 | "locate-path": "^3.0.0" 309 | } 310 | }, 311 | "format": { 312 | "version": "0.2.2", 313 | "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", 314 | "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" 315 | }, 316 | "fs.realpath": { 317 | "version": "1.0.0", 318 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 319 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 320 | }, 321 | "fsevents": { 322 | "version": "2.3.2", 323 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 324 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 325 | "optional": true 326 | }, 327 | "glob": { 328 | "version": "7.1.6", 329 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 330 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 331 | "requires": { 332 | "fs.realpath": "^1.0.0", 333 | "inflight": "^1.0.4", 334 | "inherits": "2", 335 | "minimatch": "^3.0.4", 336 | "once": "^1.3.0", 337 | "path-is-absolute": "^1.0.0" 338 | } 339 | }, 340 | "glob-parent": { 341 | "version": "5.1.2", 342 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 343 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 344 | "requires": { 345 | "is-glob": "^4.0.1" 346 | } 347 | }, 348 | "has-flag": { 349 | "version": "4.0.0", 350 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 351 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 352 | }, 353 | "ignore": { 354 | "version": "5.1.8", 355 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", 356 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" 357 | }, 358 | "inflight": { 359 | "version": "1.0.6", 360 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 361 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 362 | "requires": { 363 | "once": "^1.3.0", 364 | "wrappy": "1" 365 | } 366 | }, 367 | "inherits": { 368 | "version": "2.0.4", 369 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 370 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 371 | }, 372 | "ini": { 373 | "version": "1.3.8", 374 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 375 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 376 | }, 377 | "is-alphabetical": { 378 | "version": "1.0.4", 379 | "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", 380 | "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" 381 | }, 382 | "is-alphanumerical": { 383 | "version": "1.0.4", 384 | "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", 385 | "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", 386 | "requires": { 387 | "is-alphabetical": "^1.0.0", 388 | "is-decimal": "^1.0.0" 389 | } 390 | }, 391 | "is-arrayish": { 392 | "version": "0.2.1", 393 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 394 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 395 | }, 396 | "is-binary-path": { 397 | "version": "2.1.0", 398 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 399 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 400 | "requires": { 401 | "binary-extensions": "^2.0.0" 402 | } 403 | }, 404 | "is-buffer": { 405 | "version": "2.0.5", 406 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 407 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" 408 | }, 409 | "is-decimal": { 410 | "version": "1.0.4", 411 | "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", 412 | "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" 413 | }, 414 | "is-empty": { 415 | "version": "1.2.0", 416 | "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", 417 | "integrity": "sha1-3pu1snhzigWgsJpX4ftNSjQan2s=" 418 | }, 419 | "is-extglob": { 420 | "version": "2.1.1", 421 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 422 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 423 | }, 424 | "is-fullwidth-code-point": { 425 | "version": "3.0.0", 426 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 427 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 428 | }, 429 | "is-glob": { 430 | "version": "4.0.1", 431 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 432 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 433 | "requires": { 434 | "is-extglob": "^2.1.1" 435 | } 436 | }, 437 | "is-hexadecimal": { 438 | "version": "1.0.4", 439 | "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", 440 | "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" 441 | }, 442 | "is-number": { 443 | "version": "7.0.0", 444 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 445 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 446 | }, 447 | "is-plain-obj": { 448 | "version": "2.1.0", 449 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 450 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" 451 | }, 452 | "js-tokens": { 453 | "version": "4.0.0", 454 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 455 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 456 | }, 457 | "js-yaml": { 458 | "version": "3.14.1", 459 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 460 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 461 | "requires": { 462 | "argparse": "^1.0.7", 463 | "esprima": "^4.0.0" 464 | } 465 | }, 466 | "json-parse-even-better-errors": { 467 | "version": "2.3.1", 468 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 469 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 470 | }, 471 | "json5": { 472 | "version": "2.2.3", 473 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 474 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" 475 | }, 476 | "libnpmconfig": { 477 | "version": "1.2.1", 478 | "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", 479 | "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", 480 | "requires": { 481 | "figgy-pudding": "^3.5.1", 482 | "find-up": "^3.0.0", 483 | "ini": "^1.3.5" 484 | } 485 | }, 486 | "lines-and-columns": { 487 | "version": "1.1.6", 488 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", 489 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" 490 | }, 491 | "load-plugin": { 492 | "version": "3.0.0", 493 | "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-3.0.0.tgz", 494 | "integrity": "sha512-od7eKCCZ62ITvFf8nHHrIiYmgOHb4xVNDRDqxBWSaao5FZyyZVX8OmRCbwjDGPrSrgIulwPNyBsWCGnhiDC0oQ==", 495 | "requires": { 496 | "libnpmconfig": "^1.0.0", 497 | "resolve-from": "^5.0.0" 498 | } 499 | }, 500 | "locate-path": { 501 | "version": "3.0.0", 502 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 503 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 504 | "requires": { 505 | "p-locate": "^3.0.0", 506 | "path-exists": "^3.0.0" 507 | } 508 | }, 509 | "lodash.escaperegexp": { 510 | "version": "4.1.2", 511 | "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", 512 | "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" 513 | }, 514 | "longest-streak": { 515 | "version": "2.0.4", 516 | "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", 517 | "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" 518 | }, 519 | "markdown-extensions": { 520 | "version": "1.1.1", 521 | "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", 522 | "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==" 523 | }, 524 | "mdast-util-from-markdown": { 525 | "version": "0.8.5", 526 | "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", 527 | "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", 528 | "requires": { 529 | "@types/mdast": "^3.0.0", 530 | "mdast-util-to-string": "^2.0.0", 531 | "micromark": "~2.11.0", 532 | "parse-entities": "^2.0.0", 533 | "unist-util-stringify-position": "^2.0.0" 534 | } 535 | }, 536 | "mdast-util-to-markdown": { 537 | "version": "0.6.5", 538 | "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", 539 | "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", 540 | "requires": { 541 | "@types/unist": "^2.0.0", 542 | "longest-streak": "^2.0.0", 543 | "mdast-util-to-string": "^2.0.0", 544 | "parse-entities": "^2.0.0", 545 | "repeat-string": "^1.0.0", 546 | "zwitch": "^1.0.0" 547 | } 548 | }, 549 | "mdast-util-to-string": { 550 | "version": "2.0.0", 551 | "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", 552 | "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" 553 | }, 554 | "micromark": { 555 | "version": "2.11.4", 556 | "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", 557 | "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", 558 | "requires": { 559 | "debug": "^4.0.0", 560 | "parse-entities": "^2.0.0" 561 | } 562 | }, 563 | "minimatch": { 564 | "version": "3.1.2", 565 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 566 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 567 | "requires": { 568 | "brace-expansion": "^1.1.7" 569 | } 570 | }, 571 | "minimist": { 572 | "version": "1.2.6", 573 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 574 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 575 | }, 576 | "ms": { 577 | "version": "2.1.2", 578 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 579 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 580 | }, 581 | "normalize-path": { 582 | "version": "3.0.0", 583 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 584 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 585 | }, 586 | "once": { 587 | "version": "1.4.0", 588 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 589 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 590 | "requires": { 591 | "wrappy": "1" 592 | } 593 | }, 594 | "p-limit": { 595 | "version": "2.3.0", 596 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 597 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 598 | "requires": { 599 | "p-try": "^2.0.0" 600 | } 601 | }, 602 | "p-locate": { 603 | "version": "3.0.0", 604 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 605 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 606 | "requires": { 607 | "p-limit": "^2.0.0" 608 | } 609 | }, 610 | "p-try": { 611 | "version": "2.2.0", 612 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 613 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 614 | }, 615 | "parse-entities": { 616 | "version": "2.0.0", 617 | "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", 618 | "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", 619 | "requires": { 620 | "character-entities": "^1.0.0", 621 | "character-entities-legacy": "^1.0.0", 622 | "character-reference-invalid": "^1.0.0", 623 | "is-alphanumerical": "^1.0.0", 624 | "is-decimal": "^1.0.0", 625 | "is-hexadecimal": "^1.0.0" 626 | } 627 | }, 628 | "parse-json": { 629 | "version": "5.2.0", 630 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 631 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 632 | "requires": { 633 | "@babel/code-frame": "^7.0.0", 634 | "error-ex": "^1.3.1", 635 | "json-parse-even-better-errors": "^2.3.0", 636 | "lines-and-columns": "^1.1.6" 637 | } 638 | }, 639 | "path-exists": { 640 | "version": "3.0.0", 641 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 642 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 643 | }, 644 | "path-is-absolute": { 645 | "version": "1.0.1", 646 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 647 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 648 | }, 649 | "picomatch": { 650 | "version": "2.2.3", 651 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", 652 | "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" 653 | }, 654 | "readable-stream": { 655 | "version": "3.6.0", 656 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 657 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 658 | "requires": { 659 | "inherits": "^2.0.3", 660 | "string_decoder": "^1.1.1", 661 | "util-deprecate": "^1.0.1" 662 | } 663 | }, 664 | "readdirp": { 665 | "version": "3.5.0", 666 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 667 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 668 | "requires": { 669 | "picomatch": "^2.2.1" 670 | } 671 | }, 672 | "remark": { 673 | "version": "13.0.0", 674 | "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", 675 | "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", 676 | "requires": { 677 | "remark-parse": "^9.0.0", 678 | "remark-stringify": "^9.0.0", 679 | "unified": "^9.1.0" 680 | } 681 | }, 682 | "remark-cli": { 683 | "version": "9.0.0", 684 | "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-9.0.0.tgz", 685 | "integrity": "sha512-y6kCXdwZoMoh0Wo4Och1tDW50PmMc86gW6GpF08v9d+xUCEJE2wwXdQ+TnTaUamRnfFdU+fE+eNf2PJ53cyq8g==", 686 | "requires": { 687 | "markdown-extensions": "^1.1.0", 688 | "remark": "^13.0.0", 689 | "unified-args": "^8.0.0" 690 | } 691 | }, 692 | "remark-parse": { 693 | "version": "9.0.0", 694 | "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", 695 | "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", 696 | "requires": { 697 | "mdast-util-from-markdown": "^0.8.0" 698 | } 699 | }, 700 | "remark-stringify": { 701 | "version": "9.0.1", 702 | "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", 703 | "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", 704 | "requires": { 705 | "mdast-util-to-markdown": "^0.6.0" 706 | } 707 | }, 708 | "repeat-string": { 709 | "version": "1.6.1", 710 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 711 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 712 | }, 713 | "resolve-from": { 714 | "version": "5.0.0", 715 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 716 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" 717 | }, 718 | "safe-buffer": { 719 | "version": "5.2.1", 720 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 721 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 722 | }, 723 | "sprintf-js": { 724 | "version": "1.0.3", 725 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 726 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 727 | }, 728 | "string-width": { 729 | "version": "4.2.2", 730 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 731 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 732 | "requires": { 733 | "emoji-regex": "^8.0.0", 734 | "is-fullwidth-code-point": "^3.0.0", 735 | "strip-ansi": "^6.0.0" 736 | } 737 | }, 738 | "string_decoder": { 739 | "version": "1.3.0", 740 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 741 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 742 | "requires": { 743 | "safe-buffer": "~5.2.0" 744 | } 745 | }, 746 | "strip-ansi": { 747 | "version": "6.0.0", 748 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 749 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 750 | "requires": { 751 | "ansi-regex": "^5.0.0" 752 | } 753 | }, 754 | "supports-color": { 755 | "version": "7.2.0", 756 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 757 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 758 | "requires": { 759 | "has-flag": "^4.0.0" 760 | } 761 | }, 762 | "text-table": { 763 | "version": "0.2.0", 764 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 765 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" 766 | }, 767 | "to-regex-range": { 768 | "version": "5.0.1", 769 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 770 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 771 | "requires": { 772 | "is-number": "^7.0.0" 773 | } 774 | }, 775 | "to-vfile": { 776 | "version": "6.1.0", 777 | "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-6.1.0.tgz", 778 | "integrity": "sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==", 779 | "requires": { 780 | "is-buffer": "^2.0.0", 781 | "vfile": "^4.0.0" 782 | } 783 | }, 784 | "trough": { 785 | "version": "1.0.5", 786 | "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", 787 | "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" 788 | }, 789 | "typedarray": { 790 | "version": "0.0.6", 791 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 792 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 793 | }, 794 | "typograf": { 795 | "version": "6.11.3", 796 | "resolved": "https://registry.npmjs.org/typograf/-/typograf-6.11.3.tgz", 797 | "integrity": "sha512-aj+FLX8mc9BaWHQeSB1dk7Om7Ag4dGx+rl5jpO6QdpMUKcwqffhFjGAki/SAzsjbUZKUGHXJgaYUcUD6z3eSJg==" 798 | }, 799 | "unified": { 800 | "version": "9.2.1", 801 | "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", 802 | "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", 803 | "requires": { 804 | "bail": "^1.0.0", 805 | "extend": "^3.0.0", 806 | "is-buffer": "^2.0.0", 807 | "is-plain-obj": "^2.0.0", 808 | "trough": "^1.0.0", 809 | "vfile": "^4.0.0" 810 | } 811 | }, 812 | "unified-args": { 813 | "version": "8.1.0", 814 | "resolved": "https://registry.npmjs.org/unified-args/-/unified-args-8.1.0.tgz", 815 | "integrity": "sha512-t1HPS1cQPsVvt/6EtyWIbQGurza5684WGRigNghZRvzIdHm3LPgMdXPyGx0npORKzdiy5+urkF0rF5SXM8lBuQ==", 816 | "requires": { 817 | "camelcase": "^5.0.0", 818 | "chalk": "^3.0.0", 819 | "chokidar": "^3.0.0", 820 | "fault": "^1.0.2", 821 | "json5": "^2.0.0", 822 | "minimist": "^1.2.0", 823 | "text-table": "^0.2.0", 824 | "unified-engine": "^8.0.0" 825 | } 826 | }, 827 | "unified-engine": { 828 | "version": "8.1.0", 829 | "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-8.1.0.tgz", 830 | "integrity": "sha512-ptXTWUf9HZ2L9xto7tre+hSdSN7M9S0rypUpMAcFhiDYjrXLrND4If+8AZOtPFySKI/Zhfxf7GVAR34BqixDUA==", 831 | "requires": { 832 | "concat-stream": "^2.0.0", 833 | "debug": "^4.0.0", 834 | "fault": "^1.0.0", 835 | "figures": "^3.0.0", 836 | "glob": "^7.0.3", 837 | "ignore": "^5.0.0", 838 | "is-buffer": "^2.0.0", 839 | "is-empty": "^1.0.0", 840 | "is-plain-obj": "^2.0.0", 841 | "js-yaml": "^3.6.1", 842 | "load-plugin": "^3.0.0", 843 | "parse-json": "^5.0.0", 844 | "to-vfile": "^6.0.0", 845 | "trough": "^1.0.0", 846 | "unist-util-inspect": "^5.0.0", 847 | "vfile-reporter": "^6.0.0", 848 | "vfile-statistics": "^1.1.0" 849 | } 850 | }, 851 | "unist-util-inspect": { 852 | "version": "5.0.1", 853 | "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-5.0.1.tgz", 854 | "integrity": "sha512-fPNWewS593JSmg49HbnE86BJKuBi1/nMWhDSccBvbARfxezEuJV85EaARR9/VplveiwCoLm2kWq+DhP8TBaDpw==", 855 | "requires": { 856 | "is-empty": "^1.0.0" 857 | } 858 | }, 859 | "unist-util-is": { 860 | "version": "4.0.2", 861 | "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", 862 | "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" 863 | }, 864 | "unist-util-stringify-position": { 865 | "version": "2.0.3", 866 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", 867 | "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", 868 | "requires": { 869 | "@types/unist": "^2.0.2" 870 | } 871 | }, 872 | "unist-util-visit": { 873 | "version": "2.0.3", 874 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", 875 | "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", 876 | "requires": { 877 | "@types/unist": "^2.0.0", 878 | "unist-util-is": "^4.0.0", 879 | "unist-util-visit-parents": "^3.0.0" 880 | } 881 | }, 882 | "unist-util-visit-parents": { 883 | "version": "3.1.0", 884 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", 885 | "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", 886 | "requires": { 887 | "@types/unist": "^2.0.0", 888 | "unist-util-is": "^4.0.0" 889 | } 890 | }, 891 | "util-deprecate": { 892 | "version": "1.0.2", 893 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 894 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 895 | }, 896 | "vfile": { 897 | "version": "4.2.1", 898 | "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", 899 | "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", 900 | "requires": { 901 | "@types/unist": "^2.0.0", 902 | "is-buffer": "^2.0.0", 903 | "unist-util-stringify-position": "^2.0.0", 904 | "vfile-message": "^2.0.0" 905 | } 906 | }, 907 | "vfile-message": { 908 | "version": "2.0.4", 909 | "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", 910 | "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", 911 | "requires": { 912 | "@types/unist": "^2.0.0", 913 | "unist-util-stringify-position": "^2.0.0" 914 | } 915 | }, 916 | "vfile-reporter": { 917 | "version": "6.0.2", 918 | "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz", 919 | "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==", 920 | "requires": { 921 | "repeat-string": "^1.5.0", 922 | "string-width": "^4.0.0", 923 | "supports-color": "^6.0.0", 924 | "unist-util-stringify-position": "^2.0.0", 925 | "vfile-sort": "^2.1.2", 926 | "vfile-statistics": "^1.1.0" 927 | }, 928 | "dependencies": { 929 | "has-flag": { 930 | "version": "3.0.0", 931 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 932 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 933 | }, 934 | "supports-color": { 935 | "version": "6.1.0", 936 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 937 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 938 | "requires": { 939 | "has-flag": "^3.0.0" 940 | } 941 | } 942 | } 943 | }, 944 | "vfile-sort": { 945 | "version": "2.2.2", 946 | "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.2.tgz", 947 | "integrity": "sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA==" 948 | }, 949 | "vfile-statistics": { 950 | "version": "1.1.4", 951 | "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.4.tgz", 952 | "integrity": "sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA==" 953 | }, 954 | "wrappy": { 955 | "version": "1.0.2", 956 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 957 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 958 | }, 959 | "zwitch": { 960 | "version": "1.0.5", 961 | "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", 962 | "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" 963 | } 964 | } 965 | } 966 | -------------------------------------------------------------------------------- /examples/simple/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remark-typograf-simple-expample", 3 | "private": true, 4 | "license": "MIT", 5 | "dependencies": { 6 | "@mavrin/remark-typograf": "^2.1.6", 7 | "remark": "^13.0.0", 8 | "remark-cli": "^9.0.0", 9 | "typograf": "^6.11.3" 10 | }, 11 | "remarkConfig": { 12 | "plugins": [ 13 | [ 14 | "@mavrin/remark-typograf", 15 | { 16 | "locale": [ 17 | "ru" 18 | ] 19 | } 20 | ] 21 | ] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { remarkTypograf } = require("./remark-typograf"); 2 | 3 | module.exports = remarkTypograf; 4 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testEnvironment: "node", 3 | testRunner: "jest-circus/runner", 4 | }; 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mavrin/remark-typograf", 3 | "version": "2.1.6", 4 | "description": "Plugin for remark to make your typography better with typograf", 5 | "main": "index.js", 6 | "files": [ 7 | "index.js", 8 | "remark-typograf.js" 9 | ], 10 | "scripts": { 11 | "test": "jest", 12 | "lint": "eslint .", 13 | "generate:site": "node ./scripts/generate.js", 14 | "publish:site": "npm run generate:site && node ./scripts/publishSite.js" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/Mavrin/remark-typograf.git" 19 | }, 20 | "keywords": [ 21 | "unified", 22 | "remark", 23 | "remark-plugin", 24 | "plugin", 25 | "mdast", 26 | "markdown", 27 | "typograf", 28 | "text", 29 | "typography", 30 | "typographic" 31 | ], 32 | "author": "Konstantin Krivlenia ", 33 | "license": "MIT", 34 | "bugs": { 35 | "url": "https://github.com/Mavrin/remark-typograf/issues" 36 | }, 37 | "homepage": "https://github.com/Mavrin/remark-typograf#readme", 38 | "dependencies": { 39 | "lodash.escaperegexp": "^4.1.2", 40 | "typograf": "^6.11.3", 41 | "unist-util-visit": "^2.0.3" 42 | }, 43 | "devDependencies": { 44 | "eslint": "^7.24.0", 45 | "eslint-plugin-jest": "^24.3.4", 46 | "gh-pages": "^5.0.0", 47 | "husky": "^6.0.0", 48 | "jest": "^26.6.3", 49 | "jest-circus": "^26.6.3", 50 | "prettier": "^2.2.1", 51 | "pretty-quick": "^3.1.0", 52 | "remark": "13.0.0", 53 | "remark-gfm": "1.0.0", 54 | "remark-html": "^13.0.1", 55 | "remark-parse": "^9.0.0", 56 | "remark-stringify": "^9.0.1", 57 | "unified": "^9.2.1" 58 | }, 59 | "husky": { 60 | "hooks": { 61 | "pre-commit": "pretty-quick --staged" 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /remark-typograf.js: -------------------------------------------------------------------------------- 1 | const visit = require("unist-util-visit"); 2 | const Typograf = require("typograf"); 3 | const escapeRegexp = require("lodash.escaperegexp"); 4 | 5 | function remarkTypograf(config = {}) { 6 | let { typograf, builtIn = true, keywords = [], ...typografConfig } = config; 7 | 8 | if (!typograf && builtIn === false) { 9 | throw new Error( 10 | "Typograf option should be specified. Please pass instance typograf as option or set builtIn to true" 11 | ); 12 | } 13 | 14 | if (typograf && builtIn === true) { 15 | throw new Error( 16 | "`builtIn` option is true and `typograf` also is passed. Please set `builtIn` to false or clean `typograf` option" 17 | ); 18 | } 19 | 20 | if ( 21 | builtIn === true && 22 | typografConfig.locale && 23 | !Array.isArray(typografConfig.locale) 24 | ) { 25 | throw new Error( 26 | `Locale config should be array of string. e.g. {"locale": ["ru"]}` 27 | ); 28 | } 29 | 30 | if ( 31 | builtIn === true && 32 | !Array.isArray(typografConfig && typografConfig.locale) 33 | ) { 34 | typografConfig.locale = ["ru"]; 35 | } 36 | 37 | if (!typograf) { 38 | typograf = new Typograf(typografConfig); 39 | } 40 | 41 | function getTextNodes(tree) { 42 | const textNodes = []; 43 | if (tree.type === "inlineCode") { 44 | textNodes.push("`" + tree.value + "`"); 45 | return textNodes; 46 | } 47 | if (typeof tree.value === "string") { 48 | textNodes.push(tree.value); 49 | return textNodes; 50 | } 51 | visit(tree, "inlineCode", (node) => { 52 | textNodes.push("`" + node.value + "`"); 53 | }); 54 | visit(tree, "text", (node) => { 55 | textNodes.push(node.value); 56 | }); 57 | return textNodes; 58 | } 59 | 60 | function getLeftSiblingText(index, children) { 61 | const textNodes = getTextNodes(children[index - 1]); 62 | return typograf.execute(textNodes.pop() || ""); 63 | } 64 | 65 | function getRightSiblingText(index, children) { 66 | const textNodes = getTextNodes(children[index + 1]); 67 | return typograf.execute(textNodes.shift() || ""); 68 | } 69 | 70 | function applyTypograf(text, index, parent) { 71 | if (index === 0 && parent.children.length > 1) { 72 | const rightText = getRightSiblingText(index, parent.children); 73 | const typografedText = typograf.execute(text + rightText); 74 | return typografedText.substring( 75 | 0, 76 | typografedText.length - rightText.length 77 | ); 78 | } 79 | if (index === parent.children.length - 1 && parent.children.length > 1) { 80 | const leftText = getLeftSiblingText(index, parent.children); 81 | const typografedText = typograf.execute(leftText + text); 82 | return typografedText.substring( 83 | leftText.length, 84 | typografedText.length + leftText.length 85 | ); 86 | } 87 | if (parent.children.length > 1) { 88 | const leftText = getLeftSiblingText(index, parent.children); 89 | const rightText = getRightSiblingText(index, parent.children); 90 | const typografedText = typograf.execute(leftText + text + rightText); 91 | return typografedText.substring( 92 | leftText.length, 93 | typografedText.length - rightText.length 94 | ); 95 | } 96 | return typograf.execute(text); 97 | } 98 | 99 | function visitor(node, index, parent) { 100 | let text = node.value; 101 | 102 | keywords.forEach((keyword) => { 103 | const hex = Buffer.from(keyword).toString("hex"); 104 | const regExp = new RegExp(`${escapeRegexp(keyword)}`, `g`); 105 | text = text.replace(regExp, hex); 106 | }); 107 | 108 | text = applyTypograf(text, index, parent); 109 | 110 | keywords.forEach((keyword) => { 111 | const hex = Buffer.from(keyword).toString("hex"); 112 | const regExp = new RegExp(`${escapeRegexp(hex)}`, `g`); 113 | text = text.replace(regExp, keyword); 114 | }); 115 | 116 | node.value = text; 117 | } 118 | 119 | function transform(tree) { 120 | visit(tree, "text", visitor); 121 | } 122 | 123 | return transform; 124 | } 125 | 126 | module.exports = { 127 | remarkTypograf, 128 | }; 129 | -------------------------------------------------------------------------------- /remark-typograf.test.js: -------------------------------------------------------------------------------- 1 | const { describe, it, expect } = require("@jest/globals"); 2 | const remarkTypograf = require("./index"); 3 | const Typograf = require("typograf"); 4 | const remark = require("remark"); 5 | const gfm = require("remark-gfm"); 6 | 7 | function getRemark() { 8 | return remark().data(`settings`, { bullet: `-`, emphasis: `_` }); 9 | } 10 | 11 | describe("remarkjs typograf", () => { 12 | it("should throw error if typofraf is not specified", () => { 13 | expect(() => remarkTypograf({ builtIn: false })).toThrow(/Typograf/); 14 | }); 15 | 16 | it("should throw error if typofraf is specified and builtIn true", () => { 17 | expect(() => 18 | remarkTypograf({ 19 | typograf: new Typograf({ locale: ["en-US"] }), 20 | builtIn: true, 21 | }) 22 | ).toThrow(/`builtIn` option is true and `typograf` also is passed/); 23 | }); 24 | 25 | it("should throw error if locale is not array", () => { 26 | expect(() => remarkTypograf({ locale: "en" })).toThrow( 27 | /Locale config should be array of string/ 28 | ); 29 | }); 30 | 31 | it("Should work with explicit typograf", () => { 32 | expect( 33 | getRemark() 34 | .use(remarkTypograf, { 35 | typograf: new Typograf({ locale: ["en-US"] }), 36 | builtIn: false, 37 | }) 38 | .processSync("## spread operator... end . Some test.\n") 39 | .toString() 40 | ).toEqual("## spread operator… end. Some test.\n"); 41 | }); 42 | 43 | it("Should apply with default config", () => { 44 | expect( 45 | getRemark() 46 | .use(remarkTypograf) 47 | .processSync("## spread operator... end . Some test.\n") 48 | .toString() 49 | ).toEqual("## spread operator… end. Some test.\n"); 50 | }); 51 | 52 | it("Should apply", () => { 53 | expect( 54 | getRemark() 55 | .use(remarkTypograf, { locale: ["en-US"] }) 56 | .processSync("## spread operator... end . Some test.\n") 57 | .toString() 58 | ).toEqual("## spread operator… end. Some test.\n"); 59 | }); 60 | 61 | it("should apply keywords config", () => { 62 | const result = getRemark() 63 | .use(gfm) 64 | .use(remarkTypograf, { 65 | keywords: [":(", "TL;DR"], 66 | }) 67 | .processSync(`## 1. Это сложно :(.\nSome test. :( "TL;DR" operator... :(`) 68 | .toString(); 69 | expect(result).toEqual( 70 | "## 1. Это сложно :(.\n\nSome test. :( «TL;DR» operator… :(\n" 71 | ); 72 | }); 73 | 74 | it("Should apply default locale", () => { 75 | expect( 76 | getRemark() 77 | .use(remarkTypograf, {}) 78 | .processSync("## spread operator... end . Some test.\n") 79 | .toString() 80 | ).toEqual("## spread operator… end. Some test.\n"); 81 | }); 82 | 83 | it("Should handle for code block", () => { 84 | const result = getRemark() 85 | .use(remarkTypograf, { locale: ["ru"] }) 86 | .processSync( 87 | "value - some code...\n```js\nconst value = [...[1,3]];\n```" 88 | ) 89 | .toString(); 90 | expect(result).toEqual( 91 | "value — some code…\n\n```js\nconst value = [...[1,3]];\n```\n" 92 | ); 93 | }); 94 | 95 | it("Should handle for backtick", () => { 96 | const result = getRemark() 97 | .use(remarkTypograf, { locale: ["ru"] }) 98 | .processSync("some... `:tick tick...` some... test `.test` test .") 99 | .toString(); 100 | expect(result).toEqual("some… `:tick tick...` some… test `.test` test.\n"); 101 | }); 102 | 103 | it("Should handle list", () => { 104 | const result = getRemark() 105 | .use(remarkTypograf, { locale: ["ru"] }) 106 | .processSync("# header\n - one point...\n - second point\n") 107 | .toString(); 108 | expect(result).toEqual("# header\n\n- one point…\n- second point\n"); 109 | }); 110 | 111 | it("Should handle inline block type", () => { 112 | const result = getRemark() 113 | .use(gfm) 114 | .use(remarkTypograf, { locale: ["ru"] }) 115 | .processSync( 116 | "_Italic..._ some... **bold...** **bold** . New code [link...](https://github.com) sentence , ~~во внимание~~\n" 117 | ) 118 | .toString(); 119 | expect(result).toEqual( 120 | "_Italic…_ some… **bold…** **bold**. New code [link…](https://github.com) sentence, ~~во внимание~~\n" 121 | ); 122 | }); 123 | 124 | it("Should not trim space after comma if next word is inline code link", () => { 125 | const result = getRemark() 126 | .use(remarkTypograf, { locale: ["ru"] }) 127 | .processSync( 128 | "Привет, [как]()дела. Привет, [`как`]()дела. Привет, [_как_]()дела.\n" 129 | ) 130 | .toString(); 131 | expect(result).toEqual( 132 | "Привет, [как]()дела. Привет, [`как`]()дела. Привет, [_как_]()дела.\n" 133 | ); 134 | }) 135 | 136 | it("Should mark and punctuation", () => { 137 | const result = getRemark() 138 | .use(remarkTypograf, { locale: ["ru"] }) 139 | .processSync( 140 | "проверить секцию **Categories,** а у родительского тега. Далее — история создания онлайн-инструмента **[Can I Include](https://caninclude.glitch.me/).**\n" 141 | ) 142 | .toString(); 143 | expect(result).toEqual( 144 | "проверить секцию **Categories,** а у родительского тега. Далее — история создания онлайн-инструмента **[Can I Include](https://caninclude.glitch.me/).**\n" 145 | ); 146 | }); 147 | 148 | it("Should handle bullet list", () => { 149 | const result = getRemark() 150 | .use(remarkTypograf, { locale: ["ru"] }) 151 | .processSync("list:\n- one item\n- В простом случае,\n- two item") 152 | .toString(); 153 | expect(result).toEqual( 154 | "list:\n\n- one item\n- В простом случае,\n- two item\n" 155 | ); 156 | }); 157 | }); 158 | -------------------------------------------------------------------------------- /scripts/before.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Принять во внимание воздействие фактора" 3 | tags: 4 | - почво 5 | - ведение 6 | false: true 7 | --- 8 | 9 | # Принять во внимание воздействие фактора 10 | 11 | В связи с этим нужно подчеркнуть, что [липкость](https://yandex.ru/referats/) возникает агробиогеоценоз. Коллембола нагревает желтозём одинаково по всем направлениям. Поверхность раздела фаз притягивает гумус. 12 | 13 | ```html 14 | 28 | ``` 29 | 30 | В условиях очагового земледелия аллювий — разрушаем. В первом приближении функция влагопроводности нейтрализует ``. 31 | 32 | .topics__item { 33 | display: block; 34 | margin-top: 14px 35 | } 36 | 37 | Реология, как того требуют законы термодинамики, едва ли квантуема. В ходе валового анализа аржиллана инструментально обнаружима. 38 | 39 | Цветность растворяет фраджипэн: 40 | 41 | - Уровень грунтовых вод 42 | - Массоперенос 43 | - Их охлаждает 44 | - Горизонт 45 | - Вызывает аллювий 46 | 47 | Гуминовая кислота пространственно притягивает многофазный суглинок. В первом приближении обеднение окисляет гумин. 48 | -------------------------------------------------------------------------------- /scripts/generate.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const fs = require("fs"); 3 | const remark = require("remark"); 4 | const unified = require("unified"); 5 | const markdown = require("remark-parse"); 6 | const Typograf = require("typograf"); 7 | const remarkStringify = require("remark-stringify"); 8 | const remarkHtml = require("remark-html"); 9 | const remarkjsTypograf = require("../index"); 10 | 11 | const deleteFolderRecursive = function (folderPath) { 12 | if (fs.existsSync(folderPath)) { 13 | fs.readdirSync(folderPath).forEach((file) => { 14 | const curPath = path.join(folderPath, file); 15 | if (fs.lstatSync(curPath).isDirectory()) { 16 | // recurse 17 | deleteFolderRecursive(curPath); 18 | } else { 19 | // delete file 20 | fs.unlinkSync(curPath); 21 | } 22 | }); 23 | fs.rmdirSync(folderPath); 24 | } 25 | }; 26 | 27 | const distPath = path.resolve(__dirname, "../dist"); 28 | const originalMarkdown = fs.readFileSync( 29 | path.resolve(__dirname, "./before.md"), 30 | "utf8" 31 | ); 32 | 33 | const markdownResultWithTypograf = unified() 34 | .use(markdown, { commonmark: true }) 35 | .use(remarkjsTypograf, { 36 | typograf: new Typograf({ locale: ["ru"] }), 37 | builtIn: false, 38 | }) 39 | .use(remarkStringify, { 40 | gfm: true, 41 | listItemIndent: "1", 42 | rule: "-", 43 | ruleSpaces: false, 44 | }) 45 | .processSync(originalMarkdown).toString(); 46 | 47 | const htmlResultWithTypograf = remark() 48 | .use(remarkjsTypograf, { 49 | typograf: new Typograf({ locale: ["ru"] }), 50 | builtIn: false, 51 | }) 52 | .use(remarkHtml) 53 | .processSync(originalMarkdown); 54 | 55 | const htmlResultWithoutTypograf = remark() 56 | .use(remarkHtml) 57 | .processSync(originalMarkdown); 58 | 59 | deleteFolderRecursive(distPath); 60 | fs.mkdirSync(distPath); 61 | fs.writeFileSync( 62 | path.resolve(path.join(distPath, "before.md")), 63 | originalMarkdown, 64 | "utf8" 65 | ); 66 | 67 | fs.writeFileSync( 68 | path.resolve(path.join(distPath, "after.md")), 69 | markdownResultWithTypograf, 70 | "utf8" 71 | ); 72 | 73 | const html = ` 74 | 75 | 76 | remark-typograf plugin example 77 | 78 | 84 | 85 | 86 |
87 | Source code on github 88 |
89 |
90 |

Before (markdown source):

91 |
${htmlResultWithoutTypograf}
92 |
93 |
94 |

After (markdown source):

95 |
${htmlResultWithTypograf}
96 |
97 | 98 | 99 | `; 100 | 101 | fs.writeFileSync( 102 | path.resolve(path.join(distPath, "index.html")), 103 | html.trim(), 104 | "utf8" 105 | ); 106 | -------------------------------------------------------------------------------- /scripts/publishSite.js: -------------------------------------------------------------------------------- 1 | const ghpages = require("gh-pages"); 2 | const { resolve } = require("path"); 3 | const resolvePath = (relativePath) => resolve(__dirname, relativePath); 4 | 5 | const build = resolvePath("../dist"); 6 | 7 | async function publish() { 8 | return new Promise((resolve, reject) => { 9 | ghpages.publish( 10 | build, 11 | { 12 | branch: "gh-pages", 13 | }, 14 | function (err) { 15 | if (err) { 16 | reject(err); 17 | } else { 18 | resolve(); 19 | } 20 | } 21 | ); 22 | }); 23 | } 24 | 25 | publish() 26 | .then(() => console.log("publish to gh-pages branch success")) 27 | .catch((err) => { 28 | console.log("could not publish to gh-pages branch", err); 29 | }); 30 | --------------------------------------------------------------------------------