@redocly/recheck 0.1.0 → 0.2.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 +1006 -56
- package/dist/cli.js +27 -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 +0 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +68 -5
- 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/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 +208 -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 +161 -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 +42 -0
- package/dist/rules/scope/title-case.d.ts.map +1 -0
- package/dist/rules/scope/title-case.js +264 -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 +7 -0
- package/dist/scopes/sentences.d.ts.map +1 -0
- package/dist/scopes/sentences.js +115 -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,264 @@
|
|
|
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.
|
|
6
|
+
//
|
|
7
|
+
// Shared casing rules (both styles):
|
|
8
|
+
// - The FIRST and LAST word are ALWAYS capitalized, regardless of any
|
|
9
|
+
// stopword list below.
|
|
10
|
+
// - A word listed in `exceptions` (matched case-insensitively) is
|
|
11
|
+
// rewritten to its EXACT as-written form from that list, everywhere in
|
|
12
|
+
// the title -- including first/last position -- overriding every rule
|
|
13
|
+
// below (e.g. 'GitHub', 'iPhone').
|
|
14
|
+
// - A word already in ALL-CAPS (2+ letters, e.g. an acronym like 'API') is
|
|
15
|
+
// left exactly as written, also overriding the stopword/position rules.
|
|
16
|
+
// - A hyphenated compound (e.g. 'editor-in-chief' -> 'Editor-in-Chief')
|
|
17
|
+
// runs each hyphen part through the same rules a standalone word gets --
|
|
18
|
+
// see capitalizeHyphenated.
|
|
19
|
+
// - Every other (non-edge, non-hyphenated, non-exception, non-ALL-CAPS)
|
|
20
|
+
// word is either forced lowercase (a stopword for the active style) or
|
|
21
|
+
// capitalized (initial letter upper, rest lower).
|
|
22
|
+
//
|
|
23
|
+
// Style difference (the stopword list lowercased mid-title):
|
|
24
|
+
// - AP: articles, coordinating conjunctions, and prepositions of THREE
|
|
25
|
+
// letters or fewer.
|
|
26
|
+
// - Chicago: articles, coordinating conjunctions, and EVERY preposition
|
|
27
|
+
// regardless of length -- via the fixed list below (JS has no built-in
|
|
28
|
+
// dictionary of "all English prepositions" to draw on).
|
|
29
|
+
const ARTICLES = ['a', 'an', 'the'];
|
|
30
|
+
const COORDINATING_CONJUNCTIONS = ['and', 'but', 'or', 'nor', 'for', 'so', 'yet'];
|
|
31
|
+
// Every entry here is <= 3 letters -- both AP and Chicago lowercase these.
|
|
32
|
+
const SHORT_PREPOSITIONS = ['at', 'by', 'in', 'of', 'off', 'on', 'out', 'to', 'up', 'via'];
|
|
33
|
+
// Chicago-only: prepositions of 4+ letters. AP capitalizes these mid-title
|
|
34
|
+
// (they're not in AP_STOPWORDS); Chicago lowercases them like any other
|
|
35
|
+
// preposition.
|
|
36
|
+
const LONG_PREPOSITIONS = [
|
|
37
|
+
'about',
|
|
38
|
+
'above',
|
|
39
|
+
'across',
|
|
40
|
+
'after',
|
|
41
|
+
'against',
|
|
42
|
+
'along',
|
|
43
|
+
'among',
|
|
44
|
+
'around',
|
|
45
|
+
'before',
|
|
46
|
+
'behind',
|
|
47
|
+
'below',
|
|
48
|
+
'between',
|
|
49
|
+
'during',
|
|
50
|
+
'through',
|
|
51
|
+
'toward',
|
|
52
|
+
'under',
|
|
53
|
+
'until',
|
|
54
|
+
'with',
|
|
55
|
+
'within',
|
|
56
|
+
'without',
|
|
57
|
+
];
|
|
58
|
+
const AP_STOPWORDS = new Set([...ARTICLES, ...COORDINATING_CONJUNCTIONS, ...SHORT_PREPOSITIONS]);
|
|
59
|
+
const CHICAGO_STOPWORDS = new Set([
|
|
60
|
+
...ARTICLES,
|
|
61
|
+
...COORDINATING_CONJUNCTIONS,
|
|
62
|
+
...SHORT_PREPOSITIONS,
|
|
63
|
+
...LONG_PREPOSITIONS,
|
|
64
|
+
]);
|
|
65
|
+
// One "word" is a run of letters/digits, optionally joined by internal
|
|
66
|
+
// hyphens ('well-known') or apostrophes ("don't"). Anything else --
|
|
67
|
+
// including capitalization.ts's \0 inline-code mask character -- is a
|
|
68
|
+
// separator copied through verbatim, so a masked inline-code span is
|
|
69
|
+
// invisible to this tokenizer: never capitalized, never counted toward
|
|
70
|
+
// first/last-word position.
|
|
71
|
+
//
|
|
72
|
+
// A PHRASE exception is deliberately never reached by this regex: phrase
|
|
73
|
+
// spans are carved out of the text before it runs, so a phrase is one token
|
|
74
|
+
// instead of the several this regex would split it into (it splits on exactly
|
|
75
|
+
// the whitespace and dots those entries contain). See tokenizeCasingWords.
|
|
76
|
+
const WORD_RE = /[A-Za-z0-9]+(?:['’-][A-Za-z0-9]+)*/g;
|
|
77
|
+
/**
|
|
78
|
+
* True for a word that's already an ALL-CAPS acronym (2+ letters, e.g.
|
|
79
|
+
* 'API', 'HTML5') -- both styles leave these exactly as written rather
|
|
80
|
+
* than lowercasing or capitalizing them. Non-letter characters (digits)
|
|
81
|
+
* don't count toward the length or case check.
|
|
82
|
+
*/
|
|
83
|
+
export function isAllCapsWord(word) {
|
|
84
|
+
const letters = word.replace(/[^A-Za-z]/g, '');
|
|
85
|
+
return letters.length >= 2 && letters === letters.toUpperCase();
|
|
86
|
+
}
|
|
87
|
+
function capitalizeWord(word) {
|
|
88
|
+
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
89
|
+
}
|
|
90
|
+
export function buildExceptionPlan(exceptions) {
|
|
91
|
+
const phrases = exceptions.filter((e) => /[\s.]/.test(e)).sort((a, b) => b.length - a.length);
|
|
92
|
+
const phraseSet = new Set(phrases);
|
|
93
|
+
const wordMap = new Map();
|
|
94
|
+
for (const exception of exceptions) {
|
|
95
|
+
if (phraseSet.has(exception))
|
|
96
|
+
continue; // phrases are matched separately, below
|
|
97
|
+
wordMap.set(exception.toLowerCase(), exception);
|
|
98
|
+
}
|
|
99
|
+
return { wordMap, phrases };
|
|
100
|
+
}
|
|
101
|
+
function escapeRegExp(text) {
|
|
102
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
103
|
+
}
|
|
104
|
+
// Finds every non-overlapping occurrence of a phrase exception in `text`,
|
|
105
|
+
// case-insensitively but otherwise LITERALLY -- no whitespace normalization,
|
|
106
|
+
// no word-boundary requirement, and no regex sourced from config (every
|
|
107
|
+
// candidate is a fixed exception string, run through escapeRegExp). Literal
|
|
108
|
+
// matching is what guarantees a match is always exactly `phrase.length`
|
|
109
|
+
// characters long, which is in turn what lets a matched span be replaced by
|
|
110
|
+
// the as-written exception without shifting any later offset (see
|
|
111
|
+
// CasingToken.exception).
|
|
112
|
+
// `phrases` is already longest-first (buildExceptionPlan), so a match
|
|
113
|
+
// recorded for an earlier (longer) phrase claims its range and a later
|
|
114
|
+
// (shorter) phrase cannot also match any part of it.
|
|
115
|
+
function findPhraseMatches(text, phrases) {
|
|
116
|
+
const matches = [];
|
|
117
|
+
for (const phrase of phrases) {
|
|
118
|
+
const pattern = new RegExp(escapeRegExp(phrase), 'gi');
|
|
119
|
+
let match;
|
|
120
|
+
while ((match = pattern.exec(text)) !== null) {
|
|
121
|
+
const start = match.index;
|
|
122
|
+
const end = start + match[0].length;
|
|
123
|
+
if (!matches.some((claimed) => start < claimed.end && claimed.start < end)) {
|
|
124
|
+
matches.push({ start, end, exception: phrase });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return matches.sort((a, b) => a.start - b.start);
|
|
129
|
+
}
|
|
130
|
+
function pushWordTokens(text, from, to, tokens) {
|
|
131
|
+
if (from >= to)
|
|
132
|
+
return;
|
|
133
|
+
for (const match of text.slice(from, to).matchAll(WORD_RE)) {
|
|
134
|
+
const start = from + (match.index ?? 0);
|
|
135
|
+
tokens.push({ text: match[0], start, end: start + match[0].length });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Tokenizes `text` into the word sequence the `$`-styles case, with every
|
|
140
|
+
* non-overlapping phrase-exception match collapsed into a single token.
|
|
141
|
+
*
|
|
142
|
+
* Ordinary words are tokenized only in the GAPS between phrase matches, which
|
|
143
|
+
* makes a phrase span a hard token boundary: a word can never straddle one
|
|
144
|
+
* (e.g. with the phrase 'VS Code', the text 'xVS Codey' yields 'x', the
|
|
145
|
+
* phrase, then 'y'). That is exactly the boundary the previous placeholder run
|
|
146
|
+
* produced, since the placeholder sat outside WORD_RE's character class.
|
|
147
|
+
*/
|
|
148
|
+
function tokenizeCasingWords(text, phrases) {
|
|
149
|
+
const tokens = [];
|
|
150
|
+
let cursor = 0;
|
|
151
|
+
for (const { start, end, exception } of findPhraseMatches(text, phrases)) {
|
|
152
|
+
pushWordTokens(text, cursor, start, tokens);
|
|
153
|
+
tokens.push({ text: text.slice(start, end), start, end, exception });
|
|
154
|
+
cursor = end;
|
|
155
|
+
}
|
|
156
|
+
pushWordTokens(text, cursor, text.length, tokens);
|
|
157
|
+
return tokens;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Rebuilds `text` with every word re-cased by `caseWord`, which receives the
|
|
161
|
+
* word plus its `index` in the token sequence and that sequence's `total`
|
|
162
|
+
* length -- so `index === 0` is the real first word and `index === total - 1`
|
|
163
|
+
* the real last one. Separators between tokens are copied through verbatim.
|
|
164
|
+
*
|
|
165
|
+
* A phrase-exception token is emitted as-written and never passed to
|
|
166
|
+
* `caseWord`, but it DOES occupy an index. That is the whole point: a leading
|
|
167
|
+
* or trailing phrase no longer hands its first/last position to a neighbour
|
|
168
|
+
* (#25610).
|
|
169
|
+
*
|
|
170
|
+
* Shared by this module's apTitleCase/chicagoTitleCase and by
|
|
171
|
+
* capitalization.ts's sentenceCase, so all three `$`-styles agree on
|
|
172
|
+
* tokenization and phrase protection, not merely on the exception plan.
|
|
173
|
+
* Length-preserving whenever `caseWord` is.
|
|
174
|
+
*/
|
|
175
|
+
export function recaseWords(text, phrases, caseWord) {
|
|
176
|
+
const tokens = tokenizeCasingWords(text, phrases);
|
|
177
|
+
if (tokens.length === 0)
|
|
178
|
+
return text;
|
|
179
|
+
let result = '';
|
|
180
|
+
let cursor = 0;
|
|
181
|
+
tokens.forEach((token, index) => {
|
|
182
|
+
result += text.slice(cursor, token.start);
|
|
183
|
+
result += token.exception ?? caseWord(token.text, index, tokens.length);
|
|
184
|
+
cursor = token.end;
|
|
185
|
+
});
|
|
186
|
+
return result + text.slice(cursor);
|
|
187
|
+
}
|
|
188
|
+
// Each hyphen part gets its own exceptions/ALL-CAPS decision first, then
|
|
189
|
+
// the same stopword test a standalone word gets. The first/last part also
|
|
190
|
+
// inherits the compound's own first/last-word treatment, so a stopword
|
|
191
|
+
// part still capitalizes when the compound opens/closes the title.
|
|
192
|
+
function capitalizeHyphenated(word, isFirstWord, isLastWord, stopwords, exceptionMap) {
|
|
193
|
+
const parts = word.split('-');
|
|
194
|
+
const lastPartIndex = parts.length - 1;
|
|
195
|
+
return parts
|
|
196
|
+
.map((part, partIndex) => {
|
|
197
|
+
if (part.length === 0)
|
|
198
|
+
return part; // leading/trailing/doubled hyphen -- nothing to capitalize
|
|
199
|
+
const exceptionHit = exceptionMap.get(part.toLowerCase());
|
|
200
|
+
if (exceptionHit !== undefined)
|
|
201
|
+
return exceptionHit;
|
|
202
|
+
if (isAllCapsWord(part))
|
|
203
|
+
return part;
|
|
204
|
+
if (partIndex === 0 && isFirstWord)
|
|
205
|
+
return capitalizeWord(part);
|
|
206
|
+
if (partIndex === lastPartIndex && isLastWord)
|
|
207
|
+
return capitalizeWord(part);
|
|
208
|
+
if (stopwords.has(part.toLowerCase()))
|
|
209
|
+
return part.toLowerCase();
|
|
210
|
+
return capitalizeWord(part);
|
|
211
|
+
})
|
|
212
|
+
.join('-');
|
|
213
|
+
}
|
|
214
|
+
function transformWord(word, isFirstWord, isLastWord, stopwords, exceptionMap) {
|
|
215
|
+
// Whole-compound exception check FIRST, before any hyphen splitting: an
|
|
216
|
+
// exceptions entry may itself be an entire hyphenated compound (e.g.
|
|
217
|
+
// 'e-commerce'), which must be preserved as-written rather than falling
|
|
218
|
+
// through to per-part handling below -- $sentence (capitalization.ts's
|
|
219
|
+
// sentenceCase) already treats a hyphenated compound as one token and
|
|
220
|
+
// honors this, so $title must agree on the same documented behavior.
|
|
221
|
+
const exceptionHit = exceptionMap.get(word.toLowerCase());
|
|
222
|
+
if (exceptionHit !== undefined)
|
|
223
|
+
return exceptionHit;
|
|
224
|
+
// Hyphenation check: with no whole-compound exception match, a hyphenated
|
|
225
|
+
// compound is stopword-tested part by part instead (the stopword lists
|
|
226
|
+
// only contain single words, so a whole-string lookup against them would
|
|
227
|
+
// never hit anyway). Per-part exceptions (e.g. 'GitHub' inside
|
|
228
|
+
// 'github-hosted') are still handled inside capitalizeHyphenated.
|
|
229
|
+
if (word.includes('-')) {
|
|
230
|
+
return capitalizeHyphenated(word, isFirstWord, isLastWord, stopwords, exceptionMap);
|
|
231
|
+
}
|
|
232
|
+
if (isAllCapsWord(word))
|
|
233
|
+
return word;
|
|
234
|
+
if (isFirstWord || isLastWord)
|
|
235
|
+
return capitalizeWord(word);
|
|
236
|
+
if (stopwords.has(word.toLowerCase()))
|
|
237
|
+
return word.toLowerCase();
|
|
238
|
+
return capitalizeWord(word);
|
|
239
|
+
}
|
|
240
|
+
function titleCase(text, stopwords, exceptions) {
|
|
241
|
+
// Phrase entries become atomic tokens in the sequence recaseWords walks
|
|
242
|
+
// (each emitted as-written, each counting toward first/last position);
|
|
243
|
+
// `wordMap` holds the single-token entries transformWord looks up per word
|
|
244
|
+
// and per hyphen part. Both come from the one shared exception plan.
|
|
245
|
+
const { wordMap, phrases } = buildExceptionPlan(exceptions);
|
|
246
|
+
return recaseWords(text, phrases, (word, index, total) => transformWord(word, index === 0, index === total - 1, stopwords, wordMap));
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* AP style: lowercases articles, coordinating conjunctions, and
|
|
250
|
+
* prepositions of 3 letters or fewer -- everything else is capitalized,
|
|
251
|
+
* except `exceptions` (kept as-written) and ALL-CAPS words (left alone).
|
|
252
|
+
* The first and last word are always capitalized.
|
|
253
|
+
*/
|
|
254
|
+
export function apTitleCase(text, exceptions = []) {
|
|
255
|
+
return titleCase(text, AP_STOPWORDS, exceptions);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Chicago style: like AP, but lowercases EVERY preposition regardless of
|
|
259
|
+
* length (not just the 3-letters-or-fewer ones AP lowercases).
|
|
260
|
+
*/
|
|
261
|
+
export function chicagoTitleCase(text, exceptions = []) {
|
|
262
|
+
return titleCase(text, CHICAGO_STOPWORDS, exceptions);
|
|
263
|
+
}
|
|
264
|
+
//# 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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { filterByTypes } from '../../parser/index.js';
|
|
2
|
+
function tokenTypeToStyle(tokenType) {
|
|
3
|
+
return tokenType === 'codeFenced' ? 'fenced' : 'indented';
|
|
4
|
+
}
|
|
5
|
+
export const codeBlockStyle = {
|
|
6
|
+
name: 'code-block-style',
|
|
7
|
+
tags: ['code'],
|
|
8
|
+
fixable: false,
|
|
9
|
+
defaults: {
|
|
10
|
+
message: 'Code block style',
|
|
11
|
+
style: 'consistent',
|
|
12
|
+
},
|
|
13
|
+
check(ctx) {
|
|
14
|
+
let expectedStyle = String(ctx.config.style || 'consistent');
|
|
15
|
+
for (const token of filterByTypes(ctx.tree, ['codeFenced', 'codeIndented'])) {
|
|
16
|
+
const { startLine, type } = token;
|
|
17
|
+
if (expectedStyle === 'consistent') {
|
|
18
|
+
expectedStyle = tokenTypeToStyle(type);
|
|
19
|
+
}
|
|
20
|
+
const actualStyle = tokenTypeToStyle(type);
|
|
21
|
+
if (expectedStyle !== actualStyle) {
|
|
22
|
+
ctx.onError({
|
|
23
|
+
line: startLine,
|
|
24
|
+
detail: `Expected: ${expectedStyle}; Actual: ${actualStyle}`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=code-block-style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-block-style.js","sourceRoot":"","sources":["../../../src/rules/token/code-block-style.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE;QACR,OAAO,EAAE,kBAAkB;QAC3B,KAAK,EAAE,YAAY;KACpB;IACD,KAAK,CAAC,GAAG;QACP,IAAI,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC5E,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;YAClC,IAAI,aAAa,KAAK,YAAY,EAAE,CAAC;gBACnC,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;gBAClC,GAAG,CAAC,OAAO,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,aAAa,aAAa,aAAa,WAAW,EAAE;iBAC7D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|