@redocly/recheck 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1023 -56
- package/dist/cli.js +40 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/markdoc-schema.d.ts +17 -0
- package/dist/commands/markdoc-schema.d.ts.map +1 -0
- package/dist/commands/markdoc-schema.js +127 -0
- package/dist/commands/markdoc-schema.js.map +1 -0
- package/dist/commands/run.d.ts +2 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +87 -10
- package/dist/commands/run.js.map +1 -1
- package/dist/config/load.d.ts +11 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +12 -2
- package/dist/config/load.js.map +1 -1
- package/dist/config/presets/google.d.ts +3 -0
- package/dist/config/presets/google.d.ts.map +1 -0
- package/dist/config/presets/google.js +1671 -0
- package/dist/config/presets/google.js.map +1 -0
- package/dist/config/presets/inclusive-language.d.ts +3 -0
- package/dist/config/presets/inclusive-language.d.ts.map +1 -0
- package/dist/config/presets/inclusive-language.js +321 -0
- package/dist/config/presets/inclusive-language.js.map +1 -0
- package/dist/config/presets/index.d.ts +67 -0
- package/dist/config/presets/index.d.ts.map +1 -0
- package/dist/config/presets/index.js +137 -0
- package/dist/config/presets/index.js.map +1 -0
- package/dist/config/presets/markdoc.d.ts +21 -0
- package/dist/config/presets/markdoc.d.ts.map +1 -0
- package/dist/config/presets/markdoc.js +101 -0
- package/dist/config/presets/markdoc.js.map +1 -0
- package/dist/config/presets/markdown-relaxed.d.ts +3 -0
- package/dist/config/presets/markdown-relaxed.d.ts.map +1 -0
- package/dist/config/presets/markdown-relaxed.js +98 -0
- package/dist/config/presets/markdown-relaxed.js.map +1 -0
- package/dist/config/presets/markdown.d.ts +43 -0
- package/dist/config/presets/markdown.d.ts.map +1 -0
- package/dist/config/presets/markdown.js +132 -0
- package/dist/config/presets/markdown.js.map +1 -0
- package/dist/config/presets/microsoft.d.ts +3 -0
- package/dist/config/presets/microsoft.d.ts.map +1 -0
- package/dist/config/presets/microsoft.js +2268 -0
- package/dist/config/presets/microsoft.js.map +1 -0
- package/dist/config/presets/minimal.d.ts +3 -0
- package/dist/config/presets/minimal.d.ts.map +1 -0
- package/dist/config/presets/minimal.js +21 -0
- package/dist/config/presets/minimal.js.map +1 -0
- package/dist/config/presets/plain-language.d.ts +3 -0
- package/dist/config/presets/plain-language.d.ts.map +1 -0
- package/dist/config/presets/plain-language.js +351 -0
- package/dist/config/presets/plain-language.js.map +1 -0
- package/dist/config/presets/prose.d.ts +52 -0
- package/dist/config/presets/prose.d.ts.map +1 -0
- package/dist/config/presets/prose.js +138 -0
- package/dist/config/presets/prose.js.map +1 -0
- package/dist/config/schema.d.ts +128 -22
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +105 -21
- package/dist/config/schema.js.map +1 -1
- package/dist/config/validate.d.ts +12 -2
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +1200 -44
- package/dist/config/validate.js.map +1 -1
- package/dist/core/auto-fix.d.ts +8 -13
- package/dist/core/auto-fix.d.ts.map +1 -1
- package/dist/core/auto-fix.js +94 -75
- package/dist/core/auto-fix.js.map +1 -1
- package/dist/core/case-preserve.d.ts +46 -0
- package/dist/core/case-preserve.d.ts.map +1 -0
- package/dist/core/case-preserve.js +57 -0
- package/dist/core/case-preserve.js.map +1 -0
- package/dist/core/directives.d.ts +9 -0
- package/dist/core/directives.d.ts.map +1 -0
- package/dist/core/directives.js +73 -0
- package/dist/core/directives.js.map +1 -0
- package/dist/core/files.d.ts +63 -0
- package/dist/core/files.d.ts.map +1 -1
- package/dist/core/files.js +185 -0
- package/dist/core/files.js.map +1 -1
- package/dist/core/inline-code.d.ts +87 -0
- package/dist/core/inline-code.d.ts.map +1 -0
- package/dist/core/inline-code.js +104 -0
- package/dist/core/inline-code.js.map +1 -0
- package/dist/core/line-endings.d.ts +32 -0
- package/dist/core/line-endings.d.ts.map +1 -0
- package/dist/core/line-endings.js +65 -0
- package/dist/core/line-endings.js.map +1 -0
- package/dist/core/markdoc-tags.d.ts +79 -0
- package/dist/core/markdoc-tags.d.ts.map +1 -0
- package/dist/core/markdoc-tags.js +131 -0
- package/dist/core/markdoc-tags.js.map +1 -0
- package/dist/core/rule-filters.d.ts +17 -0
- package/dist/core/rule-filters.d.ts.map +1 -1
- package/dist/core/rule-filters.js +64 -0
- package/dist/core/rule-filters.js.map +1 -1
- package/dist/core/runner.d.ts +92 -3
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +348 -110
- package/dist/core/runner.js.map +1 -1
- package/dist/core/timing.d.ts.map +1 -1
- package/dist/data/markdoc-realm-schema.d.ts +3 -0
- package/dist/data/markdoc-realm-schema.d.ts.map +1 -0
- package/dist/data/markdoc-realm-schema.js +760 -0
- package/dist/data/markdoc-realm-schema.js.map +1 -0
- package/dist/data/proper-nouns.d.ts +2 -0
- package/dist/data/proper-nouns.d.ts.map +1 -0
- package/dist/data/proper-nouns.js +47 -0
- package/dist/data/proper-nouns.js.map +1 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/formulas.d.ts +17 -0
- package/dist/metrics/formulas.d.ts.map +1 -0
- package/dist/metrics/formulas.js +70 -0
- package/dist/metrics/formulas.js.map +1 -0
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/statistics.d.ts +27 -0
- package/dist/metrics/statistics.d.ts.map +1 -0
- package/dist/metrics/statistics.js +56 -0
- package/dist/metrics/statistics.js.map +1 -0
- package/dist/parser/index.d.ts +18 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +168 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/markdoc/extract-statics.d.ts +45 -0
- package/dist/parser/markdoc/extract-statics.d.ts.map +1 -0
- package/dist/parser/markdoc/extract-statics.js +139 -0
- package/dist/parser/markdoc/extract-statics.js.map +1 -0
- package/dist/parser/markdoc/pairing.d.ts +63 -0
- package/dist/parser/markdoc/pairing.d.ts.map +1 -0
- package/dist/parser/markdoc/pairing.js +94 -0
- package/dist/parser/markdoc/pairing.js.map +1 -0
- package/dist/parser/markdoc/schema.d.ts +85 -0
- package/dist/parser/markdoc/schema.d.ts.map +1 -0
- package/dist/parser/markdoc/schema.js +86 -0
- package/dist/parser/markdoc/schema.js.map +1 -0
- package/dist/parser/markdoc/span.d.ts +64 -0
- package/dist/parser/markdoc/span.d.ts.map +1 -0
- package/dist/parser/markdoc/span.js +729 -0
- package/dist/parser/markdoc/span.js.map +1 -0
- package/dist/parser/markdoc/structure.d.ts +28 -0
- package/dist/parser/markdoc/structure.d.ts.map +1 -0
- package/dist/parser/markdoc/structure.js +153 -0
- package/dist/parser/markdoc/structure.js.map +1 -0
- package/dist/parser/markdoc/syntax.d.ts +44 -0
- package/dist/parser/markdoc/syntax.d.ts.map +1 -0
- package/dist/parser/markdoc/syntax.js +317 -0
- package/dist/parser/markdoc/syntax.js.map +1 -0
- package/dist/parser/types.d.ts +18 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/reporter/fixes.d.ts.map +1 -1
- package/dist/reporter/fixes.js +22 -1
- package/dist/reporter/fixes.js.map +1 -1
- package/dist/reporter/statistics.d.ts +1 -8
- package/dist/reporter/statistics.d.ts.map +1 -1
- package/dist/reporter/statistics.js.map +1 -1
- package/dist/rules/registry.d.ts +15 -0
- package/dist/rules/registry.d.ts.map +1 -0
- package/dist/rules/registry.js +81 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/scope/capitalization.d.ts +3 -0
- package/dist/rules/scope/capitalization.d.ts.map +1 -0
- package/dist/rules/scope/capitalization.js +163 -0
- package/dist/rules/scope/capitalization.js.map +1 -0
- package/dist/rules/scope/conditional.d.ts +3 -0
- package/dist/rules/scope/conditional.d.ts.map +1 -0
- package/dist/rules/scope/conditional.js +112 -0
- package/dist/rules/scope/conditional.js.map +1 -0
- package/dist/rules/scope/consistency.d.ts +3 -0
- package/dist/rules/scope/consistency.d.ts.map +1 -0
- package/dist/rules/scope/consistency.js +178 -0
- package/dist/rules/scope/consistency.js.map +1 -0
- package/dist/rules/scope/length.d.ts +3 -0
- package/dist/rules/scope/length.d.ts.map +1 -0
- package/dist/rules/scope/length.js +69 -0
- package/dist/rules/scope/length.js.map +1 -0
- package/dist/rules/scope/max-image-size.d.ts +3 -0
- package/dist/rules/scope/max-image-size.d.ts.map +1 -0
- package/dist/rules/scope/max-image-size.js +65 -0
- package/dist/rules/scope/max-image-size.js.map +1 -0
- package/dist/rules/scope/metric.d.ts +17 -0
- package/dist/rules/scope/metric.d.ts.map +1 -0
- package/dist/rules/scope/metric.js +216 -0
- package/dist/rules/scope/metric.js.map +1 -0
- package/dist/rules/scope/occurrence.d.ts +3 -0
- package/dist/rules/scope/occurrence.d.ts.map +1 -0
- package/dist/rules/scope/occurrence.js +48 -0
- package/dist/rules/scope/occurrence.js.map +1 -0
- package/dist/rules/scope/pattern.d.ts +3 -0
- package/dist/rules/scope/pattern.d.ts.map +1 -0
- package/dist/rules/scope/pattern.js +75 -0
- package/dist/rules/scope/pattern.js.map +1 -0
- package/dist/rules/scope/repetition.d.ts +3 -0
- package/dist/rules/scope/repetition.d.ts.map +1 -0
- package/dist/rules/scope/repetition.js +139 -0
- package/dist/rules/scope/repetition.js.map +1 -0
- package/dist/rules/scope/semantic-line-breaks.d.ts +3 -0
- package/dist/rules/scope/semantic-line-breaks.d.ts.map +1 -0
- package/dist/rules/scope/semantic-line-breaks.js +213 -0
- package/dist/rules/scope/semantic-line-breaks.js.map +1 -0
- package/dist/rules/scope/spelling.d.ts +27 -0
- package/dist/rules/scope/spelling.d.ts.map +1 -0
- package/dist/rules/scope/spelling.js +227 -0
- package/dist/rules/scope/spelling.js.map +1 -0
- package/dist/rules/scope/swap.d.ts +3 -0
- package/dist/rules/scope/swap.d.ts.map +1 -0
- package/dist/rules/scope/swap.js +149 -0
- package/dist/rules/scope/swap.js.map +1 -0
- package/dist/rules/scope/title-case.d.ts +46 -0
- package/dist/rules/scope/title-case.d.ts.map +1 -0
- package/dist/rules/scope/title-case.js +301 -0
- package/dist/rules/scope/title-case.js.map +1 -0
- package/dist/rules/token/blanks-around-fences.d.ts +3 -0
- package/dist/rules/token/blanks-around-fences.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-fences.js +44 -0
- package/dist/rules/token/blanks-around-fences.js.map +1 -0
- package/dist/rules/token/blanks-around-headings.d.ts +3 -0
- package/dist/rules/token/blanks-around-headings.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-headings.js +108 -0
- package/dist/rules/token/blanks-around-headings.js.map +1 -0
- package/dist/rules/token/blanks-around-lists.d.ts +3 -0
- package/dist/rules/token/blanks-around-lists.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-lists.js +56 -0
- package/dist/rules/token/blanks-around-lists.js.map +1 -0
- package/dist/rules/token/blanks-around-tables.d.ts +3 -0
- package/dist/rules/token/blanks-around-tables.d.ts.map +1 -0
- package/dist/rules/token/blanks-around-tables.js +42 -0
- package/dist/rules/token/blanks-around-tables.js.map +1 -0
- package/dist/rules/token/code-block-style.d.ts +3 -0
- package/dist/rules/token/code-block-style.d.ts.map +1 -0
- package/dist/rules/token/code-block-style.js +30 -0
- package/dist/rules/token/code-block-style.js.map +1 -0
- package/dist/rules/token/code-fence-style.d.ts +3 -0
- package/dist/rules/token/code-fence-style.d.ts.map +1 -0
- package/dist/rules/token/code-fence-style.js +35 -0
- package/dist/rules/token/code-fence-style.js.map +1 -0
- package/dist/rules/token/commands-show-output.d.ts +3 -0
- package/dist/rules/token/commands-show-output.d.ts.map +1 -0
- package/dist/rules/token/commands-show-output.js +38 -0
- package/dist/rules/token/commands-show-output.js.map +1 -0
- package/dist/rules/token/descriptive-link-text.d.ts +3 -0
- package/dist/rules/token/descriptive-link-text.d.ts.map +1 -0
- package/dist/rules/token/descriptive-link-text.js +53 -0
- package/dist/rules/token/descriptive-link-text.js.map +1 -0
- package/dist/rules/token/emphasis-style.d.ts +3 -0
- package/dist/rules/token/emphasis-style.d.ts.map +1 -0
- package/dist/rules/token/emphasis-style.js +51 -0
- package/dist/rules/token/emphasis-style.js.map +1 -0
- package/dist/rules/token/fenced-code-language.d.ts +3 -0
- package/dist/rules/token/fenced-code-language.d.ts.map +1 -0
- package/dist/rules/token/fenced-code-language.js +35 -0
- package/dist/rules/token/fenced-code-language.js.map +1 -0
- package/dist/rules/token/first-line-h1.d.ts +3 -0
- package/dist/rules/token/first-line-h1.d.ts.map +1 -0
- package/dist/rules/token/first-line-h1.js +107 -0
- package/dist/rules/token/first-line-h1.js.map +1 -0
- package/dist/rules/token/heading-increment.d.ts +3 -0
- package/dist/rules/token/heading-increment.d.ts.map +1 -0
- package/dist/rules/token/heading-increment.js +27 -0
- package/dist/rules/token/heading-increment.js.map +1 -0
- package/dist/rules/token/heading-start-left.d.ts +3 -0
- package/dist/rules/token/heading-start-left.d.ts.map +1 -0
- package/dist/rules/token/heading-start-left.js +31 -0
- package/dist/rules/token/heading-start-left.js.map +1 -0
- package/dist/rules/token/heading-style.d.ts +3 -0
- package/dist/rules/token/heading-style.d.ts.map +1 -0
- package/dist/rules/token/heading-style.js +41 -0
- package/dist/rules/token/heading-style.js.map +1 -0
- package/dist/rules/token/helpers.d.ts +313 -0
- package/dist/rules/token/helpers.d.ts.map +1 -0
- package/dist/rules/token/helpers.js +746 -0
- package/dist/rules/token/helpers.js.map +1 -0
- package/dist/rules/token/hr-style.d.ts +3 -0
- package/dist/rules/token/hr-style.d.ts.map +1 -0
- package/dist/rules/token/hr-style.js +28 -0
- package/dist/rules/token/hr-style.js.map +1 -0
- package/dist/rules/token/index.d.ts +75 -0
- package/dist/rules/token/index.d.ts.map +1 -0
- package/dist/rules/token/index.js +226 -0
- package/dist/rules/token/index.js.map +1 -0
- package/dist/rules/token/line-length.d.ts +3 -0
- package/dist/rules/token/line-length.d.ts.map +1 -0
- package/dist/rules/token/line-length.js +120 -0
- package/dist/rules/token/line-length.js.map +1 -0
- package/dist/rules/token/link-fragments.d.ts +3 -0
- package/dist/rules/token/link-fragments.d.ts.map +1 -0
- package/dist/rules/token/link-fragments.js +145 -0
- package/dist/rules/token/link-fragments.js.map +1 -0
- package/dist/rules/token/link-image-reference-definitions.d.ts +3 -0
- package/dist/rules/token/link-image-reference-definitions.d.ts.map +1 -0
- package/dist/rules/token/link-image-reference-definitions.js +50 -0
- package/dist/rules/token/link-image-reference-definitions.js.map +1 -0
- package/dist/rules/token/link-image-style.d.ts +3 -0
- package/dist/rules/token/link-image-style.d.ts.map +1 -0
- package/dist/rules/token/link-image-style.js +131 -0
- package/dist/rules/token/link-image-style.js.map +1 -0
- package/dist/rules/token/list-indent.d.ts +3 -0
- package/dist/rules/token/list-indent.d.ts.map +1 -0
- package/dist/rules/token/list-indent.js +60 -0
- package/dist/rules/token/list-indent.js.map +1 -0
- package/dist/rules/token/list-length.d.ts +3 -0
- package/dist/rules/token/list-length.d.ts.map +1 -0
- package/dist/rules/token/list-length.js +55 -0
- package/dist/rules/token/list-length.js.map +1 -0
- package/dist/rules/token/list-marker-space.d.ts +3 -0
- package/dist/rules/token/list-marker-space.d.ts.map +1 -0
- package/dist/rules/token/list-marker-space.js +52 -0
- package/dist/rules/token/list-marker-space.js.map +1 -0
- package/dist/rules/token/markdoc-attributes.d.ts +3 -0
- package/dist/rules/token/markdoc-attributes.d.ts.map +1 -0
- package/dist/rules/token/markdoc-attributes.js +269 -0
- package/dist/rules/token/markdoc-attributes.js.map +1 -0
- package/dist/rules/token/markdoc-pairing.d.ts +3 -0
- package/dist/rules/token/markdoc-pairing.d.ts.map +1 -0
- package/dist/rules/token/markdoc-pairing.js +73 -0
- package/dist/rules/token/markdoc-pairing.js.map +1 -0
- package/dist/rules/token/markdoc-syntax.d.ts +3 -0
- package/dist/rules/token/markdoc-syntax.d.ts.map +1 -0
- package/dist/rules/token/markdoc-syntax.js +119 -0
- package/dist/rules/token/markdoc-syntax.js.map +1 -0
- package/dist/rules/token/markdoc-unknown-tag.d.ts +3 -0
- package/dist/rules/token/markdoc-unknown-tag.d.ts.map +1 -0
- package/dist/rules/token/markdoc-unknown-tag.js +64 -0
- package/dist/rules/token/markdoc-unknown-tag.js.map +1 -0
- package/dist/rules/token/messages.d.ts +4 -0
- package/dist/rules/token/messages.d.ts.map +1 -0
- package/dist/rules/token/messages.js +20 -0
- package/dist/rules/token/messages.js.map +1 -0
- package/dist/rules/token/no-alt-text.d.ts +3 -0
- package/dist/rules/token/no-alt-text.d.ts.map +1 -0
- package/dist/rules/token/no-alt-text.js +47 -0
- package/dist/rules/token/no-alt-text.js.map +1 -0
- package/dist/rules/token/no-bare-urls.d.ts +3 -0
- package/dist/rules/token/no-bare-urls.d.ts.map +1 -0
- package/dist/rules/token/no-bare-urls.js +88 -0
- package/dist/rules/token/no-bare-urls.js.map +1 -0
- package/dist/rules/token/no-blanks-blockquote.d.ts +3 -0
- package/dist/rules/token/no-blanks-blockquote.d.ts.map +1 -0
- package/dist/rules/token/no-blanks-blockquote.js +39 -0
- package/dist/rules/token/no-blanks-blockquote.js.map +1 -0
- package/dist/rules/token/no-duplicate-heading.d.ts +3 -0
- package/dist/rules/token/no-duplicate-heading.d.ts.map +1 -0
- package/dist/rules/token/no-duplicate-heading.js +101 -0
- package/dist/rules/token/no-duplicate-heading.js.map +1 -0
- package/dist/rules/token/no-duplicate-link-destinations.d.ts +3 -0
- package/dist/rules/token/no-duplicate-link-destinations.d.ts.map +1 -0
- package/dist/rules/token/no-duplicate-link-destinations.js +65 -0
- package/dist/rules/token/no-duplicate-link-destinations.js.map +1 -0
- package/dist/rules/token/no-emphasis-as-heading.d.ts +3 -0
- package/dist/rules/token/no-emphasis-as-heading.d.ts.map +1 -0
- package/dist/rules/token/no-emphasis-as-heading.js +44 -0
- package/dist/rules/token/no-emphasis-as-heading.js.map +1 -0
- package/dist/rules/token/no-empty-headings.d.ts +3 -0
- package/dist/rules/token/no-empty-headings.d.ts.map +1 -0
- package/dist/rules/token/no-empty-headings.js +28 -0
- package/dist/rules/token/no-empty-headings.js.map +1 -0
- package/dist/rules/token/no-empty-links.d.ts +3 -0
- package/dist/rules/token/no-empty-links.d.ts.map +1 -0
- package/dist/rules/token/no-empty-links.js +67 -0
- package/dist/rules/token/no-empty-links.js.map +1 -0
- package/dist/rules/token/no-hard-tabs.d.ts +3 -0
- package/dist/rules/token/no-hard-tabs.d.ts.map +1 -0
- package/dist/rules/token/no-hard-tabs.js +76 -0
- package/dist/rules/token/no-hard-tabs.js.map +1 -0
- package/dist/rules/token/no-inline-html.d.ts +3 -0
- package/dist/rules/token/no-inline-html.d.ts.map +1 -0
- package/dist/rules/token/no-inline-html.js +45 -0
- package/dist/rules/token/no-inline-html.js.map +1 -0
- package/dist/rules/token/no-missing-space-atx.d.ts +3 -0
- package/dist/rules/token/no-missing-space-atx.d.ts.map +1 -0
- package/dist/rules/token/no-missing-space-atx.js +36 -0
- package/dist/rules/token/no-missing-space-atx.js.map +1 -0
- package/dist/rules/token/no-missing-space-closed-atx.d.ts +3 -0
- package/dist/rules/token/no-missing-space-closed-atx.d.ts.map +1 -0
- package/dist/rules/token/no-missing-space-closed-atx.js +45 -0
- package/dist/rules/token/no-missing-space-closed-atx.js.map +1 -0
- package/dist/rules/token/no-multiple-blanks.d.ts +3 -0
- package/dist/rules/token/no-multiple-blanks.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-blanks.js +35 -0
- package/dist/rules/token/no-multiple-blanks.js.map +1 -0
- package/dist/rules/token/no-multiple-space-atx.d.ts +13 -0
- package/dist/rules/token/no-multiple-space-atx.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-atx.js +50 -0
- package/dist/rules/token/no-multiple-space-atx.js.map +1 -0
- package/dist/rules/token/no-multiple-space-blockquote.d.ts +3 -0
- package/dist/rules/token/no-multiple-space-blockquote.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-blockquote.js +43 -0
- package/dist/rules/token/no-multiple-space-blockquote.js.map +1 -0
- package/dist/rules/token/no-multiple-space-closed-atx.d.ts +3 -0
- package/dist/rules/token/no-multiple-space-closed-atx.d.ts.map +1 -0
- package/dist/rules/token/no-multiple-space-closed-atx.js +19 -0
- package/dist/rules/token/no-multiple-space-closed-atx.js.map +1 -0
- package/dist/rules/token/no-reversed-links.d.ts +3 -0
- package/dist/rules/token/no-reversed-links.d.ts.map +1 -0
- package/dist/rules/token/no-reversed-links.js +52 -0
- package/dist/rules/token/no-reversed-links.js.map +1 -0
- package/dist/rules/token/no-space-in-code.d.ts +3 -0
- package/dist/rules/token/no-space-in-code.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-code.js +75 -0
- package/dist/rules/token/no-space-in-code.js.map +1 -0
- package/dist/rules/token/no-space-in-emphasis.d.ts +3 -0
- package/dist/rules/token/no-space-in-emphasis.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-emphasis.js +79 -0
- package/dist/rules/token/no-space-in-emphasis.js.map +1 -0
- package/dist/rules/token/no-space-in-links.d.ts +3 -0
- package/dist/rules/token/no-space-in-links.d.ts.map +1 -0
- package/dist/rules/token/no-space-in-links.js +48 -0
- package/dist/rules/token/no-space-in-links.js.map +1 -0
- package/dist/rules/token/no-trailing-punctuation.d.ts +3 -0
- package/dist/rules/token/no-trailing-punctuation.d.ts.map +1 -0
- package/dist/rules/token/no-trailing-punctuation.js +38 -0
- package/dist/rules/token/no-trailing-punctuation.js.map +1 -0
- package/dist/rules/token/no-trailing-spaces.d.ts +3 -0
- package/dist/rules/token/no-trailing-spaces.d.ts.map +1 -0
- package/dist/rules/token/no-trailing-spaces.js +89 -0
- package/dist/rules/token/no-trailing-spaces.js.map +1 -0
- package/dist/rules/token/ol-prefix.d.ts +3 -0
- package/dist/rules/token/ol-prefix.d.ts.map +1 -0
- package/dist/rules/token/ol-prefix.js +70 -0
- package/dist/rules/token/ol-prefix.js.map +1 -0
- package/dist/rules/token/proper-names.d.ts +3 -0
- package/dist/rules/token/proper-names.d.ts.map +1 -0
- package/dist/rules/token/proper-names.js +93 -0
- package/dist/rules/token/proper-names.js.map +1 -0
- package/dist/rules/token/reference-links-images.d.ts +3 -0
- package/dist/rules/token/reference-links-images.d.ts.map +1 -0
- package/dist/rules/token/reference-links-images.js +36 -0
- package/dist/rules/token/reference-links-images.js.map +1 -0
- package/dist/rules/token/required-headings.d.ts +3 -0
- package/dist/rules/token/required-headings.d.ts.map +1 -0
- package/dist/rules/token/required-headings.js +83 -0
- package/dist/rules/token/required-headings.js.map +1 -0
- package/dist/rules/token/single-h1.d.ts +3 -0
- package/dist/rules/token/single-h1.d.ts.map +1 -0
- package/dist/rules/token/single-h1.js +56 -0
- package/dist/rules/token/single-h1.js.map +1 -0
- package/dist/rules/token/single-trailing-newline.d.ts +3 -0
- package/dist/rules/token/single-trailing-newline.d.ts.map +1 -0
- package/dist/rules/token/single-trailing-newline.js +25 -0
- package/dist/rules/token/single-trailing-newline.js.map +1 -0
- package/dist/rules/token/strong-style.d.ts +3 -0
- package/dist/rules/token/strong-style.d.ts.map +1 -0
- package/dist/rules/token/strong-style.js +51 -0
- package/dist/rules/token/strong-style.js.map +1 -0
- package/dist/rules/token/table-column-count.d.ts +3 -0
- package/dist/rules/token/table-column-count.d.ts.map +1 -0
- package/dist/rules/token/table-column-count.js +44 -0
- package/dist/rules/token/table-column-count.js.map +1 -0
- package/dist/rules/token/table-column-style.d.ts +3 -0
- package/dist/rules/token/table-column-style.d.ts.map +1 -0
- package/dist/rules/token/table-column-style.js +179 -0
- package/dist/rules/token/table-column-style.js.map +1 -0
- package/dist/rules/token/table-pipe-style.d.ts +3 -0
- package/dist/rules/token/table-pipe-style.d.ts.map +1 -0
- package/dist/rules/token/table-pipe-style.js +54 -0
- package/dist/rules/token/table-pipe-style.js.map +1 -0
- package/dist/rules/token/ul-indent.d.ts +3 -0
- package/dist/rules/token/ul-indent.d.ts.map +1 -0
- package/dist/rules/token/ul-indent.js +72 -0
- package/dist/rules/token/ul-indent.js.map +1 -0
- package/dist/rules/token/ul-style.d.ts +3 -0
- package/dist/rules/token/ul-style.d.ts.map +1 -0
- package/dist/rules/token/ul-style.js +80 -0
- package/dist/rules/token/ul-style.js.map +1 -0
- package/dist/rules/types.d.ts +81 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/utils.d.ts +29 -0
- package/dist/rules/utils.d.ts.map +1 -0
- package/dist/{assertions → rules}/utils.js +27 -0
- package/dist/rules/utils.js.map +1 -0
- package/dist/scopes/extractor.d.ts +7 -0
- package/dist/scopes/extractor.d.ts.map +1 -0
- package/dist/scopes/extractor.js +475 -0
- package/dist/scopes/extractor.js.map +1 -0
- package/dist/scopes/selector.d.ts +51 -0
- package/dist/scopes/selector.d.ts.map +1 -0
- package/dist/scopes/selector.js +121 -0
- package/dist/scopes/selector.js.map +1 -0
- package/dist/scopes/sentences.d.ts +15 -0
- package/dist/scopes/sentences.d.ts.map +1 -0
- package/dist/scopes/sentences.js +124 -0
- package/dist/scopes/sentences.js.map +1 -0
- package/dist/scopes/types.d.ts +44 -0
- package/dist/scopes/types.d.ts.map +1 -0
- package/dist/scopes/types.js +2 -0
- package/dist/scopes/types.js.map +1 -0
- package/dist/scopes/vocabulary.d.ts +16 -0
- package/dist/scopes/vocabulary.d.ts.map +1 -0
- package/dist/scopes/vocabulary.js +70 -0
- package/dist/scopes/vocabulary.js.map +1 -0
- package/dist/types/assertions.d.ts +95 -32
- package/dist/types/assertions.d.ts.map +1 -1
- package/dist/types/problems.d.ts +4 -5
- package/dist/types/problems.d.ts.map +1 -1
- package/dist/types/rules.d.ts +4 -6
- package/dist/types/rules.d.ts.map +1 -1
- package/examples/appendices/google.appendix.yaml +91 -0
- package/examples/appendices/inclusive-language.appendix.yaml +61 -0
- package/examples/appendices/microsoft.appendix.yaml +99 -0
- package/examples/appendices/plain-language.appendix.yaml +88 -0
- package/examples/google.yaml +1525 -0
- package/examples/inclusive-language.yaml +304 -0
- package/examples/microsoft.yaml +1542 -0
- package/examples/plain-language.yaml +325 -0
- package/package.json +49 -16
- package/presets/google/PROVENANCE.md +1022 -0
- package/presets/google/sources.json +192 -0
- package/presets/inclusive-language/PROVENANCE.md +174 -0
- package/presets/inclusive-language/sources.json +107 -0
- package/presets/microsoft/PROVENANCE.md +1555 -0
- package/presets/microsoft/sources.json +494 -0
- package/presets/plain-language/PROVENANCE.md +364 -0
- package/presets/plain-language/sources.json +108 -0
- package/dist/assertions/bullet-style.d.ts +0 -3
- package/dist/assertions/bullet-style.d.ts.map +0 -1
- package/dist/assertions/bullet-style.js +0 -60
- package/dist/assertions/bullet-style.js.map +0 -1
- package/dist/assertions/index.d.ts +0 -21
- package/dist/assertions/index.d.ts.map +0 -1
- package/dist/assertions/index.js +0 -30
- package/dist/assertions/index.js.map +0 -1
- package/dist/assertions/max-image-size.d.ts +0 -3
- package/dist/assertions/max-image-size.d.ts.map +0 -1
- package/dist/assertions/max-image-size.js +0 -73
- package/dist/assertions/max-image-size.js.map +0 -1
- package/dist/assertions/max-line-length.d.ts +0 -3
- package/dist/assertions/max-line-length.d.ts.map +0 -1
- package/dist/assertions/max-line-length.js +0 -68
- package/dist/assertions/max-line-length.js.map +0 -1
- package/dist/assertions/no-broken-fragment-links.d.ts +0 -3
- package/dist/assertions/no-broken-fragment-links.d.ts.map +0 -1
- package/dist/assertions/no-broken-fragment-links.js +0 -79
- package/dist/assertions/no-broken-fragment-links.js.map +0 -1
- package/dist/assertions/no-duplicate-headings.d.ts +0 -3
- package/dist/assertions/no-duplicate-headings.d.ts.map +0 -1
- package/dist/assertions/no-duplicate-headings.js +0 -66
- package/dist/assertions/no-duplicate-headings.js.map +0 -1
- package/dist/assertions/no-hard-tabs.d.ts +0 -3
- package/dist/assertions/no-hard-tabs.d.ts.map +0 -1
- package/dist/assertions/no-hard-tabs.js +0 -63
- package/dist/assertions/no-hard-tabs.js.map +0 -1
- package/dist/assertions/no-trailing-spaces.d.ts +0 -3
- package/dist/assertions/no-trailing-spaces.d.ts.map +0 -1
- package/dist/assertions/no-trailing-spaces.js +0 -72
- package/dist/assertions/no-trailing-spaces.js.map +0 -1
- package/dist/assertions/pattern.d.ts +0 -3
- package/dist/assertions/pattern.d.ts.map +0 -1
- package/dist/assertions/pattern.js +0 -39
- package/dist/assertions/pattern.js.map +0 -1
- package/dist/assertions/semantic-line-breaks.d.ts +0 -3
- package/dist/assertions/semantic-line-breaks.d.ts.map +0 -1
- package/dist/assertions/semantic-line-breaks.js +0 -152
- package/dist/assertions/semantic-line-breaks.js.map +0 -1
- package/dist/assertions/swap.d.ts +0 -3
- package/dist/assertions/swap.d.ts.map +0 -1
- package/dist/assertions/swap.js +0 -39
- package/dist/assertions/swap.js.map +0 -1
- package/dist/assertions/utils.d.ts +0 -8
- package/dist/assertions/utils.d.ts.map +0 -1
- package/dist/assertions/utils.js.map +0 -1
- package/dist/core/scope-parser.d.ts +0 -26
- package/dist/core/scope-parser.d.ts.map +0 -1
- package/dist/core/scope-parser.js +0 -110
- package/dist/core/scope-parser.js.map +0 -1
- package/dist/files.d.ts +0 -2
- package/dist/files.d.ts.map +0 -1
- package/dist/files.js +0 -39
- package/dist/files.js.map +0 -1
- package/dist/load-config.d.ts +0 -25
- package/dist/load-config.d.ts.map +0 -1
- package/dist/load-config.js +0 -104
- package/dist/load-config.js.map +0 -1
- package/dist/load.d.ts +0 -25
- package/dist/load.d.ts.map +0 -1
- package/dist/load.js +0 -112
- package/dist/load.js.map +0 -1
- package/dist/scope.d.ts +0 -26
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js +0 -110
- package/dist/scope.js.map +0 -1
- package/dist/types.d.ts +0 -109
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/validate.d.ts +0 -31
- package/dist/validate.d.ts.map +0 -1
- package/dist/validate.js +0 -154
- package/dist/validate.js.map +0 -1
- /package/dist/{types.js → parser/types.js} +0 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// Pure AP/Chicago title-case algorithms backing the Vale-parity
|
|
2
|
+
// `capitalization` assertion's `$title` match (see ./capitalization.ts).
|
|
3
|
+
// Deliberately no markdown/Vale awareness here -- these functions operate
|
|
4
|
+
// on plain text only. Scope/segment handling, backtick-span freezing, and
|
|
5
|
+
// the problem/fix wiring all live in capitalization.ts. The one import below
|
|
6
|
+
// is the mask CHARACTER, not any markdown handling: masking happens in
|
|
7
|
+
// capitalization.ts, and the tokenizer here only has to recognize the result.
|
|
8
|
+
//
|
|
9
|
+
// Shared casing rules (both styles):
|
|
10
|
+
// - The FIRST and LAST word are ALWAYS capitalized, regardless of any
|
|
11
|
+
// stopword list below.
|
|
12
|
+
// - A word listed in `exceptions` (matched case-insensitively) is
|
|
13
|
+
// rewritten to its EXACT as-written form from that list, everywhere in
|
|
14
|
+
// the title -- including first/last position -- overriding every rule
|
|
15
|
+
// below (e.g. 'GitHub', 'iPhone').
|
|
16
|
+
// - A word already in ALL-CAPS (2+ letters, e.g. an acronym like 'API') is
|
|
17
|
+
// left exactly as written, also overriding the stopword/position rules.
|
|
18
|
+
// - A hyphenated compound (e.g. 'editor-in-chief' -> 'Editor-in-Chief')
|
|
19
|
+
// runs each hyphen part through the same rules a standalone word gets --
|
|
20
|
+
// see capitalizeHyphenated.
|
|
21
|
+
// - Every other (non-edge, non-hyphenated, non-exception, non-ALL-CAPS)
|
|
22
|
+
// word is either forced lowercase (a stopword for the active style) or
|
|
23
|
+
// capitalized (initial letter upper, rest lower).
|
|
24
|
+
//
|
|
25
|
+
// Style difference (the stopword list lowercased mid-title):
|
|
26
|
+
// - AP: articles, coordinating conjunctions, and prepositions of THREE
|
|
27
|
+
// letters or fewer.
|
|
28
|
+
// - Chicago: articles, coordinating conjunctions, and EVERY preposition
|
|
29
|
+
// regardless of length -- via the fixed list below (JS has no built-in
|
|
30
|
+
// dictionary of "all English prepositions" to draw on).
|
|
31
|
+
import { INLINE_CODE_MASK_CHAR } from '../../core/inline-code.js';
|
|
32
|
+
import { ABBREVIATIONS, lastWordBefore } from '../../scopes/sentences.js';
|
|
33
|
+
const ARTICLES = ['a', 'an', 'the'];
|
|
34
|
+
const COORDINATING_CONJUNCTIONS = ['and', 'but', 'or', 'nor', 'for', 'so', 'yet'];
|
|
35
|
+
// Every entry here is <= 3 letters -- both AP and Chicago lowercase these.
|
|
36
|
+
const SHORT_PREPOSITIONS = ['at', 'by', 'in', 'of', 'off', 'on', 'out', 'to', 'up', 'via'];
|
|
37
|
+
// Chicago-only: prepositions of 4+ letters. AP capitalizes these mid-title
|
|
38
|
+
// (they're not in AP_STOPWORDS); Chicago lowercases them like any other
|
|
39
|
+
// preposition.
|
|
40
|
+
const LONG_PREPOSITIONS = [
|
|
41
|
+
'about',
|
|
42
|
+
'above',
|
|
43
|
+
'across',
|
|
44
|
+
'after',
|
|
45
|
+
'against',
|
|
46
|
+
'along',
|
|
47
|
+
'among',
|
|
48
|
+
'around',
|
|
49
|
+
'before',
|
|
50
|
+
'behind',
|
|
51
|
+
'below',
|
|
52
|
+
'between',
|
|
53
|
+
'during',
|
|
54
|
+
'through',
|
|
55
|
+
'toward',
|
|
56
|
+
'under',
|
|
57
|
+
'until',
|
|
58
|
+
'with',
|
|
59
|
+
'within',
|
|
60
|
+
'without',
|
|
61
|
+
];
|
|
62
|
+
const AP_STOPWORDS = new Set([...ARTICLES, ...COORDINATING_CONJUNCTIONS, ...SHORT_PREPOSITIONS]);
|
|
63
|
+
const CHICAGO_STOPWORDS = new Set([
|
|
64
|
+
...ARTICLES,
|
|
65
|
+
...COORDINATING_CONJUNCTIONS,
|
|
66
|
+
...SHORT_PREPOSITIONS,
|
|
67
|
+
...LONG_PREPOSITIONS,
|
|
68
|
+
]);
|
|
69
|
+
// One "word" is a run of letters/digits, optionally joined by internal
|
|
70
|
+
// hyphens ('well-known') or apostrophes ("don't"); anything else is a
|
|
71
|
+
// separator copied through verbatim. Phrase exceptions never reach the
|
|
72
|
+
// tokenizer -- tokenizeCasingWords carves them out first.
|
|
73
|
+
/**
|
|
74
|
+
* True for a word that's already an ALL-CAPS acronym (2+ letters, e.g.
|
|
75
|
+
* 'API', 'HTML5') -- both styles leave these exactly as written rather
|
|
76
|
+
* than lowercasing or capitalizing them. Non-letter characters (digits)
|
|
77
|
+
* don't count toward the length or case check.
|
|
78
|
+
*/
|
|
79
|
+
export function isAllCapsWord(word) {
|
|
80
|
+
const letters = word.replace(/[^A-Za-z]/g, '');
|
|
81
|
+
return letters.length >= 2 && letters === letters.toUpperCase();
|
|
82
|
+
}
|
|
83
|
+
/** The `v2` of `v2.0`, or `v3`. The `v` must be the whole alphabetic part,
|
|
84
|
+
* so an ordinary word like `vector3` is untouched. */
|
|
85
|
+
export function isVersionToken(word) {
|
|
86
|
+
return /^v\d+$/i.test(word);
|
|
87
|
+
}
|
|
88
|
+
/** `x-metadata`, `x-codeSamples`. Case-sensitive: matching `X-` too would
|
|
89
|
+
* freeze `X-ray` and AWS `X-Ray`. */
|
|
90
|
+
export function isVendorExtensionToken(word) {
|
|
91
|
+
return /^x-./.test(word);
|
|
92
|
+
}
|
|
93
|
+
/** Tokens whose own casing is already correct. Must be checked before
|
|
94
|
+
* hyphen splitting -- an extension's `-` is part of its name. */
|
|
95
|
+
export function keepsOwnCasing(word) {
|
|
96
|
+
return isAllCapsWord(word) || isVersionToken(word) || isVendorExtensionToken(word);
|
|
97
|
+
}
|
|
98
|
+
function capitalizeWord(word) {
|
|
99
|
+
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
100
|
+
}
|
|
101
|
+
export function buildExceptionPlan(exceptions) {
|
|
102
|
+
const phrases = exceptions.filter((e) => /[\s.]/.test(e)).sort((a, b) => b.length - a.length);
|
|
103
|
+
const phraseSet = new Set(phrases);
|
|
104
|
+
const wordMap = new Map();
|
|
105
|
+
for (const exception of exceptions) {
|
|
106
|
+
if (phraseSet.has(exception))
|
|
107
|
+
continue; // phrases are matched separately, below
|
|
108
|
+
wordMap.set(exception.toLowerCase(), exception);
|
|
109
|
+
}
|
|
110
|
+
return { wordMap, phrases };
|
|
111
|
+
}
|
|
112
|
+
function escapeRegExp(text) {
|
|
113
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
114
|
+
}
|
|
115
|
+
// Finds every non-overlapping occurrence of a phrase exception in `text`,
|
|
116
|
+
// case-insensitively but otherwise LITERALLY -- no whitespace normalization,
|
|
117
|
+
// no word-boundary requirement, and no regex sourced from config (every
|
|
118
|
+
// candidate is a fixed exception string, run through escapeRegExp). Literal
|
|
119
|
+
// matching is what guarantees a match is always exactly `phrase.length`
|
|
120
|
+
// characters long, which is in turn what lets a matched span be replaced by
|
|
121
|
+
// the as-written exception without shifting any later offset (see
|
|
122
|
+
// CasingToken.exception).
|
|
123
|
+
// `phrases` is already longest-first (buildExceptionPlan), so a match
|
|
124
|
+
// recorded for an earlier (longer) phrase claims its range and a later
|
|
125
|
+
// (shorter) phrase cannot also match any part of it.
|
|
126
|
+
function findPhraseMatches(text, phrases) {
|
|
127
|
+
const matches = [];
|
|
128
|
+
for (const phrase of phrases) {
|
|
129
|
+
const pattern = new RegExp(escapeRegExp(phrase), 'gi');
|
|
130
|
+
let match;
|
|
131
|
+
while ((match = pattern.exec(text)) !== null) {
|
|
132
|
+
const start = match.index;
|
|
133
|
+
const end = start + match[0].length;
|
|
134
|
+
if (!matches.some((claimed) => start < claimed.end && claimed.start < end)) {
|
|
135
|
+
matches.push({ start, end, exception: phrase });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return matches.sort((a, b) => a.start - b.start);
|
|
140
|
+
}
|
|
141
|
+
// A mask run is one inline code span (core/inline-code.ts). It gets its own
|
|
142
|
+
// token so it OCCUPIES a position, like a phrase exception (#25610) -- a
|
|
143
|
+
// heading opening with a code span must not hand position 0 to the next word.
|
|
144
|
+
// `exception` is the run itself so it survives byte for byte; restoreInlineCode
|
|
145
|
+
// splices by offset.
|
|
146
|
+
const WORD_OR_MASK_RE = new RegExp(`${INLINE_CODE_MASK_CHAR}+|[A-Za-z0-9]+(?:['’-][A-Za-z0-9]+)*`, 'g');
|
|
147
|
+
function pushWordTokens(text, from, to, tokens) {
|
|
148
|
+
if (from >= to)
|
|
149
|
+
return;
|
|
150
|
+
for (const match of text.slice(from, to).matchAll(WORD_OR_MASK_RE)) {
|
|
151
|
+
const start = from + (match.index ?? 0);
|
|
152
|
+
const isMask = match[0].startsWith(INLINE_CODE_MASK_CHAR);
|
|
153
|
+
tokens.push({
|
|
154
|
+
text: match[0],
|
|
155
|
+
start,
|
|
156
|
+
end: start + match[0].length,
|
|
157
|
+
...(isMask ? { exception: match[0] } : {}),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Tokenizes `text` into the word sequence the `$`-styles case, with every
|
|
163
|
+
* non-overlapping phrase-exception match collapsed into a single token.
|
|
164
|
+
*
|
|
165
|
+
* Ordinary words are tokenized only in the GAPS between phrase matches, which
|
|
166
|
+
* makes a phrase span a hard token boundary: a word can never straddle one
|
|
167
|
+
* (e.g. with the phrase 'VS Code', the text 'xVS Codey' yields 'x', the
|
|
168
|
+
* phrase, then 'y'). That is exactly the boundary the previous placeholder run
|
|
169
|
+
* produced, since the placeholder sat outside WORD_RE's character class.
|
|
170
|
+
*/
|
|
171
|
+
function tokenizeCasingWords(text, phrases) {
|
|
172
|
+
const tokens = [];
|
|
173
|
+
let cursor = 0;
|
|
174
|
+
for (const { start, end, exception } of findPhraseMatches(text, phrases)) {
|
|
175
|
+
pushWordTokens(text, cursor, start, tokens);
|
|
176
|
+
tokens.push({ text: text.slice(start, end), start, end, exception });
|
|
177
|
+
cursor = end;
|
|
178
|
+
}
|
|
179
|
+
pushWordTokens(text, cursor, text.length, tokens);
|
|
180
|
+
return tokens;
|
|
181
|
+
}
|
|
182
|
+
// Trailing whitespace is required: a bare dot is usually a dotted identifier
|
|
183
|
+
// or version (`element.focus()`, `v2.0`), not a sentence end. No ':' -- both
|
|
184
|
+
// style guides lowercase after a colon unless a full sentence follows, which
|
|
185
|
+
// nothing here can detect.
|
|
186
|
+
const SENTENCE_BREAK_RE = /[.?!]["'’”)\]]*\s/;
|
|
187
|
+
// ABBREVIATIONS is the sentence splitter's own list, reused so the two cannot
|
|
188
|
+
// disagree about what ends a sentence (`Cost vs. value` is one sentence).
|
|
189
|
+
function gapEndsSentence(text, gapStart, gap) {
|
|
190
|
+
const match = SENTENCE_BREAK_RE.exec(gap);
|
|
191
|
+
if (!match)
|
|
192
|
+
return false;
|
|
193
|
+
if (match[0][0] !== '.')
|
|
194
|
+
return true; // '?' and '!' never abbreviate
|
|
195
|
+
return !ABBREVIATIONS.has(lastWordBefore(text, gapStart + (match.index ?? 0)));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Rebuilds `text` with every word re-cased by `caseWord`, which receives the
|
|
199
|
+
* word, its `index`, the sequence `total`, and whether it opens a sentence.
|
|
200
|
+
* Separators are copied through verbatim.
|
|
201
|
+
*
|
|
202
|
+
* Phrase-exception and mask tokens are emitted as-written but still OCCUPY an
|
|
203
|
+
* index, so a leading one cannot hand position 0 to a neighbour (#25610).
|
|
204
|
+
*
|
|
205
|
+
* Shared by apTitleCase/chicagoTitleCase and capitalization.ts's sentenceCase.
|
|
206
|
+
* Length-preserving whenever `caseWord` is.
|
|
207
|
+
*/
|
|
208
|
+
export function recaseWords(text, phrases, caseWord) {
|
|
209
|
+
const tokens = tokenizeCasingWords(text, phrases);
|
|
210
|
+
if (tokens.length === 0)
|
|
211
|
+
return text;
|
|
212
|
+
let result = '';
|
|
213
|
+
let cursor = 0;
|
|
214
|
+
tokens.forEach((token, index) => {
|
|
215
|
+
const separator = text.slice(cursor, token.start);
|
|
216
|
+
const startsSentence = index === 0 || gapEndsSentence(text, cursor, separator);
|
|
217
|
+
result += separator;
|
|
218
|
+
result += token.exception ?? caseWord(token.text, index, tokens.length, startsSentence);
|
|
219
|
+
cursor = token.end;
|
|
220
|
+
});
|
|
221
|
+
return result + text.slice(cursor);
|
|
222
|
+
}
|
|
223
|
+
// Each hyphen part gets its own exceptions/ALL-CAPS decision first, then
|
|
224
|
+
// the same stopword test a standalone word gets. The first/last part also
|
|
225
|
+
// inherits the compound's own first/last-word treatment, so a stopword
|
|
226
|
+
// part still capitalizes when the compound opens/closes the title.
|
|
227
|
+
function capitalizeHyphenated(word, isFirstWord, isLastWord, stopwords, exceptionMap) {
|
|
228
|
+
const parts = word.split('-');
|
|
229
|
+
const lastPartIndex = parts.length - 1;
|
|
230
|
+
return parts
|
|
231
|
+
.map((part, partIndex) => {
|
|
232
|
+
if (part.length === 0)
|
|
233
|
+
return part; // leading/trailing/doubled hyphen -- nothing to capitalize
|
|
234
|
+
const exceptionHit = exceptionMap.get(part.toLowerCase());
|
|
235
|
+
if (exceptionHit !== undefined)
|
|
236
|
+
return exceptionHit;
|
|
237
|
+
if (isAllCapsWord(part))
|
|
238
|
+
return part;
|
|
239
|
+
if (partIndex === 0 && isFirstWord)
|
|
240
|
+
return capitalizeWord(part);
|
|
241
|
+
if (partIndex === lastPartIndex && isLastWord)
|
|
242
|
+
return capitalizeWord(part);
|
|
243
|
+
if (stopwords.has(part.toLowerCase()))
|
|
244
|
+
return part.toLowerCase();
|
|
245
|
+
return capitalizeWord(part);
|
|
246
|
+
})
|
|
247
|
+
.join('-');
|
|
248
|
+
}
|
|
249
|
+
function transformWord(word, isFirstWord, isLastWord, stopwords, exceptionMap) {
|
|
250
|
+
// Whole-compound exception check FIRST, before any hyphen splitting: an
|
|
251
|
+
// exceptions entry may itself be an entire hyphenated compound (e.g.
|
|
252
|
+
// 'e-commerce'), which must be preserved as-written rather than falling
|
|
253
|
+
// through to per-part handling below -- $sentence (capitalization.ts's
|
|
254
|
+
// sentenceCase) already treats a hyphenated compound as one token and
|
|
255
|
+
// honors this, so $title must agree on the same documented behavior.
|
|
256
|
+
const exceptionHit = exceptionMap.get(word.toLowerCase());
|
|
257
|
+
if (exceptionHit !== undefined)
|
|
258
|
+
return exceptionHit;
|
|
259
|
+
// Before the hyphen split: `x-codeSamples` split into parts became
|
|
260
|
+
// `X-codesamples`. An exceptions entry still wins, above.
|
|
261
|
+
if (keepsOwnCasing(word))
|
|
262
|
+
return word;
|
|
263
|
+
// Hyphenation check: with no whole-compound exception match, a hyphenated
|
|
264
|
+
// compound is stopword-tested part by part instead (the stopword lists
|
|
265
|
+
// only contain single words, so a whole-string lookup against them would
|
|
266
|
+
// never hit anyway). Per-part exceptions (e.g. 'GitHub' inside
|
|
267
|
+
// 'github-hosted') are still handled inside capitalizeHyphenated.
|
|
268
|
+
if (word.includes('-')) {
|
|
269
|
+
return capitalizeHyphenated(word, isFirstWord, isLastWord, stopwords, exceptionMap);
|
|
270
|
+
}
|
|
271
|
+
if (isFirstWord || isLastWord)
|
|
272
|
+
return capitalizeWord(word);
|
|
273
|
+
if (stopwords.has(word.toLowerCase()))
|
|
274
|
+
return word.toLowerCase();
|
|
275
|
+
return capitalizeWord(word);
|
|
276
|
+
}
|
|
277
|
+
function titleCase(text, stopwords, exceptions) {
|
|
278
|
+
// Phrase entries become atomic tokens in the sequence recaseWords walks
|
|
279
|
+
// (each emitted as-written, each counting toward first/last position);
|
|
280
|
+
// `wordMap` holds the single-token entries transformWord looks up per word
|
|
281
|
+
// and per hyphen part. Both come from the one shared exception plan.
|
|
282
|
+
const { wordMap, phrases } = buildExceptionPlan(exceptions);
|
|
283
|
+
return recaseWords(text, phrases, (word, index, total) => transformWord(word, index === 0, index === total - 1, stopwords, wordMap));
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* AP style: lowercases articles, coordinating conjunctions, and
|
|
287
|
+
* prepositions of 3 letters or fewer -- everything else is capitalized,
|
|
288
|
+
* except `exceptions` (kept as-written) and ALL-CAPS words (left alone).
|
|
289
|
+
* The first and last word are always capitalized.
|
|
290
|
+
*/
|
|
291
|
+
export function apTitleCase(text, exceptions = []) {
|
|
292
|
+
return titleCase(text, AP_STOPWORDS, exceptions);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Chicago style: like AP, but lowercases EVERY preposition regardless of
|
|
296
|
+
* length (not just the 3-letters-or-fewer ones AP lowercases).
|
|
297
|
+
*/
|
|
298
|
+
export function chicagoTitleCase(text, exceptions = []) {
|
|
299
|
+
return titleCase(text, CHICAGO_STOPWORDS, exceptions);
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=title-case.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"title-case.js","sourceRoot":"","sources":["../../../src/rules/scope/title-case.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-fences.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-fences.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AA6B/D,eAAO,MAAM,kBAAkB,EAAE,SAuBhC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { filterByTypes } from '../../parser/index.js';
|
|
2
|
+
import { getParentOfType, isBlankLine } from './helpers.js';
|
|
3
|
+
const codeFencePrefixRe = /^(.*?)[`~]/;
|
|
4
|
+
function addFenceError(ctx, lines, lineNumber, top) {
|
|
5
|
+
const line = lines[lineNumber - 1] ?? '';
|
|
6
|
+
const prefixMatch = codeFencePrefixRe.exec(line);
|
|
7
|
+
const prefix = prefixMatch?.[1];
|
|
8
|
+
ctx.onError({
|
|
9
|
+
line: lineNumber,
|
|
10
|
+
context: line.trim(),
|
|
11
|
+
fixInfo: prefix === undefined
|
|
12
|
+
? undefined
|
|
13
|
+
: {
|
|
14
|
+
lineNumber: lineNumber + (top ? 0 : 1),
|
|
15
|
+
editColumn: 1,
|
|
16
|
+
insertText: `${prefix.replace(/[^>]/g, ' ').trim()}\n`,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export const blanksAroundFences = {
|
|
21
|
+
name: 'blanks-around-fences',
|
|
22
|
+
tags: ['code', 'blank_lines'],
|
|
23
|
+
fixable: true,
|
|
24
|
+
defaults: {
|
|
25
|
+
message: 'Fenced code blocks should be surrounded by blank lines',
|
|
26
|
+
listItems: true,
|
|
27
|
+
},
|
|
28
|
+
check(ctx) {
|
|
29
|
+
const listItems = ctx.config.listItems;
|
|
30
|
+
const includeListItems = listItems === undefined ? true : !!listItems;
|
|
31
|
+
const { lines } = ctx;
|
|
32
|
+
for (const codeBlock of filterByTypes(ctx.tree, ['codeFenced'])) {
|
|
33
|
+
if (includeListItems || !getParentOfType(codeBlock, ['listOrdered', 'listUnordered'])) {
|
|
34
|
+
if (!isBlankLine(lines[codeBlock.startLine - 2])) {
|
|
35
|
+
addFenceError(ctx, lines, codeBlock.startLine, true);
|
|
36
|
+
}
|
|
37
|
+
if (!isBlankLine(lines[codeBlock.endLine]) && !isBlankLine(lines[codeBlock.endLine - 1])) {
|
|
38
|
+
addFenceError(ctx, lines, codeBlock.endLine, false);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=blanks-around-fences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-fences.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-fences.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAEvC,SAAS,aAAa,CACpB,GAAqB,EACrB,KAAwB,EACxB,UAAkB,EAClB,GAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,OAAO,CAAC;QACV,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACpB,OAAO,EACL,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,UAAU,EAAE,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI;aACvD;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR,OAAO,EAAE,wDAAwD;QACjE,SAAS,EAAE,IAAI;KAChB;IACD,KAAK,CAAC,GAAG;QACP,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACvC,MAAM,gBAAgB,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;QACtB,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAChE,IAAI,gBAAgB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACvD,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzF,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-headings.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-headings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAwD7C,eAAO,MAAM,oBAAoB,EAAE,SA0ElC,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { filterByTypes } from '../../parser/index.js';
|
|
2
|
+
import { getBlockQuotePrefixText, getHeadingLevel, isBlankLine } from './helpers.js';
|
|
3
|
+
const defaultLines = 1;
|
|
4
|
+
/**
|
|
5
|
+
* Upstream's `getLinesFunction`: `linesAbove`/`linesBelow` config can be a
|
|
6
|
+
* single number applied to every heading level, or a `number[6]` (one
|
|
7
|
+
* entry per heading level 1-6, missing/short entries fall back to the
|
|
8
|
+
* default of 1).
|
|
9
|
+
*/
|
|
10
|
+
function getLinesFunction(linesParam) {
|
|
11
|
+
if (Array.isArray(linesParam)) {
|
|
12
|
+
const linesArray = new Array(6).fill(defaultLines);
|
|
13
|
+
for (const [index, value] of linesParam.slice(0, 6).entries()) {
|
|
14
|
+
linesArray[index] = Number(value);
|
|
15
|
+
}
|
|
16
|
+
return (heading) => linesArray[getHeadingLevel(heading) - 1];
|
|
17
|
+
}
|
|
18
|
+
const lines = linesParam === undefined ? defaultLines : Number(linesParam);
|
|
19
|
+
return () => lines;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Gets a 0-based line's text for the "lines above" scan. Upstream strips
|
|
23
|
+
* front matter out of `params.lines` entirely and only reconstructs it via
|
|
24
|
+
* a separate `frontMatterLines` array for negative indices; Recheck keeps
|
|
25
|
+
* front matter in-band as a real `yaml` token occupying real line numbers
|
|
26
|
+
* in `ctx.lines`. To preserve upstream's documented default ("front matter
|
|
27
|
+
* is ignored" — i.e. no blank line is required between it and the first
|
|
28
|
+
* heading), a line that falls inside the yaml token's span is treated as
|
|
29
|
+
* blank (returns `''`) unless `includeFrontMatter` is set, in which case
|
|
30
|
+
* its real text is returned like any other line.
|
|
31
|
+
*/
|
|
32
|
+
function getLineAbove(lines, index, frontMatterRange, includeFrontMatter) {
|
|
33
|
+
if (index < 0 || index >= lines.length)
|
|
34
|
+
return '';
|
|
35
|
+
const lineNumber = index + 1;
|
|
36
|
+
if (!includeFrontMatter &&
|
|
37
|
+
frontMatterRange &&
|
|
38
|
+
lineNumber >= frontMatterRange.start &&
|
|
39
|
+
lineNumber <= frontMatterRange.end) {
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
return lines[index];
|
|
43
|
+
}
|
|
44
|
+
export const blanksAroundHeadings = {
|
|
45
|
+
name: 'blanks-around-headings',
|
|
46
|
+
tags: ['headings', 'blank_lines'],
|
|
47
|
+
fixable: true,
|
|
48
|
+
defaults: {
|
|
49
|
+
message: 'Headings should be surrounded by blank lines',
|
|
50
|
+
includeFrontMatter: false,
|
|
51
|
+
linesAbove: 1,
|
|
52
|
+
linesBelow: 1,
|
|
53
|
+
},
|
|
54
|
+
check(ctx) {
|
|
55
|
+
const getLinesAbove = getLinesFunction(ctx.config.linesAbove);
|
|
56
|
+
const getLinesBelow = getLinesFunction(ctx.config.linesBelow);
|
|
57
|
+
const includeFrontMatter = !!ctx.config.includeFrontMatter;
|
|
58
|
+
const { lines } = ctx;
|
|
59
|
+
const frontmatter = ctx.tree.flat.find((token) => token.type === 'yaml');
|
|
60
|
+
const frontMatterRange = frontmatter
|
|
61
|
+
? { start: frontmatter.startLine, end: frontmatter.endLine }
|
|
62
|
+
: undefined;
|
|
63
|
+
for (const heading of filterByTypes(ctx.tree, ['atxHeading', 'setextHeading'])) {
|
|
64
|
+
const { startLine, endLine } = heading;
|
|
65
|
+
const lineText = (lines[startLine - 1] ?? '').trim();
|
|
66
|
+
const linesAbove = getLinesAbove(heading);
|
|
67
|
+
if (linesAbove >= 0) {
|
|
68
|
+
let actualAbove = 0;
|
|
69
|
+
for (let i = 0; i < linesAbove &&
|
|
70
|
+
isBlankLine(getLineAbove(lines, startLine - 2 - i, frontMatterRange, includeFrontMatter)); i++) {
|
|
71
|
+
actualAbove++;
|
|
72
|
+
}
|
|
73
|
+
if (linesAbove !== actualAbove) {
|
|
74
|
+
ctx.onError({
|
|
75
|
+
line: startLine,
|
|
76
|
+
detail: `Expected: ${linesAbove}; Actual: ${actualAbove}; Above`,
|
|
77
|
+
context: lineText,
|
|
78
|
+
fixInfo: {
|
|
79
|
+
lineNumber: startLine,
|
|
80
|
+
editColumn: 1,
|
|
81
|
+
insertText: getBlockQuotePrefixText(ctx.tree, startLine - 1, linesAbove - actualAbove),
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const linesBelow = getLinesBelow(heading);
|
|
87
|
+
if (linesBelow >= 0) {
|
|
88
|
+
let actualBelow = 0;
|
|
89
|
+
for (let i = 0; i < linesBelow && isBlankLine(lines[endLine + i] ?? ''); i++) {
|
|
90
|
+
actualBelow++;
|
|
91
|
+
}
|
|
92
|
+
if (linesBelow !== actualBelow) {
|
|
93
|
+
ctx.onError({
|
|
94
|
+
line: startLine,
|
|
95
|
+
detail: `Expected: ${linesBelow}; Actual: ${actualBelow}; Below`,
|
|
96
|
+
context: lineText,
|
|
97
|
+
fixInfo: {
|
|
98
|
+
lineNumber: endLine + 1,
|
|
99
|
+
editColumn: 1,
|
|
100
|
+
insertText: getBlockQuotePrefixText(ctx.tree, endLine + 1, linesBelow - actualBelow),
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=blanks-around-headings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-headings.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-headings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-lists.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-lists.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAW7C,eAAO,MAAM,iBAAiB,EAAE,SA+D/B,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { filterByPredicate, getBlockQuotePrefixText, isBlankLine, nonContentTokens, } from './helpers.js';
|
|
2
|
+
const isList = (token) => token.type === 'listOrdered' || token.type === 'listUnordered';
|
|
3
|
+
export const blanksAroundLists = {
|
|
4
|
+
name: 'blanks-around-lists',
|
|
5
|
+
tags: ['bullet', 'ul', 'ol', 'blank_lines'],
|
|
6
|
+
fixable: true,
|
|
7
|
+
defaults: {
|
|
8
|
+
message: 'Lists should be surrounded by blank lines',
|
|
9
|
+
},
|
|
10
|
+
check(ctx) {
|
|
11
|
+
const { lines } = ctx;
|
|
12
|
+
// Only *top-level* lists: stop descending into a token's children once
|
|
13
|
+
// it is itself a list (or an htmlFlow block, matching upstream) so a
|
|
14
|
+
// nested sublist isn't independently reported as needing its own
|
|
15
|
+
// surrounding blank lines -- that's the parent list's job.
|
|
16
|
+
const topLevelLists = filterByPredicate(ctx.tree, isList, (token) => isList(token) || token.type === 'htmlFlow' ? [] : token.children);
|
|
17
|
+
for (const list of topLevelLists) {
|
|
18
|
+
// Look for a blank line above the list.
|
|
19
|
+
const firstLineNumber = list.startLine;
|
|
20
|
+
if (!isBlankLine(lines[firstLineNumber - 2])) {
|
|
21
|
+
ctx.onError({
|
|
22
|
+
line: firstLineNumber,
|
|
23
|
+
context: (lines[firstLineNumber - 1] ?? '').trim(),
|
|
24
|
+
fixInfo: {
|
|
25
|
+
lineNumber: firstLineNumber,
|
|
26
|
+
editColumn: 1,
|
|
27
|
+
insertText: getBlockQuotePrefixText(ctx.tree, firstLineNumber),
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
// Find the "visual" end of the list: its last non-"structural"
|
|
32
|
+
// (indentation/blank-line/container-prefix) descendant's end line,
|
|
33
|
+
// walked via the tree rather than list.endLine so a trailing
|
|
34
|
+
// listItemIndent on an otherwise-empty final line doesn't push the
|
|
35
|
+
// expected "below" blank-line check past the list's real content.
|
|
36
|
+
const flattenedChildren = filterByPredicate(list.children, (token) => !nonContentTokens.has(token.type), (token) => (nonContentTokens.has(token.type) ? [] : token.children));
|
|
37
|
+
const endLine = flattenedChildren.length > 0
|
|
38
|
+
? flattenedChildren[flattenedChildren.length - 1].endLine
|
|
39
|
+
: list.endLine;
|
|
40
|
+
// Look for a blank line below the list.
|
|
41
|
+
const lastLineNumber = endLine;
|
|
42
|
+
if (!isBlankLine(lines[lastLineNumber])) {
|
|
43
|
+
ctx.onError({
|
|
44
|
+
line: lastLineNumber,
|
|
45
|
+
context: (lines[lastLineNumber - 1] ?? '').trim(),
|
|
46
|
+
fixInfo: {
|
|
47
|
+
lineNumber: lastLineNumber + 1,
|
|
48
|
+
editColumn: 1,
|
|
49
|
+
insertText: getBlockQuotePrefixText(ctx.tree, lastLineNumber),
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=blanks-around-lists.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-lists.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-lists.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-tables.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-tables.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,eAAO,MAAM,kBAAkB,EAAE,SAwChC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { filterByTypes } from '../../parser/index.js';
|
|
2
|
+
import { getBlockQuotePrefixText, isBlankLine } from './helpers.js';
|
|
3
|
+
export const blanksAroundTables = {
|
|
4
|
+
name: 'blanks-around-tables',
|
|
5
|
+
tags: ['table'],
|
|
6
|
+
fixable: true,
|
|
7
|
+
defaults: {
|
|
8
|
+
message: 'Tables should be surrounded by blank lines',
|
|
9
|
+
},
|
|
10
|
+
check(ctx) {
|
|
11
|
+
const { lines } = ctx;
|
|
12
|
+
for (const table of filterByTypes(ctx.tree, ['table'])) {
|
|
13
|
+
// Look for a blank line above the table.
|
|
14
|
+
const firstLineNumber = table.startLine;
|
|
15
|
+
if (!isBlankLine(lines[firstLineNumber - 2])) {
|
|
16
|
+
ctx.onError({
|
|
17
|
+
line: firstLineNumber,
|
|
18
|
+
context: (lines[firstLineNumber - 1] ?? '').trim(),
|
|
19
|
+
fixInfo: {
|
|
20
|
+
lineNumber: firstLineNumber,
|
|
21
|
+
editColumn: 1,
|
|
22
|
+
insertText: getBlockQuotePrefixText(ctx.tree, firstLineNumber),
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// Look for a blank line below the table.
|
|
27
|
+
const lastLineNumber = table.endLine;
|
|
28
|
+
if (!isBlankLine(lines[lastLineNumber])) {
|
|
29
|
+
ctx.onError({
|
|
30
|
+
line: lastLineNumber,
|
|
31
|
+
context: (lines[lastLineNumber - 1] ?? '').trim(),
|
|
32
|
+
fixInfo: {
|
|
33
|
+
lineNumber: lastLineNumber + 1,
|
|
34
|
+
editColumn: 1,
|
|
35
|
+
insertText: getBlockQuotePrefixText(ctx.tree, lastLineNumber),
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=blanks-around-tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blanks-around-tables.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-tables.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR,OAAO,EAAE,4CAA4C;KACtD;IACD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;QAEtB,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACvD,yCAAyC;YACzC,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,OAAO,CAAC;oBACV,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;oBAClD,OAAO,EAAE;wBACP,UAAU,EAAE,eAAe;wBAC3B,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC;qBAC/D;iBACF,CAAC,CAAC;YACL,CAAC;YAED,yCAAyC;YACzC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,OAAO,CAAC;oBACV,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;oBACjD,OAAO,EAAE;wBACP,UAAU,EAAE,cAAc,GAAG,CAAC;wBAC9B,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC;qBAC9D;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-block-style.d.ts","sourceRoot":"","sources":["../../../src/rules/token/code-block-style.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,eAAO,MAAM,cAAc,EAAE,SAwB5B,CAAC"}
|