From 014fca79e0be563ca9a65044b7a93ca165bd3a9a Mon Sep 17 00:00:00 2001 From: Titus Date: Fri, 3 Dec 2021 10:06:36 +0100 Subject: [PATCH] Add improved docs Closes GH-276. --- .remarkrc.js | 2 +- doc/comparison-to-markdownlint.md | 6 +- doc/create-a-custom-rule.md | 104 +- doc/rules.md | 150 +-- logo.svg | 17 +- .../index.js | 48 +- .../readme.md | 208 ++-- .../index.js | 48 +- .../readme.md | 227 +++-- .../index.js | 39 +- .../readme.md | 210 ++-- .../remark-lint-code-block-style/index.js | 65 +- .../remark-lint-code-block-style/readme.md | 221 ++-- packages/remark-lint-definition-case/index.js | 23 +- .../remark-lint-definition-case/readme.md | 173 +++- .../remark-lint-definition-spacing/index.js | 25 +- .../remark-lint-definition-spacing/readme.md | 179 +++- packages/remark-lint-emphasis-marker/index.js | 51 +- .../remark-lint-emphasis-marker/readme.md | 212 ++-- .../remark-lint-fenced-code-flag/index.js | 39 +- .../remark-lint-fenced-code-flag/readme.md | 198 ++-- .../remark-lint-fenced-code-marker/index.js | 45 +- .../remark-lint-fenced-code-marker/readme.md | 206 ++-- packages/remark-lint-file-extension/index.js | 33 +- packages/remark-lint-file-extension/readme.md | 185 ++-- .../remark-lint-final-definition/index.js | 24 +- .../remark-lint-final-definition/readme.md | 188 ++-- packages/remark-lint-final-newline/index.js | 72 +- packages/remark-lint-final-newline/readme.md | 194 ++-- .../remark-lint-first-heading-level/index.js | 28 +- .../remark-lint-first-heading-level/readme.md | 192 ++-- .../remark-lint-hard-break-spaces/index.js | 23 +- .../remark-lint-hard-break-spaces/readme.md | 183 +++- .../remark-lint-heading-increment/index.js | 27 +- .../remark-lint-heading-increment/readme.md | 183 +++- packages/remark-lint-heading-style/index.js | 82 +- packages/remark-lint-heading-style/readme.md | 237 +++-- packages/remark-lint-linebreak-style/index.js | 42 +- .../remark-lint-linebreak-style/readme.md | 213 ++-- .../remark-lint-link-title-style/index.js | 53 +- .../remark-lint-link-title-style/readme.md | 214 ++-- .../index.js | 43 +- .../readme.md | 206 ++-- .../index.js | 34 +- .../readme.md | 194 ++-- .../remark-lint-list-item-indent/index.js | 77 +- .../remark-lint-list-item-indent/readme.md | 246 +++-- .../remark-lint-list-item-spacing/index.js | 52 +- .../remark-lint-list-item-spacing/readme.md | 212 ++-- .../index.js | 32 +- .../readme.md | 184 +++- .../remark-lint-maximum-line-length/index.js | 35 +- .../remark-lint-maximum-line-length/readme.md | 205 ++-- .../index.js | 1 + .../readme.md | 53 +- .../index.js | 32 +- .../readme.md | 197 ++-- .../index.js | 35 +- .../readme.md | 200 ++-- .../index.js | 20 +- .../readme.md | 174 +++- .../index.js | 19 +- .../readme.md | 173 +++- .../index.js | 23 +- .../readme.md | 189 ++-- .../index.js | 26 +- .../readme.md | 188 ++-- .../index.js | 24 +- .../readme.md | 186 ++-- packages/remark-lint-no-empty-url/index.js | 21 +- packages/remark-lint-no-empty-url/readme.md | 177 +++- .../index.js | 16 +- .../readme.md | 179 ++-- .../index.js | 16 +- .../readme.md | 149 ++- .../index.js | 28 +- .../readme.md | 187 ++-- .../index.js | 16 +- .../readme.md | 159 ++- .../index.js | 16 +- .../readme.md | 159 ++- .../index.js | 33 +- .../readme.md | 200 ++-- .../remark-lint-no-heading-indent/index.js | 43 +- .../remark-lint-no-heading-indent/readme.md | 210 ++-- .../index.js | 17 +- .../readme.md | 170 +++- .../index.js | 26 +- .../readme.md | 185 ++-- packages/remark-lint-no-html/index.js | 17 +- packages/remark-lint-no-html/readme.md | 167 +++- .../remark-lint-no-inline-padding/index.js | 21 +- .../remark-lint-no-inline-padding/readme.md | 168 +++- packages/remark-lint-no-literal-urls/index.js | 37 +- .../remark-lint-no-literal-urls/readme.md | 188 ++-- .../index.js | 42 +- .../readme.md | 205 ++-- .../index.js | 26 +- .../readme.md | 188 ++-- .../index.js | 21 +- .../readme.md | 189 ++-- .../index.js | 24 +- .../readme.md | 178 +++- .../remark-lint-no-shell-dollars/index.js | 26 +- .../remark-lint-no-shell-dollars/readme.md | 188 ++-- .../index.js | 30 +- .../readme.md | 184 ++-- .../index.js | 30 +- .../readme.md | 184 ++-- .../remark-lint-no-table-indentation/index.js | 34 +- .../readme.md | 209 ++-- packages/remark-lint-no-tabs/index.js | 62 +- packages/remark-lint-no-tabs/readme.md | 229 +++-- .../index.js | 49 +- .../readme.md | 209 ++-- .../index.js | 26 +- .../readme.md | 190 ++-- .../index.js | 26 +- .../readme.md | 190 ++-- .../index.js | 19 +- .../readme.md | 173 +++- .../index.js | 42 +- .../readme.md | 203 ++-- .../index.js | 56 +- .../readme.md | 217 ++-- packages/remark-lint-rule-style/index.js | 58 +- packages/remark-lint-rule-style/readme.md | 219 ++-- .../remark-lint-strikethrough-marker/index.js | 43 +- .../readme.md | 218 ++-- packages/remark-lint-strong-marker/index.js | 51 +- packages/remark-lint-strong-marker/readme.md | 212 ++-- .../remark-lint-table-cell-padding/index.js | 47 +- .../remark-lint-table-cell-padding/readme.md | 228 +++-- .../remark-lint-table-pipe-alignment/index.js | 54 +- .../readme.md | 215 ++-- packages/remark-lint-table-pipes/index.js | 35 +- packages/remark-lint-table-pipes/readme.md | 206 ++-- .../index.js | 50 +- .../readme.md | 211 ++-- packages/remark-lint/readme.md | 129 ++- .../remark-preset-lint-consistent/index.js | 9 +- .../remark-preset-lint-consistent/readme.md | 128 ++- .../index.js | 233 ++--- .../readme.md | 164 ++- .../remark-preset-lint-recommended/index.js | 9 +- .../remark-preset-lint-recommended/readme.md | 128 ++- packages/unified-lint-rule/readme.md | 99 +- readme.md | 776 ++++++++------ screenshot.png | Bin 224944 -> 462856 bytes script/build-presets.js | 295 +++++- script/build-rules.js | 945 +++++++++++------- script/plugin/list-of-rules.js | 3 +- script/util/rule.js | 18 +- 153 files changed, 12585 insertions(+), 5981 deletions(-) diff --git a/.remarkrc.js b/.remarkrc.js index 3eed5fff..f1635aac 100644 --- a/.remarkrc.js +++ b/.remarkrc.js @@ -11,7 +11,7 @@ import listOfRules from './script/plugin/list-of-rules.js' const plugins = [ remarkPresetLintRecommended, remarkPresetLintConsistent, - [remarkToc, {tight: true, maxDepth: 2, heading: 'contents'}], + [remarkToc, {tight: true, maxDepth: 3, heading: 'contents'}], remarkCommentConfig, [remarkGfm, {tablePipeAlign: false}], remarkGithub, diff --git a/doc/comparison-to-markdownlint.md b/doc/comparison-to-markdownlint.md index 457a2599..684a9124 100644 --- a/doc/comparison-to-markdownlint.md +++ b/doc/comparison-to-markdownlint.md @@ -1,7 +1,9 @@ -# [markdownlint](https://github.com/mivok/markdownlint) +# [markdownlint](https://github.com/markdownlint/markdownlint) + +> ⚠️ **Important**: this comparison hasn’t been updated in years. This table documents the similarity and difference between -[**markdownlint**](https://github.com/mivok/markdownlint/blob/HEAD/docs/RULES.md) +[**markdownlint**](https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md) rules and **remark-lint**’s rules. | markdownlint | remark | note | diff --git a/doc/create-a-custom-rule.md b/doc/create-a-custom-rule.md index 5d4d0f38..63f9bc8a 100644 --- a/doc/create-a-custom-rule.md +++ b/doc/create-a-custom-rule.md @@ -1,6 +1,7 @@ # Create a custom `remark-lint` rule -This guide is part of [a step-by-step tutorial](https://dev.to/floroz/how-to-create-a-custom-lint-rule-for-markdown-and-mdx-using-remark-and-eslint-2jim), and will help you getting started to create your first linting plugin for `remark`. +This guide is part of [a step-by-step tutorial][tutorial], and will help you +getting started to create your first linting plugin for `remark`. ## Contents @@ -31,8 +32,10 @@ Now we can start installing our dependencies: npm install remark-lint remark-cli ``` -* [`remark-lint`](https://github.com/remarkjs/remark-lint): Core lint plugin -* [`remark-cli`](https://github.com/remarkjs/remark/tree/main/packages/remark-cli): Command-line interface +* [`remark-lint`][remark-lint] + — core lint plugin +* [`remark-cli`][remark-cli] + — command line interface We will also use some utilities: @@ -42,13 +45,12 @@ npm install unified-lint-rule unist-util-generated unist-util-visit These will help us creating and managing our custom rules. -[Back to Top](#contents) - ## Set up remark -With everything installed, we can now create a `.remarkrc.js` that will contain the plugins we’ll use. +With everything installed, we can now create a `.remarkrc.js` that will contain +the plugins we’ll use. -For more info on configuration, see [Configuring `remark-lint`](https://github.com/remarkjs/remark-lint#configuring-remark-lint). +For more info on configuration, see [Examples in `remark-lint`][examples]. ```sh touch .remarkrc.js @@ -61,7 +63,8 @@ module.exports = { } ``` -Then, in our `package.json`, add the following script to process all the markdown files in our project: +Then, in our `package.json`, add the following script to process all the +markdown files in our project: ```json "scripts": { @@ -87,7 +90,8 @@ Some funny images of our favorite pets ![a lovely dog](lovely-dog.png) ``` -At this point, we have a working `remark` configuration and a markdown file in the project. +At this point, we have a working `remark` configuration and a markdown file in +the project. If we run `npm run lint` we should expect to see in our terminal: @@ -95,14 +99,15 @@ If we run `npm run lint` we should expect to see in our terminal: doc.md: no issues found ``` -All good, the file has been processed, and because we haven’t specified any plugins nor lint rules, no issues are found. - -[Back to Top](#contents) +All good, the file has been processed, and because we haven’t specified any +plugins nor lint rules, no issues are found. ## The `no-invalid-gif` rule -Let’s imagine we want to write a rule that checks whether a `.gif` file is used as an image. -Given the content of our `doc.md` file declared above, we would expect an *error* or *warning* pointing to: +Let’s imagine we want to write a rule that checks whether a `.gif` file is used +as an image. +Given the content of our `doc.md` file declared above, we would expect an +*error* or *warning* pointing to: ```markdown ![a funny cat](funny-cat.gif) @@ -110,11 +115,10 @@ Given the content of our `doc.md` file declared above, we would expect an *error Because the file extension `.gif` in the image violates our rule. -[Back to Top](#contents) - ## Create the custom rule -Let’s create a new folder `rules` under the root directory, where we will place all of our custom rules, and create a new file in it named `no-gif-allowed.js`. +Let’s create a new folder `rules` under the root directory, where we will place +all of our custom rules, and create a new file in it named `no-gif-allowed.js`. ```sh mkdir rules @@ -123,11 +127,14 @@ touch no-gif-allowed.js cd .. # return to project root ``` -*Note*: the name of folders and files, and where to place them within your project, is up to you. +*Note*: the name of folders and files, and where to place them within your +project, is up to you. In `./rules/no-gif-allowed.js`, let’s import `unified-lint-rule`. -We then export the result of calling `rule` by providing the *namespace and rule name* (`remark-lint:no-gif-allowed`) as the first argument, and our implementation of the rule (`noGifAllowed`) as the second argument. +We then export the result of calling `rule` by providing the *namespace and rule +name* (`remark-lint:no-gif-allowed`) as the first argument, and our +implementation of the rule (`noGifAllowed`) as the second argument. ```js // rules/no-gif-allowed.js @@ -143,7 +150,8 @@ const remarkLintNoGifAllowed = lintRule( export default remarkLintNoGifAllowed ``` -Let’s say you want all your custom rules to be defined as part of your project namespace. +Let’s say you want all your custom rules to be defined as part of your project +namespace. If your project was named `my-project`, then you can export your rule as: ```js @@ -152,9 +160,8 @@ const remarkLintNoGifAllowed = lintRule('my-project-name:no-gif-allowed', () => const remarkLintNoGifAllowed = lintRule('my-npm-published-package:no-gif-allowed', () => {}) ``` -This can help you when wanting to create a group of rules under the same *namespace*. - -[Back to Top](#contents) +This can help you when wanting to create a group of rules under the same +*namespace*. ## Rule arguments @@ -164,17 +171,20 @@ Your rule function will receive three arguments: (tree, file, options) => {} ``` -* `tree` (*required*): [mdast](https://github.com/syntax-tree/mdast) -* `file` (*required*): [virtual file](https://github.com/vfile/vfile) -* `options` (*optional*): additional information passed to the rule by users - -[Back to Top](#contents) +* `tree` (*required*): [mdast][] +* `file` (*required*): [virtual file][vfile] +* `options` (*optional*): additional info passed to the rule by users ## Rule implementation -Because we will be inspecting [mdast](https://github.com/syntax-tree/mdast), which is a markdown abstract syntax tree built upon [unist](https://github.com/syntax-tree/unist), we can take advantage of the many existing [unist utilities](https://github.com/syntax-tree/unist#utilities) to inspect our tree’s nodes. +Because we will be inspecting [mdast][], which is a markdown abstract syntax +tree built upon [unist][], we can take advantage of the many existing +[unist utilities][unist-util] to inspect our tree’s nodes. -For this example, we will use [`unist-util-visit`](https://github.com/syntax-tree/unist-util-visit) to recursively inspect all the image nodes, and [`unist-util-generated`](https://github.com/syntax-tree/unist-util-generated) to ensure we are not inspecting nodes that we have generated ourselves and do not belong to the `doc.md`. +For this example, we will use [`unist-util-visit`][unist-util-visit] to +recursively inspect all the image nodes, and +[`unist-util-generated`][unist-util-generated] to ensure we are not inspecting +nodes that we have generated ourselves and do not belong to the `doc.md`. ```js import {lintRule} from 'unified-lint-rule' @@ -205,7 +215,7 @@ const remarkLintNoGifAllowed = lintRule( // Remember to provide the node as second argument to the message, // in order to obtain the position and column where the violation occurred. file.message( - 'Invalid image file extentions. Please do not use gifs', + 'Invalid image file extensions. Please do not use gifs', node ) } @@ -217,11 +227,10 @@ const remarkLintNoGifAllowed = lintRule( export default remarkLintNoGifAllowed ``` -[Back to Top](#contents) - ## Import the rule in your remark config -Now that our custom rule is defined and ready to be used we need to add it to our `remark` configuration. +Now that our custom rule is defined and ready to be used we need to add it to +our `remark` configuration. You can do that by importing your rule and adding it in `plugins` array: @@ -238,16 +247,33 @@ const preset = {plugins} export default preset ``` -[Back to Top](#contents) - ## Apply the rule on the Markdown file If you run `npm run lint`, you should see the following message in the terminal: ```text -5:1-5:30 warning Invalid image file extentions. Please do not use gifs no-gif-allowed remark-lint +5:1-5:30 warning Invalid image file extensions. Please do not use gifs no-gif-allowed remark-lint ``` -**Congratulations! The rule works!** +**Congratulations! +The rule works!** + +[tutorial]: https://dev.to/floroz/how-to-create-a-custom-lint-rule-for-markdown-and-mdx-using-remark-and-eslint-2jim + +[remark-lint]: https://github.com/remarkjs/remark-lint + +[remark-cli]: https://github.com/remarkjs/remark/tree/main/packages/remark-cli + +[examples]: https://github.com/remarkjs/remark-lint#examples + +[mdast]: https://github.com/syntax-tree/mdast + +[vfile]: https://github.com/vfile/vfile + +[unist]: https://github.com/syntax-tree/unist + +[unist-util]: https://github.com/syntax-tree/unist#utilities + +[unist-util-visit]: https://github.com/syntax-tree/unist-util-visit -[Back to Top](#contents) +[unist-util-generated]: https://github.com/syntax-tree/unist-util-generated diff --git a/doc/rules.md b/doc/rules.md index cbaedd04..33d65f73 100644 --- a/doc/rules.md +++ b/doc/rules.md @@ -1,155 +1,13 @@ # Rules -This document describes how to configure rules and lists all available official -rules. Each rule is a separate package. See their readme’s for more -information. - -## Contents - -* [Configuration](#configuration) -* [List of rules](#list-of-rules) - ## Configuration -`false` turns rules off — the code no longer runs: - -```js -import remarkLintFinalNewline from 'remark-lint-final-newline' - -remark() - .use(remarkLintFinalNewline, false) - // … -``` - -`true` turns a rule on again: - -```js -import remarkLintFinalNewline from 'remark-lint-final-newline' - -remark() - .use(remarkLintFinalNewline, true) - // … -``` - -Rules can be configured with a severity too. The following ignores all -messages from the plugin: - -```js -import remarkLintFinalNewline from 'remark-lint-final-newline' - -remark() - .use(remarkLintFinalNewline, [0]) - // … -``` - -…and passing `[1]` explicitly sets the normal behavior (warn for problems). -To trigger an error instead of a warning, pass `2`: - -```js -import remarkLintFinalNewline from 'remark-lint-final-newline' - -remark() - .use(remarkLintFinalNewline, [2]) - // … -``` - -It’s also possible to pass both a severity and configuration: - -```js -import remarkLintMaximumLineLength from 'remark-lint-maximum-line-length' - -remark() - .use(remarkLintMaximumLineLength, [2, 70]) - // … -``` - -Lastly, strings can also be passed, instead of numbers: -`off` instead of `0`, `warn` or `on` instead of `1`, and -`error` instead of `2`. - -```js -import remarkLintMaximumLineLength from 'remark-lint-maximum-line-length' - -remark() - .use(remarkLintMaximumLineLength, ['error', 70]) - // … -``` +See the monorepo readme for [configuring rules][config]. ## List of rules -This lists contains all “official” rules, developed in this repository. -For rules developed outside of this repo, view the [List of External -Rules][external]. - - - -* [`blockquote-indentation`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-blockquote-indentation) — warn when block quotes are either indented too much or too little -* [`checkbox-character-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-checkbox-character-style) — warn when list item checkboxes violate a given style -* [`checkbox-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-checkbox-content-indent) — warn when list item checkboxes are followed by too much whitespace -* [`code-block-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-code-block-style) — warn when code blocks do not adhere to a given style -* [`definition-case`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-definition-case) — warn when definition labels are not lowercase -* [`definition-spacing`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-definition-spacing) — warn when consecutive whitespace is used in a definition -* [`emphasis-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-emphasis-marker) — warn when emphasis markers violate the given style -* [`fenced-code-flag`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-fenced-code-flag) — warn when fenced code blocks occur without language flag -* [`fenced-code-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-fenced-code-marker) — warn when fenced code markers violate the given style -* [`file-extension`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-file-extension) — warn when the file’s extension violates the given style -* [`final-definition`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-final-definition) — warn when definitions are not placed at the end of the file -* [`final-newline`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-final-newline) — warn when a newline at the end of a file is missing -* [`first-heading-level`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-first-heading-level) — warn when the first heading has a level other than a specified value -* [`hard-break-spaces`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-hard-break-spaces) — warn when too many spaces are used to create a hard break -* [`heading-increment`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-heading-increment) — warn when headings increment with more than 1 level at a time -* [`heading-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-heading-style) — warn when heading style violates the given style -* [`linebreak-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-linebreak-style) — warn when linebreaks violate a given or detected style -* [`link-title-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-link-title-style) — warn when link and definition titles occur with incorrect quotes -* [`list-item-bullet-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-bullet-indent) — warn when list item bullets are indented -* [`list-item-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-content-indent) — warn when the content of a list item has mixed indentation -* [`list-item-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-indent) — warn when the spacing between a list item’s bullet and its content violates a given style -* [`list-item-spacing`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-spacing) — warn when list looseness is incorrect -* [`maximum-heading-length`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-maximum-heading-length) — warn when headings are too long -* [`maximum-line-length`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-maximum-line-length) — warn when lines are too long -* [`no-blockquote-without-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-blockquote-without-marker) — warn when blank lines without markers (\`>\`) are found in a block quote -* [`no-consecutive-blank-lines`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-consecutive-blank-lines) — warn for too many consecutive blank lines -* [`no-duplicate-defined-urls`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-defined-urls) — warn on definitions that define the same urls -* [`no-duplicate-definitions`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-definitions) — warn on duplicate definitions -* [`no-duplicate-headings`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-headings) — warn on duplicate headings -* [`no-duplicate-headings-in-section`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-headings-in-section) — warn on duplicate headings in a section -* [`no-emphasis-as-heading`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-emphasis-as-heading) — warn when emphasis or importance is used instead of a heading -* [`no-empty-url`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-empty-url) — warn on empty URLs in links and images -* [`no-file-name-articles`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-articles) — warn when file name start with an article -* [`no-file-name-consecutive-dashes`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-consecutive-dashes) — warn when file names contain consecutive dashes -* [`no-file-name-irregular-characters`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-irregular-characters) — warn when file names contain irregular characters -* [`no-file-name-mixed-case`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-mixed-case) — warn when file names use mixed case -* [`no-file-name-outer-dashes`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-outer-dashes) — warn when file names contain initial or final dashes -* [`no-heading-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-content-indent) — warn when heading content is indented -* [`no-heading-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-indent) — warn when headings are indented -* [`no-heading-like-paragraph`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-like-paragraph) — for too many hashes (h7+ “headings”) -* [`no-heading-punctuation`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-punctuation) — warn when headings end in illegal characters -* [`no-html`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-html) — warn when HTML nodes are used -* [`no-inline-padding`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-inline-padding) — warn when inline nodes are padded with spaces -* [`no-literal-urls`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-literal-urls) — warn when URLs without angle brackets are used -* [`no-missing-blank-lines`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-missing-blank-lines) — warn when missing blank lines -* [`no-multiple-toplevel-headings`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-multiple-toplevel-headings) — warn when multiple top level headings are used -* [`no-paragraph-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-paragraph-content-indent) — warn when the content in paragraphs are indented -* [`no-reference-like-url`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-reference-like-url) — warn when URLs are also defined identifiers -* [`no-shell-dollars`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-shell-dollars) — warn when shell code is prefixed by dollars -* [`no-shortcut-reference-image`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-shortcut-reference-image) — warn when shortcut reference images are used -* [`no-shortcut-reference-link`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-shortcut-reference-link) — warn when shortcut reference links are used -* [`no-table-indentation`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-table-indentation) — warn when tables are indented -* [`no-tabs`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-tabs) — warn when hard tabs are used instead of spaces -* [`no-undefined-references`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-undefined-references) — warn when references to undefined definitions are found -* [`no-unneeded-full-reference-image`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-unneeded-full-reference-image) — warn when full reference images are used if they can be collapsed -* [`no-unneeded-full-reference-link`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-unneeded-full-reference-link) — warn when full reference links are used if they can be collapsed -* [`no-unused-definitions`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-unused-definitions) — warn when unused definitions are found -* [`ordered-list-marker-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-ordered-list-marker-style) — warn when the markers of ordered lists violate a given style -* [`ordered-list-marker-value`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-ordered-list-marker-value) — warn when the marker value of ordered lists violates a given style -* [`rule-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-rule-style) — warn when horizontal rules violate a given style -* [`strikethrough-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-strikethrough-marker) — warn when strikethrough markers violate the given style -* [`strong-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-strong-marker) — warn when importance (strong) markers violate the given style -* [`table-cell-padding`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-table-cell-padding) — warn when table cells are incorrectly padded -* [`table-pipe-alignment`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-table-pipe-alignment) — warn when table pipes are not aligned -* [`table-pipes`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-table-pipes) — warn when table rows are not fenced with pipes -* [`unordered-list-marker-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-unordered-list-marker-style) — warn when markers of unordered lists violate a given style +See the monorepo readme for the [rules][]. - +[config]: https://github.com/remarkjs/remark-lint#configure -[external]: https://github.com/remarkjs/remark-lint#list-of-external-rules +[rules]: https://github.com/remarkjs/remark-lint#rules diff --git a/logo.svg b/logo.svg index e19ba5f7..f94e6412 100644 --- a/logo.svg +++ b/logo.svg @@ -1,5 +1,14 @@ - - - - + + + + + + diff --git a/packages/remark-lint-blockquote-indentation/index.js b/packages/remark-lint-blockquote-indentation/index.js index acc8656a..d7c74a63 100644 --- a/packages/remark-lint-blockquote-indentation/index.js +++ b/packages/remark-lint-blockquote-indentation/index.js @@ -1,16 +1,46 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module blockquote-indentation - * @fileoverview - * Warn when block quotes are indented too much or too little. + * ## When should I use this? + * + * You can use this package to check that the “indent” of block quotes is + * consistent. + * Indent here is the `>` (greater than) marker and the spaces before content. + * + * ## API + * + * The following options (default: `'consistent'`) are accepted: + * + * * `number` (example: `2`) + * — preferred indent of `>` and spaces before content + * * `'consistent'` + * — detect the first used style and warn when further block quotes differ * - * Options: `number` or `'consistent'`, default: `'consistent'`. + * ## Recommendation * - * `'consistent'` detects the first used indentation and will warn when - * other block quotes use a different indentation. + * CommonMark specifies that when block quotes are used the `>` markers can be + * followed by an optional space. + * No space at all arguably looks rather ugly: * + * ```markdown + * >Mars and + * >Venus. + * ``` + * + * There is no specific handling of more that one space, so if 5 spaces were + * used after `>`, then indented code kicks in: + * + * ```markdown + * > neptune() + * ``` + * + * Due to this, it’s recommended to configure this rule with `2`. + * + * @module blockquote-indentation + * @summary + * remark-lint rule to warn when block quotes are indented too much or + * too little. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "setting": 4} * diff --git a/packages/remark-lint-blockquote-indentation/readme.md b/packages/remark-lint-blockquote-indentation/readme.md index 673c68a1..3dd7f90a 100644 --- a/packages/remark-lint-blockquote-indentation/readme.md +++ b/packages/remark-lint-blockquote-indentation/readme.md @@ -10,12 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when block quotes are indented too much or too little. +[`remark-lint`][mono] rule to warn when block quotes are indented too much or +too little. -Options: `number` or `'consistent'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used indentation and will warn when -other block quotes use a different indentation. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintBlockquoteIndentation[, config])`](#unifieduseremarklintblockquoteindentation-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that the “indent” of block quotes is +consistent. +Indent here is the `>` (greater than) marker and the spaces before content. ## Presets @@ -26,7 +49,111 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `2` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-blockquote-indentation +``` + +In Deno with [Skypack][]: + +```js +import remarkLintBlockquoteIndentation from 'https://cdn.skypack.dev/remark-lint-blockquote-indentation@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintBlockquoteIndentation from 'remark-lint-blockquote-indentation' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintBlockquoteIndentation) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-blockquote-indentation example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-blockquote-indentation", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintBlockquoteIndentation`. + +### `unified().use(remarkLintBlockquoteIndentation[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `number` (example: `2`) + — preferred indent of `>` and spaces before content +* `'consistent'` + — detect the first used style and warn when further block quotes differ + +## Recommendation + +CommonMark specifies that when block quotes are used the `>` markers can be +followed by an optional space. +No space at all arguably looks rather ugly: + +```markdown +>Mars and +>Venus. +``` + +There is no specific handling of more that one space, so if 5 spaces were +used after `>`, then indented code kicks in: + +```markdown +> neptune() +``` + +Due to this, it’s recommended to configure this rule with `2`. + +## Examples ##### `ok.md` @@ -87,59 +214,12 @@ Paragraph. 9:3: Add 1 space between block quote and content ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-blockquote-indentation -``` - -This package exports no identifiers. -The default export is `remarkLintBlockquoteIndentation`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-blockquote-indentation", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-blockquote-indentation readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintBlockquoteIndentation from 'remark-lint-blockquote-indentation' - - remark() - .use(remarkLint) -+ .use(remarkLintBlockquoteIndentation) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -181,17 +261,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-checkbox-character-style/index.js b/packages/remark-lint-checkbox-character-style/index.js index 5f685aef..e323c6c3 100644 --- a/packages/remark-lint-checkbox-character-style/index.js +++ b/packages/remark-lint-checkbox-character-style/index.js @@ -1,31 +1,41 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module checkbox-character-style - * @fileoverview - * Warn when list item checkboxes violate a given style. + * ## When should I use this? + * + * You can use this package to check that the style of GFM tasklists is + * consistent. * - * Options: `Object` or `'consistent'`, default: `'consistent'`. + * ## API * - * `'consistent'` detects the first used checked and unchecked checkbox - * styles and warns when subsequent checkboxes use different styles. + * The following options (default: `'consistent'`) are accepted: * - * Styles can also be passed in like so: + * * `Object` with the following fields: + * * `checked` (`'x'`, `'X'`, or `'consistent'`, default: `'consistent'`) + * — preferred character to use for checked checkboxes + * * `unchecked` (`'·'` (a space), `'»'` (a tab), or `'consistent'`, + * default: `'consistent'`) + * — preferred character to use for unchecked checkboxes + * * `'consistent'` + * — detect the first used styles and warn when further checkboxes differ * - * ```js - * {checked: 'x', unchecked: ' '} - * ``` + * ## Recommendation * - * ## Fix + * It’s recommended to set `options.checked` to `'x'` (a lowercase X) as it + * prevents an extra keyboard press and `options.unchecked` to `'·'` (a space) + * to make all checkboxes align. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats checked checkboxes using `x` (lowercase X) and unchecked checkboxes - * as `·` (a single space). + * ## Fix * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats checked checkboxes using `'x'` (lowercase X) and unchecked checkboxes + * using `'·'` (a space). * + * @module checkbox-character-style + * @summary + * remark-lint rule to warn when list item checkboxes violate a given + * style. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "setting": {"checked": "x"}, "gfm": true} * diff --git a/packages/remark-lint-checkbox-character-style/readme.md b/packages/remark-lint-checkbox-character-style/readme.md index eb472e75..32a06cd1 100644 --- a/packages/remark-lint-checkbox-character-style/readme.md +++ b/packages/remark-lint-checkbox-character-style/readme.md @@ -10,27 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when list item checkboxes violate a given style. +[`remark-lint`][mono] rule to warn when list item checkboxes violate a given +style. -Options: `Object` or `'consistent'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used checked and unchecked checkbox -styles and warns when subsequent checkboxes use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintCheckboxCharacterStyle[, config])`](#unifieduseremarklintcheckboxcharacterstyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -Styles can also be passed in like so: +## What is this? -```js -{checked: 'x', unchecked: ' '} -``` - -## Fix +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats checked checkboxes using `x` (lowercase X) and unchecked checkboxes -as `·` (a single space). +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that the style of GFM tasklists is +consistent. ## Presets @@ -40,7 +48,107 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-checkbox-character-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintCheckboxCharacterStyle from 'https://cdn.skypack.dev/remark-lint-checkbox-character-style@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintCheckboxCharacterStyle from 'remark-lint-checkbox-character-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintCheckboxCharacterStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-checkbox-character-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-checkbox-character-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintCheckboxCharacterStyle`. + +### `unified().use(remarkLintCheckboxCharacterStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `Object` with the following fields: + * `checked` (`'x'`, `'X'`, or `'consistent'`, default: `'consistent'`) + — preferred character to use for checked checkboxes + * `unchecked` (`'·'` (a space), `'»'` (a tab), or `'consistent'`, + default: `'consistent'`) + — preferred character to use for unchecked checkboxes +* `'consistent'` + — detect the first used styles and warn when further checkboxes differ + +## Recommendation + +It’s recommended to set `options.checked` to `'x'` (a lowercase X) as it +prevents an extra keyboard press and `options.unchecked` to `'·'` (a space) +to make all checkboxes align. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats checked checkboxes using `'x'` (lowercase X) and unchecked checkboxes +using `'·'` (a space). + +## Examples ##### `ok.md` @@ -48,7 +156,7 @@ When configured with `{ checked: 'x' }`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown - [x] List item @@ -65,7 +173,7 @@ When configured with `{ checked: 'X' }`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown - [X] List item @@ -82,9 +190,9 @@ When configured with `{ unchecked: ' ' }`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown - [ ] List item @@ -103,9 +211,9 @@ When configured with `{ unchecked: '\t' }`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). -Note: `»` represents a tab. +> 👉 **Note**: `»` represents a tab. ```markdown - [»] List item @@ -120,9 +228,9 @@ No messages. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). -Note: `»` represents a tab. +> 👉 **Note**: `»` represents a tab. ```markdown - [x] List item @@ -158,59 +266,12 @@ When configured with `{ checked: '💩' }`. 1:1: Incorrect checked checkbox marker `💩`: use either `'x'`, or `'X'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-checkbox-character-style -``` - -This package exports no identifiers. -The default export is `remarkLintCheckboxCharacterStyle`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-checkbox-character-style", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-checkbox-character-style readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintCheckboxCharacterStyle from 'remark-lint-checkbox-character-style' - - remark() - .use(remarkLint) -+ .use(remarkLintCheckboxCharacterStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -252,17 +313,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-checkbox-content-indent/index.js b/packages/remark-lint-checkbox-content-indent/index.js index a61f7a0a..83223e77 100644 --- a/packages/remark-lint-checkbox-content-indent/index.js +++ b/packages/remark-lint-checkbox-content-indent/index.js @@ -1,11 +1,42 @@ /** + * ## When should I use this? + * + * You can use this package to check that the “indent” after a GFM tasklist + * checkbox is a single space. + * + * ## API + * + * There are no accepted options. + * + * ## Recommendation + * + * GFM allows zero or more spaces and tabs after checkboxes. + * No space at all arguably looks rather ugly: + * + * ```markdown + * * [x]Pluto + * ``` + * + * More that one space is superfluous: + * + * ```markdown + * * [x] Jupiter + * ``` + * + * Due to this, it’s recommended to turn this rule on. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats checkboxes and the content after them with a single space between. + * + * @module checkbox-content-indent + * @summary + * remark-lint rule to warn when GFM tasklist checkboxes are followed by + * more than one space. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module checkbox-content-indent - * @fileoverview - * Warn when list item checkboxes are followed by too much whitespace. - * * @example * {"name": "ok.md", "gfm": true} * diff --git a/packages/remark-lint-checkbox-content-indent/readme.md b/packages/remark-lint-checkbox-content-indent/readme.md index 34945006..762f3cd6 100644 --- a/packages/remark-lint-checkbox-content-indent/readme.md +++ b/packages/remark-lint-checkbox-content-indent/readme.md @@ -10,106 +10,188 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when list item checkboxes are followed by too much whitespace. +[`remark-lint`][mono] rule to warn when GFM tasklist checkboxes are followed by +more than one space. -## Presets +## Contents -This rule is not included in any default preset +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintCheckboxContentIndent[, config])`](#unifieduseremarklintcheckboxcontentindent-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Example +## What is this? -##### `ok.md` +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -###### In +## When should I use this? -Note: this example uses [GFM][]. +You can use this package to check that the “indent” after a GFM tasklist +checkbox is a single space. -```markdown -- [ ] List item -+ [x] List Item -* [X] List item -- [ ] List item -``` +## Presets -###### Out +This rule is not included in a preset maintained here. -No messages. +## Install -##### `not-ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-checkbox-content-indent +``` -Note: this example uses [GFM][]. +In Deno with [Skypack][]: -```markdown -- [ ] List item -+ [x] List item -* [X] List item -- [ ] List item +```js +import remarkLintCheckboxContentIndent from 'https://cdn.skypack.dev/remark-lint-checkbox-content-indent@4?dts' ``` -###### Out +In browsers with [Skypack][]: -```text -2:7-2:8: Checkboxes should be followed by a single character -3:7-3:9: Checkboxes should be followed by a single character -4:7-4:10: Checkboxes should be followed by a single character +```html + ``` -## Install +## Use -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +On the API: -[npm][]: +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintCheckboxContentIndent from 'remark-lint-checkbox-content-indent' -```sh -npm install remark-lint-checkbox-content-indent +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintCheckboxContentIndent) + .process(await read('example.md')) + + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintCheckboxContentIndent`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-checkbox-content-indent example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-checkbox-content-indent", + "remark-lint", ++ "remark-lint-checkbox-content-indent", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-checkbox-content-indent readme.md +This package exports no identifiers. +The default export is `remarkLintCheckboxContentIndent`. + +### `unified().use(remarkLintCheckboxContentIndent[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no accepted options. + +## Recommendation + +GFM allows zero or more spaces and tabs after checkboxes. +No space at all arguably looks rather ugly: + +```markdown +* [x]Pluto ``` -Or use this on the API: +More that one space is superfluous: -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintCheckboxContentIndent from 'remark-lint-checkbox-content-indent' - - remark() - .use(remarkLint) -+ .use(remarkLintCheckboxContentIndent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +```markdown +* [x] Jupiter +``` + +Due to this, it’s recommended to turn this rule on. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats checkboxes and the content after them with a single space between. + +## Examples + +##### `ok.md` + +###### In + +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). + +```markdown +- [ ] List item ++ [x] List Item +* [X] List item +- [ ] List item +``` + +###### Out + +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). + +```markdown +- [ ] List item ++ [x] List item +* [X] List item +- [ ] List item +``` + +###### Out + +```text +2:7-2:8: Checkboxes should be followed by a single character +3:7-3:9: Checkboxes should be followed by a single character +4:7-4:10: Checkboxes should be followed by a single character ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -150,17 +232,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-code-block-style/index.js b/packages/remark-lint-code-block-style/index.js index c757c167..a84472c1 100644 --- a/packages/remark-lint-code-block-style/index.js +++ b/packages/remark-lint-code-block-style/index.js @@ -1,27 +1,52 @@ /** + * ## When should I use this? + * + * You can use this package to check that code blocks are consistent. + * + * ## API + * + * The following options (default: `'consistent'`) are accepted: + * + * * `'fenced'` + * — prefer fenced code blocks: + * ````markdown + * ```js + * code() + * ``` + * ```` + * * `'indented'` + * — prefer indented code blocks: + * ```markdown + * code() + * ``` + * * `'consistent'` + * — detect the first used style and warn when further code blocks differ + * + * ## Recommendation + * + * Indentation in markdown is complex, especially because lists and indented + * code can interfere in unexpected ways. + * Fenced code has more features than indented code: importantly, specifying a + * programming language. + * Since CommonMark took the idea of fenced code from GFM, fenced code became + * widely supported. + * Due to this, it’s recommended to configure this rule with `'fenced'`. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats code blocks as fenced code when they have a language flag and as + * indented code otherwise. + * Pass + * [`fences: true`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsfences) + * to always use fenced code. + * + * @module code-block-style + * @summary + * remark-lint rule to warn when code blocks violate a given style. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module code-block-style - * @fileoverview - * Warn when code blocks do not adhere to a given style. - * - * Options: `'consistent'`, `'fenced'`, or `'indented'`, default: `'consistent'`. - * - * `'consistent'` detects the first used code block style and warns when - * subsequent code blocks uses different styles. - * - * ## Fix - * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats code blocks using a fence if they have a language flag and - * indentation if not. - * Pass - * [`fences: true`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsfences) - * to always use fences for code blocks. - * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. * * @example * {"setting": "indented", "name": "ok.md"} diff --git a/packages/remark-lint-code-block-style/readme.md b/packages/remark-lint-code-block-style/readme.md index 2aa06fdc..56c3fd3a 100644 --- a/packages/remark-lint-code-block-style/readme.md +++ b/packages/remark-lint-code-block-style/readme.md @@ -10,24 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when code blocks do not adhere to a given style. +[`remark-lint`][mono] rule to warn when code blocks violate a given style. -Options: `'consistent'`, `'fenced'`, or `'indented'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used code block style and warns when -subsequent code blocks uses different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintCodeBlockStyle[, config])`](#unifieduseremarklintcodeblockstyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats code blocks using a fence if they have a language flag and -indentation if not. -Pass -[`fences: true`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsfences) -to always use fences for code blocks. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that code blocks are consistent. ## Presets @@ -38,7 +47,120 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'fenced'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-code-block-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintCodeBlockStyle from 'https://cdn.skypack.dev/remark-lint-code-block-style@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintCodeBlockStyle from 'remark-lint-code-block-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintCodeBlockStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-code-block-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-code-block-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintCodeBlockStyle`. + +### `unified().use(remarkLintCodeBlockStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'fenced'` + — prefer fenced code blocks: + ````markdown + ```js + code() + ``` + ```` +* `'indented'` + — prefer indented code blocks: + ```markdown + code() + ``` +* `'consistent'` + — detect the first used style and warn when further code blocks differ + +## Recommendation + +Indentation in markdown is complex, especially because lists and indented +code can interfere in unexpected ways. +Fenced code has more features than indented code: importantly, specifying a +programming language. +Since CommonMark took the idea of fenced code from GFM, fenced code became +widely supported. +Due to this, it’s recommended to configure this rule with `'fenced'`. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats code blocks as fenced code when they have a language flag and as +indented code otherwise. +Pass +[`fences: true`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsfences) +to always use fenced code. + +## Examples ##### `ok.md` @@ -156,59 +278,12 @@ When configured with `'💩'`. 1:1: Incorrect code block style `💩`: use either `'consistent'`, `'fenced'`, or `'indented'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-code-block-style -``` - -This package exports no identifiers. -The default export is `remarkLintCodeBlockStyle`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-code-block-style", - … - ] - } - … -``` - -Or use it on the CLI directly +## Compatibility -```sh -remark -u lint -u lint-code-block-style readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintCodeBlockStyle from 'remark-lint-code-block-style' - - remark() - .use(remarkLint) -+ .use(remarkLintCodeBlockStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -250,17 +325,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-definition-case/index.js b/packages/remark-lint-definition-case/index.js index 093ac120..e1a626d0 100644 --- a/packages/remark-lint-definition-case/index.js +++ b/packages/remark-lint-definition-case/index.js @@ -1,11 +1,26 @@ /** + * ## When should I use this? + * + * You can use this package to check that the labels used in definitions + * are lowercase. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Definitions and references are matched together regardless of casing. + * Using uppercase in labels might incorrectly indicate that casing is of + * importance. + * Due to this, it’s recommended to use lowercase and turn this rule on. + * + * @module definition-case + * @summary + * remark-lint rule to warn when definition labels are not lowercase. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module definition-case - * @fileoverview - * Warn when definition labels are not lowercase. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-definition-case/readme.md b/packages/remark-lint-definition-case/readme.md index 5dbc9e8b..7f871240 100644 --- a/packages/remark-lint-definition-case/readme.md +++ b/packages/remark-lint-definition-case/readme.md @@ -10,7 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when definition labels are not lowercase. +[`remark-lint`][mono] rule to warn when definition labels are not lowercase. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintDefinitionCase[, config])`](#unifieduseremarklintdefinitioncase-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that the labels used in definitions +are lowercase. ## Presets @@ -20,88 +46,127 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example - -##### `ok.md` +## Install -###### In +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -```markdown -[example]: http://example.com "Example Domain" +```sh +npm install remark-lint-definition-case ``` -###### Out +In Deno with [Skypack][]: -No messages. +```js +import remarkLintDefinitionCase from 'https://cdn.skypack.dev/remark-lint-definition-case@3?dts' +``` -##### `not-ok.md` +In browsers with [Skypack][]: -###### In - -```markdown -[Example]: http://example.com "Example Domain" +```html + ``` -###### Out +## Use -```text -1:1-1:47: Do not use uppercase characters in definition labels -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintDefinitionCase from 'remark-lint-definition-case' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintDefinitionCase) + .process(await read('example.md')) -```sh -npm install remark-lint-definition-case + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintDefinitionCase`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-definition-case example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-definition-case", + "remark-lint", ++ "remark-lint-definition-case", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-definition-case readme.md +This package exports no identifiers. +The default export is `remarkLintDefinitionCase`. + +### `unified().use(remarkLintDefinitionCase[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Definitions and references are matched together regardless of casing. +Using uppercase in labels might incorrectly indicate that casing is of +importance. +Due to this, it’s recommended to use lowercase and turn this rule on. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[example]: http://example.com "Example Domain" ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintDefinitionCase from 'remark-lint-definition-case' - - remark() - .use(remarkLint) -+ .use(remarkLintDefinitionCase) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +[Example]: http://example.com "Example Domain" +``` + +###### Out + +```text +1:1-1:47: Do not use uppercase characters in definition labels ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -142,17 +207,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-definition-spacing/index.js b/packages/remark-lint-definition-spacing/index.js index e54e10f9..a3403768 100644 --- a/packages/remark-lint-definition-spacing/index.js +++ b/packages/remark-lint-definition-spacing/index.js @@ -1,11 +1,28 @@ /** + * ## When should I use this? + * + * You can use this package to check that the labels used in definitions + * do not use meaningless white space. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Definitions and references are matched together by collapsing white space. + * Using more white space in labels might incorrectly indicate that they are of + * importance. + * Due to this, it’s recommended to use one space (or a line ending if needed) + * and turn this rule on. + * + * @module definition-spacing + * @summary + * remark-lint rule to warn when consecutive whitespace is used in + * a definition label. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module definition-spacing - * @fileoverview - * Warn when consecutive whitespace is used in a definition. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-definition-spacing/readme.md b/packages/remark-lint-definition-spacing/readme.md index 91e26f51..047cb4a0 100644 --- a/packages/remark-lint-definition-spacing/readme.md +++ b/packages/remark-lint-definition-spacing/readme.md @@ -10,7 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when consecutive whitespace is used in a definition. +[`remark-lint`][mono] rule to warn when consecutive whitespace is used in +a definition label. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintDefinitionSpacing[, config])`](#unifieduseremarklintdefinitionspacing-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that the labels used in definitions +do not use meaningless white space. ## Presets @@ -20,90 +47,130 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example - -##### `ok.md` +## Install -###### In +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -```markdown -[example domain]: http://example.com "Example Domain" +```sh +npm install remark-lint-definition-spacing ``` -###### Out - -No messages. - -##### `not-ok.md` +In Deno with [Skypack][]: -###### In +```js +import remarkLintDefinitionSpacing from 'https://cdn.skypack.dev/remark-lint-definition-spacing@3?dts' +``` -Note: `·` represents a space. +In browsers with [Skypack][]: -```markdown -[example····domain]: http://example.com "Example Domain" +```html + ``` -###### Out +## Use -```text -1:1-1:57: Do not use consecutive whitespace in definition labels -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintDefinitionSpacing from 'remark-lint-definition-spacing' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintDefinitionSpacing) + .process(await read('example.md')) -```sh -npm install remark-lint-definition-spacing + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintDefinitionSpacing`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-definition-spacing example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-definition-spacing", + "remark-lint", ++ "remark-lint-definition-spacing", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-definition-spacing readme.md +This package exports no identifiers. +The default export is `remarkLintDefinitionSpacing`. + +### `unified().use(remarkLintDefinitionSpacing[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Definitions and references are matched together by collapsing white space. +Using more white space in labels might incorrectly indicate that they are of +importance. +Due to this, it’s recommended to use one space (or a line ending if needed) +and turn this rule on. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[example domain]: http://example.com "Example Domain" ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintDefinitionSpacing from 'remark-lint-definition-spacing' - - remark() - .use(remarkLint) -+ .use(remarkLintDefinitionSpacing) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: `·` represents a space. + +```markdown +[example····domain]: http://example.com "Example Domain" +``` + +###### Out + +```text +1:1-1:57: Do not use consecutive whitespace in definition labels ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -144,17 +211,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-emphasis-marker/index.js b/packages/remark-lint-emphasis-marker/index.js index ca324555..2a9671e0 100644 --- a/packages/remark-lint-emphasis-marker/index.js +++ b/packages/remark-lint-emphasis-marker/index.js @@ -1,27 +1,44 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module emphasis-marker - * @fileoverview - * Warn for violating emphasis markers. + * ## When should I use this? + * + * You can use this package to check that emphasis markers are consistent. + * + * ## API * - * Options: `'consistent'`, `'*'`, or `'_'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used emphasis style and warns when - * subsequent emphasis use different styles. + * * `'*'` + * — prefer asterisks + * * `'_'` + * — prefer underscores + * * `'consistent'` + * — detect the first used style and warn when further emphasis differs * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats emphasis using `_` (underscore) by default. - * Pass - * [`emphasis: '*'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsemphasis) - * to use `*` (asterisk) instead. + * Underscores and asterisks work slightly different: asterisks can form + * emphasis in more cases than underscores. + * Because underscores are sometimes used to represent normal underscores inside + * words, there are extra rules supporting that. + * Asterisks can also be used as the marker of more constructs than underscores: + * lists. + * Due to having simpler parsing rules, looking more like syntax, and that they + * can be used for more constructs, it’s recommended to prefer asterisks. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats emphasis with asterisks by default. + * Pass + * [`emphasis: '_'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsemphasis) + * to always use underscores. + * + * @module emphasis-marker + * @summary + * remark-lint rule to warn when emphasis markers are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"setting": "*", "name": "ok.md"} * diff --git a/packages/remark-lint-emphasis-marker/readme.md b/packages/remark-lint-emphasis-marker/readme.md index f3892b10..28ee7272 100644 --- a/packages/remark-lint-emphasis-marker/readme.md +++ b/packages/remark-lint-emphasis-marker/readme.md @@ -10,23 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for violating emphasis markers. +[`remark-lint`][mono] rule to warn when emphasis markers are inconsistent. -Options: `'consistent'`, `'*'`, or `'_'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used emphasis style and warns when -subsequent emphasis use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintEmphasisMarker[, config])`](#unifieduseremarklintemphasismarker-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats emphasis using `_` (underscore) by default. -Pass -[`emphasis: '*'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsemphasis) -to use `*` (asterisk) instead. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that emphasis markers are consistent. ## Presets @@ -37,7 +47,112 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'*'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-emphasis-marker +``` + +In Deno with [Skypack][]: + +```js +import remarkLintEmphasisMarker from 'https://cdn.skypack.dev/remark-lint-emphasis-marker@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintEmphasisMarker from 'remark-lint-emphasis-marker' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintEmphasisMarker) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-emphasis-marker example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-emphasis-marker", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintEmphasisMarker`. + +### `unified().use(remarkLintEmphasisMarker[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'*'` + — prefer asterisks +* `'_'` + — prefer underscores +* `'consistent'` + — detect the first used style and warn when further emphasis differs + +## Recommendation + +Underscores and asterisks work slightly different: asterisks can form +emphasis in more cases than underscores. +Because underscores are sometimes used to represent normal underscores inside +words, there are extra rules supporting that. +Asterisks can also be used as the marker of more constructs than underscores: +lists. +Due to having simpler parsing rules, looking more like syntax, and that they +can be used for more constructs, it’s recommended to prefer asterisks. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats emphasis with asterisks by default. +Pass +[`emphasis: '_'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsemphasis) +to always use underscores. + +## Examples ##### `ok.md` @@ -124,59 +239,12 @@ When configured with `'💩'`. 1:1: Incorrect emphasis marker `💩`: use either `'consistent'`, `'*'`, or `'_'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-emphasis-marker -``` - -This package exports no identifiers. -The default export is `remarkLintEmphasisMarker`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-emphasis-marker", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-emphasis-marker readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintEmphasisMarker from 'remark-lint-emphasis-marker' - - remark() - .use(remarkLint) -+ .use(remarkLintEmphasisMarker) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -218,17 +286,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-fenced-code-flag/index.js b/packages/remark-lint-fenced-code-flag/index.js index d07adfa8..316fcd99 100644 --- a/packages/remark-lint-fenced-code-flag/index.js +++ b/packages/remark-lint-fenced-code-flag/index.js @@ -1,19 +1,34 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module fenced-code-flag - * @fileoverview - * Check fenced code block flags. + * ## When should I use this? + * + * You can use this package to check that language flags of fenced code + * are used and consistent. + * + * ## API * - * Options: `Array` or `Object`, optional. + * The following options (default: `undefined`) are accepted: * - * Providing an array is as passing `{flags: Array}`. + * * `Array` + * — as if passing `{flags: options}` + * * `Object` with the following fields: + * * `allowEmpty` (`boolean`, default: `false`) + * — allow language flags to be omitted + * * `flags` (`Array` default: `[]`) + * — specific flags to allow (other flags will result in a warning) * - * The object can have an array of `'flags'` which are allowed: other flags - * will not be allowed. - * An `allowEmpty` field (`boolean`, default: `false`) can be set to allow - * code blocks without language flags. + * ## Recommendation + * + * While omitting the language flag is perfectly fine to signal that the code is + * plain text, it *could* point to a mistake. + * It’s recommended to instead use a certain flag for plain text (such as `txt`) + * and to turn this rule on. + * + * @module fenced-code-flag + * @summary + * remark-lint rule to check that language flags of fenced code are used. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * * @example * {"name": "ok.md"} diff --git a/packages/remark-lint-fenced-code-flag/readme.md b/packages/remark-lint-fenced-code-flag/readme.md index f5238a76..346e1be5 100644 --- a/packages/remark-lint-fenced-code-flag/readme.md +++ b/packages/remark-lint-fenced-code-flag/readme.md @@ -10,16 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Check fenced code block flags. +[`remark-lint`][mono] rule to check that language flags of fenced code are used. -Options: `Array` or `Object`, optional. +## Contents -Providing an array is as passing `{flags: Array}`. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintFencedCodeFlag[, config])`](#unifieduseremarklintfencedcodeflag-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -The object can have an array of `'flags'` which are allowed: other flags -will not be allowed. -An `allowEmpty` field (`boolean`, default: `false`) can be set to allow -code blocks without language flags. +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that language flags of fenced code +are used and consistent. ## Presets @@ -29,7 +46,101 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `{ allowEmpty: false }` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-fenced-code-flag +``` + +In Deno with [Skypack][]: + +```js +import remarkLintFencedCodeFlag from 'https://cdn.skypack.dev/remark-lint-fenced-code-flag@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintFencedCodeFlag from 'remark-lint-fenced-code-flag' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintFencedCodeFlag) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-fenced-code-flag example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-fenced-code-flag", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintFencedCodeFlag`. + +### `unified().use(remarkLintFencedCodeFlag[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `undefined`) are accepted: + +* `Array` + — as if passing `{flags: options}` +* `Object` with the following fields: + * `allowEmpty` (`boolean`, default: `false`) + — allow language flags to be omitted + * `flags` (`Array` default: `[]`) + — specific flags to allow (other flags will result in a warning) + +## Recommendation + +While omitting the language flag is perfectly fine to signal that the code is +plain text, it *could* point to a mistake. +It’s recommended to instead use a certain flag for plain text (such as `txt`) +and to turn this rule on. + +## Examples ##### `ok.md` @@ -145,59 +256,12 @@ bravo() 1:1-3:4: Incorrect code language flag ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-fenced-code-flag -``` - -This package exports no identifiers. -The default export is `remarkLintFencedCodeFlag`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-fenced-code-flag", - … - ] - } - … -``` - -Or use it on the CLI directly +## Compatibility -```sh -remark -u lint -u lint-fenced-code-flag readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintFencedCodeFlag from 'remark-lint-fenced-code-flag' - - remark() - .use(remarkLint) -+ .use(remarkLintFencedCodeFlag) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -239,17 +303,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-fenced-code-marker/index.js b/packages/remark-lint-fenced-code-marker/index.js index 01c5eaec..118f4938 100644 --- a/packages/remark-lint-fenced-code-marker/index.js +++ b/packages/remark-lint-fenced-code-marker/index.js @@ -1,27 +1,38 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module fenced-code-marker - * @fileoverview - * Warn for violating fenced code markers. + * ## When should I use this? + * + * You can use this package to check that fenced code markers are consistent. + * + * ## API * - * Options: `` '`' ``, `'~'`, or `'consistent'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used fenced code marker style and warns - * when subsequent fenced code blocks use different styles. + * * ``'`'`` + * — prefer grave accents + * * `'~'` + * — prefer tildes + * * `'consistent'` + * — detect the first used style and warn when further fenced code differs * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats fences using ``'`'`` (grave accent) by default. - * Pass - * [`fence: '~'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsfence) - * to use `~` (tilde) instead. + * Tildes are extremely uncommon. + * Due to this, it’s recommended to configure this rule with ``'`'``. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats fenced code with grave accents by default. + * Pass + * [`fence: '~'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsfence) + * to always use tildes. + * + * @module fenced-code-marker + * @summary + * remark-lint rule to warn when fenced code markers are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-fenced-code-marker/readme.md b/packages/remark-lint-fenced-code-marker/readme.md index 85556fa8..981fa45f 100644 --- a/packages/remark-lint-fenced-code-marker/readme.md +++ b/packages/remark-lint-fenced-code-marker/readme.md @@ -10,23 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for violating fenced code markers. +[`remark-lint`][mono] rule to warn when fenced code markers are inconsistent. -Options: ``'`'``, `'~'`, or `'consistent'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used fenced code marker style and warns -when subsequent fenced code blocks use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintFencedCodeMarker[, config])`](#unifieduseremarklintfencedcodemarker-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats fences using ``'`'`` (grave accent) by default. -Pass -[`fence: '~'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsfence) -to use `~` (tilde) instead. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that fenced code markers are consistent. ## Presets @@ -37,7 +47,106 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | ``'`'`` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-fenced-code-marker +``` + +In Deno with [Skypack][]: + +```js +import remarkLintFencedCodeMarker from 'https://cdn.skypack.dev/remark-lint-fenced-code-marker@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintFencedCodeMarker from 'remark-lint-fenced-code-marker' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintFencedCodeMarker) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-fenced-code-marker example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-fenced-code-marker", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintFencedCodeMarker`. + +### `unified().use(remarkLintFencedCodeMarker[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* ``'`'`` + — prefer grave accents +* `'~'` + — prefer tildes +* `'consistent'` + — detect the first used style and warn when further fenced code differs + +## Recommendation + +Tildes are extremely uncommon. +Due to this, it’s recommended to configure this rule with ``'`'``. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats fenced code with grave accents by default. +Pass +[`fence: '~'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsfence) +to always use tildes. + +## Examples ##### `ok.md` @@ -143,59 +252,12 @@ When configured with `'💩'`. 1:1: Incorrect fenced code marker `💩`: use either `'consistent'`, `` '`' ``, or `'~'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +## Compatibility -[npm][]: - -```sh -npm install remark-lint-fenced-code-marker -``` - -This package exports no identifiers. -The default export is `remarkLintFencedCodeMarker`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-fenced-code-marker", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-fenced-code-marker readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintFencedCodeMarker from 'remark-lint-fenced-code-marker' - - remark() - .use(remarkLint) -+ .use(remarkLintFencedCodeMarker) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -237,17 +299,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-file-extension/index.js b/packages/remark-lint-file-extension/index.js index 2b8499d1..5b4bd0a8 100644 --- a/packages/remark-lint-file-extension/index.js +++ b/packages/remark-lint-file-extension/index.js @@ -1,16 +1,31 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module file-extension - * @fileoverview - * Warn when the file extension differ from the preferred extension. + * ## When should I use this? + * + * You can use this package to check that file extensions are `md`. + * + * ## API + * + * The following options (default: `'md'`) are accepted: * - * Does not warn when given documents have no file extensions (such as - * `AUTHORS` or `LICENSE`). + * * `string` (example `'markdown'`) + * — preferred file extension (no dot) * - * Options: `string`, default: `'md'` — Expected file extension. + * > 👉 **Note**: does not warn when files have no file extensions (such as + * > `AUTHORS` or `LICENSE`). * + * ## Recommendation + * + * Use `md` as it’s the most common. + * Also use `md` when your markdown contains common syntax extensions (such as + * GFM, frontmatter, or math). + * Do not use `md` for MDX: use `mdx` instead. + * + * @module file-extension + * @summary + * remark-lint rule to check the file extension. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "readme.md"} * diff --git a/packages/remark-lint-file-extension/readme.md b/packages/remark-lint-file-extension/readme.md index 9aca8f0f..c7cadb4a 100644 --- a/packages/remark-lint-file-extension/readme.md +++ b/packages/remark-lint-file-extension/readme.md @@ -10,12 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the file extension differ from the preferred extension. +[`remark-lint`][mono] rule to check the file extension. -Does not warn when given documents have no file extensions (such as -`AUTHORS` or `LICENSE`). +## Contents -Options: `string`, default: `'md'` — Expected file extension. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintFileExtension[, config])`](#unifieduseremarklintfileextension-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that file extensions are `md`. ## Presets @@ -25,90 +45,135 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'md'` | -## Example - -##### `readme.md` - -###### Out - -No messages. +## Install -##### `readme` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### Out +```sh +npm install remark-lint-file-extension +``` -No messages. +In Deno with [Skypack][]: -##### `readme.mkd` +```js +import remarkLintFileExtension from 'https://cdn.skypack.dev/remark-lint-file-extension@2?dts' +``` -###### Out +In browsers with [Skypack][]: -```text -1:1: Incorrect extension: use `md` +```html + ``` -##### `readme.mkd` +## Use -When configured with `'mkd'`. +On the API: -###### Out +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintFileExtension from 'remark-lint-file-extension' -No messages. +main() -## Install +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintFileExtension) + .process(await read('example.md')) -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. + console.error(reporter(file)) +} +``` -[npm][]: +On the CLI: ```sh -npm install remark-lint-file-extension +remark --use remark-lint --use remark-lint-file-extension example.md ``` -This package exports no identifiers. -The default export is `remarkLintFileExtension`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-file-extension", + "remark-lint", ++ "remark-lint-file-extension", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-file-extension readme.md -``` +This package exports no identifiers. +The default export is `remarkLintFileExtension`. -Or use this on the API: +### `unified().use(remarkLintFileExtension[, config])` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintFileExtension from 'remark-lint-file-extension' - - remark() - .use(remarkLint) -+ .use(remarkLintFileExtension) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'md'`) are accepted: + +* `string` (example `'markdown'`) + — preferred file extension (no dot) + +> 👉 **Note**: does not warn when files have no file extensions (such as +> `AUTHORS` or `LICENSE`). + +## Recommendation + +Use `md` as it’s the most common. +Also use `md` when your markdown contains common syntax extensions (such as +GFM, frontmatter, or math). +Do not use `md` for MDX: use `mdx` instead. + +## Examples + +##### `readme.md` + +###### Out + +No messages. + +##### `readme` + +###### Out + +No messages. + +##### `readme.mkd` + +###### Out + +```text +1:1: Incorrect extension: use `md` ``` +##### `readme.mkd` + +When configured with `'mkd'`. + +###### Out + +No messages. + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -149,17 +214,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-final-definition/index.js b/packages/remark-lint-final-definition/index.js index ddb9b6cc..5e93e3c1 100644 --- a/packages/remark-lint-final-definition/index.js +++ b/packages/remark-lint-final-definition/index.js @@ -1,12 +1,26 @@ /** + * ## When should I use this? + * + * You can use this package to check that definitions are placed at the end of + * the document. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * There are different strategies for placing definitions. + * The simplest is perhaps to place them all at the bottem of documents. + * If you prefer that, turn on this rule. + * + * @module final-definition + * @summary + * remark-lint rule to warn when definitions are used *in* the document + * instead of at the end. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module final-definition - * @fileoverview - * Warn when definitions are placed somewhere other than at the end of - * the file. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-final-definition/readme.md b/packages/remark-lint-final-definition/readme.md index dde8a829..1e963fbd 100644 --- a/packages/remark-lint-final-definition/readme.md +++ b/packages/remark-lint-final-definition/readme.md @@ -10,8 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when definitions are placed somewhere other than at the end of -the file. +[`remark-lint`][mono] rule to warn when definitions are used *in* the document +instead of at the end. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintFinalDefinition[, config])`](#unifieduseremarklintfinaldefinition-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that definitions are placed at the end of +the document. ## Presets @@ -21,7 +47,92 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-final-definition +``` + +In Deno with [Skypack][]: + +```js +import remarkLintFinalDefinition from 'https://cdn.skypack.dev/remark-lint-final-definition@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintFinalDefinition from 'remark-lint-final-definition' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintFinalDefinition) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-final-definition example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-final-definition", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintFinalDefinition`. + +### `unified().use(remarkLintFinalDefinition[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +There are different strategies for placing definitions. +The simplest is perhaps to place them all at the bottem of documents. +If you prefer that, turn on this rule. + +## Examples ##### `ok.md` @@ -73,59 +184,12 @@ Paragraph. No messages. -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +## Compatibility -```sh -npm install remark-lint-final-definition -``` - -This package exports no identifiers. -The default export is `remarkLintFinalDefinition`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-final-definition", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-final-definition readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintFinalDefinition from 'remark-lint-final-definition' - - remark() - .use(remarkLint) -+ .use(remarkLintFinalDefinition) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -167,17 +231,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-final-newline/index.js b/packages/remark-lint-final-newline/index.js index d663333f..49fb4cc5 100644 --- a/packages/remark-lint-final-newline/index.js +++ b/packages/remark-lint-final-newline/index.js @@ -1,53 +1,61 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module final-newline - * @fileoverview - * Warn when a line feed at the end of a file is missing. - * Empty files are allowed. + * ## When should I use this? + * + * You can use this package to check that fenced code markers are consistent. + * + * ## API * - * See [StackExchange](https://unix.stackexchange.com/questions/18743) for why. + * There are no options. * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * always adds a final line feed to files. + * Turn this rule on. + * See [StackExchange](https://unix.stackexchange.com/questions/18743) for more + * info. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * - * ## Example + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * always adds final line endings. * - * ##### `ok.md` + * ## Example * - * ###### In + * ##### `ok.md` * - * Note: `␊` represents LF. + * ###### In * - * ```markdown - * Alpha␊ - * ``` + * > 👉 **Note**: `␊` represents a line feed (`\n`). * - * ###### Out + * ```markdown + * Alpha␊ + * ``` * - * No messages. + * ###### Out * - * ##### `not-ok.md` + * No messages. * - * ###### In + * ##### `not-ok.md` * - * Note: The below file does not have a final newline. + * ###### In * - * ```markdown - * Bravo - * ``` + * > 👉 **Note**: `␀` represents the end of the file. * - * ###### Out + * ```markdown + * Bravo␀ + * ``` * - * ```text - * 1:1: Missing newline character at end of file - * ``` + * ###### Out + * + * ```text + * 1:1: Missing newline character at end of file + * ``` + * + * @module final-newline + * @summary + * remark-lint rule to warn when files don’t end in a newline. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT */ /** diff --git a/packages/remark-lint-final-newline/readme.md b/packages/remark-lint-final-newline/readme.md index 5c89acf0..afa5c69e 100644 --- a/packages/remark-lint-final-newline/readme.md +++ b/packages/remark-lint-final-newline/readme.md @@ -10,113 +10,171 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when a line feed at the end of a file is missing. -Empty files are allowed. +[`remark-lint`][mono] rule to warn when files don’t end in a newline. -See [StackExchange](https://unix.stackexchange.com/questions/18743) for why. +## Contents -## Fix - -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -always adds a final line feed to files. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintFinalNewline[, config])`](#unifieduseremarklintfinalnewline-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Example](#example) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## What is this? -## Example +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -##### `ok.md` +## When should I use this? -###### In +You can use this package to check that fenced code markers are consistent. -Note: `␊` represents LF. +## Presets -```markdown -Alpha␊ -``` +This rule is included in the following presets: -###### Out +| Preset | Setting | +| - | - | +| [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -No messages. +## Install -##### `not-ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-final-newline +``` -Note: The below file does not have a final newline. +In Deno with [Skypack][]: -```markdown -Bravo +```js +import remarkLintFinalNewline from 'https://cdn.skypack.dev/remark-lint-final-newline@2?dts' ``` -###### Out +In browsers with [Skypack][]: -```text -1:1: Missing newline character at end of file +```html + ``` -## Presets +## Use -This rule is included in the following presets: +On the API: -| Preset | Setting | -| - | - | -| [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintFinalNewline from 'remark-lint-final-newline' -## Install +main() -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintFinalNewline) + .process(await read('example.md')) -[npm][]: - -```sh -npm install remark-lint-final-newline + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintFinalNewline`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-final-newline example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-final-newline", + "remark-lint", ++ "remark-lint-final-newline", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-final-newline readme.md +This package exports no identifiers. +The default export is `remarkLintFinalNewline`. + +### `unified().use(remarkLintFinalNewline[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Turn this rule on. +See [StackExchange](https://unix.stackexchange.com/questions/18743) for more +info. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +always adds final line endings. + +## Example + +##### `ok.md` + +###### In + +> 👉 **Note**: `␊` represents a line feed (`\n`). + +```markdown +Alpha␊ ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintFinalNewline from 'remark-lint-final-newline' - - remark() - .use(remarkLint) -+ .use(remarkLintFinalNewline) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: `␀` represents the end of the file. + +```markdown +Bravo␀ +``` + +###### Out + +```text +1:1: Missing newline character at end of file ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -157,17 +215,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-first-heading-level/index.js b/packages/remark-lint-first-heading-level/index.js index 7e862882..dbcf1d55 100644 --- a/packages/remark-lint-first-heading-level/index.js +++ b/packages/remark-lint-first-heading-level/index.js @@ -1,13 +1,29 @@ /** + * ## When should I use this? + * + * You can use this package to check the heading rank of the first heading. + * + * ## API + * + * The following options (default: `1`) are accepted: + * + * * `number` (example `1`) + * — expected rank of first heading + * + * ## Recommendation + * + * In most cases you’d want to first heading in a markdown document to start at + * rank 1. + * In some cases a different rank makes more sense, such as when building a blog + * and generating the primary heading from frontmatter metadata, in which case + * a value of `2` can be defined here. + * + * @module first-heading-level + * @summary + * remark-lint rule to warn when the first heading has an unexpected rank. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module first-heading-level - * @fileoverview - * Warn when the first heading has a level other than a specified value. - * - * Options: `number`, default: `1`. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-first-heading-level/readme.md b/packages/remark-lint-first-heading-level/readme.md index f7a237c3..c660081e 100644 --- a/packages/remark-lint-first-heading-level/readme.md +++ b/packages/remark-lint-first-heading-level/readme.md @@ -10,15 +10,128 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the first heading has a level other than a specified value. +[`remark-lint`][mono] rule to warn when the first heading has an unexpected rank. -Options: `number`, default: `1`. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintFirstHeadingLevel[, config])`](#unifieduseremarklintfirstheadinglevel-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check the heading rank of the first heading. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-first-heading-level +``` + +In Deno with [Skypack][]: + +```js +import remarkLintFirstHeadingLevel from 'https://cdn.skypack.dev/remark-lint-first-heading-level@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintFirstHeadingLevel from 'remark-lint-first-heading-level' -## Example +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintFirstHeadingLevel) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-first-heading-level example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-first-heading-level", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintFirstHeadingLevel`. + +### `unified().use(remarkLintFirstHeadingLevel[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `1`) are accepted: + +* `number` (example `1`) + — expected rank of first heading + +## Recommendation + +In most cases you’d want to first heading in a markdown document to start at +rank 1. +In some cases a different rank makes more sense, such as when building a blog +and generating the primary heading from frontmatter metadata, in which case +a value of `2` can be defined here. + +## Examples ##### `ok.md` @@ -160,59 +273,12 @@ Paragraph. 1:1-1:17: First heading level should be `1` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-first-heading-level -``` - -This package exports no identifiers. -The default export is `remarkLintFirstHeadingLevel`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-first-heading-level", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-first-heading-level readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintFirstHeadingLevel from 'remark-lint-first-heading-level' - - remark() - .use(remarkLint) -+ .use(remarkLintFirstHeadingLevel) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -254,17 +320,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-hard-break-spaces/index.js b/packages/remark-lint-hard-break-spaces/index.js index 7892a33a..4c29325b 100644 --- a/packages/remark-lint-hard-break-spaces/index.js +++ b/packages/remark-lint-hard-break-spaces/index.js @@ -1,11 +1,26 @@ /** + * ## When should I use this? + * + * You can use this package to check that hard breaks use two spaces and + * not more. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Less than two spaces do not create a hard breaks and more than two spaces + * have no effect. + * Due to this, it’s recommended to turn this rule on. + * + * @module hard-break-spaces + * @summary + * remark-lint rule to warn when more spaces are used than needed + * for hard breaks. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module hard-break-spaces - * @fileoverview - * Warn when too many spaces are used to create a hard break. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-hard-break-spaces/readme.md b/packages/remark-lint-hard-break-spaces/readme.md index c207b259..3200134a 100644 --- a/packages/remark-lint-hard-break-spaces/readme.md +++ b/packages/remark-lint-hard-break-spaces/readme.md @@ -10,7 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when too many spaces are used to create a hard break. +[`remark-lint`][mono] rule to warn when more spaces are used than needed +for hard breaks. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintHardBreakSpaces[, config])`](#unifieduseremarklinthardbreakspaces-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that hard breaks use two spaces and +not more. ## Presets @@ -21,94 +48,132 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-hard-break-spaces +``` -Note: `·` represents a space. +In Deno with [Skypack][]: -```markdown -Lorem ipsum·· -dolor sit amet +```js +import remarkLintHardBreakSpaces from 'https://cdn.skypack.dev/remark-lint-hard-break-spaces@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. +```html + +``` -##### `not-ok.md` +## Use -###### In +On the API: -Note: `·` represents a space. +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintHardBreakSpaces from 'remark-lint-hard-break-spaces' -```markdown -Lorem ipsum··· -dolor sit amet. -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintHardBreakSpaces) + .process(await read('example.md')) -```text -1:12-2:1: Use two spaces for hard line breaks + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-hard-break-spaces +remark --use remark-lint --use remark-lint-hard-break-spaces example.md ``` -This package exports no identifiers. -The default export is `remarkLintHardBreakSpaces`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-hard-break-spaces", + "remark-lint", ++ "remark-lint-hard-break-spaces", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-hard-break-spaces readme.md +This package exports no identifiers. +The default export is `remarkLintHardBreakSpaces`. + +### `unified().use(remarkLintHardBreakSpaces[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Less than two spaces do not create a hard breaks and more than two spaces +have no effect. +Due to this, it’s recommended to turn this rule on. + +## Examples + +##### `ok.md` + +###### In + +> 👉 **Note**: `·` represents a space. + +```markdown +Lorem ipsum·· +dolor sit amet ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintHardBreakSpaces from 'remark-lint-hard-break-spaces' - - remark() - .use(remarkLint) -+ .use(remarkLintHardBreakSpaces) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: `·` represents a space. + +```markdown +Lorem ipsum··· +dolor sit amet. ``` +###### Out + +```text +1:12-2:1: Use two spaces for hard line breaks +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -149,17 +214,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-heading-increment/index.js b/packages/remark-lint-heading-increment/index.js index 5fd2e20f..c4634eae 100644 --- a/packages/remark-lint-heading-increment/index.js +++ b/packages/remark-lint-heading-increment/index.js @@ -1,11 +1,30 @@ /** + * ## When should I use this? + * + * You can use this package to check that heading ranks increment with one + * at a time. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * While markdown is not only used for HTML, HTML accessibility guidelines + * state that headings should increment by one at a time. + * As in, say the previous heading had a rank of 2 (so `

`), then the + * following heading that is to be considered “inside” it should have a rank of + * 3 (`

`). + * Due to this, it’s recommended that when HTML output is a goal of the + * document, that this rule is turned on. + * + * @module heading-increment + * @summary + * remark-lint rule to warn when heading ranks increment with more than + * 1 at a time. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module heading-increment - * @fileoverview - * Warn when headings increment with more than 1 level at a time. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-heading-increment/readme.md b/packages/remark-lint-heading-increment/readme.md index 9a3593a7..fbbcc2f8 100644 --- a/packages/remark-lint-heading-increment/readme.md +++ b/packages/remark-lint-heading-increment/readme.md @@ -10,7 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when headings increment with more than 1 level at a time. +[`remark-lint`][mono] rule to warn when heading ranks increment with more than +1 at a time. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintHeadingIncrement[, config])`](#unifieduseremarklintheadingincrement-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that heading ranks increment with one +at a time. ## Presets @@ -20,92 +47,134 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-heading-increment +``` -```markdown -# Alpha +In Deno with [Skypack][]: -## Bravo +```js +import remarkLintHeadingIncrement from 'https://cdn.skypack.dev/remark-lint-heading-increment@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. +```html + +``` -##### `not-ok.md` +## Use -###### In +On the API: -```markdown -# Charlie +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintHeadingIncrement from 'remark-lint-heading-increment' -### Delta -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintHeadingIncrement) + .process(await read('example.md')) -```text -3:1-3:10: Heading levels should increment by one level at a time + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-heading-increment +remark --use remark-lint --use remark-lint-heading-increment example.md ``` -This package exports no identifiers. -The default export is `remarkLintHeadingIncrement`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-heading-increment", + "remark-lint", ++ "remark-lint-heading-increment", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-heading-increment readme.md +This package exports no identifiers. +The default export is `remarkLintHeadingIncrement`. + +### `unified().use(remarkLintHeadingIncrement[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +While markdown is not only used for HTML, HTML accessibility guidelines +state that headings should increment by one at a time. +As in, say the previous heading had a rank of 2 (so `

`), then the +following heading that is to be considered “inside” it should have a rank of +3 (`

`). +Due to this, it’s recommended that when HTML output is a goal of the +document, that this rule is turned on. + +## Examples + +##### `ok.md` + +###### In + +```markdown +# Alpha + +## Bravo ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintHeadingIncrement from 'remark-lint-heading-increment' - - remark() - .use(remarkLint) -+ .use(remarkLintHeadingIncrement) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +# Charlie + +### Delta ``` +###### Out + +```text +3:1-3:10: Heading levels should increment by one level at a time +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -146,17 +215,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-heading-style/index.js b/packages/remark-lint-heading-style/index.js index 429d84f0..f2d2b915 100644 --- a/packages/remark-lint-heading-style/index.js +++ b/packages/remark-lint-heading-style/index.js @@ -1,30 +1,66 @@ /** + * ## When should I use this? + * + * You can use this package to check that headings are consistent. + * + * ## API + * + * The following options (default: `'consistent'`) are accepted: + * + * * `'atx'` + * — prefer ATX headings: + * ```markdown + * ## Hello + * ``` + * * `'atx-closed'` + * — prefer ATX headings with a closing sequence: + * ```markdown + * ## Hello ## + * ``` + * * `'setext'` + * — prefer setext headings: + * ```markdown + * Hello + * ----- + * ``` + * * `'consistent'` + * — detect the first used style and warn when further headings differ + * + * ## Recommendation + * + * Setext headings are limited in that they can only construct headings with a + * rank of one and two. + * On the other hand, they do allow multiple lines of content whereas ATX only + * allows one line. + * The number of used markers in their underline does not matter, leading to + * either: + * + * * 1 marker (`Hello\n-`), which is the bare minimum, and for rank 2 headings + * looks suspiciously like an empty list item + * * using as many markers as the content (`Hello\n-----`), which is hard to + * maintain + * * an arbitrary number (`Hello\n---`), which for rank 2 headings looks + * suspiciously like a thematic break + * + * Setext headings are also rather uncommon. + * Using a sequence of hashes at the end of ATX headings is even more uncommon. + * Due to this, it’s recommended to prefer ATX headings. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats headings as ATX by default. + * The other styles can be configured with + * [`setext: true`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionssetext) + * or + * [`closeAtx: true`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionscloseatx). + * + * @module heading-style + * @summary + * remark-lint rule to warn when headings violate a given style. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module heading-style - * @fileoverview - * Warn when a heading does not conform to a given style. - * - * Options: `'consistent'`, `'atx'`, `'atx-closed'`, or `'setext'`, - * default: `'consistent'`. - * - * `'consistent'` detects the first used heading style and warns when - * subsequent headings use different styles. - * - * ## Fix - * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats headings as ATX by default. - * This can be configured with the - * [`setext`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionssetext) - * and - * [`closeAtx`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionscloseatx) - * options. - * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. - * * @example * {"name": "ok.md", "setting": "atx"} * diff --git a/packages/remark-lint-heading-style/readme.md b/packages/remark-lint-heading-style/readme.md index 680df304..1eaa2549 100644 --- a/packages/remark-lint-heading-style/readme.md +++ b/packages/remark-lint-heading-style/readme.md @@ -10,26 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when a heading does not conform to a given style. +[`remark-lint`][mono] rule to warn when headings violate a given style. -Options: `'consistent'`, `'atx'`, `'atx-closed'`, or `'setext'`, -default: `'consistent'`. +## Contents -`'consistent'` detects the first used heading style and warns when -subsequent headings use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintHeadingStyle[, config])`](#unifieduseremarklintheadingstyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats headings as ATX by default. -This can be configured with the -[`setext`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionssetext) -and -[`closeAtx`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionscloseatx) -options. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that headings are consistent. ## Presets @@ -40,7 +47,134 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'atx'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-heading-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintHeadingStyle from 'https://cdn.skypack.dev/remark-lint-heading-style@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintHeadingStyle from 'remark-lint-heading-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintHeadingStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-heading-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-heading-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintHeadingStyle`. + +### `unified().use(remarkLintHeadingStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'atx'` + — prefer ATX headings: + ```markdown + ## Hello + ``` +* `'atx-closed'` + — prefer ATX headings with a closing sequence: + ```markdown + ## Hello ## + ``` +* `'setext'` + — prefer setext headings: + ```markdown + Hello + ----- + ``` +* `'consistent'` + — detect the first used style and warn when further headings differ + +## Recommendation + +Setext headings are limited in that they can only construct headings with a +rank of one and two. +On the other hand, they do allow multiple lines of content whereas ATX only +allows one line. +The number of used markers in their underline does not matter, leading to +either: + +* 1 marker (`Hello\n-`), which is the bare minimum, and for rank 2 headings + looks suspiciously like an empty list item +* using as many markers as the content (`Hello\n-----`), which is hard to + maintain +* an arbitrary number (`Hello\n---`), which for rank 2 headings looks + suspiciously like a thematic break + +Setext headings are also rather uncommon. +Using a sequence of hashes at the end of ATX headings is even more uncommon. +Due to this, it’s recommended to prefer ATX headings. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats headings as ATX by default. +The other styles can be configured with +[`setext: true`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionssetext) +or +[`closeAtx: true`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionscloseatx). + +## Examples ##### `ok.md` @@ -128,59 +262,12 @@ When configured with `'💩'`. 1:1: Incorrect heading style type `💩`: use either `'consistent'`, `'atx'`, `'atx-closed'`, or `'setext'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-heading-style -``` - -This package exports no identifiers. -The default export is `remarkLintHeadingStyle`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-heading-style", - … - ] - } - … -``` - -Or use it on the CLI directly +## Compatibility -```sh -remark -u lint -u lint-heading-style readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintHeadingStyle from 'remark-lint-heading-style' - - remark() - .use(remarkLint) -+ .use(remarkLintHeadingStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -222,17 +309,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-linebreak-style/index.js b/packages/remark-lint-linebreak-style/index.js index 6a4144e6..ba898420 100644 --- a/packages/remark-lint-linebreak-style/index.js +++ b/packages/remark-lint-linebreak-style/index.js @@ -1,23 +1,37 @@ /** - * @author Titus Wormer - * @copyright 2017 Titus Wormer - * @license MIT - * @module linebreak-style - * @fileoverview - * Warn when linebreaks violate a given or detected style. + * ## When should I use this? + * + * You can use this package to check that line endings are consistent. + * + * ## API * - * Options: either `'unix'` (for `\n`, denoted as `␊`), `'windows'` (for `\r\n`, - * denoted as `␍␊`), or `'consistent'` (to detect the first used linebreak in - * a file). Default: `'consistent'`. * - * ## Fix + * The following options (default: `'consistent'`) are accepted: * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * always uses unix linebreaks. + * * `'unix'` + * — prefer Unix line endings (`\n`, `␊`): + * * `'window'` + * — prefer Windows line endings (`\r\n`, `␍␊`): + * * `'consistent'` + * — detect the first used style and warn when further line endings differ * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Recommendation * + * In Git projects, you can configure it to automatically switch between line + * endings based on who checks the repo out. + * In other places, you might manually want to force that one or the other is + * used, in which case this rule can be used and configured. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * always uses Unix linebreaks. + * @module linebreak-style + * @summary + * remark-lint rule to warn when line endings don’t match a given style. + * @author Titus Wormer + * @copyright 2017 Titus Wormer + * @license MIT * @example * {"name": "ok-consistent-as-windows.md"} * diff --git a/packages/remark-lint-linebreak-style/readme.md b/packages/remark-lint-linebreak-style/readme.md index 17a2351a..93672f4c 100644 --- a/packages/remark-lint-linebreak-style/readme.md +++ b/packages/remark-lint-linebreak-style/readme.md @@ -10,31 +10,143 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when linebreaks violate a given or detected style. +[`remark-lint`][mono] rule to warn when line endings don’t match a given style. -Options: either `'unix'` (for `\n`, denoted as `␊`), `'windows'` (for `\r\n`, -denoted as `␍␊`), or `'consistent'` (to detect the first used linebreak in -a file). Default: `'consistent'`. +## Contents -## Fix +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintLinebreakStyle[, config])`](#unifieduseremarklintlinebreakstyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -always uses unix linebreaks. +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that line endings are consistent. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-linebreak-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintLinebreakStyle from 'https://cdn.skypack.dev/remark-lint-linebreak-style@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintLinebreakStyle from 'remark-lint-linebreak-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintLinebreakStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-linebreak-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-linebreak-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintLinebreakStyle`. + +### `unified().use(remarkLintLinebreakStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: -## Example +* `'unix'` + — prefer Unix line endings (`\n`, `␊`): +* `'window'` + — prefer Windows line endings (`\r\n`, `␍␊`): +* `'consistent'` + — detect the first used style and warn when further line endings differ + +## Recommendation + +In Git projects, you can configure it to automatically switch between line +endings based on who checks the repo out. +In other places, you might manually want to force that one or the other is +used, in which case this rule can be used and configured. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +always uses Unix linebreaks. + +## Examples ##### `ok-consistent-as-windows.md` ###### In -Note: `␍␊` represents a carriage return and a line feed. +> 👉 **Note**: `␍␊` represents a carriage return and a line feed. ```markdown Alpha␍␊ @@ -49,7 +161,7 @@ No messages. ###### In -Note: `␊` represents a line feed. +> 👉 **Note**: `␊` represents a line feed. ```markdown Alpha␊ @@ -66,7 +178,7 @@ When configured with `'unix'`. ###### In -Note: `␍␊` represents a carriage return and a line feed. +> 👉 **Note**: `␍␊` represents a carriage return and a line feed. ```markdown Alpha␍␊ @@ -84,7 +196,7 @@ When configured with `'windows'`. ###### In -Note: `␊` represents a line feed. +> 👉 **Note**: `␊` represents a line feed. ```markdown Alpha␊ @@ -96,59 +208,12 @@ Alpha␊ 1:6: Expected linebreaks to be windows (`\r\n`), not unix (`\n`) ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-linebreak-style -``` - -This package exports no identifiers. -The default export is `remarkLintLinebreakStyle`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-linebreak-style", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-linebreak-style readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintLinebreakStyle from 'remark-lint-linebreak-style' - - remark() - .use(remarkLint) -+ .use(remarkLintLinebreakStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -190,17 +255,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-link-title-style/index.js b/packages/remark-lint-link-title-style/index.js index 07e60ec1..e13c7219 100644 --- a/packages/remark-lint-link-title-style/index.js +++ b/packages/remark-lint-link-title-style/index.js @@ -1,25 +1,48 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module link-title-style - * @fileoverview - * Warn when link and definition titles occur with incorrect quotes. + * ## When should I use this? + * + * You can use this package to check that title markers are consistent. + * + * ## API * - * Options: `'consistent'`, `'"'`, `'\''`, or `'()'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used quote style and warns when subsequent - * titles use different styles. + * * `'"'` + * — prefer double quotes + * * `"'"` + * — prefer single quotes + * * `'()'` + * — prefer parens + * * `'consistent'` + * — detect the first used style and warn when further titles differ * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * uses `'` (single quote) for titles if they contain a double quote, and `"` - * (double quotes) otherwise. + * Parens in titles were not supported in markdown before CommonMark. + * While they should work in most places now, not all markdown parsers follow + * CommonMark. + * Parens for titles also arguably look a bit weird because they’re inside more + * parens: `[text](url (title))`. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * In HTML, attributes are commonly written with double quotes. + * Due to this, titles are almost exclusively wrapped in double quotes in + * markdown, so it’s recommended to configure this rule with `'"'`. * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats titles with double quotes by default. + * Pass + * [`quote: "'"`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsquote) + * to use single quotes. + * There is no option to use parens. + * + * @module link-title-style + * @summary + * remark-lint rule to warn when title markers are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "setting": "\""} * diff --git a/packages/remark-lint-link-title-style/readme.md b/packages/remark-lint-link-title-style/readme.md index c6d11e0d..66cfec9a 100644 --- a/packages/remark-lint-link-title-style/readme.md +++ b/packages/remark-lint-link-title-style/readme.md @@ -10,21 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when link and definition titles occur with incorrect quotes. +[`remark-lint`][mono] rule to warn when title markers are inconsistent. -Options: `'consistent'`, `'"'`, `'\''`, or `'()'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used quote style and warns when subsequent -titles use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintLinkTitleStyle[, config])`](#unifieduseremarklintlinktitlestyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -uses `'` (single quote) for titles if they contain a double quote, and `"` -(double quotes) otherwise. +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that title markers are consistent. ## Presets @@ -35,7 +47,116 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'"'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-link-title-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintLinkTitleStyle from 'https://cdn.skypack.dev/remark-lint-link-title-style@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintLinkTitleStyle from 'remark-lint-link-title-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintLinkTitleStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-link-title-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-link-title-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintLinkTitleStyle`. + +### `unified().use(remarkLintLinkTitleStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'"'` + — prefer double quotes +* `"'"` + — prefer single quotes +* `'()'` + — prefer parens +* `'consistent'` + — detect the first used style and warn when further titles differ + +## Recommendation + +Parens in titles were not supported in markdown before CommonMark. +While they should work in most places now, not all markdown parsers follow +CommonMark. +Parens for titles also arguably look a bit weird because they’re inside more +parens: `[text](url (title))`. + +In HTML, attributes are commonly written with double quotes. +Due to this, titles are almost exclusively wrapped in double quotes in +markdown, so it’s recommended to configure this rule with `'"'`. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats titles with double quotes by default. +Pass +[`quote: "'"`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsquote) +to use single quotes. +There is no option to use parens. + +## Examples ##### `ok.md` @@ -168,59 +289,12 @@ When configured with `'💩'`. 1:1: Incorrect link title style marker `💩`: use either `'consistent'`, `'"'`, `'\''`, or `'()'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-link-title-style -``` - -This package exports no identifiers. -The default export is `remarkLintLinkTitleStyle`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-link-title-style", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-link-title-style readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintLinkTitleStyle from 'remark-lint-link-title-style' - - remark() - .use(remarkLint) -+ .use(remarkLintLinkTitleStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -262,17 +336,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-list-item-bullet-indent/index.js b/packages/remark-lint-list-item-bullet-indent/index.js index 5e8f8f06..fc849e7d 100644 --- a/packages/remark-lint-list-item-bullet-indent/index.js +++ b/packages/remark-lint-list-item-bullet-indent/index.js @@ -1,19 +1,40 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module list-item-bullet-indent - * @fileoverview - * Warn when list item bullets are indented. + * ## When should I use this? + * + * You can use this package to check that list items are not indented. + * + * ## API + * + * There are no options. * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * removes all indentation before bullets. + * There is no specific handling of indented list items (or anything else) in + * markdown. + * While it is possible to use an indent to align ordered lists on their marker: * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ```markdown + * 1. One + * 10. Ten + * 100. Hundred + * ``` * + * …such a style is uncommon and a bit hard to maintain: adding a 10th item + * means 9 other items have to change (more arduous, while unlikely, would be + * the 100th item). + * Hence, it’s recommended to not indent items and to turn this rule on. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats all items without indent. + * + * @module list-item-bullet-indent + * @summary + * remark-lint rule to warn when list items are indented. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-list-item-bullet-indent/readme.md b/packages/remark-lint-list-item-bullet-indent/readme.md index 615757a9..b1b6e2a3 100644 --- a/packages/remark-lint-list-item-bullet-indent/readme.md +++ b/packages/remark-lint-list-item-bullet-indent/readme.md @@ -10,15 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when list item bullets are indented. +[`remark-lint`][mono] rule to warn when list items are indented. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintListItemBulletIndent[, config])`](#unifieduseremarklintlistitembulletindent-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -removes all indentation before bullets. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that list items are not indented. ## Presets @@ -28,97 +46,151 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-list-item-bullet-indent +``` -```markdown -Paragraph. +In Deno with [Skypack][]: -* List item -* List item +```js +import remarkLintListItemBulletIndent from 'https://cdn.skypack.dev/remark-lint-list-item-bullet-indent@4?dts' ``` -###### Out - -No messages. +In browsers with [Skypack][]: -##### `not-ok.md` +```html + +``` -###### In +## Use -Note: `·` represents a space. +On the API: -```markdown -Paragraph. +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintListItemBulletIndent from 'remark-lint-list-item-bullet-indent' -·* List item -·* List item -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintListItemBulletIndent) + .process(await read('example.md')) -```text -3:2: Incorrect indentation before bullet: remove 1 space -4:2: Incorrect indentation before bullet: remove 1 space + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-list-item-bullet-indent +remark --use remark-lint --use remark-lint-list-item-bullet-indent example.md ``` -This package exports no identifiers. -The default export is `remarkLintListItemBulletIndent`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-list-item-bullet-indent", + "remark-lint", ++ "remark-lint-list-item-bullet-indent", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-list-item-bullet-indent readme.md +This package exports no identifiers. +The default export is `remarkLintListItemBulletIndent`. + +### `unified().use(remarkLintListItemBulletIndent[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +There is no specific handling of indented list items (or anything else) in +markdown. +While it is possible to use an indent to align ordered lists on their marker: + +```markdown + 1. One + 10. Ten +100. Hundred ``` -Or use this on the API: +…such a style is uncommon and a bit hard to maintain: adding a 10th item +means 9 other items have to change (more arduous, while unlikely, would be +the 100th item). +Hence, it’s recommended to not indent items and to turn this rule on. -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintListItemBulletIndent from 'remark-lint-list-item-bullet-indent' - - remark() - .use(remarkLint) -+ .use(remarkLintListItemBulletIndent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats all items without indent. + +## Examples + +##### `ok.md` + +###### In + +```markdown +Paragraph. + +* List item +* List item +``` + +###### Out + +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: `·` represents a space. + +```markdown +Paragraph. + +·* List item +·* List item ``` +###### Out + +```text +3:2: Incorrect indentation before bullet: remove 1 space +4:2: Incorrect indentation before bullet: remove 1 space +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -159,17 +231,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-list-item-content-indent/index.js b/packages/remark-lint-list-item-content-indent/index.js index 265e9f1a..23fefd2e 100644 --- a/packages/remark-lint-list-item-content-indent/index.js +++ b/packages/remark-lint-list-item-content-indent/index.js @@ -1,11 +1,28 @@ /** + * ## When should I use this? + * + * You can use this package to check that list item content is aligned. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * The position of the first child in a list item matters. + * Further children should align with it. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * aligns the content of items. + * + * @module list-item-content-indent + * @summary + * remark-lint rule to warn when list item content is not aligned. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module list-item-content-indent - * @fileoverview - * Warn when the content of a list item has mixed indentation. - * * @example * {"name": "ok.md", "gfm": true} * @@ -59,11 +76,12 @@ const remarkLintListItemContentIndent = lintRule( continue } - // Get indentation for the first child. Only the first item can have a - // checkbox, so here we remove that from the column. + // Get indentation for the first child. + // Only the first item can have a checkbox, so here we remove that from + // the column. if (index === 0) { - // If there’s a checkbox before the content, look backwards to find the - // start of that checkbox. + // If there’s a checkbox before the content, look backwards to find + // the start of that checkbox. if (typeof node.checked === 'boolean') { let char = begin.offset - 1 diff --git a/packages/remark-lint-list-item-content-indent/readme.md b/packages/remark-lint-list-item-content-indent/readme.md index 27a75520..ad2f7eed 100644 --- a/packages/remark-lint-list-item-content-indent/readme.md +++ b/packages/remark-lint-list-item-content-indent/readme.md @@ -10,7 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the content of a list item has mixed indentation. +[`remark-lint`][mono] rule to warn when list item content is not aligned. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintListItemContentIndent[, config])`](#unifieduseremarklintlistitemcontentindent-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that list item content is aligned. ## Presets @@ -21,98 +47,140 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In - -Note: this example uses [GFM][]. +```sh +npm install remark-lint-list-item-content-indent +``` -Note: `·` represents a space. +In Deno with [Skypack][]: -```markdown -1.·[x] Alpha -···1. Bravo +```js +import remarkLintListItemContentIndent from 'https://cdn.skypack.dev/remark-lint-list-item-content-indent@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. - -##### `not-ok.md` +```html + +``` -###### In +## Use -Note: this example uses [GFM][]. +On the API: -Note: `·` represents a space. +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintListItemContentIndent from 'remark-lint-list-item-content-indent' -```markdown -1.·[x] Charlie -····1. Delta -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintListItemContentIndent) + .process(await read('example.md')) -```text -2:5: Don’t use mixed indentation for children, remove 1 space + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-list-item-content-indent +remark --use remark-lint --use remark-lint-list-item-content-indent example.md ``` -This package exports no identifiers. -The default export is `remarkLintListItemContentIndent`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-list-item-content-indent", + "remark-lint", ++ "remark-lint-list-item-content-indent", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-list-item-content-indent readme.md +This package exports no identifiers. +The default export is `remarkLintListItemContentIndent`. + +### `unified().use(remarkLintListItemContentIndent[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +The position of the first child in a list item matters. +Further children should align with it. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +aligns the content of items. + +## Examples + +##### `ok.md` + +###### In + +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). + +> 👉 **Note**: `·` represents a space. + +```markdown +1.·[x] Alpha +···1. Bravo ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintListItemContentIndent from 'remark-lint-list-item-content-indent' - - remark() - .use(remarkLint) -+ .use(remarkLintListItemContentIndent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). + +> 👉 **Note**: `·` represents a space. + +```markdown +1.·[x] Charlie +····1. Delta ``` +###### Out + +```text +2:5: Don’t use mixed indentation for children, remove 1 space +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -153,17 +221,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-list-item-indent/index.js b/packages/remark-lint-list-item-indent/index.js index 44e7c78a..bec559bd 100644 --- a/packages/remark-lint-list-item-indent/index.js +++ b/packages/remark-lint-list-item-indent/index.js @@ -1,27 +1,64 @@ /** + * ## When should I use this? + * + * You can use this package to check that the spacing between list item markers + * and content is inconsistent. + * + * ## API + * + * The following options (default: `'tab-size'`) are accepted: + * + * * `'space'` + * — prefer a single space + * * `'tab-size'` + * — prefer spaces the size of the next tab stop + * * `'mixed'` + * — prefer `'space'` for tight lists and `'tab-size'` for loose lists + * + * ## Recommendation + * + * First, some background. + * The number of spaces that occur after list markers (`*`, `-`, and `+` for + * unordered lists, or `.` and `)` for unordered lists) and before the content + * on the first line, defines how much indentation can be used for further + * lines. + * At least one space is required and up to 4 spaces are allowed (if there is no + * further content after the marker then it’s a blank line which is handled as + * if there was one space; if there are 5 or more spaces and then content, it’s + * also seen as one space and the rest is seen as indented code). + * + * There are two types of lists in markdown (other than ordered and unordered): + * tight and loose lists. + * Lists are tight by default but if there is a blank line between two list + * items or between two blocks inside an item, that turns the whole list into a + * loose list. + * When turning markdown into HTML, paragraphs in tight lists are not wrapped + * in `

` tags. + * + * Historically, how indentation of lists works in markdown has been a mess, + * especially with how they interact with indented code. + * CommonMark made that a *lot* better, but there remain (documented but + * complex) edge cases and some behavior intuitive. + * Due to this, the default of this list is `'tab-size'`, which worked the best + * in most markdown parsers. + * Currently, the situation between markdown parsers is better, so choosing + * `'space'` (which seems to be the most common style used by authors) should + * be okay. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * uses `'tab-size'` (named `'tab'` there) by default. + * [`listItemIndent: '1'` (for `'space'`) or `listItemIndent: 'mixed'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionslistitemindent) + * is supported. + * + * @module list-item-indent + * @summary + * remark-lint rule to warn when spacing between list item markers and + * content is inconsistent. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module list-item-indent - * @fileoverview - * Warn when the spacing between a list item’s bullet and its content violates - * a given style. - * - * Options: `'tab-size'`, `'mixed'`, or `'space'`, default: `'tab-size'`. - * - * ## Fix - * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * uses `'tab-size'` (named `'tab'` there) by default to ensure Markdown is - * seen the same way across vendors. - * This can be configured with the - * [`listItemIndent`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionslistitemindent) - * option. - * This rule’s `'space'` option is named `'1'` there. - * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-list-item-indent/readme.md b/packages/remark-lint-list-item-indent/readme.md index e3e8971c..cf15e419 100644 --- a/packages/remark-lint-list-item-indent/readme.md +++ b/packages/remark-lint-list-item-indent/readme.md @@ -10,23 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the spacing between a list item’s bullet and its content violates -a given style. +[`remark-lint`][mono] rule to warn when spacing between list item markers and +content is inconsistent. -Options: `'tab-size'`, `'mixed'`, or `'space'`, default: `'tab-size'`. +## Contents -## Fix +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintListItemIndent[, config])`](#unifieduseremarklintlistitemindent-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -uses `'tab-size'` (named `'tab'` there) by default to ensure Markdown is -seen the same way across vendors. -This can be configured with the -[`listItemIndent`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionslistitemindent) -option. -This rule’s `'space'` option is named `'1'` there. +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that the spacing between list item markers +and content is inconsistent. ## Presets @@ -37,13 +49,136 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'mixed'` | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | `'tab-size'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-list-item-indent +``` + +In Deno with [Skypack][]: + +```js +import remarkLintListItemIndent from 'https://cdn.skypack.dev/remark-lint-list-item-indent@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintListItemIndent from 'remark-lint-list-item-indent' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintListItemIndent) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-list-item-indent example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-list-item-indent", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintListItemIndent`. + +### `unified().use(remarkLintListItemIndent[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'tab-size'`) are accepted: + +* `'space'` + — prefer a single space +* `'tab-size'` + — prefer spaces the size of the next tab stop +* `'mixed'` + — prefer `'space'` for tight lists and `'tab-size'` for loose lists + +## Recommendation + +First, some background. +The number of spaces that occur after list markers (`*`, `-`, and `+` for +unordered lists, or `.` and `)` for unordered lists) and before the content +on the first line, defines how much indentation can be used for further +lines. +At least one space is required and up to 4 spaces are allowed (if there is no +further content after the marker then it’s a blank line which is handled as +if there was one space; if there are 5 or more spaces and then content, it’s +also seen as one space and the rest is seen as indented code). + +There are two types of lists in markdown (other than ordered and unordered): +tight and loose lists. +Lists are tight by default but if there is a blank line between two list +items or between two blocks inside an item, that turns the whole list into a +loose list. +When turning markdown into HTML, paragraphs in tight lists are not wrapped +in `

` tags. + +Historically, how indentation of lists works in markdown has been a mess, +especially with how they interact with indented code. +CommonMark made that a *lot* better, but there remain (documented but +complex) edge cases and some behavior intuitive. +Due to this, the default of this list is `'tab-size'`, which worked the best +in most markdown parsers. +Currently, the situation between markdown parsers is better, so choosing +`'space'` (which seems to be the most common style used by authors) should +be okay. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +uses `'tab-size'` (named `'tab'` there) by default. +[`listItemIndent: '1'` (for `'space'`) or `listItemIndent: 'mixed'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionslistitemindent) +is supported. + +## Examples ##### `ok.md` ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown *···List @@ -73,7 +208,7 @@ When configured with `'mixed'`. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown *·List item. @@ -101,7 +236,7 @@ When configured with `'mixed'`. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown *···List item. @@ -119,7 +254,7 @@ When configured with `'space'`. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown *·List item. @@ -147,7 +282,7 @@ When configured with `'space'`. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown *···List @@ -166,7 +301,7 @@ When configured with `'tab-size'`. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown *·List @@ -189,59 +324,12 @@ When configured with `'💩'`. 1:1: Incorrect list-item indent style `💩`: use either `'tab-size'`, `'space'`, or `'mixed'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +## Compatibility -[npm][]: - -```sh -npm install remark-lint-list-item-indent -``` - -This package exports no identifiers. -The default export is `remarkLintListItemIndent`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-list-item-indent", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-list-item-indent readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintListItemIndent from 'remark-lint-list-item-indent' - - remark() - .use(remarkLint) -+ .use(remarkLintListItemIndent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -283,17 +371,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-list-item-spacing/index.js b/packages/remark-lint-list-item-spacing/index.js index 26e534d8..8bb8f0ed 100644 --- a/packages/remark-lint-list-item-spacing/index.js +++ b/packages/remark-lint-list-item-spacing/index.js @@ -1,25 +1,43 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module list-item-spacing - * @fileoverview - * Warn when list looseness is incorrect, such as being tight when it should - * be loose, and vice versa. + * ## When should I use this? + * + * You can use this package to check that lists are loose or tight when + * they should be. + * + * ## API * - * According to the [`markdown-style-guide`](http://www.cirosantilli.com/markdown-style-guide/), - * if one or more list items in a list spans more than one line, the list is - * required to have blank lines between each item. - * And otherwise, there should not be blank lines between items. + * The following options (default: `undefined`) are accepted: * - * By default, all items must be spread out (a blank line must be between - * them) if one or more items are multiline (span more than one line). - * Otherwise, the list must be tight (no blank line must be between items). + * * `Object` with the following fields: + * * `checkBlanks` (`boolean`, default: `false`) + * — adhere to CommonMark looseness instead of markdown-style-guide + * preference * - * If you pass `{checkBlanks: true}`, all items must be spread out if one or - * more items contain blank lines. - * Otherwise, the list must be tight. + * ## Recommendation * + * First, some background. + * There are two types of lists in markdown (other than ordered and unordered): + * tight and loose lists. + * Lists are tight by default but if there is a blank line between two list + * items or between two blocks inside an item, that turns the whole list into a + * loose list. + * When turning markdown into HTML, paragraphs in tight lists are not wrapped + * in `

` tags. + * + * This rule defaults to the + * [`markdown style guide`](https://cirosantilli.com/markdown-style-guide/) + * preference for which lists should be loose or not: loose when at least one + * item spans more than one line, tight otherwise. + * With `{checkBlanks: true}`, this rule dictates that when at least one item is + * loose, all items must be loose. + * + * @module list-item-spacing + * @summary + * remark-lint rule to warn when lists are loose when they should be tight, + * or vice versa. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-list-item-spacing/readme.md b/packages/remark-lint-list-item-spacing/readme.md index 262f0b7a..154c25d5 100644 --- a/packages/remark-lint-list-item-spacing/readme.md +++ b/packages/remark-lint-list-item-spacing/readme.md @@ -10,21 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when list looseness is incorrect, such as being tight when it should -be loose, and vice versa. +[`remark-lint`][mono] rule to warn when lists are loose when they should be tight, +or vice versa. -According to the [`markdown-style-guide`](http://www.cirosantilli.com/markdown-style-guide/), -if one or more list items in a list spans more than one line, the list is -required to have blank lines between each item. -And otherwise, there should not be blank lines between items. +## Contents -By default, all items must be spread out (a blank line must be between -them) if one or more items are multiline (span more than one line). -Otherwise, the list must be tight (no blank line must be between items). +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintListItemSpacing[, config])`](#unifieduseremarklintlistitemspacing-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -If you pass `{checkBlanks: true}`, all items must be spread out if one or -more items contain blank lines. -Otherwise, the list must be tight. +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that lists are loose or tight when +they should be. ## Presets @@ -34,7 +47,109 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-list-item-spacing +``` + +In Deno with [Skypack][]: + +```js +import remarkLintListItemSpacing from 'https://cdn.skypack.dev/remark-lint-list-item-spacing@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintListItemSpacing from 'remark-lint-list-item-spacing' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintListItemSpacing) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-list-item-spacing example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-list-item-spacing", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintListItemSpacing`. + +### `unified().use(remarkLintListItemSpacing[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `undefined`) are accepted: + +* `Object` with the following fields: + * `checkBlanks` (`boolean`, default: `false`) + — adhere to CommonMark looseness instead of markdown-style-guide + preference + +## Recommendation + +First, some background. +There are two types of lists in markdown (other than ordered and unordered): +tight and loose lists. +Lists are tight by default but if there is a blank line between two list +items or between two blocks inside an item, that turns the whole list into a +loose list. +When turning markdown into HTML, paragraphs in tight lists are not wrapped +in `

` tags. + +This rule defaults to the +[`markdown style guide`](https://cirosantilli.com/markdown-style-guide/) +preference for which lists should be loose or not: loose when at least one +item spans more than one line, tight otherwise. +With `{checkBlanks: true}`, this rule dictates that when at least one item is +loose, all items must be loose. + +## Examples ##### `ok.md` @@ -154,59 +269,12 @@ A loose list: 14:15-16:1: Extraneous new line after list item ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-list-item-spacing -``` - -This package exports no identifiers. -The default export is `remarkLintListItemSpacing`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-list-item-spacing", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-list-item-spacing readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintListItemSpacing from 'remark-lint-list-item-spacing' - - remark() - .use(remarkLint) -+ .use(remarkLintListItemSpacing) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -248,17 +316,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-maximum-heading-length/index.js b/packages/remark-lint-maximum-heading-length/index.js index 84dcc703..a40ea022 100644 --- a/packages/remark-lint-maximum-heading-length/index.js +++ b/packages/remark-lint-maximum-heading-length/index.js @@ -1,15 +1,31 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module maximum-heading-length - * @fileoverview - * Warn when headings are too long. + * ## When should I use this? + * + * You can use this package to check that heading text is within reason. + * + * ## API + * + * The following options (default: `60`) are accepted: * - * Options: `number`, default: `60`. + * * `number` (example: `72`) + * — max number of characters to accept in heading text * - * Ignores Markdown syntax, only checks the plain text content. + * Ignores syntax, only checks the plain text content. * + * ## Recommendation + * + * While this rule is sometimes annoying, reasonable size headings + * do help SEO purposes (bots prefer reasonable headings), visual users + * (headings are typically displayed quite large), and users of screen readers + * (who typically use “jump to heading” features to navigate within a page, + * which reads every heading out loud). + * + * @module maximum-heading-length + * @summary + * remark-lint rule to warn when headings are too long. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-maximum-heading-length/readme.md b/packages/remark-lint-maximum-heading-length/readme.md index 109f9b8a..11044fdb 100644 --- a/packages/remark-lint-maximum-heading-length/readme.md +++ b/packages/remark-lint-maximum-heading-length/readme.md @@ -10,11 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when headings are too long. +[`remark-lint`][mono] rule to warn when headings are too long. -Options: `number`, default: `60`. +## Contents -Ignores Markdown syntax, only checks the plain text content. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintMaximumHeadingLength[, config])`](#unifieduseremarklintmaximumheadinglength-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that heading text is within reason. ## Presets @@ -24,92 +45,137 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example - -##### `not-ok.md` - -When configured with `40`. +## Install -###### In +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -```markdown -# Alpha bravo charlie delta echo foxtrot golf hotel +```sh +npm install remark-lint-maximum-heading-length ``` -###### Out +In Deno with [Skypack][]: -```text -1:1-1:52: Use headings shorter than `40` +```js +import remarkLintMaximumHeadingLength from 'https://cdn.skypack.dev/remark-lint-maximum-heading-length@3?dts' ``` -##### `ok.md` - -###### In - -```markdown -# Alpha bravo charlie delta echo foxtrot golf hotel +In browsers with [Skypack][]: -# ![Alpha bravo charlie delta echo foxtrot golf hotel](http://example.com/nato.png) +```html + ``` -###### Out +## Use -No messages. +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintMaximumHeadingLength from 'remark-lint-maximum-heading-length' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintMaximumHeadingLength) + .process(await read('example.md')) -```sh -npm install remark-lint-maximum-heading-length + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintMaximumHeadingLength`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-maximum-heading-length example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-maximum-heading-length", + "remark-lint", ++ "remark-lint-maximum-heading-length", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-maximum-heading-length readme.md +This package exports no identifiers. +The default export is `remarkLintMaximumHeadingLength`. + +### `unified().use(remarkLintMaximumHeadingLength[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `60`) are accepted: + +* `number` (example: `72`) + — max number of characters to accept in heading text + +Ignores syntax, only checks the plain text content. + +## Recommendation + +While this rule is sometimes annoying, reasonable size headings +do help SEO purposes (bots prefer reasonable headings), visual users +(headings are typically displayed quite large), and users of screen readers +(who typically use “jump to heading” features to navigate within a page, +which reads every heading out loud). + +## Examples + +##### `not-ok.md` + +When configured with `40`. + +###### In + +```markdown +# Alpha bravo charlie delta echo foxtrot golf hotel ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintMaximumHeadingLength from 'remark-lint-maximum-heading-length' - - remark() - .use(remarkLint) -+ .use(remarkLintMaximumHeadingLength) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +```text +1:1-1:52: Use headings shorter than `40` ``` +##### `ok.md` + +###### In + +```markdown +# Alpha bravo charlie delta echo foxtrot golf hotel + +# ![Alpha bravo charlie delta echo foxtrot golf hotel](http://example.com/nato.png) +``` + +###### Out + +No messages. + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -150,17 +216,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-maximum-line-length/index.js b/packages/remark-lint-maximum-line-length/index.js index e130e26b..05a86523 100644 --- a/packages/remark-lint-maximum-line-length/index.js +++ b/packages/remark-lint-maximum-line-length/index.js @@ -1,19 +1,30 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module maximum-line-length - * @fileoverview - * Warn when lines are too long. + * ## When should I use this? + * + * You can use this package to check that lines do not exceed a certain size. + * + * ## API * - * Options: `number`, default: `80`. + * The following options (default: `80`) are accepted: * - * Ignores nodes that cannot be wrapped, such as headings, tables, code, - * definitions, HTML, and JSX. + * * `number` (example: `72`) + * — max number of characters to accept in heading text * - * Ignores images, links, and inline code if they start before the wrap, end - * after the wrap, and there’s no whitespace after them. + * Ignores nodes that cannot be wrapped, such as headings, tables, code, + * definitions, HTML, and JSX. + * Ignores images, links, and code (inline) if they start before the wrap, end + * after the wrap, and there’s no white space after them. * + * ## Recommendation + * + * Whether to wrap prose or not is a stylistic choice. + * + * @module maximum-line-length + * @summary + * remark-lint rule to warn when lines are too long. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "positionless": true, "gfm": true} * @@ -38,7 +49,7 @@ * *

alpha bravo charlie delta echo foxtrot golf

* - * The following is also fine, because there is no whitespace. + * The following is also fine (note the `.`), because there is no whitespace. * * . * diff --git a/packages/remark-lint-maximum-line-length/readme.md b/packages/remark-lint-maximum-line-length/readme.md index 4c1ec60c..48790f01 100644 --- a/packages/remark-lint-maximum-line-length/readme.md +++ b/packages/remark-lint-maximum-line-length/readme.md @@ -10,15 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when lines are too long. +[`remark-lint`][mono] rule to warn when lines are too long. -Options: `number`, default: `80`. +## Contents -Ignores nodes that cannot be wrapped, such as headings, tables, code, -definitions, HTML, and JSX. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintMaximumLineLength[, config])`](#unifieduseremarklintmaximumlinelength-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -Ignores images, links, and inline code if they start before the wrap, end -after the wrap, and there’s no whitespace after them. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that lines do not exceed a certain size. ## Presets @@ -28,7 +45,98 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `80` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-maximum-line-length +``` + +In Deno with [Skypack][]: + +```js +import remarkLintMaximumLineLength from 'https://cdn.skypack.dev/remark-lint-maximum-line-length@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintMaximumLineLength from 'remark-lint-maximum-line-length' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintMaximumLineLength) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-maximum-line-length example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-maximum-line-length", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintMaximumLineLength`. + +### `unified().use(remarkLintMaximumLineLength[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `80`) are accepted: + +* `number` (example: `72`) + — max number of characters to accept in heading text + +Ignores nodes that cannot be wrapped, such as headings, tables, code, +definitions, HTML, and JSX. +Ignores images, links, and code (inline) if they start before the wrap, end +after the wrap, and there’s no white space after them. + +## Recommendation + +Whether to wrap prose or not is a stylistic choice. + +## Examples ##### `ok-mixed-line-endings.md` @@ -36,9 +144,9 @@ When configured with `10`. ###### In -Note: `␍␊` represents a carriage return and a line feed. +> 👉 **Note**: `␍␊` represents a carriage return and a line feed. -Note: `␊` represents a line feed. +> 👉 **Note**: `␊` represents a line feed. ```markdown 0123456789␍␊ @@ -57,9 +165,9 @@ When configured with `10`. ###### In -Note: `␍␊` represents a carriage return and a line feed. +> 👉 **Note**: `␍␊` represents a carriage return and a line feed. -Note: `␊` represents a line feed. +> 👉 **Note**: `␊` represents a line feed. ```markdown 012345678901␍␊ @@ -112,7 +220,7 @@ And this one is also very wrong: because the code starts aaaaaaafter the column: ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown This line is simply not toooooooooooooooooooooooooooooooooooooooooooo @@ -136,7 +244,7 @@ This is also fine:

alpha bravo charlie delta echo foxtrot golf

-The following is also fine, because there is no whitespace. +The following is also fine (note the `.`), because there is no whitespace. . @@ -149,59 +257,12 @@ In addition, definitions are also fine: No messages. -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +## Compatibility -[npm][]: - -```sh -npm install remark-lint-maximum-line-length -``` - -This package exports no identifiers. -The default export is `remarkLintMaximumLineLength`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-maximum-line-length", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-maximum-line-length readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintMaximumLineLength from 'remark-lint-maximum-line-length' - - remark() - .use(remarkLint) -+ .use(remarkLintMaximumLineLength) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -243,17 +304,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-auto-link-without-protocol/index.js b/packages/remark-lint-no-auto-link-without-protocol/index.js index e0149d82..bc151af6 100644 --- a/packages/remark-lint-no-auto-link-without-protocol/index.js +++ b/packages/remark-lint-no-auto-link-without-protocol/index.js @@ -4,6 +4,7 @@ * @license MIT * @module no-auto-link-without-protocol * @deprecated + * **Stability: Legacy**. * This rule is no longer recommended for use. * With CommonMark, all autolinks (except for emails) are required to have a * protocol. diff --git a/packages/remark-lint-no-auto-link-without-protocol/readme.md b/packages/remark-lint-no-auto-link-without-protocol/readme.md index 913a94bb..29648238 100644 --- a/packages/remark-lint-no-auto-link-without-protocol/readme.md +++ b/packages/remark-lint-no-auto-link-without-protocol/readme.md @@ -2,68 +2,17 @@ # remark-lint-no-auto-link-without-protocol -[![Build][build-badge]][build] -[![Coverage][coverage-badge]][coverage] -[![Downloads][downloads-badge]][downloads] -[![Size][size-badge]][size] -[![Sponsors][sponsors-badge]][collective] -[![Backers][backers-badge]][collective] -[![Chat][chat-badge]][chat] - +**Stability: Legacy**. This rule is no longer recommended for use. With CommonMark, all autolinks (except for emails) are required to have a protocol. Otherwise they don’t parse. The previous suggestion to add a protocol to email autolinks was wrong. -## Contribute - -See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways -to get started. -See [`support.md`][support] for ways to get help. - -This project has a [code of conduct][coc]. -By interacting with this repository, organization, or community you agree to -abide by its terms. - ## License [MIT][license] © [Titus Wormer][author] -[build-badge]: https://github.com/remarkjs/remark-lint/workflows/main/badge.svg - -[build]: https://github.com/remarkjs/remark-lint/actions - -[coverage-badge]: https://img.shields.io/codecov/c/github/remarkjs/remark-lint.svg - -[coverage]: https://codecov.io/github/remarkjs/remark-lint - -[downloads-badge]: https://img.shields.io/npm/dm/remark-lint-no-auto-link-without-protocol.svg - -[downloads]: https://www.npmjs.com/package/remark-lint-no-auto-link-without-protocol - -[size-badge]: https://img.shields.io/bundlephobia/minzip/remark-lint-no-auto-link-without-protocol.svg - -[size]: https://bundlephobia.com/result?p=remark-lint-no-auto-link-without-protocol - -[sponsors-badge]: https://opencollective.com/unified/sponsors/badge.svg - -[backers-badge]: https://opencollective.com/unified/backers/badge.svg - -[collective]: https://opencollective.com/unified - -[chat-badge]: https://img.shields.io/badge/chat-discussions-success.svg - -[chat]: https://github.com/remarkjs/remark/discussions - -[health]: https://github.com/remarkjs/.github - -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md - -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md - -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md - [license]: https://github.com/remarkjs/remark-lint/blob/main/license [author]: https://wooorm.com diff --git a/packages/remark-lint-no-blockquote-without-marker/index.js b/packages/remark-lint-no-blockquote-without-marker/index.js index 122080a3..f334a99f 100644 --- a/packages/remark-lint-no-blockquote-without-marker/index.js +++ b/packages/remark-lint-no-blockquote-without-marker/index.js @@ -1,20 +1,28 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-blockquote-without-marker - * @fileoverview - * Warn when blank lines without `>` (greater than) markers are found in a - * block quote. + * ## When should I use this? + * + * You can use this package to check that lines in block quotes start with `>`. + * + * ## API * - * ## Fix + * There are no options. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * adds markers to every line in a block quote. + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * Rules around “lazy” lines are not straightforward and visually confusing, + * so it’s recommended to start each line with a `>`. * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * adds `>` markers to every line in a block quote. + * + * @module no-blockquote-without-marker + * @summary + * remark-lint rule to warn when lines in block quotes start without `>`. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-blockquote-without-marker/readme.md b/packages/remark-lint-no-blockquote-without-marker/readme.md index e92b484d..0d31f775 100644 --- a/packages/remark-lint-no-blockquote-without-marker/readme.md +++ b/packages/remark-lint-no-blockquote-without-marker/readme.md @@ -10,16 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when blank lines without `>` (greater than) markers are found in a -block quote. +[`remark-lint`][mono] rule to warn when lines in block quotes start without `>`. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoBlockquoteWithoutMarker[, config])`](#unifieduseremarklintnoblockquotewithoutmarker-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -adds markers to every line in a block quote. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that lines in block quotes start with `>`. ## Presets @@ -30,7 +47,96 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-blockquote-without-marker +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoBlockquoteWithoutMarker from 'https://cdn.skypack.dev/remark-lint-no-blockquote-without-marker@5?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoBlockquoteWithoutMarker from 'remark-lint-no-blockquote-without-marker' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoBlockquoteWithoutMarker) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-blockquote-without-marker example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-blockquote-without-marker", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoBlockquoteWithoutMarker`. + +### `unified().use(remarkLintNoBlockquoteWithoutMarker[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Rules around “lazy” lines are not straightforward and visually confusing, +so it’s recommended to start each line with a `>`. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +adds `>` markers to every line in a block quote. + +## Examples ##### `ok.md` @@ -50,7 +156,7 @@ No messages. ###### In -Note: `»` represents a tab. +> 👉 **Note**: `»` represents a tab. ```markdown >»Foo… @@ -82,7 +188,7 @@ No messages. ###### In -Note: `»` represents a tab. +> 👉 **Note**: `»` represents a tab. ```markdown >»Foo… @@ -97,59 +203,12 @@ Note: `»` represents a tab. 3:1: Missing marker in block quote ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-blockquote-without-marker -``` - -This package exports no identifiers. -The default export is `remarkLintNoBlockquoteWithoutMarker`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-blockquote-without-marker", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-blockquote-without-marker readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoBlockquoteWithoutMarker from 'remark-lint-no-blockquote-without-marker' - - remark() - .use(remarkLint) -+ .use(remarkLintNoBlockquoteWithoutMarker) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -191,17 +250,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-consecutive-blank-lines/index.js b/packages/remark-lint-no-consecutive-blank-lines/index.js index 1ca99bde..097252ab 100644 --- a/packages/remark-lint-no-consecutive-blank-lines/index.js +++ b/packages/remark-lint-no-consecutive-blank-lines/index.js @@ -1,22 +1,29 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-consecutive-blank-lines - * @fileoverview - * Warn for too many consecutive blank lines. - * Knows about the extra line needed between a list and indented code, and two - * lists. + * ## When should I use this? + * + * You can use this package to check that no more blank lines than needed + * are used between blocks. + * + * ## API * - * ## Fix + * There are no options. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * always uses one blank line between blocks if possible, or two lines when - * needed. + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * More than one blank line has no effect between blocks. * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * adds exactly one blank line between any block. + * + * @module no-consecutive-blank-lines + * @summary + * remark-lint rule to warn when more blank lines that needed are used + * between blocks. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-consecutive-blank-lines/readme.md b/packages/remark-lint-no-consecutive-blank-lines/readme.md index 0e111af2..027c9cf4 100644 --- a/packages/remark-lint-no-consecutive-blank-lines/readme.md +++ b/packages/remark-lint-no-consecutive-blank-lines/readme.md @@ -10,18 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for too many consecutive blank lines. -Knows about the extra line needed between a list and indented code, and two -lists. +[`remark-lint`][mono] rule to warn when more blank lines that needed are used +between blocks. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoConsecutiveBlankLines[, config])`](#unifieduseremarklintnoconsecutiveblanklines-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -always uses one blank line between blocks if possible, or two lines when -needed. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that no more blank lines than needed +are used between blocks. ## Presets @@ -31,13 +48,101 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-consecutive-blank-lines +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoConsecutiveBlankLines from 'https://cdn.skypack.dev/remark-lint-no-consecutive-blank-lines@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoConsecutiveBlankLines from 'remark-lint-no-consecutive-blank-lines' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoConsecutiveBlankLines) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-consecutive-blank-lines example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-consecutive-blank-lines", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoConsecutiveBlankLines`. + +### `unified().use(remarkLintNoConsecutiveBlankLines[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +More than one blank line has no effect between blocks. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +adds exactly one blank line between any block. + +## Examples ##### `ok.md` ###### In -Note: `␊` represents a line feed. +> 👉 **Note**: `␊` represents a line feed. ```markdown Foo… @@ -59,7 +164,7 @@ No messages. ###### In -Note: `␊` represents a line feed. +> 👉 **Note**: `␊` represents a line feed. ```markdown Foo… @@ -77,59 +182,12 @@ Foo… 4:5: Remove 2 lines after node ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-consecutive-blank-lines -``` - -This package exports no identifiers. -The default export is `remarkLintNoConsecutiveBlankLines`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-consecutive-blank-lines", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-consecutive-blank-lines readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoConsecutiveBlankLines from 'remark-lint-no-consecutive-blank-lines' - - remark() - .use(remarkLint) -+ .use(remarkLintNoConsecutiveBlankLines) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -171,17 +229,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-duplicate-defined-urls/index.js b/packages/remark-lint-no-duplicate-defined-urls/index.js index e074377a..86f0c741 100644 --- a/packages/remark-lint-no-duplicate-defined-urls/index.js +++ b/packages/remark-lint-no-duplicate-defined-urls/index.js @@ -1,11 +1,23 @@ /** + * ## When should I use this? + * + * You can use this package to check that URLs are defined once. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * It’s likely a mistake when the same URL is defined with different + * identifiers. + * + * @module no-duplicate-defined-urls + * @summary + * remark-lint rule to warn when URLs are defined multiple times. * @author Titus Wormer * @copyright 2020 Titus Wormer * @license MIT - * @module no-duplicate-defined-urls - * @fileoverview - * Warn when definitions define the same URL. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-duplicate-defined-urls/readme.md b/packages/remark-lint-no-duplicate-defined-urls/readme.md index 12c10009..c3497747 100644 --- a/packages/remark-lint-no-duplicate-defined-urls/readme.md +++ b/packages/remark-lint-no-duplicate-defined-urls/readme.md @@ -10,96 +10,158 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when definitions define the same URL. +[`remark-lint`][mono] rule to warn when URLs are defined multiple times. -## Presets +## Contents -This rule is not included in any default preset +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoDuplicateDefinedUrls[, config])`](#unifieduseremarklintnoduplicatedefinedurls-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Example +## What is this? -##### `ok.md` +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -###### In +## When should I use this? -```markdown -[alpha]: alpha.com -[bravo]: bravo.com -``` +You can use this package to check that URLs are defined once. -###### Out +## Presets -No messages. +This rule is not included in a preset maintained here. -##### `not-ok.md` +## Install -###### In +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -```markdown -[alpha]: alpha.com -[bravo]: alpha.com +```sh +npm install remark-lint-no-duplicate-defined-urls ``` -###### Out +In Deno with [Skypack][]: -```text -2:1-2:19: Do not use different definitions with the same URL (1:1) +```js +import remarkLintNoDuplicateDefinedUrls from 'https://cdn.skypack.dev/remark-lint-no-duplicate-defined-urls@2?dts' ``` -## Install +In browsers with [Skypack][]: + +```html + +``` -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +## Use -[npm][]: +On the API: -```sh -npm install remark-lint-no-duplicate-defined-urls +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoDuplicateDefinedUrls from 'remark-lint-no-duplicate-defined-urls' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoDuplicateDefinedUrls) + .process(await read('example.md')) + + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoDuplicateDefinedUrls`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-duplicate-defined-urls example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-duplicate-defined-urls", + "remark-lint", ++ "remark-lint-no-duplicate-defined-urls", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-duplicate-defined-urls readme.md +This package exports no identifiers. +The default export is `remarkLintNoDuplicateDefinedUrls`. + +### `unified().use(remarkLintNoDuplicateDefinedUrls[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +It’s likely a mistake when the same URL is defined with different +identifiers. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[alpha]: alpha.com +[bravo]: bravo.com ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoDuplicateDefinedUrls from 'remark-lint-no-duplicate-defined-urls' - - remark() - .use(remarkLint) -+ .use(remarkLintNoDuplicateDefinedUrls) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +[alpha]: alpha.com +[bravo]: alpha.com +``` + +###### Out + +```text +2:1-2:19: Do not use different definitions with the same URL (1:1) ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -140,17 +202,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-duplicate-definitions/index.js b/packages/remark-lint-no-duplicate-definitions/index.js index a9e79965..f2b9d3b5 100644 --- a/packages/remark-lint-no-duplicate-definitions/index.js +++ b/packages/remark-lint-no-duplicate-definitions/index.js @@ -1,11 +1,22 @@ /** + * ## When should I use this? + * + * You can use this package to check that identifiers are defined once. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * It’s a mistake when the same identifier is defined multiple times. + * + * @module no-duplicate-definitions + * @summary + * remark-lint rule to warn when identifiers are defined multiple times. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-duplicate-definitions - * @fileoverview - * Warn when duplicate definitions are found. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-duplicate-definitions/readme.md b/packages/remark-lint-no-duplicate-definitions/readme.md index 52997bf9..8f71e74d 100644 --- a/packages/remark-lint-no-duplicate-definitions/readme.md +++ b/packages/remark-lint-no-duplicate-definitions/readme.md @@ -10,7 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when duplicate definitions are found. +[`remark-lint`][mono] rule to warn when identifiers are defined multiple times. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoDuplicateDefinitions[, config])`](#unifieduseremarklintnoduplicatedefinitions-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that identifiers are defined once. ## Presets @@ -20,90 +45,126 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example - -##### `ok.md` +## Install -###### In +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -```markdown -[foo]: bar -[baz]: qux +```sh +npm install remark-lint-no-duplicate-definitions ``` -###### Out +In Deno with [Skypack][]: -No messages. +```js +import remarkLintNoDuplicateDefinitions from 'https://cdn.skypack.dev/remark-lint-no-duplicate-definitions@3?dts' +``` -##### `not-ok.md` +In browsers with [Skypack][]: -###### In - -```markdown -[foo]: bar -[foo]: qux +```html + ``` -###### Out +## Use -```text -2:1-2:11: Do not use definitions with the same identifier (1:1) -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoDuplicateDefinitions from 'remark-lint-no-duplicate-definitions' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoDuplicateDefinitions) + .process(await read('example.md')) -```sh -npm install remark-lint-no-duplicate-definitions + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoDuplicateDefinitions`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-duplicate-definitions example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-duplicate-definitions", + "remark-lint", ++ "remark-lint-no-duplicate-definitions", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-duplicate-definitions readme.md +This package exports no identifiers. +The default export is `remarkLintNoDuplicateDefinitions`. + +### `unified().use(remarkLintNoDuplicateDefinitions[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +It’s a mistake when the same identifier is defined multiple times. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[foo]: bar +[baz]: qux ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoDuplicateDefinitions from 'remark-lint-no-duplicate-definitions' - - remark() - .use(remarkLint) -+ .use(remarkLintNoDuplicateDefinitions) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +[foo]: bar +[foo]: qux ``` +###### Out + +```text +2:1-2:11: Do not use definitions with the same identifier (1:1) +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -144,17 +205,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-duplicate-headings-in-section/index.js b/packages/remark-lint-no-duplicate-headings-in-section/index.js index 2a394959..c4502839 100644 --- a/packages/remark-lint-no-duplicate-headings-in-section/index.js +++ b/packages/remark-lint-no-duplicate-headings-in-section/index.js @@ -1,12 +1,25 @@ /** + * ## When should I use this? + * + * You can use this package to check that headings with the same text are + * used once per section. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * It’s likely a mistake that the same heading text is used in the same + * section. + * + * @module no-duplicate-headings-in-section + * @summary + * remark-lint rule to warn when headings with the same text are used + * multiple times per section. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-duplicate-headings-in-section - * @fileoverview - * Warn when duplicate headings are found, but only when on the same level, - * “in” the same section. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-duplicate-headings-in-section/readme.md b/packages/remark-lint-no-duplicate-headings-in-section/readme.md index d23536ef..d15463ac 100644 --- a/packages/remark-lint-no-duplicate-headings-in-section/readme.md +++ b/packages/remark-lint-no-duplicate-headings-in-section/readme.md @@ -10,14 +10,124 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when duplicate headings are found, but only when on the same level, -“in” the same section. +[`remark-lint`][mono] rule to warn when headings with the same text are used +multiple times per section. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoDuplicateHeadingsInSection[, config])`](#unifieduseremarklintnoduplicateheadingsinsection-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that headings with the same text are +used once per section. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-duplicate-headings-in-section +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoDuplicateHeadingsInSection from 'https://cdn.skypack.dev/remark-lint-no-duplicate-headings-in-section@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: -## Example +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoDuplicateHeadingsInSection from 'remark-lint-no-duplicate-headings-in-section' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoDuplicateHeadingsInSection) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-duplicate-headings-in-section example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-duplicate-headings-in-section", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoDuplicateHeadingsInSection`. + +### `unified().use(remarkLintNoDuplicateHeadingsInSection[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +It’s likely a mistake that the same heading text is used in the same +section. + +## Examples ##### `ok.md` @@ -85,59 +195,12 @@ No messages. 7:1-7:11: Do not use headings with similar content per section (3:1) ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-duplicate-headings-in-section -``` - -This package exports no identifiers. -The default export is `remarkLintNoDuplicateHeadingsInSection`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-duplicate-headings-in-section", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-duplicate-headings-in-section readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoDuplicateHeadingsInSection from 'remark-lint-no-duplicate-headings-in-section' - - remark() - .use(remarkLint) -+ .use(remarkLintNoDuplicateHeadingsInSection) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -179,17 +242,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-duplicate-headings/index.js b/packages/remark-lint-no-duplicate-headings/index.js index e246a148..e9685b51 100644 --- a/packages/remark-lint-no-duplicate-headings/index.js +++ b/packages/remark-lint-no-duplicate-headings/index.js @@ -1,11 +1,29 @@ /** + * ## When should I use this? + * + * You can use this package to check that headings with the same text are + * used once. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Headings having unique text helps screen reader users (who typically use + * “jump to heading” features to navigate within a page, which reads headings + * out loud). + * It also helps because often headings receive automatic unique IDs, and when + * the same heading text is used, they are suffixed with a number based on where + * they are positioned in the document, which makes linking to them prone to + * changes. + * + * @module no-duplicate-headings + * @summary + * remark-lint rule to warn when headings with the same text are found. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-duplicate-headings - * @fileoverview - * Warn when duplicate headings are found. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-duplicate-headings/readme.md b/packages/remark-lint-no-duplicate-headings/readme.md index 52407cfd..5ac99cae 100644 --- a/packages/remark-lint-no-duplicate-headings/readme.md +++ b/packages/remark-lint-no-duplicate-headings/readme.md @@ -10,7 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when duplicate headings are found. +[`remark-lint`][mono] rule to warn when headings with the same text are found. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoDuplicateHeadings[, config])`](#unifieduseremarklintnoduplicateheadings-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that headings with the same text are +used once. ## Presets @@ -20,95 +46,137 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-no-duplicate-headings +``` -```markdown -# Foo +In Deno with [Skypack][]: -## Bar +```js +import remarkLintNoDuplicateHeadings from 'https://cdn.skypack.dev/remark-lint-no-duplicate-headings@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. +```html + +``` -##### `not-ok.md` +## Use -###### In +On the API: -```markdown -# Foo - -## Foo +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoDuplicateHeadings from 'remark-lint-no-duplicate-headings' -## [Foo](http://foo.com/bar) -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoDuplicateHeadings) + .process(await read('example.md')) -```text -3:1-3:7: Do not use headings with similar content (1:1) -5:1-5:29: Do not use headings with similar content (3:1) + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-no-duplicate-headings +remark --use remark-lint --use remark-lint-no-duplicate-headings example.md ``` -This package exports no identifiers. -The default export is `remarkLintNoDuplicateHeadings`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-duplicate-headings", + "remark-lint", ++ "remark-lint-no-duplicate-headings", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-duplicate-headings readme.md +This package exports no identifiers. +The default export is `remarkLintNoDuplicateHeadings`. + +### `unified().use(remarkLintNoDuplicateHeadings[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Headings having unique text helps screen reader users (who typically use +“jump to heading” features to navigate within a page, which reads headings +out loud). +It also helps because often headings receive automatic unique IDs, and when +the same heading text is used, they are suffixed with a number based on where +they are positioned in the document, which makes linking to them prone to +changes. + +## Examples + +##### `ok.md` + +###### In + +```markdown +# Foo + +## Bar ``` -Or use this on the API: +###### Out + +No messages. -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoDuplicateHeadings from 'remark-lint-no-duplicate-headings' - - remark() - .use(remarkLint) -+ .use(remarkLintNoDuplicateHeadings) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +##### `not-ok.md` + +###### In + +```markdown +# Foo + +## Foo + +## [Foo](http://foo.com/bar) ``` +###### Out + +```text +3:1-3:7: Do not use headings with similar content (1:1) +5:1-5:29: Do not use headings with similar content (3:1) +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -149,17 +217,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-emphasis-as-heading/index.js b/packages/remark-lint-no-emphasis-as-heading/index.js index a8f36473..e1680831 100644 --- a/packages/remark-lint-no-emphasis-as-heading/index.js +++ b/packages/remark-lint-no-emphasis-as-heading/index.js @@ -1,12 +1,26 @@ /** + * ## When should I use this? + * + * You can use this package to check that headings are used to introduce + * paragraphs instead of “fake” headings made with emphasis or strong. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * While not always the case, typically emphasis or strong around the text + * in a paragraph is used as a “faux” heading. + * It’s recommended to use actual headings instead. + * + * @module no-emphasis-as-heading + * @summary + * remark-lint rule to warn when emphasis or strong are used to introduce + * a paragraph. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-emphasis-as-heading - * @fileoverview - * Warn when emphasis (including strong), instead of a heading, introduces - * a paragraph. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-emphasis-as-heading/readme.md b/packages/remark-lint-no-emphasis-as-heading/readme.md index 9f196084..caa4a1dc 100644 --- a/packages/remark-lint-no-emphasis-as-heading/readme.md +++ b/packages/remark-lint-no-emphasis-as-heading/readme.md @@ -10,9 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when emphasis (including strong), instead of a heading, introduces +[`remark-lint`][mono] rule to warn when emphasis or strong are used to introduce a paragraph. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoEmphasisAsHeading[, config])`](#unifieduseremarklintnoemphasisasheading-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that headings are used to introduce +paragraphs instead of “fake” headings made with emphasis or strong. + ## Presets This rule is included in the following presets: @@ -21,7 +47,92 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-emphasis-as-heading +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoEmphasisAsHeading from 'https://cdn.skypack.dev/remark-lint-no-emphasis-as-heading@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoEmphasisAsHeading from 'remark-lint-no-emphasis-as-heading' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoEmphasisAsHeading) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-emphasis-as-heading example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-emphasis-as-heading", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoEmphasisAsHeading`. + +### `unified().use(remarkLintNoEmphasisAsHeading[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +While not always the case, typically emphasis or strong around the text +in a paragraph is used as a “faux” heading. +It’s recommended to use actual headings instead. + +## Examples ##### `ok.md` @@ -58,59 +169,12 @@ Quux. 5:1-5:8: Don’t use emphasis to introduce a section, use a heading ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-emphasis-as-heading -``` - -This package exports no identifiers. -The default export is `remarkLintNoEmphasisAsHeading`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-emphasis-as-heading", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-emphasis-as-heading readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoEmphasisAsHeading from 'remark-lint-no-emphasis-as-heading' - - remark() - .use(remarkLint) -+ .use(remarkLintNoEmphasisAsHeading) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -152,17 +216,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-empty-url/index.js b/packages/remark-lint-no-empty-url/index.js index b3ca3119..f07aada7 100644 --- a/packages/remark-lint-no-empty-url/index.js +++ b/packages/remark-lint-no-empty-url/index.js @@ -1,11 +1,24 @@ /** + * ## When should I use this? + * + * You can use this package to check that links and images have URLs. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * While it is possible to omit URLs in links and images, that typically + * indicates a “placeholder” or todo that has to be filled out later. + * It’s recommended to fill them out. + * + * @module no-empty-url + * @summary + * remark-lint rule to warn for empty URLs in links and images. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-empty-url - * @fileoverview - * Warn for empty URLs in links and images. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-empty-url/readme.md b/packages/remark-lint-no-empty-url/readme.md index 486c5456..5b50ae50 100644 --- a/packages/remark-lint-no-empty-url/readme.md +++ b/packages/remark-lint-no-empty-url/readme.md @@ -10,99 +10,162 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for empty URLs in links and images. +[`remark-lint`][mono] rule to warn for empty URLs in links and images. -## Presets +## Contents -This rule is not included in any default preset +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoEmptyUrl[, config])`](#unifieduseremarklintnoemptyurl-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Example +## What is this? -##### `ok.md` +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -###### In +## When should I use this? -```markdown -[alpha](http://bravo.com). +You can use this package to check that links and images have URLs. -![charlie](http://delta.com/echo.png "foxtrot"). -``` +## Presets -###### Out +This rule is not included in a preset maintained here. -No messages. +## Install -##### `not-ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-no-empty-url +``` -```markdown -[golf](). +In Deno with [Skypack][]: -![hotel](). +```js +import remarkLintNoEmptyUrl from 'https://cdn.skypack.dev/remark-lint-no-empty-url@3?dts' ``` -###### Out +In browsers with [Skypack][]: -```text -1:1-1:9: Don’t use links without URL -3:1-3:11: Don’t use images without URL +```html + ``` -## Install +## Use -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +On the API: -[npm][]: +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoEmptyUrl from 'remark-lint-no-empty-url' -```sh -npm install remark-lint-no-empty-url +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoEmptyUrl) + .process(await read('example.md')) + + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoEmptyUrl`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-empty-url example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-empty-url", + "remark-lint", ++ "remark-lint-no-empty-url", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-empty-url readme.md +This package exports no identifiers. +The default export is `remarkLintNoEmptyUrl`. + +### `unified().use(remarkLintNoEmptyUrl[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +While it is possible to omit URLs in links and images, that typically +indicates a “placeholder” or todo that has to be filled out later. +It’s recommended to fill them out. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[alpha](http://bravo.com). + +![charlie](http://delta.com/echo.png "foxtrot"). ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoEmptyUrl from 'remark-lint-no-empty-url' - - remark() - .use(remarkLint) -+ .use(remarkLintNoEmptyUrl) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +[golf](). + +![hotel](). ``` +###### Out + +```text +1:1-1:9: Don’t use links without URL +3:1-3:11: Don’t use images without URL +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -143,17 +206,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-file-name-articles/index.js b/packages/remark-lint-no-file-name-articles/index.js index 0eea8b0a..9743d28a 100644 --- a/packages/remark-lint-no-file-name-articles/index.js +++ b/packages/remark-lint-no-file-name-articles/index.js @@ -1,11 +1,19 @@ /** + * ## When should I use this? + * + * You can use this package to check that file names do not start with + * articles (`a`, `the`, etc). + * + * ## API + * + * There are no options. + * + * @module no-file-name-articles + * @summary + * remark-lint rule to warn when file names start with articles. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-file-name-articles - * @fileoverview - * Warn when file names start with an article. - * * @example * {"name": "title.md"} * diff --git a/packages/remark-lint-no-file-name-articles/readme.md b/packages/remark-lint-no-file-name-articles/readme.md index 41913a37..aa7f2db5 100644 --- a/packages/remark-lint-no-file-name-articles/readme.md +++ b/packages/remark-lint-no-file-name-articles/readme.md @@ -10,7 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when file names start with an article. +[`remark-lint`][mono] rule to warn when file names start with articles. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoFileNameArticles[, config])`](#unifieduseremarklintnofilenamearticles-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that file names do not start with +articles (`a`, `the`, etc). ## Presets @@ -20,7 +45,86 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-file-name-articles +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoFileNameArticles from 'https://cdn.skypack.dev/remark-lint-no-file-name-articles@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoFileNameArticles from 'remark-lint-no-file-name-articles' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoFileNameArticles) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-file-name-articles example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-file-name-articles", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoFileNameArticles`. + +### `unified().use(remarkLintNoFileNameArticles[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Examples ##### `title.md` @@ -60,59 +164,12 @@ No messages. 1:1: Do not start file names with `an` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-file-name-articles -``` - -This package exports no identifiers. -The default export is `remarkLintNoFileNameArticles`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-file-name-articles", - … - ] - } - … -``` - -Or use it on the CLI directly +## Compatibility -```sh -remark -u lint -u lint-no-file-name-articles readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoFileNameArticles from 'remark-lint-no-file-name-articles' - - remark() - .use(remarkLint) -+ .use(remarkLintNoFileNameArticles) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -154,17 +211,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-file-name-consecutive-dashes/index.js b/packages/remark-lint-no-file-name-consecutive-dashes/index.js index 7756a500..1fb8eeae 100644 --- a/packages/remark-lint-no-file-name-consecutive-dashes/index.js +++ b/packages/remark-lint-no-file-name-consecutive-dashes/index.js @@ -1,11 +1,19 @@ /** + * ## When should I use this? + * + * You can use this package to check that no consecutive dashes appear in + * file names. + * + * ## API + * + * There are no options. + * + * @module no-file-name-consecutive-dashes + * @summary + * remark-lint rule to warn when consecutive dashes appear in file names. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-file-name-consecutive-dashes - * @fileoverview - * Warn when file names contain consecutive dashes. - * * @example * {"name": "plug-ins.md"} * diff --git a/packages/remark-lint-no-file-name-consecutive-dashes/readme.md b/packages/remark-lint-no-file-name-consecutive-dashes/readme.md index a5589e7e..097f26a3 100644 --- a/packages/remark-lint-no-file-name-consecutive-dashes/readme.md +++ b/packages/remark-lint-no-file-name-consecutive-dashes/readme.md @@ -10,7 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when file names contain consecutive dashes. +[`remark-lint`][mono] rule to warn when consecutive dashes appear in file names. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoFileNameConsecutiveDashes[, config])`](#unifieduseremarklintnofilenameconsecutivedashes-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that no consecutive dashes appear in +file names. ## Presets @@ -20,76 +45,108 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install -##### `plug-ins.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### Out +```sh +npm install remark-lint-no-file-name-consecutive-dashes +``` -No messages. +In Deno with [Skypack][]: -##### `plug--ins.md` +```js +import remarkLintNoFileNameConsecutiveDashes from 'https://cdn.skypack.dev/remark-lint-no-file-name-consecutive-dashes@2?dts' +``` -###### Out +In browsers with [Skypack][]: -```text -1:1: Do not use consecutive dashes in a file name +```html + ``` -## Install +## Use -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +On the API: -[npm][]: +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoFileNameConsecutiveDashes from 'remark-lint-no-file-name-consecutive-dashes' -```sh -npm install remark-lint-no-file-name-consecutive-dashes +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoFileNameConsecutiveDashes) + .process(await read('example.md')) + + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoFileNameConsecutiveDashes`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-file-name-consecutive-dashes example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-file-name-consecutive-dashes", + "remark-lint", ++ "remark-lint-no-file-name-consecutive-dashes", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-file-name-consecutive-dashes readme.md -``` +This package exports no identifiers. +The default export is `remarkLintNoFileNameConsecutiveDashes`. -Or use this on the API: +### `unified().use(remarkLintNoFileNameConsecutiveDashes[, config])` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoFileNameConsecutiveDashes from 'remark-lint-no-file-name-consecutive-dashes' - - remark() - .use(remarkLint) -+ .use(remarkLintNoFileNameConsecutiveDashes) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Examples + +##### `plug-ins.md` + +###### Out + +No messages. + +##### `plug--ins.md` + +###### Out + +```text +1:1: Do not use consecutive dashes in a file name ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -130,17 +187,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-file-name-irregular-characters/index.js b/packages/remark-lint-no-file-name-irregular-characters/index.js index f7d34f96..039ff9be 100644 --- a/packages/remark-lint-no-file-name-irregular-characters/index.js +++ b/packages/remark-lint-no-file-name-irregular-characters/index.js @@ -1,20 +1,24 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-file-name-irregular-characters - * @fileoverview - * Warn when file names contain irregular characters: characters other than - * alphanumericals (`a-zA-Z0-9`), hyphen-minus (`-`), and dots (`.`, full - * stops). + * ## When should I use this? + * + * You can use this package to check that file names contain regular characters. * - * Options: `RegExp` or `string`, default: `'\\.a-zA-Z0-9-'`. + * ## API * - * If a string is given, it will be wrapped in - * `new RegExp('[^' + preferred + ']')`. + * The following options (default: `'\\.a-zA-Z0-9-'`) are accepted: * - * Any match by the wrapped or given expressions creates a message. + * * `string` (example `'\w\\.'`) + * — allowed characters, wrapped in `new RegExp('[^' + x + ']')`, make sure + * to double escape regexp characters + * * `RegExp` (example `/[^\.a-zA-Z0-9-]/`) + * — disallowed pattern * + * @module no-file-name-irregular-characters + * @summary + * remark-lint rule to warn when file names contain irregular characters. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "plug-ins.md"} * diff --git a/packages/remark-lint-no-file-name-irregular-characters/readme.md b/packages/remark-lint-no-file-name-irregular-characters/readme.md index 5901269e..52c7c71b 100644 --- a/packages/remark-lint-no-file-name-irregular-characters/readme.md +++ b/packages/remark-lint-no-file-name-irregular-characters/readme.md @@ -10,16 +10,31 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when file names contain irregular characters: characters other than -alphanumericals (`a-zA-Z0-9`), hyphen-minus (`-`), and dots (`.`, full -stops). +[`remark-lint`][mono] rule to warn when file names contain irregular characters. -Options: `RegExp` or `string`, default: `'\\.a-zA-Z0-9-'`. +## Contents -If a string is given, it will be wrapped in -`new RegExp('[^' + preferred + ']')`. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoFileNameIrregularCharacters[, config])`](#unifieduseremarklintnofilenameirregularcharacters-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -Any match by the wrapped or given expressions creates a message. +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that file names contain regular characters. ## Presets @@ -29,7 +44,92 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-file-name-irregular-characters +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoFileNameIrregularCharacters from 'https://cdn.skypack.dev/remark-lint-no-file-name-irregular-characters@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoFileNameIrregularCharacters from 'remark-lint-no-file-name-irregular-characters' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoFileNameIrregularCharacters) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-file-name-irregular-characters example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-file-name-irregular-characters", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoFileNameIrregularCharacters`. + +### `unified().use(remarkLintNoFileNameIrregularCharacters[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'\\.a-zA-Z0-9-'`) are accepted: + +* `string` (example `'\w\\.'`) + — allowed characters, wrapped in `new RegExp('[^' + x + ']')`, make sure + to double escape regexp characters +* `RegExp` (example `/[^\.a-zA-Z0-9-]/`) + — disallowed pattern + +## Examples ##### `plug-ins.md` @@ -69,59 +169,12 @@ When configured with `'\\.a-z0-9'`. 1:1: Do not use `R` in a file name ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +## Compatibility -[npm][]: - -```sh -npm install remark-lint-no-file-name-irregular-characters -``` - -This package exports no identifiers. -The default export is `remarkLintNoFileNameIrregularCharacters`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-file-name-irregular-characters", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-file-name-irregular-characters readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoFileNameIrregularCharacters from 'remark-lint-no-file-name-irregular-characters' - - remark() - .use(remarkLint) -+ .use(remarkLintNoFileNameIrregularCharacters) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -163,17 +216,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-file-name-mixed-case/index.js b/packages/remark-lint-no-file-name-mixed-case/index.js index 4b589015..ea669fd0 100644 --- a/packages/remark-lint-no-file-name-mixed-case/index.js +++ b/packages/remark-lint-no-file-name-mixed-case/index.js @@ -1,11 +1,19 @@ /** + * ## When should I use this? + * + * You can use this package to check that file name casing is consistent + * (either lowercase or uppercase). + * + * ## API + * + * There are no options. + * + * @module no-file-name-mixed-case + * @summary + * remark-lint rule to warn when file name casing is inconsistent. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-file-name-mixed-case - * @fileoverview - * Warn when file names use mixed case: both upper- and lowercase characters. - * * @example * {"name": "README.md"} * diff --git a/packages/remark-lint-no-file-name-mixed-case/readme.md b/packages/remark-lint-no-file-name-mixed-case/readme.md index 9af8acbd..1579f850 100644 --- a/packages/remark-lint-no-file-name-mixed-case/readme.md +++ b/packages/remark-lint-no-file-name-mixed-case/readme.md @@ -10,7 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when file names use mixed case: both upper- and lowercase characters. +[`remark-lint`][mono] rule to warn when file name casing is inconsistent. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoFileNameMixedCase[, config])`](#unifieduseremarklintnofilenamemixedcase-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that file name casing is consistent +(either lowercase or uppercase). ## Presets @@ -20,82 +45,114 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install -##### `README.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### Out +```sh +npm install remark-lint-no-file-name-mixed-case +``` -No messages. +In Deno with [Skypack][]: -##### `readme.md` +```js +import remarkLintNoFileNameMixedCase from 'https://cdn.skypack.dev/remark-lint-no-file-name-mixed-case@2?dts' +``` -###### Out +In browsers with [Skypack][]: -No messages. - -##### `Readme.md` +```html + +``` -###### Out +## Use -```text -1:1: Do not mix casing in file names -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoFileNameMixedCase from 'remark-lint-no-file-name-mixed-case' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoFileNameMixedCase) + .process(await read('example.md')) -```sh -npm install remark-lint-no-file-name-mixed-case + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoFileNameMixedCase`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-file-name-mixed-case example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-file-name-mixed-case", + "remark-lint", ++ "remark-lint-no-file-name-mixed-case", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-file-name-mixed-case readme.md -``` +This package exports no identifiers. +The default export is `remarkLintNoFileNameMixedCase`. -Or use this on the API: +### `unified().use(remarkLintNoFileNameMixedCase[, config])` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoFileNameMixedCase from 'remark-lint-no-file-name-mixed-case' - - remark() - .use(remarkLint) -+ .use(remarkLintNoFileNameMixedCase) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Examples + +##### `README.md` + +###### Out + +No messages. + +##### `readme.md` + +###### Out + +No messages. + +##### `Readme.md` + +###### Out + +```text +1:1: Do not mix casing in file names ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -136,17 +193,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-file-name-outer-dashes/index.js b/packages/remark-lint-no-file-name-outer-dashes/index.js index a6de9de7..65b8db3c 100644 --- a/packages/remark-lint-no-file-name-outer-dashes/index.js +++ b/packages/remark-lint-no-file-name-outer-dashes/index.js @@ -1,11 +1,19 @@ /** + * ## When should I use this? + * + * You can use this package to check that no initial or final dashes appear in + * file names. + * + * ## API + * + * There are no options. + * + * @module no-file-name-outer-dashes + * @summary + * remark-lint rule to warn when initial or final dashes appear in file names. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-file-name-outer-dashes - * @fileoverview - * Warn when file names contain initial or final dashes (hyphen-minus, `-`). - * * @example * {"name": "readme.md"} * diff --git a/packages/remark-lint-no-file-name-outer-dashes/readme.md b/packages/remark-lint-no-file-name-outer-dashes/readme.md index 270d1891..66aff5e6 100644 --- a/packages/remark-lint-no-file-name-outer-dashes/readme.md +++ b/packages/remark-lint-no-file-name-outer-dashes/readme.md @@ -10,7 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when file names contain initial or final dashes (hyphen-minus, `-`). +[`remark-lint`][mono] rule to warn when initial or final dashes appear in file names. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoFileNameOuterDashes[, config])`](#unifieduseremarklintnofilenameouterdashes-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that no initial or final dashes appear in +file names. ## Presets @@ -20,84 +45,116 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install -##### `readme.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### Out +```sh +npm install remark-lint-no-file-name-outer-dashes +``` -No messages. +In Deno with [Skypack][]: -##### `-readme.md` +```js +import remarkLintNoFileNameOuterDashes from 'https://cdn.skypack.dev/remark-lint-no-file-name-outer-dashes@2?dts' +``` -###### Out +In browsers with [Skypack][]: -```text -1:1: Do not use initial or final dashes in a file name +```html + ``` -##### `readme-.md` - -###### Out +## Use -```text -1:1: Do not use initial or final dashes in a file name -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoFileNameOuterDashes from 'remark-lint-no-file-name-outer-dashes' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoFileNameOuterDashes) + .process(await read('example.md')) -```sh -npm install remark-lint-no-file-name-outer-dashes + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoFileNameOuterDashes`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-file-name-outer-dashes example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-file-name-outer-dashes", + "remark-lint", ++ "remark-lint-no-file-name-outer-dashes", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-file-name-outer-dashes readme.md +This package exports no identifiers. +The default export is `remarkLintNoFileNameOuterDashes`. + +### `unified().use(remarkLintNoFileNameOuterDashes[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Examples + +##### `readme.md` + +###### Out + +No messages. + +##### `-readme.md` + +###### Out + +```text +1:1: Do not use initial or final dashes in a file name ``` -Or use this on the API: +##### `readme-.md` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoFileNameOuterDashes from 'remark-lint-no-file-name-outer-dashes' - - remark() - .use(remarkLint) -+ .use(remarkLintNoFileNameOuterDashes) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +###### Out + +```text +1:1: Do not use initial or final dashes in a file name ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -138,17 +195,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-heading-content-indent/index.js b/packages/remark-lint-no-heading-content-indent/index.js index 361209f1..daf2e7a5 100644 --- a/packages/remark-lint-no-heading-content-indent/index.js +++ b/packages/remark-lint-no-heading-content-indent/index.js @@ -1,19 +1,30 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-heading-content-indent - * @fileoverview - * Warn when content of headings is indented. + * ## When should I use this? + * + * You can use this package to check that there is on space between `#` + * characters and the content in headings. + * + * ## API * - * ## Fix + * There are no options. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * removes all unneeded padding around content in headings. + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * One space is required and more than one space has no effect. + * Due to this, it’s recommended to turn this rule on. * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats headings with exactly one space. + * + * @module no-heading-content-indent + * @summary + * remark-lint rule to warn when there are too many spaces between + * hashes and content in headings. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-heading-content-indent/readme.md b/packages/remark-lint-no-heading-content-indent/readme.md index a93eeba4..a377a6c8 100644 --- a/packages/remark-lint-no-heading-content-indent/readme.md +++ b/packages/remark-lint-no-heading-content-indent/readme.md @@ -10,15 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when content of headings is indented. +[`remark-lint`][mono] rule to warn when there are too many spaces between +hashes and content in headings. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoHeadingContentIndent[, config])`](#unifieduseremarklintnoheadingcontentindent-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -removes all unneeded padding around content in headings. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that there is on space between `#` +characters and the content in headings. ## Presets @@ -28,13 +48,102 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-heading-content-indent +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoHeadingContentIndent from 'https://cdn.skypack.dev/remark-lint-no-heading-content-indent@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoHeadingContentIndent from 'remark-lint-no-heading-content-indent' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoHeadingContentIndent) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-heading-content-indent example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-heading-content-indent", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoHeadingContentIndent`. + +### `unified().use(remarkLintNoHeadingContentIndent[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +One space is required and more than one space has no effect. +Due to this, it’s recommended to turn this rule on. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats headings with exactly one space. + +## Examples ##### `ok.md` ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown #·Foo @@ -57,7 +166,7 @@ No messages. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown #··Foo @@ -79,7 +188,7 @@ Note: `·` represents a space. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown #·· @@ -89,59 +198,12 @@ Note: `·` represents a space. No messages. -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-heading-content-indent -``` - -This package exports no identifiers. -The default export is `remarkLintNoHeadingContentIndent`. - -## Use - -You probably want to use it on the CLI through a config file: +## Compatibility -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-heading-content-indent", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-heading-content-indent readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoHeadingContentIndent from 'remark-lint-no-heading-content-indent' - - remark() - .use(remarkLint) -+ .use(remarkLintNoHeadingContentIndent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -183,17 +245,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-heading-indent/index.js b/packages/remark-lint-no-heading-indent/index.js index 1a5b9ebd..51c708d2 100644 --- a/packages/remark-lint-no-heading-indent/index.js +++ b/packages/remark-lint-no-heading-indent/index.js @@ -1,19 +1,40 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-heading-indent - * @fileoverview - * Warn when a heading is indented. + * ## When should I use this? + * + * You can use this package to check that headings are not indented. + * + * ## API + * + * There are no options. * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * removes all unneeded indentation before headings. + * There is no specific handling of indented headings (or anything else) in + * markdown. + * While it is possible to use an indent to headings on their text: * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ```markdown + * # One + * ## Two + * ### Three + * #### Four + * ``` * + * …such style is uncommon, a bit hard to maintain, and it’s impossible to add a + * heading with a rank of 5 as it would form indented code instead. + * Hence, it’s recommended to not indent headings and to turn this rule on. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats all headings without indent. + * + * @module no-heading-indent + * @summary + * remark-lint rule to warn when headings are indented. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-heading-indent/readme.md b/packages/remark-lint-no-heading-indent/readme.md index e57fc6c8..30902044 100644 --- a/packages/remark-lint-no-heading-indent/readme.md +++ b/packages/remark-lint-no-heading-indent/readme.md @@ -10,27 +10,146 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when a heading is indented. +[`remark-lint`][mono] rule to warn when headings are indented. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoHeadingIndent[, config])`](#unifieduseremarklintnoheadingindent-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -removes all unneeded indentation before headings. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that headings are not indented. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-heading-indent +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoHeadingIndent from 'https://cdn.skypack.dev/remark-lint-no-heading-indent@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoHeadingIndent from 'remark-lint-no-heading-indent' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoHeadingIndent) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-heading-indent example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-heading-indent", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoHeadingIndent`. + +### `unified().use(remarkLintNoHeadingIndent[, config])` -## Example +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +There is no specific handling of indented headings (or anything else) in +markdown. +While it is possible to use an indent to headings on their text: + +```markdown + # One + ## Two + ### Three +#### Four +``` + +…such style is uncommon, a bit hard to maintain, and it’s impossible to add a +heading with a rank of 5 as it would form indented code instead. +Hence, it’s recommended to not indent headings and to turn this rule on. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats all headings without indent. + +## Examples ##### `ok.md` ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown #·Hello world @@ -52,7 +171,7 @@ No messages. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown ···# Hello world @@ -75,59 +194,12 @@ Note: `·` represents a space. 8:4: Remove 3 spaces before this heading ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-heading-indent -``` - -This package exports no identifiers. -The default export is `remarkLintNoHeadingIndent`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-heading-indent", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-heading-indent readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoHeadingIndent from 'remark-lint-no-heading-indent' - - remark() - .use(remarkLint) -+ .use(remarkLintNoHeadingIndent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -169,17 +241,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-heading-like-paragraph/index.js b/packages/remark-lint-no-heading-like-paragraph/index.js index 067e66f7..20904200 100644 --- a/packages/remark-lint-no-heading-like-paragraph/index.js +++ b/packages/remark-lint-no-heading-like-paragraph/index.js @@ -1,11 +1,20 @@ /** + * ## When should I use this? + * + * You can use this package to ensure that no heading-like constructs are + * created, which instead will result in paragraphs with the `#` characters + * shown. + * + * ## API + * + * There are no options. + * + * @module no-heading-like-paragraph + * @summary + * remark-lint rule to warn when h7+ “headings” are used. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-heading-like-paragraph - * @fileoverview - * Warn for h7+ “headings”. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-heading-like-paragraph/readme.md b/packages/remark-lint-no-heading-like-paragraph/readme.md index 8503ba80..a78120be 100644 --- a/packages/remark-lint-no-heading-like-paragraph/readme.md +++ b/packages/remark-lint-no-heading-like-paragraph/readme.md @@ -10,98 +10,156 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for h7+ “headings”. +[`remark-lint`][mono] rule to warn when h7+ “headings” are used. -## Presets +## Contents -This rule is not included in any default preset +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoHeadingLikeParagraph[, config])`](#unifieduseremarklintnoheadinglikeparagraph-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Example +## What is this? -##### `ok.md` +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -###### In +## When should I use this? -```markdown -###### Alpha +You can use this package to ensure that no heading-like constructs are +created, which instead will result in paragraphs with the `#` characters +shown. -Bravo. -``` +## Presets -###### Out +This rule is not included in a preset maintained here. -No messages. +## Install -##### `not-ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-no-heading-like-paragraph +``` -```markdown -####### Charlie +In Deno with [Skypack][]: -Delta. +```js +import remarkLintNoHeadingLikeParagraph from 'https://cdn.skypack.dev/remark-lint-no-heading-like-paragraph@3?dts' ``` -###### Out +In browsers with [Skypack][]: -```text -1:1-1:16: This looks like a heading but has too many hashes +```html + ``` -## Install +## Use -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +On the API: -[npm][]: +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoHeadingLikeParagraph from 'remark-lint-no-heading-like-paragraph' -```sh -npm install remark-lint-no-heading-like-paragraph +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoHeadingLikeParagraph) + .process(await read('example.md')) + + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoHeadingLikeParagraph`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-heading-like-paragraph example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-heading-like-paragraph", + "remark-lint", ++ "remark-lint-no-heading-like-paragraph", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-heading-like-paragraph readme.md +This package exports no identifiers. +The default export is `remarkLintNoHeadingLikeParagraph`. + +### `unified().use(remarkLintNoHeadingLikeParagraph[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Examples + +##### `ok.md` + +###### In + +```markdown +###### Alpha + +Bravo. ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoHeadingLikeParagraph from 'remark-lint-no-heading-like-paragraph' - - remark() - .use(remarkLint) -+ .use(remarkLintNoHeadingLikeParagraph) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +####### Charlie + +Delta. +``` + +###### Out + +```text +1:1-1:16: This looks like a heading but has too many hashes ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -142,17 +200,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-heading-punctuation/index.js b/packages/remark-lint-no-heading-punctuation/index.js index 9232fe4d..da6f51b9 100644 --- a/packages/remark-lint-no-heading-punctuation/index.js +++ b/packages/remark-lint-no-heading-punctuation/index.js @@ -1,16 +1,24 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-heading-punctuation - * @fileoverview - * Warn when a heading ends with a group of characters. + * ## When should I use this? + * + * You can use this package to check that headings don’t end in punctuation. * - * Options: `string`, default: `'.,;:!?'`. + * ## API * - * Note: these are added to a regex, in a group (`'[' + char + ']'`), be - * careful to escape the string correctly. + * The following options (default: `'\\.,;:!?'`) are accepted: * + * * `string` (example `'\\.,;:'`) + * — disallowed characters, wrapped in `new RegExp('[' + x + ']')`, make sure + * to double escape regexp characters + * * `RegExp` (example `/\p{P}/u`) + * — disallowed pattern + * + * @module no-heading-punctuation + * @summary + * remark-lint rule to warn headings end in certain punctuation. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-heading-punctuation/readme.md b/packages/remark-lint-no-heading-punctuation/readme.md index b5719dcb..987968b8 100644 --- a/packages/remark-lint-no-heading-punctuation/readme.md +++ b/packages/remark-lint-no-heading-punctuation/readme.md @@ -10,12 +10,31 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when a heading ends with a group of characters. +[`remark-lint`][mono] rule to warn headings end in certain punctuation. -Options: `string`, default: `'.,;:!?'`. +## Contents -Note: these are added to a regex, in a group (`'[' + char + ']'`), be -careful to escape the string correctly. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoHeadingPunctuation[, config])`](#unifieduseremarklintnoheadingpunctuation-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that headings don’t end in punctuation. ## Presets @@ -25,7 +44,92 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `':.'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-heading-punctuation +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoHeadingPunctuation from 'https://cdn.skypack.dev/remark-lint-no-heading-punctuation@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoHeadingPunctuation from 'remark-lint-no-heading-punctuation' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoHeadingPunctuation) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-heading-punctuation example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-heading-punctuation", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoHeadingPunctuation`. + +### `unified().use(remarkLintNoHeadingPunctuation[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'\\.,;:!?'`) are accepted: + +* `string` (example `'\\.,;:'`) + — disallowed characters, wrapped in `new RegExp('[' + x + ']')`, make sure + to double escape regexp characters +* `RegExp` (example `/\p{P}/u`) + — disallowed pattern + +## Examples ##### `ok.md` @@ -79,59 +183,12 @@ When configured with `',;:!?'`. No messages. -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-heading-punctuation -``` - -This package exports no identifiers. -The default export is `remarkLintNoHeadingPunctuation`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-heading-punctuation", - … - ] - } - … -``` +## Compatibility -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-heading-punctuation readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoHeadingPunctuation from 'remark-lint-no-heading-punctuation' - - remark() - .use(remarkLint) -+ .use(remarkLintNoHeadingPunctuation) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -173,17 +230,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-html/index.js b/packages/remark-lint-no-html/index.js index e8364b55..b2af01eb 100644 --- a/packages/remark-lint-no-html/index.js +++ b/packages/remark-lint-no-html/index.js @@ -1,13 +1,18 @@ /** + * ## When should I use this? + * + * You can use this package to check that no HTML (other than comments) is used. + * + * ## API + * + * There are no options. + * + * @module no-html + * @summary + * remark-lint rule to warn when HTML is used. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-html - * @fileoverview - * Warn when HTML nodes are used. - * - * Ignores comments, because they are used by `remark`, `remark-lint`, other - * Markdown tools, and because Markdown doesn’t have native comments. * * @example * {"name": "ok.md"} diff --git a/packages/remark-lint-no-html/readme.md b/packages/remark-lint-no-html/readme.md index 1d7bef34..cc4feb5d 100644 --- a/packages/remark-lint-no-html/readme.md +++ b/packages/remark-lint-no-html/readme.md @@ -10,99 +10,152 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when HTML nodes are used. +[`remark-lint`][mono] rule to warn when HTML is used. -Ignores comments, because they are used by `remark`, `remark-lint`, other -Markdown tools, and because Markdown doesn’t have native comments. +## Contents -## Presets +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoHtml[, config])`](#unifieduseremarklintnohtml-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -This rule is not included in any default preset +## What is this? -## Example +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -##### `ok.md` +## When should I use this? -###### In +You can use this package to check that no HTML (other than comments) is used. -```markdown -# Hello +## Presets - -``` +This rule is not included in a preset maintained here. -###### Out +## Install -No messages. +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -##### `not-ok.md` +```sh +npm install remark-lint-no-html +``` -###### In +In Deno with [Skypack][]: -```markdown -

Hello

+```js +import remarkLintNoHtml from 'https://cdn.skypack.dev/remark-lint-no-html@3?dts' ``` -###### Out +In browsers with [Skypack][]: -```text -1:1-1:15: Do not use HTML in markdown +```html + ``` -## Install +## Use -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +On the API: -[npm][]: +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoHtml from 'remark-lint-no-html' -```sh -npm install remark-lint-no-html +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoHtml) + .process(await read('example.md')) + + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoHtml`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-html example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-html", + "remark-lint", ++ "remark-lint-no-html", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-html readme.md +This package exports no identifiers. +The default export is `remarkLintNoHtml`. + +### `unified().use(remarkLintNoHtml[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Examples + +##### `ok.md` + +###### In + +```markdown +# Hello + + ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoHtml from 'remark-lint-no-html' - - remark() - .use(remarkLint) -+ .use(remarkLintNoHtml) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +

Hello

``` +###### Out + +```text +1:1-1:15: Do not use HTML in markdown +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -143,17 +196,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-inline-padding/index.js b/packages/remark-lint-no-inline-padding/index.js index 9a29351e..a8faab97 100644 --- a/packages/remark-lint-no-inline-padding/index.js +++ b/packages/remark-lint-no-inline-padding/index.js @@ -1,14 +1,21 @@ /** + * ## When should I use this? + * + * You can use this package to check that inline constructs (links) are + * not padded. + * Historically, it was possible to pad emphasis, strong, and strikethrough + * too, but this was removed in CommonMark, making this rule much less useful. + * + * ## API + * + * There are no options. + * + * @module no-inline-padding + * @summary + * remark-lint rule to warn when inline constructs are padded. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-inline-padding - * @fileoverview - * Warn when phrasing content is padded with spaces between their markers and - * content. - * - * Warns for emphasis, strong, delete, image, and link. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-inline-padding/readme.md b/packages/remark-lint-no-inline-padding/readme.md index af816912..8517619a 100644 --- a/packages/remark-lint-no-inline-padding/readme.md +++ b/packages/remark-lint-no-inline-padding/readme.md @@ -10,10 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when phrasing content is padded with spaces between their markers and -content. +[`remark-lint`][mono] rule to warn when inline constructs are padded. -Warns for emphasis, strong, delete, image, and link. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoInlinePadding[, config])`](#unifieduseremarklintnoinlinepadding-config) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that inline constructs (links) are +not padded. +Historically, it was possible to pad emphasis, strong, and strikethrough +too, but this was removed in CommonMark, making this rule much less useful. ## Presets @@ -24,88 +48,120 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example - -##### `ok.md` +## Install -###### In +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -```markdown -Alpha [bravo](http://echo.fox/trot) +```sh +npm install remark-lint-no-inline-padding ``` -###### Out +In Deno with [Skypack][]: -No messages. +```js +import remarkLintNoInlinePadding from 'https://cdn.skypack.dev/remark-lint-no-inline-padding@4?dts' +``` -##### `not-ok.md` +In browsers with [Skypack][]: -###### In - -```markdown -Alpha [ bravo ](http://echo.fox/trot) +```html + ``` -###### Out +## Use -```text -1:7-1:38: Don’t pad `link` with inner spaces -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoInlinePadding from 'remark-lint-no-inline-padding' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoInlinePadding) + .process(await read('example.md')) -```sh -npm install remark-lint-no-inline-padding + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoInlinePadding`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-inline-padding example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-inline-padding", + "remark-lint", ++ "remark-lint-no-inline-padding", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-inline-padding readme.md +This package exports no identifiers. +The default export is `remarkLintNoInlinePadding`. + +### `unified().use(remarkLintNoInlinePadding[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Examples + +##### `ok.md` + +###### In + +```markdown +Alpha [bravo](http://echo.fox/trot) ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoInlinePadding from 'remark-lint-no-inline-padding' - - remark() - .use(remarkLint) -+ .use(remarkLintNoInlinePadding) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +Alpha [ bravo ](http://echo.fox/trot) ``` +###### Out + +```text +1:7-1:38: Don’t pad `link` with inner spaces +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -146,17 +202,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-literal-urls/index.js b/packages/remark-lint-no-literal-urls/index.js index 40efb7dd..3410bfa2 100644 --- a/packages/remark-lint-no-literal-urls/index.js +++ b/packages/remark-lint-no-literal-urls/index.js @@ -1,23 +1,30 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-literal-urls - * @fileoverview - * Warn for literal URLs in text. - * URLs are treated as links in some Markdown vendors, but not in others. - * To make sure they are always linked, wrap them in `<` (less than) and `>` - * (greater than). + * ## When should I use this? + * + * You can use this package to check that autolink literal URLs are not used. + * + * ## API * - * ## Fix + * There are no options. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * never creates literal URLs and always uses `<` (less than) and `>` - * (greater than). + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * Autolink literal URLs (just a URL) are a feature enabled by GFM. + * They don’t work everywhere. + * Due to this, it’s recommended to instead use normal autolinks + * (``) or links (`[text](url)`). * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * never creates autolink literals and always uses normal autolinks (``). + * + * @module no-literal-urls + * @summary + * remark-lint rule to warn for autolink literals. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-literal-urls/readme.md b/packages/remark-lint-no-literal-urls/readme.md index 206d5377..cc8ee09c 100644 --- a/packages/remark-lint-no-literal-urls/readme.md +++ b/packages/remark-lint-no-literal-urls/readme.md @@ -10,19 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for literal URLs in text. -URLs are treated as links in some Markdown vendors, but not in others. -To make sure they are always linked, wrap them in `<` (less than) and `>` -(greater than). +[`remark-lint`][mono] rule to warn for autolink literals. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoLiteralUrls[, config])`](#unifieduseremarklintnoliteralurls-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -never creates literal URLs and always uses `<` (less than) and `>` -(greater than). +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that autolink literal URLs are not used. ## Presets @@ -33,90 +47,134 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example - -##### `ok.md` +## Install -###### In +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -```markdown - +```sh +npm install remark-lint-no-literal-urls ``` -###### Out - -No messages. +In Deno with [Skypack][]: -##### `not-ok.md` - -###### In +```js +import remarkLintNoLiteralUrls from 'https://cdn.skypack.dev/remark-lint-no-literal-urls@3?dts' +``` -Note: this example uses [GFM][]. +In browsers with [Skypack][]: -```markdown -http://foo.bar/baz +```html + ``` -###### Out +## Use -```text -1:1-1:19: Don’t use literal URLs without angle brackets -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoLiteralUrls from 'remark-lint-no-literal-urls' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoLiteralUrls) + .process(await read('example.md')) -```sh -npm install remark-lint-no-literal-urls + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoLiteralUrls`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-literal-urls example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-literal-urls", + "remark-lint", ++ "remark-lint-no-literal-urls", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-literal-urls readme.md +This package exports no identifiers. +The default export is `remarkLintNoLiteralUrls`. + +### `unified().use(remarkLintNoLiteralUrls[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Autolink literal URLs (just a URL) are a feature enabled by GFM. +They don’t work everywhere. +Due to this, it’s recommended to instead use normal autolinks +(``) or links (`[text](url)`). + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +never creates autolink literals and always uses normal autolinks (``). + +## Examples + +##### `ok.md` + +###### In + +```markdown + ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoLiteralUrls from 'remark-lint-no-literal-urls' - - remark() - .use(remarkLint) -+ .use(remarkLintNoLiteralUrls) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). + +```markdown +http://foo.bar/baz ``` +###### Out + +```text +1:1-1:19: Don’t use literal URLs without angle brackets +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -157,17 +215,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-missing-blank-lines/index.js b/packages/remark-lint-no-missing-blank-lines/index.js index 4634dbd5..a682b678 100644 --- a/packages/remark-lint-no-missing-blank-lines/index.js +++ b/packages/remark-lint-no-missing-blank-lines/index.js @@ -1,26 +1,34 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-missing-blank-lines - * @fileoverview - * Warn when missing blank lines before block content (and frontmatter - * content). + * ## When should I use this? + * + * You can use this package to check that blank lines are used between blocks. + * + * ## API * - * This rule can be configured to allow tight list items without blank lines - * between their contents by passing `{exceptTightLists: true}` (default: - * `false`). + * The following options (default: `undefined`) are accepted: * - * ## Fix + * * `Object` with the following fields: + * * `exceptTightLists` (`boolean`, default: `false`) + * — allow tight list items * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * always uses one blank line between blocks if possible, or two lines when - * needed. - * The style of the list items persists. + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * While not always required, blank lines are required in certain, sometimes + * confusing, cases. + * Due to this, it’s recommended to always use blank lines between blocks. * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * always uses blank lines between blocks. + * It has a `join` function to customize such behavior. + * + * @module no-missing-blank-lines + * @summary + * remark-lint rule to warn when blank lines are missing. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-missing-blank-lines/readme.md b/packages/remark-lint-no-missing-blank-lines/readme.md index 8d0068ac..5b8cb6c8 100644 --- a/packages/remark-lint-no-missing-blank-lines/readme.md +++ b/packages/remark-lint-no-missing-blank-lines/readme.md @@ -10,28 +10,134 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when missing blank lines before block content (and frontmatter -content). +[`remark-lint`][mono] rule to warn when blank lines are missing. -This rule can be configured to allow tight list items without blank lines -between their contents by passing `{exceptTightLists: true}` (default: -`false`). +## Contents -## Fix +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoMissingBlankLines[, config])`](#unifieduseremarklintnomissingblanklines-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -always uses one blank line between blocks if possible, or two lines when -needed. -The style of the list items persists. +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that blank lines are used between blocks. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-missing-blank-lines +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoMissingBlankLines from 'https://cdn.skypack.dev/remark-lint-no-missing-blank-lines@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoMissingBlankLines from 'remark-lint-no-missing-blank-lines' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoMissingBlankLines) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-missing-blank-lines example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-missing-blank-lines", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoMissingBlankLines`. + +### `unified().use(remarkLintNoMissingBlankLines[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `undefined`) are accepted: -## Example +* `Object` with the following fields: + * `exceptTightLists` (`boolean`, default: `false`) + — allow tight list items + +## Recommendation + +While not always required, blank lines are required in certain, sometimes +confusing, cases. +Due to this, it’s recommended to always use blank lines between blocks. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +always uses blank lines between blocks. +It has a `join` function to customize such behavior. + +## Examples ##### `ok.md` @@ -96,59 +202,12 @@ Paragraph. 2:1-2:7: Missing blank line before block node ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-missing-blank-lines -``` - -This package exports no identifiers. -The default export is `remarkLintNoMissingBlankLines`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-missing-blank-lines", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-missing-blank-lines readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoMissingBlankLines from 'remark-lint-no-missing-blank-lines' - - remark() - .use(remarkLint) -+ .use(remarkLintNoMissingBlankLines) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -190,17 +249,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-multiple-toplevel-headings/index.js b/packages/remark-lint-no-multiple-toplevel-headings/index.js index 65e805cf..fef6544c 100644 --- a/packages/remark-lint-no-multiple-toplevel-headings/index.js +++ b/packages/remark-lint-no-multiple-toplevel-headings/index.js @@ -1,13 +1,27 @@ /** + * ## When should I use this? + * + * You can use this package to check that no more than one top level heading + * is used. + * + * ## API + * + * The following options (default: `1`) are accepted: + * + * * `number` (example: `1`) + * — assumed top level heading rank + * + * ## Recommendation + * + * Documents should almost always have one main heading, which is typically a + * heading with a rank of `1`. + * + * @module no-multiple-toplevel-headings + * @summary + * remark-lint rule to warn when more than one top level heading is used. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-multiple-toplevel-headings - * @fileoverview - * Warn when multiple top level headings are used. - * - * Options: `number`, default: `1`. - * * @example * {"name": "ok.md", "setting": 1} * diff --git a/packages/remark-lint-no-multiple-toplevel-headings/readme.md b/packages/remark-lint-no-multiple-toplevel-headings/readme.md index 5bd6c7be..e278e0be 100644 --- a/packages/remark-lint-no-multiple-toplevel-headings/readme.md +++ b/packages/remark-lint-no-multiple-toplevel-headings/readme.md @@ -10,9 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when multiple top level headings are used. +[`remark-lint`][mono] rule to warn when more than one top level heading is used. -Options: `number`, default: `1`. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoMultipleToplevelHeadings[, config])`](#unifieduseremarklintnomultipletoplevelheadings-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that no more than one top level heading +is used. ## Presets @@ -22,96 +46,136 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example - -##### `ok.md` +## Install -When configured with `1`. +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-no-multiple-toplevel-headings +``` -```markdown -# Foo +In Deno with [Skypack][]: -## Bar +```js +import remarkLintNoMultipleToplevelHeadings from 'https://cdn.skypack.dev/remark-lint-no-multiple-toplevel-headings@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. - -##### `not-ok.md` +```html + +``` -When configured with `1`. +## Use -###### In +On the API: -```markdown -# Foo +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoMultipleToplevelHeadings from 'remark-lint-no-multiple-toplevel-headings' -# Bar -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoMultipleToplevelHeadings) + .process(await read('example.md')) -```text -3:1-3:6: Don’t use multiple top level headings (1:1) + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-no-multiple-toplevel-headings +remark --use remark-lint --use remark-lint-no-multiple-toplevel-headings example.md ``` -This package exports no identifiers. -The default export is `remarkLintNoMultipleToplevelHeadings`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-multiple-toplevel-headings", + "remark-lint", ++ "remark-lint-no-multiple-toplevel-headings", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-multiple-toplevel-headings readme.md +This package exports no identifiers. +The default export is `remarkLintNoMultipleToplevelHeadings`. + +### `unified().use(remarkLintNoMultipleToplevelHeadings[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `1`) are accepted: + +* `number` (example: `1`) + — assumed top level heading rank + +## Recommendation + +Documents should almost always have one main heading, which is typically a +heading with a rank of `1`. + +## Examples + +##### `ok.md` + +When configured with `1`. + +###### In + +```markdown +# Foo + +## Bar ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoMultipleToplevelHeadings from 'remark-lint-no-multiple-toplevel-headings' - - remark() - .use(remarkLint) -+ .use(remarkLintNoMultipleToplevelHeadings) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +When configured with `1`. + +###### In + +```markdown +# Foo + +# Bar ``` +###### Out + +```text +3:1-3:6: Don’t use multiple top level headings (1:1) +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -152,17 +216,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-paragraph-content-indent/index.js b/packages/remark-lint-no-paragraph-content-indent/index.js index 3ae28e54..9e56f0c8 100644 --- a/packages/remark-lint-no-paragraph-content-indent/index.js +++ b/packages/remark-lint-no-paragraph-content-indent/index.js @@ -1,11 +1,24 @@ /** + * ## When should I use this? + * + * You can use this package to check that content in paragraphs is not + * indented. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Indenting further lines in a paragraph has no effect. + * Due to this, it’s recommended to turn this rule on. + * + * @module no-paragraph-content-indent + * @summary + * remark-lint rule to warn when content in paragraphs is indented. * @author Titus Wormer * @copyright 2017 Titus Wormer * @license MIT - * @module no-paragraph-content-indent - * @fileoverview - * Warn when the content in paragraphs is indented. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-paragraph-content-indent/readme.md b/packages/remark-lint-no-paragraph-content-indent/readme.md index 3da44358..fff95edc 100644 --- a/packages/remark-lint-no-paragraph-content-indent/readme.md +++ b/packages/remark-lint-no-paragraph-content-indent/readme.md @@ -10,13 +10,123 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the content in paragraphs is indented. +[`remark-lint`][mono] rule to warn when content in paragraphs is indented. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoParagraphContentIndent[, config])`](#unifieduseremarklintnoparagraphcontentindent-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that content in paragraphs is not +indented. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-paragraph-content-indent +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoParagraphContentIndent from 'https://cdn.skypack.dev/remark-lint-no-paragraph-content-indent@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: -## Example +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoParagraphContentIndent from 'remark-lint-no-paragraph-content-indent' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoParagraphContentIndent) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-paragraph-content-indent example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-paragraph-content-indent", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoParagraphContentIndent`. + +### `unified().use(remarkLintNoParagraphContentIndent[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Indenting further lines in a paragraph has no effect. +Due to this, it’s recommended to turn this rule on. + +## Examples ##### `ok.md` @@ -58,7 +168,7 @@ No messages. ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown ·Alpha @@ -98,59 +208,12 @@ oscar 22:4: Expected no indentation in paragraph content ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-paragraph-content-indent -``` - -This package exports no identifiers. -The default export is `remarkLintNoParagraphContentIndent`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-paragraph-content-indent", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-paragraph-content-indent readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoParagraphContentIndent from 'remark-lint-no-paragraph-content-indent' - - remark() - .use(remarkLint) -+ .use(remarkLintNoParagraphContentIndent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -192,17 +255,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-reference-like-url/index.js b/packages/remark-lint-no-reference-like-url/index.js index e46a19a0..42771525 100644 --- a/packages/remark-lint-no-reference-like-url/index.js +++ b/packages/remark-lint-no-reference-like-url/index.js @@ -1,11 +1,27 @@ /** + * ## When should I use this? + * + * You can use this package to check for broken URLs that should likely + * have been references. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * While full URLs for definition identifiers are okay + * (`[https://example.com]: https://example.com`), and what looks like an + * identifier could be an actual URL (`[text](alpha)`), the more common case + * is that, assuming a definition `[alpha]: https://example.com`, then a link + * of (`[text](alpha)`) should instead’ve been `[text][alpha]`. + * + * @module no-reference-like-url + * @summary + * remark-lint rule to warn when URLs are also defined identifiers. * @author Titus Wormer * @copyright 2016 Titus Wormer * @license MIT - * @module no-reference-like-url - * @fileoverview - * Warn when URLs are also defined identifiers. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-reference-like-url/readme.md b/packages/remark-lint-no-reference-like-url/readme.md index 3243a044..238b88ef 100644 --- a/packages/remark-lint-no-reference-like-url/readme.md +++ b/packages/remark-lint-no-reference-like-url/readme.md @@ -10,98 +10,164 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when URLs are also defined identifiers. +[`remark-lint`][mono] rule to warn when URLs are also defined identifiers. -## Presets +## Contents -This rule is not included in any default preset +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoReferenceLikeUrl[, config])`](#unifieduseremarklintnoreferencelikeurl-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Example +## What is this? -##### `ok.md` +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -###### In +## When should I use this? -```markdown -[Alpha](http://example.com). +You can use this package to check for broken URLs that should likely +have been references. -[bravo]: https://example.com -``` +## Presets -###### Out +This rule is not included in a preset maintained here. -No messages. +## Install -##### `not-ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-no-reference-like-url +``` -```markdown -[Charlie](delta). +In Deno with [Skypack][]: -[delta]: https://example.com +```js +import remarkLintNoReferenceLikeUrl from 'https://cdn.skypack.dev/remark-lint-no-reference-like-url@3?dts' ``` -###### Out +In browsers with [Skypack][]: -```text -1:1-1:17: Did you mean to use `[delta]` instead of `(delta)`, a reference? +```html + ``` -## Install +## Use -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +On the API: -[npm][]: +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoReferenceLikeUrl from 'remark-lint-no-reference-like-url' -```sh -npm install remark-lint-no-reference-like-url +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoReferenceLikeUrl) + .process(await read('example.md')) + + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoReferenceLikeUrl`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-reference-like-url example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-reference-like-url", + "remark-lint", ++ "remark-lint-no-reference-like-url", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-reference-like-url readme.md +This package exports no identifiers. +The default export is `remarkLintNoReferenceLikeUrl`. + +### `unified().use(remarkLintNoReferenceLikeUrl[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +While full URLs for definition identifiers are okay +(`[https://example.com]: https://example.com`), and what looks like an +identifier could be an actual URL (`[text](alpha)`), the more common case +is that, assuming a definition `[alpha]: https://example.com`, then a link +of (`[text](alpha)`) should instead’ve been `[text][alpha]`. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[Alpha](http://example.com). + +[bravo]: https://example.com ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoReferenceLikeUrl from 'remark-lint-no-reference-like-url' - - remark() - .use(remarkLint) -+ .use(remarkLintNoReferenceLikeUrl) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +[Charlie](delta). + +[delta]: https://example.com +``` + +###### Out + +```text +1:1-1:17: Did you mean to use `[delta]` instead of `(delta)`, a reference? ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -142,17 +208,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-shell-dollars/index.js b/packages/remark-lint-no-shell-dollars/index.js index bd73cf72..1df55252 100644 --- a/packages/remark-lint-no-shell-dollars/index.js +++ b/packages/remark-lint-no-shell-dollars/index.js @@ -1,13 +1,27 @@ /** + * ## When should I use this? + * + * You can use this package to check that not all lines in shell code are + * preceded by dollars (`$`). + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Dollars make copy/pasting hard. + * Either put both dollars in front of some lines (to indicate shell commands) + * and don’t put them in front of other lines, or use fenced code to indicate + * shell commands on their own, followed by another fenced code that contains + * just the output. + * + * @module no-shell-dollars + * @summary + * remark-lint rule to warn every line in shell code is preceded by `$`s. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-shell-dollars - * @fileoverview - * Warn when shell code is prefixed by `$` (dollar sign) characters. - * - * Ignores indented code blocks and fenced code blocks without language flag. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-shell-dollars/readme.md b/packages/remark-lint-no-shell-dollars/readme.md index 4b9217ee..a5a131a5 100644 --- a/packages/remark-lint-no-shell-dollars/readme.md +++ b/packages/remark-lint-no-shell-dollars/readme.md @@ -10,9 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when shell code is prefixed by `$` (dollar sign) characters. +[`remark-lint`][mono] rule to warn every line in shell code is preceded by `$`s. -Ignores indented code blocks and fenced code blocks without language flag. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoShellDollars[, config])`](#unifieduseremarklintnoshelldollars-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that not all lines in shell code are +preceded by dollars (`$`). ## Presets @@ -22,7 +46,94 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-shell-dollars +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoShellDollars from 'https://cdn.skypack.dev/remark-lint-no-shell-dollars@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoShellDollars from 'remark-lint-no-shell-dollars' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoShellDollars) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-shell-dollars example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-shell-dollars", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoShellDollars`. + +### `unified().use(remarkLintNoShellDollars[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Dollars make copy/pasting hard. +Either put both dollars in front of some lines (to indicate shell commands) +and don’t put them in front of other lines, or use fenced code to indicate +shell commands on their own, followed by another fenced code that contains +just the output. + +## Examples ##### `ok.md` @@ -82,59 +193,12 @@ $ echo a > file 5:1-8:4: Do not use dollar signs before shell commands ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-shell-dollars -``` - -This package exports no identifiers. -The default export is `remarkLintNoShellDollars`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-shell-dollars", - … - ] - } - … -``` - -Or use it on the CLI directly +## Compatibility -```sh -remark -u lint -u lint-no-shell-dollars readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoShellDollars from 'remark-lint-no-shell-dollars' - - remark() - .use(remarkLint) -+ .use(remarkLintNoShellDollars) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -176,17 +240,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-shortcut-reference-image/index.js b/packages/remark-lint-no-shortcut-reference-image/index.js index b9633a67..e4ef8fd0 100644 --- a/packages/remark-lint-no-shortcut-reference-image/index.js +++ b/packages/remark-lint-no-shortcut-reference-image/index.js @@ -1,17 +1,27 @@ /** + * ## When should I use this? + * + * You can use this package to check that collapsed or full reference images + * are used. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Shortcut references use an implicit style that looks a lot like something + * that could occur as plain text instead of syntax. + * In some cases, plain text is intended instead of an image. + * Due to this, it’s recommended to use collapsed (or full) references + * instead. + * + * @module no-shortcut-reference-image + * @summary + * remark-lint rule to warn when shortcut reference images are used. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-shortcut-reference-image - * @fileoverview - * Warn when shortcut reference images are used. - * - * Shortcut references render as images when a definition is found, and as - * plain text without definition. - * Sometimes, you don’t intend to create an image from the reference, but this - * rule still warns anyway. - * In that case, you can escape the reference like so: `!\[foo]`. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-shortcut-reference-image/readme.md b/packages/remark-lint-no-shortcut-reference-image/readme.md index 97dda604..3d030876 100644 --- a/packages/remark-lint-no-shortcut-reference-image/readme.md +++ b/packages/remark-lint-no-shortcut-reference-image/readme.md @@ -10,13 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when shortcut reference images are used. +[`remark-lint`][mono] rule to warn when shortcut reference images are used. -Shortcut references render as images when a definition is found, and as -plain text without definition. -Sometimes, you don’t intend to create an image from the reference, but this -rule still warns anyway. -In that case, you can escape the reference like so: `!\[foo]`. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoShortcutReferenceImage[, config])`](#unifieduseremarklintnoshortcutreferenceimage-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that collapsed or full reference images +are used. ## Presets @@ -27,92 +47,132 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-no-shortcut-reference-image +``` -```markdown -![foo][] +In Deno with [Skypack][]: -[foo]: http://foo.bar/baz.png +```js +import remarkLintNoShortcutReferenceImage from 'https://cdn.skypack.dev/remark-lint-no-shortcut-reference-image@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. +```html + +``` -##### `not-ok.md` +## Use -###### In +On the API: -```markdown -![foo] +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoShortcutReferenceImage from 'remark-lint-no-shortcut-reference-image' -[foo]: http://foo.bar/baz.png -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoShortcutReferenceImage) + .process(await read('example.md')) -```text -1:1-1:7: Use the trailing [] on reference images + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-no-shortcut-reference-image +remark --use remark-lint --use remark-lint-no-shortcut-reference-image example.md ``` -This package exports no identifiers. -The default export is `remarkLintNoShortcutReferenceImage`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-shortcut-reference-image", + "remark-lint", ++ "remark-lint-no-shortcut-reference-image", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-shortcut-reference-image readme.md +This package exports no identifiers. +The default export is `remarkLintNoShortcutReferenceImage`. + +### `unified().use(remarkLintNoShortcutReferenceImage[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Shortcut references use an implicit style that looks a lot like something +that could occur as plain text instead of syntax. +In some cases, plain text is intended instead of an image. +Due to this, it’s recommended to use collapsed (or full) references +instead. + +## Examples + +##### `ok.md` + +###### In + +```markdown +![foo][] + +[foo]: http://foo.bar/baz.png ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoShortcutReferenceImage from 'remark-lint-no-shortcut-reference-image' - - remark() - .use(remarkLint) -+ .use(remarkLintNoShortcutReferenceImage) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +![foo] + +[foo]: http://foo.bar/baz.png ``` +###### Out + +```text +1:1-1:7: Use the trailing [] on reference images +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -153,17 +213,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-shortcut-reference-link/index.js b/packages/remark-lint-no-shortcut-reference-link/index.js index f9d58c8d..6a725508 100644 --- a/packages/remark-lint-no-shortcut-reference-link/index.js +++ b/packages/remark-lint-no-shortcut-reference-link/index.js @@ -1,17 +1,27 @@ /** + * ## When should I use this? + * + * You can use this package to check that collapsed or full reference links + * are used. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Shortcut references use an implicit style that looks a lot like something + * that could occur as plain text instead of syntax. + * In some cases, plain text is intended instead of a link. + * Due to this, it’s recommended to use collapsed (or full) references + * instead. + * + * @module no-shortcut-reference-link + * @summary + * remark-lint rule to warn when shortcut reference links are used. * @author Titus Wormer * @copyright 2015 Titus Wormer * @license MIT - * @module no-shortcut-reference-link - * @fileoverview - * Warn when shortcut reference links are used. - * - * Shortcut references render as links when a definition is found, and as - * plain text without definition. - * Sometimes, you don’t intend to create a link from the reference, but this - * rule still warns anyway. - * In that case, you can escape the reference like so: `\[foo]`. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-shortcut-reference-link/readme.md b/packages/remark-lint-no-shortcut-reference-link/readme.md index 93ddaaaf..2bacf6e5 100644 --- a/packages/remark-lint-no-shortcut-reference-link/readme.md +++ b/packages/remark-lint-no-shortcut-reference-link/readme.md @@ -10,13 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when shortcut reference links are used. +[`remark-lint`][mono] rule to warn when shortcut reference links are used. -Shortcut references render as links when a definition is found, and as -plain text without definition. -Sometimes, you don’t intend to create a link from the reference, but this -rule still warns anyway. -In that case, you can escape the reference like so: `\[foo]`. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoShortcutReferenceLink[, config])`](#unifieduseremarklintnoshortcutreferencelink-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that collapsed or full reference links +are used. ## Presets @@ -27,92 +47,132 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-no-shortcut-reference-link +``` -```markdown -[foo][] +In Deno with [Skypack][]: -[foo]: http://foo.bar/baz +```js +import remarkLintNoShortcutReferenceLink from 'https://cdn.skypack.dev/remark-lint-no-shortcut-reference-link@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. +```html + +``` -##### `not-ok.md` +## Use -###### In +On the API: -```markdown -[foo] +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoShortcutReferenceLink from 'remark-lint-no-shortcut-reference-link' -[foo]: http://foo.bar/baz -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoShortcutReferenceLink) + .process(await read('example.md')) -```text -1:1-1:6: Use the trailing `[]` on reference links + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-no-shortcut-reference-link +remark --use remark-lint --use remark-lint-no-shortcut-reference-link example.md ``` -This package exports no identifiers. -The default export is `remarkLintNoShortcutReferenceLink`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-shortcut-reference-link", + "remark-lint", ++ "remark-lint-no-shortcut-reference-link", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-shortcut-reference-link readme.md +This package exports no identifiers. +The default export is `remarkLintNoShortcutReferenceLink`. + +### `unified().use(remarkLintNoShortcutReferenceLink[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Shortcut references use an implicit style that looks a lot like something +that could occur as plain text instead of syntax. +In some cases, plain text is intended instead of a link. +Due to this, it’s recommended to use collapsed (or full) references +instead. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[foo][] + +[foo]: http://foo.bar/baz ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoShortcutReferenceLink from 'remark-lint-no-shortcut-reference-link' - - remark() - .use(remarkLint) -+ .use(remarkLintNoShortcutReferenceLink) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +[foo] + +[foo]: http://foo.bar/baz ``` +###### Out + +```text +1:1-1:6: Use the trailing `[]` on reference links +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -153,17 +213,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-table-indentation/index.js b/packages/remark-lint-no-table-indentation/index.js index e417eb34..dff9ffe2 100644 --- a/packages/remark-lint-no-table-indentation/index.js +++ b/packages/remark-lint-no-table-indentation/index.js @@ -1,19 +1,31 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-table-indentation - * @fileoverview - * Warn when tables are indented. + * ## When should I use this? + * + * You can use this package to check that tables are not indented. + * Tables are a GFM feature enabled with + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm). + * + * ## API * - * ## Fix + * There are no options. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * removes all unneeded indentation before tables. + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * There is no specific handling of indented tables (or anything else) in + * markdown. + * Hence, it’s recommended to not indent tables and to turn this rule on. * + * ## Fix + * + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm) + * formats all tables without indent. + * + * @module no-table-indentation + * @summary + * remark-lint rule to warn when tables are indented. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "gfm": true} * diff --git a/packages/remark-lint-no-table-indentation/readme.md b/packages/remark-lint-no-table-indentation/readme.md index 56319838..b50cac56 100644 --- a/packages/remark-lint-no-table-indentation/readme.md +++ b/packages/remark-lint-no-table-indentation/readme.md @@ -10,15 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when tables are indented. +[`remark-lint`][mono] rule to warn when tables are indented. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoTableIndentation[, config])`](#unifieduseremarklintnotableindentation-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -removes all unneeded indentation before tables. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that tables are not indented. +Tables are a GFM feature enabled with +[`remark-gfm`](https://github.com/remarkjs/remark-gfm). ## Presets @@ -28,13 +48,103 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-table-indentation +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoTableIndentation from 'https://cdn.skypack.dev/remark-lint-no-table-indentation@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoTableIndentation from 'remark-lint-no-table-indentation' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoTableIndentation) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-table-indentation example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-table-indentation", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoTableIndentation`. + +### `unified().use(remarkLintNoTableIndentation[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +There is no specific handling of indented tables (or anything else) in +markdown. +Hence, it’s recommended to not indent tables and to turn this rule on. + +## Fix + +[`remark-gfm`](https://github.com/remarkjs/remark-gfm) +formats all tables without indent. + +## Examples ##### `ok.md` ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown Paragraph. @@ -52,9 +162,9 @@ No messages. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown Paragraph. @@ -76,9 +186,9 @@ Paragraph. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown >··| A | @@ -95,9 +205,9 @@ Note: `·` represents a space. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown -···paragraph @@ -112,59 +222,12 @@ Note: `·` represents a space. 3:6: Do not indent table rows ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-table-indentation -``` - -This package exports no identifiers. -The default export is `remarkLintNoTableIndentation`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-table-indentation", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-table-indentation readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoTableIndentation from 'remark-lint-no-table-indentation' - - remark() - .use(remarkLint) -+ .use(remarkLintNoTableIndentation) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -206,17 +269,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-tabs/index.js b/packages/remark-lint-no-tabs/index.js index e87f7e8d..ebb6e5a5 100644 --- a/packages/remark-lint-no-tabs/index.js +++ b/packages/remark-lint-no-tabs/index.js @@ -1,20 +1,58 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module no-tabs - * @fileoverview - * Warn when hard tabs (`\t`) are used instead of spaces. + * ## When should I use this? + * + * You can use this package to check that tabs are not used. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Regardless of the debate in other languages of whether to use tabs vs. + * spaces, when it comes to markdown, tabs do not work as expected. + * Largely around contains such as block quotes and lists. + * Take for example block quotes: `>\ta` gives a paragraph with the text `a` + * in a blockquote, so one might expect that `>\t\ta` results in indented code + * with the text `a` in a block quote. * - * ## Fix + * ```markdown + * >\ta * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * uses spaces where tabs are used for indentation, but retains tabs used in - * content. + * >\t\ta + * ``` * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * Yields: * + * ```html + *
+ *

a

+ *
+ *
+ *
  a
+ * 
+ *
+ * ``` + * + * Because markdown uses a hardcoded tab size of 4, the first tab could be + * represented as 3 spaces (because there’s a `>` before). + * One of those “spaces” is taken because block quotes allow the `>` to be + * followed by one space, leaving 2 spaces. + * The next tab can be represented as 4 spaces, so together we have 6 spaces. + * The indented code uses 4 spaces, so there are two spaces left, which are + * shown in the indented code. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * uses spaces exclusively for indentation. + * + * @module no-tabs + * @summary + * remark-lint rule to warn when tabs are used. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-tabs/readme.md b/packages/remark-lint-no-tabs/readme.md index fd8b57a5..95e754b8 100644 --- a/packages/remark-lint-no-tabs/readme.md +++ b/packages/remark-lint-no-tabs/readme.md @@ -10,28 +10,164 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when hard tabs (`\t`) are used instead of spaces. +[`remark-lint`][mono] rule to warn when tabs are used. -## Fix +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoTabs[, config])`](#unifieduseremarklintnotabs-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -uses spaces where tabs are used for indentation, but retains tabs used in -content. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +## When should I use this? + +You can use this package to check that tabs are not used. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-tabs +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoTabs from 'https://cdn.skypack.dev/remark-lint-no-tabs@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoTabs from 'remark-lint-no-tabs' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoTabs) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-tabs example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-tabs", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoTabs`. + +### `unified().use(remarkLintNoTabs[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. -## Example +## Recommendation + +Regardless of the debate in other languages of whether to use tabs vs. +spaces, when it comes to markdown, tabs do not work as expected. +Largely around contains such as block quotes and lists. +Take for example block quotes: `>\ta` gives a paragraph with the text `a` +in a blockquote, so one might expect that `>\t\ta` results in indented code +with the text `a` in a block quote. + +```markdown +>\ta + +>\t\ta +``` + +Yields: + +```html +
+

a

+
+
+
  a
+
+
+``` + +Because markdown uses a hardcoded tab size of 4, the first tab could be +represented as 3 spaces (because there’s a `>` before). +One of those “spaces” is taken because block quotes allow the `>` to be +followed by one space, leaving 2 spaces. +The next tab can be represented as 4 spaces, so together we have 6 spaces. +The indented code uses 4 spaces, so there are two spaces left, which are +shown in the indented code. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +uses spaces exclusively for indentation. + +## Examples ##### `ok.md` ###### In -Note: `·` represents a space. +> 👉 **Note**: `·` represents a space. ```markdown Foo Bar @@ -47,7 +183,7 @@ No messages. ###### In -Note: `»` represents a tab. +> 👉 **Note**: `»` represents a tab. ```markdown »Here's one before a code block. @@ -79,59 +215,12 @@ And this is a tab as the last character.» 13:41: Use spaces instead of tabs ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-tabs -``` - -This package exports no identifiers. -The default export is `remarkLintNoTabs`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-tabs", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-tabs readme.md -``` - -Or use this on the API: +## Compatibility -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoTabs from 'remark-lint-no-tabs' - - remark() - .use(remarkLint) -+ .use(remarkLintNoTabs) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -173,17 +262,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-undefined-references/index.js b/packages/remark-lint-no-undefined-references/index.js index 4e9faba0..a2405d5a 100644 --- a/packages/remark-lint-no-undefined-references/index.js +++ b/packages/remark-lint-no-undefined-references/index.js @@ -1,17 +1,46 @@ /** - * @author Titus Wormer - * @copyright 2016 Titus Wormer - * @license MIT - * @module no-undefined-references - * @fileoverview - * Warn when references to undefined definitions are found. + * ## When should I use this? + * + * You can use this package to check that referenced definitions are defined. + * + * ## API + * + * The following options (default: `undefined`) are accepted: + * + * * `Object` with the following fields: + * * `allow` (`Array`, default: `[]`) + * — text that you want to allowed between `[` and `]` even though it’s + * undefined + * + * ## Recommendation * - * Options: `Object`, optional. + * Shortcut references use an implicit syntax that could also occur as plain + * text. + * For example, it is reasonable to expect an author adding `[…]` to abbreviate + * some text somewhere in a document: * - * The object can have an `allow` field, set to an array of strings that may - * appear between `[` and `]`, but that should not be treated as link - * identifiers. + * ```markdown + * > Some […] quote. + * ``` * + * This isn’t a problem, but it might become one when an author later adds a + * definition: + * + * ```markdown + * Some text. […][] + * + * […] #read-more "Read more" + * ``` + * + * The second author might expect only their newly added text to form a link, + * but their changes also result in a link for the first author’s text. + * + * @module no-undefined-references + * @summary + * remark-lint rule to warn when undefined definitions are referenced. + * @author Titus Wormer + * @copyright 2016 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-undefined-references/readme.md b/packages/remark-lint-no-undefined-references/readme.md index bec36f4a..c90d2dd1 100644 --- a/packages/remark-lint-no-undefined-references/readme.md +++ b/packages/remark-lint-no-undefined-references/readme.md @@ -10,13 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when references to undefined definitions are found. +[`remark-lint`][mono] rule to warn when undefined definitions are referenced. -Options: `Object`, optional. +## Contents -The object can have an `allow` field, set to an array of strings that may -appear between `[` and `]`, but that should not be treated as link -identifiers. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoUndefinedReferences[, config])`](#unifieduseremarklintnoundefinedreferences-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that referenced definitions are defined. ## Presets @@ -26,7 +45,114 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-undefined-references +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoUndefinedReferences from 'https://cdn.skypack.dev/remark-lint-no-undefined-references@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoUndefinedReferences from 'remark-lint-no-undefined-references' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoUndefinedReferences) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-undefined-references example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-undefined-references", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintNoUndefinedReferences`. + +### `unified().use(remarkLintNoUndefinedReferences[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `undefined`) are accepted: + +* `Object` with the following fields: + * `allow` (`Array`, default: `[]`) + — text that you want to allowed between `[` and `]` even though it’s + undefined + +## Recommendation + +Shortcut references use an implicit syntax that could also occur as plain +text. +For example, it is reasonable to expect an author adding `[…]` to abbreviate +some text somewhere in a document: + +```markdown +> Some […] quote. +``` + +This isn’t a problem, but it might become one when an author later adds a +definition: + +```markdown +Some text. […][] + +[…] #read-more "Read more" +``` + +The second author might expect only their newly added text to form a link, +but their changes also result in a link for the first author’s text. + +## Examples ##### `ok.md` @@ -101,59 +227,12 @@ When configured with `{ allow: [ '...', '…' ] }`. No messages. -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-undefined-references -``` - -This package exports no identifiers. -The default export is `remarkLintNoUndefinedReferences`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-undefined-references", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-undefined-references readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoUndefinedReferences from 'remark-lint-no-undefined-references' - - remark() - .use(remarkLint) -+ .use(remarkLintNoUndefinedReferences) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -195,17 +274,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-unneeded-full-reference-image/index.js b/packages/remark-lint-no-unneeded-full-reference-image/index.js index 832105c9..7f822b67 100644 --- a/packages/remark-lint-no-unneeded-full-reference-image/index.js +++ b/packages/remark-lint-no-unneeded-full-reference-image/index.js @@ -1,15 +1,25 @@ /** + * ## When should I use this? + * + * You can use this package to check that collapsed reference images are + * used instead of full references where possible. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Full reference syntax (`[Text][text]`) is quite verbose compared to + * the concise collapsed reference syntax (`[Text][]`). + * + * @module no-unneeded-full-reference-image + * @summary + * remark-lint rule to warn when full reference images are used that + * could be collapsed. * @author Titus Wormer * @copyright 2019 Titus Wormer * @license MIT - * @module no-unneeded-full-reference-image - * @fileoverview - * Warn when full reference images are used that could be collapsed. - * - * Full references (such as `[Remark][remark]`) can also be written as a - * collapsed reference (`[Remark][]`) if normalising the reference text yields - * the label. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-unneeded-full-reference-image/readme.md b/packages/remark-lint-no-unneeded-full-reference-image/readme.md index ed5dc2c7..34bc0cba 100644 --- a/packages/remark-lint-no-unneeded-full-reference-image/readme.md +++ b/packages/remark-lint-no-unneeded-full-reference-image/readme.md @@ -10,17 +10,124 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when full reference images are used that could be collapsed. +[`remark-lint`][mono] rule to warn when full reference images are used that +could be collapsed. -Full references (such as `[Remark][remark]`) can also be written as a -collapsed reference (`[Remark][]`) if normalising the reference text yields -the label. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoUnneededFullReferenceImage[, config])`](#unifieduseremarklintnounneededfullreferenceimage-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that collapsed reference images are +used instead of full references where possible. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-unneeded-full-reference-image +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoUnneededFullReferenceImage from 'https://cdn.skypack.dev/remark-lint-no-unneeded-full-reference-image@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoUnneededFullReferenceImage from 'remark-lint-no-unneeded-full-reference-image' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoUnneededFullReferenceImage) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-unneeded-full-reference-image example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-unneeded-full-reference-image", + … + ] + } + … +``` + +## API -## Example +This package exports no identifiers. +The default export is `remarkLintNoUnneededFullReferenceImage`. + +### `unified().use(remarkLintNoUnneededFullReferenceImage[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Full reference syntax (`[Text][text]`) is quite verbose compared to +the concise collapsed reference syntax (`[Text][]`). + +## Examples ##### `ok.md` @@ -62,59 +169,12 @@ No messages. 3:1-3:20: Remove the image label as it matches the reference text ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-unneeded-full-reference-image -``` - -This package exports no identifiers. -The default export is `remarkLintNoUnneededFullReferenceImage`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-unneeded-full-reference-image", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-unneeded-full-reference-image readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoUnneededFullReferenceImage from 'remark-lint-no-unneeded-full-reference-image' - - remark() - .use(remarkLint) -+ .use(remarkLintNoUnneededFullReferenceImage) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -156,17 +216,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-unneeded-full-reference-link/index.js b/packages/remark-lint-no-unneeded-full-reference-link/index.js index 6743e767..62e933cc 100644 --- a/packages/remark-lint-no-unneeded-full-reference-link/index.js +++ b/packages/remark-lint-no-unneeded-full-reference-link/index.js @@ -1,15 +1,25 @@ /** + * ## When should I use this? + * + * You can use this package to check that collapsed reference links are + * used instead of full references where possible. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Full reference syntax (`![Alt][alt]`) is quite verbose compared to + * the concise collapsed reference syntax (`![Alt][]`). + * + * @module no-unneeded-full-reference-link + * @summary + * remark-lint rule to warn when full reference links are used that + * could be collapsed. * @author Titus Wormer * @copyright 2019 Titus Wormer * @license MIT - * @module no-unneeded-full-reference-link - * @fileoverview - * Warn when full reference links are used that could be collapsed. - * - * Full references (such as `[Remark][remark]`) can also be written as a - * collapsed reference (`[Remark][]`) if normalising the reference text yields - * the label. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-unneeded-full-reference-link/readme.md b/packages/remark-lint-no-unneeded-full-reference-link/readme.md index 88ab9733..343b4cb9 100644 --- a/packages/remark-lint-no-unneeded-full-reference-link/readme.md +++ b/packages/remark-lint-no-unneeded-full-reference-link/readme.md @@ -10,17 +10,124 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when full reference links are used that could be collapsed. +[`remark-lint`][mono] rule to warn when full reference links are used that +could be collapsed. -Full references (such as `[Remark][remark]`) can also be written as a -collapsed reference (`[Remark][]`) if normalising the reference text yields -the label. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoUnneededFullReferenceLink[, config])`](#unifieduseremarklintnounneededfullreferencelink-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that collapsed reference links are +used instead of full references where possible. ## Presets -This rule is not included in any default preset +This rule is not included in a preset maintained here. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-no-unneeded-full-reference-link +``` + +In Deno with [Skypack][]: + +```js +import remarkLintNoUnneededFullReferenceLink from 'https://cdn.skypack.dev/remark-lint-no-unneeded-full-reference-link@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoUnneededFullReferenceLink from 'remark-lint-no-unneeded-full-reference-link' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoUnneededFullReferenceLink) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-no-unneeded-full-reference-link example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-no-unneeded-full-reference-link", + … + ] + } + … +``` + +## API -## Example +This package exports no identifiers. +The default export is `remarkLintNoUnneededFullReferenceLink`. + +### `unified().use(remarkLintNoUnneededFullReferenceLink[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Full reference syntax (`![Alt][alt]`) is quite verbose compared to +the concise collapsed reference syntax (`![Alt][]`). + +## Examples ##### `ok.md` @@ -68,59 +175,12 @@ No messages. 3:1-3:19: Remove the link label as it matches the reference text ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-no-unneeded-full-reference-link -``` - -This package exports no identifiers. -The default export is `remarkLintNoUnneededFullReferenceLink`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-no-unneeded-full-reference-link", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-no-unneeded-full-reference-link readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoUnneededFullReferenceLink from 'remark-lint-no-unneeded-full-reference-link' - - remark() - .use(remarkLint) -+ .use(remarkLintNoUnneededFullReferenceLink) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -162,17 +222,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-no-unused-definitions/index.js b/packages/remark-lint-no-unused-definitions/index.js index 8c3133a4..8585a0fc 100644 --- a/packages/remark-lint-no-unused-definitions/index.js +++ b/packages/remark-lint-no-unused-definitions/index.js @@ -1,11 +1,22 @@ /** + * ## When should I use this? + * + * You can use this package to check definitions are referenced. + * + * ## API + * + * There are no options. + * + * ## Recommendation + * + * Unused definitions do not contribute anything, so they can be removed. + * + * @module no-unused-definitions + * @summary + * remark-lint rule to warn when unreferenced definitions are used. * @author Titus Wormer * @copyright 2016 Titus Wormer * @license MIT - * @module no-unused-definitions - * @fileoverview - * Warn when unused definitions are found. - * * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-no-unused-definitions/readme.md b/packages/remark-lint-no-unused-definitions/readme.md index 907a0ca4..4c8445cb 100644 --- a/packages/remark-lint-no-unused-definitions/readme.md +++ b/packages/remark-lint-no-unused-definitions/readme.md @@ -10,7 +10,32 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when unused definitions are found. +[`remark-lint`][mono] rule to warn when unreferenced definitions are used. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintNoUnusedDefinitions[, config])`](#unifieduseremarklintnounuseddefinitions-config) +* [Recommendation](#recommendation) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check definitions are referenced. ## Presets @@ -20,90 +45,126 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | | -## Example - -##### `ok.md` - -###### In +## Install -```markdown -[foo][] +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -[foo]: https://example.com +```sh +npm install remark-lint-no-unused-definitions ``` -###### Out +In Deno with [Skypack][]: -No messages. - -##### `not-ok.md` +```js +import remarkLintNoUnusedDefinitions from 'https://cdn.skypack.dev/remark-lint-no-unused-definitions@3?dts' +``` -###### In +In browsers with [Skypack][]: -```markdown -[bar]: https://example.com +```html + ``` -###### Out +## Use -```text -1:1-1:27: Found unused definition -``` +On the API: -## Install +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintNoUnusedDefinitions from 'remark-lint-no-unused-definitions' -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. +main() -[npm][]: +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintNoUnusedDefinitions) + .process(await read('example.md')) -```sh -npm install remark-lint-no-unused-definitions + console.error(reporter(file)) +} ``` -This package exports no identifiers. -The default export is `remarkLintNoUnusedDefinitions`. +On the CLI: -## Use +```sh +remark --use remark-lint --use remark-lint-no-unused-definitions example.md +``` -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-no-unused-definitions", + "remark-lint", ++ "remark-lint-no-unused-definitions", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-no-unused-definitions readme.md +This package exports no identifiers. +The default export is `remarkLintNoUnusedDefinitions`. + +### `unified().use(remarkLintNoUnusedDefinitions[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +Unused definitions do not contribute anything, so they can be removed. + +## Examples + +##### `ok.md` + +###### In + +```markdown +[foo][] + +[foo]: https://example.com ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintNoUnusedDefinitions from 'remark-lint-no-unused-definitions' - - remark() - .use(remarkLint) -+ .use(remarkLintNoUnusedDefinitions) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +```markdown +[bar]: https://example.com ``` +###### Out + +```text +1:1-1:27: Found unused definition +``` + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -144,17 +205,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-ordered-list-marker-style/index.js b/packages/remark-lint-ordered-list-marker-style/index.js index b026f554..6efb8e02 100644 --- a/packages/remark-lint-ordered-list-marker-style/index.js +++ b/packages/remark-lint-ordered-list-marker-style/index.js @@ -1,16 +1,40 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module ordered-list-marker-style - * @fileoverview - * Warn when the list item marker style of ordered lists violate a given style. + * ## When should I use this? + * + * You can use this package to check that ordered list markers are consistent. + * + * ## API + * + * The following options (default: `'consistent'`) are accepted: * - * Options: `'consistent'`, `'.'`, or `')'`, default: `'consistent'`. + * * `'.'` + * — prefer dots + * * `')'` + * — prefer parens + * * `'consistent'` + * — detect the first used style and warn when further markers differ * - * `'consistent'` detects the first used list style and warns when subsequent - * lists use different styles. + * ## Recommendation * + * Parens for list markers were not supported in markdown before CommonMark. + * While they should work in most places now, not all markdown parsers follow + * CommonMark. + * Due to this, it’s recommended to prefer dots. + * + * ## Fix + * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats ordered lists with dots by default. + * Pass + * [`bulletOrdered: ')'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsbulletordered) + * to always use parens. + * + * @module ordered-list-marker-style + * @summary + * remark-lint rule to warn when ordered list markers are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-ordered-list-marker-style/readme.md b/packages/remark-lint-ordered-list-marker-style/readme.md index 1c059191..e790e9ca 100644 --- a/packages/remark-lint-ordered-list-marker-style/readme.md +++ b/packages/remark-lint-ordered-list-marker-style/readme.md @@ -10,12 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the list item marker style of ordered lists violate a given style. +[`remark-lint`][mono] rule to warn when ordered list markers are inconsistent. -Options: `'consistent'`, `'.'`, or `')'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used list style and warns when subsequent -lists use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintOrderedListMarkerStyle[, config])`](#unifieduseremarklintorderedlistmarkerstyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that ordered list markers are consistent. ## Presets @@ -27,7 +48,108 @@ This rule is included in the following presets: | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'.'` | | [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) | `'.'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-ordered-list-marker-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintOrderedListMarkerStyle from 'https://cdn.skypack.dev/remark-lint-ordered-list-marker-style@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintOrderedListMarkerStyle from 'remark-lint-ordered-list-marker-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintOrderedListMarkerStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-ordered-list-marker-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-ordered-list-marker-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintOrderedListMarkerStyle`. + +### `unified().use(remarkLintOrderedListMarkerStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'.'` + — prefer dots +* `')'` + — prefer parens +* `'consistent'` + — detect the first used style and warn when further markers differ + +## Recommendation + +Parens for list markers were not supported in markdown before CommonMark. +While they should work in most places now, not all markdown parsers follow +CommonMark. +Due to this, it’s recommended to prefer dots. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats ordered lists with dots by default. +Pass +[`bulletOrdered: ')'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsbulletordered) +to always use parens. + +## Examples ##### `ok.md` @@ -106,59 +228,12 @@ When configured with `'💩'`. 1:1: Incorrect ordered list item marker style `💩`: use either `'.'` or `')'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-ordered-list-marker-style -``` - -This package exports no identifiers. -The default export is `remarkLintOrderedListMarkerStyle`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-ordered-list-marker-style", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-ordered-list-marker-style readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintOrderedListMarkerStyle from 'remark-lint-ordered-list-marker-style' - - remark() - .use(remarkLint) -+ .use(remarkLintOrderedListMarkerStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -200,17 +275,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-ordered-list-marker-value/index.js b/packages/remark-lint-ordered-list-marker-value/index.js index e83ea34a..9536f588 100644 --- a/packages/remark-lint-ordered-list-marker-value/index.js +++ b/packages/remark-lint-ordered-list-marker-value/index.js @@ -1,32 +1,44 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module ordered-list-marker-value - * @fileoverview - * Warn when the list item marker values of ordered lists violate a given - * style. + * ## When should I use this? + * + * You can use this package to check that ordered list values are consistent. + * + * ## API * - * Options: `'single'`, `'one'`, or `'ordered'`, default: `'ordered'`. + * The following options (default: `'ordered'`) are accepted: * - * When set to `'ordered'`, list item bullets should increment by one, - * relative to the starting point. - * When set to `'single'`, bullets should be the same as the relative starting - * point. - * When set to `'one'`, bullets should always be `1`. + * * `'ordered'` + * — values should increment by one from the first item + * * `'single'` + * — values should stay the same as the first item + * * `'one'` + * — values should always be exactly `1` * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * retains the number of the first list item bullet, and by default - * increments the other items. - * Pass - * [`incrementListMarker: false`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsincrementlistmarker) - * to not increment further list items. + * While `'single'` might be the smartest style, as it makes it easier to move + * items around without having to renumber everything and doesn’t have + * problems with aligning content of the 9th and the 10th item, it’s not used a + * lot and arguably looks unnatural. + * `'one'` is like `'single'` but forces every list to start at `1`. + * While not often needed, starting lists at other values is sometimes useful. + * Due to this, `'ordered'` is recommended, although `'single'` is also a viable + * choice. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * retains the value of the first item and increments further items by default. + * Pass + * [`incrementListMarker: false`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsincrementlistmarker) + * to not increment further items. + * + * @module ordered-list-marker-value + * @summary + * remark-lint rule to warn when ordered list values are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-ordered-list-marker-value/readme.md b/packages/remark-lint-ordered-list-marker-value/readme.md index bdb15946..c16ee8c4 100644 --- a/packages/remark-lint-ordered-list-marker-value/readme.md +++ b/packages/remark-lint-ordered-list-marker-value/readme.md @@ -10,28 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the list item marker values of ordered lists violate a given -style. +[`remark-lint`][mono] rule to warn when ordered list values are inconsistent. -Options: `'single'`, `'one'`, or `'ordered'`, default: `'ordered'`. +## Contents -When set to `'ordered'`, list item bullets should increment by one, -relative to the starting point. -When set to `'single'`, bullets should be the same as the relative starting -point. -When set to `'one'`, bullets should always be `1`. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintOrderedListMarkerValue[, config])`](#unifieduseremarklintorderedlistmarkervalue-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -retains the number of the first list item bullet, and by default -increments the other items. -Pass -[`incrementListMarker: false`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsincrementlistmarker) -to not increment further list items. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that ordered list values are consistent. ## Presets @@ -41,7 +46,112 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'one'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-ordered-list-marker-value +``` + +In Deno with [Skypack][]: + +```js +import remarkLintOrderedListMarkerValue from 'https://cdn.skypack.dev/remark-lint-ordered-list-marker-value@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintOrderedListMarkerValue from 'remark-lint-ordered-list-marker-value' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintOrderedListMarkerValue) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-ordered-list-marker-value example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-ordered-list-marker-value", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintOrderedListMarkerValue`. + +### `unified().use(remarkLintOrderedListMarkerValue[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'ordered'`) are accepted: + +* `'ordered'` + — values should increment by one from the first item +* `'single'` + — values should stay the same as the first item +* `'one'` + — values should always be exactly `1` + +## Recommendation + +While `'single'` might be the smartest style, as it makes it easier to move +items around without having to renumber everything and doesn’t have +problems with aligning content of the 9th and the 10th item, it’s not used a +lot and arguably looks unnatural. +`'one'` is like `'single'` but forces every list to start at `1`. +While not often needed, starting lists at other values is sometimes useful. +Due to this, `'ordered'` is recommended, although `'single'` is also a viable +choice. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +retains the value of the first item and increments further items by default. +Pass +[`incrementListMarker: false`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsincrementlistmarker) +to not increment further items. + +## Examples ##### `ok.md` @@ -209,59 +319,12 @@ When configured with `'💩'`. 1:1: Incorrect ordered list item marker value `💩`: use either `'ordered'`, `'one'`, or `'single'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-ordered-list-marker-value -``` - -This package exports no identifiers. -The default export is `remarkLintOrderedListMarkerValue`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-ordered-list-marker-value", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-ordered-list-marker-value readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintOrderedListMarkerValue from 'remark-lint-ordered-list-marker-value' - - remark() - .use(remarkLint) -+ .use(remarkLintOrderedListMarkerValue) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -303,17 +366,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-rule-style/index.js b/packages/remark-lint-rule-style/index.js index 1e185982..849e8fe7 100644 --- a/packages/remark-lint-rule-style/index.js +++ b/packages/remark-lint-rule-style/index.js @@ -1,33 +1,47 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module rule-style - * @fileoverview - * Warn when the thematic breaks (horizontal rules) violate a given or - * detected style. + * ## When should I use this? + * + * You can use this package to check that rules (thematic breaks, horizontal + * rules) are consistent. + * + * ## API * - * Options: `string`, either a corect thematic breaks such as `***`, or - * `'consistent'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used thematic break style and warns when - * subsequent rules use different styles. + * * `string` (example: `'** * **'`, `'___'`) + * — thematic break to prefer + * * `'consistent'` + * — detect the first used style and warn when further rules differ * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * has three settings that define how rules are created: + * Rules consist of a `*`, `-`, or `_` character, which occurs at least three + * times with nothing else except for arbitrary spaces or tabs on a single line. + * Using spaces, tabs, and more than three markers seems unnecessary work to + * type out. + * Because asterisks can be used as a marker for more markdown constructs, + * it’s recommended to use that for rules (and lists, emphasis, strong) too. + * Due to this, it’s recommended to pass `'***'`. * - * * [`rule`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsrule) - * (default: `*`) — Marker to use - * * [`ruleRepetition`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsrulerepetition) - * (default: `3`) — Number of markers to use - * * [`ruleSpaces`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsrulespaces) - * (default: `true`) — Whether to pad markers with spaces + * ## Fix * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats rules with `***` by default. + * There are three settings to control rules: * + * * [`rule`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsrule) + * (default: `'*'`) — marker + * * [`ruleRepetition`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsrulerepetition) + * (default: `3`) — repetitions + * * [`ruleSpaces`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsrulespaces) + * (default: `false`) — use spaces between markers + * + * @module rule-style + * @summary + * remark-lint rule to warn when rule markers are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "setting": "* * *"} * diff --git a/packages/remark-lint-rule-style/readme.md b/packages/remark-lint-rule-style/readme.md index f37fcbc3..90039838 100644 --- a/packages/remark-lint-rule-style/readme.md +++ b/packages/remark-lint-rule-style/readme.md @@ -10,29 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the thematic breaks (horizontal rules) violate a given or -detected style. +[`remark-lint`][mono] rule to warn when rule markers are inconsistent. -Options: `string`, either a corect thematic breaks such as `***`, or -`'consistent'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used thematic break style and warns when -subsequent rules use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintRuleStyle[, config])`](#unifieduseremarklintrulestyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -has three settings that define how rules are created: +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. -* [`rule`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsrule) - (default: `*`) — Marker to use -* [`ruleRepetition`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsrulerepetition) - (default: `3`) — Number of markers to use -* [`ruleSpaces`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsrulespaces) - (default: `true`) — Whether to pad markers with spaces +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that rules (thematic breaks, horizontal +rules) are consistent. ## Presets @@ -43,7 +48,114 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'---'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-rule-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintRuleStyle from 'https://cdn.skypack.dev/remark-lint-rule-style@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintRuleStyle from 'remark-lint-rule-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintRuleStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-rule-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-rule-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintRuleStyle`. + +### `unified().use(remarkLintRuleStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `string` (example: `'** * **'`, `'___'`) + — thematic break to prefer +* `'consistent'` + — detect the first used style and warn when further rules differ + +## Recommendation + +Rules consist of a `*`, `-`, or `_` character, which occurs at least three +times with nothing else except for arbitrary spaces or tabs on a single line. +Using spaces, tabs, and more than three markers seems unnecessary work to +type out. +Because asterisks can be used as a marker for more markdown constructs, +it’s recommended to use that for rules (and lists, emphasis, strong) too. +Due to this, it’s recommended to pass `'***'`. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats rules with `***` by default. +There are three settings to control rules: + +* [`rule`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsrule) + (default: `'*'`) — marker +* [`ruleRepetition`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsrulerepetition) + (default: `3`) — repetitions +* [`ruleSpaces`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsrulespaces) + (default: `false`) — use spaces between markers + +## Examples ##### `ok.md` @@ -103,59 +215,12 @@ When configured with `'💩'`. 1:1: Incorrect preferred rule style: provide a correct markdown rule or `'consistent'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-rule-style -``` - -This package exports no identifiers. -The default export is `remarkLintRuleStyle`. - -## Use +## Compatibility -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-rule-style", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-rule-style readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintRuleStyle from 'remark-lint-rule-style' - - remark() - .use(remarkLint) -+ .use(remarkLintRuleStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -197,17 +262,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-strikethrough-marker/index.js b/packages/remark-lint-strikethrough-marker/index.js index b744b056..1f823ab7 100644 --- a/packages/remark-lint-strikethrough-marker/index.js +++ b/packages/remark-lint-strikethrough-marker/index.js @@ -1,21 +1,40 @@ /** - * @author Denis Augsburger - * @copyright 2021 Denis Augsburger - * @license MIT - * @module strikethrough-marker - * @fileoverview - * Warn for violating strikethrough markers. + * ## When should I use this? + * + * You can use this package to check that the number of strikethrough + * markers is consistent. + * Strikethrough is a GFM feature enabled with + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm). + * + * ## API * - * Options: `'consistent'`, `'~'`, or `'~~'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used strikethrough style and warns when - * subsequent strikethrough use different styles. + * * `'~'` + * — prefer one strikethrough marker + * * `'~~'` + * — prefer two strikethrough markers + * * `'consistent'` + * — detect the first used style and warn when further strikethrough differs * - * ## Fix + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * GitHub flavored markdown (GFM) specifies that two tildes should be used, + * but `github.com` allows one tilde everywhere. + * It’s recommended to use two tildes. * + * ## Fix + * + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm) + * formats all strikethrough with two tildes. + * + * @module strikethrough-marker + * @summary + * remark-lint rule to warn when the number of strikethrough markers + * is inconsistent. + * @author Denis Augsburger + * @copyright 2021 Denis Augsburger + * @license MIT * @example * {"setting": "~", "name": "ok.md", "gfm": true} * diff --git a/packages/remark-lint-strikethrough-marker/readme.md b/packages/remark-lint-strikethrough-marker/readme.md index c8b6789e..4342c92e 100644 --- a/packages/remark-lint-strikethrough-marker/readme.md +++ b/packages/remark-lint-strikethrough-marker/readme.md @@ -10,23 +10,140 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for violating strikethrough markers. +[`remark-lint`][mono] rule to warn when the number of strikethrough markers +is inconsistent. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintStrikethroughMarker[, config])`](#unifieduseremarklintstrikethroughmarker-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that the number of strikethrough +markers is consistent. +Strikethrough is a GFM feature enabled with +[`remark-gfm`](https://github.com/remarkjs/remark-gfm). -Options: `'consistent'`, `'~'`, or `'~~'`, default: `'consistent'`. +## Presets -`'consistent'` detects the first used strikethrough style and warns when -subsequent strikethrough use different styles. +This rule is not included in a preset maintained here. -## Fix +## Install -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -## Presets +```sh +npm install remark-lint-strikethrough-marker +``` + +In Deno with [Skypack][]: + +```js +import remarkLintStrikethroughMarker from 'https://cdn.skypack.dev/remark-lint-strikethrough-marker@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintStrikethroughMarker from 'remark-lint-strikethrough-marker' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintStrikethroughMarker) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-strikethrough-marker example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-strikethrough-marker", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintStrikethroughMarker`. + +### `unified().use(remarkLintStrikethroughMarker[, config])` -This rule is not included in any default preset +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). -## Example +The following options (default: `'consistent'`) are accepted: + +* `'~'` + — prefer one strikethrough marker +* `'~~'` + — prefer two strikethrough markers +* `'consistent'` + — detect the first used style and warn when further strikethrough differs + +## Recommendation + +GitHub flavored markdown (GFM) specifies that two tildes should be used, +but `github.com` allows one tilde everywhere. +It’s recommended to use two tildes. + +## Fix + +[`remark-gfm`](https://github.com/remarkjs/remark-gfm) +formats all strikethrough with two tildes. + +## Examples ##### `ok.md` @@ -34,7 +151,7 @@ When configured with `'~'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown ~foo~ @@ -50,7 +167,7 @@ When configured with `'~'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown ~~foo~~ @@ -68,7 +185,7 @@ When configured with `'~~'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown ~~foo~~ @@ -84,7 +201,7 @@ When configured with `'~~'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown ~foo~ @@ -100,7 +217,7 @@ Note: this example uses [GFM][]. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown ~~foo~~ @@ -123,59 +240,12 @@ When configured with `'💩'`. 1:1: Incorrect strikethrough marker `💩`: use either `'consistent'`, `'~'`, or `'~~'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-strikethrough-marker -``` - -This package exports no identifiers. -The default export is `remarkLintStrikethroughMarker`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-strikethrough-marker", - … - ] - } - … -``` - -Or use it on the CLI directly +## Compatibility -```sh -remark -u lint -u lint-strikethrough-marker readme.md -``` - -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintStrikethroughMarker from 'remark-lint-strikethrough-marker' - - remark() - .use(remarkLint) -+ .use(remarkLintStrikethroughMarker) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -217,17 +287,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-strong-marker/index.js b/packages/remark-lint-strong-marker/index.js index 18b000ea..2dc5fe64 100644 --- a/packages/remark-lint-strong-marker/index.js +++ b/packages/remark-lint-strong-marker/index.js @@ -1,27 +1,44 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module strong-marker - * @fileoverview - * Warn for violating importance (strong) markers. + * ## When should I use this? + * + * You can use this package to check that strong markers are consistent. + * + * ## API * - * Options: `'consistent'`, `'*'`, or `'_'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used importance style and warns when - * subsequent importance sequences use different styles. + * * `'*'` + * — prefer asterisks + * * `'_'` + * — prefer underscores + * * `'consistent'` + * — detect the first used style and warn when further strong differs * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats importance using an `*` (asterisk) by default. - * Pass - * [`strong: '_'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsstrong) - * to use `_` (underscore) instead. + * Underscores and asterisks work slightly different: asterisks can form strong + * in more cases than underscores. + * Because underscores are sometimes used to represent normal underscores inside + * words, there are extra rules supporting that. + * Asterisks can also be used as the marker of more constructs than underscores: + * lists. + * Due to having simpler parsing rules, looking more like syntax, and that they + * can be used for more constructs, it’s recommended to prefer asterisks. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats strong with asterisks by default. + * Pass + * [`strong: '_'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsstrong) + * to always use underscores. + * + * @module strong-marker + * @summary + * remark-lint rule to warn when strong markers are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-strong-marker/readme.md b/packages/remark-lint-strong-marker/readme.md index 11cc2260..ad5ea611 100644 --- a/packages/remark-lint-strong-marker/readme.md +++ b/packages/remark-lint-strong-marker/readme.md @@ -10,23 +10,33 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn for violating importance (strong) markers. +[`remark-lint`][mono] rule to warn when strong markers are inconsistent. -Options: `'consistent'`, `'*'`, or `'_'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used importance style and warns when -subsequent importance sequences use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintStrongMarker[, config])`](#unifieduseremarklintstrongmarker-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats importance using an `*` (asterisk) by default. -Pass -[`strong: '_'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsstrong) -to use `_` (underscore) instead. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that strong markers are consistent. ## Presets @@ -37,7 +47,112 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'*'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-strong-marker +``` + +In Deno with [Skypack][]: + +```js +import remarkLintStrongMarker from 'https://cdn.skypack.dev/remark-lint-strong-marker@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintStrongMarker from 'remark-lint-strong-marker' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintStrongMarker) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-strong-marker example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-strong-marker", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintStrongMarker`. + +### `unified().use(remarkLintStrongMarker[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'*'` + — prefer asterisks +* `'_'` + — prefer underscores +* `'consistent'` + — detect the first used style and warn when further strong differs + +## Recommendation + +Underscores and asterisks work slightly different: asterisks can form strong +in more cases than underscores. +Because underscores are sometimes used to represent normal underscores inside +words, there are extra rules supporting that. +Asterisks can also be used as the marker of more constructs than underscores: +lists. +Due to having simpler parsing rules, looking more like syntax, and that they +can be used for more constructs, it’s recommended to prefer asterisks. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats strong with asterisks by default. +Pass +[`strong: '_'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsstrong) +to always use underscores. + +## Examples ##### `ok.md` @@ -115,59 +230,12 @@ When configured with `'💩'`. 1:1: Incorrect strong marker `💩`: use either `'consistent'`, `'*'`, or `'_'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-strong-marker -``` - -This package exports no identifiers. -The default export is `remarkLintStrongMarker`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-strong-marker", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-strong-marker readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintStrongMarker from 'remark-lint-strong-marker' - - remark() - .use(remarkLint) -+ .use(remarkLintStrongMarker) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -209,17 +277,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-table-cell-padding/index.js b/packages/remark-lint-table-cell-padding/index.js index 04bbc027..5cf87240 100644 --- a/packages/remark-lint-table-cell-padding/index.js +++ b/packages/remark-lint-table-cell-padding/index.js @@ -1,27 +1,40 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module table-cell-padding - * @fileoverview - * Warn when table cells are incorrectly padded. + * ## When should I use this? + * + * You can use this package to check that table cells are padded consistently. + * Tables are a GFM feature enabled with + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm). + * + * ## API * - * Options: `'consistent'`, `'padded'`, or `'compact'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used cell padding style and warns when - * subsequent cells use different styles. + * * `'padded'` + * — prefer at least one space between pipes and content + * * `'compact'` + * — prefer zero spaces between pipes and content + * * `'consistent'` + * — detect the first used style and warn when further tables differ * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats tables with padding by default. - * Pass - * [`spacedTable: false`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsspacedtable) - * to not use padding. + * It’s recommended to use at least one space between pipes and content for + * legibility of the markup (`'padded'`). * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm) + * formats all table cells as padded by default. + * Pass + * [`tableCellPadding: false`](https://github.com/remarkjs/remark-gfm#optionstablecellpadding) + * to use a more compact style. + * + * @module table-cell-padding + * @summary + * remark-lint rule to warn when table cells are inconsistently padded. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "setting": "padded", "gfm": true} * diff --git a/packages/remark-lint-table-cell-padding/readme.md b/packages/remark-lint-table-cell-padding/readme.md index e4ff95a0..d6cb8096 100644 --- a/packages/remark-lint-table-cell-padding/readme.md +++ b/packages/remark-lint-table-cell-padding/readme.md @@ -10,23 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when table cells are incorrectly padded. +[`remark-lint`][mono] rule to warn when table cells are inconsistently padded. -Options: `'consistent'`, `'padded'`, or `'compact'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used cell padding style and warns when -subsequent cells use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintTableCellPadding[, config])`](#unifieduseremarklinttablecellpadding-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats tables with padding by default. -Pass -[`spacedTable: false`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsspacedtable) -to not use padding. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that table cells are padded consistently. +Tables are a GFM feature enabled with +[`remark-gfm`](https://github.com/remarkjs/remark-gfm). ## Presets @@ -37,7 +49,106 @@ This rule is included in the following presets: | [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) | `'consistent'` | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'padded'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-table-cell-padding +``` + +In Deno with [Skypack][]: + +```js +import remarkLintTableCellPadding from 'https://cdn.skypack.dev/remark-lint-table-cell-padding@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintTableCellPadding from 'remark-lint-table-cell-padding' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintTableCellPadding) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-table-cell-padding example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-table-cell-padding", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintTableCellPadding`. + +### `unified().use(remarkLintTableCellPadding[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'padded'` + — prefer at least one space between pipes and content +* `'compact'` + — prefer zero spaces between pipes and content +* `'consistent'` + — detect the first used style and warn when further tables differ + +## Recommendation + +It’s recommended to use at least one space between pipes and content for +legibility of the markup (`'padded'`). + +## Fix + +[`remark-gfm`](https://github.com/remarkjs/remark-gfm) +formats all table cells as padded by default. +Pass +[`tableCellPadding: false`](https://github.com/remarkjs/remark-gfm#optionstablecellpadding) +to use a more compact style. + +## Examples ##### `ok.md` @@ -45,7 +156,7 @@ When configured with `'padded'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown | A | B | @@ -63,7 +174,7 @@ When configured with `'padded'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown | A | B | @@ -101,7 +212,7 @@ When configured with `'padded'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown @@ -125,7 +236,7 @@ When configured with `'padded'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown @@ -146,7 +257,7 @@ When configured with `'compact'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown |A |B | @@ -164,7 +275,7 @@ When configured with `'compact'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown | A | B | @@ -190,7 +301,7 @@ When configured with `'consistent'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown | A | B | @@ -212,7 +323,7 @@ When configured with `'consistent'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown | A | B | @@ -236,7 +347,7 @@ When configured with `'consistent'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown |A |B | @@ -258,7 +369,7 @@ When configured with `'consistent'`. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown |A |B | @@ -286,59 +397,12 @@ When configured with `'💩'`. 1:1: Incorrect table cell padding style `💩`, expected `'padded'`, `'compact'`, or `'consistent'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-table-cell-padding -``` - -This package exports no identifiers. -The default export is `remarkLintTableCellPadding`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-table-cell-padding", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-table-cell-padding readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintTableCellPadding from 'remark-lint-table-cell-padding' - - remark() - .use(remarkLint) -+ .use(remarkLintTableCellPadding) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -380,17 +444,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-table-pipe-alignment/index.js b/packages/remark-lint-table-pipe-alignment/index.js index 6e8c96c1..5d420e3b 100644 --- a/packages/remark-lint-table-pipe-alignment/index.js +++ b/packages/remark-lint-table-pipe-alignment/index.js @@ -1,30 +1,40 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module table-pipe-alignment - * @fileoverview - * Warn when table pipes are not aligned. + * ## When should I use this? + * + * You can use this package to check that table cell dividers are aligned. + * Tables are a GFM feature enabled with + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm). + * + * ## API * - * ## Fix + * There are no options. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * tries to align tables by default. - * Pass - * [`paddedTable: false`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionspaddedtable) - * to not align cells. + * ## Recommendation * - * Aligning cells perfectly is impossible as some characters (such as emoji or - * Chinese characters) are rendered differently in different browsers, - * terminals, and editors. - * You can pass your own - * [`stringLength`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsstringlength) - * function to customize how cells are aligned. - * In that case, this rule must be turned off. + * While aligning table dividers improves their legibility, it is somewhat + * hard to maintain manually, especially for tables with many rows. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm) + * aligns table dividers by default. + * Pass + * [`tablePipeAlign: false`](https://github.com/remarkjs/remark-gfm#optionstablepipealign) + * to use a more compact style. + * + * Aligning characters is impossible because whether they look aligned or not + * depends on where the markup is shown: some characters (such as emoji or + * Chinese characters) show smaller or bigger in different places. + * You can pass your own + * [`stringLength`](https://github.com/remarkjs/remark-gfm#optionsstringlength) + * to `remark-gfm`, in which case this rule must be turned off. + * + * @module table-pipe-alignment + * @summary + * remark-lint rule to warn when table cells are inconsistently padded. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "gfm": true} * @@ -48,8 +58,6 @@ /** * @typedef {import('mdast').Root} Root - * @typedef {'-'|'*'|'+'} Marker - * @typedef {'consistent'|Marker} Options */ import {lintRule} from 'unified-lint-rule' diff --git a/packages/remark-lint-table-pipe-alignment/readme.md b/packages/remark-lint-table-pipe-alignment/readme.md index b4646c7f..ad55a666 100644 --- a/packages/remark-lint-table-pipe-alignment/readme.md +++ b/packages/remark-lint-table-pipe-alignment/readme.md @@ -10,26 +10,35 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when table pipes are not aligned. +[`remark-lint`][mono] rule to warn when table cells are inconsistently padded. -## Fix +## Contents -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -tries to align tables by default. -Pass -[`paddedTable: false`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionspaddedtable) -to not align cells. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintTablePipeAlignment[, config])`](#unifieduseremarklinttablepipealignment-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -Aligning cells perfectly is impossible as some characters (such as emoji or -Chinese characters) are rendered differently in different browsers, -terminals, and editors. -You can pass your own -[`stringLength`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsstringlength) -function to customize how cells are aligned. -In that case, this rule must be turned off. +## What is this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that table cell dividers are aligned. +Tables are a GFM feature enabled with +[`remark-gfm`](https://github.com/remarkjs/remark-gfm). ## Presets @@ -39,97 +48,149 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install -##### `ok.md` +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: -###### In +```sh +npm install remark-lint-table-pipe-alignment +``` -Note: this example uses [GFM][]. +In Deno with [Skypack][]: -```markdown -| A | B | -| ----- | ----- | -| Alpha | Bravo | +```js +import remarkLintTablePipeAlignment from 'https://cdn.skypack.dev/remark-lint-table-pipe-alignment@3?dts' ``` -###### Out +In browsers with [Skypack][]: -No messages. +```html + +``` -##### `not-ok.md` +## Use -###### In +On the API: -Note: this example uses [GFM][]. +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintTablePipeAlignment from 'remark-lint-table-pipe-alignment' -```markdown -| A | B | -| -- | -- | -| Alpha | Bravo | -``` +main() -###### Out +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintTablePipeAlignment) + .process(await read('example.md')) -```text -3:9-3:10: Misaligned table fence -3:17-3:18: Misaligned table fence + console.error(reporter(file)) +} ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +On the CLI: ```sh -npm install remark-lint-table-pipe-alignment +remark --use remark-lint --use remark-lint-table-pipe-alignment example.md ``` -This package exports no identifiers. -The default export is `remarkLintTablePipeAlignment`. - -## Use - -You probably want to use it on the CLI through a config file: +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … - "lint", -+ "lint-table-pipe-alignment", + "remark-lint", ++ "remark-lint-table-pipe-alignment", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint -u lint-table-pipe-alignment readme.md +This package exports no identifiers. +The default export is `remarkLintTablePipeAlignment`. + +### `unified().use(remarkLintTablePipeAlignment[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +While aligning table dividers improves their legibility, it is somewhat +hard to maintain manually, especially for tables with many rows. + +## Fix + +[`remark-gfm`](https://github.com/remarkjs/remark-gfm) +aligns table dividers by default. +Pass +[`tablePipeAlign: false`](https://github.com/remarkjs/remark-gfm#optionstablepipealign) +to use a more compact style. + +Aligning characters is impossible because whether they look aligned or not +depends on where the markup is shown: some characters (such as emoji or +Chinese characters) show smaller or bigger in different places. +You can pass your own +[`stringLength`](https://github.com/remarkjs/remark-gfm#optionsstringlength) +to `remark-gfm`, in which case this rule must be turned off. + +## Examples + +##### `ok.md` + +###### In + +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). + +```markdown +| A | B | +| ----- | ----- | +| Alpha | Bravo | ``` -Or use this on the API: +###### Out -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintTablePipeAlignment from 'remark-lint-table-pipe-alignment' - - remark() - .use(remarkLint) -+ .use(remarkLintTablePipeAlignment) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) +No messages. + +##### `not-ok.md` + +###### In + +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). + +```markdown +| A | B | +| -- | -- | +| Alpha | Bravo | +``` + +###### Out + +```text +3:9-3:10: Misaligned table fence +3:17-3:18: Misaligned table fence ``` +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -170,17 +231,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-table-pipes/index.js b/packages/remark-lint-table-pipes/index.js index cb11121c..ab2a2c06 100644 --- a/packages/remark-lint-table-pipes/index.js +++ b/packages/remark-lint-table-pipes/index.js @@ -1,19 +1,32 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module table-pipes - * @fileoverview - * Warn when table rows are not fenced with pipes. + * ## When should I use this? + * + * You can use this package to check that tables have initial and final + * delimiters. + * Tables are a GFM feature enabled with + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm). + * + * ## API * - * ## Fix + * There are no options. * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * creates fenced rows with initial and final pipes by default. + * ## Recommendation * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * While tables don’t require initial or final delimiters (pipes before the + * first and after the last cells in a row), it arguably does look weird. * + * ## Fix + * + * [`remark-gfm`](https://github.com/remarkjs/remark-gfm) + * formats all tables with initial and final delimiters. + * + * @module table-pipes + * @summary + * remark-lint rule to warn when tables are missing initial and final + * delimiters. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md", "gfm": true} * diff --git a/packages/remark-lint-table-pipes/readme.md b/packages/remark-lint-table-pipes/readme.md index 51156581..b6bb0e1e 100644 --- a/packages/remark-lint-table-pipes/readme.md +++ b/packages/remark-lint-table-pipes/readme.md @@ -10,15 +10,37 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when table rows are not fenced with pipes. - -## Fix - -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -creates fenced rows with initial and final pipes by default. - -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +[`remark-lint`][mono] rule to warn when tables are missing initial and final +delimiters. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintTablePipes[, config])`](#unifieduseremarklinttablepipes-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that tables have initial and final +delimiters. +Tables are a GFM feature enabled with +[`remark-gfm`](https://github.com/remarkjs/remark-gfm). ## Presets @@ -28,13 +50,102 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-table-pipes +``` + +In Deno with [Skypack][]: + +```js +import remarkLintTablePipes from 'https://cdn.skypack.dev/remark-lint-table-pipes@4?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintTablePipes from 'remark-lint-table-pipes' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintTablePipes) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-table-pipes example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-table-pipes", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintTablePipes`. + +### `unified().use(remarkLintTablePipes[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +There are no options. + +## Recommendation + +While tables don’t require initial or final delimiters (pipes before the +first and after the last cells in a row), it arguably does look weird. + +## Fix + +[`remark-gfm`](https://github.com/remarkjs/remark-gfm) +formats all tables with initial and final delimiters. + +## Examples ##### `ok.md` ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown | A | B | @@ -50,7 +161,7 @@ No messages. ###### In -Note: this example uses [GFM][]. +> 👉 **Note**: this example uses GFM ([`remark-gfm`][gfm]). ```markdown A | B @@ -67,59 +178,12 @@ Alpha | Bravo 3:14: Missing final pipe in table fence ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-table-pipes -``` - -This package exports no identifiers. -The default export is `remarkLintTablePipes`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-table-pipes", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-table-pipes readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintTablePipes from 'remark-lint-table-pipes' - - remark() - .use(remarkLint) -+ .use(remarkLintTablePipes) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -161,17 +225,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint-unordered-list-marker-style/index.js b/packages/remark-lint-unordered-list-marker-style/index.js index f94cfe29..4e3cb479 100644 --- a/packages/remark-lint-unordered-list-marker-style/index.js +++ b/packages/remark-lint-unordered-list-marker-style/index.js @@ -1,28 +1,42 @@ /** - * @author Titus Wormer - * @copyright 2015 Titus Wormer - * @license MIT - * @module unordered-list-marker-style - * @fileoverview - * Warn when the list item marker style of unordered lists violate a given - * style. + * ## When should I use this? + * + * You can use this package to check that unordered list markers (bullets) + * are consistent. + * + * ## API * - * Options: `'consistent'`, `'-'`, `'*'`, or `'+'`, default: `'consistent'`. + * The following options (default: `'consistent'`) are accepted: * - * `'consistent'` detects the first used list style and warns when subsequent - * lists use different styles. + * * `'*'` + * — prefer asterisks + * * `'+'` + * — prefer plusses + * * `'-'` + * — prefer dashes + * * `'consistent'` + * — detect the first used style and warn when further markers differ * - * ## Fix + * ## Recommendation * - * [`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) - * formats unordered lists using `-` (hyphen-minus) by default. - * Pass - * [`bullet: '*'` or `bullet: '+'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsbullet) - * to use `*` (asterisk) or `+` (plus sign) instead. + * Because asterisks can be used as a marker for more markdown constructs, + * it’s recommended to use that for lists (and thematic breaks, emphasis, + * strong) too. * - * See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) - * on how to automatically fix warnings for this rule. + * ## Fix * + * [`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) + * formats ordered lists with asterisks by default. + * Pass + * [`bullet: '+'` or `bullet: '-'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsbullet) + * to always use plusses or dashes. + * + * @module unordered-list-marker-style + * @summary + * remark-lint rule to warn when unordered list markers are inconsistent. + * @author Titus Wormer + * @copyright 2015 Titus Wormer + * @license MIT * @example * {"name": "ok.md"} * diff --git a/packages/remark-lint-unordered-list-marker-style/readme.md b/packages/remark-lint-unordered-list-marker-style/readme.md index a3d92d2c..8ce6077d 100644 --- a/packages/remark-lint-unordered-list-marker-style/readme.md +++ b/packages/remark-lint-unordered-list-marker-style/readme.md @@ -10,24 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -Warn when the list item marker style of unordered lists violate a given -style. +[`remark-lint`][mono] rule to warn when unordered list markers are inconsistent. -Options: `'consistent'`, `'-'`, `'*'`, or `'+'`, default: `'consistent'`. +## Contents -`'consistent'` detects the first used list style and warns when subsequent -lists use different styles. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLintUnorderedListMarkerStyle[, config])`](#unifieduseremarklintunorderedlistmarkerstyle-config) +* [Recommendation](#recommendation) +* [Fix](#fix) +* [Examples](#examples) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Fix +## What is this? -[`remark-stringify`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify) -formats unordered lists using `-` (hyphen-minus) by default. -Pass -[`bullet: '*'` or `bullet: '+'`](https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#optionsbullet) -to use `*` (asterisk) or `+` (plus sign) instead. +This package is a [unified][] ([remark][]) plugin, specifically a `remark-lint` +rule. +Lint rules check markdown code style. + +## When should I use this? -See [Using remark to fix your Markdown](https://github.com/remarkjs/remark-lint#using-remark-to-fix-your-markdown) -on how to automatically fix warnings for this rule. +You can use this package to check that unordered list markers (bullets) +are consistent. ## Presets @@ -37,7 +47,109 @@ This rule is included in the following presets: | - | - | | [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) | `'-'` | -## Example +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install remark-lint-unordered-list-marker-style +``` + +In Deno with [Skypack][]: + +```js +import remarkLintUnorderedListMarkerStyle from 'https://cdn.skypack.dev/remark-lint-unordered-list-marker-style@3?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' +import remarkLintUnorderedListMarkerStyle from 'remark-lint-unordered-list-marker-style' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .use(remarkLintUnorderedListMarkerStyle) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint --use remark-lint-unordered-list-marker-style example.md +``` + +On the CLI in a config file (here a `package.json`): + +```diff + … + "remarkConfig": { + "plugins": [ + … + "remark-lint", ++ "remark-lint-unordered-list-marker-style", + … + ] + } + … +``` + +## API + +This package exports no identifiers. +The default export is `remarkLintUnorderedListMarkerStyle`. + +### `unified().use(remarkLintUnorderedListMarkerStyle[, config])` + +This rule supports standard configuration that all remark lint rules accept +(such as `false` to turn it off or `[1, options]` to configure it). + +The following options (default: `'consistent'`) are accepted: + +* `'*'` + — prefer asterisks +* `'+'` + — prefer plusses +* `'-'` + — prefer dashes +* `'consistent'` + — detect the first used style and warn when further markers differ + +## Recommendation + +Because asterisks can be used as a marker for more markdown constructs, +it’s recommended to use that for lists (and thematic breaks, emphasis, +strong) too. + +## Fix + +[`remark-stringify`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify) +formats ordered lists with asterisks by default. +Pass +[`bullet: '+'` or `bullet: '-'`](https://github.com/remarkjs/remark/tree/main/packages/remark-stringify#optionsbullet) +to always use plusses or dashes. + +## Examples ##### `ok.md` @@ -131,59 +243,12 @@ When configured with `'💩'`. 1:1: Incorrect unordered list item marker style `💩`: use either `'-'`, `'*'`, or `'+'` ``` -## Install - -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: - -```sh -npm install remark-lint-unordered-list-marker-style -``` - -This package exports no identifiers. -The default export is `remarkLintUnorderedListMarkerStyle`. - -## Use - -You probably want to use it on the CLI through a config file: - -```diff - … - "remarkConfig": { - "plugins": [ - … - "lint", -+ "lint-unordered-list-marker-style", - … - ] - } - … -``` - -Or use it on the CLI directly - -```sh -remark -u lint -u lint-unordered-list-marker-style readme.md -``` +## Compatibility -Or use this on the API: - -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remark-lint' - import remarkLintUnorderedListMarkerStyle from 'remark-lint-unordered-list-marker-style' - - remark() - .use(remarkLint) -+ .use(remarkLintUnorderedListMarkerStyle) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -225,17 +290,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-lint/readme.md b/packages/remark-lint/readme.md index 6f98519d..64ffeec0 100644 --- a/packages/remark-lint/readme.md +++ b/packages/remark-lint/readme.md @@ -8,63 +8,116 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -[**remark**][remark] plugin to lint Markdown code style. +**[remark][]** plugin to support configuration comments for remark lint rules. -Read more about `remark-lint` on [the monorepo readme][readme]. +See the [monorepo readme][mono] for more info on remark lint. -This package doesn’t do much other than [suppressing messages][suppres] through -comments. +## Contents -If you’re using [presets][], they already include `remark-lint` itself. -If you’re using just plugins, you have to include `remark-lint` explicitly. +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkLint)`](#unifieduseremarklint) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) -## Install +## What is this? + +This package is a [unified][] ([remark][]) plugin to add support for +configuration comments to control remark lint rule messages. + +## When should I use this? + +This project is useful when you’re using remark lint rules and want to let +authors ignore messages in certain cases. +This package is already included in all our presets. +If you’re building a preset yourself, you should include this package. -This package is [ESM only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c): -Node 12+ is needed to use it and it must be `import`ed instead of `require`d. +## Install -[npm][]: +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: ```sh npm install remark-lint ``` +In Deno with [Skypack][]: + +```js +import remarkLint from 'https://cdn.skypack.dev/remark-lint@9?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + ## Use -You probably want to use it on the CLI through a config file: +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkLint from 'remark-lint' + +main() + +async function main() { + const file = await remark() + .use(remarkLint) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-lint example.md +``` + +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { "plugins": [ … -+ "lint", ++ "remark-lint", … ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u lint readme.md -``` +This package exports no identifiers. +The default export is `remarkLint`. -Or use this on the API: +### `unified().use(remarkLint)` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkLint from 'remarkLint' - - remark() -+ .use(remarkLint) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Add support for configuration comments. +There are no options. + +See [Ignore warnings][ignore] in the monorepo readme for how to use it. + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -108,24 +161,28 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license [author]: https://wooorm.com -[remark]: https://github.com/remarkjs/remark +[unified]: https://github.com/unifiedjs/unified -[readme]: https://github.com/remarkjs/remark-lint#readme +[remark]: https://github.com/remarkjs/remark -[suppres]: https://github.com/remarkjs/remark-lint#configuring-remark-lint +[mono]: https://github.com/remarkjs/remark-lint -[presets]: https://github.com/remarkjs/remark-lint#list-of-presets +[ignore]: https://github.com/remarkjs/remark-lint#ignore-warnings diff --git a/packages/remark-preset-lint-consistent/index.js b/packages/remark-preset-lint-consistent/index.js index a6ffd09d..5e935771 100644 --- a/packages/remark-preset-lint-consistent/index.js +++ b/packages/remark-preset-lint-consistent/index.js @@ -1,7 +1,10 @@ /** - * @fileoverview - * remark preset to configure `remark-lint` with settings that enforce - * consistency. + * ## When should I use this? + * + * You can use this package to check that markdown is consistent. + * + * @summary + * Preset of remark-lint rules to warn for inconsistencies. */ /** diff --git a/packages/remark-preset-lint-consistent/readme.md b/packages/remark-preset-lint-consistent/readme.md index 5870e331..aecc50e1 100644 --- a/packages/remark-preset-lint-consistent/readme.md +++ b/packages/remark-preset-lint-consistent/readme.md @@ -10,12 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -remark preset to configure `remark-lint` with settings that enforce -consistency. +Preset of [`remark-lint`][mono] rules to warn for inconsistencies. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Rules](#rules) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkPresetLintConsistent)`](#unifieduseremarkpresetlintconsistent) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) preset, specifically consisting of +`remark-lint` rules. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that markdown is consistent. ## Rules -This preset configures [`remark-lint`](https://github.com/remarkjs/remark-lint) with the following rules: +This preset configures [`remark-lint`][mono] with the following rules: | Rule | Setting | | - | - | @@ -34,50 +56,86 @@ This preset configures [`remark-lint`](https://github.com/remarkjs/remark-lint) ## Install -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: ```sh npm install remark-preset-lint-consistent ``` -This package exports no identifiers. -The default export is `remarkPresetLintConsistent`. +In Deno with [Skypack][]: + +```js +import remarkPresetLintConsistent from 'https://cdn.skypack.dev/remark-preset-lint-consistent@5?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` ## Use -You probably want to use it on the CLI through a config file: +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkPresetLintConsistent from 'remark-preset-lint-consistent' + +main() + +async function main() { + const file = await remark() + .use(remarkPresetLintConsistent) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-preset-lint-consistent example.md +``` + +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { -+ "plugins": ["preset-lint-consistent"] + "plugins": [ + … ++ "remark-preset-lint-consistent", + … + ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u preset-lint-consistent readme.md -``` +This package exports no identifiers. +The default export is `remarkPresetLintConsistent`. -Or use this on the API: +### `unified().use(remarkPresetLintConsistent)` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkPresetLintConsistent from 'remark-preset-lint-consistent' - - remark() -+ .use(remarkPresetLintConsistent) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Use the preset. +Presets don’t have options. +You can reconfigure rules in them by using the afterwards with different +options. + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -119,17 +177,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-preset-lint-markdown-style-guide/index.js b/packages/remark-preset-lint-markdown-style-guide/index.js index 42543a8c..adb0ad29 100644 --- a/packages/remark-preset-lint-markdown-style-guide/index.js +++ b/packages/remark-preset-lint-markdown-style-guide/index.js @@ -1,99 +1,100 @@ /** - * @fileoverview - * remark preset to configure `remark-lint` with settings that the - * [Markdown Style Guide](http://www.cirosantilli.com/markdown-style-guide/) - * recommends. + * ## When should I use this? * - * This uses the following Style Guide option system: `wrap:space`, - * `header:atx`, `list-marker:hyphen`, `list-space:mixed`, and - * `code:fenced`. + * You can use this package to check that markdown follows the + * [Markdown Style Guide](https://cirosantilli.com/markdown-style-guide/). * - * ###### `space-sentence` + * This uses the following style guide option system: `wrap:space`, + * `header:atx`, `list-marker:hyphen`, `list-space:mixed`, and `code:fenced`. * - * Both `space-sentence:1` and `space-sentence:2` are not supported - * by `remark-lint`. - * You could set-up - * [`remark-retext`](https://github.com/remarkjs/remark-retext) - * with - * [`retext-sentence-spacing`](https://github.com/retextjs/retext-sentence-spacing) - * to check this though. + * ###### `space-sentence` * - * ###### `wrap` + * Both `space-sentence:1` and `space-sentence:2` are not supported by + * `remark-lint` as they relate to prose rather than markdown syntax. + * You could set-up + * [`remark-retext`](https://github.com/remarkjs/remark-retext) + * with + * [`retext-sentence-spacing`](https://github.com/retextjs/retext-sentence-spacing) + * to check this. * - * `wrap:inner-sentence` and `wrap:sentence` are not supported by - * `remark-lint`. + * ###### `wrap` * - * The default is `wrap:space`. - * To use `wrap:no`, turn off `remark-lint-maximum-line-length` like so: + * `wrap:inner-sentence` and `wrap:sentence` are not supported by `remark-lint`. * - * ```diff - * "plugins": [ - * … - * "preset-lint-markdown-style-guide", - * + ["lint-maximum-line-length", false] - * … - * ] - * ``` + * The default is `wrap:space`. + * To use `wrap:no`, turn off `remark-lint-maximum-line-length` like so: * - * ###### `header` + * ```diff + * "plugins": [ + * … + * "remark-preset-lint-markdown-style-guide", + * + ["remark-lint-maximum-line-length", false], + * … + * ] + * ``` * - * The default is `header:atx`. - * To use `header:setext`, change the setting for `remark-lint-heading-style` - * like so: + * ###### `header` * - * ```diff - * "plugins": [ - * … - * "preset-lint-markdown-style-guide", - * + ["lint-heading-style", "setext"] - * … - * ] - * ``` + * The default is `header:atx`. + * To use `header:setext`, change the setting for `remark-lint-heading-style` + * like so: * - * ###### `list-marker` + * ```diff + * "plugins": [ + * … + * "remark-preset-lint-markdown-style-guide", + * + ["remark-lint-heading-style", "setext"], + * … + * ] + * ``` * - * The default is `list-marker:hyphen`. - * For `list-marker:asterisk` or `list-marker:plus`, change the setting for - * `remark-lint-unordered-list-marker-style` like so: + * ###### `list-marker` * - * ```diff - * "plugins": [ - * … - * "preset-lint-markdown-style-guide", - * + ["lint-unordered-list-marker-style", "*"] - * … - * ] - * ``` + * The default is `list-marker:hyphen`. + * For `list-marker:asterisk` or `list-marker:plus`, change the setting for + * `remark-lint-unordered-list-marker-style` like so: * - * ###### `list-space` + * ```diff + * "plugins": [ + * … + * "remark-preset-lint-markdown-style-guide", + * + ["remark-lint-unordered-list-marker-style", "*"], + * … + * ] + * ``` * - * The default is `list-space:mixed`. - * For `list-space:1`, change the setting for `remark-lint-list-item-indent` - * like so: + * ###### `list-space` * - * ```diff - * "plugins": [ - * … - * "preset-lint-markdown-style-guide", - * + ["lint-list-item-indent", "space"] - * … - * ] - * ``` + * The default is `list-space:mixed`. + * For `list-space:1`, change the setting for `remark-lint-list-item-indent` + * like so: * - * ###### `code` + * ```diff + * "plugins": [ + * … + * "remark-preset-lint-markdown-style-guide", + * + ["remark-lint-list-item-indent", "space"], + * … + * ] + * ``` * - * The default is `code:fenced`. - * For `code:indented`, change the setting for `remark-lint-code-block-style` - * like so: + * ###### `code` * - * ```diff - * "plugins": [ - * … - * "preset-lint-markdown-style-guide", - * + ["lint-code-block-style", "indented"] - * … - * ] - * ``` + * The default is `code:fenced`. + * For `code:indented`, change the setting for `remark-lint-code-block-style` + * like so: + * + * ```diff + * "plugins": [ + * … + * "remark-preset-lint-markdown-style-guide", + * + ["remark-lint-code-block-style", "indented"], + * … + * ] + * ``` + * + * @summary + * Preset of remark-lint rules that follow an opinionated style guide. */ /** @@ -150,139 +151,139 @@ const remarkPresetLintMarkdownStyleGuide = { plugins: [ remarkLint, - // http://www.cirosantilli.com/markdown-style-guide/#file-extension + // https://cirosantilli.com/markdown-style-guide/#file-extension [remarkLintFileExtension, 'md'], - // http://www.cirosantilli.com/markdown-style-guide/#file-name + // https://cirosantilli.com/markdown-style-guide/#file-name remarkLintNoFileNameMixedCase, remarkLintNoFileNameArticles, remarkLintNoFileNameIrregularCharacters, remarkLintNoFileNameConsecutiveDashes, remarkLintNoFileNameOuterDashes, - // http://www.cirosantilli.com/markdown-style-guide/#newlines - // http://www.cirosantilli.com/markdown-style-guide/#empty-lines-around-lists - // http://www.cirosantilli.com/markdown-style-guide/#tables + // https://cirosantilli.com/markdown-style-guide/#newlines + // https://cirosantilli.com/markdown-style-guide/#empty-lines-around-lists + // https://cirosantilli.com/markdown-style-guide/#tables remarkLintNoConsecutiveBlankLines, - // http://www.cirosantilli.com/markdown-style-guide/#spaces-after-sentences. + // https://cirosantilli.com/markdown-style-guide/#spaces-after-sentences. // Not enforced, cannot be done properly without false positives, if you // want this, use remark-retext and retext-sentence-spacing. - // http://www.cirosantilli.com/markdown-style-guide/#line-wrapping + // https://cirosantilli.com/markdown-style-guide/#line-wrapping [remarkLintMaximumLineLength, 80], - // http://www.cirosantilli.com/markdown-style-guide/#dollar-signs-in-shell-code + // https://cirosantilli.com/markdown-style-guide/#dollar-signs-in-shell-code remarkLintNoShellDollars, - // http://www.cirosantilli.com/markdown-style-guide/#what-to-mark-as-code. + // https://cirosantilli.com/markdown-style-guide/#what-to-mark-as-code. // This is a tip, not a rule. - // http://www.cirosantilli.com/markdown-style-guide/#spelling-and-grammar. + // https://cirosantilli.com/markdown-style-guide/#spelling-and-grammar. // Spelling is not in the scope of remark-lint. If you want this, // use remark-retext and retext-spell. - // http://www.cirosantilli.com/markdown-style-guide/#line-breaks + // https://cirosantilli.com/markdown-style-guide/#line-breaks remarkLintHardBreakSpaces, - // http://www.cirosantilli.com/markdown-style-guide/#headers + // https://cirosantilli.com/markdown-style-guide/#headers [remarkLintHeadingStyle, 'atx'], remarkLintHeadingIncrement, remarkLintNoDuplicateHeadings, - // http://www.cirosantilli.com/markdown-style-guide/#top-level-header + // https://cirosantilli.com/markdown-style-guide/#top-level-header remarkLintNoMultipleToplevelHeadings, - // http://www.cirosantilli.com/markdown-style-guide/#header-case. + // https://cirosantilli.com/markdown-style-guide/#header-case. // Heading case isn’t tested yet: new rules to fix this are ok though! - // http://www.cirosantilli.com/markdown-style-guide/#end-of-a-header. + // https://cirosantilli.com/markdown-style-guide/#end-of-a-header. // Cannot be checked? - // http://www.cirosantilli.com/markdown-style-guide/#header-length + // https://cirosantilli.com/markdown-style-guide/#header-length remarkLintMaximumHeadingLength, - // http://www.cirosantilli.com/markdown-style-guide/#punctuation-at-the-end-of-headers + // https://cirosantilli.com/markdown-style-guide/#punctuation-at-the-end-of-headers [remarkLintNoHeadingPunctuation, ':.'], - // http://www.cirosantilli.com/markdown-style-guide/#header-synonyms. + // https://cirosantilli.com/markdown-style-guide/#header-synonyms. // Cannot be checked? - // http://www.cirosantilli.com/markdown-style-guide/#blockquotes + // https://cirosantilli.com/markdown-style-guide/#blockquotes [remarkLintBlockquoteIndentation, 2], remarkLintNoBlockquoteWithoutMarker, - // http://www.cirosantilli.com/markdown-style-guide/#unordered + // https://cirosantilli.com/markdown-style-guide/#unordered [remarkLintUnorderedListMarkerStyle, '-'], - // http://www.cirosantilli.com/markdown-style-guide/#ordered + // https://cirosantilli.com/markdown-style-guide/#ordered [remarkLintOrderedListMarkerStyle, '.'], [remarkLintOrderedListMarkerValue, 'one'], - // http://www.cirosantilli.com/markdown-style-guide/#spaces-after-list-marker + // https://cirosantilli.com/markdown-style-guide/#spaces-after-list-marker [remarkLintListItemIndent, 'mixed'], - // http://www.cirosantilli.com/markdown-style-guide/#indentation-of-content-inside-lists + // https://cirosantilli.com/markdown-style-guide/#indentation-of-content-inside-lists remarkLintListItemContentIndent, - // http://www.cirosantilli.com/markdown-style-guide/#empty-lines-inside-lists + // https://cirosantilli.com/markdown-style-guide/#empty-lines-inside-lists remarkLintListItemSpacing, - // http://www.cirosantilli.com/markdown-style-guide/#case-of-first-letter-of-list-item + // https://cirosantilli.com/markdown-style-guide/#case-of-first-letter-of-list-item // Not checked. - // http://www.cirosantilli.com/markdown-style-guide/#punctuation-at-the-end-of-list-items. + // https://cirosantilli.com/markdown-style-guide/#punctuation-at-the-end-of-list-items. // Not checked. - // http://www.cirosantilli.com/markdown-style-guide/#definition-lists. + // https://cirosantilli.com/markdown-style-guide/#definition-lists. // Not checked. - // http://www.cirosantilli.com/markdown-style-guide/#code-blocks + // https://cirosantilli.com/markdown-style-guide/#code-blocks [remarkLintCodeBlockStyle, 'fenced'], [remarkLintFencedCodeFlag, {allowEmpty: false}], [remarkLintFencedCodeMarker, '`'], - // http://www.cirosantilli.com/markdown-style-guide/#horizontal-rules + // https://cirosantilli.com/markdown-style-guide/#horizontal-rules [remarkLintRuleStyle, '---'], - // http://www.cirosantilli.com/markdown-style-guide/#tables + // https://cirosantilli.com/markdown-style-guide/#tables remarkLintNoTableIndentation, remarkLintTablePipes, remarkLintTablePipeAlignment, [remarkLintTableCellPadding, 'padded'], - // http://www.cirosantilli.com/markdown-style-guide/#separate-consecutive-elements. + // https://cirosantilli.com/markdown-style-guide/#separate-consecutive-elements. // Not checked. - // http://www.cirosantilli.com/markdown-style-guide/#span-elements + // https://cirosantilli.com/markdown-style-guide/#span-elements remarkLintNoInlinePadding, - // http://www.cirosantilli.com/markdown-style-guide/#reference-style-links + // https://cirosantilli.com/markdown-style-guide/#reference-style-links remarkLintNoShortcutReferenceImage, remarkLintNoShortcutReferenceLink, remarkLintFinalDefinition, remarkLintDefinitionCase, remarkLintDefinitionSpacing, - // http://www.cirosantilli.com/markdown-style-guide/#single-or-double-quote-titles + // https://cirosantilli.com/markdown-style-guide/#single-or-double-quote-titles [remarkLintLinkTitleStyle, '"'], - // http://www.cirosantilli.com/markdown-style-guide/#bold + // https://cirosantilli.com/markdown-style-guide/#bold [remarkLintStrongMarker, '*'], - // http://www.cirosantilli.com/markdown-style-guide/#italic + // https://cirosantilli.com/markdown-style-guide/#italic [remarkLintEmphasisMarker, '*'], - // http://www.cirosantilli.com/markdown-style-guide/#uppercase-for-emphasis. + // https://cirosantilli.com/markdown-style-guide/#uppercase-for-emphasis. // Not checked. - // http://www.cirosantilli.com/markdown-style-guide/#emphasis-vs-headers + // https://cirosantilli.com/markdown-style-guide/#emphasis-vs-headers remarkLintNoEmphasisAsHeading, - // http://www.cirosantilli.com/markdown-style-guide/#automatic-links-without-angle-brackets + // https://cirosantilli.com/markdown-style-guide/#automatic-links-without-angle-brackets remarkLintNoLiteralUrls - // http://www.cirosantilli.com/markdown-style-guide/#email-automatic-links. + // https://cirosantilli.com/markdown-style-guide/#email-automatic-links. // Not checked. ] } diff --git a/packages/remark-preset-lint-markdown-style-guide/readme.md b/packages/remark-preset-lint-markdown-style-guide/readme.md index 652cba72..bf0751e4 100644 --- a/packages/remark-preset-lint-markdown-style-guide/readme.md +++ b/packages/remark-preset-lint-markdown-style-guide/readme.md @@ -10,28 +10,48 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -remark preset to configure `remark-lint` with settings that the -[Markdown Style Guide](http://www.cirosantilli.com/markdown-style-guide/) -recommends. +Preset of [`remark-lint`][mono] rules that follow an opinionated style guide. -This uses the following Style Guide option system: `wrap:space`, -`header:atx`, `list-marker:hyphen`, `list-space:mixed`, and -`code:fenced`. +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Rules](#rules) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkPresetLintMarkdownStyleGuide)`](#unifieduseremarkpresetlintmarkdownstyleguide) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) preset, specifically consisting of +`remark-lint` rules. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that markdown follows the +[Markdown Style Guide](https://cirosantilli.com/markdown-style-guide/). + +This uses the following style guide option system: `wrap:space`, +`header:atx`, `list-marker:hyphen`, `list-space:mixed`, and `code:fenced`. ###### `space-sentence` -Both `space-sentence:1` and `space-sentence:2` are not supported -by `remark-lint`. +Both `space-sentence:1` and `space-sentence:2` are not supported by +`remark-lint` as they relate to prose rather than markdown syntax. You could set-up [`remark-retext`](https://github.com/remarkjs/remark-retext) with [`retext-sentence-spacing`](https://github.com/retextjs/retext-sentence-spacing) -to check this though. +to check this. ###### `wrap` -`wrap:inner-sentence` and `wrap:sentence` are not supported by -`remark-lint`. +`wrap:inner-sentence` and `wrap:sentence` are not supported by `remark-lint`. The default is `wrap:space`. To use `wrap:no`, turn off `remark-lint-maximum-line-length` like so: @@ -39,8 +59,8 @@ To use `wrap:no`, turn off `remark-lint-maximum-line-length` like so: ```diff "plugins": [ … - "preset-lint-markdown-style-guide", -+ ["lint-maximum-line-length", false] + "remark-preset-lint-markdown-style-guide", ++ ["remark-lint-maximum-line-length", false], … ] ``` @@ -54,8 +74,8 @@ like so: ```diff "plugins": [ … - "preset-lint-markdown-style-guide", -+ ["lint-heading-style", "setext"] + "remark-preset-lint-markdown-style-guide", ++ ["remark-lint-heading-style", "setext"], … ] ``` @@ -69,8 +89,8 @@ For `list-marker:asterisk` or `list-marker:plus`, change the setting for ```diff "plugins": [ … - "preset-lint-markdown-style-guide", -+ ["lint-unordered-list-marker-style", "*"] + "remark-preset-lint-markdown-style-guide", ++ ["remark-lint-unordered-list-marker-style", "*"], … ] ``` @@ -84,8 +104,8 @@ like so: ```diff "plugins": [ … - "preset-lint-markdown-style-guide", -+ ["lint-list-item-indent", "space"] + "remark-preset-lint-markdown-style-guide", ++ ["remark-lint-list-item-indent", "space"], … ] ``` @@ -99,15 +119,15 @@ like so: ```diff "plugins": [ … - "preset-lint-markdown-style-guide", -+ ["lint-code-block-style", "indented"] + "remark-preset-lint-markdown-style-guide", ++ ["remark-lint-code-block-style", "indented"], … ] ``` ## Rules -This preset configures [`remark-lint`](https://github.com/remarkjs/remark-lint) with the following rules: +This preset configures [`remark-lint`][mono] with the following rules: | Rule | Setting | | - | - | @@ -157,50 +177,86 @@ This preset configures [`remark-lint`](https://github.com/remarkjs/remark-lint) ## Install -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: ```sh npm install remark-preset-lint-markdown-style-guide ``` -This package exports no identifiers. -The default export is `remarkPresetLintMarkdownStyleGuide`. +In Deno with [Skypack][]: + +```js +import remarkPresetLintMarkdownStyleGuide from 'https://cdn.skypack.dev/remark-preset-lint-markdown-style-guide@5?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` ## Use -You probably want to use it on the CLI through a config file: +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkPresetLintMarkdownStyleGuide from 'remark-preset-lint-markdown-style-guide' + +main() + +async function main() { + const file = await remark() + .use(remarkPresetLintMarkdownStyleGuide) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-preset-lint-markdown-style-guide example.md +``` + +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { -+ "plugins": ["preset-lint-markdown-style-guide"] + "plugins": [ + … ++ "remark-preset-lint-markdown-style-guide", + … + ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u preset-lint-markdown-style-guide readme.md -``` +This package exports no identifiers. +The default export is `remarkPresetLintMarkdownStyleGuide`. -Or use this on the API: +### `unified().use(remarkPresetLintMarkdownStyleGuide)` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkPresetLintMarkdownStyleGuide from 'remark-preset-lint-markdown-style-guide' - - remark() -+ .use(remarkPresetLintMarkdownStyleGuide) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Use the preset. +Presets don’t have options. +You can reconfigure rules in them by using the afterwards with different +options. + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -242,17 +298,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/remark-preset-lint-recommended/index.js b/packages/remark-preset-lint-recommended/index.js index 36ca7710..dae28742 100644 --- a/packages/remark-preset-lint-recommended/index.js +++ b/packages/remark-preset-lint-recommended/index.js @@ -1,7 +1,10 @@ /** - * @fileoverview - * remark preset to configure `remark-lint` with settings that prevent - * mistakes or stuff that fails across vendors. + * ## When should I use this? + * + * You can use this package to check that markdown follows some best practices. + * + * @summary + * Preset of remark-lint rules to warn for some likely problems. */ /** diff --git a/packages/remark-preset-lint-recommended/readme.md b/packages/remark-preset-lint-recommended/readme.md index 4ed7b0f4..f0c46678 100644 --- a/packages/remark-preset-lint-recommended/readme.md +++ b/packages/remark-preset-lint-recommended/readme.md @@ -10,12 +10,34 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -remark preset to configure `remark-lint` with settings that prevent -mistakes or stuff that fails across vendors. +Preset of [`remark-lint`][mono] rules to warn for some likely problems. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Rules](#rules) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`unified().use(remarkPresetLintRecommended)`](#unifieduseremarkpresetlintrecommended) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] ([remark][]) preset, specifically consisting of +`remark-lint` rules. +Lint rules check markdown code style. + +## When should I use this? + +You can use this package to check that markdown follows some best practices. ## Rules -This preset configures [`remark-lint`](https://github.com/remarkjs/remark-lint) with the following rules: +This preset configures [`remark-lint`][mono] with the following rules: | Rule | Setting | | - | - | @@ -36,50 +58,86 @@ This preset configures [`remark-lint`](https://github.com/remarkjs/remark-lint) ## Install -This package is [ESM only][esm]: -Node 12+ is needed to use it and it must be `imported`ed instead of `required`d. - -[npm][]: +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: ```sh npm install remark-preset-lint-recommended ``` -This package exports no identifiers. -The default export is `remarkPresetLintRecommended`. +In Deno with [Skypack][]: + +```js +import remarkPresetLintRecommended from 'https://cdn.skypack.dev/remark-preset-lint-recommended@6?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` ## Use -You probably want to use it on the CLI through a config file: +On the API: + +```js +import {read} from 'to-vfile' +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkPresetLintRecommended from 'remark-preset-lint-recommended' + +main() + +async function main() { + const file = await remark() + .use(remarkPresetLintRecommended) + .process(await read('example.md')) + + console.error(reporter(file)) +} +``` + +On the CLI: + +```sh +remark --use remark-preset-lint-recommended example.md +``` + +On the CLI in a config file (here a `package.json`): ```diff … "remarkConfig": { -+ "plugins": ["preset-lint-recommended"] + "plugins": [ + … ++ "remark-preset-lint-recommended", + … + ] } … ``` -Or use it on the CLI directly +## API -```sh -remark -u preset-lint-recommended readme.md -``` +This package exports no identifiers. +The default export is `remarkPresetLintRecommended`. -Or use this on the API: +### `unified().use(remarkPresetLintRecommended)` -```diff - import {remark} from 'remark' - import {reporter} from 'vfile-reporter' - import remarkPresetLintRecommended from 'remark-preset-lint-recommended' - - remark() -+ .use(remarkPresetLintRecommended) - .process('_Emphasis_ and **importance**') - .then((file) => { - console.error(reporter(file)) - }) -``` +Use the preset. +Presets don’t have options. +You can reconfigure rules in them by using the afterwards with different +options. + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Contribute @@ -121,17 +179,25 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[unified]: https://github.com/unifiedjs/unified + +[remark]: https://github.com/remarkjs/remark + +[mono]: https://github.com/remarkjs/remark-lint + [esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license diff --git a/packages/unified-lint-rule/readme.md b/packages/unified-lint-rule/readme.md index 2cb3f823..544d30f2 100644 --- a/packages/unified-lint-rule/readme.md +++ b/packages/unified-lint-rule/readme.md @@ -8,21 +8,58 @@ [![Backers][backers-badge]][collective] [![Chat][chat-badge]][chat] -[**unified**][unified] plugin to make it a bit easier to create linting rules. +**[unified][]** plugin to help make lint rules. -Each rule in [`remark-lint`][lint] uses this project, so see that for examples! +See the [monorepo readme][mono] for more info on remark lint. -## Install +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`lintRule(origin|meta, rule)`](#lintruleoriginmeta-rule) +* [Compatibility](#compatibility) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package is a [unified][] plugin that makes it a bit easier to create +linting rules. + +**unified** is a project that transforms content with abstract syntax trees +(ASTs). +This is a plugin that make it easier to inspect trees. + +## When should I use this? + +You can use this package when you want to make custom lint rules. -This package is [ESM only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c): -Node 12+ is needed to use it and it must be `import`ed instead of `require`d. +## Install -[npm][]: +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: ```sh npm install unified-lint-rule ``` +In Deno with [Skypack][]: + +```js +import {lintRule} from 'https://cdn.skypack.dev/unified-lint-rule@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + ## Use ```js @@ -42,6 +79,42 @@ const remarkLintFileExtension = lintRule( export default remarkLintFileExtension ``` +## API + +This package exports the following identifier: `lintRule`. +There is no default export. + +### `lintRule(origin|meta, rule)` + +Create a plugin. + +###### Parameters + +* `origin` (`string`) + — treated as a `meta` of `{origin}` +* `meta` (`Object`) + — rule metadata +* `meta.origin` (`string`) + — message origin, either a rule name (`'file-extension'`) or both + a rule source and name joined with `:` (`'remark-lint:file-extension'`) +* `meta.url` (`string`, optional) + — URL to documentation for messages +* `rule` (`Function`, optional) + — your code, like a transform function, except that an extra `option` is + passed + +###### Returns + +A unified plugin that handles all kinds of options (see [Configure][configure] +in the monorepo readme for how them). + +## Compatibility + +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. + ## Contribute See [`contributing.md`][contributing] in [`remarkjs/.github`][health] for ways @@ -82,15 +155,19 @@ abide by its terms. [chat]: https://github.com/remarkjs/remark/discussions +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[skypack]: https://www.skypack.dev + [npm]: https://docs.npmjs.com/cli/install [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: https://github.com/remarkjs/remark-lint/blob/main/license @@ -98,4 +175,6 @@ abide by its terms. [unified]: https://github.com/unifiedjs/unified -[lint]: https://github.com/remarkjs/remark-lint +[mono]: https://github.com/remarkjs/remark-lint + +[configure]: https://github.com/remarkjs/remark-lint#configure diff --git a/readme.md b/readme.md index 9870ec93..ac149d78 100644 --- a/readme.md +++ b/readme.md @@ -7,205 +7,399 @@ [![Sponsors][sponsors-badge]][collective] [![Backers][backers-badge]][collective] -[**remark**][remark] plugins to lint Markdown. - -Ensuring the Markdown you (and contributors) write is of great quality will -provide better rendering in all the different markdown parsers, and makes sure -less refactoring is needed afterwards. - -What is quality? -That’s up to you, but there are sensible [presets][]. - -`remark-lint` is built on [**remark**][remark], a powerful Markdown processor -powered by [plugins][remark-plugins] (such as these). +**[remark][]** plugins to check (lint) markdown code style. ## Contents -* [Install](#install) -* [CLI](#cli) -* [API](#api) -* [Configuring `remark-lint`](#configuring-remark-lint) -* [Using remark to fix your Markdown](#using-remark-to-fix-your-markdown) -* [Integrations](#integrations) +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Presets](#presets) * [Rules](#rules) -* [List of presets](#list-of-presets) -* [List of external rules](#list-of-external-rules) -* [Create a custom rule](#create-a-custom-rule) +* [Configure](#configure) +* [Ignore warnings](#ignore-warnings) +* [Examples](#examples) + * [Example: check markdown on the API](#example-check-markdown-on-the-api) + * [Example: check and format markdown on the API](#example-check-and-format-markdown-on-the-api) + * [Example: check markdown on the CLI](#example-check-markdown-on-the-cli) + * [Example: check and format markdown on the CLI](#example-check-and-format-markdown-on-the-cli) +* [Integrations](#integrations) +* [Syntax](#syntax) +* [Compatibility](#compatibility) * [Security](#security) -* [Related](#related) * [Contribute](#contribute) * [License](#license) -## Install +## What is this? -This package is [ESM only](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c): -Node 12+ is needed to use it and it must be `import`ed instead of `require`d. +![](screenshot.png) -[npm][]: +You can use this to check markdown. +Say we have a markdown file `doc/example.md` that contains: -```sh -npm install remark-lint +```markdown +1) Hello, _Jupiter_ and *Neptune*! ``` -## CLI - -![][screenshot] - -Use `remark-lint` with [`remark-cli`][cli] through a -[preset][preset-recommended]. +Then assuming we installed dependencies and run: ```sh -npm install --save-dev remark-cli remark-preset-lint-recommended +npx remark doc/ --use remark-preset-lint-consistent --use remark-preset-lint-recommended ``` -Then, configure **remark** in your `package.json`: +We would get a report like this: -```js - // … - "scripts": { - "lint-md": "remark ." - }, - // … - "remarkConfig": { - "plugins": ["remark-preset-lint-recommended"] - } - // … +```txt +doc/example.md + 1:1-1:35 warning Marker style should be `.` ordered-list-marker-style remark-lint + 1:4 warning Incorrect list-item indent: add 1 space list-item-indent remark-lint + 1:25-1:34 warning Emphasis should use `_` as a marker emphasis-marker remark-lint + +⚠ 3 warnings ``` -Let’s say there’s an `example.md` that looks as follows: +This GitHub repository is a monorepo that contains ±70 plugins (each a rule that +checks one specific thing) and 3 presets (combinations of rules configured to +check for certain styles). -```markdown -* Hello +These packages are build on [unified][] ([remark][]). +**unified** is a project that inspects and transforms content with abstract +syntax trees (ASTs). +**remark** adds support for markdown to unified. +**mdast** is the markdown AST that remark uses. +These lint rules inspect mdast. -[World][] -``` +## When should I use this? -Now, running our `lint-md` script with `npm run lint-md` yields: +This project is useful when developers or technical writers are authoring +documentation in markdown and you want to ensure that the markdown is +consistent, free of bugs, and works well across different markdown parsers. -```txt -example.md - 1:3 warning Incorrect list-item indent: add 2 spaces list-item-indent - 3:1-3:10 warning Found reference to undefined definition no-undefined-references -⚠ 2 warnings -``` +These packages are quite good at checking markdown. +They especially shine when combined with other [remark plugins][remark-plugin] +and at letting you make your own rules. -See [`doc/rules.md`][rules] for what those warnings are (and how to turn them -off). +## Presets -## API +Presets are combinations of rules configured to check for certain styles. +The following presets only contain lint rules but you can make your own that +include any remark plugins or other presets. +The presets that are maintained here: -Use `remark-lint` together with [`remark`][api]: + -```sh -npm install remark remark-preset-lint-markdown-style-guide -``` +* [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) — rules that enforce consistency +* [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) — rules that enforce the markdown style guide +* [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) — rules that prevent mistakes or stuff that fails across vendors. -Let’s say `example.js` looks as follows: + -```js -import {remark} from 'remark' -import {reporter} from 'vfile-reporter' -import remarkPresetLintMarkdownStyleGuide from 'remark-preset-lint-markdown-style-guide' +## Rules -const file = remark() - .use(remarkPresetLintMarkdownStyleGuide) - .processSync('_Hello world_') +The rules that are maintained here: -console.log(reporter(file)) -``` + -Now, running `node example.js` yields: + + +* [`remark-lint-blockquote-indentation`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-blockquote-indentation) — warn when block quotes are either indented too much or too little +* [`remark-lint-checkbox-character-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-checkbox-character-style) — warn when list item checkboxes violate a given style +* [`remark-lint-checkbox-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-checkbox-content-indent) — warn when list item checkboxes are followed by too much whitespace +* [`remark-lint-code-block-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-code-block-style) — warn when code blocks do not adhere to a given style +* [`remark-lint-definition-case`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-definition-case) — warn when definition labels are not lowercase +* [`remark-lint-definition-spacing`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-definition-spacing) — warn when consecutive whitespace is used in a definition +* [`remark-lint-emphasis-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-emphasis-marker) — warn when emphasis markers violate the given style +* [`remark-lint-fenced-code-flag`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-fenced-code-flag) — warn when fenced code blocks occur without language flag +* [`remark-lint-fenced-code-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-fenced-code-marker) — warn when fenced code markers violate the given style +* [`remark-lint-file-extension`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-file-extension) — warn when the file’s extension violates the given style +* [`remark-lint-final-definition`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-final-definition) — warn when definitions are not placed at the end of the file +* [`remark-lint-final-newline`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-final-newline) — warn when a newline at the end of a file is missing +* [`remark-lint-first-heading-level`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-first-heading-level) — warn when the first heading has a level other than a specified value +* [`remark-lint-hard-break-spaces`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-hard-break-spaces) — warn when too many spaces are used to create a hard break +* [`remark-lint-heading-increment`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-heading-increment) — warn when headings increment with more than 1 level at a time +* [`remark-lint-heading-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-heading-style) — warn when heading style violates the given style +* [`remark-lint-linebreak-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-linebreak-style) — warn when linebreaks violate a given or detected style +* [`remark-lint-link-title-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-link-title-style) — warn when link and definition titles occur with incorrect quotes +* [`remark-lint-list-item-bullet-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-bullet-indent) — warn when list item bullets are indented +* [`remark-lint-list-item-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-content-indent) — warn when the content of a list item has mixed indentation +* [`remark-lint-list-item-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-indent) — warn when the spacing between a list item’s bullet and its content violates a given style +* [`remark-lint-list-item-spacing`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-list-item-spacing) — warn when list looseness is incorrect +* [`remark-lint-maximum-heading-length`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-maximum-heading-length) — warn when headings are too long +* [`remark-lint-maximum-line-length`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-maximum-line-length) — warn when lines are too long +* [`remark-lint-no-blockquote-without-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-blockquote-without-marker) — warn when blank lines without markers (\`>\`) are found in a block quote +* [`remark-lint-no-consecutive-blank-lines`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-consecutive-blank-lines) — warn for too many consecutive blank lines +* [`remark-lint-no-duplicate-defined-urls`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-defined-urls) — warn on definitions that define the same urls +* [`remark-lint-no-duplicate-definitions`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-definitions) — warn on duplicate definitions +* [`remark-lint-no-duplicate-headings`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-headings) — warn on duplicate headings +* [`remark-lint-no-duplicate-headings-in-section`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-duplicate-headings-in-section) — warn on duplicate headings in a section +* [`remark-lint-no-emphasis-as-heading`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-emphasis-as-heading) — warn when emphasis or importance is used instead of a heading +* [`remark-lint-no-empty-url`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-empty-url) — warn on empty URLs in links and images +* [`remark-lint-no-file-name-articles`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-articles) — warn when file name start with an article +* [`remark-lint-no-file-name-consecutive-dashes`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-consecutive-dashes) — warn when file names contain consecutive dashes +* [`remark-lint-no-file-name-irregular-characters`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-irregular-characters) — warn when file names contain irregular characters +* [`remark-lint-no-file-name-mixed-case`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-mixed-case) — warn when file names use mixed case +* [`remark-lint-no-file-name-outer-dashes`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-file-name-outer-dashes) — warn when file names contain initial or final dashes +* [`remark-lint-no-heading-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-content-indent) — warn when heading content is indented +* [`remark-lint-no-heading-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-indent) — warn when headings are indented +* [`remark-lint-no-heading-like-paragraph`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-like-paragraph) — for too many hashes (h7+ “headings”) +* [`remark-lint-no-heading-punctuation`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-heading-punctuation) — warn when headings end in illegal characters +* [`remark-lint-no-html`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-html) — warn when HTML nodes are used +* [`remark-lint-no-inline-padding`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-inline-padding) — warn when inline nodes are padded with spaces +* [`remark-lint-no-literal-urls`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-literal-urls) — warn when URLs without angle brackets are used +* [`remark-lint-no-missing-blank-lines`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-missing-blank-lines) — warn when missing blank lines +* [`remark-lint-no-multiple-toplevel-headings`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-multiple-toplevel-headings) — warn when multiple top level headings are used +* [`remark-lint-no-paragraph-content-indent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-paragraph-content-indent) — warn when the content in paragraphs are indented +* [`remark-lint-no-reference-like-url`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-reference-like-url) — warn when URLs are also defined identifiers +* [`remark-lint-no-shell-dollars`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-shell-dollars) — warn when shell code is prefixed by dollars +* [`remark-lint-no-shortcut-reference-image`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-shortcut-reference-image) — warn when shortcut reference images are used +* [`remark-lint-no-shortcut-reference-link`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-shortcut-reference-link) — warn when shortcut reference links are used +* [`remark-lint-no-table-indentation`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-table-indentation) — warn when tables are indented +* [`remark-lint-no-tabs`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-tabs) — warn when hard tabs are used instead of spaces +* [`remark-lint-no-undefined-references`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-undefined-references) — warn when references to undefined definitions are found +* [`remark-lint-no-unneeded-full-reference-image`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-unneeded-full-reference-image) — warn when full reference images are used if they can be collapsed +* [`remark-lint-no-unneeded-full-reference-link`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-unneeded-full-reference-link) — warn when full reference links are used if they can be collapsed +* [`remark-lint-no-unused-definitions`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-unused-definitions) — warn when unused definitions are found +* [`remark-lint-ordered-list-marker-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-ordered-list-marker-style) — warn when the markers of ordered lists violate a given style +* [`remark-lint-ordered-list-marker-value`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-ordered-list-marker-value) — warn when the marker value of ordered lists violates a given style +* [`remark-lint-rule-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-rule-style) — warn when horizontal rules violate a given style +* [`remark-lint-strikethrough-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-strikethrough-marker) — warn when strikethrough markers violate the given style +* [`remark-lint-strong-marker`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-strong-marker) — warn when importance (strong) markers violate the given style +* [`remark-lint-table-cell-padding`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-table-cell-padding) — warn when table cells are incorrectly padded +* [`remark-lint-table-pipe-alignment`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-table-pipe-alignment) — warn when table pipes are not aligned +* [`remark-lint-table-pipes`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-table-pipes) — warn when table rows are not fenced with pipes +* [`remark-lint-unordered-list-marker-style`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-unordered-list-marker-style) — warn when markers of unordered lists violate a given style + + + + + + + +You can make and share your own rules, which can be used just like the rules +maintained here. +The following rules are maintained by the community: -```txt - 1:1-1:14 warning Emphasis should use `*` as a marker emphasis-marker remark-lint + -⚠ 1 warning -``` +* [`remark-lint-alphabetize-lists`](https://github.com/vhf/remark-lint-alphabetize-lists) + — ensure list items are in alphabetical order +* [`remark-lint-appropriate-heading`](https://github.com/RichardLitt/remark-lint-appropriate-heading) + — check that the top level heading matches the directory name +* [`remark-lint-blank-lines-1-0-2`](https://github.com/vhf/remark-lint-blank-lines-1-0-2) + — ensure a specific number of lines between blocks +* [`remark-lint-books-links`](https://github.com/vhf/remark-lint-books-links) + — ensure links in lists of books follow a standard format +* [`remark-lint-code`](https://github.com/Qard/remark-lint-code) + — lint fenced code blocks by corresponding language tags, + currently supporting [ESLint](https://github.com/Qard/remark-lint-code-eslint) +* [`remark-lint-match-punctuation`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-match-punctuation) + — ensures punctuations are used in pairs if necessary. +* [`remark-lint-mdash-style`](https://github.com/alexandrtovmach/remark-lint-mdash-style) + — ensure em-dash (`—`) style follows a standard format +* [`remark-lint-no-chinese-punctuation-in-number`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-no-chinese-punctuation-in-number) + — ensures that Chinese punctuation’s not used in numbers +* [`remark-lint-no-dead-urls`](https://github.com/davidtheclark/remark-lint-no-dead-urls) + — check that external links are alive +* [`remark-lint-no-long-code`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-no-long-code) + — ensures that each line in code block won't be too long. +* [`remark-lint-no-repeat-punctuation`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-no-repeat-punctuation) + — ensures punctuation is not repeated +* [`remark-lint-emoji-limit`](https://github.com/zerok/remark-lint-emoji-limit) + — enforce a limit of emoji per paragraph +* [`remark-lint-no-empty-sections`](https://github.com/vhf/remark-lint-no-empty-sections) + — ensure every heading is followed by content (forming a section) +* [`remark-lint-heading-length`](https://github.com/zerok/remark-lint-heading-length) + — ensure headings have the appropriate length +* [`remark-lint-heading-whitespace`](https://github.com/vhf/remark-lint-heading-whitespace) + — ensure heading parsing is not broken by weird whitespace +* [`remark-lint-are-links-valid`](https://github.com/wemake-services/remark-lint-are-links-valid) + — check if your links are reachable and/or unique +* [`remark-lint-spaces-around-number`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-spaces-around-number) + — ensures there are spaces around number and Chinese. +* [`remark-lint-spaces-around-word`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-spaces-around-word) + — ensures there are spaces around English word and Chinese. +* [`remark-lint-no-url-trailing-slash`](https://github.com/vhf/remark-lint-no-url-trailing-slash) + — ensure that the `href` of links has no trailing slash +* [`remark-lint-write-good`](https://github.com/zerok/remark-lint-write-good) + — wrapper for `write-good` +* [`remark-lint-double-link`](https://github.com/Scrum/remark-lint-double-link) + — ensure the same URL is not linked multiple times. -## Configuring `remark-lint` +For help creating your own rule, it’s suggested to look at existing rules and to +[follow this tutorial][tutorial]. -`remark-lint` is a **remark** plugin and when used on the CLI supports -configuration through its [configuration files][cli]. +## Configure -An example `.remarkrc` file could look as follows: + -```json -{ - "plugins": [ - "remark-preset-lint-recommended", - ["remark-lint-list-item-indent", false] - ] -} + + +All rules can be configured in one standard way: + +```js +import {remark} from 'remark' +import remarkLintFinalNewline from 'remark-lint-final-newline' +import remarkLintMaximumLineLength from 'remark-lint-maximum-line-length' +import remarkLintUnorderedListMarkerStyle from 'remark-lint-unordered-list-marker-style' + +remark() + // Pass `false` to turn a rule off — the code no longer runs: + .use(remarkLintFinalNewline, false) + // Pass `true` to turn a rule on again: + .use(remarkLintFinalNewline, true) + // You can also configure whether messages by the rule should be ignored, + // are seen as code style warnings (default), or are seen as exceptions. + // Ignore messages with `'off'` or `0` as the first value of an array: + .use(remarkLintFinalNewline, ['off']) + .use(remarkLintFinalNewline, [0]) + // Use `'warn'`, `'on'`, or `1` to treat messages as code style warnings: + .use(remarkLintFinalNewline, ['warn']) + .use(remarkLintFinalNewline, ['on']) + .use(remarkLintFinalNewline, [1]) + // Use `'error'` or `2` to treat messages as exceptions: + .use(remarkLintFinalNewline, ['error']) + .use(remarkLintFinalNewline, [2]) + // Some rules accept options, and what they exactly accept is different for + // each rule (sometimes a string, a number, or an object). + // The following rule accepts a string: + .use(remarkLintUnorderedListMarkerStyle, '*') + .use(remarkLintUnorderedListMarkerStyle, ['on', '*']) + .use(remarkLintUnorderedListMarkerStyle, [1, '*']) + // The following rule accepts a number, numbers *must* be passed in arrays: + .use(remarkLintMaximumLineLength, ['on', 72]) + .use(remarkLintMaximumLineLength, [1, 72]) ``` -The preset turns on `remark-lint-list-item-indent`, but setting a plugin to -`false` later turns it off again. +See [`use()` in `unified`s readme][unified-use] for more info on how to use +plugins. + +> 🧑‍🏫 **Info**: messages in `remark-lint` are warnings instead of errors. +> Other linters (such as ESLint) almost always use errors. +> Why? +> Those tools *only* check code style. +> They don’t generate, transform, and format code, which is what remark and +> unified focus on, too. +> Errors in unified mean the same as an exception in your JavaScript code: a +> crash. +> That’s why we use warnings instead, because we continue checking more markdown +> and continue running more plugins. -Using our `example.md` from before: +## Ignore warnings + +You can use HTML comments to hide or show warnings from within markdown. +Turn off all remark lint messages with `` and turn them on +again with ``: ```markdown -* Hello + + +[Naiad]: https://naiad.neptune + +[Thalassa]: https://thalassa.neptune -[World][] + ``` -Now, running `npm run lint-md` yields: +You can toggle specific rules by using their names without `remark-lint-`: -```bash -example.md - 3:1-3:10 warning Found reference to undefined definition no-undefined-references remark-lint +```markdown + -⚠ 2 warnings -``` +[Naiad]: https://naiad.neptune -You can also provide configuration comments to turn a rule on or off inside a -file. -Note that you cannot change a setting, such as `maximum-line-length`, just -whether messages are shown or not. -Read more about configuration comments in -[`remark-message-control`][message-control]s documentation. +[Thalassa]: https://thalassa.neptune -The following file will warn twice for the duplicate headings: + +``` -```markdown -# Hello +You can ignore a message in the next block with ``: -## Hello +```markdown + -### Hello +[Naiad]: https://naiad.neptune ``` -The following file will warn once (the second heading is ignored, but the third -is enabled again): +`ignore` also accepts a list of rules: ```markdown -# Hello + + +[Naiad]: https://naiad.neptune +``` - +> 👉 **Note**: you’ll typically need blank lines between HTML comments and other +> constructs. +> More info is available at the package that handles comments, +> [`remark-message-control`][remark-message-control]. -## Hello +> 💡 **Tip**: MDX comments are supported when [`remark-mdx`][remark-mdx] is +> used: +> +> ```mdx +> {/* lint ignore no-unused-definitions definition-case */} +> ``` - +## Examples -### Hello +### Example: check markdown on the API + +The following example checks that markdown code style is consistent and follows +some best practices. +It also reconfigures a rule. +First install dependencies: + +```sh +npm install vfile-reporter remark remark-preset-lint-consistent remark-preset-lint-recommended remark-lint-list-item-indent --save-dev ``` -> **Note**: You’ll need the blank lines between comments and other nodes! +Then create a module `example.js` that contains: -## Using remark to fix your Markdown +```js +import {reporter} from 'vfile-reporter' +import {remark} from 'remark' +import remarkPresetLintConsistent from 'remark-preset-lint-consistent' +import remarkPresetLintRecommended from 'remark-preset-lint-recommended' +import remarkLintListItemIndent from 'remark-lint-list-item-indent' + +main() + +async function main() { + const file = await remark() + // Check that markdown is consistent. + .use(remarkPresetLintConsistent) + // Few recommended rules. + .use(remarkPresetLintRecommended) + // `remark-lint-list-item-indent` is configured with `tab-size` in the + // recommended preset, but if we’d prefer something else, it can be + // reconfigured: + .use(remarkLintListItemIndent, 'space') + .process('1) Hello, _Jupiter_ and *Neptune*!') + + console.error(reporter(file)) +} +``` -[`remark-stringify`][remark-stringify] can format markdown syntax. -It ensures a single style is used: list items use one type of bullet (`*`, `-`, -`+`), emphasis (`*` or `_`) and importance (`__` or `**`) use a standard marker, -[and more][remark-stringify-options]. +Running that with `node example.js` yields: -###### Example +```txt + 1:1 warning Missing newline character at end of file final-newline remark-lint + 1:1-1:35 warning Marker style should be `.` ordered-list-marker-style remark-lint + 1:25-1:34 warning Emphasis should use `_` as a marker emphasis-marker remark-lint + +⚠ 3 warnings +``` -If you `import('remark')`, [`remark-stringify`][remark-stringify] is included -unless an output format other than markdown (such as HTML) is defined. +### Example: check and format markdown on the API -Say we have the following file, `example.js`, showing how formatting rules can -be used: +remark lint rules *check* markdown. +[`remark-stringify`][remark-stringify] (used in remark) *formats* markdown. +When you configure lint rules and use remark to format markdown, you must +manually synchronize their configuration: ```js import {reporter} from 'vfile-reporter' @@ -213,114 +407,166 @@ import {remark} from 'remark' import remarkLintEmphasisMarker from 'remark-lint-emphasis-marker' import remarkLintStrongMarker from 'remark-lint-strong-marker' -remark() - .use(remarkLintEmphasisMarker, '*') - .use(remarkLintStrongMarker, '*') - // ^ two `remark-lint` rules. - .use({ - settings: {emphasis: '*', strong: '*'} - // ^ `remark-stringify` settings. - }) - .process('_Hello_, __world__!') - .then((file) => { - console.error(reporter(file)) - console.log(String(file)) - }) +main() + +async function main() { + const file = await remark() + .use(remarkLintEmphasisMarker, '*') + .use(remarkLintStrongMarker, '*') + .use({ + settings: {emphasis: '*', strong: '*'} // `remark-stringify` settings. + }) + .process('_Hello_, __world__!') + + console.error(reporter(file)) + console.log(String(file)) +} ``` -Now, running `node example` yields warnings and a formatted file: +Yields: ```txt 1:1-1:8 warning Emphasis should use `*` as a marker emphasis-marker remark-lint 1:10-1:19 warning Strong should use `*` as a marker strong-marker remark-lint ⚠ 2 warnings +``` + +```markdown *Hello*, **world**! ``` -###### Example +Observe that the lint rules check the input and afterwards remark formats using +asterisks. +If that output was given the the processor, the lint rules would be satisfied. + +### Example: check markdown on the CLI + +This example checks markdown with [`remark-cli`][remark-cli]. +It assumes you’re in a Node.js package. +First install dependencies: + +```sh +npm install remark-cli remark-preset-lint-consistent remark-preset-lint-recommended remark-lint-list-item-indent --save-dev +``` -If you’re using [`remark-stringify`][remark-stringify] explicitly, you can pass -options like any other plugin, like so: +Then add an npm script to your `package.json`: ```js -import {reporter} from 'vfile-reporter' -import {unified} from 'unified' -import remarkParse from 'remark-parse' -import remarkStringify from 'remark-stringify' -import remarkLintEmphasisMarker from 'remark-lint-emphasis-marker' -import remarkLintStrongMarker from 'remark-lint-strong-marker' + /* … */ + "scripts": { + /* … */ + "check": "remark . --quiet --frail", + /* … */ + }, + /* … */ +``` -unified() - .use(remarkParse) - .use(remarkLintEmphasisMarker, '*') - .use(remarkLintStrongMarker, '*') - // ^ two `remark-lint` rules. - .use(remarkStringify, {emphasis: '*', strong: '*'}) - // ^ `remark-stringify` with settings. - .process('_Hello_, __world__!') - .then((file) => { - console.error(reporter(file)) - console.log(String(file)) - }) +> 💡 **Tip**: add ESLint and such in the `check` script too. + +Observe that the above change adds a `check` script, which can be run with +`npm run check`. +It runs remark on all markdown files (`.`), shows only warnings and errors +(`--quiet`), and exits as failed on warnings (`--frail`). +Run `./node_modules/.bin/remark --help` for more info on the CLI. + +Now add a `remarkConfig` to your `package.json` to configure remark: + +```js + /* … */ + "remarkConfig": { + "plugins": [ + "remark-preset-lint-consistent", // Check that markdown is consistent. + "remark-preset-lint-recommended", // Few recommended rules. + // `remark-lint-list-item-indent` is configured with `tab-size` in the + // recommended preset, but if we’d prefer something else, it can be + // reconfigured: + [ + "remark-lint-list-item-indent", + "space" + ] + ] + }, + /* … */ ``` -Now, when running `node example`, this results in the same output as the -previous example. +> 👉 **Note**: you must remove the comments in the above examples when +> copy/pasting them, as comments are not supported in `package.json` files. -###### Example +Finally run the npm script to check markdown files in your project: -If you’re using [`remark-cli`][cli], [`remark-stringify`][remark-stringify] is -included unless an output format other than markdown (such as HTML) is defined. -In this case you can configure `remark-stringify` settings using the -[`-s, --settings`][cli-settings] flag or a `"settings"` field in [remark -configuration files][cli-config]. +```sh +npm run check +``` -Say we have the following file, `example.md`: +### Example: check and format markdown on the CLI -```markdown -_Hello_, __world__! +remark lint rules *check* markdown. +The CLI can *format* markdown. +You can combine these features but have to manually synchronize their +configuration. +Please first follow the previous example (checking markdown on the CLI) and then +change the npm script: + +```js + /* … */ + "scripts": { + /* … */ + "format": "remark . --quiet --frail --output", + /* … */ + }, + /* … */ ``` -And our `package.json` looks as follows: +The script is now called `format` to reflect what it does. +It now includes an `--output` flag, which means it will overwrite existing files +with changes. + +Update `remarkConfig`: ```js - // … + /* … */ "remarkConfig": { "settings": { "emphasis": "*", "strong": "*" }, "plugins": [ - "remark-lint-emphasis-marker", - "remark-lint-strong-marker" + "remark-preset-lint-consistent", + "remark-preset-lint-recommended", + ["remark-lint-list-item-indent", "space"] + ["remark-lint-emphasis-marker", "*"], + ["remark-lint-strong-marker", "*"] ] - } - // … + }, + /* … */ ``` -Now, running `remark example.md` yields warnings and a formatted file: +This now includes `settings`, which configures +[`remark-stringify`][remark-stringify], and explicitly prefers asterisks +for emphasis and strong. +Install the new dependencies: -```txt -*Hello*, **world**! -example.md - 1:1-1:8 warning Emphasis should use `*` as a marker emphasis-marker remark-lint - 1:10-1:19 warning Strong should use `*` as a marker strong-marker remark-lint +```sh +npm install remark-lint-emphasis-marker remark-lint-strong-marker --save-dev +``` -⚠ 2 warnings +Finally run the npm script to format markdown files in your project: + +```sh +npm run format ``` -> Note: running `remark example.md -o` or `remark example.md --output` -> overwrites `example.md` and formats it. -> So, if you’d run that twice (the first pass lints and fixes the Markdown, the -> second pass checks it again), you’d see the output `example.md: written` as -> all warnings are now fixed. +> 👉 **Note**: running `npm run format` now checks *and* formats your files. +> The first time you run it, assuming you have underscores for emphasis and +> strong, it would first warn and then format. +> The second time you run it, no warnings should appear. ## Integrations * [`linter-remark`](https://github.com/wooorm/linter-remark) ([Atom](https://atom.io)) - — use all of remark from Atom + — use remark from Atom * [`vscode-remark-lint`](https://github.com/drewbourne/vscode-remark-lint) ([VS Code](https://code.visualstudio.com)) — use `remark-lint` from Visual Studio Code @@ -330,103 +576,35 @@ example.md * [`ale`](https://github.com/w0rp/ale) ([Vim](https://www.vim.org)) — use `remark-lint` from Vim -* [`gulp-remark`](https://github.com/remarkjs/gulp-remark) - ([Gulp](https://gulpjs.com)) - — use all of remark with Gulp -* [`grunt-remark`](https://github.com/remarkjs/grunt-remark) - ([Grunt](https://gruntjs.com/)) - — use all of remark with Grunt * [`jest-runner-remark`](https://github.com/keplersj/jest-runner-remark) ([Jest](https://jestjs.io)) - — use all of remark with Jest - -We’re interested in more integrations. -Let us know if we can help. + — use remark with Jest -## Rules - -[`doc/rules.md`][rules] lists all available official rules. - -## List of presets - -Presets can be loaded just like other plugins. - - +## Syntax -* [`remark-preset-lint-consistent`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-consistent) — rules that enforce consistency -* [`remark-preset-lint-markdown-style-guide`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-markdown-style-guide) — rules that enforce the markdown style guide -* [`remark-preset-lint-recommended`](https://github.com/remarkjs/remark-lint/tree/main/packages/remark-preset-lint-recommended) — rules that prevent mistakes or stuff that fails across vendors. +Markdown is parsed by [`remark-parse`][remark-parse] (included in `remark`) +according to CommonMark. +You can combine it with other plugins to add syntax extensions. +Notable examples that deeply integrate with it are +[`remark-gfm`][remark-gfm], +[`remark-mdx`][remark-mdx], +[`remark-frontmatter`][remark-frontmatter], +[`remark-math`][remark-math], and +[`remark-directive`][remark-directive]. - - -## List of external rules +## Compatibility -External rules can be loaded just like normal rules. - - - -* [`remark-lint-alphabetize-lists`](https://github.com/vhf/remark-lint-alphabetize-lists) - — Ensure list items are in alphabetical order -* [`remark-lint-appropriate-heading`](https://github.com/RichardLitt/remark-lint-appropriate-heading) - — Check that the top level heading matches the directory name -* [`remark-lint-blank-lines-1-0-2`](https://github.com/vhf/remark-lint-blank-lines-1-0-2) - — Ensure a specific number of lines between blocks -* [`remark-lint-books-links`](https://github.com/vhf/remark-lint-books-links) - — Ensure links in lists of books follow a standard format -* [`remark-lint-code`](https://github.com/Qard/remark-lint-code) - — Lint fenced code blocks by corresponding language tags, - currently supporting [ESLint](https://github.com/Qard/remark-lint-code-eslint) -* [`remark-lint-match-punctuation`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-match-punctuation) - — Ensures punctuations are used in pairs if necessary. -* [`remark-lint-mdash-style`](https://github.com/alexandrtovmach/remark-lint-mdash-style) - — Ensure em-dash (`—`) style follows a standard format -* [`remark-lint-no-chinese-punctuation-in-number`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-no-chinese-punctuation-in-number) - — Ensures that Chinese punctuation’s not used in numbers -* [`remark-lint-no-dead-urls`](https://github.com/davidtheclark/remark-lint-no-dead-urls) - — Check that external links are alive -* [`remark-lint-no-long-code`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-no-long-code) - — Ensures that each line in code block won't be too long. -* [`remark-lint-no-repeat-punctuation`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-no-repeat-punctuation) - — Ensures punctuation is not repeated -* [`remark-lint-emoji-limit`](https://github.com/zerok/remark-lint-emoji-limit) - — Enforce a limit of emoji per paragraph -* [`remark-lint-no-empty-sections`](https://github.com/vhf/remark-lint-no-empty-sections) - — Ensure every heading is followed by content (forming a section) -* [`remark-lint-heading-length`](https://github.com/zerok/remark-lint-heading-length) - — Ensure headings have the appropriate length -* [`remark-lint-heading-whitespace`](https://github.com/vhf/remark-lint-heading-whitespace) - — Ensure heading parsing is not broken by weird whitespace -* [`remark-lint-are-links-valid`](https://github.com/wemake-services/remark-lint-are-links-valid) - — Check if your links are reachable and/or unique -* [`remark-lint-spaces-around-number`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-spaces-around-number) - — Ensures there are spaces around number and Chinese. -* [`remark-lint-spaces-around-word`](https://github.com/laysent/remark-lint-plugins/tree/HEAD/packages/remark-lint-spaces-around-word) - — Ensures there are spaces around English word and Chinese. -* [`remark-lint-no-url-trailing-slash`](https://github.com/vhf/remark-lint-no-url-trailing-slash) - — Ensure that the `href` of links has no trailing slash -* [`remark-lint-write-good`](https://github.com/zerok/remark-lint-write-good) - — Wrapper for `write-good` -* [`remark-lint-double-link`](https://github.com/Scrum/remark-lint-double-link) - — Ensure the same URL is not linked multiple times. - -## Create a custom rule - -Follow this comprehensive [tutorial](https://github.com/remarkjs/remark-lint/blob/main/doc/create-a-custom-rule.md) on how to create your own custom rule for `remark`. +Projects maintained by the unified collective are compatible with all maintained +versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +Our projects sometimes work with older versions, but this is not guaranteed. ## Security -Use of `remark-lint` does not mutate the tree so there are no openings for +Use of `remark-lint` does not change the tree so there are no openings for [cross-site scripting (XSS)][xss] attacks. Messages from linting rules may be hidden from user content though, causing -builds to fail or pass, or changing a report. - -## Related - -* [`remark-validate-links`](https://github.com/remarkjs/remark-validate-links) - — Validate if links point to existing headings and files in markdown +builds to fail or pass. ## Contribute @@ -466,46 +644,46 @@ abide by its terms. [collective]: https://opencollective.com/unified -[npm]: https://docs.npmjs.com/cli/install - [health]: https://github.com/remarkjs/.github -[contributing]: https://github.com/remarkjs/.github/blob/HEAD/contributing.md +[contributing]: https://github.com/remarkjs/.github/blob/main/contributing.md -[support]: https://github.com/remarkjs/.github/blob/HEAD/support.md +[support]: https://github.com/remarkjs/.github/blob/main/support.md -[coc]: https://github.com/remarkjs/.github/blob/HEAD/code-of-conduct.md +[coc]: https://github.com/remarkjs/.github/blob/main/code-of-conduct.md [license]: license [author]: https://wooorm.com -[cli-settings]: https://github.com/unifiedjs/unified-args#--setting-settings +[unified]: https://github.com/unifiedjs/unified -[cli-config]: https://github.com/unifiedjs/unified-engine/blob/HEAD/doc/configure.md +[unified-use]: https://github.com/unifiedjs/unified#processoruseplugin-options [remark]: https://github.com/remarkjs/remark -[remark-plugins]: https://github.com/remarkjs/remark/blob/HEAD/doc/plugins.md +[remark-cli]: https://github.com/remarkjs/remark/tree/main/packages/remark-cli -[remark-stringify]: https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify +[remark-parse]: https://github.com/remarkjs/remark/tree/main/packages/remark-parse -[remark-stringify-options]: https://github.com/remarkjs/remark/tree/HEAD/packages/remark-stringify#options +[remark-stringify]: https://github.com/remarkjs/remark/tree/main/packages/remark-stringify -[api]: https://github.com/remarkjs/remark/tree/HEAD/packages/remark +[remark-plugin]: https://github.com/remarkjs/remark#plugins -[cli]: https://github.com/remarkjs/remark/tree/HEAD/packages/remark-cli +[remark-message-control]: https://github.com/remarkjs/remark-message-control -[message-control]: https://github.com/remarkjs/remark-message-control#markers +[remark-gfm]: https://github.com/remarkjs/remark-gfm -[preset-recommended]: https://github.com/remarkjs/remark-lint/blob/main/packages/remark-preset-lint-recommended +[remark-frontmatter]: https://github.com/remarkjs/remark-frontmatter -[logo]: https://raw.githubusercontent.com/remarkjs/remark-lint/02295bc/logo.svg?sanitize=true +[remark-math]: https://github.com/remarkjs/remark-math -[screenshot]: https://raw.githubusercontent.com/remarkjs/remark-lint/02295bc/screenshot.png +[remark-directive]: https://github.com/remarkjs/remark-directive -[rules]: doc/rules.md +[remark-mdx]: https://github.com/mdx-js/mdx/tree/main/packages/remark-mdx -[presets]: #list-of-presets +[logo]: https://raw.githubusercontent.com/remarkjs/remark-lint/02295bc/logo.svg?sanitize=true [xss]: https://en.wikipedia.org/wiki/Cross-site_scripting + +[tutorial]: doc/create-a-custom-rule.md diff --git a/screenshot.png b/screenshot.png index 982f63b6e25ccba74f346217b843fecb2053bb01..f6d601b10ef3908ce1b0ae9adeb1c5b5225806c8 100644 GIT binary patch literal 462856 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

q4a-C}SWgH&V34w7a*e_|5?!s!>;Xkqq$ z%}SIr3~(5-*ZI3+tOTnr7?4MI02*U3=e3zW0NH9VX_YWQ?&X8mgpl-j^^ zOJe>F%fGRwOHK=){b;$jDA)nqw(Y!1PN3$FU zJjs1D*naX&@U3%~Qj6A2KGNA%2qgII;oj$%DWk1Zu7rhZgy-ywr)d+i#s@>g9SRhaD2};B*Uf}r{E^3B!o6!1+Zics@k4tXA<)AmEsZ-s648Mr_ z`b{M+!16N$i~0B1B{;t(=sQBgZkTd$n0gH)z?4!*poY)SbE^1RaO&!J^2%Wrm7LcC z{suqSU;qRs{ZloBq@l)$SaN?1+r=%fJx7XJr^4QRQ{Ca*g$W)Z0#*=#)k)zye)sM6 z-$H}wVcXkvjc|qs%{(}Ym;!|})*ucTmgZvL;PbzoqbEl1#W_L#5!cp9i5Vf85(+j&N{Wp^NKf zJy|#Xv7_03bXfK89CAE|@=JN3hfwfjUTCoRN!Ibxz1N+*REe8;W5hFEdXJm2y+zOS zp~QEY^!wR613Az20`sc1(hhZ*1fl7<2w8YlqE`Ce)Tf!^;>M+5TB`PrihcTTHxP(wx_wg4r$;(|z-itn5l0VHO5uqs<3jLbi&Z)}_CsR4qSs#x}ztJ4)Gpzxl<5u8iP+OE#KK-!No(qV}5*u;Y;Gl zAhb4AXgn4xuwZELEA6{~5;3V0Z8=UgH;0(7+qqZc)fYe5*LW-#s3BfXu}=QX#8ZRc zo3fGzjH1$V%$B}C{8dm~TPruryNKv?XdJnlSrjV-DOf(NXwB%n}Y!0�|-tX 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�d?Se0+gGu^M!0#F+nksRI<%t)ec2O1VaiF!L&A+#Wh7{W(La6RvAmC zO%jG)&!=u~{GjlE&!m$9AK-Z}rPhR=Qybl%6f*HzkFVVfxSkmq(AO&yWq!vro9^cH zM(XGDhUVh`#S4C?#Q1C%WsLLq4I!N2{f`LwyPQNY3cNd{&UXz6J){JG(E`^VBJj9T z+D>fgS`9))#1?Xs9Wr31_N~fcC)hhRI+5vWjq+!4yf9u>y4s}R!w_RBu(PXV$&Q0a zoxj5KB{f`*(U~Hxi)77OZPRSqdC@rVW5sQM`+*wf+!j|jCn#yej59Czill~l!+<4}wAb-q&2fN>~tPj40;ii>qV{+=&VZ1I5w zKaGFzHRsm54ZRYybm~yil_C2Vp%Q)FW@eq6%5B5Dcfs?7oxbrp>Zqa5Z>*D}F8`eV zXMA0Ky1mN-#&PfqI$M6jql_1hAJv-n;H4iX?nlfD@iaBE(Kaqb)hsl8|8TiZ`vKNO z`=M`(_QRTc>zn5JjR~LUJgw+^#vym8>uVnU4yd&mD;oxz?qnRHFf46jJum`uEuDS3 z^+okhlZap8u^R}j8&p@a*vT}&e0R&RogzeC&1Y+BSuRh$mp*vI5_P4>Z)HA9l(*n- zt7%6^wogYc^0@nacV4DGx4rw^%_S#Vs>T=TZ9cv|**lyz=Qf!3zbSCf?s!GsJPidq znVLpnp2N=#i#Xz{i=&`xc%>x&Cz(!m-2(rp$ljiicbfPfTgv3=5oZ+^k&z-(~zk4?(?&o~0&_$|gDA~ghR zGxW607FjOr*jq0cXawIG$VwWmFulSw1-cc@R#6pQjn zRh9&usnMsLRgcnVCR~h5ReS&=M=IAo>pw4mzE`K+A^hQpKf_zUo(%?b%}8)c)ov5b z2le>q6T*{|?3c1UEVP9VNRh)HLo_LhA{JUy0(!fuvm|#jrG4g-!KZ$;A3i3wJHm6S zwq~F@v&=lBax%CI+^roPsfxsIPG!~MKIL09@M}$QIY|9 zY{vJjb-ijtxn|1K7cvGJMr z(lPPabad_1@ipCaD%f=;Il?!||GDTf!f-Q}HS)>&-~utWZnK@tnd%RZ!(D1MoV|I$ z4v+P-dZn^CIW8lvMhj{8lY`DN>U1GNJX%!`kZ_%ahx>MF+-7v#&oPHQe9(Mgc8X=S z4Sv>a^G4|#my4v~ZxQxGW3O^>@*=rtPP@*J_S&k7647DADPzR=R5~XN?_f>4n}IGi zuQjhe>WkZNYn58c+Y-aww=YMI$D7x!kGAs)snCttbOz!7wMY2&-*&n0-Z3f@!ao~V zEOxt58zZ&tf}h-ji`{*Yh&>JCl;|N4eL&x2RZ^8L`T89TdGik|>dJD2>sY zOn%u`bYwV@8ZFjDWpP-ttK089`=r049IRM2`{VhMTu!k^NH^GslZD~t~Vr(%i6)fdXso* z=-sWNGo1rDv$auS^c#epn^$yuK`56f8mrdv{@HV!!xc?>M=Pva2O++bX`-!S0=IFK zTrNS0r+gDE8?&?70xnk(=I4>rU%8+Hj3PE6uYxQ{eWUoU6R1bS%p%!E=7``7&-I^q zsWgT!6!2er{RW8ssp4FM-CkIoogY}zI1o0j~nVNN>;&TW>G z@|flB95sFZ`0JXPmyKJKkKORP`a_r4^AV1oe2ngGYX+tBV;2G&Ir;`ervw*Sq4iIU z;#jF#F(vW$g00uh63AWHEg_|K=lgCepBE?etaLtepPX!KjPr!L@=Gf(_rd2s=OyhgP%bH>Q$CeoeRNas2Q3b9 zg|;|5v*zcbjWt|uxSv;kxJEMiXg6_kUJS%LuCp=6>A2`un5&&_po_;eye!7Ux6F4G zm~?F0=miy<&f{OT+q{`B0MeXjE64w%-v8H5;9I&>#)Qt_IHXe~Tc zR6Q(zDh{%Bv%o*P+ZANXOD?IU+xMv{;fGgf(rQR?Ph4$fUg?;!LKuq4j>qXgk#bPm z^&7*=^;#JW*)7bycUG%Mm3Utec)$X5(gR(0P<@)IC;f)fQWD0Gm*WOf2$F;@e|{G;Hw7Bj)!pSR=2w5utaXs{CW^vBE&T70Ri*1uIAJUxu_(`JOfv_ zT2cuaDGOTh5Z3ffT61o4PL;fI5z)K;t!W+2=4H{1IvO`#Zb%ZVT0RIR;9N)#z)afA z2=EZe&iA7_z&wQbpxZzh~Mxjn=n*oxkY+r5~xW}p?Xpn4d|94EH3 zqG+uZfp3)b8$STrV=#neltdR?lvC1Nj%m+b)8yx*?JvR|U^e>YX% z)`$1H{jBBKj@hthO17|EYdzWchN^J=VP$}GeY!WD2tFxI^AJ5EBPu1@!%S>H&g?%^(>&#lCe^Vh=L})1NTb-w;&&^@NuOPZ6-5Sm`?xqJe_f| zaSW)~6m6$^D9y6AK#N5cQ&+SfL?Dw)(7{kmbV9XNI9+RJfiTpK9cF3k-*0-|JO$!gmZ@`=BX#V}UO~(F2O(w@BmAfv?zvZyaw&Znt zQ@e9di5+vw=;i@MZ+**0M@$JFO{tn5dj3cHm)*hKin|R$&NVqo3srnx+nUq^Lb?hx zB2T;?{hoB{Sh;KV8o2KeQ{42}UEIcR^|9}#lVhl@tb>g%gmBKpOoYGJJfBA3=^SmO zb;~LI!htbzOHcIUMaD8brYZZU=v)Q+CF+#+fo7VfthhwV$nUVI3^1`)$xn3;OZZB5 zIUSVFCxhRg&Fk#kGE`{9>FwzPhyto8P!t|^`kh)cpZ=1J=c7V_$6N|)Tu!A2-Appq z)o2LU0~-^%7lt33mS|(gydtd?7A}vwv(}TttrzYauc$!x_>JE*_xR1zu6}WD7 ze!s{0`u&H$`0IULd&RRZo@{aa$-p5_X47_ebp)t$>5xLv|2|p)?B}0axZ|c6Y2W@h zEZtEwd1FX1O2GkVXxR;?;mJ-^KeraqCG3E{qD*Vo+8dv4s3L{FOSet!Y1x&fM&!8$ zsW^Bl+~1ye>LavU^gJhT@f%WelDoGsHC5xJJjabY^-{wteIX+12NN{IE=~hPZVIy~ zfa^ZNmdUjEqh+AX=Xg5!Gga2kZG{dLXbrn92= zA=>^&z8>;5@6#sW-I$@b4KhETP;XDbgwqp$pgFK{z0aNvHMCUTSBG*~gD-gQ^xPsK zx<}=U_m(>r2vk3-I(1-dF#0u~#~&Y${bQy!M7AF=-zNV*|O0WpDk7S??3r8pFUZnBDR6s&nq~8qx9~feFTc%E4;^kmx8f0 zely&EWD3i6STDZqX6@C#?*HG%9e|5BwnK$M*Z?58%YzIfm)4{ps&9Aaj0!>(Ue7*x zEN4ni6@Lj4ns$z!GK)`wTtif02ZzAu!}-H?BBnkBRnV_p^rtJawB zb6AqgQKQNEnRaHJQg(_WCPg+?g+{v#H{^XLD85%(oV?ZquXJmYKOufl#q8xARTf;XQo6I?lX=$INor7P%WW_O{Ogk%H3N{fc zfm&AG+!Ibv%65eE(i09zRea{?)xb-cuLd8LSt<*Kq+aolZ0E})!Q7Hy6v<(c-*tT4 zF6%vRTcpLP^p3BVUx;e6;MEo;Cls;RUApGEjnD^Sb!Fw;or(PcJRk2MrFT(%VVc># zsZoYRUB@{OEi9k8)OM@d6YXP6Yu;%I2A56eQ`Avpq%5?C?}-f5nq(~fP?B+Fu+L`# zvAf6eg)w5&t=jRX+3*htfUn~(w0pO3}CI8Y# zNdvpnsM1G}hWz!{UJsh=T_>DO)}O6(gUVtW5^K`;XXXZTv~2@+mrJQ1D}+D{uQf{AF$68T)Bc5>2}}#@v-Uka1dVHK=Y^KWUmPo7jGoCB0v^_NN}<-K=4K zE9`$&kCp?eUU;eex<1_Nkj`L6+wwb{mp6|}mYs3H6;u(&w-xoiy_-{!KSMG^&I3!v zR?(e*O@59`YCw-z7_2EiHcG`-lhz3RdKpxK`H?S;(V-^})BFsJqtsTn)|ahAR~7}z z2m6LJNamC5Q6_uKc+~ig@u3kxAZ*ez`?Kc{hXj^x%9|>FbQ!CxbRW-IpR;?27>tUD zF$|G(2fLqt2qqM9*xd+5diyWqR@yrq@u-Q&mniQAI|+n?uj0;uETxQJh)*H+vofok zGCP5=05hbVJoz5;$p>YL_Ns7%!99m-;ClYrDGj)n2*RNMaNr&0dt$n}c7zSeudhJt zNUEm6#U-U^3GV%H;s?&O(Vy-yu+$~Om|)I z!r?bwyAUrUZww~BJ`9(zydg3fS}gEEOikGF(Sw<0ZeTKrMG{ID>5*ROw6A1S770E* zH7V@?-eKgDQeMVM7?;mko%-x8hR0O|4;^^FSk$GYdFUh^@c6?$8HCOL`c1}l0AzSX zsa?`*dMkSYhX%%&CL3cn-x(vvn_aLD4m_vvG|@hrYy-?#ikhZR_3|3oK-e_w{Bs4o z`c_T;?g~JtuBudDw{DGT&ylhYzg%}Y=!o|UYs*@=RomrO6>`Bnw1t&EKq}C!sHof@ zzgpb%6~c4XMjtd+pvf))wj8s9Zr`v=PNlV^I#FflvS;cr^Z(SC=i8;$&l;4sUb2P- zL9(U9*>2JjQ#30kiXnAH5%jupL|9AegQKF5pBSy&d#XjDoozq5bHo17k_e-N^9k%K z@CCB#a1!^JerA%tT_HW(wLHF!4dIV%3j*Z=rZBcrFyZ=7OxH64>gab0t3D)Di2|u92$;(<+>SsmN~`1Gd7CYy|&_Z z7ovXIxwDuP&+wBb_TQ!E8-!zthRq^!Y(qbQ*>_UOX%AvNM zR=DzbziX_u*P_aidXnNsbgU#2|9=FK3nowBl+ zo50iy)PjDz?B87kb1KXRVkGg}&&-B9d<|S+?*~-mR4#6K#{SvKZ&|;2u9?N`WnD|- z*~9Q=8kZEIQZ4TK{pO`?6@HC$b%mTTl9bdwHNT>&SyQG<>3d5*_!y@Sa~el~c+%V# z4q|)Tci1lXj<#iPfKc^>tihnY{Lu^EaLMiWnKfm&F5(6Cyf_uY-JfP}T$hjAyWAoG zg3oh1vFENiwk%jh{eyBeNiQn3D2v71ah~&5La8)t^RED>_?INuk2c=r+Mu16-q597gU@xjFTjML!aNFtpK zj7#}iI^AR})y^mCAPXcN zH2gZF_-88^?VS5>7J7B@-wO(6@un5sFnWUsd}qq9!QV$VeE5fGeM=PUE=!iC%OTA{ z5)?vwkxMTh(&X+Ea~WEUO#P{%#Yt_eQWau6_eM(#e$8P$M9K70*H!M=#ga-}P+q02 zcr2OA^)-Oj5V_~UU~r6nWR1l6NXrt7p5Ko3pTjV5yun#7bT9FQYn;^3>q*f|E17~X zRbZ@Cw+i_s7C%Eg-3``uhfIv!ATAhyvCK3CKV%quC8k%Gk6b+dHtw=i$v@g@fGnNJ z=&Ng7l}RBcBKG>1Vg)v`+n;O94aQjq6s^{y<<{Q=p&&OLy^4H?u>wO*0$$s56>&4C zM|VP4h6-e|2~_PLXXI|tf-bM!F+H6UU&%8kjQvhexVy3v{Gdz=LUOc1xIxiV-DQz7 zUu|D$lA5`8g$fu*xK)P*u#N0Bx8=BrL*{+;N%2i&)R)}w6ekUh(G7LpF!9_`h*$Nb zEf>R}mYlC)z5lCUM+r_eok#z;0%bS?bdQ4PE*RKJGm4fH32G z3F6pWqhXRwpOMH-^gVT&En8QPKH5q4HHKP*1@g9mv;bi&;FLe96Yc$=^jETe zPpc6u)_xkKU-aNRyM4{Oz>$)cVjoqV)~e~u5#st!w%!%Y7-3USO8%fK%`Y5oxG%PV zHG4+S8~N2Ofbu?z@JjkVf_!zeB5i3+ij)N8_IaUv0gN}9CHBsRf7ZfdTxGQjwQzgi zC6!W8Q_H$;_ULpi*p!$s9hkU0;GOS(I2W<9Oy)k^SStl{8jFARV`>s_F@6o3M~l2N zbE$Hs^S5|3;aGd}!}=-&a75|(h^=rlQRX`}2DpBZWkA>n%lWAI_J45Ptb&=;iV2wx z69No4@9KG`AVy%D;SM-cgMXhn7&H>`cV~`b=-fc$LEV%l288#y(;jw!)hjPIXNI#wq;{ zbs*;STKK}V7Ms_0S5T*st!iMnzj}>zZ)$+P!YllzE6Tc&t8eeAGL>$J7s_7u;W1dz zLAx*Wj@!$@Td7CVwBt=JYXF6Od#cfNZ+w$<2-{Rj^Dz3e_MY8RqJaniN1t91GOLL-3U5QeZh0Gh1iMpAnR^g|k6Jg{-aF z8-npG^&A;d2UbIQFVDT`*asK>;sykrMksLbq#`WlM!pUIzGADI#`{%l*(6TNK6O26j}8xL^s7h! zE>AptG2phktW;~ED9;22pbCY}FlvTJM9`PdUrZY+hwEhxTsNNa<>v9lCJ%uCFw$&4 zl-XncY~!WX(1-kJ!GH&+uF9nS%}r_D5Q^<*hfWNGtS9h+l7jS+msw2Plw3R9Nu@S_=+pR<#s6cwcT5=6GSVDw8pr=P~1Gm zu($OFP!IV=(&}*^W=N{kNi&Jy`yU1NewxsS_z`Jp1|qOViKq#5T(C{)`d#xRLy?qc zhj-rgg=TD8{p!m&a{pwU;j{zPM|fZKTjpwK-F}2k zJd;;-Y9gIu)6wW+snANcaH%>yxgtNyfkjH1gmly52S=}|?=v?TX=hU2B0T*WhHjp1 z)#$I}?>mgtn)sC549QC?A;vqEX?>aQnqro@j0|qv=uH^f%Bsn6LP7(Z&)AArM>gJ1 zHH8{w_&CIv5I;g3A3CKEO9ho3+1=59_yDK~L-q!F5U?%MMcYo_>PL*j-SYRcd3zE@ zmA-!UTnK&pc{&$a3fI@O?z17O$WhO|rIdWi6vFy&-B0h4PIrQ>qe?Y3@6t5%SAX}s z4CE9~Si$7{Qnz{9cyps*zoDCh$okMGdr7sQE&Y|2lb`wPsgZZ!n9;R;dXL7c8A!9G zgD)XMM!PSEeuzz_TCEvmr&oLC+a2FFlmL1lRvO(vxh+>?AqujZ(#SFYq86~>9(W)6 zSG=A=AoTeJq2n4a_^S)2N&+B%BtNH14o9lf9A8LlQa8*>mUo}J5q(`Hz)daGfveL-)5}nHpVt#~c|+%NxwXu9tt){R zs20m(FY=oa&n`sjdzPYe^ge2wRM?m4MAaX-eM4BFduiSKvOl z1GSH~Z2BEIlHY&kY&vnd{)6*U8512_Y8b8UBLJ*g?Fi<)2iK|py`C`qNl_u=?QHGc zsoDZwAF#j-FOkd|shJO{i#d1kPP9y7z-Dahi-!2Nk3-d5bfxs)2hsyq)bqO8-cD7; z7B_)q-p1|Mt{UV43uZFe%8FXC}}v9|y4+v|B0un#bBG=_Mh42nviiYJ*~Aj#gaCgXbF-0pUbK zAKdO&`tArh_g0B_^;(|9SNCYGQ2=(*ZPeWi$Itc$K5-*0x&7jd_k%JBaIX+mSWo^z zHuEas;Wi5xsIa9oz*?vxaw%N8scU{_ zNw5$O{VRlg;{~$RJiy1P!Aa7oGMFJ~+8P?m%(|;`wIlUG>EcjgP{h0v)cyH_9oM0h z3a1{nus9W`^z(}M!A)OA*N=;xembCr5MO*(Ms;NYs+L|pIb}O zC8_!A_AnK(YXVO084gb;`b5;aGX^euG*(tG| zqjwo;LD$v2H=DQ-@TrHq)AU4N`1UaY5PUlE`dk^F+AqP2kv!~iOR;^k*uNr|Dflkb zK;8HdHnOQZ-@kIn5vY9+M26a#Ekmzz&D{_&p{ihDL&R%J0|NhE``dIfz~L&21#g#U z38=x>)HAf%-JWPj!^zoXxzmGu5!*Y=rYyv#QOtvnXy>jbtafvoRSlajp~2jllm2}E zK5}~;DwjCeODV)ZpI1@@uhF~*y=iri(}}unFc%T(&>mG_V&MPom|@5$DaQ?o`=S!3shK22s#4$c7(-+f$suQn5*!a-4CuqdJvU>Rn zVU2d?UW;GN%Va|?Mwg`fi19}Ncu|_XoV`*ihJ=7R=o?kJKF#@|rXz_dAgt~p!KG}z%b#0q`)(yXaeMw| zk}X7lv#>tK3##f(iwKxZocM)+erP_#laOUk@qj=|8zk@4SnB~(4+J&YdiYMcK~ri_ zXYC~S_R{q(=NLY*1r;$)FVZiF(?elM&FcQIqLt>Qc__m>g2}Vayd|B1JbPSPo%>{cM`z_W6 z7-~EXNNvK|*9azS%u(rPc%*r)&aVXqL%&02EGKb6w^W`aB@JNFG zY)=2)m^N*#uz>-j}4C`Gtx_~a?6Bd-)$XR#}q|{-sct*5%!X# zJ~g2{JW7dqC@hn!R{NGg;%KL5KGvy`c9q(T{OJ2CfAYccG5yD3zvlWPxO1_`A2wMg zSjF%bztZxNrtIm?Ov@L(4cRYprog-|Ow0$1;#Jc0Mf`+lq>7zuVw`9QUL;|C$6g)QjvxkX*g`^+=e!XS|+@tHlD3TEOqU zxF|WKb>=A2kx^N8N%ySr+M&tVvbMY*_Q~cwW_i*Rq+$E*%qIV=WRIN>1K7-i#+Eg7 zL2dbEJwHG*lcfW;`*v4xbO7@-_S--fq9fdt(x7Y`vGCS8_gE*&+d!qRWM~CNmZJv? zs9BT~<8_H^$658aJC*>E+`S0JPSw#+A%4UiXpPZ_2wDGBeoQun#9>5knYzsZMq8i) z4XE<1$?fy+AZ)xkJV!%1C^Ebc2Hc;^^0|&raI7>#zuejo!?N9nKh^X79;7_Xctrbf zRifr5LWUmAtFSuNWp90?m?q^g6jvZ8$#DK~ASSyOY?rnElS~^_8rJM(kdr^Jv}tTeK(U zRC&J4t)?Ss`}Sam0U>!E^aP3c0l?S~auZ^&C(}jme~;zCsEg?G%eKm)e^EJ^@4GFU>5y8Ss%;)&X|!^-z?B{IdALtLRqtXGYfw;_f;FJK z_N43oJGC|N+rcn&a`x6q35w3Wg|^+glCl@qJxeHuja_MsOq*<^mA(9NiA%@=K-GiJESq|`Fq5z$?8H{l7xhj$^BvwZo zzK79?-E$7Oiq!N-)R6TUPw4Lsoox$?g9?#9lcy%ERWR{F1pIFjVUOQm<`&*WHUDGK zHP)yWVlC($GHXMfe~OTkroC~k^^ZeW+J*I!ddj67MRm zO?zky6(yh`M+2wn-VPFfJ`0T?dB$N-JDL4+?Z5l^neymNG723CQ!n=ax*k+D|5oy% zHsxuw`qQ<+1*_0-Uds<_k<>6nGl0e6jfCdQ`x!{elprj{$pqj;u2^b$`oo_=$mQSiR+wZG=BM9C6lt|UJ0U4K^tEXzK1SoS!@l{ z0@rZmau-DjXDWKm5pFU=wOGfr zikLzXwEe?>2v&+_mFCGdejz<-% zaAtqdhn`gM78M7WX^3{IMdRNUr*7N#r*<&@QheGN%qv>JEkL-CEJwLmKDOmjXxp5U z(Lw!L{m%I-ghxaK3*pf}rrqO6YrYV;x(8A-K>xv)-@|p)u1oic@iB5QM8?IDq>B5& zuaY^~e9!_QkPDRni-!jVsW{o+;_fyo0_qm4uBoZ0(!lnyoobCp)%e>dXXxTElx3;$ ztfJI*BuQY8BzpAbzyF>7L8oQ$ZX8cZ z#o;^#WqJ~j?AW%vQ`~PW3A?J4OmBY^X|I9>P8lVCQ(Xm9>+813EF-^n=L(!T^SQ+n z!*av7joi|G0e4wyjO2g0Z+#vjxXrTb*ODmjXx0r8xFcbLH3&tF`A%_Ir&YJUtY7b2 zElq>tF)2t@kC|zkJ{s>oisl$pyVw3*)fAGNpc2J6#s)+&RNmo`$lVjFah;0Y9dHeJ zy+ND5bK|d=-EUNDe*cS^mKg^BavyP?=ix(oJqspV1pyOIb%QOJf!}k>LuPQxr^xGj zCFnt*erL30cso=wAH7{W$`0~5S-s6SgU|=k+PLQoj&+$;^1_yPulE00lCbx6xGIOH! zVjMOyU&G|kf0y5+ACEdcC`1Kc$sg0vP$2Lgh#>(EX2gUa%%4=qU%}9`EZjn>x}QL@ zl{X*`H%9hYG3Q9BJm*a|!@0WTi*L1RuXzmjr%SPqesA!HR)1@={0qnRe>}$bzA*p< z@z?iXZ*lfYIl0}gn!f^jsB)jNVl0Q(*>+%o7h13Ws)($g;^UfcNxq#$f2izDbA2+I zCPo+E0p=)L(?%YDoaOvm`p;6B%%tm=#1q@@w#-H7HNNT!Sl-p;z<#G=d3dtWp%q;Q zI9{QK0fP#}CUF6gt7Pors;CRs@~*syFG0XE)J@pmnP6#Z$iobKL(FFZ%PTh1SfATm z;R#u~KdH(NWS3QCXEx$bLAs+Ya9GqIIiM##;M01O=UsfiY*CIBR!=~DFhbwI;1+j` zZ;{jkz^kuP?JbrcVe{>|$ltX1e@{-=pZ`(4TthCVnFG+!+v}iM`U_r^Lsw1hd)Q zedF75jb>>E&D|JKr$w!160XchI^l;q#T3P^%0eFF*kJubv#Gh zUiGVj3?k-sFFc`S^H}DtG$;s-ImKoiJWY^wH$^`QZ|aKxtdhj5Ig;rq9WNFy96ml- z#d0H4rRp9peKSkfKDnyAe*AMcQ}5sY)Y#JYzrqavQ;vb@=-<+@-l;1I{gKqo3~4vO zlB!hFo{|!C%bnNqzSFtTwt{2ni>VyP80{i)p)qm-{v2~yO4Ax8p|#!Q+XgQs;nZk zT^`Y|B4=9E9%++%?Iw8cy{e}H;p0=`$Exg72X%?TF|4UUP2_Cy3l=bl0|r_U%Arfg z&O=NAvBAL(C3x*-yIH+|`3%kfH$Fq>KR&~3i^A4WhMX*Ywr6IbD=c-5aXju3H-U44 zYKO=KpD(~yEe2RUJ8+db85P_D;4w$mQ>nHIG9|) z>oGyZjS8b;shF_5o?7dJY0bRGL2)hrqXs4UPlMV()ZPhe0VH-JTOPB0>hv`jLMzL6 z$`lII5JA_kvkMGg>hwGK8h-xWdSD;?rR!9F09$fZZym*nN9lWR7k|^!K5@IxBC((wUf0!;$1LNw z&{M|p=%ga2YRJ4EA702XEmjn99^wb~jYAn{UBf-VenZvsw3`C?HXqs^ntG>fA}F5! zkLpiQ=$|dM{hJUFFW?jR<5kB+pUY)5ENPqvk|lGuLXF3`obJRX$*MHoY_D4Cp8t)T zg_bX6OOIimRUwvgsAenSlfke%l4`?&KVZ( z`P2EE6y+F_JO#+T_%A4P-Dk-Du{?G)Kb3~-dvch?!qE9H3zYF1BT+{%e3+xHoEyi` zA89UbRG}Np?hY(0%Rh4`N{VurKW+m<)YON^@}%2lO@=S|W7#clVsKZ$sY%xt^yfWZ zr-vFxwt#`nOIG|a*5-}n|ENcK|50fNBP4Q&Mkm@7#g;^v5LZ=u!MB|aNW{-Np(X>DC44> zLrK~2cji7A7KO1bK*!w(_QdvBy`c7rFV-iN`09QLO2sX=UoDK5G|ft`xhjxpV2RU{ z^*hESBjw~O7MjM)IaI3SRY2eDLnCbSwPJly?x9{>SURwzJ#zC!&lp~t(N^k1!poYf| z5J~m0k#tvWiBC;FzBdtSIxfa0kEO0zQ*81FuN!scc8CKx3a_;6fmjZU|IshU`CtBq zHuC}BbKY`sKW012d7P14DXm{xDUfRDN*#?1Ms^O%!k|w}elB5GJ0dk<1s7Wo?7o8u zQct1vudL`EPBXE|6Z7c(3|z7162y-1ILbhE$=ewp5WOw~H25qjG5coN>%`mm0!W>@ zSrq5bEFWfN6B*qnGFG)+)QrVJRD&6Oby_rjW&Tuu>1&D-C{}2g;w`@^RH?!+SoiDduxi5)&t0N3787#M{A(QMXdH?^oPK@39XCizAz+O{VFTQHOxJj`QP4!|;l`c3x7^xv~ zjK+iJ$9NASth71d4t1b1t!WK{1=tdxUW(HuksMhY$zKtw2*t#cpt! z|7hjqYwEU&<$bjzq8wLX>=ko&?wA7}hFg{K%4wwH{JCy%ZE(zocObf|IsNxd-+m7? z>O}q{mM{6H2QKzst}~^)_^)EI2FJft|1Y_G6sY&c^WEgfA0)XK&bCfh zXM`Tvk2)=vZa0~A?Cf!VK6YJpp#;5;m6|ITgRcQx$8Ld`_rRxW-}U-xS7K_lB;3M% z6ttoJ%WG?W!tKU=Z)fRK0<>K?(>J-w6`KlV$|8w^W4dae*vPeHEp2=khSjcZwm6+` z{s4>($7@#O!&EdN2|*6O-QVj!z8*D0a)q89j+f^|vx!P`z?T(st&a9MR?7T9>OkT_ z=e_cmLkBJ^alw1SbQQ1GNxS*sr_$y0xRoQJ3&;Ks+;2m^dnIzn7!PgE_a8L<_A8oS zVRa(xyRiN6BLzsfcgD?a-amGHw@)7h2^G=v_icr`_G zCju`5u4Ep)oaNM^m}vAn$MfZ1*m4jj&j1JxUin=>cE6-$_SY!njMH=A{0fdK76}4k z8&JUGCMOHOp_I7QrL29~3#WcP8G*EWNtZ|@H&^pk>=OG|DjIbEO!KMy^l0Gp2VhJwh_AVi4}-l<5o@io9*)E>X)&zu>lvK%dvJ>fHNQ4dYwHT6i$ zH+Bwn9W=pwhswU?2-;T$^MLBVK3XoyI>o7rQHpN~AmJw6x1d$F$@h}jZ@H6a_TAKa zw|($362DNfjKf*Cj%eMUOp1HVI7go6Fp+>dU+hA2>0Di=H$@)Z_sC4cm9=bQd zc2U{o;G(pI`?+_SNdlQs>|o-kSw+beU$=*d_DmE$B1Vck`XN6{x>>4*{rk)2(`4zS zlA@0tl#GsQqNc|-eF`=YURoaW9DmUMkQ^(AM|hq+3pm|}C!QY6wlx?v?GMX2ZCd#f z?ECLf*_i5wCGHKIpX719ac53B%6ps|2lij+annnYzFCb5JW2*zt%+TbQ+)1x9I?~u zrKOe7vE8Bm=#Qoe2(2@UyW{t6{k*2*}YdN9x zT^0Dj>jZ(a6W@vQ_%nw4xY(0N985dTY2KJUw@+a@$tDRU#aL@yr*^aG-zje$Wb8*I`IF1j$%9qIYa-Xe zw9$gDpPBNn}(q!h`|a}O~lRW zFezG(O}Re_6fVI;#0Snl4QIDJDE(q4+inSk0{D@pJYB(i9gV_1B^nqr!$PH7z%I4>;pU>A=RCb(P3$Y)M2wgX~0X-2eCGvsz2U;y|%pj zQ%_59gZNshY}8BNkS$zlW09WVYQ#6Xfn5n74eDJHhwO?B5gq3qh(jaRn`17xRnzwMQS`zIHvrp7F3--V}0_QAIb#5KTq!Szx>quE3Xz#C z_zop?n2C1(h{XB11Nj41DVbHDqA)yu?=Sm#+=A^~i2~%kc5wGUK7cU>Vh57GHSDQ9 zwuGR6J~t~?iAMEKHnkX0FU4vaKKJ(1Grj4ESxH4y!xA z&O-%7b`@2YyLZUN#0Lnv;rc0i7I%GhkrP+&uE3qT1_zu0Zclf|Jwam_170s_oA?DM^%dEGeH*Uqy7?Kh7>eQg%eg~ zR!I(G7i6Nou}t6NmLuq#zJK^fV30SSX@xlYN3v_O^Nmw=`-0)lg|>?VOJ7l{;g$PDG!!_ax`rFP%YK{60{A zpFtjR*!Vr?0nWWSF}Q4oH%b5$CwL1wDYx!|XJ#C<~Z>5dj)9*|U>8!7*u z^jpcWosuV64oBbqe4d4jCqC5J`85t^s{T4MI3YN_o)j+Qj#Y($4!aZq>i{ALEFcjg zje*hc;ZgN~%>Sc_w|ZqUJ>h`hqSjtm{^5=>T#a{bp3d-yhLL2imaI=$x$N=4%OQLI0eryIGlFWQ#g5^7w{7&G>~ z76g2I3dZ%d`=zc}ajYzzeJP*v=IN>x{qaMk`YzA(=0kFd?~r4Cf|U2!$pF}&C37oN>Smf-XbGxcAQYRHh=gL=(NI? z#y0hm3*I75a;qGC-_XoBW=g&n)<2^b2-;kQY`##bjv>H5a-u0OSvAR@3-(gACkst&^`+baAjD~c@|K?y|%-OzLx_e z3EZ4X2)+%o=21H_T0z}FlrHhpHEaQS$WM7O_gOe(vTJIK{q^S~>n6KVe0J|QFZHe0 zX;T)B3|f?v2~z4s(}kP1&9k@&V73STWg&27Tq%m7mDBUQxupEb({6e+0rofP*yYIKUDWqZJ^61Nd{kFiuHWbMI)BhEhuYfxsE(7apY zl>A1F9&`=4;IBVfrw8Fn1Tz7zb(D|LGi*VQiNP!u^s(g+j>(?n%-Zil9_ue{(6_|x z9%Ye=+$VRIq>-YFu~t2>Qmx}FHIN>Kk6$2GE93uc^hZ}NocvyT*K}j^G}6iZ?D!YR zd_L%4fBqC3neoknFRoxRl@)JrMB_Og3`FSB}s+sw;%A7)?7?LY@f) z0ePF>k1SB*?cA0~IhF;>r7PA{93U1S6DoLm&}o{v2)>vV-(eO|UicaaqVb(o-j+PH z%jkyPdirz0px5wDBIpU(d|O|TB)g|d#oBpOa)BUaxe(cLF(m%?D9tj4#U-j9^E}B^ z002uCp9J<6-53XoJ*m8MwDDlU3Ov3eRlYMRO3ZJzjObaf5PD^xIraN-0FYqrZU7Fc zL-426kCHQ%O1;+u0D%T8`*9=kFnYG+3=e$7N}uX}Uao+_wUr~y)UkU!#yeZTZC6K1 zZT)0NTwtG3OH)ZVcG8+Nyu1j#)|-z5$8Cp)U7#SNdOuev57XeIuOz^EZ>J;eJ~S%^ z3<}kJ8|U_BD;;eKc+;ciRfpwZKAJx+?6lNyiQJd=UZ2BZ4%z}E>t@J564(w7Suw}4 zp?92yjY2}m`V%8xw`sB;^p|DBKmSR?nF0b4B^DrH3aZKRm{IpNgd&h?OPV?JoEjf3 ze5CTL@ukL`DAQs0m*$jH(%3ttC2+Lx`_pKpnZ}p)=q)P+P2cUq9K(@#-c)KHA*9cA zxvidYot>s})$0Jx%3so6R~I(k9a{#hlW1+R_!`?2wbS88OF%vxfnCn-#YEutO}PJ~ zs1&g9;+lWG>CW0^x`q+k(MqnX(U;i0g`-)ecwD~pF)N0QrSB{Ap3T+S=dZ~Z$DchP zVA-tN&>pKoOnXDz_XB?V#h51&q-q7>i)LT4R{KLY_%g-dCajE^w!xJ2kAThj_H^6S z!rGm{oN4Rh^w9oa%mkz67l)B^F577pkYlCF;(fBs2d{8d;r+Av_9Gj68lrK{GoDA~ z;C};MM>H1#2s>I%Cr!EWkd)o_%$=rCGN(SZpTE@o*$A}Qg3LfR5dm?(`Auc)IK{*a z(r1RVdM0tsg+LFf|2kzge@Oq15>#$Z_*fVYdS-H*UgkT!v3I&(z^W8;;9p=l^D)yJ zJJD3JzyFN3T@9|a*M3y;V46C>DCa?ourHf=;Avj9*s11fD%=0X*IR}~!AIYsHVR5e z=Lm>^FpPvWgA$^EB7($F(%lUMs7QAW%}9$hL&qT9-7Q0R3^6bRoZ)@n|2g-0?z#61 zeBuMo%-VbHwb%M>Xny&OeN_DHM-6N#fPo(#ly%nxZ6e?Z?eeF0+5CF!i68R;v6@>k6T z|0kU=rkB4N$R)##AI3nV4lWk?K41XvD7(5;*rqn-B>|ULle9bjY{Kc+n9SP43sASF z)HfqiTGj`?uZ(WrQfz0D|MLCDw+X?@2}|r$9cbHU0qZ$IkK5MS6P@`=#-ecV;WN1? z#TQR9I+bNsQnFoecSu&$ct(=SGRZ-(P+;p0(|7r``p8kG}1)LDn9&!FV!L6F>>vpqR<3ayzTtpYe?Uk({P&1F}rU z0FR$BjSHpNe{@KyK;_0Q5{yv!rB-cIU9Ms-_2H@VveIRyIn8SeI*i^<=#2dnD{r6V z5zKAR0CdNR!X1!S>DXzpHYrCEc6#WdnFd`o_7h|J8RhL7ng%&*uA59Zta6U z=Jfo&S@p2XqtV0tWKWnXxzG}IBB-gr`$^L&uGCAqQTIK3Dyd?tWlJqk?&jj)rOxdR zvO=@j#=fF6;pq3KmIyyHB}qyCZFCLUyCi;H54Ks6i=ix^-8^;}6K0BI{I!Mx^K|%( z*E7veZk}3~Ts#H}DKl_NE_HtbfRCuSO2^{`g53tw$pI7lZ}Z-J7j``jB>wuoLQ0pn z{e^iC8h-xT4d00PQG=##&nRE`)Fk!Wh|z>Qo5Oa3(LZf^?GgMg0geA;ovRP>;H(#4tf>2EsY86l%C#T?!`=v+59O z*bp^}yU6U3gZDl-y*lf9I)MHFh|f9A=bWg@?-X!WmCGGIC|L`fi)M?hWD+d5f+_V= z^6UBV&tf~tol|}3cd%*%(4x(MkC*LpzIigR#n_}V>ZK4h!6u9Ar}n!oOdVw#h1s0s z_}#a49`7TJ-0xM{o>E48s;^vb_o_#m($P(fth!68wqDpvU_a&azgAlU@giGQg2S;|Lf4;OF|FL!Dr0zBlJO*L) zVfrlfD-bOmwT2i6PgHh`VNd(uauvrhJK`>~-k?Ja6ZWhMr;&Fw`%61hz+wRVRsQmD z*?DylV<1cS!%-jm?cKOWiyJwtcdydoL_4Ay-K3Wc$rN%^1d02c_{nW}`#JPvP zd><)wXnALarqIwzcAnAxXg~yy_X;bIuJ3?DPX6pLA5ycKuBJa$EZ5gBy#H zkH8Pw#a)dYk69w80B4vr8!g<~czIlT*fNyt3x z6|I=vCi!wm7WHhwts}@^ZGg)tF58s?sq)Eyqk}LKL5|AT0gr~Y0=f*@Cx=r^Rumjz zU%QrU$^1Um4;Pm#RK!~b5vxIiKI2eA)Qrkp-ZWz<3U6PZhUAX$xk;{%2MkGRX%gzxTK5;(x#u87R)*$f{^cUZIojE;c3h zQq80w5AS*=TFa^r(gTW#C2NfBF-?iLdx8tf)Oys4h)gfbk8dG?Rwq^TNFi=ZT|wkd z;>sf2R$H~*()^( zdcG;L6qBlFfgqT>{KKk`dmxwnrCc>o&>)_%W%Bl^wHhvp&Q!Fx;kby>X)bwDjj4T2 zn^2g^Z5y;0N*?hJpr}^XEX4a<87P$2Tk@u9sDH*bzV-{P3e(q0!DM3oy%cCKS)oCb z&&53S^!7{Ygyk^lTEn}}D5w@u)0&4fm+Y4Yd~A6k$;rjCsC&7${zR{_u{M;NBwP{| zS+cfUms6lnRKu)U#$#+Gy8LIj;`wjSrPR}C`mIpNn7%H_!}}jc?bTkMxey+LnaUQH z#0n#$_89s1KC_y9H{wLe%Z6ws`*v(of*beNj}ZOcFISU|&|6&Bgn z{#wYS13`ae8WBs;w0A7C>%;jkwd|XzBOXW#0aRZKv}O6YU$)r|f<3cE>FY?Xizwre zmTR#Ma&bAMO5{CGm=1XIZhfQGiC?I^s8#u%R#LU={~V(GMn&3*^^i+PZ6U>X7xuN5 zo!==pqGkWyppsqIdWu}u7Fcn3IWZU9MVyo2rl7JEYm%duKFG zJM4+wk2wXg^XmNya}t-m=*6!M3Rgd4_zGJjgT;B5{OrOda)%x5y4=CXAzVfI=ejL$ zxd(X${UmM?_^43-)_cvhg%GrLAGZA*d4~Qq4o>U`MMNOP8>!td`md`4O*dGsK!6qE zIZqHP$7M2_SnOJcSv^jv3_QI#22LFkmn%P~*1EopSFe%N9{{1XaGm_iYhof`;UEBG z@WS5{WOysCD`@D;BQDq;J%Z8#n-9qn=ylR|h#uYq4CC*0?v}Tz>yVvWg=Q;+Zi9nN zGi3Axmvg+D0#GBtN{Ywklnb?8mz~tW+Td)jNF^)g>*IK2tv+_6kFSs83EaCW@;Z`} zcZ0JU+A3zV+0`E{4s|Nc1^Ui7Gfq;qOga;ittc0P!<@ta)0`;%yW*2XeJaW+mFM1QEL2_LU>E)^+9 z#>dU_rSS4Ao@sDc_d|$e!_n^~-SVtApGEPX8k;K5Hp?OKvEGgViDbXT@sB?RG#OfZ zp1*PucdqHq+)k*=-c^-fgYarORr6IDOX0@n;PM~&)1|B){(!Wxqq5^HKwnYy(aPO` z(?@#XvJJt;TXa1!`I0|#HD-nSc0j88~wbzzN7fgUNM!a#wP2*K;E!}_`y^*waDbPIi=B{ z37<+pzT7BKBl0zn4!_H!q0VZ;V7#hKCK9Rea@sV4Y;j$hM6pe1&Rx%KrO$QP-ZHhG ziH5>GrJ|C=I*Qs}ymi6Q0R>UN`#to`rV!HbT$4&@746`wSr5rrBEEu7_Lz(W2hsj9 z8A!E7C>=fYC3y5U*o{pO;bP5~%yide?AH+Ckg$^1O2J5Xk@S?1iHVj;4*=~+wnVpg z+Rh^r;+Q^QDrZ0a_uK7c$`_5ecCEz-SBc1%ob*D|r-j_^fd73#?lUO|3SU$Xk+z(N zwOO4DXZ7|s7XJB8GLp+yxzCyMw(woKwMuS(&a9-!ptS#oYgBmIkieI?cw}Ngmmt(LQUmX>l{4C;K}BQ zW7>{O>xA{6O7;n;4rGa`uN-unwkO_zo-2xs+Gkx}?j)2AVY4aJAB03@0y?MxjAvA8 z?a$dCYOyl3W!)%eIhUt{myyv-a~?%CO%V5}xvZBd+p&3WJv%Rtv@#!KN4g|{y(!hL z8KgxrIw&iRLZ=d(Lov1IZvc#Mz1mT2cMZy-Y#|QK#EFNcHU=b04sN8EM#XLxLu^IB zK9Qk$8k-mJWju#~&$$QK1@{p$dz^(;?XdM+&{gK+$08TD(O`SBGb%rj&;mEM zW-U<1dZuvO1P9a#4^MQnNUtV+6f;jpbKxVxtIL$*i6 z3l_-6)#zw&Wp|YJzUQDXr9u=pX1n$-+k&1tqfMSdmTc>RR#A*GSk88VHFQ4R)9q;N z^WwRr`a+`>GaWc4Zy%sbWpmkcxZeczc9AMmT#M+ZrSO0-GYa^0)xPK_Jb+}*O9(0i zTN*U@NO*pnG?nunmNK)&|LtL?YtJ{GTOEE(&yYs&j?uY(M_tcbG_RB~%=NwgG+*5I$|gwCjpPn6$yBrNWX9DORRE z>!r%GC!=Uk+izoh{o(LjdUvpwD0qAD@9Wzt^tc7H9{Zw7HfBhsn~1TK``f-lTME6` z+|-@JQ(DB9NnQtO0RRNl^w}Zo63IkrTIlSt1aM-8BzGgqcu#rP0gc`(y2D=4RP!1B+m5 zrK&{60Y ztw4-oA{)t^#i-drl?8SYD)-;n+*kK0oEuoL+!v}S+;u)J??LBJFc6z=RpdSgu!N&6xG1IeNyK{t`?r@n7{;9jUMpUH z+X*)JDO*#y-J;13faf&zVtRAbf^hf(6o)TB&2|43py7WD(1vTl|Dynj;|mbl8}N}S zuUgp@IUjUDdCOfqw@n>tt+sspA&=CWAGW$I+g~$HV(DJ{Z%}2nG^*qMkKM<)64*Lpz`EHnOfFe{e(m3q+Ri=6f!%uAsn$R`HLrf-c_lU zBmgbt8zWl9nk~!|-p`*eoS3RjNh_bNhV9AfiB@b5%N1)dF9J`&G~< zEQXRGrgkqyl6H3M;RBCsy+0ux3ATq>am)36BXeRG>t>@JOn{(sfT($=G+X#|x2eaDz&){^UPuQ z3*uzW?WYDeHUg!=&kxl09w*upPF4A)sve!I)ui`~^`|)t#C)lC zulb2o@ONEh1%+Ee_zwcn?R~s`uwi9J;iPK_3O1RNGUvL3oFV+qrJU)t@O;M?{lDiK?pv}tdmJCqPJyzz@e~(g zaCYJ^S~5skRQ^&r>$LbT0@Cf+93&Tz>TjF;Yg8*xZS>-!;6nXw1j2hpte;A%K)XUz z+hZr}WMD`kCUN)b{5xWpw7vv+*skSkl5{zqg^2O_`Z~QLvGBq@Rx$!5Y+k;XjQ_1- zslB<~i1xk&N>-xQ0^N}$91)+kfAQ<>wPL6c5}T%ry=&Q^MOPU>Q> zcphm*!*%a+GE%>|-aK0gr$Hdmm6eNGFTI)!jN~K+@}YW)p@Ywbj9N*Ru!BB z0TTX&wcHXB##+yTeUM;s;(EbV3i*6;&%hh6SaoJd+L`W)ahS@5RNi{Pz}Ep5h2CA4 z(*@h8va7}OyNgKbB)u`ud|bV(~kD7ZG6EG`Ewxo`VoQW=LYp zbKfDghYkglet{6ku8QasJ=UFw%HPsT^Bzpcil|NKP3=KebwWn8+Xlhq4D715Fb;JE z(Xv|GUeIxr9@88xJ@a617b;#Wj~ndW!fAD#t}C+^NSSygfPtDx zXqJ(5UH|yJ=g}x*PWqQZ<@M#ph78mJ`T^SbyVi;6nbe4*(wOk06(WhTJ53`AYG7mO z5T1j)l^`@ipN^VwJBSfmsgEKTd+SlYjsl3CnJE6r$3Ja&Ud#)8nmWvZj?dC!c^t*+MOwz3C;Yl=a^JikRb|ajWyqQYG(8;h7)4?vj9897oeoV_nT(~^`-Z2M&Rk;j~U`WHX%G_(i z-UBc~1Pyp$MUb}VI>$mA$rdOQEwk>)1M(Pin|jj1J8$uKwo152DDtsp6wsxs!|vTj zV@pB{5_7O*Pa&?~!mGyTfjTY^JtL+iqI|?nZ4xA0z1PPJEx!c)*0CN>OJMRqZS1eB z473;c@4}DIz>DRPU}7%)7Prw+EvCmw=HYc4wW}HE@$NyyC$-@BHA{4(w#B`uO$4qjs4Lm zlJ2C)t&8MgxB~SN4c$AL;+{QUNG2S*oOnspe3Y2%%?zo06_zoo_n`*-F$?C!p`$RQ zk!{Gbs=QALD*p5MC%m`NTibwsVUnMJdD*<`slvk!@2!mvp*OQ`4wsovBIun0S?<9` ztjyg9@v!yOPee{ipo>UpMG*qdim5elw``RHw3iN5(AjZh|p`F94UL<`SJ9r19bhnkhMuXg0eFJz- z%IUa@+M|O8G`!~T8ARx94E+YtB7auL^<@jPCcWo3;?HQnIK1n*s-*w+hBJ0Jd^K(l zLmn<4kBi!q2ZFvAS0vhM)D{3^)sfagIuVZ$d`DH9n)e>9!*Nv;V9(IEdZ;A=2Ak?7 zWLfgD2d<;GZdX`51$soL=A zVZf-FM5%yv7?W0LDc;qMewgcRYBuSC9?pwc;j)D{9l!AsXbqn8CtiPi?|9>}%lvOG z%sFp1ioJgH(m$ zWKF%#zYT+zs=oAK8)U0YP?BzEO7jVjMcAu2IvR2iE8qy=2MsRaAo{*B~MKo{DLtSd$)bV zh5O3~+$&`nNDfY`E1EO=2#D|NiC~YM;(w>Qq7oZ~K{!lRjFt{8-r!kqlFS&P3m%lf z{y5a~6*jqRx*^z_l`4amoa1h1hJw|-o*Ka!6UDG|uaMIwZ1~rIvG|JWA0%?&k(g1W zAc}GYD=`FjS8+g{xd&ZZ(F-T@rfp|xn^jf+PPS?8^MEC>;(@{nsr$Pl)q1{oaPQTI{2|o#n$2Pdg!i^mh2QY8CXF>J!bSb!O=7H;R-QPEjt;ELG8>*p4;^Oc z_!*-V24uRd^vg*d-ku*F3?#sk7$I+KyT4J@82s#LSFqmhx=kxuR%+9oSxhsmBEI5F z(xxsB5qyhm%gpwFd$0n~G3u^T4gGk?*zq$W&7j+7Hc9xH4J=6czz=r61od_OIWrrp z=h5HAm^-vRX<+Eo+X;;af4|gJ4* z&l)>X3=||@Mi|&5@s*#Lc6oygR$8D#*ciLeQDClcnM!yw5#zQI8e2;K?3wNF2GYKd zT|so&ALZ+k)sYLrSG|M9O6F%WXGP zF_3-6j9aXeE_@q0qD>CeuH;EMUz*a7yHK3JBGLM>J13uuFJFn&X+H6&6PS5ps^`-l z_uUr-T9f)36N6RMxqaQL3i|5Wfr3jrpBIzkowb>#D}C$yEgR=l3qC6#<4(#m35PcO zPFEWl>F%9!;SJ%CZ&M386;JBV-ff&)MC{ZC_=uT)q%phuV^EH0-2dQ8*FC689y@!# z9!5Cydu3rG%M;ovHC4OqoH>3nsnFY$_28Z2i?i zr4x+c@U{rTli6&IojB)>VYdAe-Kz%eE`WlPr1f1l{QmAkej7M$8(n{3)IMmN=A%}t zx}Z>uB(teGZ4%ffBiN%pS+I;SQhYrJDylAefA?_5>&qZnhi2`Fh)eLbBxSElBHXU2 zKiv69ffDhM6(L>uMvP=ZFto~0r*$}mdnhp*!?tj36;QFksHm|qlF-+?SL0XT!@LvT z-0!rxDo%yPcB)xNrW~oKk57wtMC;kQnc~A>2t+F$Y$U92` z@QH`6rDrvSK!SI}IyO7bZ*?ht`uaB=Pj>V7<@wwWrMZ`f+1c*{KDs`q124%B1=|hrfnvhS{8^O*^Y7Gx>d&GZ;yMit? z@2{z=`)OU;Xw*{c;i{CHzh|e=agDsLJHAgnV`WOwFeYC?;o{B=X|$W4L_WwW1omm# zGEe7WPl>N~Lf-SI6+#f;dLh^M8rF^Lb<^9T)V9`UHIGFz zNUhnqI)!mRy>81=RD3e!meHznNu~6gqnt05%7X-DpJ`-(awxeh;a%u3R}();SwE#x zz%d&7hZ!zgg)?1iGCYxwFE5~oka9Eu7rOeF*V~Fmh~d!s#bkACoJEiZQT%N?%aQDJ zr1yMcdSl-vLBrwd%wmq%p3?d8rTM=tYjZBw;|MLz6zulrfQ?Jh;DKYHaUVWj<(OYr zHCB?oh&y=S<2~=R=H(JvKhj$iML2}Yehp5NVAmwBnIe`A-M&5YhC^n?VKUOL2@^Bi zP(1{$Qs;+jW%?`(r=r9EheMM7gOKKB_k~ZR&hO-K{cAyZ{g2A8IQ;H(xZCB-Jhni1 zLH^=|Dx(XJ4(Y=@!9DC!J-90T`H%fI<*+mH=fz8k3%=FXS=Vw)uw+g9hU>|KyW|xN zpm5;W>hR8d6n1*E6wWeW8a#qu4;w(~D@nt$MG7yC&quj5o?Av+kKR(&YiaK>sMw!! zYby8-+Q^V2qXN;7br3VX6gpz=QZ4b55Db;wA2jsM@+A@6h#}y+uhT`-18^9_eIaNv zjFE6SE487chEKM7Z>S?;9@3xr=3*u}U7`H=9kY?uwCz@oA%^sv@*N?iU;9&yZ4I$p z61i|g3AVhfSZ-b;CHm8Y0PlkQ*+E}}8dOgJN+Ey+L?*f(vK(K!{YyKt@VxWMh61(T z`m5k#+=_IYVObp5a779LFYjDLTrKl>SH4uv$iJxTHIdnRPsOi$m@RUXoy4MCDzE-< z#pIPjQ^k)Z(d41csd(K7me%G!D?jRVw8#Qn~^` zbdC?EUw^Q{%@4k?YS}i`yO^uDJHT7c))|FA``aD2D6|BRZMFEx#lkkAE52ikazY@& zc<(}i5IR4Lj!X3R??gVL=?JS6?!L5VvM_rndg-M;j8dpix1Q%{w^VcL(@)*NXIa0i zj=9+&_~naoqmvzczi%lCrqE|n*8ZHr$6BF67t3*VRAR0?h9CHPO6zSVyW+LjryshfdOrDp5vSbG9!obXPt3E~Q6k%*=AKmvxPa60;Gu%9p$ z=P!$}vI%pB4unk$fqMdWR=jB!JE-3cM>q<6u!m z=?9SBaD^NjhHV`Or_;wA{*VJmIISzd`Vx7w7@n&4Mhl#WjEuj1hx*|?E^-n*6hQIf z-m9)I0+0PWJc84&H#h`=SycEZpTyfS(MabQ2Gtw>dj$+S&{ja~VVI*Idn0N|sqITA z4Y`6x`NslZVDh1w9yTn@sM}X9**V60+p}dj1yBS_qqJEbdZYTV{*Mn7FiDK*Wv zFQ<}E8{Ij)f25^NEugGLm<@eXjxv#1iV<;89oYAM#J}{?>l1UYPQ73~t|@7so=a-P zA+;2$vQDiT*e-DB)_0y64Z}ue1hjpZOdtI90*Qhyk^d|qPdYQJ$dn&$F@0Fxp)1E)K)#9Jcgj-SqFzqDXpw&2f+UAm*-7&|2cUU)cYn$DcB$ZWF@~B7DSZ#*7V5D+4Gx7+gLQ z-sIl^>dfO(hVTmF!Ql>0jzhRyCQKtx&|}%OrPPq*gX`8>%#LGE%9c>uo>pzky#2rU zz>Kn7bE#K-{}(RBIEIHueuX$1Z$?khL3ax|2NA7$m1Azi}7XvvS7eJW`G5M9vMVg@+1BXoiA{XidUmYB?l~;hPn?2 z10sjy`iTsTh9|6y%J-)RrFj6)X<7nsnXEOK`bZcf-&@i0(gn9rCa}!9IsWGXkf{)* zB^360hm`N^%{^X!3OHE&OjR6$pJL*RaD(#HUIzzqdJYFeoSBo=iY5AASp~m!g+I6> zLVX`&K;HPt5+#!h(Z*m{iCcxk2WEIttR0Om6cQT{p}Q0!KNQd2Mo?vhVb|Maje~=D zY@LEYHK>v37!;=@q)i1m9O9gvDSos{qhp}o^M;ZD^F+?|aPq<0v5dfyES#)wztgY2 zgo~OcU({RxiV%ywuni1Ia}yOmA4OI{lxrUtT^hpG;=EY1q@;=cCC4n|$aN0z=1CnX5$M ztG{)Fu`o84{L>As=Ny|>`0q@ZGPPFPG2X=Y0N)wj*MfSf+>hT^_mK3-d(cUS1MraSoWFS@MTck!l{`!UZ_Qm8U{x#m6#&8s=ylNC3UG=odD=o5s# zbI>s5FTFhPHebx(S9&1f2_sAf_^h7o|1tE*6X_^0U?O=K4DK%zaUHFm|EK1ALS5qR zP*DLnb@u{|npKD_f5@TCF`J5LQv+p9RI13nIWl(y_;g#+&q><{wPT>W`-BdmMU+KS-Q( zmdt#ZVc&jfIpGh-odg%i^UbR^+ETiXC;m5PzzOeMH;=E^%>%#UKH7t(34gWzcf}nL zZZ_k2F#`#grOM!RX*iWGQ_*U@D1}z#0&7WGJVB^|Oe+{%#Ia>X#nxt^W4u>z53Px~ z!PvVVdfh$7nh0JKFCJd%E?(67A`pUP{~y)FB9c*Za8)jxxUw z{=nf6BL>`<8HGI7W~H$|iW%pi58C(MCjyu}tv{D}dhVIY8pk9Bcb5;uOMc;hI;ZaL zUhPP{LCyot>DqfInZ&pXTvXNjAoyApGl3xRyY2e^Lt@Y%(NH(I}fLz zKPjK5B{6}3Ku0FMfeM#`y~YWq#cO*?i?b76F?8vLdmSE_hY_IxA3hKiZ5<1Y4dllN`@GxE}AD3aGa*1q9a9bd=yKX9f zM|`i>Pg1=9e*!kG;T5i@*l%Xnr<(0puxGOd(0z{+btz1r30%q`V#X`e8!AB&%EEXO zcAQy(@VeHjx8RzlBkTXIeGMQU;gi>HGv#2$>jnec@5_kBuN8IoZpSW|!Bz#zqy%8A z;tPTem=#$TS(W-19}g&GjYh`@S>*hYf?GMxLX&UxYM)CvY8Wch}0TCwEYH)&-C(zN!t@69TQt*_#N z$?yv}WMmN5;l*bF7%@iG#rJ8i_xwe!l{Clmh1tiw!g#Ys#(vny!ng^o=vLO!Ftu@S z{~@BM_yO0pv6p8cXI&$7JWtS3$-G7$s&f#a)f@otHIJD2VC;$MOk0E_M^)cSIqVH+ zkt2`bj)e(XoMT*99&ac06Fz)nyOg}p*RNjEEP9zVBEw~ewNU-*vRJ(8uP(VPR2QUy zMC{EbEM)n?msGK3i+S@)*Hh|9j_>weC?~RQb*FSmD|k zkU@k^GMkpG7)9-jLtzN47_nqr*axFx@ts$UGE@Kki@vTBp4{9kINtM@lE1RHYI z=ziYowePrx1Zn;jYAldg63070y;44R*JZjLGmsQ|MJ%Okx&L{Mx4oLlQlujvmGgw4Os|VjFEa zZ|tmFT_qOYKIQ6x6~7JlGP&#I@Gq@f$6dR#G9?DE|43vRK5O{@^%pdxS-nGAuH1dr zv?A6N3jbup3}MKf#|~udMrbu>Q)v$UGxZ#CQaF1Lnx>qdDS8W;%+TWBcM-QRWFkAp z@2NebPERNCS~c9hRW^0=^OEnyU=YR7H=|-+zOJEMB`z%s`%!kLll{?dT|-<3{w~Qf zUcfdA9fJssWk)FTx-0iRkdaZN|?<&ZNFvk!BRSV;I99Fm%%2843pQZBH z4CKmv*Ew&zjvBHU`M~w_@yCa3zn6Oj4*C+pgv(hrHg30)h~r3Ei&VeL;j9!5v%y16 zy7aXe{ep`u68QVeELI6zN!<9Ivi^G+7{vpwGv)B*u$1@M*9BJI!R(CC4y+<>A>Kr0 zrk8NYWO^`9_fEnp!glX)w z85&u`41B&8Jv)%+t>zmC?PG4gQXQ4=g@gSJe2s01!|G)Jb+ zY7D4-dCY8FcN8K<9bn1CdBv0J{c3MNm7E}U!|T`;-5j#_**nT*&_<&9O2QSbdKDI- z9-uc@@l^b*{ddWDf107oCK=L0wef|+OtndM)+NaV=>BQLpMs*XE~24ePMNy(K&1XK z*?YhEG0ATZUB3M4Kj3pnVQBSNczb&e3(=5EC93RzohkKJE4Lv&Qw3VIPJSOqyY4@8 zW>WxkrJ;6xdlun32hgoVe^H1%4f6sDy`gaM=_35b`ICH%&(WyzkA4NE-K_OptAUwN zDa}p&xClI3jiZz)B1V95!dy0j{qzAQHyw=j#iojt_V#~Y5Ep8X)w|Woo$jjD3qRXN z5UA+JuU}7er;_Jc{)LsEVI|FJEy;wQOmO`klWBW)6kXs_+Q1=xDNI&3=CWKQ=4US# zW}Oq?;X|=@{O4!qQo&UC+8+*-+piVRf>AucqjaYId~SVd_pSaDYKa&rxDVvfz!~+| z|9KcOcK=~N2F06~Fg4EMu*7il5u-SV-31IdE?dcqFIqNCUhCg}D4A`Ptt=)b+mdi| z5teH29GqNWw?BwIUBW1ta>%d(988`G0gJo6nw0|>Xinz$0pY`EV{t0C{Vee=ais0o z39Bs_@t2oAZGG-kvfOZ)_)&xNe?V{j2k1Kec%XM~MYCK3{U-FEoRYI5#oVeh{4;Q% z`b##@&rEif#MlwIiSMzw^Y;HDeS@46g?qAx-!?6a?Nvry1O544X1a!tEEIHz`zI-e zE?yBa&|1I;L7v-O2SF^F)H_GfDQbciA^2oiUtnb-Wrj{uPbiVq5VhT(Tm==0p|sd(QW^7Dol>Fnk3t)cOj(5m2~AAwaa5d5#VeEJj0XpI%0;Pq=WB9 zfT0yfrR*fXscCwsz+l71{U>guhG+3$+~mDROnlMdE0So?QDo3Q7d&2z83HOxJ{aza z_S7P{We65xaliQ~;9Z8tl(W$16u+NI@a@MU^~>kQJw?Qp5Vx*RUFvcxTAVIgZj5oZ zOc*Bb$i64MwF17ako+%@a-(+|R(As=Je`zGeg+Z^{`vmBBDvs8=F5zdMOz+m_EcHx zq3G;)%&Z+ZB=;534CH58hRUZ=By2|3Vnk}$?w3E3(jUIg-Tu-eI zu?R7$fGs8<=tqoRg>ImlBJ(utcHL9IpbLI@vYl<77d~e4r`I*Vy4mc@^D@%Hc*>{O zsl;^G;zP|F>O~O7@j@+2Tux#ehA}v#&VsW9A0|SM(`RnqeiFQCgT#KLB3et34ZGsl z8$&P<5wavWI~)vWKlpGPdrG7QVHQO^uc*YqiRFk(WoQjdo^^cOSO(u*mZ@b+grkL`sR3m;#Ue?e1*e{LWk5b#T6N%b8_;Z^pd^4e07Fezu{E@BAO}PQ^u;~ zD$Mawj?r_8XDuE8yOJOKMPkID8Iht9Dxhu>#e|JO>U{pK!x?thTi&r;G}? zcd*N#dHrjy{x(f^o#+@s|9>Vr zKKCFR{LE@?P;da<&Sf>-vx>uiC7Jhd8L~A3cMuBtY{9)M4CjTnd$zSp#Ac~_bDF*v^dT**@x z{}%hae;C+-GE7rw@gRdH4LTUWPTxMcsFVyHlCmgW%D&?<8K@K@*(P-_oq$9n+3GK| z3Nc>ZHxR=FvtRAU@_S8vl+L<{VqkI*bi>=H^#t!HT2bf;2J3Y-Zj-Yg08%R6Je4A4 zSbF>I@9X`$DMmqmE;%%zC9l^x%+LI(v1{*XDxs0j*E3{Eq~0k03a}RaLbJpl&ZXPi zL1Jjoj%B_QCzJaC#buI9vdKNuSzgYla_yXaf{P(4#B@JmO1^)EkqK9V;D!T!1mV)L z*x_ph6Y~8d{pEJm+Aq81wbSC6Xj&>a<iB4B`9?}Q&V zlDofiZIGsBoB~-j>Te8eG3n5GyU6wUk^X~LI(S#fO`Ybj1xtv{Bi+KIh)V6P)Xy-> z!m*C_@t!n#ZyVW{6!$7*#2%Tt^cjAlgxxbaE0jO_pGlfcx!cfPs9z*tyQ-?MTjQK~ zjE_idUg+d_mWEN>r1)C;kKJjhsG6NZIb=}a((IPgza@e!nS+zPJvQPBf8!li`8Q|M z_Y2>d3UMhGtcGXL7FB3EO_zz6Grdql1Hpc?6iyTJ9bpo}+b<6hdFKk1vnXKYwt;8f z@NM5o_QnowUI-DTbIRD`I^9&3@Bj~F$1(WtU;VkE00#WdQgz0(s8ll=|1jJ_aZdE1 zWz7d;msUBrN2S$Cxj5m_@Y4d7E&KNEn%;+a3a~-Pd6Is4NXZ3UpzV6xjj|3k$U0oo z_x{Q8GVM&UrftV?Kpc=GIW7=lz}<5~zk!AIHT<$ak*shp?Y>wIjsp%{YN>*EC;pvY ze}eA>*UmGCuH&r6lF>;^nv(Hy<7&(^3o z4CeXqgaj|@9GO$td;jrNUPI*cqPJe2|C3X2<)+xl`?V*lyI^>|KD)Ux5Vq>qQ&f!n z{aWk)- zKi@;zemB#o=^-v=gjYg&g0=90QlyY8>wh3?g{1hYAerq~T;r>Y(`S2UU z9T9?IQC%M@Cpn*ec@?@6Ko$K#5NW`HgdCI(+=`HFi}+uhy>(Pn{kt~)C@LsO2+}a5 zfRr>6LrO|Zmvl%-gUk#f-5t^)B_XY}(gV`nFmyBIFhjiC=RDtco%dbmdw%cl{I%DD znOS>%_P*=7@9VlF8kXVs5^GW7Vs%Fp{U#8odN@Hgm=igX;%C9!DaDxmB9_mZ@xl4A z)xsB)3OKf(83*<5h zx3(+VDJ{^Mu1C%TCR8`q%~EE!#!7sQ*Ejym zE2EfXK{nm3sVn@ZXLdEr8il+XD4bl_;?{P&j&u9h4iEZ-TtV9_)LEde#ZLT)VdjS zqj=rHlsb6hw`~$sWwGwop!_1diUfKTZDZsPvIPdSNt}va>*G08&rdcB!(JKWj zDfRc>F%oMjXZ!Ai!MTo_B?vlGx70NVh5X1GJB$j z;QMn;(~-7F2c;QuYQLfBvo)=u0X*fD??xn_>n2ifNyIjW1LCoV5M7-8ovo*{hC0L7 z_7eUn@#`%s#-y91QY4pVO|(gvR4(q<4ZVUF_O&p`=T_-H1>M^cBPYMF&E9*Yr1 zhUsJ3wBA^I0~N$wzGtxYy)mr*{&;RaG*5?PdE%x^x5qkL4{hAPL=v) z{3#rOtC2y|FQ$qEml%96Cj8HU3qR@IS4M{<9!r|19*Td~&(XH!4HnQP! zZOA5ZvmI^DvbDWw18`4Z9NSaqB7j<@R29)EQ9)9wV?yTJjoObGRIy3i$R1v-+LXyt zBv!>YoOak4HYT`!DRv?~CR*hE>PZ&O{MmB0)nwV(rp9{g8WhHghUjELF>+Bie-ej% z%$4Y9*MzBBTM6&yt#3-{Aw{HtW3p z7f|oFd+l`MRL)P;>v;cEzP0C@c1N6wLhXH4`ZYa&<8}IpobJv6?aR+D)CiPsb7A@*};X5+>V(ifj*dQl6 z@x13f!6n^M3-@f97beBpUH^xJF>1GeBSc67ZZaj%wPV-z(d%Z2)8U~aOgezGWESn< zsWO>;K-)jz*s@+}S@N=#jN|3+*SZn*Mx-uUvM~h=!TSEf{fAW?+q~&gVKZC8WNs#l ziDB4%^G2=#y?`{r21o7sV=}IK=yxmO)%Ck`0UZD%(m{V$O6TX8kUltJ^)Y0ZZ82;W z1k2&fc6=2$+`#uEI&G=S%N*$azvOI?zpOcasBaM4 z=$40(t|q7MOfP9D&+r8~Am9RjlBc}aJb1=5RhpUkA4kauN9q@QAS@j%M(GVQY@cvf)rzH~=A-Omu`iemVu#Eic!OcwP5frJ9gS+Pv zjfX_y#kGq~kM`x|2`l{w(8!0`9?xI;0yCY!tDJc|y|aZ!wc@+CxfBh4E=G&925li8 z2$iFs?R?C7Qk_B;HV#)0k-1iFM&6C9GB_Ox*y?FS#d0H8Q{XNfEzNIU+kaT2GDIRv zP)EaTE#nTOM5c|$%zoDKPg)UTL_f7MiCb&UxJ^4rvRhr%@hro+O;JJB=q;;@0O45k zVI8LX6|DTv2I=pszwn-J4=MUfNflzS9|@sguhTX?KW3Kbi^;SpVoIU8xlbszHu_8O z9M|;5oCf(iWBO|nxE%b(^(TuU`i1tJ;4A>VZvDdk*}$DC0c^2`N{-~=S?Q`GH?gMjeu8Zu^{2G^aFwWBUJaKL78_)*BquNwMmgi#IRu14nE! zId4KqQ;C2X{d0sGA8cstyo;> z(;R)F0qmQ@9@R=|enxItto#2u+rj9cN4drw6HAn7g_lW7gO9lf!oT%sYK)o{HvQp2 zlh-6Xd-m82(0{@|Njc`*UIW-U=^}UKK_A{$y9;9APhcE;KR&3Oxpfytha6`AYjSJ( zUnHLYP4ADEton1x=17mjzpbD)@aL9B6AR*TknN`Pa6xM*S-|*IB{E(TisHytgyLWC zJpdVVRw;sL!Rzv^cDd6+7VwEF;d2?z*zm@+kmN?%D|#)iuh{W0Y66OT-1RmbzNpig zt<{jUyy@)6#GtkNz`yOQx}0C5Naz!|#NZ?n@7SB(@Bor4Oi!_Ucm@+4s3oOHGO9dv z-ah+iz0k*QXeo#&AZ7QI=p&BV?Re1TaQkTb-|_+NT1m2{JjRnj6tII(@1u zGVAQlq*e8K?}$CiRpuG+O^apjL1haAhcK7V1EG@69&{F z-DXmdJtQPyLJWK1Xy&~zn>sA&E<5!8*9sI^Z;q_d&6~5~AdqM_8#4iGV0OwGkL+YV zuA`IZG)qc#QU0!Yz41VX z+arBCg7HKVscZBSJM2P`Fv}ROz}HpCk{{F0gT4FiPz2JP$+SzM*8-g)0|1Y)o@=yP z7*9|RBzi=Byg>i$9qr}s@YbU&Cv9%OWk^Q76UBn>2 zW0es~q_(&9LMN@UJFD#OW4CT)?y-L*Ai{SuY5fng$0ahFoq2O@(suK#cH8?wW%#&d z`+#mQYEN*Xz4Ff0xWEV&cLmPv`|I|~Xj6?phB3WHhyqBP@yx5oVE;Z_81d+(D%E>l{<+s&!Gr;k=FxGBUS_K%)+3F%1B zavL}>O{J2?ORS+ZRjYL&UGd_%WO6Np*HqsF*JY!qCNYeRm81pKynD_!$wxc zWqBmDB6>WhdF4_VUR)Ao>$H}ouRSJ!{$#cRTD6xyAGEsL6?`M5{m@y|rPIJ8r{*)# z-OAKs{bxW&ziRG-Y1-J&_y3%;Eyq3l`8xU3_iwW+hoZ%$FPyIC1xAjwcRMgAlYvdy zhH)ghoPhXEegbfu4qtKbX!&1I`=K_0)k5hZS>h;D{HAte=S}|@iHF}8G3t7iw#dT9 z-B#28`n~=SMhVrOJASlvM3NV=e}Ag>6X3}iUt6?1%~Q!u-JO5DGd^m&8kD;e|K|Mz zHAsuPEX#()P``o!%HFDoEU7c7xL?B*X31hY{;2Cq^HC5U6bCH3Ku{lRd8%D1YYHX- zQN5GCP-CyAQH z-c$Zk`S`yG`$w?&aq{3OoTH`UYxMa;w+(Kb-@zMy;^eaN2P|;ekilQ?@2K}`qcO#UNQi1!)sVfo8Ap~DQq&IHFoIoQcAo6j% zTHSL`nL=r9hjCpFZxpkH_p!}FAY$GeqlE5#3X<58+)=JbU1KmB&x%r>3iVOTQEJ5F?s|!QAWYZT8w?-Fo+}s`ITPJOl(i5$U82g7Aqa zOE$7t%>QH(brr9R5Kp^{z!Xi|JW&*2(0A%8j|A_~+ zMQ@Q0avooibh%?#7C}uRIDXWd;-TfY(;r>sN)kgF-gEj?qLjeY^*jiSq(@E+)lWY+ zb*HZ@&`?wbWpA;A#T1Zni~-A1`liek*GbZS#luqAMZzO;W>2NYm7L1>$vu0m0`SB= z-|*h)Dl;3EsVI0}p1x&{or|@SLh#wc*L?XXBKnkV@{_sf_G$o__iEUFY+6r|<7&k) z(Dd9Ci3~DA3Rp{2dv+@wcVHvqR^{s_AB#IioQ%VAI)Y6RrhrZ#<)i;Tfc!(<`mZjJ zBP4^Q`6oz9>VuOFCZ3tQzyj*7o)5PkMYNTY(Ur!WX@Yb0QS+NNbr*Hc;% z3ek_D+ltuYSEKC#M*)6aZ_7}}>=c}>RZ;IUNU))6z0>mBBhQ0(A^_$hGFBPe@Txdz zUM~!vGtkJhRy!=vfC29Ep0ZDMn&{1kw( zs7O+YYHe`0lH&-F1V^jQlxS1KZGp*MV#Bj_30xk+&o#9`ZCjGHl>HCD$dc{cBz)J)o(J)dTc48Ab_$>Sa}R% zS$?KJLFHbmd#&41l9=mLCw-v>JNGJ!1TN0{SoHDZ7_jSlVXHeyiZ{UKe)MxIVpt1O z*IOCpR=_RVrGtkG$09Jt;{gPlE=km2&thmK;%3I$BU73QA5;I!5B=kg{@*W@xc(!I zUTROWz>a-NyBW?@K_-M};?KePuwY7tr|SAbY|rw8`1!~MV*zj@>N5>s{jr7&b>VA+h@cn3z#?lnQk6AVglSg9$o4h8cH?oHFJ&0-^JZbvnYF4e`l z!?Dz0<>|A}AMmnHCX_M3uacyKGx48BlFB1hpPN}8&Cq+|gPDxGKUUmj_YaW35k)4( zT+!>|pCZ4tb6z0=bRc!p!#zUj2zK4|Uh`4N4z>A5?!gtRcUT}m*RYl2%{j|qpDXAM#z52#H3N9r{UOVug14J?;9Tt`&UD~ zQO`^!RU3#xz=5FCry;F~(j?HtqudCBwdxwDG||?l5`zRZR~GE;@`BuJeF4comgz;| zII6<7pkK`QIt4KfzEiT>MK5KrSW<{DmgD{7HO9W~fIs^s0}gp2X~-*#3{I z(NE>6MPdkYR0y}G#%K5C4o1=ssIdnz=9PNSX!ht0yb%%drR{v{3d$VrR?Z87^0*So z38Jr@JKN@yH})*b$@1=e`kz{zWCy*vK^mWWX!mFa*=!-=#g4^zQP7)=S3un1buX@q z!^=V+jTD^Afe{D+)K@l5j_zYMka;BcdY2x_Tt^WXj`-O+7OjVLc#MR?xr?$X)yTe7h4mlPWxriJDbIG3-@Exk-~^EaoFEhk@y|+>iG@zVCgIeQ%Y9j%PpAV=V9a z=}19pIDtleZLcg+wOEavs;gb@m3c3{0aWrh%x^y%(IbK)%q8pTB>fb^Y0=d#(PbIy zJxf-H>X2|>fO!OMZZlnstM2tS(t-+}BuzVOHN z@*V6{OZ}<}UTTNRwGeuM$NSWqIv&LE@a1bH z#}RFg{Q!tLE`3V0Wf8a=2!MXkF)icH4F>dI~EUV zL=o2U|D&zm<*!l96{Qx%fp2D;p9%ckYnIh7JS= zi=79FQ;8uMZ8%KB9m{0pjIMIoX=eD6e>ava2^R^2(JqknplAp#`&ANAa5+)5x#nL6 zL{R1^wHX||eG+u<^1Bc#c2V~k)*taL9>h=sh5A}RaZ~g)s4cuyFglldBwz0}Z@0s5 z5xJ`$(|9yEfE4iZ|EaBqz{*-XqPv2dAjbh>wqcr^Id>zUNrs)w|1>SSBcD@6$oe$T z5wJ6okW4BowSD~ih5*|4{=SA+hhC6TZ)hTVXK(_V(AaAB*x~KPUCE8 zB``tFe?@rI2tIRS2;?LhTz^qYhQ%y#FPMbHH`FDABrLx6(bux{=ES>A$Rweuy9q7q z9m%yY`FVWqbTfQ%gTWOL^#B=UIu3>4aZIcIr{a}3KUCz%D^=5*?fxv`|4*4D-Rr04 z4za*oA8mtFB+@i#Ehp{MM@iMU8N{zWA91vhlUU9Y?OA@Kk?IbS!e#R@xQZ3#HSkWO z$MfydHAQ#k5SWqmd?A1bSD7!zJf=ABOV>d^f0Tg#Azo1piR`+uV3aNtuI&xwZabDL zosT7w5!DP|^GpZ1sf=2@NPK}J6ft9ZY$rq-%Z;%fO8W0_1YS8X*VBFth zEMvRpCb12{7{UVPiIYOM{*n&?>h;KiQk|;QGrV{()G{)c&7wzbPq7E6LH>nu{wG)S z@2Zaf^CSLpGH*|N7ZMW72_1txxGJLzKoc|?viD1t@mlSpZAYvEh6^g>1Sx@@b%+Y@ z%-3L+b9SiZ&e&JMP;j6GoMKf*kWy=x5$b)+Xb7NHJ|T1jQ)VM=p$hN1Be+v)ufF}y(`-o`rvG3BmS`m#&L%kIzYiCo*|B*e+m+gC zSv$T`T=^QZ{h5``BtIxtX0#~Aue)}9Z&-R%8^5;qDVDh4j!z{Ef#p_jcOzR&tGR+2 zGLZlbKvuRhbeE(t$&?ITDSqy8Y^D>>>0>O0<<)rBC7e_;&`&_=;epc1_w-yO-IHSD z3^FsO`WVxzCESPyl;vz{Kx_1(&K6GkP&#=j_1mSyDUtUi?B=((|#vS?V z*Z(xE<*X2ri`#cZ+G>?@4Jel5dkECVcAu8yhuJ9S6KLcI(7GBtsvnmRrmYk1{UVR& zy*2WOQU4W4KqN-BRbpL7rr$idMSUFZkvEcj0MZn5Ko05EDNRfD>BC4s|C?36)yrLf z%+}CdTSePApfH&JkRkZ)Xdd@likgl+4lzrIN0c!WF=zMVKY#hF6!d4$O!;{27=W2;5x5f!Gs~3woct0HjOzcGb~4VrN&%X2?;iOxhUEkjD=V zXPy~+_cZoinGkZ=ey5718ZC(-n)dBESc$~K9BC2V9HEYn)~GoA561Ngw?^r5-QI@``m6%ZS8X=x(O2xHHA2=MVfH>}T99P^ z;?QQ*;Xwz{Uw7J67iyye<9OP@hHjb7p(g& zb;&qQC>K8*UaPjv!CDrpKpNHjMJ?kQ;Il_S;}{T8ko-!7xGw@VKsk)h6)!6{_Oi8C z7kP(qLHBG+8gdB~)$SWkTXg8%BM=u<5b0AyuleIilf49x+t|_#d0uaaYI!b+NtIOu zar!j(wY?{x=Z*C4cPy*9(yepvf#DI z!zqmw1gP53EJD0=iXMD~T}O#T7IE3)NJ#?S&w#-iRdDNuLssUc{f||DdHYGPR{(5eE4_Tkl{L;^ zJd9a?I<>CTscLrBwW*48jX6_c;H+CZ1LU^`adn-KKsxElZ8jx>fG`| zXGtE7a8+_j+w;&j{t*3po&= z!YUI<4_VGm10ezT6&OOW<`C|@U|EI&NCNH2QB}ub*WFO_ciF>Hiazc6F|;D5%>5fc z%*2mpw^pRQ?y`ILg~>%)Vwc(%z9sXB94lvS4NKhnE*aH+jyp*@sV44UckyT~Ac{+k ziulj}>hRKu<^m%KlrFm)+7kejs>u9>Wn>t$xB=_ruVfV;U|OJCj(1(Ebf8gD;=IMo zPBok8@%s$0F%BN}FgJDe;Ue5G%5yvKn>F!+D4^O4A|*4@KbEfLU;sO@-|cwd{!j?! ztoQj6<(EwZi~;P1^2QMe-o0xQTK@+q4x)R%4E7DazMxD(!OjM}+G)l>oJ^{|8J=rc z0XI;91DEY(t>2hg^|pWr{GFFj2=BQ2yM{|~po-1L`gMb2B=nlUW%=Z=t6R8Ti6`Rk zCrSE6FbH#b+q3BVa|Qq&ZVH6^^cfz-NyXps?^U!+kWK8B#&K|P_%^j@<7qm5+j?^K&gVt>bjJi5bwxH$woAThu}pl! zc#3J&@vI8c$mCGp^~|0n{A|#IzYcBFDi!9R&z~58`?fiTkLZkffX`9;UPM%8HO@HX zcY`I3?r{*6yFlKpw=!*<{ix)(5n-HVrsVtUYb0$`t1N) znPWAYEQdZ2Gt(SGS;v!=IieXgonHY%#gNC97-v*#wC?njTFOv&Kr_R~c=T`sP`7Z@gZx-&wx|GY>o) zk)J5h#onNdDo!3A6_%sspRc><-wFG0v3JnEWSGU5x3UUQc3tKi#pzsn4pG5j7jTb>#Jb9* zKK~?^*1AZUmyoYX*_*IA5{vnG@X^enxfZqA{p_mf8a+?;SN3k+S>N1$KXb<65Bj)J zBq&>){7uGZ@o=0M|M7*rhuiVIbGrGL3D->LsH(ZcJOOnX_LIi$oRd$5)j zB;m;iF^8?UhwocV)7;vXOer>nj@^2bG#EZVsj}4y*($04yT8$m|GXD#gQW&}GPMjR z1@_?tv}+13uTtf`F|MvHNf^%o1GqpO!587R>?agNA4YTEw5`P@G(!TR<48u)>igLQ z&yK&rP`$SO#~t-#>?)6n-JSg-@Vft!S1qx*b5cekW)(umEza!1qu_2ermOWfR{QlS zF2p~l9sr<}w}95Gx;*GM(H>*3S@fnk(F_ljkfn5LmHni>$U*(vZM$~1LNFNF8;wX* zOPc-?UA6`lP*La*q=E{ef!RlfG@u{#WaQ&7TU@CeuOV76u=>)yc6aIhi z85osnns$OKP+CFlvlr*od(e~^+5cojsonf{lx&W&F_qVGYvz-E`6Z(jQtr)Tvo`}c zMwgjYs(j+$+a0QdpsB()Za+xV>0{{#Pk!-{cFs8p{4{o-WGlIBCLU1`TzWTTOpG~% z9mN?|xoYo}8a%K2u@q>Wg_`8WZ_n516T6rzB(H%k&yf^6`+zNIY^wHj8bbs_HZPTW z9FBt}3vi~PU)|~;e#x8Hs+_Cp+b(S->nDGnEyurmw$--N*B|CFXYG-;FuTDp_-KZO z_{|zha_u0N|5a90e31eJ-pqttHku}FMMS^RKpf+HH0+V@PfS{ZZ?)K(2F z7Fna)p@%0Ul3QmfiJ7Zo-HTUoX)be^Y;bPFv3xF59?v3j8GUxvnAu=6If)hD3O$hP z0h;Ju0lJrt!&UzNQW{%?S+fNh?OI1D$z;w%PVE$0<}cO5&#$z9SC`!5z63a$Y%&rb zr6go&@;F;9?N&qT&2usrhP&DnJQE#){R9flT9uADUDk!m5djJo7O5s{xY6TYvXn?i`Yb9=@;*rOleQj<5H^JZ+J3AE=3b)JhuyxU3<#DU&%$$C7W%@ zn(JC%xvkq=t-?m@lEfTH$@n1e4g(9ea6yb_`UB38N0MNY;!h`E!yIQFP`MuMV<{|aniZtN#Jw-WJN@uf7KJFj>3gCoWP0!&D>r|sc zm!Cu3EPnC7JcX^VOifdX%A?d|(|6M4f`2CaOB(k?AB19EcsRFS_^1D2R&L#aVq}$N zci-r4>U=ZVpR8EjoOY!Ywf{2L=-1Xc{Cmc2p6c+m8w(B8+kX1Vh$gFG<7m@6L!nA% z(Wy3h!|%OAf1O`u2sll)L(a25&DMK~ez&;wtk4P(bQ(l>ICVGIIW5K~Urv9uF%TT4mXg2sy21M+4duRP`8(;_ ztT=UD6VqX~93h>!eMzM{O)qb#8!cy!Nqc_#G?-?a;LlAPH$oZ=n=MNW>mgloa|d&! zMZ3Ue(`vkvDYuP=b@tStm!{^=23lKu8}VTc-CZz>@%y-BELGpfm9snnQer6#3T>}* ztFazZK{(h!Mu*(mx*$hyntf90&i%g`H+fbxNzkG)J@!XmUaI^ytQ_V%ZmWwb0NzC^ z(aG*p^VQgkLvr6a{H;TsZ~Cj&5CL{JfmT%y8eHXebWuMApAGY-<(cDwRo0YH7UvHz z@C&_Aaj&dZ(Ayj_@X#aN|3!DPJqG3j>r{p|>%(l>vHC))IW{O0u+hiWQWyeZU+UhG6>a%|O~S{VsoMCPSt7?C)_stxg_fhfap|7Bvg0 zTl!TN1 z^5W+T-{8c|HwweTwo}ngYe$0zAB{yCxjaOICi^)}S_h4<*PeI{mG)ovbbf$Y)bYrB zdTdgUG86fn_G*finlz%ju&;e$-Hj z<{6Ii46qm)`;6U{AD#D#Iot^L^)b5WT{%G-g<2vnZaY*&>!m4Plt)4Lk5YkAA1GVFHN59nFv1!ddPbr4sJli z7-cZVhuH(r{IU>8PZNYm1lE%y2;POu;=_WYYMhIo!ip1*IZ-d zds{_$)bzTAKVxAG73Q=%>`SOhV;#B$DvziyCkaGo(h9$Kh`TB4LA8G48 zs!uDAAJtgO=Gl+&L+`_1O)SbEoL6t{R5ra4Mmx85fy}Khv9+ZE=W{u<3)4JjJrPq2 z_Iy|8bWu`=gb=O5iUcZpe6AMvz;&oS&7J0~P2beisY|hF>|COMZU->8U`a;?_5DLT z!;?me)t7Y6ko5G>ZY8}XYM0_U#~zwdtP|W@wG=P$<2SR5Z<6d=O_!)EdK4MbZZr6O zM(6VYtSgU!F9w z#szG3uyj(H)4ZsyqCh|8Ub6@h1b4Xff}P2?dnC@|9xjQDvgo73f>3nmX}UdP+yYei zA9@~U`U@yMak>EiA@PjNIl6r`LlB_n#a_?k5rrZVX-prlFKFWteS5&h3_FAz6xD;H z_%y}zy=U5+7iZic7C6Xvzp8Z3h(Ny!@_I zp$xMZ6`wa3kHbv#MPT1l4@ALn?CG6JNm`goJN5;?3q{8P`X_^O&I+>W$J@`nCRUZ_ zxw}tYjRU@vlx5!f?B2cD8z1EpGKM(_c~z-3egdb}&0ZsJx(6Hr6N5~b?cUlW_upbfSa2INmZcP%y|~26 z$7q^_(4&NYZqb z<18w0XQU`=8GUx3O?o#TZ0d_K_UeUUzVHqx%J%Pi$Bya!$sJf>eR~b%1w;C|`(ir* zUJLN3Blx+Bam0Fr?}G!Hv^>2YeU2uTD3+lc@}U!-?i6urs+xt2T^E#SmZ+aUX5O^p zf@UX$)-G`I7NzCYcDor@Xl)n6=rhI+$Kr8+Gh2YuAt4K`d^werI z%-J*B01_Fzc{T$RTo7C8=xiR`^bo^|`sbe5AK#J5@g%}IoH~Krrce1)3sj`@WMdt7 z3;DMEIEeP8qK1^cbwxjvZ!muF_%&vO+bHp>!-}>>u1HR(T65rHS08fH$Za>U>jKQP zS<3Mz&r|FQ9h>(~(R;~xn5yiaB9WiLu6D&WY)cQsk6mL|vA8_EcYwvKBIDbe0sPlH zxYv2g2LxiFf>ca24)7R#<*$Lj9!giGT$rpRLhLAq_MB`% zD)4X$r>RQ(l4SsFWC3fW0~bc03K0i^32!IF_=Q#P62k=Y*R>W?Nw+W0rQ zzqK^jUgp=eMKx1DOpIq6O<)gdT={K~243gf8>kqp0_OHkE~eDWQfSj%!P?Jv9Ja&H zoGu*a$Oard=Wvx5oM{~)&-ko$nlAcaY?IUdn#xZ`DwAxQB}5vUs65`A)xUHYI-3^X zym%PW7Z)HZ@Kc{}o2Ua|BJL(vj2BSs4@4Mh69@^InzNhJf{Z@1H}`ljND+<7Q4E30zr) z-;y1X_E#xB*(T!g1g1N{&cX7g36}X6SZ}mQz^p?^5W3NQXZ-DX#qa~Z=PDb9{Y;e~v;bEQF$+^}W^2y6MHob36O?)v614=Id$d1Qwn4l-q)ZKw?!A&wa;f$`!s$2j@<$@Te^~L|A}|(5@3W^#;l%6J`y%?Clh8k zQr>c?4R-#^=cYiYO?0qj=Ck1;1oiMDMXf01G5w?qX}{BqzwAyZQY>4yn5Uv=X32$| z{o*H6(HXLTJY>_=GR;kbXceUm@mW$c7wY!WL{7TeU6c&W`KF^U8M?1kfA6|vwFxz; zaf0P)HqV+D|8@sH|KSe)+{xeWpq{As{GztpWg+sCI##H401cu(<_q;=5il#T0!^97|0(G>@LW)=Q3)I4g9D& zZmdIBPidVQsFWFflwA|k7GzBwnbp!c6EB?K5c{?&pb{Boaygg6U-^LTwak?r-HT-s zA(q{8(}(E~O_3#m1VN6cU({%B8IVYVpby~>ec&3_mz^x)=;?Mr@Jt#LNjif+J>f%~ zc#EAQCYJPjIYO(Chfx`nLjMk zH9g<7C(sI3e)|j`4*|jZ$qG=txdD+l=??9$su&ns%9^{&tKKRfuU<#mdO$vB93Q+v z0p?E{@yGmq_p0+nJBE}P)6PeV4ooC)hq?)sb&a~Kjj56~KCINS9bD=zDZF+Z470_1 zKe}|PY{QP3kcn96Oi2;Il}--28i9*H(Fax{u4F5-WH`(53+2L9WW5 zI*quh{=;+TdN-Yg%xrQ=bqX=ah|V~qFJb< z5&c0Xp|^hEU2=u04zrzpojm&i_POb>ZvCMD(#XjOScy2qwYRHy`5C4YY_rS+-U|hsVEu&UKPZz z4dS6Tgx*HD$atNbjaRo&jOUzljrP}}$hRC?QzStIeYqTA)Xpl`KcR?}-OeG&HV#%Q zP@JhBrbWHhQapG8cSyLwHWK0hIS!IwR+PUdg&0d)V$h>&h+B%xen#4u}on@j_$hmI*B$};EPvENgHT|+4|5Dbl&Z1zcaT2 z?mzMJ-;X_p3_jZ5&_0~WPsbbtN=42}*q3=$jxp~Jm7EJoV?u4u1*4TepXJ0RxLdvalYQ8GIhR6Xvq zaG-@dz2=XVY<|u4NMqJi<|kpX$GxxD;*Rf(ge=6d-#e^DIeRbseg-Uh+uuY}>|XXz z6CEDerPIJT8y{Azq=R+x(d{u&-_B`-&nir*+n`ukkx8~$%i_!Wu zkQ494K)IO~lJ#LQ?sa+ru{`z8IYqU6-_7NOP-C6dlOUAyp)-cU0)={H<`sX-&6NDa z{$Zxjak^8injZ1O$(Gi^b&P}-ALkrKcCiLxKBS8EUD+pzE0?V+2&R)Tcj!0HlX=mt zS%Q6(JiV|m^wXy>J51|z)2pztC)-zlpmuG2_xqs47z^uDVEOvXG>Lg$ICBkMf#z9~ z9;SRzCf9S%3>&>(7V_+Ie8DsEQ(2uaJF`BmFIWYByq}C!A|CPHcI|qVuT^s)!Shlv zP=Vs5w!KT6-4^FBUBNdSK{AVNt9ucDBc$(~o90;PI8>}XuS%5%rwHQ%%hC^EFEZKU z3)~cQKBbASTG?}$7cgTuF$|nByHqvju+2{zzz#$vpBJkek)IzQ64xk_{~Xt2Fj(vf z@Kna5wiM+!K^q4Oc6=}aDvSZK-33Ve;gjqyrqK#d8c#F$jM~6K6d8(duZG?^J!hl+ zgB^TdqhsK+5Fh%^zo$2~x_6k`Sq%UjFRnx4UN|L(i3{r`e_orjG5NqrVy8ZIg6i@v z!@%`6;SWBJ({&tZT`ueU4v~qB8@RSHQawLur$1auUnsICc-pu3w@v?8^OxZn4bm}b zi_ol(vH=>UbzzcqZAFgdyVi?CcSIb%SFShJlAdtGkZnCo@ zuj3eXM>Mz0As>r==z%Ff#zNW&(FIa5p5ZD`TPpG%JyfVZnkf2c$Jp_<_d%>U+(+jw zM}d2>1@R}czIF@wK$7|q8IyVvD#ro-;EFvh7Ot*`rs>{^4x_(JO9aKxvBX^QT@qts zq1>RXq|R4V6y~|AZ1EiHXN+|yKwK>*Vc35C{3X(&T&QG z$y`Wc#N{i?6$IcuQO*m!!PkJ{qUQw;LZ*hiYRFu|D>8tj0buAgfTFSw3t>cy5#w`W z=0hSE-(Z4#BbRMytA#@oEgyfVr1&uBty3H_GhVrV?IDe~oyOja;NWSRTlJHmv%2k| z!JXGSug-!F;Z^w(N@cjJ($A)8K5ysn{TU0KN9RhW4|-!n1s~wIz1P zMC~_pCK0f)3>+>-fwG(##3osUES0({`5WJjWVqB%Rjgk;Vc z=aq=s<_hN-%xR&uB-r8B?BEFNT!qJhgNXBRRZ7)jnQqQZzkf62JvGm62ZZ-l2&&n( zH6=7};QBfC?+Tt$?OpN&S`4)Nf%+!;a>zZ|zy^M%`DUsr0JGS&S=j%JOMfFp1mx$- zHWKbVAP(c91j6N{Pc;MG*EiD#TAV~GA=V~9;qC_%?q9{0pwg@K8bJ)wf)uIJML>i|M+B7Kk|5GMgr?G@gY+&% zklv(&5Q+$d-a|`5`ySk9-*eABXT0Bi-+#7aJCre8{EkqZ&@q6B1QSpu3!OO-lwfGIr!`Sb80%J%YG&*2;$lz^qoi> z+J^#`U3BP<&X&VD@nR$8^li-`&mOCuD>t4zLW*#k zM3TVHOyGk*1TXs$LJ}#VRpaJ?N$CSAZ#a>`BK<=`uDCxb<(qEl|50Wvjp= zwTjcTEhEuj_liwpa=|}_#>(lva0eeLTH`bpd$ zAGA1lZzBCqDIF&evX+uQ@<+FlnTll*yWIh!%WAmNlfCt+4^Q5>YDDzAL17CGUcJYe zzj6!>-NwAvmL{s_D;70=uKlcYLW*_tzWAPpu9-3ZIk_>PQ192SVLW$=!wh9MlzJab z=J~=lOEtbAyS5f<8-MU8U*SxT?-MQa--yt{W$`!w?6s5YqDZ8oLeVunH)z!522TQQF z-i+sxLO&%>Ill`8`<23`R)Wc$-{^*bg(a_5s&mq$ONS4!+rk&!&4jUENzvT)0if<5 z2N2}YiTy!+vq!FeS=qB+t}W=$PbzdP0Lp%}Q{A3mSd5^N~zxj#a+8=&9l-l$T3GMBS3eh8$7_ci3! z@6K|aV4G6;Y~9*E46dvPq0QTzPHbcNBX54&J%vsAA}xQ|e2!nQrWvcA^&)lcU_`#X zL8=NZ-*Xb{HWsBDwupH}iw)*%L&;Jb(PO zT50N+eGevnfP>@1Gu~h3V?mPRU(|H|C zE8mIdQe9H^w(5WpM9N>&#R3?St#-ckHRf|G_I?BNWHIlaKUv$K?wg6?mga?+t-GQJ z1D`uaDhba2_URz9QgL)-aUQp3GsImm0nn5=xrsfAqCpp{Ny8H0w|_T6AfSF~({`<$6ZRoD0LjgLn z8r)=A@x*++%Ii074gNZ|jXOH66i_wJW2dltIpezdvvD(l?5o&LcC$=YCFLM*uv^Z> zjVV9okw{>*AneFpm%K8yv=97exuDajQ^b)YwE9k>^nw`M`7HI#>)`DpE-h+mj@!{mRt*m*~j^&X`EO5<~%>;^XZQz=C zqJ>upwBaAn+?m;ywj?>+-t*J1HcPEwH%5m&!%pJqK)gcCl9xqmp5^2HFJ6|K?Ub8p zpg%oQz0CCyJ4_3!iIh&AwQ5S-)F-Rrh&@D_@i@i{y$->Bn_0BtG=GH-&x&Uku|O>P z$c4=~=zw{}yq%Z=fw6zKY}?TE?sKQ&H?#cG{5^Q@vwKi4_uG}_;N@zn)+#L*Yfpr z&d+XSKBoTH)KR(q82-c349&w>aqmfl4bRgstLwJt>raooCVtl1$4lIR9Ed$Sz_wB+ z0?-p=i+Hkvbu|6aA@m?D@nDe4=Glv?_7k~3kkcX_!Cl8@Y8)9OFS7L(n`!>4PZgot zWr699y3&3z0~Ej;?Gr^TO6cnKiT$1>FN{mGGdI_8fp=A5&S`6$9LQibs(XM*5(=Mh z+`d@8p{;vjnJ%T%BO8H1ru22iA)em3ZKv@`(|73 z#>M>HkXvEqq-jKvC^a&~1J)gy>yCSuIbD=ahKTMFfYb$aLIbKo;pYZXgb!(#4B@Qm@$&npK`* zqVZLo`$y2v_WmHq9ooMNiVpT7ro;h{x5`oFERDwlW9{TiX1mQ`YYC9`mi@7eiDhvm z@@IL**;(<4T9%XBshV^udpl1_3YDPYQr|J&wz@lYH1#y_Vv(Gex<{XpL$BoF!O{zA z`kc$ID^n|3UW}=WPeVpttDEY52!bpO>uwT_RT|%&I6zF)Od_AA7K|pj z(?<-|{8W+87x{H`T9vvsTv&3}h$Xi4cH6ylxHIPORrBWN`tQ?|X5*q94HiF3LH#v_ z6Gc{^(h(X_QR4@k=`Nd3mvE5=gO~)E8@O>N{u8}X#NOG8i20!rCBo9+XxdNWQ$=MD z*<_to4nt~p^zRYxwmn0Q0V;Gyt?s9*aO`&)OH z~siM*2v;6-ZSn=wk2FCU|UBZ$(OtxvXjHN7ThOMjZww za@AZ7r3x$vSsexRNAqs=d9bI?D&#)#OrcJw<{wWOa52rhPQKElJdyR5G+v18Y3Hs> z?cqqbSfDF6_)w{!+1X2L8=Jj_Jjc--`jzaR^A_Df2fM~UQMWY6M}t+G@I6Fm(+mxs|xG^6?588 z4X`@Ww>+~NeY640)g|>g-%%lI*VF0NpsCT4S&FyWZ_QQr%A*nOT$+CJ@v^@FU6<(* zt*8#CceYxK!Qg}DwW}NaLiy5XPism?=ng@DrY*zaVCz#kEGAe~Sgwl$$+i_RMGL*X zI~(OX>ubu&6$FLsEGt%RN7t}yB`Qlh?(wCOFiw!WtOqu*7bBsz>3qp0%uqj=0Ot(h{MKnhq;c*77X&pgx`fq;d5e1oy}nf?8PV~W?L@Ue)*PI8wWiv@WYbN zxt#Tx_eDUYqZEyTA>`61ZjR7O5m<`|SdU)+Fq%Kc-ZLKeY1R@zRPuMN^0`itj|j}9 z?4P2o_ac`LR7wnLO_O)?jcb{b#U6+sg5AK*U_?px^qJd948&Xg zbJoM5`;2&wlqRn_f>*#3o(!1T5Tb zw|uN}w`W53SoB9^JNRv}mE{vvanWJv(GNjYx{VE+sKK19pz1vn&49k$9t7EhePX5< zfSS6sv>uJwgM2X)DAWB0mB+}D+AG8?N$XC#G_|Ap+{M}}Z z3rF1!g0~bI%No~aa@@-0z<*Z*`f{IE30>+^c}vf(=Zmhb4-czWx3=08M`uDsUCt7h zcIbf@+oFeX-Ih(M-C6zWuvQRf}-s z%wy~RRY0t(dGvRSS;RAtGu`o+3!UEfq#$S^HYQw7Q;V3LQt{s3r)g}$j{*Vp0%)fY zEnku5dr}13x;4ld^}}T_VE)|;Iy?BiXT~VXzTd&cpzcmT_#PgoL=4N?yTQy!qHNwE z(KQd?^<`{QXzilg*r>T?DnzH;HY+qBgCsAq)-f)(=bDEM4h(;klY^8T{|xiQ0cio^ zA!?=W&pu@U%1sS3S+3ZHjJkEa4X-L=@>~Axkn3{c6x}p3>MuibAcPzD_&R=HU|Cm8 zc~^Q_Ybdf{wIWRu)0WsZVqQ} zKOW(azGClz%rh+Y{8qQO+^lW9BMuaU)Q_Gzow0##cbm#8IQ|bFl1ElwzP@Nv5YPaYak>?jS1Ly|-HL^0sc#mU2 zS+B~cRtI^^@tuUfvj7IUn744G0Tti5PWnEI&h#37?G!L5`{A-Y@QcymH!@END6l`s z!^*qorP_A=yWyl#Kv8fsnwg?s{dV0<(plT`rcb1JxHT{O^ThneuDRJ!@iW3Y^ud|D zNS#KZhGp-(M|tI@&TETCT}R_L_IIBbtigZmzPZVul3ZPl0h)+A&_wQC!6ujT0k}RO z5b%&D^6St|*=j1KHwIhxf07#O{UFvuI`jH^uivwx7Ypv2A9WV%zF<`13LVZg0g(V} zLuF!6l@;nw>Wu?ZI>z=|G?1BFBZ^^Ix$5-c-XfYTf($Z{CeM7AIS>j_g6Q(1 z!=W6OX&K^Yf*vL~ zP4RkHS?2W}Y&>ieb331L{1tCo&V5?EHQeAbT91-@Syg#-R@Jzsoim)XTb@_wT-{JI za)Q4#4ZHnRlvAtQQa)6ajm~S~Lz>HG4!vbNiQD#6+w18H@Yq*r9J`3X812EE&3&6E z@|SlT8}=@Z}M38%WvcWHDfJ zYG`5Mmg{++n3vpewVwHPf-|Jf>goYEK-#1ZSLq!`(}mlSe0Mbefw^VfBlF+~Rgb0A z;i*M@jl8^%gN#pi4ehaf#rbG+gU};2UmIoF7~9+*mjh`U=YP6u@!Wi#Z~Ip*bow4R z0cqYE!tm4i_%%(lk*R-g6eE+>ZTX4f^OLT*iT>K80^8yG#R2VGQv09L<=~m{j=pYrb<5hk%GAE_m<$=(dk#2p+^!L1vGx9qq_%rWEp3nQ?i0QC> zhRTnW^m8JRn;_wggfbL`?Pf%(i zL`zbI+g2yxtUwaJf1hfVa8IzoisRTexM=P%m9~NP9YUVjEf0JkQJ3_|p3L^=g2GE< zXK|0ZxwT}jWzY;NnBGx;`emkE+iH0b%t(kb`@DKfvwk*);iQ6x6`vDv)6d9N*npJv zZRcHIW+j+~tW=kouQ*~nZ6v$Oild<<(2l~Dw(;036p7bMbTHqSGT16Cr5p?%#B zyqbsygE?MF6x>{& z?3*Tx?ceVNGMHJ#v(|(Fi8Hohb93*cjy*z;K)b`)Q2%54aKf>=wf|kUb&cR;*8Id& z&FH5f*V&I;bsN>cczwLl*gKo6hMUfOdMl|AVN(Fl{)nVc_Z98UM5Z~5}!#Z_bbJ>G`yp;k-(Jct4)-;|g zqCmYT3+=8|Bp2SCvgC7XqUFk2cT{z{8+EwDlJf`aDp=T+dl;dzhDJ>3zklN-&ED~s zqoQ0AlfU87FeIewDMjYpaU6J7Sv@_S+cO-&JbP`c*6HrB{*Z0hJata#CYM<<7yZ?8 z1@R5&DCMAY?xKrS-_ai$R?c5ovUq8~Np#T#3SivUt$&_P#lW*^_|LOx^3Stre5_ah zFPN)(YCqj>60*tANZI{)qdM-jsM7(1TaOfoE7*po{01*DNEnmNXqP-V{HDM&{b6k0 zWM9>ZmqJbKad%-FyIufk`bgko^H(u5Y_#r}N$%hudNE1#`#plp_3Vo3WbpNLkXC}x zDmDY@oU5uX+-Z_P$>hhl-a}-EPcYioGNqrs*P)Dz%1MQ`bBn3qHIdO)9DdRS4qrjn z^ADYp7O;A(XvK3}vI!fBjDGv}%0*(9ePyNwrHh)BA1=g%*=F!D3Dfx%bNZ%%&~Lf4 z6rUkt$D@npb_$+Sdt9d_l=4W$VKbmA7*@Qzo(mcUg)7M;r1>hRZ-0jW0g6-Rx(4EK+NnB1{w_7?Bt zR7UP2*dZ#f5}VFe`*n+H<}GnMpr+U|K8;%YvU@)ppIPRxuWUg#Puh<=3v&OmCu~N| z^sCLtLH679FcLD^YnVP<&yS0#l+HMvy!vgbsqT)YQ+fyG;OY*KUT9pvX+E0SZKCy5ADM zlE97>v9sbscpW~mOtdYZo$B^o#wj0KwS`Q0NOSkN1CTK0CR|b+|G06FaO7A$XaSHf zydSokVzPQp-|l8=o9edZ12jzB1s6apSSRI%7Sb}AAi#{>oXSUE11#v<**A+Dub68A ze$UwGPJ+iQdAmHhzzJgqQp-R{Q;ge>Mz?mxv|fq+>&DN`_rn@0iU)m1-VPw>{)>se zXX+BC+^ILqbh_;UB8GwQhJX|kM&z$Y(}|#LVx^|E^~|>^EuyW|fams$qg8g3wdLxP zKR1M}kDgXd4JG{(!2-q$K1L+R*!;FzSZZLZN7J_l`@Sea1G?Ri(7qkjHY#Ik!1z03 z;G>{sdVizVE8%pYT_v>PFILsi8NC4Ag!{7PnzQjM5v;6zp!JSIhYWO;TL8xT(cr_AchpC z=91SE_>}7T$418_lN`1Eo?wOmJ3l$(c+N$O4eNW`7vp`D6?}b*f3N7x#TRG$Do{y5 zy0p_t@&qThbBBw^pC*JI&w&taDwk+nC>*iHD5!I@ex9mE!@}i;j3 z3;{i$K6#IxZutxtSdg#+N4}HI<=@55jFZ*MRb;1{%fAy|8&$xQrHy|Q&_nNivySca z@hLWH^7C+a;5C?eA6#fy-8X%*JiG}`MgF?`Ls_1URjpOdf+rEaEp?P>Hr*#-3)WJc z6YTMWD4bWA-Y?g3@W+H={aO2(LlaReW0Rjs_`-^?%9%0;zaHPgjxdj1YQgRhUER7* zFq)^Ap5iEGdko5_uSi=UobrG^(@qspm&J_3o-^_Pt<~s*hZ+D!Zc!v`lj`|=!uzi~ zeMD319=r74WgRKOZgMt%F`G!US(YPSKtj-ITxA=+R8Y{rSOGdXa+i+^as?m-hWl{= zBMn9pZi~Skx2IzUykk{a^X~ATv$P&k#quHn3~S=dYsd5?f$N*aK#O$c z{|UKr(+5s|u3s#j*=qG98~D{lKa*WVE#-yV(zXhBHWD8z{=65E8np!A@7hX<^#zMZ z``O#1O|O;jKL4?{Q^M-sWyq=Vsbr`_;^!N}wki_j;%I?;sYFJR$bG!5%1G0Jikr9(C3sl=1XCXYe zc6=Y%)md!Y$!ynlJyM*W-3U)E9jgPAVcXTaLF+n^38N37`Ecp!_q`UYM>m1kJcEgM zML#b2_)1-u+PNLMJ_tS=DUD=wZh6?M7fj}2Ti(@ZsvB0Z(vfnkIrOZ4FF*2YD`@^* zKlT$g647;+8jH9eYy<&P^NzV86C*rmmN{7_qjlq@TZ7_a(tMq;M7gwV7)oY(QZ-Gx|++?}c$Zt)5vY|6QAEuU^Z z{-)EeSpKYTM!Kr?8)1;Q`e&+t;MUY2V(F{Bedj@vc<2iArvC2~&p@vaSinK**dYRp-5^^mfrsvm-=>3n1E|Hkfh>aQ`{2e!r6(l8t)&|$l$INC^tfXpIpC9`FW}}+FCN)R%W1@m z6Q1QN`w(9Kn_VbCw=iR4lHAm-a zP<$ewod@6i?tc_zkE8+;aq#sR;jfGm&f8s-Ez`&unxtl2j_8boMkCH-YHs_$~!LN=K*I_8(X>YplAN{e`wwUPiH4kWUiP?+DmYLEy%v4KQSnZp| zU%|AnfUO7eckS^ZahqHp_jp^g}Vf6CJS z!~VZTL)-N!R_6r>PwDU-2=ez`&;POO#+vw-?TGE%c4P(kpH3#H?PDRx9a?q`c zTPHS(D$&*-rW$x6CxBV&4Ov5T5l67KQ1Q9%$eS}oaz_DGBZ#H15rV%P>M)%!NvCG+ z?aa_pmM+^K9~cd++?Jz~#B_G0MWon9!CEgWNyFE_XOLL{uB-4D&p=GBJ93Q8WLT`6 z(W!2C1oC>PsV{N`Z$l?hwICe^qFvA6YgT{=67CRjAn#NcXCpd;BVQ;t%Qz`H#-~fu@GM z$?nm$XjiE4-Hv)t6RL4%wT*?wRr z-;_;bqNi)#Qn7LQFPH86cEQM#PE)s|(6->Wt2(d#RBP2L8lwDUJq7)y`CBP=82y^z z{!HPV;LH1;H%=~(`dg(8tw)P2Nqd_@t+!|2uICOjndr0hUx8}6^on}Lt1Cv`>DoPk^e9@O;h@O6^Qrq_#i*d?9` z*Xg_76gat%_3_dNj)h&Ym3a2UC4K9yu|!Ktl#wgVviLn0%r#RgDa-kf)t~YA2S))F zlDlC@@w(<>uv|*x{5Y6b4uC;^0aVf&LBVuufjUg3Pq*1;?dE;$BBN?Z&7wntz+*K) zdgUS6>CMkz4zoyUBtbt#Kkqld>M5hUxR@Lz-+m)~weV#Wx`MRx6v&8tt$@=$&Z9oX z7$erEH3bU)%!g{1BQ;+Yo@;j_9nQx?^uv!nZ~S34UTdc(FN`|oymLJ_HN0KH!0w=D z9CjVzNC)yi(p}-JnE`y~wC#z(YvvmQH8Wl9pZ=~@s;#{LyHYKtmUEp%hfCVad%ndM zEjDzd@*II)=Dp;5`UQ{tR)f2w0~k*L2A4$DNt|*}AG)sHxMPw6YQuEosuS;2Mp3)P z?!Dd}m5&Fttor7N!_7wLP zKn@qX@fZOWB@Reb%oF_tGHeLr866j#g0LJQG)O&>G5s!c;Ir9fIWmU}CQ+o&ivgEe z?vb|Y4QKLVq8IpxCA4Z|_kx>ca@Bbl@v=mQtdBZh5p{7MJb>as7ORaDw=uG*%d*=8 zS!#^U4Zp4g=alBQf)7^ora}yYti=Zy9RkB}1?b6le8k9Apv>L5^kBdxcWuYvbSW9b6WUavt8Pwb?}atvqp z4hHCZrW>b>2y%E01y?sK2F(wwHl;As4xkwNDybZ_KPb00C7oheziu_Ik=$DC-S9fC zZvBJ3{XjsL^c!!7yrX@#a4uOuF`6VVa-e+1WH&u6od=7cFm_sDK5;CJj5jE%tbu%a zY#(S>?YfkT)GlxFa9Smbpk=1d7zfeSUzb|_eR--R%`5Z10)z?#3Tmv~w3N=cbvTd} z9Jn(NlJ4BNZyq^x>0*MDkg6jRpjj_g!yf)VrsO3?>A zbY_hf$*Xd9@u_w*^HyOVjX%PK4A37ow81xJz4-;YDId|R0%f+};y^8;3Z$C+-E9jIkk7V($CNkZ+9D4#32WAOHj@wwmV; z`a;|g_bb7?G{QxSseQM!-+SjAe*xkEu<*_}R<}S>COb<7HZDcGeKwF5%J*_`M+dKS zlz)eU;YsXxyqb!6bQ9G{g&ZyV9VkzYn8#J+n6LP{2V?@(rs(=)4qqg1EZ&-3`cm$c zr>!Fg@ZW9ace$H~QX1fgXv}XJ1tGg~!7JC#UgipEKkDp!b^X%G!!!*aW%WJ_Hioa% z8rM{}x1%4Ydgd~(c2aj4T)3eXI1nv>VL```;?qF*D3AtrC@?Tg$pwDH8LwyCsX0co zY-I)?NkH0Y6I)>v}xv zz7gHQT7&CsioDKLle0<0=(Hpm98xjb5 z%lovI>y_l!PK2;m;ZbC$SIuQNfgkp7PwuNuRcZ(bxTd@U_U(OOtK*zXfamf|!LU)-tk+S^ByK$=8bYYF{(J^M0} zQ9^RsVynL@^N%(kXP`b-@=9rxWpXMvCGqw2-Yz#s3j;J+>Jdkwv0D5`e(FFRzp6(j zY%?Sw&0tPa@+AM`W?D{)hUK-MgM`=29s|hDsFMTbT4{o9?Rm(+f;`_`M_E3L{`>jg zh(pI|)t9Walvz+5raYbF-l$$tSm_KV^eh)T8zjdtR;k_U9ng3<%e7hfiutQWk6tY0 zD_!HWhHuk=xKrz=l~aPZfYm$pYbH&?b&=9%j$(r-IOPLZMv)Th`0N6fLy{k{ID(>n@WytY*Xz}ebdQpP2==Xleb*Y0X z)y;6X)l}jZ+MG}K6D@5-9M9GGfSEtxjTL-%`C2*hQrCH6K;TK)Ab*_ON{#>SwZo0Z zx}6BivxDcJlGbCb?J`Jivtz-MNuY1zCiEu|OEO)kLNrExGXZ+o*aFy&+Il}WvUnJq zuP7`7!ABxB$IgE!jqtW&p>IDuQ{M0gs1N`Nqbh=iC2!{)B7pP$jliA4z48p9VWti} zC!U`>d}jc%yDP52+xJ{>16o;fXlfK_%1jURY@R!YHyNH2{$e%m9G&tXxHM#)zpcZ4 zk2TxRNsYfmjQ)R%@(Y&U)$bHyJe#6F7^#1XGbpN?Pf_!XdbWGw$$_iF9Fa?~{M>)2 zEWdlerIGZ#>{$XK`~^KUYPChUM&ygm7Z^Nlk7p~Oo}seTKVq-5jx{YD;(`c^lZ5X9 z8D#0CT4k(kjqm~mY9zOYM8#HO@J%dxV3)Tw2?FAdQ%tS0?W(roK;YV#%23fzyM4Tk zjc8bK?J*lOftr~XP4z5A_X#)TG0hESGVaGCcSImrZ1+UCF)O~s7ghBtmq!cuoZUm;q`hvmI`P||*mNk`PQ_F<652MO zA504Pk%>$+2-qA-12_;P(t!i-+QIKmJe?5{2GE3h3YMDpS-ZGSO;YCGU8b2u^GM7e zb3U-TzR8>2+5RBC(*BEvd1B2wog%FVtlKddiAJwf+rxb>EOkM@d44@bc-Aoi0D*4)vlM(mA0BogfA?TvJ;z~h`TIMC!`ajA_}j+cg!s>= zX%rhHi3f|iP7N^$v+TwZ#2MWbEQ3J_myQMXc_XsKsRq_~fq=#pT%nNJD~-l0o2aZF6m6V=r#Sda+dRN%r&Fbr>r*9VwbxwR zg_n*qgZSfmT?(^q|B*9g%}+Dz?bb6TsK{Sti?5t%>JRA=UT2rWYH-kdNi*)^Mo+_B zqzyuslugRA;yg|T=~@KaU2=uIM<=K+6CHiiUHc`-sJFfb7hnPjA*r(lMT-EXJI$rO z(Pn^nPPx3UfA2~eum|tl5K;-m7NS}NZyZP0$u(0klk96nM=Dgrbv~vS3wl9+-C%)H zITdPNnO8^&tr1&pZXv24D1MWD8yg)s-~&WgtCKstX2vcas`K)0n&foYt(GWxi%g>VtvSfie`_ zGJI*>dc%-?P3b+bbSxkd{7zJb&SmrEPb6G-%p#Yl2K_x7 zXkJ#LaWJ9*pW_k4j7CC{k5O5zXUvGZKRLrL#DRRAj-kb>o7qwv|c@%{8s^@&kr z-;2$pqrge(uQ|W$;MczYGMeO6trI3uc5Q5-$KYw`?$EqnvQP|yF@fL{F z`t$St^%tLKiY)q{Vj=_0jun_l6H#ABIP=1e879c>pwJ=CLq%n)&PPKzYSQ#&Win)B zU2pCJjTeC_jg(~Ow_t|anXlvs9*ty0rtIaF%d94NqocfSJ2{27N3&y%+PG3CjM<|V z$q@K>M!eqX9fEC?X=XS>sZ2#FEZ+Qc(z|z`nLB7YKJH=k9a*{eUa>4I!!D;qCd&}> zxT~y_KSacCi^$Osu*J2Q9T`Sh@SZXwip&oGorxZ?%xACC#mDnRxHC_~5gRGc9vKk? z#iwP0&dT`cV?)BB@SvR1!EEGo&>*$j!5JqooHE@682dj5x~ljx5Vh2O~^7$4>V51Mw#Cz`~iD!A9h_npn@$^PBYDH zB1+|wBDKf+9MVBB{oZhVswPpxM8hYtE2-qQd&3Hlico}Ya|Y~mHZ(`v4iCf*7H13T zfHruL_#7a<6qgCQ(Q%EL7LfA|#uupIhxFXKyarpD?5vxEw9Hm>0b=$u!2bR@APm5{l`a|O!3AM-Qdn9cjypQZ*?HR}oP(APk_C5AfWIg*<6`Y1Tc zY{|>uVX+YtdoejJ+0d1{An6J|55m(N_I{#tva}rJ#CTN11m>bLQ_8v$wZ}T|H5DM# z+g5hjgycPS`+G?{TxV`73eJvC2m?4q<7F69*V4{^$M&8UjQg{vxw1c(eKLLdHPUd>?-^Zf4aQ(&kbB}Ne z><%9QHr!2Bfc5IGHmnbo7EYQ?9u#?lj0iX0_t)1op8)2pY4K^bD}-kc{=>0Rkpt;{ z&&O4%GXDPA|NZO!p8bgBBSr60>>}%3L6n9@rsfm zVPsZSu`DI-0vR{?BQ`b(x_7wFmoX5IOrhVmB(P}^VQjJcZ!JY?!%sGkT~|oV$eBF| zB?64@Au^{@d^^Em1nw0*Ll;vyGH)!KR2z4Fl#GV>SR{>9cFY^YyL2oxw13t2$dyYQ z$D`{xOMA|20qhASoMy&=#$PoC?^DK-HaZ}mBTEvC`xk>8-5uMWT<(#2W&^*j>;&4 zWI3jS828Rj z!P>GsWF?QBm^pn^nCS9#8b_sI$;+{~uKjp9JJ`XQV`8|kY0TmgcbkR7xQhv^Qm@S{ ziEg4kL4hvrt+xttoIb|#)or(Bv|c;V6?Xb~9Hf|NF0^we5}*imghD|eDNL3Ivm-eN zz3ZL(z(NT`O58GRDPeJaeWGF~*ji_n_8+H6bLoNa_og}*=M2#19N?77SQ{`-_$G@x zHx|Qw7|t_!zkZDJt8(T@Q257%{4bX$5OBvvHr3B44o@{FhxI2f6*bQPnqZ20{3mPo ze_q2cuVefk0eRg0-X8(1H-3>}Nz~D&v)E+bEKLPx3#bcbRm(b~{n|PdM+bcs`$%1s z5Gv!c%#0Iv-8)NVP)*koF~E0v-C%z(UWyR6>&tW{QjM_J6H%OvEDct-PVf|y+D~Ki z+Qu+TwME!XtSY8JA>oritA}65qu71UZQ$htCD(G2*;>+)-apm6LB%|jb8~H64jQX# z+bLtxc-#|ktQx=$rV#E7HBYG8Q&Nd3THTXDCGb~8`Cwo>JprhWOg@i^5Pxw9&q`oF zF4*YUcBPKeAbd+)n(et&`Uh-^Krit_g@1G)z(hM^Z)bFtViyxSr$_R$_Nr=4E8Tw` z{XhFui3jUIjZQLvgy;$9TJ$8;d5}=q8DFj#{O?`tzg0bb@FQWiPiOKEfvhfoblEX{ zXh=(}t%A~?E~jL&Q{rHzQ@+5)94KD%aAM?{v~XGAO*<9LwuYcat{lCG`y3l+FrdT- zu|V4tQ?NSzIaTd+B}3qByNe42o(NHF7+I>L6obEh(ixEXa8^r^jCOUkr~L^%ig~}s zJ53Z9I+(2_W9sMm^C4k1gRINs`n&frq?q5tFPudlb#;nzWKv$ZLL)gbj;b%_6ym;k za}td-FQwSzZliC%q2b!rk%DSk&Ikv0Y00MDthEg>bP1vjq-UEa^iV7!lG4pIv1ePw%0M{0X<2X5M4)EXBD))1=BoE{mxD4dOvP?uB z>jZKoVik$Is&J?{MwPC+VCX?^J`8Ri!u?cmb$sAEdE$5TmzQMPuU@JeZw2cTHs!OE zV8A{cki5j6Mj17*sR&1qhuFT=?ugn#_`JrHT$5lMq^U^LSCRY^N2$@KSE_Rr7gzkMP9r{8=K z@Vz9>7ty+QGL&@d8KL`OBafbPu(?WWx*Fr%gn(MYfR>T6Wtm(GspL*&L5^(`h**l7 z-{LZ~fpuX|Gl5@nwVN*;WaMs(xy(a`&yiQ~BVEz_0>gGH8<+l9^zjRJyq+}Nyut!+ zG8r1jdG%>+_4miu%-*r(jFi9gcy^-X{;gP1{X=xnC z-c@!;ZbqcHN+se!o(`{Z_q}V!${HMmG7aKc9Y}6@i@XZET&ladqCx$eTS?CxW~PfZuYYU-XUsPYv_mZ>4`LvPa>pnja{7!M$Qa2A`Y?K&cGOK~s#V z?9Os6Y;62SW@aiBQ;E0v{56BRKwZEYy)yNuA!= z_T@{>+v0vXt~@#0wfjhv!&0&4X;d2deVB)_*tAfBTpJ z{~gW_xwRh(T0B#~-3`dO<2Y^ppi!;igK|5cz%7dIz?U5+@8 zk3+R_F3wJ6Cn%qvb%aKUoRnNl>^l!4c0$Bj?CAw;+M_#3dTO@AmMx$xCC3S$ai2g& zIJZHM-YurnawuRH+sl0|MDTCcI+UF5l@& zH7{X|pgkM=lf-&!F#DWg|6kV7ztxwf;q}}92y}Ibi#(=mj0Vg1-J}_sx$ar1I{eh?fvBo1>m62gHO@9Y7&ps}NVk#C~SvvTxj%ay6lP(V5j=4KZZ zi}E4rQcu&3dJLn7n?43LH^PVFlYk@?DluC=D`n()(tI)$ooO7;{`A>*H|uw4tXK0` zqF68B9My+zUyds%=45BQH1_)ew{uAgXX5H^fuDxNYn`%K@~m|oMJ8?d$N~wI%bd0{ zBVukK?Ddd;Wbc5W!y|99 z{@>5){&n_XYv`E;Hj}sqF))9eEzg5}rKIlLx#Uwkb$5Z0=haO>ZaDQlhLpo5jYtFk zWPF&@Fg8lXHoDcH0f?H+JLW|17RZw^6405KLG&R$Ro9siL%v||?Glg)36!1DF$e?u zJ8W{f=Ne+jCos&}dRVW!VGrRZls0g?i#R}tUGZVSZ<2@m9E_)t@7u1?`-Q!aw{uTJ zpuP@RDDtMMDx0Rn?akgYwY+yB4$%z&5}XKDX77p}+K9_gc`Wq_t^+E(Ex)H6k2Gb4 z0&c78N3F6v4W_;woXt?kN(U#0Yo1)Q{6W;Wh7ysS-k^9EbMOD~B>fMQ(!aMk8!{gt zvJ%*7!3W*~mGUO*Mu5 zPi7zeB1u=ERgU<0GZ_N7Y?c2jv=2kdgCqoB{zqtETNn(_>bf8-B)G%#Kybz58J(yk zVL{PF1>d2ejMDB>?~nc8M)pZRS$xkW^?w!Fr>i}MqsRak$+>jbLD=Zt{qu?XZ?*P+ zuF(-H;Ep0YxLACs>ZH!{$~I|6DdnzSKzI@p)`2@N0h3Q0i4o}1N+;q0D`P9rvL23( z%YnZG*(J6yhNay7igqftdEsO(LE3nE6KTZuom3SZAi;~I;YM$RDVfhSb8|jKB`{dT zGq=kyC$1||HL6iIt3`h&54v)tOUT6?6{B`ZvpN2Kn)&dB!88HG3RZj+zwdCE$u^5~ zR8A%g!ZT}fnQ?V!XEam&1(04Y!8@xAq8}goVZPcDiCGBMhGPa~6#Ud6v+4TL(Z=#PsT0sIkkfq&$yQSxAV`C@sTHmQTSKN<#8ju8m zso5z%L-0mxrD9$UN80TVwsX}FP;b0G$KTlP6htBe{$DTdN4>0?O7c#Cxqm2W{#c>t zCb0=`7sY#PK4xV^>=#w_;AaK~wvYBysiZM0Nn7H12O?6d`VJG0`S{@5-BY3X^7|D-9o)!hvdCnwl$>k@1zQe7|0 zeihPgeAg-y&we@e9XkmOapMC-_+~&RFFGd4isQSsN}xD|)jf@0(p6r`gkB0`p;|il z^NHCqkifIt zj;nbhrL02Lt9+PCrJMxj5>KA0D|gpg6BQ!lG5!$>bTUZP)wuUcmAP&Noon`wC=y5z z5Jgh;G(B`Ws)Q#U@cfK$of#OdWWDEM(_zgW5DO5>ekn)fcz3Ddf&P2nD;GQ`C^~zX zgexqlrB+QQMRoopkwgjrSj9~ve2)5)5H;8GVB<3SRV}@w&Yog(5qtBI9P|4tCVG-> z3aNlmZ}qa5$qO5u^w7w)<1p)FnnI3r50S9{P5u1OQRDoY1}^583Ka`bTq*svN5&v! zGfbzZEQTrig+c?VB-T1sA6PSyLLnyJX?i)GsVeS1yO@gm1pGl4Se6KeV<$sv8I@85 za_z(khSsA zVnUQu9{>1EK_~m{B5OKCy;)qi0^Q6~!Xc{w1h!C7l2_!BC^<(b*um7CqtZYggk0d& zaKi%&p0r`(@>uy24&c9bd+3pD{*GaqdZoLOMpaSZ6x?`>9qQ+HaqE4U+FtbI06>Ox z4~TFNZ~lLs#{kTQ=L$+*gn0*}46NfwAbdgfbS4h|u)?s){Aa^I_MN#QcCU-m8E%l?={UvAS zojoOf;r|{}#%0nO$B)B;y?mNw>D|ZQVoMWlGC?oCl?h3G zys}XlGJHqocI`jA%OqEj`US5s@V(M0ztFRh8Mn1i*BzE=B>&59#W5@Dp z?hH=g?hIOHn3>a-+|<9ue>whQ&pV6n!Y}{+UmvPyABwt70OXlvvyE63(8nx-pBGq$ z^5qvc3JCiAWc}Aa{y+Zq#hypEgrf|B4Ht<*8-xeHdLN%&aJ%fPa6x$DQlQVUOgk%+ zqw{_iyWMp$&x%qxGH|T#D6yIHOgWoTiPU&EXKYL0c3mIyvh4DsvNQ}!ye<3z7Nl{a z4T}oq`VqUn)9dr%G%xVw{h6?ZAvwK=9O(R5vMeP@TVTz0TdeVmfOet#xqiOB0tm6} zLd-pD^;qZskE*wDi24t@MnM!*QW20`lx{&f76hav1*Ao~rE6J0K#-I!VMzh$?p;NY zl32PMm+n|#7w(te^Stl9_fOcE&&-@N=Nwt1llc77wcZqMfvsm|c!xU?e9bGXgs`Jm z5XS;ksg}v1oP?uYKH+^eXlGFppIOW$F=;@8D$LG7?I@TSvZ<|N#v*wFIFpxOD$q)u zMhTp-hzaZbQE&ShGB4cNS1v|yvb);xXfX{*AFz_Z5yx<#vY!p1$$z z8z>l07@|$I3;_(ncEvr|CR=StCx63Qy#S>{VZVM;muhNrGjwHV_Z;j&D{{D>LE`i> z2R1ta%6mgA(rmCFxF+oKPx!qhwXGli8THJsEKkkJ4Y=!7ROx&_NY`u8&X4r3TnQ1; zw5$JQsm-}I=c%RIN}!a>D=BEb0N`xB?llL^EWQF_B0OM_L#uicmRjh39k#*w?*bF1 z-<&_(g|Zv>;?+*WLWL*bgD%D@1YqOZ(O8|NZw0XvPdR{<{X(*CWnj7{unxI5MTk zoH)rd5}TYQ`Nb+jls%Rc?uv%6!C9w~4=$!cYH~s=wY_BD+dii-j@>$9lDN3T^(5gk zjL&idkZpgIo{~+_qSE`)0$~RWKR?9-^;juNl1zWdhnMhWQ&=Pw%k>DdI?9@`K3W^n zw=mh73bhDMRTSlX{dD!N6pM~zeYHM8q90N0-B7oa%@o@>a-7cBf{wddo7hn zn-fUl#2+MlOJLfe5~ho+Z1CWC-T99!H%gM5f}8<+_r-VdhOsY&P(ZM)MENHtHc;h) z_!Rg=ZZ>&!-^<0WE+1^mor8AIo(c=@Po9qM`F93jF6dxC%2k6N4oWVwPcCS*CFPAf zOf*sRwQVh=VWAxLlG8!ZfH@YMtdwr9ah%ZGP>dvPJ7EJ=X&2@d36w?zj%{JW9roSL zRMX?c@1SIDF4c)aJVHdk;3h-p2$RN*w~n(bmtOU5eY{nU9kneACfa!8890exi+hBk zET7s?zgfRS`rR?ZtX7>5k4pXN{;y&zmm7MJ0MzOa%F>E|qpAnS1O?3hvQT(!@(uAZ zzV)o3)yT~|v)v`ApfXL6|BfO#q%aVSfo_%K&y^ggO?m32Rw3F~R$3H-XZ9-*LZcvW zN0BN->(bvt*EMOi_5oaVfgb}z9(!ZREUD|JHk*0c{WcWCw?pG7x{vjzjjvge;#Sn` z@womBsY*d78GLYGkJ{MkE|M?$cJa2TdG9f#|o}e-}xgcu@dfe@N?t7jr

y9@->1k5nbdtP#^ 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�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

1B?@W3w+|?!%Rvyn`HJ=)Q<|EKFQ+Sz; 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Ú|gS}fih;88Aej@z( z`#HLL3m^4NGETFXAgFp1X~-s1Hf!l`uYTxk_&DjLb!agR1TKhhz(IRh#V1>#d*q~L!~5$tt0z#6Kcec8}C1~W)Fek=L0TQZ%1+zdK z_q+)JvPzpJXH=100N)qY5Zjd>)>ssglSjz|?~am7rW_@U(pa^sXVWh%4Scl55Ggk( zM+Fdz4>{?DpXqe5bX>TKg@{^JT59#Oppvs31mx8Q$WExyK7HVilr&KOOqd;rJ)5(t z^h|kj5!I1elvgok>yuI_d*~o-pzVitLZrBfF<_^-onGOurZj{K3yQwVdCcwSj|dco zlROahPM{c^B2W~rUU0eAdm28Xc4^h?UD{-2I}Ga8QH_ea#fY>sw8T><7N@Y8owBY$ zQXDAOMr~z}UT2gqO^c3bZhCHD0((#<9~B>>mU*azjUL@(S7mJ*d3d2Jj@ehUbEr?v zkqF89u#fD4uvonZJ9^$C5qabPVBE!sGpD6+D?D4&WEOP`sbo|)A#o?A?FVe?Uz5|A z6mjGA#X4y)`GaAOw$-a9W-)eTpovyGT95-`>C~LYb&J;079N*os0X6B6?6F`WE-lZ zj#FPL-bxS5pZ+a9P$5MprWYQ{Q0Q`H-I|5NWr3JbAK#8cvZsxP-H2@u^78ScW=g#- z_l-%Ga=N7?$Ex>c4kw<7JF3@BbdYYQ<*p3P{XFdVFd{WiG1NhAQC#*QdRK>YA< zT3)Qu;l81*rB{|~UKH-j*;LX@XDg|Gww3I0mf_`Sy$xnKIh2o7DIW_5$u*T9rfAz= zPMX3(+*|WJA03{MuqjMJcolpsXU?&0`=?VH)cV;Lne~-#M`js}WYI>VrO6HWHZq`3 z%MaTGBN8J&gq|ZHV#d7_M4W6$ipnbs3{KIa|^zph+JcFT@X4Xc>Ec>wNFmLq_q)9Jfzw;8~ zPxKO>)I{aBD<3v&wJ`;Mp`OC{yD4;Ortlt<((Ho9kfxVZH17NlNU6qW~NP_BUqyEsU(oo1#uqfcFj;C}_)kiBG>1^lAyjh+)f_@KhtU7K zhfvMI^RMbEO=;5mO8+zoTn$Ika3l>!(r_dVN78U4O#=7Rx`1f}NsS<>5hOK&q(+eZ z+u2G}QKG3R(NvWD)t5%&3-9xVM_@fmw{KtE+Rk&k&+iIy@?XEu&z;W`q-;*AU*mjm z`hSD(6E z**|{WEjMYH5{}O_#Rs@zaIN;eIgtl?G)cd=p>TD=kSg6-8zyQZn|)XuP6HRjplW~dSH(2 zjpKV`$SfkSft|dioF~BX*1^p4zhUNk;DwyPR10O$)kW`~re5v8PlUSRXsW!0tkvj1 zIUgDqox?xiU7I~7`MI$$bm?!yr(Yyf&(w$JQ=EnH(0*i7qDLqSCca5bcDX9(%%w?# zitTlA=2erM`1i-Y`w9D-2ll`~$Ho2(&&L+^HSOZ>^M7eaWA65MS!g{8+jh#1UBW5r zWMxT77Gq{Ujk#sz#PC{plhJPJsSY-#)Gd7>E&2ExBYEHR&mq4!l8zha?;LX^A5Gz$ z;D^V!Y~oi?4h9FL%sFPcYAXrZ6U00vWGEa`WJ&qn&P*np(r4fkcL!6%7gBnR9WNv7 ze*DV_-}C%OW^;@jVe-&abf)uzCeg!CO07{sD2tU|TGVv@f$qYjR@G zEoexNhTChny@uPrJ5o)ahBQZ7&5>4fq}3=nQ?&(+lA}>_Gyjj|6*lIGinvAXHqQaEOqDft8QdgSPl_qtiNnL5K zrD?9EX|APBz1A}2exN3GrAb|BQdgSPl_qtixrD5_d#|~BKlNIRCUvDLInk7yXi83| za)T-Oph;b6Qdj?5>PnNY(xj_2=_*aSN|UbA)YWRr$u;HV?=M%^R9a~&tu&QZno6rF zM@~(pm8N-!rg?~_XU^Z63u!8?G?iAGN-IsJl_p)KNmpsoRsUzxRSFBRH5vxW^i_jI zkd2phvsD2TE>}L>Yj2)XcTUko9!)jj43hQn?dKuf$zFpfJ~xLnRznkw3A0Ppo%S;D zoNQWfmb9~sOcbN6fF5r#>VB!*5~gnWhu?}zz5Vf)d*D#3-SbIY*^Hl^A zu{&GUwAmTY^+}oYie3%*=Kbv`^WARdvMt5Z&N`QL)e{{C`R_|T6(v-xnHMhl74K=x z8{2Ft9>c)7$6uJLTZ=k?buM_WlQ2IN0pknN^3q10aDT8Eg=_bBk(R^W|G8sD+dOFO zMt>xO9}U*B_2=QHPI3x&QZEGF>m0&8-P(9Rv0srFLWAUyJR9$+V)Io^IV>MO6&G0F z+&vV{R`n8F-GLOMx-}_mCCz^S`Mq0p;M@^R2yTBz7XW% zCrEe|1QZq1fNr^t{M)}9#*~EJR}=p8Z(Zc!6{BVfeV8g6l(FQnS8n{m2{*iig@fl3 zYLydW`pVFv4i9f31H)5qldy+}EfVm3045w(>;k0t=Bk?L9~`13r<`*#&s^GoLzH&8 ziRC9!<+C1ZPj!&LS@27;(a6P%esQG8bz)rDWRKjb``W!}e5<0j7@Xj~aZyTKC{1Dd zU%h%&_lxsF7bTiWgXu%kihOHQgQ_yRYiH<{i4QM?^5UGti#$*{+To!^6|>iSz+}j{ zTu;>y1t7RX;R#}4dg);@@jqNhBn5gUTs+Hri}@R_|6RLcgjJ8TKa(+eQ zO-rw(2R4}-P!jk44X($ghie0=g9%`?Jy_V}=1t^K?X(z(i9Gp|kGPw|OGuf0L)X4rS?#u z*skOJX)w6XBn6s;NnwOH@~4K07+Sr4F$^5rnpOMO^d;}{PBHb`bAD5+l~%I=CGm`B zVoJ%u#*X0V8)8fQi`W8llph|lv zhG1`}zqyB4YCeV77Pcvv#Q*5>?MCrd5WPyI?NF`e2B$!wSGyQaVHDeYBz`QA96MLJ zv(OD^hw(Qr$>aMlWUT;h>6O|LA1wE;t3z+C5q}95h*xm~oMPTY6tQbRAfW#(ZijU; zvVb0G@Nxkq6cI@mJNPhfZthI9MFKb=A zSBTp_vTI7s-QPWR!cc30PNx5>4#3=aFB}kDuWA*yc5_R)?xk(CpmugCLvf1P0apR| z9+i^bo&7!O%|W9u`#<($lJKb8u8#+sRJOr=Jfa#m8Rfm}1rXL5=!wbl#H)JMr=d>p zGEaLBY$|U5E!ldGmcCsL{l)tDDsZ%y?s}>H;>nzj*GOP6JmEn97DaCF#wmzEegb{q-;Lh4&6 z@rpV!=cpiypsW>!c4D1`m=uM&dpYtg^J|*I{QfJfz`1g|yU(OqVN`u7J$O#T&CRrO zb}Pcio9_1=P*%Vk?N|#`ymT=0tHZKW|f)ev`h~joR+QPs8 zFFJ_+Ps5dyssQ_ZPU6-$wtBn2nku8o#0F2$;%g zlA?F-++y1*)?Y1lot+C)sBw@Rjsa8DG1!9=&iA3@;|NWOZ;hJ;{yp$^+FT>3#I>8j)ih7M z;bT0YYR*C}M&J&M;T+COp~}S%eYf4kDlEURET7NGu_*t`wXxjjCQuD@5}Jeb%_|R# zro8e1q*2V~F(k~Ua+Lx1sbuq&8^^y({O)Q&(eFRa{d`I0cYBs3pETHbXi@6ju+?kt zMp^EAw8L`a??--0aWpu;bVu9yeXCA><$GY!?iE!(UHx${{CRTlYflA$V56{nHz}5^ zKod|xlu#&rq-uBVC~FTFNTt-}Ol5F|Cx>TPZFA6bcSjJxfA|aRxB)!$TZ_a5G(`uk z1e#kBN@ThS6q%hI+y2?iuYUb(_Ug}O%zNLr=jN_Gs*_2Z2&rJ7l}AQ8(5%GnItf?v z307A{pU?5VJD^9e6o$syjt!Iw=Rx&+^R1+JqH27Qbv1Y&N_4Jlp)|JCM62H0VMuUW zmg(899@$}p>k^M7PN_~IIA;?X_^wU7k@#j@XHr)bpg%N_x5IlhYw_8OT8xrk+IHU+ zt-5gA-;*39&MJ9cK^)7}^G&U}OGjr_gJD?CrIHtxiV##o#9@f~Z$z1poU6HLy;FB2 zw0&dCrSjeBRxUBH@w1t@cB-tecc*x{4*0(LPg#|7HS6r%({aMV0$f4{n77$~G&R$6 zVrR4g{j4t9%4OxCXrniA+$B3aw^7s+X`z?W>x7jHv$;*VbRX-!vOdM?ReQ=Ty{Vb; zTga#&v`-6$FgGe4AZJxwGues#IZ-$s(e4a+tqlW4)jRV{G~ICKuKUBp5f2RBE?ax} zT0K>1#=qF17_H6kSF{QJ1mqy!`~gZJ0ei4!F;@?oPoRfjt;fENj;zRsqiPzQ#d-Z= zI}@Ri6SU*I4#dcz+#|j`PP%PNbML6dW=1|i{b;Ziyu>5Q7|4iTxWz>|%zW*wJQ4DN9xw9>7-Jc3@o*4EA^Ggj$75bL8V} z7kY{Zksk3ZG();$+aK??ELyaU8g6;ev(d)*K~5`5>B4DPNJ18$T9iJ(AZ>VFS0$x=Nn=*%>8Pa0spS6 z{KhiV(We;kHPHZuEV6aTR`Sq8@`(OjdO9c{q97`P%=2pGAJil6rUbTKQ>>vED%zZr z#eFVSJdvYmskD)#6O_85?H@SNdJ{*QG^D5GWh;9qFQmOyx$*Oq8#NfhWj3E&udPF1 z#gnh1o1o@o-i@WFZn9?Tnj#qWi5-L*8O4cu)mq0>%60V|yt>8% zSaUG`J|jDPQ7_FNP~epM$_zZ8j0aJ7`pM`fxzterp(5f`>uI2v0IOr8+aTnr#R{TNEmsVe^r3idysH=a^u<*hog^oI5*X#F*`}+ zC;GF(UB*<`y1Ju&<$uVx{Kw|jxHiVBQNrOFhTEE>o_ z$OI_->kZt0GE$f%2MIg}#aiGn5vLxhYFwJ4HZ!9fll{9Q4NSmH+<-io?0=(Xjd4vT zw`-#_?6{SRni*y+I=eaMFW~Gg58MYJJDlxm=KO2O^`XgbiO172NZUl|!XHI;#s~>- zr=##1bu*eGfp)416iwmV0asFBVz}}lO|p_LGk^nMybeKNdzDwYQ01(DJHUJ63rp)9 zy9L{ns{KtRO?a6KAOIu`M1V5VcsxOc8ykcOe#z8o-KRxX!UuzMU7>^4kOO+rrDmBP z&VrV)7YN3h;eM5Jrz56Kitf1Oj1yahO@bUuyk;WY_Aiu+75_NW@VBA-iC;fC~8B(M~(BrDk*Zg0=?ZwzxV%~oK zJ5Zt$qw6)016gSC8dWZdrVrNQdC|%?gesP%GI$N%vBsBd2a@N1G0o^pZa(7bWS_Y) zb{RJ$RdpgJAmD2{ERCidm%736>dn0tN#(&itPK%ck_t)A5t4=Kp}UY{QO7yUCwYRD znMvo@tr2FTo^nm~gFHUReYJ4y8z{*t*hb*jEup|#+p_NXzd=Cx4cY{aeD=6gJc(LU zh_puI)T)}Cgy+NLwjiJn!f=2kxO2gDA$!KW3X^j*#buiMUn21n`m$h{G#I7>p6emQ z0IYBj9-qS4ol&r@BuGYo`XZj2->+s?NmZG}&+iD~$)>Q_@9EhF@TYJ1#F>LA$>1AK zl~(2A;hbB-t2c{04A~3}>Si*9uCX=Qh~J$E`?9?6Re^Ep1@;H4^+6s4po8@^Q3q}q zscaGAtMIWa{+u>i*e;$pN5*ki(u6iRI%1*{e8dKYU^yruMt0PIS?me6-E~_E?@qz< zCzguHgtOjy;*IS6V+2vkfG54zD%>i5>BHxS2TawZ@h*i$>_3D4uc4FH(|ErVFzis- z&xs)(;h9nE50oFaL5iKxyD(HoAb}`LKmc@AIXFrL(?DT|>KTfvpuonNWHmwy$mLfffUo_zXsxZ(0?@PHcc& zWg;()yN_cX9CUHWS!NlO8@`mnEtQlmErkhgc>1OgtQPrL_Bi*C0tDp!;6+gzWwaE_-7aNvtuzW z?maE$=S!ajl}-UDUD`4adBAEdo&TxDWvO+}Lp^#x;l0)#c4Yj>frQeE8!QDM%65iB zX9iq5LR5Pl^8B6b<(pUy_0udPr=)o5F8)R#*}kJ;;aD&JuVW2n`6`&Dsg8?MyS}cq zUjR^NDbW@Yu;2f>x&jT)k21~ZlP}DtZ=PH3Jk6RL{^#b%1M`<_TgDBQkJh9k$S8gd zT5arARcTWq8_!m}2B}9#SvU%d!XZthbb2?aK7qsF17}_elssNO1!L@l3oBxBag-3e zGo4gs?LZ3fB4<$f#xi&B>C6u_=bcP9Y59)-vI7Z1=x2POANU&@wg1 z!z708Ei6;3(tEpmiTjY*DadZ>*j^m=>l}9EM}{-6Giq%?^BOMr!*-m0m@Rwg^qzy3 z2UR((lNaO8@mMYbP7}7Npmex_S!*^={v0rL?*^SRUE`9`3N-1~n8;|`ui2_3_pcGn z*)e@7s7qQAM;wVPJo(1_=A2RPk-XyJ@+Pvj0qrKdE`~+o$AbO_^RanL=nWoS(`&|Ft9;m9^uvoaX zwjCPCDe4oD`4{ZPEo9DJ`wT|OBj1?VmIN&mL~aXn#gni}R-{U!x;diWTRf5|Tglt1 zy%dqtWJ;Ty9%MMUFYQaH#!q#U<9eL#&eOAJ&#?eO&Z{*7%-LSAJlWTws{>_b1vXwl4K`gRhQSh^>n>BMK68&aOu=*g zG^L|`1W>Qi*U(7FDCKVNS;_wVzkU6iJsq$_bArQ~n0I61yIv!W-(I--4WwZJ=1?Ix z;s(W5Q7vKY|1)6e?*lH|8Yq1}sd=#=>Qbhh$)X_Xs>WDFS`>v-^u=W~E_Ri@ol;~QtCZ!>o?I=<5Vxy5H`qa0=|22}Fh`39p zwQw0?r6?Db+l5_G*e@Q?I2)&vX*Z{EeY-^FcHY5kTO5)pwOe!S#&Jl6%n7vC_c$xZ zaobvrby8F`yFNer?A-C}5F{feS_{^?+;#SmY?;MVR-Mf_PFHS1Qv5Hw>Ifsmuyt4I4Fk!AMrMbI^qW;^nrm#f^O$bue*{9Qwk6Gs-K0p9 zX7ae+$1)P@YsYEXXHE6f<6+oGI~NWWSo;4y-5t6kE$eWr)DrxsH{1!YNV#E0=UUd5<7dA`AO3SXJ9nSPflZx~li%sD09D3{IPm z(_A&g>nkWj>5QB3xnjZCr3eq};kCZj1{W7o;*?G!Jls_g`($`WPkjFf&57wCaGI;i zwVamw&T1l!RQ5)Isl55@yCt*vxzoBbf&J(gsl3|Pjfs8>2$OTAGa^ggRN1F^OFvSUA%w5@}#yW+%vXIjPb;ScI0 zoDm)(?TSX11a{^iDLgdjXg})?MAxGvuy_kGrBPmvK~^*q*ajBhZ&_ z3~-G0^}C`%1V|N_m3IE9zSB%d!CAP}tbiJw_MH<`+v=-$w`Y!}xdsTX-RK5#_o!{0 zWH=|ElR{OIJ8H12Mc%U=J^kWg;RLon#xrQI7rfqV-`{}X8>C5S)QZAUxxEiR5V(JSw9y{CG==+~Zpri`RC zr|{({l@EIrl$l0xQHFIVlRc@o;Nv$31fxwaAH+smriUQXkI$OhYu0W9M{} z3HXPfe_rWld8f@n8k(1zQ3g_syHk$vzx32EXy;M6&IsmrjWGSlZn<~9Ph>j8s9Awb;p zAkGT9^*kX*b?kI$i0a6%<}?FZ5u80&RBTF7FZ>&h<|5DTak z_!J-HE~Yl@~&LNS)HmX zhtA6F6IByU&&F-c?pN_h(%Yb(-yV<%7H2OWT3Q40K0}5>lTa5G9OF;XIa=-j%|tmb zkNgzd603#h17PZ}^f|1f_SBOoLY|US79K|^*o{RoBFE zcV3@nioLwjg_|xyYm4qp7`v4!cMr+zF{o58~=W${hO>_VI@qaTrI?> zQW5}!u*%2C{@4C~w6?pf`0x#31T^=Vv7>(Zg$vggLOr+(2||6e9+a%A!XK74dd}(8 z9bGy4iuCF)L{Sv~QHFkLH>WEJ!GL$1Cx_8)hfjsUgtV!EMTYCm6QkR*qhZ}6gE|Mb z?_z>l)*Y)xZiRZEJ}8ad)0ZJEgH60bEO;rt$@tXeKfgJ6{amX=S*_$*akEXLa;N6+cuD4wZS5bj0*`1YP*!fi;F;e>4DNfLC zjyM>L+xh-yjjuQRLo@1{(cXL+3ADyfF6yJU`H)r#F^&S&89f`&8HsEp%84v;R7R2K z#$_OeN6u98qo7hhun+X#v@1P22O_Smt_Ul>ruq~(H&Q?gd=F){14j%lx$&vSfFEyP zHAHzggIRCdlXTt%EEfDtllV0f5Dl-`Z5ht%qv_4V+!pgi_6vdNPw@_LHg8l!xj@Ka ztF9FnH)3v9`H$6we9L+H+=hKJslpjXl6FL8iZarP#>viKtF zJ}nAzf0%;jVV%8Nlj)W0SZY4XY2Dqkn#+oAZRfEL7XzD)be+;k;?uT}#Zh0}kf2DD z7dleAuqSO?<_c#By~0{$jAe{zlBP;r;D- z;~SeyVG&Nm*kG;&lwCDlWLV1>x46Jc(wbhWC;y|b%vv|LVIRaJ1Fcd3IK#g(+#6G6 z4?%X&u(M6;O~<(OUmx{|sll>^VU>01{){j#&crwdy?k({t@PV|#*++#(_G*EZ_J~- zgtc13N4xhXsQ}=|=lDn#k_PBZ_OUr@Yn{qSb;{M1+^t%KE0`a_UZ4rGKFao$C zQy|_D!ldX#%{#cb??oIqSG>E&3(U#nh+mIYsG^q|;MtC2|BRU>Q*S&cZnmnD7fs^E?-m9^Q<tZDu0p4W972U8?UxrG?z~wi+iHQtl|;T@&l6L{PFR! z9DaAfGrx~m5%DW)1EbGR&#F-}&I3Uub5ANe(dy+QzCW*9Awyi;tU2qJbrY{qklN$g zx9JK>jDgT-Z-Wm!^(D#&;8ojC2LzvY{NTeA52^~Ozc!E>G4Fe8z!CuZa#hSH-zbdw z%vr|IfXc+m^V7MnT>w+|n87OXY5bibbl36Sja_8TOKv@Er_F6N2ugfcU`DM$D8iDy+47qAr<2P?{N9- zEodi@SuREVg_FkD`8`@t4TbIVO#Tc**w<(5q*>czOexK|JgI39Z+N%A7;oN+g*Tjy~lQPu~od`W7;|+$gffR z-e-U6d9OJhVf$o_fm1S#3Z{Gg7CuT=K6ldYm~87b9{MaWO<4DzG+|{jFib(9Ky_0O zudA-P5L)=Q9(FE^2RZobL%ZsrlLn@f5T&(+05!+7mP_Bko*08=Oihi?atRoK-A=XG z=w1kvgIyOqX)aF|uItlt@s_n+ILou*zKcdeBh19q0keCnCj_#L z4Xh;CM#Z1S^0)X`h*i!O;N+dC0@{NkmjR zp@vi%9ZpyB2abRr5NBRr|1Z9uic_}4`(XC-)HFci&Y+;?6!yHtR2p|OsZ5DX05T_` zK#_C2SLJD#)&VFAZzck$N`bPTI$LHwkWEWXDe0X@X`p5vcL0(ud-h9MLX1id+Am;8 zvTcTRyxmqR7%ZH9b?>(SUIn~IS$D#8>%EWDEN?g?khy>k@-Q?yOM$Wv5S*BE(j+=n z(;(%ss3rX1O)3&VUi}%XWvm~qx!M|rYce@X(LPo9@pcd^6A_W*GV4ODur<0v2Gat~ z9YvXPc1bd2GY5u@Bu&S_{!N0zag3?`1;4*5uz+BCuDb=UbHCdhus%|}^&>$Y?MRjR z1&T&Mh5U^h?m8?y9Sy&o+vkAYEsehDgNvkR=U&Q&t7St7FE{pfae@4h)7`?GGp>v= zfS{OK#n|zCP(Z!b#{6uc!eGuJw12{qttrk=ddj2;o~+}es%9Pl=tsyp)XBXL$032Z;0`>A5j@6WJVK2gakSa@KN^27~Yru`~p zJIDw?EiW{I-P8TA%X#Lv<*Z;WG^zl{tZu8)6n5hE3DtqqRS(W;mMjVc9_+UMF%zfovhrh z&#^$y(IY|NSY1d~$HmP8G$0CNYC?S8xa|}3ZxJ;j$!o8j=X==A@u?_d-0?R9GV($8 zLS7lHV>{C!{&y0twPMUyjV|n)ntSNTuo?z@I)`-RL5ZM(et0s}DL+noVwQt$ z9H2>tFn?3Zd2z8WMCk%f4~g3uqO_q2F^UwfM5rBe8&xuJp2CpwC*u=QT2iFT4;8Cu zwV-~$3tY{lnPD~mP@%V}yO-@OLfH9-jWk~H)LZ|*Cj0NW9p;C*?(PMc19cSO^s7c@ z+Ie?5;ut%|j5QfbK&X|o^zZY4$pu~Je`tO%q9$~K+6*y-n~qyvOUh1}awYr9ivaD@ zFF;&@aYII5QI2Z^df9vJs6-Ywz8k|fs2^L&tWJb#2OwlJ zu83#4a2v5wUiL2iut-kz%0!Qjn=$W_?v2G0zdQ^q14j-2v ztsfyxlk+Ngf^i8@b#uiOH8&MeNm3{Cxf#h1d|%oJ9IIx!&2!f)FB0TDaD5!{sY(Y-b3^xAOM2IaIMGagg4 z>B7qUtAch5gZ>!bS$H3ZOy zvSGf_k)3zLfV7jRTz5-$mZ*l%)%4&1$o%Zii`C5=)2UM$Yhp{c5SU{p-vNY}oKbby z`l;YrE-UwRZn+?beTbx*ydpy(cQV7Y-Goc3BQb3EwII5VxBwz}SZJ-b|JZ!K2N*~c z=zEJwwr~*L<>N4xBIp$nkW)meQ5;`L)DY+QN9L80Gx~Vs>tdE8tgv%bp{k^C;UOfn ztsToFssoVeQ&Duk(DpS?X#O@_)oDsp6&g6NhenV&ax==_zjrE?7OyYU8ZSkZP1m)o zjPSSXaEN0-fI`us@*Chd3eVOSVL*0+NrCZC5z1%!O<+uBN0=s-1%|9SN4Z z!{3dsD>@JSbI^JDvdrK4Ik3M#V2q{bmK&SRSGu~$9AEb;+UeVC4G+jElFJT^S2xHr zJ)9a%n^*x(O_x2QsB^j}AQ)ple$x9*xAyt(EsrKX7l06*<<$udTY0Z7RG*X(mnkDFa7U!ZVe^ zS!6qhoTEr#?83VW#!#%?z|v@ zHx7iRBm9oPYHXCT#m;5BcC%amSc{~8^rUTP&#}zj-&nzk1C8TA6bwD1>HK8PMC>_N zm}>yZr{}x;vVh=h#SK_-6zJEe1kJdtNpbxVtgpX;lIb2F5>_UV(YRNb{hG>P(uM{0 znG)C2yAU6VAsLvde0{F#u2oF&J3YjAJbV8qz5TYMF?JeS1uv6Tt`9`TK4RaS*i%!B zZY(m(vQ8xK3IQkXnf%1c0cenT{6l!2EofSeW(!gz< zlc!ySBOi>nDV3dVNfQ8>4JpeG0{v+plFp)MZlLEfF_Qamy96a3&eH(}<&lp#fLUu0;H2*w(UeRdD44cwDbbI==Om1eQdK zO`k3X)#jBWA9bboR$P`@ZJ0Q1kt0XJe|H{0s^8ebA%;)zj?br7c|b={2+7ZstEX_na&tM5dI{B5oHOH*eui&LetjM_K+CBy(o`-XiKAVF&c zw{vdTKkYaf%?4fE7kv>HQrlRw2-2Ltru?D#Y;eM6zZ3B^AeMf54N2G2_La2eFvy(ZqnWqOUzMmj zeh8DmVW7@r)^Fy${tyUQWp+HcIWs*7k&HtX8HBB6Qh!HxKVX1#L`av8TZrw-0)Y&? z>f@~VB;reipK37yNQ7*+d-fOmboz7<@gDP(pTE z5|QTsw;ovGE0z+km*DKqcoM^PiHNXo2&q(0{!Qn&W^A)sJKGpe%=6zifYOmS2jE~O zp2bCHd#L`&s&1OQ2w+8x{%Z(mP1qMV1Z1^}9=E-(J|KmLD(_jp>Fta+rI7sv7MF^? zsOK1MG?fVqJ&@$w@WmKfurfmRyC5@FdCjQ$gqSc2`pJVUZSD_Rj5X@=p`l9uQM+tj z1iC>49@swFeuSyAE7-D?p)LcakTjHp7%1iS6>f%ARaoC|QBgRvZJk*`v4IxwN#Y9& zadaL5z=k;>YhU%%%>@e!OnV3jo&-=Nq}sk6gZceIra6^{L$fN;NV+>%x5j|V+$D({ zcS+xgZI-}d9DwVL+{bsBL3c)G;~~&hh^Kfag-CnBVZ+HTf(&-M7+CKvR@a00o>&=Z z{Sh zo!Z~yu)&1y0WLTYl)>(TE_5S2t^*>iC@2E01WgQ3a#MH!pkvP3zS)u2E125d6Vh6S z^20-6qrY+niiIZZH7@F=c}*85Kw4h3L>G3-`e#i$+6iAkFVF|$`j*KIPME#%bGX0+ z4x~R&wDl1QS>##aCrO~=zOq&5Fjy(Lx0zr+1qjq;HoOW==(et)PfjX-S)OTVL;!;~ zCCbI~O99G5Df5qQGoySx{z1S9%c}qpmaK@kA4O_^dbm(JtVe?ei>*b7_b(b_3l%-I zd2n|F1OLugSvR7_H>Wg}N~%;la9y9P8sgv?Ryhc<{voEjytW&iZlx?BG4)Srl56tA zipgUVq)TNVH1}47M^xsqQig$gyB~LP;BB9I?XjrBRgMn$lwb zRDxP-nIe=S!emw0Y#qQ0i)w-5Tu`|5mux_iv0auCmD3Lc#?;_f_fi;p;gn3>Z!z^Z zM{_%Ivm33}TW~5AD`KkuC5Xfq`dzCbU6-#OwC@br$3U-@(sWmSt%=S9%%DQkN${~0r9r+55(K3GxtCo`2oV? zC(b-+_b}yB+}U7N)-;Z6+-u!>#pnjxW|V+!i`eH&%Tt8qt%5^!V>bqnQRVzcL;dgD zlgTxIep8ENI|tDQSYyvcBX^u#BN0}Cvu7#zEyqVA=Wy8}paqFsQlKOTZno3C0TlcL zJaJl!>GLmYiv$2yU>H;wXs`C}`JiaHjVA{LJ?~X$bCLywmWsr8 zlE4iuZH%aoC>=;@RkHwD<`0UmG*ThjLXyEhR0*Y+c#){{elUL4#|&PGtNszET3U7S#_JjX zwy(v@CR31C`Yqy?D=Mn`oI*uT%K2gx3pDYYpiOz&##)X%Zl6Kr#C`={mw`%u=@F7dU8Z$iZzH+ur$iahZ?)eiyu4~G0XQtQ2IL^l@l$}|q zaoY@kzYmez*;wEV8zYhh?VvO3rRaeBNeTOrlBluK5m=-*v#{0}VmND~rGhdcK~4N5 zsexRP>W*ON3aPb0y5iYoF@|Y~ud6InZ48xBwg`tP5B6LaLZ(hS0#2S*`sGt#yr^z- zWHVQ@Qq>~hO_j}FRg4gr9#Y-+hbBy@PG|}j9uL=(o(~E5TAURhQa;uIfNUmDFUYe0 zIWG49H7;l`E*pQJ6W)R*$FP`rGUK|a3raZ;7VkJu_7@jGIK)?=eb`33V)?dazaIn& z7QY0v5Mn?oH9yeU+TiEVmP*-Ifh>iOKxZhX@GVV0?6;8tlYo;9jkjm!t{V?J%d-61 zlQDhNRzT_ZBC5w~E=WyYc#Yu^xJM^YDZTuE%zek$f!Ax8Z1*l%gE4kdW|x@<;)Ywg z%b`MBY$Zyx2wIwlzmJwEP1}llF+TiP+`Ht~1T9zxq_k}taC@|=G zjY<$*%jHPzpih)-@$%E;J>aEE?tm_)FhOQ4jl?5ziGrCoAgLDrkEj5zg@`*9B*yH1 zy&1x|clmZhSymgO405Wen~B$3s%%1u)(P6Zn9cUDUrUI)zfb0an;SD}stp-3{ARtW zW%L_W3S^qBB<+&zRt@a8=s@xL9T~Jo*ei${mkf?$pF@POzwWUIFIp7B{&dI3$?*r` zqt;J1OdZdNqq{qG64YEbBvIi19v~NG)2uWi$I2uCTs$2o)~>4cQedHbhZPLz&1p(xEsRRhZSZP zhaeyMgoTgwH}!?guZ=N`v~%& zNl=T1sJHLC&LjAecq6mf{9*>eJrv`dh8n^%6k*T?oH%!e&yauCY@!VzVfs4sMDQkx zG{j(QJx@lD%SR?9nGP{1jod!?fa9M(y##zoS6$3Glra-N@$r9ekO5K}af-u0GsVD` z4AxMUjv1v?*F`HK7HJ`<%3rs@2in$<5p!FAySSH7nk*P_oE&+Ra$#vrgsy++ru~9n zdcZtC?6**+$9GcM`3$hk8F4K4wz7WdTl_lbluAz5-K&7SQ2+Gagz#| zgrpF?Sj&-`9q#_URzocGz{h=Q6H7VS<+kZ_#*Vm-^f_tOGYH9Hh4D~OyZ?QhfXaZG z=+#1Es$N2*`)o;77EQt?3Rhg&)N>Jk=P{BajWxHO3#gRLbiY_F?ldWtR3N|;Z%GSTdA4vmBhJGCkt8X!S%k)QJ45sB2f$a8PFd8>X|50!_SXUkSe6_ZdoyKa6R0Z zSo+lQPIfK)^zuOau;|p>x`A&~j0cX5t#*Qn!$Q7QnyTjnVephzBv?ogp?I&xagcf6 z3wKvY1|VA3xta*QOqgp3c1HN>E*pzX6w(MvIDjP;-7b%rDzkrY;`7pbMcl`AQXV^5b&N%cNXWf%+5GlcEB8W1hs{PEor zQ{VAmP4;Bp?sEy?&f4Qfhi-`EqC}d&e^C^>*pSo-m4l0dkY_Zs)#}~lsGZWR)7Bf- z+($Dx3-5sfc_^L#Tw-5HqqRCQqcG09TTqny>qwS>l3xPo{tp4^-$#F^-zz^SPgyea5Mv|e#NG2bF^6$Nw?$0Y2MbP)6 z6xz{D5zNISPG*JWjgz@VZtWvm+nSSFNa$)0we59z8YaK_?@8z>M))&R(Ee7G4w(c# z`3c0=lH?8o-uzLMgagz`;E=UIH*|AMXQ~iR8I-i6@#$S`Ykd1oRfX|UzXju%Ty1Cw(k!Xb8CCY{$*I&$0A`K=!*dx5YH_fyA`grX^w8v zR^YE+n99Kyk5oF3m$6Vf>wXtB%5+#K?=KA$iN#BoSV<(2L^8rA`EP2t4on1FzBRUW zR)U0!mNoUPksT6lRq8Ivm>v_2Nh}#A-QL5APzk|NSa^q)1LjFn@$mB}f2|Eo79F{L z2*#9C=razfmIIRnM#Dv?)|`rnx>H1KoaM}YLQhC`@_S7|R+HPd4u?V22;2|#< zCCZ6xLz4kDhS4p@?Q1NEi zIW%-d#?w$n_gv?x?nv?s@dKe<*sIXwBb!MPU3F%zL0ic{-4rJ1(xf@6$>6|tbw(@@ z6Mrh2E|9`h<+#mB*)~eu)b2GTLGKYXg5%ORo8{EAJes|5MB{CSn4S>#tqGIRVl~g8 zS!t!cl5H)APnUei!K&HLSf3IOq&&^mOkv<>zI-?8l#p>0T-wR&i|=039Ga_dMDZc{bV(g=j-OD{YApe` zyBSn%CE+T_a4b{N1?&^I!bn1^Ot(!mV*;Z*W2_QyVEv4PKY4F|x^KfOTxbO~R&?D3Gs zCO`=1%5_{1~!I2h_A6hbDNt+A`9$b(IonN5>vWkVov zB@oV|YyZ3#sU#i66EnxIIER;Bafa5{hH5AG+8g2+-hAB<+oYC;Gtln`Lm7M*hKcv2H}zf7Ko=a0yKCbX8#Y$}`{k7*h~!Z`gY zh7CbE#M(DuQkWfj!5Q& zgerC`2VZ5O-qcaCzrh2`e^~o*_0UPjKgTkquTKNja%!%4+9X z5?<&i=&KLLTGr_`$dz${kH@Yj>!Q?3c`mU;(K2#D-zM|T!3Sv!RgoR+boJ9$R1^u7 zd`3l>4wg9RW7_3;E)3|$u8?qj0k3+3FNk1)G~F3IB!auL=4LGrD@sK)F^W;fwY5md z_O`huuBXzqmN~?H>{Ki_wVj`T*)Pm(XmQP%n13)dW)C>iU*KJ#m3n5s)4b-x*dPZ! z(>b@FTJI`Q<_|b$PZM+R*7=5xG~N5x=NY> zFZ)GHhRTH>1pN5I%z+oBeLEkof{?-yQKl0Pca&Jhe`Qe7uDy&I`PUtFjJfk@DKuH8 zWvSwoLgNE(h-mIWoRMQUVgj7fXX{T9DL*+U6bRq^Ut=2KGSK-Wbl6DzN9CY=XO!qC zH!@uEOG|%X%vGah&{-t?){*HE+3-v$84e}`GwsBFMO9RRB^%auL_+AECHM#7MrvG>e&a@3`cVWa4 za*$jLOIH9|V0A~jXb%{N1kQfQ31CR3P+I9ToApD;uz;s{(Gvc;XH|?sSFsCO^cNe& zf~8#n!)e6U0b{p`C%|3&Nu~qZwe1MNR9@+1-b4esv}igYY~rf!9cn%%F{VKxFOC9l zxu~TQjZ~uZ#M6TN-hs7N_Z-DK9ctVoQ|LbpoEsM{$pn*q`xy%YT|TSfPViyKSOsrq zWEn0&6=RFQ~T-Hkhzaxa6tx*0Au0J<@_ud;LC9iIY zqLqQ@o>?tw96u%HnejLKJNb{LXlg^F8D1Oem!w^4i#=&6jbhH*mwv*dJFZ6^}8&@bFdZ$kW+%Pc0np3E| z(bTVDGtg7Das*HLwtCOaIqkE$h7cQuUVLLN=EBNAtaH(+roB&AM7;pS3tMo!NgQHw zDO$C2THAPMh>!aAT&l9(@k+pA>*ZqF;ylCRXKIyu+(_|dR58EYv+1jwmGVCqaY-@-^TwtUz0%d<^P=WL84f6Wt5egkP` zfCD?Z^2sY-u+#9vn@-a9;4MFvCN2;9So^euw^45r3%p~GmITryz&A$6mgr31j2=R| zW*-+njbvnNpDQ)*)qC86`Ca{gK%E%7o-}6ckUJgmz0idYp_dj6U9eER2$y%Pe_6oC z-aGWxGhJke{;`qtt$qdLsB8WW`I28Ve#T4ZqrQm=&>9DV=fv{G89%QZVLV$6*&b(E zM&EAuX5xb$MyGer+$6*I<-x!cz8AhkK6>t#D7UcG9(I@b(>kr}MXmQKj!>U`FeUk6 zK;{FTTg3Rv2dzw{r7}JgH#9F9sb5EZzV_MB7vDpM<5_8e=Dd9GmmSTD+58zC&PI9K zJ-+H`kYLRF-Vbm7QJhEpdl92hjQJsMCg>7f z(TaK3z9m<#XmZO=2E4rsJe2r9MSiBAA$IN@Trf9X;@m zXqF00vurx%*)7QEElJZ!|0D1zckKbc=JF1e*dN^eyLX8q=+HCx%;6St+=qduwsbM3 zI&zWBwIwJU@~x4NIc#w8zrqd$Uc_R=V$An(I->ov@ZoEdSLJ0fwAV}a3# z@sp_2oB%;}Z|H>+BvQ=nje%9;Kpt4&MF{ZS;y>8p|2yvg$yJwzE}oB{O*q%E8L|Z} R0{=eUxqk { const pack = JSON.parse( String(fs.readFileSync(path.join(base, 'package.json'))) ) + const version = (pack.version || '0').split('.')[0] const doc = fs.readFileSync(path.join(base, 'index.js'), 'utf8') - const tags = parse(doc, {spacing: 'preserve'})[0].tags + const fileInfo = parse(doc, {spacing: 'preserve'})[0] + const tags = fileInfo.tags + const summaryTag = tags.find((d) => d.tag === 'summary') const author = typeof pack.author === 'string' ? parseAuthor(pack.author) : pack.author - const fileoverviewTag = tags.find((d) => d.tag === 'fileoverview') + const descriptionTree = unified() + .use(remarkParse) + .parse(strip(fileInfo.description).trim()) + const summaryTree = unified() + .use(remarkParse) + .parse(strip(summaryTag ? summaryTag.description : '').trim()) - if (!fileoverviewTag) { - throw new Error('Expected `@fileoverview` in jsdoc') - } + // Autolink `remark-lint` + unified() + .use( + /** @type {import('unified').Plugin, import('mdast').Root>} */ + () => (tree) => { + findAndReplace(tree, /remark-lint/g, () => { + return { + type: 'linkReference', + identifier: 'mono', + referenceType: 'full', + children: [{type: 'inlineCode', value: 'remark-lint'}] + } + }) + } + ) + .runSync(summaryTree) - const description = strip(fileoverviewTag.description).trim() - const short = name.replace(/^remark-/, '') const camelcased = name.replace(/-(\w)/g, (_, /** @type {string} */ $1) => $1.toUpperCase() ) const org = remote.split('/').slice(0, -1).join('/') const main = remote + '/blob/main' const health = org + '/.github' - const hMain = health + '/blob/HEAD' + const hMain = health + '/blob/main' const slug = remote.split('/').slice(-2).join('/') if (name !== pack.name) { @@ -64,6 +86,13 @@ presets(root).then((presetObjects) => { ) } + const descriptionContent = /** @type {Array} */ ( + descriptionTree.children + ) + const summaryContent = /** @type {Array} */ ( + summaryTree.children + ) + /** @type {Array} */ const rows = [] @@ -110,10 +139,6 @@ presets(root).then((presetObjects) => { } } - /** @type {Array} */ - // @ts-expect-error: fine. - const descriptionContent = remark().parse(description).children - /** @type {Array} */ const children = [ {type: 'html', value: ''}, @@ -224,6 +249,48 @@ presets(root).then((presetObjects) => { } ] }, + ...summaryContent, + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Contents'}] + }, + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'What is this?'}] + }, + { + type: 'paragraph', + children: [ + {type: 'text', value: 'This package is a '}, + { + type: 'linkReference', + identifier: 'unified', + referenceType: 'collapsed', + children: [{type: 'text', value: 'unified'}] + }, + {type: 'text', value: ' ('}, + { + type: 'linkReference', + identifier: 'remark', + referenceType: 'collapsed', + children: [{type: 'text', value: 'remark'}] + }, + { + type: 'text', + value: ') preset, specifically consisting of\n' + }, + { + type: 'inlineCode', + value: 'remark-lint' + }, + { + type: 'text', + value: ' rules.\nLint rules check markdown code style.' + } + ] + }, ...descriptionContent, { type: 'heading', @@ -235,8 +302,9 @@ presets(root).then((presetObjects) => { children: [ {type: 'text', value: 'This preset configures '}, { - type: 'link', - url: remote, + type: 'linkReference', + identifier: 'mono', + referenceType: 'full', children: [{type: 'inlineCode', value: 'remark-lint'}] }, {type: 'text', value: ' with the following rules:'} @@ -260,17 +328,10 @@ presets(root).then((presetObjects) => { }, { type: 'text', - value: ':\nNode 12+ is needed to use it and it must be ' + value: + '.\nIn Node.js (version 12.20+, 14.14+, or 16.0+), ' + + 'install with ' }, - {type: 'inlineCode', value: 'imported'}, - {type: 'text', value: 'ed instead of '}, - {type: 'inlineCode', value: 'required'}, - {type: 'text', value: 'd.'} - ] - }, - { - type: 'paragraph', - children: [ { type: 'linkReference', identifier: 'npm', @@ -284,28 +345,107 @@ presets(root).then((presetObjects) => { { type: 'paragraph', children: [ + {type: 'text', value: 'In Deno with '}, { - type: 'text', - value: - 'This package exports no identifiers.\nThe default export is ' + type: 'linkReference', + identifier: 'skypack', + label: 'Skypack', + referenceType: 'collapsed', + children: [{type: 'text', value: 'Skypack'}] }, + {type: 'text', value: ':'} + ] + }, + { + type: 'code', + lang: 'js', + value: + 'import ' + + camelcased + + " from 'https://cdn.skypack.dev/" + + name + + '@' + + version + + "?dts'" + }, + { + type: 'paragraph', + children: [ + {type: 'text', value: 'In browsers with '}, { - type: 'inlineCode', - value: name.replace(/-(\w)/g, (_, /** @type {string} */ $1) => - $1.toUpperCase() - ) + type: 'linkReference', + identifier: 'skypack', + label: 'Skypack', + referenceType: 'collapsed', + children: [{type: 'text', value: 'Skypack'}] }, - {type: 'text', value: '.'} + {type: 'text', value: ':'} ] }, - {type: 'heading', depth: 2, children: [{type: 'text', value: 'Use'}]}, + { + type: 'code', + lang: 'html', + value: + '" + }, + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Use'}] + }, + { + type: 'paragraph', + children: [{type: 'text', value: 'On the API:'}] + }, + { + type: 'code', + lang: 'js', + value: [ + "import {read} from 'to-vfile'", + "import {reporter} from 'vfile-reporter'", + "import {remark} from 'remark'", + 'import ' + camelcased + " from '" + name + "'", + '', + 'main()', + '', + 'async function main() {', + ' const file = await remark()', + ' .use(' + camelcased + ')', + " .process(await read('example.md'))", + '', + ' console.error(reporter(file))', + '}' + ].join('\n') + }, + { + type: 'paragraph', + children: [{type: 'text', value: 'On the CLI:'}] + }, + { + type: 'code', + lang: 'sh', + value: 'remark --use ' + name + ' example.md' + }, { type: 'paragraph', children: [ { type: 'text', - value: - 'You probably want to use it on the CLI through a config file:' + value: 'On the CLI in a config file (here a ' + }, + { + type: 'inlineCode', + value: 'package.json' + }, + { + type: 'text', + value: '):' } ] }, @@ -315,35 +455,59 @@ presets(root).then((presetObjects) => { value: [ ' …', ' "remarkConfig": {', - '+ "plugins": ["' + short + '"]', + ' "plugins": [', + ' …', + '+ "' + name + '",', + ' …', + ' ]', ' }', ' …' ].join('\n') }, + {type: 'heading', depth: 2, children: [{type: 'text', value: 'API'}]}, { type: 'paragraph', - children: [{type: 'text', value: 'Or use it on the CLI directly'}] + children: [ + { + type: 'text', + value: + 'This package exports no identifiers.\nThe default export is ' + }, + {type: 'inlineCode', value: camelcased}, + {type: 'text', value: '.'} + ] + }, + { + type: 'heading', + depth: 3, + children: [ + {type: 'inlineCode', value: 'unified().use(' + camelcased + ')'} + ] }, - {type: 'code', lang: 'sh', value: 'remark -u ' + short + ' readme.md'}, { type: 'paragraph', - children: [{type: 'text', value: 'Or use this on the API:'}] + children: [ + { + type: 'text', + value: + 'Use the preset.\nPresets don’t have options.\nYou can reconfigure rules in them by using the afterwards with different\noptions.' + } + ] }, { - type: 'code', - lang: 'diff', - value: [ - " import {remark} from 'remark'", - " import {reporter} from 'vfile-reporter'", - ' import ' + camelcased + " from '" + name + "'", - '', - ' remark()', - '+ .use(' + camelcased + ')', - " .process('_Emphasis_ and **importance**')", - ' .then((file) => {', - ' console.error(reporter(file))', - ' })' - ].join('\n') + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Compatibility'}] + }, + { + type: 'paragraph', + children: [ + { + type: 'text', + value: + 'Projects maintained by the unified collective are compatible with all maintained\nversions of Node.js.\nAs of now, that is Node.js 12.20+, 14.14+, and 16.0+.\nOur projects sometimes work with older versions, but this is not guaranteed.' + } + ] }, { type: 'heading', @@ -366,7 +530,10 @@ presets(root).then((presetObjects) => { referenceType: 'collapsed', identifier: 'health', children: [ - {type: 'inlineCode', value: health.split('/').slice(-2).join('/')} + { + type: 'inlineCode', + value: health.split('/').slice(-2).join('/') + } ] }, {type: 'text', value: ' for ways\nto get started.\nSee '}, @@ -482,11 +649,31 @@ presets(root).then((presetObjects) => { identifier: 'chat', url: 'https://github.com/remarkjs/remark/discussions' }, + { + type: 'definition', + identifier: 'unified', + url: 'https://github.com/unifiedjs/unified' + }, + { + type: 'definition', + identifier: 'remark', + url: 'https://github.com/remarkjs/remark' + }, + { + type: 'definition', + identifier: 'mono', + url: 'https://github.com/' + slug + }, { type: 'definition', identifier: 'esm', url: 'https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c' }, + { + type: 'definition', + identifier: 'skypack', + url: 'https://www.skypack.dev' + }, { type: 'definition', identifier: 'npm', diff --git a/script/build-rules.js b/script/build-rules.js index 80583afc..a48d569a 100644 --- a/script/build-rules.js +++ b/script/build-rules.js @@ -8,8 +8,13 @@ import fs from 'node:fs' import path from 'node:path' import process from 'node:process' import {inspect} from 'node:util' +import {unified} from 'unified' import {remark} from 'remark' +import remarkParse from 'remark-parse' import remarkGfm from 'remark-gfm' +import {findAndReplace} from 'mdast-util-find-and-replace' +import {toString} from 'mdast-util-to-string' +import GitHubSlugger from 'github-slugger' import parseAuthor from 'parse-author' import {rules} from './util/rules.js' import {rule} from './util/rule.js' @@ -35,11 +40,11 @@ presets(root).then((presetObjects) => { const pack = JSON.parse( String(fs.readFileSync(path.join(base, 'package.json'))) ) + const version = (pack.version || '0').split('.')[0] const info = rule(base) const tests = info.tests const author = typeof pack.author === 'string' ? parseAuthor(pack.author) : pack.author - const short = basename.replace(/^remark-/, '') const camelcased = basename.replace( /-(\w)/g, (_, /** @type {string} */ $1) => $1.toUpperCase() @@ -47,13 +52,38 @@ presets(root).then((presetObjects) => { const org = remote.split('/').slice(0, -1).join('/') const main = remote + '/blob/main' const health = org + '/.github' - const hMain = health + '/blob/HEAD' + const hMain = health + '/blob/main' const slug = remote.split('/').slice(-2).join('/') let hasGfm = false - /** @type {Array} */ - // @ts-expect-error: fine. - const descriptionContent = remark().parse(info.description).children + const descriptionTree = unified().use(remarkParse).parse(info.description) + const summaryTree = unified() + .use(remarkParse) + .parse(info.summary || '') + + // Autolink `remark-lint` + unified() + .use( + /** @type {import('unified').Plugin, import('mdast').Root>} */ + () => (tree) => { + findAndReplace(tree, /remark-lint/g, () => { + return { + type: 'linkReference', + identifier: 'mono', + referenceType: 'full', + children: [{type: 'inlineCode', value: 'remark-lint'}] + } + }) + } + ) + .runSync(summaryTree) + + const descriptionContent = /** @type {Array} */ ( + descriptionTree.children + ) + const summaryContent = /** @type {Array} */ ( + summaryTree.children + ) if (basename !== pack.name) { throw new Error( @@ -65,6 +95,24 @@ presets(root).then((presetObjects) => { ) } + /** @type {Record>} */ + const categories = {} + let category = 'Intro' + let contentIndex = -1 + + while (++contentIndex < descriptionContent.length) { + const node = descriptionContent[contentIndex] + if (node.type === 'heading' && node.depth === 2) { + category = GitHubSlugger.slug(toString(node)) + } + + if (!(category in categories)) { + categories[category] = [] + } + + categories[category].push(node) + } + const includes = presetObjects.filter( (preset) => basename in preset.packages ) @@ -76,118 +124,164 @@ presets(root).then((presetObjects) => { type: 'heading', depth: 1, children: [{type: 'text', value: basename}] - }, - { - type: 'paragraph', - children: [ - { - type: 'linkReference', - identifier: 'build', - referenceType: 'full', - children: [ - { - type: 'imageReference', - identifier: 'build-badge', - referenceType: 'full', - alt: 'Build' - } - ] - }, - {type: 'text', value: '\n'}, - { - type: 'linkReference', - identifier: 'coverage', - referenceType: 'full', - children: [ - { - type: 'imageReference', - identifier: 'coverage-badge', - referenceType: 'full', - alt: 'Coverage' - } - ] - }, - {type: 'text', value: '\n'}, - { - type: 'linkReference', - identifier: 'downloads', - referenceType: 'full', - children: [ - { - type: 'imageReference', - identifier: 'downloads-badge', - referenceType: 'full', - alt: 'Downloads' - } - ] - }, - {type: 'text', value: '\n'}, - { - type: 'linkReference', - identifier: 'size', - referenceType: 'full', - children: [ - { - type: 'imageReference', - identifier: 'size-badge', - referenceType: 'full', - alt: 'Size' - } - ] - }, - {type: 'text', value: '\n'}, - { - type: 'linkReference', - identifier: 'collective', - referenceType: 'full', - children: [ - { - type: 'imageReference', - identifier: 'sponsors-badge', - referenceType: 'full', - alt: 'Sponsors' - } - ] - }, - {type: 'text', value: '\n'}, - { - type: 'linkReference', - identifier: 'collective', - referenceType: 'full', - children: [ - { - type: 'imageReference', - identifier: 'backers-badge', - referenceType: 'full', - alt: 'Backers' - } - ] - }, - {type: 'text', value: '\n'}, - { - type: 'linkReference', - identifier: 'chat', - referenceType: 'full', - children: [ - { - type: 'imageReference', - identifier: 'chat-badge', - referenceType: 'full', - alt: 'Chat' - } - ] - } - ] - }, - ...descriptionContent + } ] - if (!info.deprecated) { - children.push({ - type: 'heading', - depth: 2, - children: [{type: 'text', value: 'Presets'}] - }) + if (info.deprecated) { + children.push(...descriptionContent) + } else { + children.push( + { + type: 'paragraph', + children: [ + { + type: 'linkReference', + identifier: 'build', + referenceType: 'full', + children: [ + { + type: 'imageReference', + identifier: 'build-badge', + referenceType: 'full', + alt: 'Build' + } + ] + }, + {type: 'text', value: '\n'}, + { + type: 'linkReference', + identifier: 'coverage', + referenceType: 'full', + children: [ + { + type: 'imageReference', + identifier: 'coverage-badge', + referenceType: 'full', + alt: 'Coverage' + } + ] + }, + {type: 'text', value: '\n'}, + { + type: 'linkReference', + identifier: 'downloads', + referenceType: 'full', + children: [ + { + type: 'imageReference', + identifier: 'downloads-badge', + referenceType: 'full', + alt: 'Downloads' + } + ] + }, + {type: 'text', value: '\n'}, + { + type: 'linkReference', + identifier: 'size', + referenceType: 'full', + children: [ + { + type: 'imageReference', + identifier: 'size-badge', + referenceType: 'full', + alt: 'Size' + } + ] + }, + {type: 'text', value: '\n'}, + { + type: 'linkReference', + identifier: 'collective', + referenceType: 'full', + children: [ + { + type: 'imageReference', + identifier: 'sponsors-badge', + referenceType: 'full', + alt: 'Sponsors' + } + ] + }, + {type: 'text', value: '\n'}, + { + type: 'linkReference', + identifier: 'collective', + referenceType: 'full', + children: [ + { + type: 'imageReference', + identifier: 'backers-badge', + referenceType: 'full', + alt: 'Backers' + } + ] + }, + {type: 'text', value: '\n'}, + { + type: 'linkReference', + identifier: 'chat', + referenceType: 'full', + children: [ + { + type: 'imageReference', + identifier: 'chat-badge', + referenceType: 'full', + alt: 'Chat' + } + ] + } + ] + }, + ...summaryContent, + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Contents'}] + }, + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'What is this?'}] + }, + { + type: 'paragraph', + children: [ + {type: 'text', value: 'This package is a '}, + { + type: 'linkReference', + identifier: 'unified', + referenceType: 'collapsed', + children: [{type: 'text', value: 'unified'}] + }, + {type: 'text', value: ' ('}, + { + type: 'linkReference', + identifier: 'remark', + referenceType: 'collapsed', + children: [{type: 'text', value: 'remark'}] + }, + { + type: 'text', + value: ') plugin, specifically a ' + }, + { + type: 'inlineCode', + value: 'remark-lint' + }, + { + type: 'text', + value: '\nrule.\nLint rules check markdown code style.' + } + ] + }, + ...(categories['when-should-i-use-this'] || []), + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Presets'}] + } + ) if (includes.length === 0) { children.push({ @@ -195,7 +289,7 @@ presets(root).then((presetObjects) => { children: [ { type: 'text', - value: 'This rule is not included in any default preset' + value: 'This rule is not included in a preset maintained here.' } ] }) @@ -261,6 +355,216 @@ presets(root).then((presetObjects) => { ) } + children.push( + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Install'}] + }, + { + type: 'paragraph', + children: [ + {type: 'text', value: 'This package is '}, + { + type: 'linkReference', + identifier: 'esm', + referenceType: 'full', + children: [{type: 'text', value: 'ESM only'}] + }, + { + type: 'text', + value: + '.\nIn Node.js (version 12.20+, 14.14+, or 16.0+), ' + + 'install with ' + }, + { + type: 'linkReference', + identifier: 'npm', + referenceType: 'collapsed', + children: [{type: 'text', value: 'npm'}] + }, + {type: 'text', value: ':'} + ] + }, + {type: 'code', lang: 'sh', value: 'npm install ' + basename}, + { + type: 'paragraph', + children: [ + {type: 'text', value: 'In Deno with '}, + { + type: 'linkReference', + identifier: 'skypack', + label: 'Skypack', + referenceType: 'collapsed', + children: [{type: 'text', value: 'Skypack'}] + }, + {type: 'text', value: ':'} + ] + }, + { + type: 'code', + lang: 'js', + value: + 'import ' + + camelcased + + " from 'https://cdn.skypack.dev/" + + basename + + '@' + + version + + "?dts'" + }, + { + type: 'paragraph', + children: [ + {type: 'text', value: 'In browsers with '}, + { + type: 'linkReference', + identifier: 'skypack', + label: 'Skypack', + referenceType: 'collapsed', + children: [{type: 'text', value: 'Skypack'}] + }, + {type: 'text', value: ':'} + ] + }, + { + type: 'code', + lang: 'html', + value: + '" + }, + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Use'}] + }, + { + type: 'paragraph', + children: [{type: 'text', value: 'On the API:'}] + }, + { + type: 'code', + lang: 'js', + value: [ + "import {read} from 'to-vfile'", + "import {reporter} from 'vfile-reporter'", + "import {remark} from 'remark'", + "import remarkLint from 'remark-lint'", + 'import ' + camelcased + " from '" + basename + "'", + '', + 'main()', + '', + 'async function main() {', + ' const file = await remark()', + ' .use(remarkLint)', + ' .use(' + camelcased + ')', + " .process(await read('example.md'))", + '', + ' console.error(reporter(file))', + '}' + ].join('\n') + }, + { + type: 'paragraph', + children: [{type: 'text', value: 'On the CLI:'}] + }, + { + type: 'code', + lang: 'sh', + value: 'remark --use remark-lint --use ' + basename + ' example.md' + }, + { + type: 'paragraph', + children: [ + { + type: 'text', + value: 'On the CLI in a config file (here a ' + }, + { + type: 'inlineCode', + value: 'package.json' + }, + { + type: 'text', + value: '):' + } + ] + }, + { + type: 'code', + lang: 'diff', + value: [ + ' …', + ' "remarkConfig": {', + ' "plugins": [', + ' …', + ' "remark-lint",', + '+ "' + basename + '",', + ' …', + ' ]', + ' }', + ' …' + ].join('\n') + } + ) + + if ('api' in categories) { + const [apiHeading, ...apiBody] = categories.api + + children.push( + apiHeading, + { + type: 'paragraph', + children: [ + { + type: 'text', + value: + 'This package exports no identifiers.\nThe default export is ' + }, + {type: 'inlineCode', value: camelcased}, + {type: 'text', value: '.'} + ] + }, + { + type: 'heading', + depth: 3, + children: [ + { + type: 'inlineCode', + value: 'unified().use(' + camelcased + '[, config])' + } + ] + }, + { + type: 'paragraph', + children: [ + { + type: 'text', + value: + 'This rule supports standard configuration that all remark lint rules accept\n(such as ' + }, + {type: 'inlineCode', value: 'false'}, + {type: 'text', value: ' to turn it off or '}, + {type: 'inlineCode', value: '[1, options]'}, + {type: 'text', value: ' to configure it).'} + ] + }, + ...apiBody + ) + } + + children.push( + ...(categories.recommendation || []), + ...(categories.fix || []), + ...(categories.example || []) + ) + let first = true /** @type {string} */ let setting @@ -273,7 +577,7 @@ presets(root).then((presetObjects) => { children.push({ type: 'heading', depth: 2, - children: [{type: 'text', value: 'Example'}] + children: [{type: 'text', value: 'Examples'}] }) first = false } @@ -318,17 +622,28 @@ presets(root).then((presetObjects) => { if (fixture.gfm) { hasGfm = true children.push({ - type: 'paragraph', + type: 'blockquote', children: [ - {type: 'text', value: 'Note: this example uses '}, { - type: 'linkReference', - label: 'GFM', - identifier: 'gfm', - referenceType: 'collapsed', - children: [{type: 'text', value: 'GFM'}] - }, - {type: 'text', value: '.'} + type: 'paragraph', + children: [ + {type: 'text', value: '👉 '}, + { + type: 'strong', + children: [{type: 'text', value: 'Note'}] + }, + {type: 'text', value: ': this example uses GFM ('}, + { + type: 'linkReference', + identifier: 'gfm', + referenceType: 'full', + children: [ + {type: 'inlineCode', value: 'remark-gfm'} + ] + }, + {type: 'text', value: ').'} + ] + } ] }) } @@ -340,11 +655,24 @@ presets(root).then((presetObjects) => { if (clean !== next) { children.push({ - type: 'paragraph', + type: 'blockquote', children: [ - {type: 'text', value: 'Note: '}, - {type: 'inlineCode', value: char.char}, - {type: 'text', value: ' represents ' + char.name + '.'} + { + type: 'paragraph', + children: [ + {type: 'text', value: '👉 '}, + { + type: 'strong', + children: [{type: 'text', value: 'Note'}] + }, + {type: 'text', value: ': '}, + {type: 'inlineCode', value: char.char}, + { + type: 'text', + value: ' represents ' + char.name + '.' + } + ] + } ] }) @@ -386,171 +714,76 @@ presets(root).then((presetObjects) => { { type: 'heading', depth: 2, - children: [{type: 'text', value: 'Install'}] + children: [{type: 'text', value: 'Compatibility'}] }, { type: 'paragraph', children: [ - {type: 'text', value: 'This package is '}, - { - type: 'linkReference', - identifier: 'esm', - referenceType: 'full', - children: [{type: 'text', value: 'ESM only'}] - }, { type: 'text', - value: ':\nNode 12+ is needed to use it and it must be ' - }, - {type: 'inlineCode', value: 'imported'}, - {type: 'text', value: 'ed instead of '}, - {type: 'inlineCode', value: 'required'}, - {type: 'text', value: 'd.'} + value: + 'Projects maintained by the unified collective are compatible with all maintained\nversions of Node.js.\nAs of now, that is Node.js 12.20+, 14.14+, and 16.0+.\nOur projects sometimes work with older versions, but this is not guaranteed.' + } ] }, + { + type: 'heading', + depth: 2, + children: [{type: 'text', value: 'Contribute'}] + }, { type: 'paragraph', children: [ + {type: 'text', value: 'See '}, { type: 'linkReference', - identifier: 'npm', referenceType: 'collapsed', - children: [{type: 'text', value: 'npm'}] + identifier: 'contributing', + children: [{type: 'inlineCode', value: 'contributing.md'}] }, - {type: 'text', value: ':'} - ] - }, - {type: 'code', lang: 'sh', value: 'npm install ' + basename}, - { - type: 'paragraph', - children: [ + {type: 'text', value: ' in '}, { - type: 'text', - value: - 'This package exports no identifiers.\nThe default export is ' + type: 'linkReference', + referenceType: 'collapsed', + identifier: 'health', + children: [ + { + type: 'inlineCode', + value: health.split('/').slice(-2).join('/') + } + ] }, + {type: 'text', value: ' for ways\nto get started.\nSee '}, { - type: 'inlineCode', - value: basename.replace(/-(\w)/g, (_, /** @type {string} */ $1) => - $1.toUpperCase() - ) + type: 'linkReference', + referenceType: 'collapsed', + identifier: 'support', + children: [{type: 'inlineCode', value: 'support.md'}] }, - {type: 'text', value: '.'} + {type: 'text', value: ' for ways to get help.'} ] }, - {type: 'heading', depth: 2, children: [{type: 'text', value: 'Use'}]}, { type: 'paragraph', children: [ + {type: 'text', value: 'This project has a '}, + { + type: 'linkReference', + referenceType: 'collapsed', + identifier: 'coc', + children: [{type: 'text', value: 'code of conduct'}] + }, { type: 'text', value: - 'You probably want to use it on the CLI through a config file:' + '.\nBy interacting with this repository, organization, or community you agree to\nabide by its terms.' } ] - }, - { - type: 'code', - lang: 'diff', - value: [ - ' …', - ' "remarkConfig": {', - ' "plugins": [', - ' …', - ' "lint",', - '+ "' + short + '",', - ' …', - ' ]', - ' }', - ' …' - ].join('\n') - }, - { - type: 'paragraph', - children: [{type: 'text', value: 'Or use it on the CLI directly'}] - }, - { - type: 'code', - lang: 'sh', - value: 'remark -u lint -u ' + short + ' readme.md' - }, - { - type: 'paragraph', - children: [{type: 'text', value: 'Or use this on the API:'}] - }, - { - type: 'code', - lang: 'diff', - value: [ - " import {remark} from 'remark'", - " import {reporter} from 'vfile-reporter'", - " import remarkLint from 'remark-lint'", - ' import ' + camelcased + " from '" + basename + "'", - '', - ' remark()', - ' .use(remarkLint)', - '+ .use(' + camelcased + ')', - " .process('_Emphasis_ and **importance**')", - ' .then((file) => {', - ' console.error(reporter(file))', - ' })' - ].join('\n') } ) } children.push( - { - type: 'heading', - depth: 2, - children: [{type: 'text', value: 'Contribute'}] - }, - { - type: 'paragraph', - children: [ - {type: 'text', value: 'See '}, - { - type: 'linkReference', - referenceType: 'collapsed', - identifier: 'contributing', - children: [{type: 'inlineCode', value: 'contributing.md'}] - }, - {type: 'text', value: ' in '}, - { - type: 'linkReference', - referenceType: 'collapsed', - identifier: 'health', - children: [ - {type: 'inlineCode', value: health.split('/').slice(-2).join('/')} - ] - }, - {type: 'text', value: ' for ways\nto get started.\nSee '}, - { - type: 'linkReference', - referenceType: 'collapsed', - identifier: 'support', - children: [{type: 'inlineCode', value: 'support.md'}] - }, - {type: 'text', value: ' for ways to get help.'} - ] - }, - { - type: 'paragraph', - children: [ - {type: 'text', value: 'This project has a '}, - { - type: 'linkReference', - referenceType: 'collapsed', - identifier: 'coc', - children: [{type: 'text', value: 'code of conduct'}] - }, - { - type: 'text', - value: - '.\nBy interacting with this repository, organization, or community you agree to\nabide by its terms.' - } - ] - }, {type: 'heading', depth: 2, children: [{type: 'text', value: 'License'}]}, { type: 'paragraph', @@ -571,110 +804,130 @@ presets(root).then((presetObjects) => { ] } ] - }, - { - type: 'definition', - identifier: 'build-badge', - url: 'https://github.com/' + slug + '/workflows/main/badge.svg' - }, - { - type: 'definition', - identifier: 'build', - url: 'https://github.com/' + slug + '/actions' - }, - { - type: 'definition', - identifier: 'coverage-badge', - url: 'https://img.shields.io/codecov/c/github/' + slug + '.svg' - }, - { - type: 'definition', - identifier: 'coverage', - url: 'https://codecov.io/github/' + slug - }, - { - type: 'definition', - identifier: 'downloads-badge', - url: 'https://img.shields.io/npm/dm/' + basename + '.svg' - }, - { - type: 'definition', - identifier: 'downloads', - url: 'https://www.npmjs.com/package/' + basename - }, - { - type: 'definition', - identifier: 'size-badge', - url: 'https://img.shields.io/bundlephobia/minzip/' + basename + '.svg' - }, - { - type: 'definition', - identifier: 'size', - url: 'https://bundlephobia.com/result?p=' + basename - }, - { - type: 'definition', - identifier: 'sponsors-badge', - url: 'https://opencollective.com/unified/sponsors/badge.svg' - }, - { - type: 'definition', - identifier: 'backers-badge', - url: 'https://opencollective.com/unified/backers/badge.svg' - }, - { - type: 'definition', - identifier: 'collective', - url: 'https://opencollective.com/unified' - }, - { - type: 'definition', - identifier: 'chat-badge', - url: 'https://img.shields.io/badge/chat-discussions-success.svg' - }, - { - type: 'definition', - identifier: 'chat', - url: 'https://github.com/remarkjs/remark/discussions' } ) if (!info.deprecated) { children.push( + { + type: 'definition', + identifier: 'build-badge', + url: 'https://github.com/' + slug + '/workflows/main/badge.svg' + }, + { + type: 'definition', + identifier: 'build', + url: 'https://github.com/' + slug + '/actions' + }, + { + type: 'definition', + identifier: 'coverage-badge', + url: 'https://img.shields.io/codecov/c/github/' + slug + '.svg' + }, + { + type: 'definition', + identifier: 'coverage', + url: 'https://codecov.io/github/' + slug + }, + { + type: 'definition', + identifier: 'downloads-badge', + url: 'https://img.shields.io/npm/dm/' + basename + '.svg' + }, + { + type: 'definition', + identifier: 'downloads', + url: 'https://www.npmjs.com/package/' + basename + }, + { + type: 'definition', + identifier: 'size-badge', + url: 'https://img.shields.io/bundlephobia/minzip/' + basename + '.svg' + }, + { + type: 'definition', + identifier: 'size', + url: 'https://bundlephobia.com/result?p=' + basename + }, + { + type: 'definition', + identifier: 'sponsors-badge', + url: 'https://opencollective.com/unified/sponsors/badge.svg' + }, + { + type: 'definition', + identifier: 'backers-badge', + url: 'https://opencollective.com/unified/backers/badge.svg' + }, + { + type: 'definition', + identifier: 'collective', + url: 'https://opencollective.com/unified' + }, + { + type: 'definition', + identifier: 'chat-badge', + url: 'https://img.shields.io/badge/chat-discussions-success.svg' + }, + { + type: 'definition', + identifier: 'chat', + url: 'https://github.com/remarkjs/remark/discussions' + }, + { + type: 'definition', + identifier: 'unified', + url: 'https://github.com/unifiedjs/unified' + }, + { + type: 'definition', + identifier: 'remark', + url: 'https://github.com/remarkjs/remark' + }, + { + type: 'definition', + identifier: 'mono', + url: 'https://github.com/' + slug + }, { type: 'definition', identifier: 'esm', url: 'https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c' }, + { + type: 'definition', + identifier: 'skypack', + url: 'https://www.skypack.dev' + }, { type: 'definition', identifier: 'npm', url: 'https://docs.npmjs.com/cli/install' + }, + { + type: 'definition', + identifier: 'health', + url: health + }, + { + type: 'definition', + identifier: 'contributing', + url: hMain + '/contributing.md' + }, + { + type: 'definition', + identifier: 'support', + url: hMain + '/support.md' + }, + { + type: 'definition', + identifier: 'coc', + url: hMain + '/code-of-conduct.md' } ) } children.push( - { - type: 'definition', - identifier: 'health', - url: health - }, - { - type: 'definition', - identifier: 'contributing', - url: hMain + '/contributing.md' - }, - { - type: 'definition', - identifier: 'support', - url: hMain + '/support.md' - }, - { - type: 'definition', - identifier: 'coc', - url: hMain + '/code-of-conduct.md' - }, { type: 'definition', identifier: 'license', diff --git a/script/plugin/list-of-rules.js b/script/plugin/list-of-rules.js index c8b83e40..9ccc8b42 100644 --- a/script/plugin/list-of-rules.js +++ b/script/plugin/list-of-rules.js @@ -25,7 +25,6 @@ export default function listOfRules() { spread: false, children: rules(root) .map((basename) => { - const name = basename.slice('remark-lint-'.length) /** @type {PackageJson} */ const pack = JSON.parse( String(fs.readFileSync(path.join(root, basename, 'package.json'))) @@ -49,7 +48,7 @@ export default function listOfRules() { { type: 'link', url: repoUrl(pack), - children: [{type: 'inlineCode', value: name}] + children: [{type: 'inlineCode', value: basename}] }, {type: 'text', value: ' — ' + description} ] diff --git a/script/util/rule.js b/script/util/rule.js index d5456074..8c9ed05b 100755 --- a/script/util/rule.js +++ b/script/util/rule.js @@ -2,6 +2,7 @@ * @typedef Rule * @property {string} ruleId * @property {string} description + * @property {string|undefined} summary * @property {boolean} deprecated * @property {Record} tests * @property {string} filePath @@ -27,15 +28,15 @@ import strip from 'strip-indent' * @param {string} filePath * @returns {Rule} */ -/* eslint-disable-next-line complexity */ export function rule(filePath) { const ruleId = path.basename(filePath).slice('remark-lint-'.length) /** @type {Record} */ const tests = {} const code = fs.readFileSync(path.join(filePath, 'index.js'), 'utf-8') - const tags = parse(code, {spacing: 'preserve'})[0].tags + const fileInfo = parse(code, {spacing: 'preserve'})[0] + const tags = fileInfo.tags const moduleTag = tags.find((d) => d.tag === 'module') - const fileoverviewTag = tags.find((d) => d.tag === 'fileoverview') + const summaryTag = tags.find((d) => d.tag === 'summary') const deprecatedTag = tags.find((d) => d.tag === 'deprecated') /* c8 ignore next 3 */ @@ -43,15 +44,9 @@ export function rule(filePath) { throw new Error('Expected `@module` in JSDoc') } - /* c8 ignore next 3 */ - if (!fileoverviewTag && !deprecatedTag) { - throw new Error('Expected `@fileoverview` (or `@deprecated`) in JSDoc') - } - const name = moduleTag.name let description = - (fileoverviewTag && fileoverviewTag.description) || - (deprecatedTag && deprecatedTag.description) + (deprecatedTag && deprecatedTag.description) || fileInfo.description /* c8 ignore next 3 */ if (name !== ruleId) { @@ -60,7 +55,7 @@ export function rule(filePath) { /* c8 ignore next 3 */ if (!description) { - throw new Error(ruleId + ' is missing a `@fileoverview` or `@deprecated`') + throw new Error(ruleId + ' is missing a description or `@deprecated`') } description = strip(description) @@ -69,6 +64,7 @@ export function rule(filePath) { const result = { ruleId, description: description.trim(), + summary: summaryTag ? strip(summaryTag.description).trim() : undefined, deprecated: Boolean(deprecatedTag), tests, filePath