chaffjs 0.17.0 → 0.19.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 +52 -56
- package/bin/chaff.js +17 -2
- package/dist/acronym-expansions.d.ts +26 -0
- package/dist/acronym-expansions.d.ts.map +1 -0
- package/dist/acronym-expansions.js +88 -0
- package/dist/acronym-expansions.js.map +1 -0
- package/dist/announced-count.d.ts +26 -0
- package/dist/announced-count.d.ts.map +1 -0
- package/dist/announced-count.js +138 -0
- package/dist/announced-count.js.map +1 -0
- package/dist/announced-list.d.ts +30 -0
- package/dist/announced-list.d.ts.map +1 -0
- package/dist/announced-list.js +95 -0
- package/dist/announced-list.js.map +1 -0
- package/dist/api.d.ts +168 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +10 -0
- package/dist/api.js.map +1 -0
- package/dist/bare-url.d.ts +14 -0
- package/dist/bare-url.d.ts.map +1 -0
- package/dist/bare-url.js +28 -0
- package/dist/bare-url.js.map +1 -0
- package/dist/baseline.d.ts +5 -0
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +16 -1
- package/dist/baseline.js.map +1 -1
- package/dist/body-section.d.ts +7 -0
- package/dist/body-section.d.ts.map +1 -0
- package/dist/body-section.js +6 -0
- package/dist/body-section.js.map +1 -0
- package/dist/calendar-number.d.ts +2 -0
- package/dist/calendar-number.d.ts.map +1 -1
- package/dist/calendar-number.js +9 -2
- package/dist/calendar-number.js.map +1 -1
- package/dist/cli-args.d.ts +4 -0
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +5 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-text.d.ts +0 -1
- package/dist/cli-text.d.ts.map +1 -1
- package/dist/cli-text.js +14 -18
- package/dist/cli-text.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +83 -84
- package/dist/cli.js.map +1 -1
- package/dist/closing-paragraph.d.ts +7 -0
- package/dist/closing-paragraph.d.ts.map +1 -0
- package/dist/closing-paragraph.js +22 -0
- package/dist/closing-paragraph.js.map +1 -0
- package/dist/commands/compare.d.ts +15 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +64 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/document-commands.d.ts +9 -0
- package/dist/commands/document-commands.d.ts.map +1 -0
- package/dist/commands/document-commands.js +17 -0
- package/dist/commands/document-commands.js.map +1 -0
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +19 -10
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/facts.d.ts +8 -0
- package/dist/commands/facts.d.ts.map +1 -0
- package/dist/commands/facts.js +30 -0
- package/dist/commands/facts.js.map +1 -0
- package/dist/commands/feedback.d.ts +15 -2
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +36 -6
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/fix-plan.d.ts +13 -0
- package/dist/commands/fix-plan.d.ts.map +1 -0
- package/dist/commands/fix-plan.js +44 -0
- package/dist/commands/fix-plan.js.map +1 -0
- package/dist/commands/outline.d.ts +8 -0
- package/dist/commands/outline.d.ts.map +1 -0
- package/dist/commands/outline.js +43 -0
- package/dist/commands/outline.js.map +1 -0
- package/dist/commands/read-document.d.ts +14 -0
- package/dist/commands/read-document.d.ts.map +1 -0
- package/dist/commands/read-document.js +21 -0
- package/dist/commands/read-document.js.map +1 -0
- package/dist/commands/suppressions.d.ts +7 -0
- package/dist/commands/suppressions.d.ts.map +1 -0
- package/dist/commands/suppressions.js +9 -0
- package/dist/commands/suppressions.js.map +1 -0
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +3 -5
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/tree.d.ts +13 -0
- package/dist/commands/tree.d.ts.map +1 -1
- package/dist/commands/tree.js +35 -5
- package/dist/commands/tree.js.map +1 -1
- package/dist/compare/atom.d.ts +31 -0
- package/dist/compare/atom.d.ts.map +1 -0
- package/dist/compare/atom.js +4 -0
- package/dist/compare/atom.js.map +1 -0
- package/dist/compare/clock-time.d.ts +8 -0
- package/dist/compare/clock-time.d.ts.map +1 -0
- package/dist/compare/clock-time.js +68 -0
- package/dist/compare/clock-time.js.map +1 -0
- package/dist/compare/distinct.d.ts +9 -0
- package/dist/compare/distinct.d.ts.map +1 -0
- package/dist/compare/distinct.js +12 -0
- package/dist/compare/distinct.js.map +1 -0
- package/dist/compare/extract.d.ts +15 -0
- package/dist/compare/extract.d.ts.map +1 -0
- package/dist/compare/extract.js +60 -0
- package/dist/compare/extract.js.map +1 -0
- package/dist/compare/fact-key.d.ts +17 -0
- package/dist/compare/fact-key.d.ts.map +1 -0
- package/dist/compare/fact-key.js +25 -0
- package/dist/compare/fact-key.js.map +1 -0
- package/dist/compare/fact-text.d.ts +28 -0
- package/dist/compare/fact-text.d.ts.map +1 -0
- package/dist/compare/fact-text.js +61 -0
- package/dist/compare/fact-text.js.map +1 -0
- package/dist/compare/facts-render.d.ts +17 -0
- package/dist/compare/facts-render.d.ts.map +1 -0
- package/dist/compare/facts-render.js +43 -0
- package/dist/compare/facts-render.js.map +1 -0
- package/dist/compare/facts-text.d.ts +15 -0
- package/dist/compare/facts-text.d.ts.map +1 -0
- package/dist/compare/facts-text.js +27 -0
- package/dist/compare/facts-text.js.map +1 -0
- package/dist/compare/markup-atoms.d.ts +11 -0
- package/dist/compare/markup-atoms.d.ts.map +1 -0
- package/dist/compare/markup-atoms.js +23 -0
- package/dist/compare/markup-atoms.js.map +1 -0
- package/dist/compare/match.d.ts +20 -0
- package/dist/compare/match.d.ts.map +1 -0
- package/dist/compare/match.js +84 -0
- package/dist/compare/match.js.map +1 -0
- package/dist/compare/outcome.d.ts +36 -0
- package/dist/compare/outcome.d.ts.map +1 -0
- package/dist/compare/outcome.js +46 -0
- package/dist/compare/outcome.js.map +1 -0
- package/dist/compare/proper-nouns.d.ts +19 -0
- package/dist/compare/proper-nouns.d.ts.map +1 -0
- package/dist/compare/proper-nouns.js +43 -0
- package/dist/compare/proper-nouns.js.map +1 -0
- package/dist/compare/render.d.ts +13 -0
- package/dist/compare/render.d.ts.map +1 -0
- package/dist/compare/render.js +64 -0
- package/dist/compare/render.js.map +1 -0
- package/dist/compare/spans.d.ts +9 -0
- package/dist/compare/spans.d.ts.map +1 -0
- package/dist/compare/spans.js +11 -0
- package/dist/compare/spans.js.map +1 -0
- package/dist/compare/text-atoms.d.ts +27 -0
- package/dist/compare/text-atoms.d.ts.map +1 -0
- package/dist/compare/text-atoms.js +69 -0
- package/dist/compare/text-atoms.js.map +1 -0
- package/dist/compare/text.d.ts +24 -0
- package/dist/compare/text.d.ts.map +1 -0
- package/dist/compare/text.js +90 -0
- package/dist/compare/text.js.map +1 -0
- package/dist/compare/tree-atoms.d.ts +20 -0
- package/dist/compare/tree-atoms.d.ts.map +1 -0
- package/dist/compare/tree-atoms.js +58 -0
- package/dist/compare/tree-atoms.js.map +1 -0
- package/dist/compare/written-names.d.ts +8 -0
- package/dist/compare/written-names.d.ts.map +1 -0
- package/dist/compare/written-names.js +24 -0
- package/dist/compare/written-names.js.map +1 -0
- package/dist/config/load.d.ts +23 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +6 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/option-problems.d.ts +17 -0
- package/dist/config/option-problems.d.ts.map +1 -0
- package/dist/config/option-problems.js +59 -0
- package/dist/config/option-problems.js.map +1 -0
- package/dist/config/read.d.ts +4 -0
- package/dist/config/read.d.ts.map +1 -0
- package/dist/config/read.js +8 -0
- package/dist/config/read.js.map +1 -0
- package/dist/config/rule-problems.d.ts +2 -4
- package/dist/config/rule-problems.d.ts.map +1 -1
- package/dist/config/rule-problems.js +7 -1
- package/dist/config/rule-problems.js.map +1 -1
- package/dist/config/style.d.ts +21 -0
- package/dist/config/style.d.ts.map +1 -0
- package/dist/config/style.js +48 -0
- package/dist/config/style.js.map +1 -0
- package/dist/config/warnings.d.ts +6 -0
- package/dist/config/warnings.d.ts.map +1 -0
- package/dist/config/warnings.js +10 -0
- package/dist/config/warnings.js.map +1 -0
- package/dist/config/write.d.ts.map +1 -1
- package/dist/config/write.js +17 -4
- package/dist/config/write.js.map +1 -1
- package/dist/custom/bounded-match.d.ts +15 -0
- package/dist/custom/bounded-match.d.ts.map +1 -0
- package/dist/custom/bounded-match.js +43 -0
- package/dist/custom/bounded-match.js.map +1 -0
- package/dist/custom/load.d.ts +11 -0
- package/dist/custom/load.d.ts.map +1 -0
- package/dist/custom/load.js +19 -0
- package/dist/custom/load.js.map +1 -0
- package/dist/custom/module-path.d.ts +11 -0
- package/dist/custom/module-path.d.ts.map +1 -0
- package/dist/custom/module-path.js +15 -0
- package/dist/custom/module-path.js.map +1 -0
- package/dist/custom/parse.d.ts +84 -0
- package/dist/custom/parse.d.ts.map +1 -0
- package/dist/custom/parse.js +258 -0
- package/dist/custom/parse.js.map +1 -0
- package/dist/custom/problems.d.ts +8 -0
- package/dist/custom/problems.d.ts.map +1 -0
- package/dist/custom/problems.js +95 -0
- package/dist/custom/problems.js.map +1 -0
- package/dist/custom/regex-safety.d.ts +11 -0
- package/dist/custom/regex-safety.d.ts.map +1 -0
- package/dist/custom/regex-safety.js +110 -0
- package/dist/custom/regex-safety.js.map +1 -0
- package/dist/custom/token-pattern.d.ts +8 -0
- package/dist/custom/token-pattern.d.ts.map +1 -0
- package/dist/custom/token-pattern.js +75 -0
- package/dist/custom/token-pattern.js.map +1 -0
- package/dist/detect-language.js +1 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +30 -2
- package/dist/detect.js.map +1 -1
- package/dist/detectors/acronym-context.d.ts +2 -0
- package/dist/detectors/acronym-context.d.ts.map +1 -1
- package/dist/detectors/acronym-context.js +12 -4
- package/dist/detectors/acronym-context.js.map +1 -1
- package/dist/detectors/ai-phrasing.d.ts +23 -0
- package/dist/detectors/ai-phrasing.d.ts.map +1 -0
- package/dist/detectors/ai-phrasing.js +116 -0
- package/dist/detectors/ai-phrasing.js.map +1 -0
- package/dist/detectors/announced-count.d.ts +4 -0
- package/dist/detectors/announced-count.d.ts.map +1 -0
- package/dist/detectors/announced-count.js +20 -0
- package/dist/detectors/announced-count.js.map +1 -0
- package/dist/detectors/bold-label.d.ts +10 -0
- package/dist/detectors/bold-label.d.ts.map +1 -0
- package/dist/detectors/bold-label.js +44 -0
- package/dist/detectors/bold-label.js.map +1 -0
- package/dist/detectors/broken-link.d.ts +17 -0
- package/dist/detectors/broken-link.d.ts.map +1 -0
- package/dist/detectors/broken-link.js +66 -0
- package/dist/detectors/broken-link.js.map +1 -0
- package/dist/detectors/cited-name.d.ts.map +1 -1
- package/dist/detectors/cited-name.js +4 -4
- package/dist/detectors/cited-name.js.map +1 -1
- package/dist/detectors/cited-title.d.ts +11 -0
- package/dist/detectors/cited-title.d.ts.map +1 -0
- package/dist/detectors/cited-title.js +75 -0
- package/dist/detectors/cited-title.js.map +1 -0
- package/dist/detectors/concrete-evidence.d.ts +1 -1
- package/dist/detectors/concrete-evidence.d.ts.map +1 -1
- package/dist/detectors/concrete-evidence.js +2 -1
- package/dist/detectors/concrete-evidence.js.map +1 -1
- package/dist/detectors/contrast-frame.d.ts +17 -0
- package/dist/detectors/contrast-frame.d.ts.map +1 -0
- package/dist/detectors/contrast-frame.js +32 -0
- package/dist/detectors/contrast-frame.js.map +1 -0
- package/dist/detectors/custom.d.ts +8 -0
- package/dist/detectors/custom.d.ts.map +1 -0
- package/dist/detectors/custom.js +71 -0
- package/dist/detectors/custom.js.map +1 -0
- package/dist/detectors/dangling-figure.d.ts +7 -0
- package/dist/detectors/dangling-figure.d.ts.map +1 -0
- package/dist/detectors/dangling-figure.js +20 -0
- package/dist/detectors/dangling-figure.js.map +1 -0
- package/dist/detectors/definition-use.d.ts +8 -0
- package/dist/detectors/definition-use.d.ts.map +1 -0
- package/dist/detectors/definition-use.js +32 -0
- package/dist/detectors/definition-use.js.map +1 -0
- package/dist/detectors/doubled-punctuation.d.ts +9 -0
- package/dist/detectors/doubled-punctuation.d.ts.map +1 -0
- package/dist/detectors/doubled-punctuation.js +35 -0
- package/dist/detectors/doubled-punctuation.js.map +1 -0
- package/dist/detectors/doubled-word.d.ts +5 -0
- package/dist/detectors/doubled-word.d.ts.map +1 -1
- package/dist/detectors/doubled-word.js +24 -11
- package/dist/detectors/doubled-word.js.map +1 -1
- package/dist/detectors/duplicate-heading.d.ts +14 -0
- package/dist/detectors/duplicate-heading.d.ts.map +1 -0
- package/dist/detectors/duplicate-heading.js +39 -0
- package/dist/detectors/duplicate-heading.js.map +1 -0
- package/dist/detectors/empty-section.d.ts +8 -0
- package/dist/detectors/empty-section.d.ts.map +1 -0
- package/dist/detectors/empty-section.js +16 -0
- package/dist/detectors/empty-section.js.map +1 -0
- package/dist/detectors/enumerated-runs.d.ts +1 -1
- package/dist/detectors/enumerated-runs.d.ts.map +1 -1
- package/dist/detectors/enumerated-runs.js +15 -4
- package/dist/detectors/enumerated-runs.js.map +1 -1
- package/dist/detectors/fullwidth-alnum.d.ts +24 -0
- package/dist/detectors/fullwidth-alnum.d.ts.map +1 -0
- package/dist/detectors/fullwidth-alnum.js +88 -0
- package/dist/detectors/fullwidth-alnum.js.map +1 -0
- package/dist/detectors/gram-furniture.d.ts +6 -0
- package/dist/detectors/gram-furniture.d.ts.map +1 -0
- package/dist/detectors/gram-furniture.js +21 -0
- package/dist/detectors/gram-furniture.js.map +1 -0
- package/dist/detectors/gram-place.d.ts +2 -0
- package/dist/detectors/gram-place.d.ts.map +1 -1
- package/dist/detectors/gram-place.js +9 -7
- package/dist/detectors/gram-place.js.map +1 -1
- package/dist/detectors/gram-windows.d.ts +9 -0
- package/dist/detectors/gram-windows.d.ts.map +1 -0
- package/dist/detectors/gram-windows.js +27 -0
- package/dist/detectors/gram-windows.js.map +1 -0
- package/dist/detectors/hankaku-kana.d.ts +9 -0
- package/dist/detectors/hankaku-kana.d.ts.map +1 -0
- package/dist/detectors/hankaku-kana.js +27 -0
- package/dist/detectors/hankaku-kana.js.map +1 -0
- package/dist/detectors/heading-case.d.ts +2 -0
- package/dist/detectors/heading-case.d.ts.map +1 -1
- package/dist/detectors/heading-case.js +29 -2
- package/dist/detectors/heading-case.js.map +1 -1
- package/dist/detectors/heading-code-words.d.ts +6 -0
- package/dist/detectors/heading-code-words.d.ts.map +1 -0
- package/dist/detectors/heading-code-words.js +29 -0
- package/dist/detectors/heading-code-words.js.map +1 -0
- package/dist/detectors/heading-echo.d.ts.map +1 -1
- package/dist/detectors/heading-echo.js +7 -4
- package/dist/detectors/heading-echo.js.map +1 -1
- package/dist/detectors/heading-level-skip.d.ts +12 -0
- package/dist/detectors/heading-level-skip.d.ts.map +1 -0
- package/dist/detectors/heading-level-skip.js +11 -0
- package/dist/detectors/heading-level-skip.js.map +1 -0
- package/dist/detectors/image-alt-text.d.ts +3 -0
- package/dist/detectors/image-alt-text.d.ts.map +1 -0
- package/dist/detectors/image-alt-text.js +9 -0
- package/dist/detectors/image-alt-text.js.map +1 -0
- package/dist/detectors/index.d.ts.map +1 -1
- package/dist/detectors/index.js +70 -1
- package/dist/detectors/index.js.map +1 -1
- package/dist/detectors/invisible-character.d.ts +20 -0
- package/dist/detectors/invisible-character.d.ts.map +1 -0
- package/dist/detectors/invisible-character.js +143 -0
- package/dist/detectors/invisible-character.js.map +1 -0
- package/dist/detectors/kutoten-consistency.d.ts +24 -0
- package/dist/detectors/kutoten-consistency.d.ts.map +1 -0
- package/dist/detectors/kutoten-consistency.js +77 -0
- package/dist/detectors/kutoten-consistency.js.map +1 -0
- package/dist/detectors/lead-in.d.ts +1 -0
- package/dist/detectors/lead-in.d.ts.map +1 -1
- package/dist/detectors/lead-in.js +2 -1
- package/dist/detectors/lead-in.js.map +1 -1
- package/dist/detectors/lexicon-match.d.ts +14 -1
- package/dist/detectors/lexicon-match.d.ts.map +1 -1
- package/dist/detectors/lexicon-match.js +32 -2
- package/dist/detectors/lexicon-match.js.map +1 -1
- package/dist/detectors/lexicon.d.ts +6 -1
- package/dist/detectors/lexicon.d.ts.map +1 -1
- package/dist/detectors/lexicon.js +31 -13
- package/dist/detectors/lexicon.js.map +1 -1
- package/dist/detectors/list-item.d.ts +45 -0
- package/dist/detectors/list-item.d.ts.map +1 -0
- package/dist/detectors/list-item.js +88 -0
- package/dist/detectors/list-item.js.map +1 -0
- package/dist/detectors/list-items.d.ts +31 -0
- package/dist/detectors/list-items.d.ts.map +1 -0
- package/dist/detectors/list-items.js +113 -0
- package/dist/detectors/list-items.js.map +1 -0
- package/dist/detectors/list-lead-in.d.ts +7 -0
- package/dist/detectors/list-lead-in.d.ts.map +1 -0
- package/dist/detectors/list-lead-in.js +28 -0
- package/dist/detectors/list-lead-in.js.map +1 -0
- package/dist/detectors/list-sentence.d.ts +67 -0
- package/dist/detectors/list-sentence.d.ts.map +1 -0
- package/dist/detectors/list-sentence.js +130 -0
- package/dist/detectors/list-sentence.js.map +1 -0
- package/dist/detectors/list-view.d.ts +34 -0
- package/dist/detectors/list-view.d.ts.map +1 -0
- package/dist/detectors/list-view.js +137 -0
- package/dist/detectors/list-view.js.map +1 -0
- package/dist/detectors/long-vowel.d.ts +7 -0
- package/dist/detectors/long-vowel.d.ts.map +1 -0
- package/dist/detectors/long-vowel.js +71 -0
- package/dist/detectors/long-vowel.js.map +1 -0
- package/dist/detectors/markup-finding.d.ts +8 -0
- package/dist/detectors/markup-finding.d.ts.map +1 -0
- package/dist/detectors/markup-finding.js +29 -0
- package/dist/detectors/markup-finding.js.map +1 -0
- package/dist/detectors/modal-conflict.d.ts +4 -0
- package/dist/detectors/modal-conflict.d.ts.map +1 -0
- package/dist/detectors/modal-conflict.js +22 -0
- package/dist/detectors/modal-conflict.js.map +1 -0
- package/dist/detectors/name-numeral.d.ts +1 -1
- package/dist/detectors/name-numeral.d.ts.map +1 -1
- package/dist/detectors/name-numeral.js +2 -7
- package/dist/detectors/name-numeral.js.map +1 -1
- package/dist/detectors/name-variant.d.ts +4 -0
- package/dist/detectors/name-variant.d.ts.map +1 -0
- package/dist/detectors/name-variant.js +13 -0
- package/dist/detectors/name-variant.js.map +1 -0
- package/dist/detectors/nominalization.d.ts +11 -0
- package/dist/detectors/nominalization.d.ts.map +1 -0
- package/dist/detectors/nominalization.js +56 -0
- package/dist/detectors/nominalization.js.map +1 -0
- package/dist/detectors/orthography.d.ts.map +1 -1
- package/dist/detectors/orthography.js +72 -37
- package/dist/detectors/orthography.js.map +1 -1
- package/dist/detectors/outside-announced-list.d.ts +4 -0
- package/dist/detectors/outside-announced-list.d.ts.map +1 -0
- package/dist/detectors/outside-announced-list.js +24 -0
- package/dist/detectors/outside-announced-list.js.map +1 -0
- package/dist/detectors/oxford-comma.d.ts +7 -1
- package/dist/detectors/oxford-comma.d.ts.map +1 -1
- package/dist/detectors/oxford-comma.js +136 -229
- package/dist/detectors/oxford-comma.js.map +1 -1
- package/dist/detectors/phrase-match.d.ts +4 -1
- package/dist/detectors/phrase-match.d.ts.map +1 -1
- package/dist/detectors/phrase-match.js +26 -7
- package/dist/detectors/phrase-match.js.map +1 -1
- package/dist/detectors/place-run.d.ts.map +1 -1
- package/dist/detectors/place-run.js +10 -6
- package/dist/detectors/place-run.js.map +1 -1
- package/dist/detectors/placeholder-text.d.ts +9 -0
- package/dist/detectors/placeholder-text.d.ts.map +1 -0
- package/dist/detectors/placeholder-text.js +18 -0
- package/dist/detectors/placeholder-text.js.map +1 -0
- package/dist/detectors/quote-around.d.ts +3 -0
- package/dist/detectors/quote-around.d.ts.map +1 -0
- package/dist/detectors/quote-around.js +8 -0
- package/dist/detectors/quote-around.js.map +1 -0
- package/dist/detectors/ra-nuki.d.ts +9 -0
- package/dist/detectors/ra-nuki.d.ts.map +1 -0
- package/dist/detectors/ra-nuki.js +30 -0
- package/dist/detectors/ra-nuki.js.map +1 -0
- package/dist/detectors/register.d.ts +11 -3
- package/dist/detectors/register.d.ts.map +1 -1
- package/dist/detectors/register.js +28 -9
- package/dist/detectors/register.js.map +1 -1
- package/dist/detectors/requirement-modal.d.ts +5 -0
- package/dist/detectors/requirement-modal.d.ts.map +1 -0
- package/dist/detectors/requirement-modal.js +54 -0
- package/dist/detectors/requirement-modal.js.map +1 -0
- package/dist/detectors/requirement-smell.d.ts +4 -0
- package/dist/detectors/requirement-smell.d.ts.map +1 -0
- package/dist/detectors/requirement-smell.js +41 -0
- package/dist/detectors/requirement-smell.js.map +1 -0
- package/dist/detectors/roman-numeral.d.ts +2 -0
- package/dist/detectors/roman-numeral.d.ts.map +1 -1
- package/dist/detectors/roman-numeral.js +2 -0
- package/dist/detectors/roman-numeral.js.map +1 -1
- package/dist/detectors/sentence-ending.d.ts +17 -1
- package/dist/detectors/sentence-ending.d.ts.map +1 -1
- package/dist/detectors/sentence-ending.js +13 -7
- package/dist/detectors/sentence-ending.js.map +1 -1
- package/dist/detectors/sentence-length.d.ts.map +1 -1
- package/dist/detectors/sentence-length.js +13 -4
- package/dist/detectors/sentence-length.js.map +1 -1
- package/dist/detectors/signals.d.ts +8 -0
- package/dist/detectors/signals.d.ts.map +1 -1
- package/dist/detectors/signals.js +67 -46
- package/dist/detectors/signals.js.map +1 -1
- package/dist/detectors/space-before-punctuation.d.ts +8 -0
- package/dist/detectors/space-before-punctuation.d.ts.map +1 -0
- package/dist/detectors/space-before-punctuation.js +24 -0
- package/dist/detectors/space-before-punctuation.js.map +1 -0
- package/dist/detectors/spelling-variety.d.ts +23 -0
- package/dist/detectors/spelling-variety.d.ts.map +1 -0
- package/dist/detectors/spelling-variety.js +59 -0
- package/dist/detectors/spelling-variety.js.map +1 -0
- package/dist/detectors/structure-tree.d.ts +6 -0
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +39 -1
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/structure.d.ts +1 -3
- package/dist/detectors/structure.d.ts.map +1 -1
- package/dist/detectors/structure.js +19 -6
- package/dist/detectors/structure.js.map +1 -1
- package/dist/detectors/superlative-comparison.d.ts +20 -0
- package/dist/detectors/superlative-comparison.d.ts.map +1 -0
- package/dist/detectors/superlative-comparison.js +32 -0
- package/dist/detectors/superlative-comparison.js.map +1 -0
- package/dist/detectors/superlative-name.d.ts.map +1 -1
- package/dist/detectors/superlative-name.js +8 -5
- package/dist/detectors/superlative-name.js.map +1 -1
- package/dist/detectors/superlative-scope.d.ts.map +1 -1
- package/dist/detectors/superlative-scope.js +9 -4
- package/dist/detectors/superlative-scope.js.map +1 -1
- package/dist/detectors/token-column.d.ts +46 -0
- package/dist/detectors/token-column.d.ts.map +1 -0
- package/dist/detectors/token-column.js +95 -0
- package/dist/detectors/token-column.js.map +1 -0
- package/dist/detectors/unbalanced-bracket.d.ts +22 -0
- package/dist/detectors/unbalanced-bracket.d.ts.map +1 -0
- package/dist/detectors/unbalanced-bracket.js +119 -0
- package/dist/detectors/unbalanced-bracket.js.map +1 -0
- package/dist/detectors/url-run-on.d.ts +9 -0
- package/dist/detectors/url-run-on.d.ts.map +1 -0
- package/dist/detectors/url-run-on.js +24 -0
- package/dist/detectors/url-run-on.js.map +1 -0
- package/dist/detectors/vague-figure-pointer.d.ts +10 -0
- package/dist/detectors/vague-figure-pointer.d.ts.map +1 -0
- package/dist/detectors/vague-figure-pointer.js +46 -0
- package/dist/detectors/vague-figure-pointer.js.map +1 -0
- package/dist/detectors/word-list.d.ts +2 -0
- package/dist/detectors/word-list.d.ts.map +1 -1
- package/dist/detectors/word-list.js +4 -1
- package/dist/detectors/word-list.js.map +1 -1
- package/dist/document-sections.d.ts +13 -0
- package/dist/document-sections.d.ts.map +1 -0
- package/dist/document-sections.js +32 -0
- package/dist/document-sections.js.map +1 -0
- package/dist/document.d.ts +20 -7
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +140 -125
- package/dist/document.js.map +1 -1
- package/dist/email-parts.d.ts +28 -0
- package/dist/email-parts.d.ts.map +1 -0
- package/dist/email-parts.js +230 -0
- package/dist/email-parts.js.map +1 -0
- package/dist/eval.d.ts +2 -1
- package/dist/eval.d.ts.map +1 -1
- package/dist/eval.js +16 -4
- package/dist/eval.js.map +1 -1
- package/dist/extension/document-view.d.ts +7 -0
- package/dist/extension/document-view.d.ts.map +1 -0
- package/dist/extension/document-view.js +91 -0
- package/dist/extension/document-view.js.map +1 -0
- package/dist/extension/failure-text.d.ts +5 -0
- package/dist/extension/failure-text.d.ts.map +1 -0
- package/dist/extension/failure-text.js +33 -0
- package/dist/extension/failure-text.js.map +1 -0
- package/dist/extension/import-default.d.ts +7 -0
- package/dist/extension/import-default.d.ts.map +1 -0
- package/dist/extension/import-default.js +21 -0
- package/dist/extension/import-default.js.map +1 -0
- package/dist/extension/load.d.ts +28 -0
- package/dist/extension/load.d.ts.map +1 -0
- package/dist/extension/load.js +51 -0
- package/dist/extension/load.js.map +1 -0
- package/dist/extension/module-detector.d.ts +21 -0
- package/dist/extension/module-detector.d.ts.map +1 -0
- package/dist/extension/module-detector.js +49 -0
- package/dist/extension/module-detector.js.map +1 -0
- package/dist/extension/plugin-load.d.ts +9 -0
- package/dist/extension/plugin-load.d.ts.map +1 -0
- package/dist/extension/plugin-load.js +68 -0
- package/dist/extension/plugin-load.js.map +1 -0
- package/dist/extension/plugin-name.d.ts +8 -0
- package/dist/extension/plugin-name.d.ts.map +1 -0
- package/dist/extension/plugin-name.js +22 -0
- package/dist/extension/plugin-name.js.map +1 -0
- package/dist/extension/plugin-parse.d.ts +41 -0
- package/dist/extension/plugin-parse.d.ts.map +1 -0
- package/dist/extension/plugin-parse.js +156 -0
- package/dist/extension/plugin-parse.js.map +1 -0
- package/dist/extension/problem-text.d.ts +5 -0
- package/dist/extension/problem-text.d.ts.map +1 -0
- package/dist/extension/problem-text.js +74 -0
- package/dist/extension/problem-text.js.map +1 -0
- package/dist/extension/real-path.d.ts +3 -0
- package/dist/extension/real-path.d.ts.map +1 -0
- package/dist/extension/real-path.js +8 -0
- package/dist/extension/real-path.js.map +1 -0
- package/dist/extension/returned-findings.d.ts +17 -0
- package/dist/extension/returned-findings.d.ts.map +1 -0
- package/dist/extension/returned-findings.js +48 -0
- package/dist/extension/returned-findings.js.map +1 -0
- package/dist/extension/rule-export.d.ts +13 -0
- package/dist/extension/rule-export.d.ts.map +1 -0
- package/dist/extension/rule-export.js +16 -0
- package/dist/extension/rule-export.js.map +1 -0
- package/dist/feedback/draft.d.ts +2 -0
- package/dist/feedback/draft.d.ts.map +1 -1
- package/dist/feedback/draft.js +3 -0
- package/dist/feedback/draft.js.map +1 -1
- package/dist/figure-references.d.ts +39 -0
- package/dist/figure-references.d.ts.map +1 -0
- package/dist/figure-references.js +113 -0
- package/dist/figure-references.js.map +1 -0
- package/dist/files.d.ts +2 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +4 -0
- package/dist/files.js.map +1 -1
- package/dist/finding-order.d.ts +9 -0
- package/dist/finding-order.d.ts.map +1 -0
- package/dist/finding-order.js +3 -0
- package/dist/finding-order.js.map +1 -0
- package/dist/fix-plan/mode.d.ts +21 -0
- package/dist/fix-plan/mode.d.ts.map +1 -0
- package/dist/fix-plan/mode.js +16 -0
- package/dist/fix-plan/mode.js.map +1 -0
- package/dist/fix-plan/plan.d.ts +77 -0
- package/dist/fix-plan/plan.d.ts.map +1 -0
- package/dist/fix-plan/plan.js +100 -0
- package/dist/fix-plan/plan.js.map +1 -0
- package/dist/fix-plan/render.d.ts +6 -0
- package/dist/fix-plan/render.d.ts.map +1 -0
- package/dist/fix-plan/render.js +101 -0
- package/dist/fix-plan/render.js.map +1 -0
- package/dist/fix-plan/text.d.ts +35 -0
- package/dist/fix-plan/text.d.ts.map +1 -0
- package/dist/fix-plan/text.js +95 -0
- package/dist/fix-plan/text.js.map +1 -0
- package/dist/heading-label.d.ts +22 -0
- package/dist/heading-label.d.ts.map +1 -0
- package/dist/heading-label.js +50 -0
- package/dist/heading-label.js.map +1 -0
- package/dist/in-page-nav.d.ts +4 -1
- package/dist/in-page-nav.d.ts.map +1 -1
- package/dist/in-page-nav.js +53 -18
- package/dist/in-page-nav.js.map +1 -1
- package/dist/joined-view.d.ts.map +1 -1
- package/dist/joined-view.js +1 -0
- package/dist/joined-view.js.map +1 -1
- package/dist/language-sample.d.ts +2 -0
- package/dist/language-sample.d.ts.map +1 -0
- package/dist/language-sample.js +41 -0
- package/dist/language-sample.js.map +1 -0
- package/dist/levels.d.ts +5 -1
- package/dist/levels.d.ts.map +1 -1
- package/dist/levels.js +9 -0
- package/dist/levels.js.map +1 -1
- package/dist/line-paragraphs.d.ts +8 -0
- package/dist/line-paragraphs.d.ts.map +1 -1
- package/dist/line-paragraphs.js +33 -10
- package/dist/line-paragraphs.js.map +1 -1
- package/dist/link-line.d.ts +8 -0
- package/dist/link-line.d.ts.map +1 -0
- package/dist/link-line.js +12 -0
- package/dist/link-line.js.map +1 -0
- package/dist/long-vowel.d.ts +38 -0
- package/dist/long-vowel.d.ts.map +1 -0
- package/dist/long-vowel.js +78 -0
- package/dist/long-vowel.js.map +1 -0
- package/dist/markdown-node.d.ts +19 -0
- package/dist/markdown-node.d.ts.map +1 -0
- package/dist/markdown-node.js +6 -0
- package/dist/markdown-node.js.map +1 -0
- package/dist/markdown-read.d.ts +17 -0
- package/dist/markdown-read.d.ts.map +1 -0
- package/dist/markdown-read.js +37 -0
- package/dist/markdown-read.js.map +1 -0
- package/dist/markup.d.ts +22 -0
- package/dist/markup.d.ts.map +1 -0
- package/dist/markup.js +182 -0
- package/dist/markup.js.map +1 -0
- package/dist/mask.js +8 -5
- package/dist/mask.js.map +1 -1
- package/dist/name-variants.d.ts +25 -0
- package/dist/name-variants.d.ts.map +1 -0
- package/dist/name-variants.js +181 -0
- package/dist/name-variants.js.map +1 -0
- package/dist/node-version.d.ts +7 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +19 -0
- package/dist/node-version.js.map +1 -0
- package/dist/not-run.d.ts +14 -0
- package/dist/not-run.d.ts.map +1 -0
- package/dist/not-run.js +12 -0
- package/dist/not-run.js.map +1 -0
- package/dist/number-name.d.ts +21 -5
- package/dist/number-name.d.ts.map +1 -1
- package/dist/number-name.js +119 -17
- package/dist/number-name.js.map +1 -1
- package/dist/orthography.d.ts +10 -1
- package/dist/orthography.d.ts.map +1 -1
- package/dist/orthography.js +42 -16
- package/dist/orthography.js.map +1 -1
- package/dist/outline/render.d.ts +18 -0
- package/dist/outline/render.d.ts.map +1 -0
- package/dist/outline/render.js +60 -0
- package/dist/outline/render.js.map +1 -0
- package/dist/outline/shape.d.ts +26 -0
- package/dist/outline/shape.d.ts.map +1 -0
- package/dist/outline/shape.js +37 -0
- package/dist/outline/shape.js.map +1 -0
- package/dist/outline/text.d.ts +21 -0
- package/dist/outline/text.d.ts.map +1 -0
- package/dist/outline/text.js +30 -0
- package/dist/outline/text.js.map +1 -0
- package/dist/page-furniture.d.ts +5 -2
- package/dist/page-furniture.d.ts.map +1 -1
- package/dist/page-furniture.js +8 -2
- package/dist/page-furniture.js.map +1 -1
- package/dist/plain-source.d.ts +1 -0
- package/dist/plain-source.d.ts.map +1 -1
- package/dist/plain-source.js +2 -1
- package/dist/plain-source.js.map +1 -1
- package/dist/plugin.d.ts +138 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/profile/for-file.d.ts.map +1 -1
- package/dist/profile/for-file.js +3 -1
- package/dist/profile/for-file.js.map +1 -1
- package/dist/quoted-span.d.ts.map +1 -1
- package/dist/quoted-span.js +8 -3
- package/dist/quoted-span.js.map +1 -1
- package/dist/reasons.d.ts +4 -0
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +8 -0
- package/dist/reasons.js.map +1 -1
- package/dist/reference-lists.d.ts +3 -0
- package/dist/reference-lists.d.ts.map +1 -0
- package/dist/reference-lists.js +75 -0
- package/dist/reference-lists.js.map +1 -0
- package/dist/render/compact.d.ts +3 -1
- package/dist/render/compact.d.ts.map +1 -1
- package/dist/render/compact.js +8 -2
- package/dist/render/compact.js.map +1 -1
- package/dist/render/explain.d.ts +9 -1
- package/dist/render/explain.d.ts.map +1 -1
- package/dist/render/explain.js +54 -13
- package/dist/render/explain.js.map +1 -1
- package/dist/render/friendly.d.ts.map +1 -1
- package/dist/render/friendly.js +19 -9
- package/dist/render/friendly.js.map +1 -1
- package/dist/render/options.d.ts +7 -0
- package/dist/render/options.d.ts.map +1 -0
- package/dist/render/options.js +50 -0
- package/dist/render/options.js.map +1 -0
- package/dist/render/rules-json.d.ts +4 -1
- package/dist/render/rules-json.d.ts.map +1 -1
- package/dist/render/rules-json.js +110 -16
- package/dist/render/rules-json.js.map +1 -1
- package/dist/render/rules-table.d.ts +4 -0
- package/dist/render/rules-table.d.ts.map +1 -0
- package/dist/render/rules-table.js +70 -0
- package/dist/render/rules-table.js.map +1 -0
- package/dist/render/sarif.js +4 -4
- package/dist/render/sarif.js.map +1 -1
- package/dist/render/semantic.js +3 -3
- package/dist/render/semantic.js.map +1 -1
- package/dist/render/severity-name.d.ts +6 -0
- package/dist/render/severity-name.d.ts.map +1 -0
- package/dist/render/severity-name.js +7 -0
- package/dist/render/severity-name.js.map +1 -0
- package/dist/render/suppressions.d.ts +3 -0
- package/dist/render/suppressions.d.ts.map +1 -1
- package/dist/render/suppressions.js +20 -1
- package/dist/render/suppressions.js.map +1 -1
- package/dist/render/text.d.ts +7 -2
- package/dist/render/text.d.ts.map +1 -1
- package/dist/render/text.js +15 -4
- package/dist/render/text.js.map +1 -1
- package/dist/resolve-genre.d.ts +1 -1
- package/dist/resolve-genre.d.ts.map +1 -1
- package/dist/resolve-genre.js +4 -1
- package/dist/resolve-genre.js.map +1 -1
- package/dist/rule-genres.d.ts +24 -0
- package/dist/rule-genres.d.ts.map +1 -0
- package/dist/rule-genres.js +11 -0
- package/dist/rule-genres.js.map +1 -0
- package/dist/rule-guide.d.ts +73 -0
- package/dist/rule-guide.d.ts.map +1 -0
- package/dist/rule-guide.js +95 -0
- package/dist/rule-guide.js.map +1 -0
- package/dist/rule-load.d.ts.map +1 -1
- package/dist/rule-load.js +87 -33
- package/dist/rule-load.js.map +1 -1
- package/dist/rule-options.d.ts +50 -0
- package/dist/rule-options.d.ts.map +1 -0
- package/dist/rule-options.js +106 -0
- package/dist/rule-options.js.map +1 -0
- package/dist/run-semantic.d.ts.map +1 -1
- package/dist/run-semantic.js +2 -1
- package/dist/run-semantic.js.map +1 -1
- package/dist/run.d.ts +18 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +80 -19
- package/dist/run.js.map +1 -1
- package/dist/sentence-shape.d.ts.map +1 -1
- package/dist/sentence-shape.js +4 -4
- package/dist/sentence-shape.js.map +1 -1
- package/dist/setting-problems.d.ts +2 -1
- package/dist/setting-problems.d.ts.map +1 -1
- package/dist/setting-problems.js +8 -1
- package/dist/setting-problems.js.map +1 -1
- package/dist/spacing-minority.d.ts +16 -0
- package/dist/spacing-minority.d.ts.map +1 -0
- package/dist/spacing-minority.js +23 -0
- package/dist/spacing-minority.js.map +1 -0
- package/dist/span-cut.d.ts +6 -0
- package/dist/span-cut.d.ts.map +1 -0
- package/dist/span-cut.js +22 -0
- package/dist/span-cut.js.map +1 -0
- package/dist/stet-block.d.ts +5 -0
- package/dist/stet-block.d.ts.map +1 -0
- package/dist/stet-block.js +59 -0
- package/dist/stet-block.js.map +1 -0
- package/dist/stet.d.ts +4 -0
- package/dist/stet.d.ts.map +1 -1
- package/dist/stet.js +31 -11
- package/dist/stet.js.map +1 -1
- package/dist/structure/aside-depth.d.ts +21 -0
- package/dist/structure/aside-depth.d.ts.map +1 -0
- package/dist/structure/aside-depth.js +65 -0
- package/dist/structure/aside-depth.js.map +1 -0
- package/dist/structure/build.d.ts +5 -1
- package/dist/structure/build.d.ts.map +1 -1
- package/dist/structure/build.js +29 -17
- package/dist/structure/build.js.map +1 -1
- package/dist/structure/closed-pairs.d.ts +8 -0
- package/dist/structure/closed-pairs.d.ts.map +1 -0
- package/dist/structure/closed-pairs.js +22 -0
- package/dist/structure/closed-pairs.js.map +1 -0
- package/dist/structure/date-range.d.ts +31 -0
- package/dist/structure/date-range.d.ts.map +1 -0
- package/dist/structure/date-range.js +77 -0
- package/dist/structure/date-range.js.map +1 -0
- package/dist/structure/definition-use.d.ts +32 -0
- package/dist/structure/definition-use.d.ts.map +1 -0
- package/dist/structure/definition-use.js +102 -0
- package/dist/structure/definition-use.js.map +1 -0
- package/dist/structure/known-mentions.d.ts +18 -0
- package/dist/structure/known-mentions.d.ts.map +1 -0
- package/dist/structure/known-mentions.js +78 -0
- package/dist/structure/known-mentions.js.map +1 -0
- package/dist/structure/lazy-tree.d.ts +8 -0
- package/dist/structure/lazy-tree.d.ts.map +1 -0
- package/dist/structure/lazy-tree.js +14 -0
- package/dist/structure/lazy-tree.js.map +1 -0
- package/dist/structure/modal-conflict.d.ts +28 -0
- package/dist/structure/modal-conflict.d.ts.map +1 -0
- package/dist/structure/modal-conflict.js +74 -0
- package/dist/structure/modal-conflict.js.map +1 -0
- package/dist/structure/numbered-clauses.d.ts +4 -0
- package/dist/structure/numbered-clauses.d.ts.map +1 -0
- package/dist/structure/numbered-clauses.js +9 -0
- package/dist/structure/numbered-clauses.js.map +1 -0
- package/dist/structure/numbering.d.ts +1 -0
- package/dist/structure/numbering.d.ts.map +1 -1
- package/dist/structure/numbering.js +11 -6
- package/dist/structure/numbering.js.map +1 -1
- package/dist/structure/of.d.ts +3 -1
- package/dist/structure/of.d.ts.map +1 -1
- package/dist/structure/of.js +5 -1
- package/dist/structure/of.js.map +1 -1
- package/dist/structure/percent-sum.d.ts +16 -0
- package/dist/structure/percent-sum.d.ts.map +1 -0
- package/dist/structure/percent-sum.js +104 -0
- package/dist/structure/percent-sum.js.map +1 -0
- package/dist/structure/quoted-number.d.ts +8 -0
- package/dist/structure/quoted-number.d.ts.map +1 -0
- package/dist/structure/quoted-number.js +34 -0
- package/dist/structure/quoted-number.js.map +1 -0
- package/dist/structure/relative-find.d.ts.map +1 -1
- package/dist/structure/relative-find.js +34 -46
- package/dist/structure/relative-find.js.map +1 -1
- package/dist/structure/relative-resolve.d.ts.map +1 -1
- package/dist/structure/relative-resolve.js +76 -30
- package/dist/structure/relative-resolve.js.map +1 -1
- package/dist/structure/runs.d.ts +2 -0
- package/dist/structure/runs.d.ts.map +1 -1
- package/dist/structure/runs.js +2 -2
- package/dist/structure/runs.js.map +1 -1
- package/dist/structure/sexp.d.ts +1 -1
- package/dist/structure/sexp.d.ts.map +1 -1
- package/dist/structure/sexp.js +18 -6
- package/dist/structure/sexp.js.map +1 -1
- package/dist/structure/total.d.ts +3 -0
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +2 -2
- package/dist/structure/total.js.map +1 -1
- package/dist/structure/universal.d.ts +14 -2
- package/dist/structure/universal.d.ts.map +1 -1
- package/dist/structure/universal.js +24 -3
- package/dist/structure/universal.js.map +1 -1
- package/dist/structure/wrapped-tail.d.ts +14 -7
- package/dist/structure/wrapped-tail.d.ts.map +1 -1
- package/dist/structure/wrapped-tail.js +33 -8
- package/dist/structure/wrapped-tail.js.map +1 -1
- package/dist/style-load.d.ts +4 -0
- package/dist/style-load.d.ts.map +1 -0
- package/dist/style-load.js +28 -0
- package/dist/style-load.js.map +1 -0
- package/dist/style-parse.d.ts +25 -0
- package/dist/style-parse.d.ts.map +1 -0
- package/dist/style-parse.js +88 -0
- package/dist/style-parse.js.map +1 -0
- package/dist/subheading-line.d.ts +23 -0
- package/dist/subheading-line.d.ts.map +1 -0
- package/dist/subheading-line.js +85 -0
- package/dist/subheading-line.js.map +1 -0
- package/dist/tag-coverage.d.ts +8 -0
- package/dist/tag-coverage.d.ts.map +1 -0
- package/dist/tag-coverage.js +7 -0
- package/dist/tag-coverage.js.map +1 -0
- package/dist/template-syntax.d.ts +17 -0
- package/dist/template-syntax.d.ts.map +1 -0
- package/dist/template-syntax.js +140 -0
- package/dist/template-syntax.js.map +1 -0
- package/dist/text-above.d.ts +19 -0
- package/dist/text-above.d.ts.map +1 -0
- package/dist/text-above.js +43 -0
- package/dist/text-above.js.map +1 -0
- package/dist/text-figures.d.ts +10 -0
- package/dist/text-figures.d.ts.map +1 -0
- package/dist/text-figures.js +131 -0
- package/dist/text-figures.js.map +1 -0
- package/dist/trailing-aside.d.ts +2 -0
- package/dist/trailing-aside.d.ts.map +1 -0
- package/dist/trailing-aside.js +53 -0
- package/dist/trailing-aside.js.map +1 -0
- package/dist/tree-walk.d.ts +18 -0
- package/dist/tree-walk.d.ts.map +1 -0
- package/dist/tree-walk.js +45 -0
- package/dist/tree-walk.js.map +1 -0
- package/genres.yaml +68 -0
- package/package.json +9 -3
- package/reference-headings.yaml +17 -0
- package/rules/acronym-expansion-conflict.yaml +82 -0
- package/rules/adverb-overuse.yaml +19 -0
- package/rules/agentless-passive.yaml +47 -0
- package/rules/agreement-slip.yaml +14 -1
- package/rules/ai-generated-composite.yaml +102 -0
- package/rules/ai-tell.yaml +57 -0
- package/rules/announced-count-mismatch.yaml +57 -0
- package/rules/announcing-opener.yaml +82 -0
- package/rules/assistant-residue.yaml +82 -0
- package/rules/bold-density.yaml +59 -0
- package/rules/bold-label-list.yaml +81 -0
- package/rules/broken-link.yaml +65 -0
- package/rules/closing-cliche.yaml +58 -0
- package/rules/colon-lead-in.yaml +83 -0
- package/rules/concrete-evidence-density.yaml +41 -0
- package/rules/contraction-consistency.yaml +18 -0
- package/rules/contrast-framing.yaml +88 -0
- package/rules/cushion-phrase-density.yaml +53 -1
- package/rules/dangling-figure-reference.yaml +61 -0
- package/rules/dangling-reference.yaml +54 -1
- package/rules/date-order.yaml +34 -1
- package/rules/date-range-reversed.yaml +46 -0
- package/rules/date-weekday-mismatch.yaml +17 -1
- package/rules/double-keigo.yaml +16 -0
- package/rules/double-negative.yaml +51 -0
- package/rules/doubled-punctuation.yaml +45 -0
- package/rules/doubled-word.yaml +18 -2
- package/rules/duplicate-definition.yaml +59 -1
- package/rules/duplicate-heading.yaml +78 -0
- package/rules/emoji-density.yaml +28 -2
- package/rules/empty-conclusion.yaml +28 -0
- package/rules/empty-intensifier.yaml +44 -0
- package/rules/empty-section.yaml +74 -0
- package/rules/excessive-hedging.yaml +49 -2
- package/rules/expletive-construction.yaml +19 -0
- package/rules/fullwidth-alnum-consistency.yaml +53 -0
- package/rules/hankaku-kana.yaml +41 -0
- package/rules/heading-echo.yaml +31 -0
- package/rules/heading-level-skip.yaml +78 -0
- package/rules/hiragana-fukushi.yaml +16 -0
- package/rules/image-alt-text.yaml +54 -0
- package/rules/internal-jargon.yaml +21 -0
- package/rules/invisible-character.yaml +63 -0
- package/rules/katakana-long-vowel.yaml +99 -0
- package/rules/kutoten-consistency.yaml +53 -0
- package/rules/latin-spacing.yaml +30 -4
- package/rules/max-kanji-continuous.yaml +17 -0
- package/rules/max-paragraph-length.yaml +34 -0
- package/rules/max-sentence-length.yaml +58 -0
- package/rules/modal-conflict.yaml +106 -0
- package/rules/name-variant.yaml +88 -0
- package/rules/ngram-repetition.yaml +29 -2
- package/rules/no-doubled-joshi.yaml +17 -0
- package/rules/no-em-dash.yaml +49 -0
- package/rules/no-mixed-desumasu.yaml +28 -2
- package/rules/no-nakaguro-parallel.yaml +20 -0
- package/rules/nominalization.yaml +89 -0
- package/rules/numbering-gap.yaml +53 -1
- package/rules/outside-announced-list.yaml +80 -0
- package/rules/oxford-comma-consistency.yaml +18 -0
- package/rules/padded-intro.yaml +44 -0
- package/rules/paragraph-length-variance.yaml +73 -0
- package/rules/percent-sum-mismatch.yaml +58 -0
- package/rules/preamble-length.yaml +56 -0
- package/rules/preferred-term.yaml +28 -0
- package/rules/proper-noun-density.yaml +37 -2
- package/rules/ra-nuki.yaml +43 -0
- package/rules/repeated-conjunction.yaml +47 -0
- package/rules/repeated-sentence-head.yaml +23 -0
- package/rules/required-sections.yaml +49 -0
- package/rules/requirement-modal.yaml +94 -0
- package/rules/requirement-smell.yaml +70 -0
- package/rules/risk-disclosure.yaml +22 -0
- package/rules/rule-of-three.yaml +143 -0
- package/rules/sasete-itadaku.yaml +18 -0
- package/rules/section-length-uniformity.yaml +113 -0
- package/rules/sentence-initial-conjunction-run.yaml +18 -0
- package/rules/sentence-rhythm.yaml +51 -0
- package/rules/space-before-punctuation.yaml +41 -0
- package/rules/spelling-consistency.yaml +47 -0
- package/rules/stock-transition.yaml +86 -0
- package/rules/stray-space.yaml +18 -0
- package/rules/taigen-dome-in-prose.yaml +33 -0
- package/rules/title-case-consistency.yaml +42 -0
- package/rules/total-mismatch.yaml +38 -1
- package/rules/unbalanced-bracket.yaml +56 -0
- package/rules/undefined-acronym.yaml +23 -0
- package/rules/unfilled-placeholder.yaml +50 -0
- package/rules/unqualified-superlative.yaml +20 -0
- package/rules/unsourced-number.yaml +16 -0
- package/rules/unused-definition.yaml +75 -0
- package/rules/url-run-on.yaml +45 -0
- package/rules/use-before-definition.yaml +77 -0
- package/rules/vague-figure-reference.yaml +66 -0
- package/skills/chaff/SKILL.md +171 -1
- package/src/acronym-expansions.ts +106 -0
- package/src/announced-count.ts +190 -0
- package/src/announced-list.ts +120 -0
- package/src/api.ts +154 -0
- package/src/bare-url.ts +35 -0
- package/src/baseline.ts +17 -1
- package/src/body-section.ts +7 -0
- package/src/calendar-number.ts +18 -4
- package/src/cli-args.ts +6 -0
- package/src/cli-text.ts +14 -15
- package/src/cli.ts +93 -92
- package/src/closing-paragraph.ts +24 -0
- package/src/commands/compare.ts +73 -0
- package/src/commands/document-commands.ts +19 -0
- package/src/commands/eval.ts +22 -10
- package/src/commands/facts.ts +33 -0
- package/src/commands/feedback.ts +45 -7
- package/src/commands/fix-plan.ts +53 -0
- package/src/commands/outline.ts +49 -0
- package/src/commands/read-document.ts +24 -0
- package/src/commands/suppressions.ts +19 -0
- package/src/commands/test.ts +3 -5
- package/src/commands/tree.ts +41 -5
- package/src/compare/atom.ts +33 -0
- package/src/compare/clock-time.ts +89 -0
- package/src/compare/distinct.ts +13 -0
- package/src/compare/extract.ts +80 -0
- package/src/compare/fact-key.ts +31 -0
- package/src/compare/fact-text.ts +87 -0
- package/src/compare/facts-render.ts +63 -0
- package/src/compare/facts-text.ts +41 -0
- package/src/compare/markup-atoms.ts +29 -0
- package/src/compare/match.ts +105 -0
- package/src/compare/outcome.ts +80 -0
- package/src/compare/proper-nouns.ts +65 -0
- package/src/compare/render.ts +102 -0
- package/src/compare/spans.ts +17 -0
- package/src/compare/text-atoms.ts +96 -0
- package/src/compare/text.ts +121 -0
- package/src/compare/tree-atoms.ts +80 -0
- package/src/compare/written-names.ts +26 -0
- package/src/config/load.ts +30 -0
- package/src/config/option-problems.ts +72 -0
- package/src/config/read.ts +8 -0
- package/src/config/rule-problems.ts +12 -2
- package/src/config/style.ts +55 -0
- package/src/config/warnings.ts +13 -0
- package/src/config/write.ts +18 -4
- package/src/custom/bounded-match.ts +58 -0
- package/src/custom/load.ts +23 -0
- package/src/custom/module-path.ts +23 -0
- package/src/custom/parse.ts +323 -0
- package/src/custom/problems.ts +111 -0
- package/src/custom/regex-safety.ts +118 -0
- package/src/custom/token-pattern.ts +84 -0
- package/src/detect-language.ts +1 -1
- package/src/detect.ts +35 -2
- package/src/detectors/acronym-context.ts +16 -4
- package/src/detectors/ai-phrasing.ts +141 -0
- package/src/detectors/announced-count.ts +25 -0
- package/src/detectors/bold-label.ts +55 -0
- package/src/detectors/broken-link.ts +90 -0
- package/src/detectors/cited-name.ts +6 -5
- package/src/detectors/cited-title.ts +96 -0
- package/src/detectors/concrete-evidence.ts +3 -2
- package/src/detectors/contrast-frame.ts +54 -0
- package/src/detectors/custom.ts +89 -0
- package/src/detectors/dangling-figure.ts +26 -0
- package/src/detectors/definition-use.ts +41 -0
- package/src/detectors/doubled-punctuation.ts +52 -0
- package/src/detectors/doubled-word.ts +19 -4
- package/src/detectors/duplicate-heading.ts +47 -0
- package/src/detectors/empty-section.ts +21 -0
- package/src/detectors/enumerated-runs.ts +13 -4
- package/src/detectors/fullwidth-alnum.ts +118 -0
- package/src/detectors/gram-furniture.ts +30 -0
- package/src/detectors/gram-place.ts +9 -5
- package/src/detectors/gram-windows.ts +31 -0
- package/src/detectors/hankaku-kana.ts +38 -0
- package/src/detectors/heading-case.ts +30 -2
- package/src/detectors/heading-code-words.ts +35 -0
- package/src/detectors/heading-echo.ts +8 -4
- package/src/detectors/heading-level-skip.ts +19 -0
- package/src/detectors/image-alt-text.ts +11 -0
- package/src/detectors/index.ts +79 -1
- package/src/detectors/invisible-character.ts +190 -0
- package/src/detectors/kutoten-consistency.ts +96 -0
- package/src/detectors/lead-in.ts +3 -1
- package/src/detectors/lexicon-match.ts +41 -2
- package/src/detectors/lexicon.ts +40 -13
- package/src/detectors/list-item.ts +122 -0
- package/src/detectors/list-items.ts +163 -0
- package/src/detectors/list-lead-in.ts +33 -0
- package/src/detectors/list-sentence.ts +198 -0
- package/src/detectors/list-view.ts +157 -0
- package/src/detectors/long-vowel.ts +82 -0
- package/src/detectors/markup-finding.ts +39 -0
- package/src/detectors/modal-conflict.ts +26 -0
- package/src/detectors/name-numeral.ts +4 -2
- package/src/detectors/name-variant.ts +15 -0
- package/src/detectors/nominalization.ts +73 -0
- package/src/detectors/orthography.ts +97 -41
- package/src/detectors/outside-announced-list.ts +25 -0
- package/src/detectors/oxford-comma.ts +179 -283
- package/src/detectors/phrase-match.ts +27 -7
- package/src/detectors/place-run.ts +7 -4
- package/src/detectors/placeholder-text.ts +27 -0
- package/src/detectors/quote-around.ts +9 -0
- package/src/detectors/ra-nuki.ts +38 -0
- package/src/detectors/register.ts +37 -10
- package/src/detectors/requirement-modal.ts +67 -0
- package/src/detectors/requirement-smell.ts +52 -0
- package/src/detectors/roman-numeral.ts +3 -0
- package/src/detectors/sentence-ending.ts +14 -7
- package/src/detectors/sentence-length.ts +16 -5
- package/src/detectors/signals.ts +80 -46
- package/src/detectors/space-before-punctuation.ts +32 -0
- package/src/detectors/spelling-variety.ts +81 -0
- package/src/detectors/structure-tree.ts +47 -1
- package/src/detectors/structure.ts +20 -7
- package/src/detectors/superlative-comparison.ts +47 -0
- package/src/detectors/superlative-name.ts +7 -4
- package/src/detectors/superlative-scope.ts +8 -3
- package/src/detectors/token-column.ts +149 -0
- package/src/detectors/unbalanced-bracket.ts +153 -0
- package/src/detectors/url-run-on.ts +33 -0
- package/src/detectors/vague-figure-pointer.ts +58 -0
- package/src/detectors/word-list.ts +6 -1
- package/src/document-sections.ts +46 -0
- package/src/document.ts +188 -173
- package/src/email-parts.ts +269 -0
- package/src/eval.ts +14 -4
- package/src/extension/document-view.ts +109 -0
- package/src/extension/failure-text.ts +46 -0
- package/src/extension/import-default.ts +13 -0
- package/src/extension/load.ts +97 -0
- package/src/extension/module-detector.ts +61 -0
- package/src/extension/plugin-load.ts +82 -0
- package/src/extension/plugin-name.ts +26 -0
- package/src/extension/plugin-parse.ts +229 -0
- package/src/extension/problem-text.ts +103 -0
- package/src/extension/real-path.ts +10 -0
- package/src/extension/returned-findings.ts +62 -0
- package/src/extension/rule-export.ts +23 -0
- package/src/feedback/draft.ts +6 -0
- package/src/figure-references.ts +173 -0
- package/src/files.ts +5 -0
- package/src/finding-order.ts +3 -0
- package/src/fix-plan/mode.ts +34 -0
- package/src/fix-plan/plan.ts +181 -0
- package/src/fix-plan/render.ts +128 -0
- package/src/fix-plan/text.ts +133 -0
- package/src/heading-label.ts +55 -0
- package/src/in-page-nav.ts +48 -19
- package/src/joined-view.ts +1 -0
- package/src/language-sample.ts +48 -0
- package/src/levels.ts +14 -1
- package/src/line-paragraphs.ts +52 -9
- package/src/link-line.ts +13 -0
- package/src/long-vowel.ts +109 -0
- package/src/markdown-node.ts +19 -0
- package/src/markdown-read.ts +44 -0
- package/src/markup.ts +212 -0
- package/src/mask.ts +8 -8
- package/src/name-variants.ts +217 -0
- package/src/node-version.ts +22 -0
- package/src/not-run.ts +16 -0
- package/src/number-name.ts +151 -24
- package/src/orthography.ts +50 -14
- package/src/outline/render.ts +85 -0
- package/src/outline/shape.ts +72 -0
- package/src/outline/text.ts +50 -0
- package/src/page-furniture.ts +11 -2
- package/src/plain-source.ts +2 -1
- package/src/plugin.ts +120 -3
- package/src/profile/for-file.ts +3 -1
- package/src/quoted-span.ts +9 -3
- package/src/reasons.ts +12 -0
- package/src/reference-lists.ts +91 -0
- package/src/render/compact.ts +13 -3
- package/src/render/explain.ts +75 -14
- package/src/render/friendly.ts +20 -9
- package/src/render/options.ts +58 -0
- package/src/render/rules-json.ts +140 -18
- package/src/render/rules-table.ts +91 -0
- package/src/render/sarif.ts +4 -4
- package/src/render/semantic.ts +3 -3
- package/src/render/severity-name.ts +10 -0
- package/src/render/suppressions.ts +30 -2
- package/src/render/text.ts +21 -7
- package/src/resolve-genre.ts +4 -1
- package/src/rule-genres.ts +25 -0
- package/src/rule-guide.ts +173 -0
- package/src/rule-load.ts +91 -34
- package/src/rule-options.ts +131 -0
- package/src/run-semantic.ts +2 -1
- package/src/run.ts +105 -22
- package/src/sentence-shape.ts +4 -5
- package/src/setting-problems.ts +9 -1
- package/src/spacing-minority.ts +27 -0
- package/src/span-cut.ts +28 -0
- package/src/stet-block.ts +60 -0
- package/src/stet.ts +41 -15
- package/src/structure/aside-depth.ts +67 -0
- package/src/structure/build.ts +38 -19
- package/src/structure/closed-pairs.ts +20 -0
- package/src/structure/date-range.ts +117 -0
- package/src/structure/definition-use.ts +130 -0
- package/src/structure/known-mentions.ts +96 -0
- package/src/structure/lazy-tree.ts +15 -0
- package/src/structure/modal-conflict.ts +86 -0
- package/src/structure/numbered-clauses.ts +11 -0
- package/src/structure/numbering.ts +9 -5
- package/src/structure/of.ts +11 -3
- package/src/structure/percent-sum.ts +135 -0
- package/src/structure/quoted-number.ts +36 -0
- package/src/structure/relative-find.ts +34 -47
- package/src/structure/relative-resolve.ts +77 -30
- package/src/structure/runs.ts +2 -2
- package/src/structure/sexp.ts +17 -5
- package/src/structure/total.ts +2 -2
- package/src/structure/universal.ts +33 -5
- package/src/structure/wrapped-tail.ts +38 -13
- package/src/style-load.ts +28 -0
- package/src/style-parse.ts +112 -0
- package/src/subheading-line.ts +106 -0
- package/src/tag-coverage.ts +13 -0
- package/src/template-syntax.ts +164 -0
- package/src/text-above.ts +49 -0
- package/src/text-figures.ts +147 -0
- package/src/trailing-aside.ts +50 -0
- package/src/tree-walk.ts +48 -0
- package/styles/bunkacho.yaml +25 -0
- package/styles/ieice.yaml +30 -0
- package/styles/jis-z8301-2011.yaml +28 -0
- package/styles/jis-z8301-2019.yaml +31 -0
- package/styles/koyobun.yaml +35 -0
- package/dist/legal-address.d.ts +0 -2
- package/dist/legal-address.d.ts.map +0 -1
- package/dist/legal-address.js +0 -16
- package/dist/legal-address.js.map +0 -1
package/src/structure/build.ts
CHANGED
|
@@ -6,11 +6,11 @@ import { resolveRelative } from "./relative-resolve.ts";
|
|
|
6
6
|
import { maskSpans } from "../mask.ts";
|
|
7
7
|
import type { DocumentProfile, Mention, NumberedLine, NumberingContext, Span, StructureKind, StructureNode, StructurePatterns } from "../plugin.ts";
|
|
8
8
|
import { lineNumberAt, linesOf, type Line } from "./lines.ts";
|
|
9
|
-
import {
|
|
10
|
-
import { numberInSentence } from "./number-in-sentence.ts";
|
|
9
|
+
import { universalNumber } from "./universal.ts";
|
|
11
10
|
import { unnumberedUnit, type OpenUnit } from "./unnumbered.ts";
|
|
12
11
|
import { readsOnHeading } from "./heading-leaves.ts";
|
|
13
12
|
import { onLine, wrappedLine, type WrappedLine } from "./wrapped-tail.ts";
|
|
13
|
+
import { foldPostOrder } from "../tree-walk.ts";
|
|
14
14
|
|
|
15
15
|
/** 組み立て中の節点。できあがったら StructureNode に固める。 */
|
|
16
16
|
type Draft = {
|
|
@@ -151,14 +151,6 @@ const LEAVES: readonly { readonly kind: StructureKind; readonly find: LeafFinder
|
|
|
151
151
|
{ kind: "date", find: (patterns, text) => patterns.dates?.(text) ?? [] },
|
|
152
152
|
];
|
|
153
153
|
|
|
154
|
-
/** 言語を問わない通し番号。後ろが単位なら数量、本文の文の続きなら文の中の数なので、番号にしない。 */
|
|
155
|
-
const universalNumber = (patterns: StructurePatterns, text: string, context: NumberingContext, plainText: boolean): NumberedLine | undefined => {
|
|
156
|
-
const dotted = dottedNumber(text, context, plainText);
|
|
157
|
-
if (dotted === undefined || patterns.countedAfter?.(dotted.number, dotted.rest) === true) return undefined;
|
|
158
|
-
const numbered = { number: dotted.number, rest: dotted.rest, isHeading: context.isHeading };
|
|
159
|
-
return numberInSentence(numbered, patterns.continuesSentence) ? undefined : dotted;
|
|
160
|
-
};
|
|
161
|
-
|
|
162
154
|
/** 行の中の定義・参照・義務・数量を、いま開いている最も内側の節点の子にする。 */
|
|
163
155
|
const enclosingArticle = (state: State): Draft | undefined => state.stack.findLast((frame) => frame.draft.kind === "article")?.draft;
|
|
164
156
|
|
|
@@ -220,23 +212,28 @@ const extend = (state: State, end: number): void => {
|
|
|
220
212
|
});
|
|
221
213
|
};
|
|
222
214
|
|
|
223
|
-
const
|
|
215
|
+
const frozen = (draft: Draft, children: readonly StructureNode[]): StructureNode => ({
|
|
224
216
|
kind: draft.kind,
|
|
225
217
|
address: draft.address,
|
|
226
218
|
span: { start: draft.start, end: draft.end },
|
|
227
219
|
line: draft.line,
|
|
228
220
|
attrs: draft.attrs,
|
|
229
|
-
children
|
|
221
|
+
children,
|
|
230
222
|
...(draft.ordinal === undefined ? {} : { ordinal: draft.ordinal }),
|
|
231
223
|
...(draft.level === undefined ? {} : { level: draft.level }),
|
|
232
224
|
...(draft.ordinalTo === undefined ? {} : { ordinalTo: draft.ordinalTo }),
|
|
233
225
|
...(draft.numbering === undefined ? {} : { numbering: draft.numbering }),
|
|
234
226
|
});
|
|
235
227
|
|
|
236
|
-
|
|
237
|
-
|
|
228
|
+
const freeze = (root: Draft): StructureNode => foldPostOrder(root, (draft) => draft.children, frozen);
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Markdown から取った手がかり。見出しと、中を読まない範囲(コード)と、表。.txt はどれも空。
|
|
232
|
+
* 表の欄の数(版の番号 3.1.0)は値で、この文書の番号ではない。表の行は番号として読まず、数量や日付は読む。
|
|
233
|
+
*/
|
|
234
|
+
export type Outline = { readonly headings: readonly Heading[]; readonly opaque: readonly Span[]; readonly tables: readonly Span[] };
|
|
238
235
|
|
|
239
|
-
export const NO_OUTLINE: Outline = { headings: [], opaque: [] };
|
|
236
|
+
export const NO_OUTLINE: Outline = { headings: [], opaque: [], tables: [] };
|
|
240
237
|
|
|
241
238
|
export type StructureInput = {
|
|
242
239
|
readonly path: string;
|
|
@@ -298,11 +295,14 @@ const withCaption = (state: State, line: Line, numbered: NumberedLine | undefine
|
|
|
298
295
|
return numbered === undefined || caption === undefined ? numbered : { ...numbered, heading: caption };
|
|
299
296
|
};
|
|
300
297
|
|
|
301
|
-
|
|
298
|
+
/** 行の周り。前の行は、前の行が見出しでなく自分が表の行でないときだけ渡す。表の行は番号として読まない。 */
|
|
299
|
+
type Around = { readonly next: string | undefined; readonly previous: string | undefined; readonly inTable: boolean };
|
|
300
|
+
|
|
301
|
+
const readLine = (state: State, patterns: StructurePatterns, line: Line, heading: Heading | undefined, around: Around): void => {
|
|
302
302
|
const text = heading === undefined ? line.text : headingLineText(line.text);
|
|
303
303
|
const openNumbers = state.stack.flatMap((frame) => (frame.numbered === undefined ? [] : [frame.numbered]));
|
|
304
304
|
const context = { open: openNumbers, isHeading: heading !== undefined };
|
|
305
|
-
const found = numberedLine(state, patterns, text, context);
|
|
305
|
+
const found = around.inTable ? undefined : numberedLine(state, patterns, text, context);
|
|
306
306
|
const numbered = withCaption(state, line, found);
|
|
307
307
|
const caption = numbered === undefined && heading === undefined ? captionOf(state.profile, text) : undefined;
|
|
308
308
|
if (caption !== undefined) state.captions.set(line.number, caption);
|
|
@@ -315,7 +315,21 @@ const readLine = (state: State, patterns: StructurePatterns, line: Line, heading
|
|
|
315
315
|
const scanned = numbered === undefined ? text : numbered.rest;
|
|
316
316
|
const offset = Math.max(0, line.text.lastIndexOf(scanned));
|
|
317
317
|
const onHeading = heading !== undefined;
|
|
318
|
-
|
|
318
|
+
// 番号付きの行は新しいまとまりの始まりなので、前の行の続きとして読まない。
|
|
319
|
+
const previous = numbered === undefined ? around.previous : undefined;
|
|
320
|
+
if (scanned !== "") addLeaves(state, patterns, line, wrappedLine(scanned, onHeading, around.next, previous), offset, onHeading);
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
/** 表の範囲に入る行の番号。表ごとに始まりと終わりの行を引くので、表の数に比例する。 */
|
|
324
|
+
const tableLineNumbers = (lines: readonly Line[], tables: readonly Span[]): Set<number> => {
|
|
325
|
+
const numbers = new Set<number>();
|
|
326
|
+
tables.forEach((table) => {
|
|
327
|
+
const first = lineNumberAt(lines, table.start);
|
|
328
|
+
const last = lineNumberAt(lines, table.end);
|
|
329
|
+
if (first === undefined || last === undefined) return;
|
|
330
|
+
Array.from({ length: last - first + 1 }, (_, index) => numbers.add(first + index));
|
|
331
|
+
});
|
|
332
|
+
return numbers;
|
|
319
333
|
};
|
|
320
334
|
|
|
321
335
|
/**
|
|
@@ -340,8 +354,13 @@ export const buildTree = (input: StructureInput, patterns: StructurePatterns): S
|
|
|
340
354
|
captions: new Map(),
|
|
341
355
|
plainText: !input.markdown,
|
|
342
356
|
};
|
|
357
|
+
const inTable = tableLineNumbers(lines, outline.tables);
|
|
343
358
|
lines.forEach((line, index) => {
|
|
344
|
-
|
|
359
|
+
// 見出しの後ろと表の行は、段落の折り返しではない。表のすぐ後ろの行は(GFM では)表の行になるので、表の中だけ見ればよい。
|
|
360
|
+
const apart = headings.has(line.number - 1) || inTable.has(line.number);
|
|
361
|
+
const previous = apart ? undefined : lines[index - 1]?.text;
|
|
362
|
+
const around = { next: lines[index + 1]?.text, previous, inTable: inTable.has(line.number) };
|
|
363
|
+
if (line.text.trim() !== "") readLine(state, patterns, line, headings.get(line.number), around);
|
|
345
364
|
// コードの行は覆って読まないが、開いている節の中身ではある。節の最後にコードブロックがあっても、範囲をそこまで伸ばす。
|
|
346
365
|
else if (input.source.slice(line.start, line.start + line.text.length).trim() !== "") extend(state, line.start + line.text.length);
|
|
347
366
|
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 閉じた括弧の組を、中身ごと外す。入れ子は内側から外れる。閉じない開きと、開かない閉じは残す。
|
|
3
|
+
* open と close は 1 字ずつ。同じ字なら、前から順に組になる。「内側の組を外す」を繰り返すと、深さの数だけ本文を読み直すので、1 度だけ読む。
|
|
4
|
+
*/
|
|
5
|
+
export const withoutClosedPairs = (text: string, open: string, close: string): string => {
|
|
6
|
+
const kept: string[] = [];
|
|
7
|
+
const opens: number[] = [];
|
|
8
|
+
for (const char of text) {
|
|
9
|
+
const opened = char === close ? opens.pop() : undefined;
|
|
10
|
+
if (opened !== undefined) kept.splice(opened);
|
|
11
|
+
else {
|
|
12
|
+
if (char === open) opens.push(kept.length);
|
|
13
|
+
kept.push(char);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return kept.join("");
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** 1 字(サロゲートの対も 1 字)か。 */
|
|
20
|
+
export const isOneCharacter = (text: string): boolean => [...text].length === 1;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { escapeRegExp } from "../orthography.ts";
|
|
2
|
+
import type { StructureIssue } from "./issues.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 期間の終わりが始まりより前。二つの日付の間が範囲の記号(〜、–、through)だけか、開きの語(から)で終わりの日付に閉じの語(まで)が続くときを期間と読む。
|
|
6
|
+
* 比べるのは、両方が年月日か、両方が年月のときだけ。年の無い期間(12月28日〜1月4日)は年をまたぐかもしれない。
|
|
7
|
+
* 言語の知識(範囲の記号と語)は語彙表から受け取る。
|
|
8
|
+
*/
|
|
9
|
+
export type DatedSpan = { readonly offset: number; readonly end: number; readonly value: string };
|
|
10
|
+
|
|
11
|
+
export type RangeWords = {
|
|
12
|
+
/** それだけで期間を作る記号と語。 */
|
|
13
|
+
readonly connectors: readonly string[];
|
|
14
|
+
/** 終わりの日付に閉じの語が続くときだけ期間を作る語(から)。 */
|
|
15
|
+
readonly openers: readonly string[];
|
|
16
|
+
readonly closers: readonly string[];
|
|
17
|
+
/** 始まりの日付の前の語と、二つの日付の間の語の組で期間を作るもの(from … to、between … and)。 */
|
|
18
|
+
readonly frames: readonly RangeFrame[];
|
|
19
|
+
/** 同じ文にあれば、組を期間ではなく日付の変更と読む語(moved from … to、… was postponed)。 */
|
|
20
|
+
readonly changes: readonly string[];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type RangeFrame = { readonly lead: string; readonly joint: string };
|
|
24
|
+
|
|
25
|
+
/** 語彙表の「from … to」を、前の語と間の語に分ける。「…」の無い語は組ではない。 */
|
|
26
|
+
export const rangeFrameOf = (pattern: string): RangeFrame | undefined => {
|
|
27
|
+
const [lead, joint, ...rest] = pattern.split("…").map((part) => part.trim().toLowerCase());
|
|
28
|
+
return lead === undefined || joint === undefined || lead === "" || joint === "" || rest.length > 0 ? undefined : { lead, joint };
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const COMPARABLE = [/^\d{4}-\d{2}-\d{2}$/u, /^\d{4}-\d{2}$/u];
|
|
32
|
+
|
|
33
|
+
const comparable = (start: string, end: string): boolean => COMPARABLE.some((pattern) => pattern.test(start) && pattern.test(end));
|
|
34
|
+
|
|
35
|
+
/** 日付に添えた曜日((水))と時刻(10:00)は、期間のつなぎ目ではないので読み飛ばす。 */
|
|
36
|
+
const ASIDES = /[((][^(())\n]{1,6}[))]|\d{1,2}[::]\d{2}/gu;
|
|
37
|
+
|
|
38
|
+
const bare = (text: string): string => text.replace(ASIDES, "").trim().toLowerCase();
|
|
39
|
+
|
|
40
|
+
const isOneOf = (text: string, words: readonly string[]): boolean => words.some((word) => word.toLowerCase() === text);
|
|
41
|
+
|
|
42
|
+
/** 行の終わりまでの、終わりの日付の後ろ。曜日と時刻を除いてから閉じの語を探す。 */
|
|
43
|
+
const closedAfter = (source: string, end: DatedSpan, closers: readonly string[]): boolean => {
|
|
44
|
+
const lineEnd = source.indexOf("\n", end.end);
|
|
45
|
+
const after = source
|
|
46
|
+
.slice(end.end, lineEnd === -1 ? source.length : lineEnd)
|
|
47
|
+
.replace(ASIDES, "")
|
|
48
|
+
.trimStart();
|
|
49
|
+
return closers.some((closer) => after.startsWith(closer));
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 二つの日付の間のつなぎ。行をまたぐなら、つなぎは前の行の終わりにあり、次の行は終わりの日付から始まるときだけ(期間は2026年4月1日〜↵2026年3月31日)。
|
|
54
|
+
* 次の行の頭の「- 」は箇条書きの印で、範囲の記号ではない(日付を並べた一覧)。
|
|
55
|
+
*/
|
|
56
|
+
const jointOf = (source: string, start: DatedSpan, end: DatedSpan): string | undefined => {
|
|
57
|
+
const [first = "", ...next] = source.slice(start.end, end.offset).split("\n");
|
|
58
|
+
return next.every((line) => line.trim() === "") ? bare(first) : undefined;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/** 英字の語は語の切れ目で照らす(from が therefrom に当たらず、moved が removed に当たらない)。 */
|
|
62
|
+
const wordPattern = (word: string, tail: string): RegExp => new RegExp(`(?<![a-z])${escapeRegExp(word)}(?![a-z])${tail}`, "u");
|
|
63
|
+
|
|
64
|
+
const endsWithWord = (text: string, word: string): boolean => wordPattern(word, "$").test(text);
|
|
65
|
+
|
|
66
|
+
const hasWord = (text: string, word: string): boolean => wordPattern(word, "").test(text);
|
|
67
|
+
|
|
68
|
+
/** 段落の切れ目(空行)。 */
|
|
69
|
+
const PARAGRAPH_BREAK = "\n\n";
|
|
70
|
+
|
|
71
|
+
/** 文の終わり。後ろが大文字のときだけ切る("in Jan. from" は切らない)。切りそこねると文が長くなり、変更の語を見つけやすくなるだけ。 */
|
|
72
|
+
const SENTENCE_BREAK = /[.!?]\s+(?=[A-Z])/gu;
|
|
73
|
+
|
|
74
|
+
/** 二つの日付を含む文(小文字、空白は一つに)と、その中の始まりの日付の位置。行の折り返しをまたいで読む。 */
|
|
75
|
+
const sentenceAround = (source: string, start: DatedSpan, end: DatedSpan): { readonly text: string; readonly before: string } => {
|
|
76
|
+
const previousBreak = source.lastIndexOf(PARAGRAPH_BREAK, start.offset);
|
|
77
|
+
const paragraphStart = previousBreak === -1 ? 0 : previousBreak + PARAGRAPH_BREAK.length;
|
|
78
|
+
const paragraphEnd = source.indexOf(PARAGRAPH_BREAK, end.end);
|
|
79
|
+
const head = source.slice(paragraphStart, start.offset);
|
|
80
|
+
const tail = source.slice(end.end, paragraphEnd === -1 ? source.length : paragraphEnd);
|
|
81
|
+
const from = [...head.matchAll(SENTENCE_BREAK)].map((match) => match.index + match[0].length).at(-1) ?? 0;
|
|
82
|
+
const to = [...tail.matchAll(SENTENCE_BREAK)][0]?.index ?? tail.length;
|
|
83
|
+
const flat = (text: string): string => text.replace(/\s+/gu, " ").toLowerCase();
|
|
84
|
+
return { text: flat(source.slice(paragraphStart + from, end.end + to)), before: flat(head.slice(from)).trimEnd() };
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/** 前の語と間の語の組(from … to)。同じ文のどこかに変更の語(moved、postponed)があれば、日付を動かした文で、期間ではない。 */
|
|
88
|
+
const framed = (source: string, start: DatedSpan, end: DatedSpan, joint: string, words: RangeWords): boolean => {
|
|
89
|
+
const sentence = sentenceAround(source, start, end);
|
|
90
|
+
const frame = words.frames.find((candidate) => candidate.joint === joint && endsWithWord(sentence.before, candidate.lead));
|
|
91
|
+
return frame !== undefined && !words.changes.some((change) => hasWord(sentence.text, change.toLowerCase()));
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const isRange = (source: string, start: DatedSpan, end: DatedSpan, words: RangeWords): boolean => {
|
|
95
|
+
const joint = jointOf(source, start, end);
|
|
96
|
+
if (joint === undefined) return false;
|
|
97
|
+
return (
|
|
98
|
+
isOneOf(joint, words.connectors) || (isOneOf(joint, words.openers) && closedAfter(source, end, words.closers)) || framed(source, start, end, joint, words)
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/** 書いたままの期間。行をまたいだ期間は一行にする。 */
|
|
103
|
+
const writtenPeriod = (source: string, start: DatedSpan, end: DatedSpan): string =>
|
|
104
|
+
source
|
|
105
|
+
.slice(start.offset, end.end)
|
|
106
|
+
.split("\n")
|
|
107
|
+
.map((part) => part.trim())
|
|
108
|
+
.join(" ");
|
|
109
|
+
|
|
110
|
+
/** 隣り合う二つの日付のうち、期間をなし、終わりが始まりより前のもの。期間の書き出しを指し、書いたままの期間を見せる。 */
|
|
111
|
+
export const reversedRanges = (source: string, dates: readonly DatedSpan[], words: RangeWords): StructureIssue[] =>
|
|
112
|
+
dates.slice(1).flatMap((end, index) => {
|
|
113
|
+
const start = dates[index];
|
|
114
|
+
if (start === undefined || !comparable(start.value, end.value) || end.value >= start.value) return [];
|
|
115
|
+
if (!isRange(source, start, end, words)) return [];
|
|
116
|
+
return [{ offset: start.offset, values: { start: start.value, end: end.value, period: writtenPeriod(source, start, end) } }];
|
|
117
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { Span, StructureNode } from "../plugin.ts";
|
|
2
|
+
import { escapeRegExp } from "../orthography.ts";
|
|
3
|
+
import { inDocumentOrder } from "./issues.ts";
|
|
4
|
+
|
|
5
|
+
// 定義した語が本文で使われているか、定義より前に使われていないか。どちらも木の定義と、本文の文の字面だけで決まる。
|
|
6
|
+
|
|
7
|
+
export type DefinedTerm = { readonly term: string; readonly span: Span; readonly line: number; readonly inline: boolean };
|
|
8
|
+
|
|
9
|
+
/** 本文の一続き(文)。start は文書の中の位置。 */
|
|
10
|
+
export type BodyText = { readonly start: number; readonly text: string };
|
|
11
|
+
|
|
12
|
+
export type TermUse = { readonly term: DefinedTerm; readonly offset: number };
|
|
13
|
+
|
|
14
|
+
/** 強調の印("**Agreement**")は語の一部ではない。 */
|
|
15
|
+
const EMPHASIS_MARKS = /[*_]+/gu;
|
|
16
|
+
/** 語の長さの上限。これより長い引用(表の見出し、文)は、定義した語ではない。 */
|
|
17
|
+
const MAX_TERM_WORDS = 6;
|
|
18
|
+
/** 文の区切りや問いを含むもの("What do you think about...?")は、引いた言葉で、定義した語ではない。 */
|
|
19
|
+
const NOT_A_TERM = /(?:[?!,;:…。、?!]|\.$)/u;
|
|
20
|
+
const HAS_LETTER = /\p{L}/u;
|
|
21
|
+
|
|
22
|
+
const isTerm = (term: string): boolean => HAS_LETTER.test(term) && !NOT_A_TERM.test(term) && term.split(/\s+/u).length <= MAX_TERM_WORDS;
|
|
23
|
+
|
|
24
|
+
/** 木の定義を文書の順に。語でないものは外す。inline は文の途中で括弧に入れた定義((the "Seller")、以下「甲」という)。 */
|
|
25
|
+
export const definedTerms = (tree: StructureNode): DefinedTerm[] =>
|
|
26
|
+
inDocumentOrder(tree).flatMap((node) => {
|
|
27
|
+
const term =
|
|
28
|
+
node.kind === "definition"
|
|
29
|
+
? String(node.attrs["term"] ?? "")
|
|
30
|
+
.replaceAll(EMPHASIS_MARKS, "")
|
|
31
|
+
.trim()
|
|
32
|
+
: "";
|
|
33
|
+
return isTerm(term) ? [{ term, span: node.span, line: node.line, inline: node.attrs["placement"] === "inline" }] : [];
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const LATIN_EDGE = /^[\p{Script=Latin}\p{N}]|[\p{Script=Latin}\p{N}]$/u;
|
|
37
|
+
/** 一字の漢字の語(「法」「甲」)は、漢字の後ろに続く所(方法、法律の前の「方」)では別の語の一部。 */
|
|
38
|
+
const SINGLE_KANJI = /^\p{Script=Han}$/u;
|
|
39
|
+
|
|
40
|
+
/** loose は最初の一字の大小を問わない(文頭の "Personal data")。exact は書いたとおりだけ("Access" は "early access" に当たらない)。 */
|
|
41
|
+
type CaseMatch = "loose" | "exact";
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 語の現れを探す形。英字で始まる・終わる語は語の途中に当たらない("Term" は "Terms" には当たり、"Termination" には当たらない)。
|
|
45
|
+
* 複数形と所有の形(Services、Policies、Seller's)は同じ語の使用。
|
|
46
|
+
*/
|
|
47
|
+
const termPattern = (term: string, caseMatch: CaseMatch): RegExp => {
|
|
48
|
+
const first = term.charAt(0);
|
|
49
|
+
const rest = /\p{Ll}y$/u.test(term) ? `${escapeRegExp(term.slice(1, -1))}(?:y|ie)` : escapeRegExp(term.slice(1));
|
|
50
|
+
const caseless = caseMatch === "exact" || first.toUpperCase() === first.toLowerCase();
|
|
51
|
+
const head = caseless ? escapeRegExp(first) : `[${escapeRegExp(first.toUpperCase())}${escapeRegExp(first.toLowerCase())}]`;
|
|
52
|
+
if (SINGLE_KANJI.test(term)) return new RegExp(String.raw`(?<!\p{Script=Han})${head}`, "gu");
|
|
53
|
+
if (!LATIN_EDGE.test(term)) return new RegExp(`${head}${rest}`, "gu");
|
|
54
|
+
return new RegExp(String.raw`(?<![\p{Script=Latin}\p{N}])${head}${rest}(?:e?s|['’]s?)?(?![\p{Script=Latin}\p{N}])`, "gu");
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const inside = (offset: number, spans: readonly Span[]): boolean => spans.some((span) => span.start <= offset && offset < span.end);
|
|
58
|
+
|
|
59
|
+
/** 語の現れ(文書の中の位置)を順に。定義そのもの("Seller" means、(the "Seller"))の中の現れは使用に数えない。 */
|
|
60
|
+
export const usesOf = (term: string, texts: readonly BodyText[], definitionSpans: readonly Span[], caseMatch: CaseMatch = "loose"): number[] => {
|
|
61
|
+
const pattern = termPattern(term, caseMatch);
|
|
62
|
+
return texts.flatMap((body) =>
|
|
63
|
+
[...body.text.matchAll(pattern)].map((match) => body.start + match.index).filter((offset) => !inside(offset, definitionSpans)),
|
|
64
|
+
);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
type TermGroup = { readonly first: DefinedTerm; readonly spans: readonly Span[] };
|
|
68
|
+
|
|
69
|
+
/** 語ごとに、最初の定義と、その語のすべての定義の範囲。定義が何千あっても語の数だけ回る。 */
|
|
70
|
+
const groupsOf = (terms: readonly DefinedTerm[]): TermGroup[] => {
|
|
71
|
+
const groups = new Map<string, { first: DefinedTerm; spans: Span[] }>();
|
|
72
|
+
terms.forEach((defined) => {
|
|
73
|
+
const group = groups.get(defined.term);
|
|
74
|
+
if (group === undefined) groups.set(defined.term, { first: defined, spans: [defined.span] });
|
|
75
|
+
else group.spans.push(defined.span);
|
|
76
|
+
});
|
|
77
|
+
return [...groups.values()];
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/** 定義したのに、定義の外で一度も使っていない語。同じ語の定義が二つあれば、最初の一つだけを言う(二つ目は duplicate-definition)。 */
|
|
81
|
+
export const unusedDefinitions = (terms: readonly DefinedTerm[], texts: readonly BodyText[]): DefinedTerm[] =>
|
|
82
|
+
groupsOf(terms)
|
|
83
|
+
.filter((group) => usesOf(group.first.term, texts, group.spans).length === 0)
|
|
84
|
+
.map((group) => group.first);
|
|
85
|
+
|
|
86
|
+
/** offset を含む文。texts は start の昇順で、二分探索で引く。 */
|
|
87
|
+
const sentenceAt = (texts: readonly BodyText[], offset: number): BodyText | undefined => {
|
|
88
|
+
let low = 0;
|
|
89
|
+
let high = texts.length - 1;
|
|
90
|
+
while (low <= high) {
|
|
91
|
+
const middle = (low + high) >> 1;
|
|
92
|
+
const body = texts[middle];
|
|
93
|
+
if (body === undefined) return undefined;
|
|
94
|
+
if (offset < body.start) high = middle - 1;
|
|
95
|
+
else if (offset >= body.start + body.text.length) low = middle + 1;
|
|
96
|
+
else return body;
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const LETTER = /\p{L}/gu;
|
|
102
|
+
/** 札の文が語のほかに持ってよい字の数("The Agreement." の The)。 */
|
|
103
|
+
const LABEL_SLACK = 3;
|
|
104
|
+
|
|
105
|
+
/** 語だけの札の文(**12.2.** Taxes.、1. The Agreement.)。条の頭に語を掲げただけで、使用ではない。 */
|
|
106
|
+
const isLabel = (body: BodyText | undefined, term: string): boolean =>
|
|
107
|
+
body !== undefined && (body.text.replaceAll(term, "").match(LETTER) ?? []).length <= LABEL_SLACK;
|
|
108
|
+
|
|
109
|
+
const CAPITAL_OR_NON_LATIN = /\p{Lu}|[^\p{Script=Latin}\p{N}\s\p{P}]/u;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 前で使ったと言える語。小文字の英語(("vendors"))はふつうの語としても使うので、前の現れが定義した語の使用とは限らない。
|
|
113
|
+
* 一字の漢字(「法」「令」)は、令和や方法の一部にも当たる。
|
|
114
|
+
*/
|
|
115
|
+
const isDistinctive = (term: string): boolean => CAPITAL_OR_NON_LATIN.test(term) && !SINGLE_KANJI.test(term);
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 文の途中で括弧に入れて定義した語((the "Seller")、以下「甲」という)を、その定義の文より前で使っている所。最初の一つだけ。
|
|
119
|
+
* 定義の文の中の現れ(株式会社GovTech東京(以下「GovTech東京」という。))は、定義する名前そのものなので数えない。札の文も数えない。
|
|
120
|
+
* 定義の条("Seller" means、「甲」とは)は条の並びの頭にも終わりにも置く書き方があるので、前で使っても言わない。
|
|
121
|
+
*/
|
|
122
|
+
export const usesBeforeDefinition = (terms: readonly DefinedTerm[], texts: readonly BodyText[]): TermUse[] =>
|
|
123
|
+
groupsOf(terms)
|
|
124
|
+
.filter((group) => group.first.inline && isDistinctive(group.first.term))
|
|
125
|
+
.flatMap(({ first: defined, spans }) => {
|
|
126
|
+
const defining = sentenceAt(texts, defined.span.start)?.start ?? defined.span.start;
|
|
127
|
+
const uses = usesOf(defined.term, texts, spans, "exact");
|
|
128
|
+
const first = uses.find((offset) => !isLabel(sentenceAt(texts, offset), defined.term));
|
|
129
|
+
return first !== undefined && first < defining ? [{ term: defined, offset: first }] : [];
|
|
130
|
+
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { Mention } from "../plugin.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 条を書かない番地を読むときに引く、同じ行の既知の参照。before(名指しの参照)に、見つけた番地を順に足していく。
|
|
5
|
+
* 引くたびに全部をなめると、参照の数の二乗になる。before は並べ替えて二分探索で、足したものは深さごとに最後の一つで引く。
|
|
6
|
+
*
|
|
7
|
+
* 足すものは、正規表現で左から見つけた番地の順に来る。だから足したものの終わりは、次に引く位置より前にあり、並びの順に増える。
|
|
8
|
+
* - overlaps: [start, end) と重なるものがあるか。足したものは引く位置より前で終わるので、重ならない。
|
|
9
|
+
* - previous: 終わりが at 以前で、終わりの深さが depth のもののうち、終わりが最も後ろのもの。同じ終わりなら後から知ったもの。
|
|
10
|
+
* - endingAt: 終わりが at のもののうち、最初に知ったもの。
|
|
11
|
+
*/
|
|
12
|
+
export type KnownMentions = {
|
|
13
|
+
readonly overlaps: (start: number, end: number) => boolean;
|
|
14
|
+
readonly previous: (at: number, depth: number) => Mention | undefined;
|
|
15
|
+
readonly endingAt: (at: number) => Mention | undefined;
|
|
16
|
+
readonly add: (mention: Mention, depth: number) => void;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** sorted の中で、pass が偽になる最初の位置。pass は先頭から真が続き、あとは偽。 */
|
|
20
|
+
const firstFailing = <T>(sorted: readonly T[], pass: (item: T) => boolean): number => {
|
|
21
|
+
let [low, high] = [0, sorted.length];
|
|
22
|
+
while (low < high) {
|
|
23
|
+
const middle = Math.floor((low + high) / 2);
|
|
24
|
+
const item = sorted[middle];
|
|
25
|
+
if (item !== undefined && pass(item)) low = middle + 1;
|
|
26
|
+
else high = middle;
|
|
27
|
+
}
|
|
28
|
+
return low;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/** 始まりの順に並べ、そこまでの終わりの最大を添える。始まりが end より前のものの、終わりの最大が start より後ろなら重なる。 */
|
|
32
|
+
const overlapIndex = (before: readonly Mention[]): ((start: number, end: number) => boolean) => {
|
|
33
|
+
const byStart = before.filter((mention) => !Number.isNaN(mention.start)).toSorted((left, right) => left.start - right.start);
|
|
34
|
+
let reach = -Infinity;
|
|
35
|
+
const reaches = byStart.map((mention) => {
|
|
36
|
+
reach = Math.max(reach, Number.isNaN(mention.end) ? -Infinity : mention.end);
|
|
37
|
+
return reach;
|
|
38
|
+
});
|
|
39
|
+
return (start, end) => {
|
|
40
|
+
const count = firstFailing(byStart, (mention) => mention.start < end);
|
|
41
|
+
return count > 0 && (reaches[count - 1] ?? -Infinity) > start;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
type Ranked = { readonly mention: Mention; readonly order: number };
|
|
46
|
+
|
|
47
|
+
const byEndThenOrder = (left: Ranked, right: Ranked): number => {
|
|
48
|
+
if (left.mention.end !== right.mention.end) return left.mention.end < right.mention.end ? -1 : 1;
|
|
49
|
+
return left.order - right.order;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** 深さごとに、終わりの順(同じなら知った順)に並べる。 */
|
|
53
|
+
const previousIndex = (before: readonly Mention[], depthOf: (at: number) => number): ((at: number, depth: number) => Mention | undefined) => {
|
|
54
|
+
const byDepth = new Map<number, Ranked[]>();
|
|
55
|
+
before.forEach((mention, order) => {
|
|
56
|
+
if (Number.isNaN(mention.end)) return;
|
|
57
|
+
const depth = depthOf(mention.end);
|
|
58
|
+
const ranked = byDepth.get(depth) ?? [];
|
|
59
|
+
ranked.push({ mention, order });
|
|
60
|
+
byDepth.set(depth, ranked);
|
|
61
|
+
});
|
|
62
|
+
const sorted = new Map([...byDepth].map(([depth, ranked]) => [depth, ranked.toSorted(byEndThenOrder)]));
|
|
63
|
+
return (at, depth) => {
|
|
64
|
+
const ranked = sorted.get(depth) ?? [];
|
|
65
|
+
return ranked[firstFailing(ranked, (entry) => entry.mention.end <= at) - 1]?.mention;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const firstByEnd = (mentions: readonly Mention[]): Map<number, Mention> => {
|
|
70
|
+
const found = new Map<number, Mention>();
|
|
71
|
+
mentions.forEach((mention) => {
|
|
72
|
+
if (!found.has(mention.end)) found.set(mention.end, mention);
|
|
73
|
+
});
|
|
74
|
+
return found;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const knownMentions = (before: readonly Mention[], depthOf: (at: number) => number): KnownMentions => {
|
|
78
|
+
const overlapsBefore = overlapIndex(before);
|
|
79
|
+
const previousBefore = previousIndex(before, depthOf);
|
|
80
|
+
const endsBefore = firstByEnd(before);
|
|
81
|
+
const lastAddedByDepth = new Map<number, Mention>();
|
|
82
|
+
const endsAdded = new Map<number, Mention>();
|
|
83
|
+
return {
|
|
84
|
+
overlaps: overlapsBefore,
|
|
85
|
+
previous: (at, depth) => {
|
|
86
|
+
const known = previousBefore(at, depth);
|
|
87
|
+
const added = lastAddedByDepth.get(depth);
|
|
88
|
+
return added !== undefined && (known === undefined || added.end >= known.end) ? added : known;
|
|
89
|
+
},
|
|
90
|
+
endingAt: (at) => endsBefore.get(at) ?? endsAdded.get(at),
|
|
91
|
+
add: (mention, depth) => {
|
|
92
|
+
lastAddedByDepth.set(depth, mention);
|
|
93
|
+
if (!endsAdded.has(mention.end)) endsAdded.set(mention.end, mention);
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StructureNode, StructurePatterns } from "../plugin.ts";
|
|
2
|
+
import { buildTree, type StructureInput } from "./build.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 構造の rule(参照先が無い・番号の抜け)が読む木を、読まれたときに一度だけ作る。どの rule も読まなければ作らない。
|
|
6
|
+
* 何万行の契約書で、他の rule の lint に代金を払わせない。構造を読めない言語(patterns が無い)では無い。
|
|
7
|
+
*/
|
|
8
|
+
export const lazyTree = (patterns: StructurePatterns | undefined, input: () => StructureInput): (() => StructureNode | undefined) => {
|
|
9
|
+
// null は「作ったが構造を読めない言語だった」、undefined は「まだ作っていない」。
|
|
10
|
+
const tree: { value: StructureNode | null | undefined } = { value: undefined };
|
|
11
|
+
return () => {
|
|
12
|
+
tree.value ??= patterns === undefined ? null : buildTree(input(), patterns);
|
|
13
|
+
return tree.value ?? undefined;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { Sentence, Span, Token } from "../plugin.ts";
|
|
2
|
+
|
|
3
|
+
// 同じ主語と行為に、逆の様相(しなければならない と してはならない、may と must not)を書いた二つの文。
|
|
4
|
+
// 主語と行為は、文の中身の語(名詞・固有名詞・動詞・形容詞)の集まりで近似する。様相の語そのものは数えない。
|
|
5
|
+
|
|
6
|
+
/** 木の義務の節点。type は must / must-not / may。 */
|
|
7
|
+
export type Obligation = { readonly start: number; readonly end: number; readonly type: string; readonly marker: string };
|
|
8
|
+
|
|
9
|
+
export type ModalStatement = { readonly offset: number; readonly type: string; readonly marker: string; readonly key: string };
|
|
10
|
+
|
|
11
|
+
export type ModalConflict = { readonly statement: ModalStatement; readonly earlier: ModalStatement };
|
|
12
|
+
|
|
13
|
+
const CONTENT: ReadonlySet<string> = new Set(["NOUN", "PROPN", "VERB", "ADJ"]);
|
|
14
|
+
|
|
15
|
+
/** 中身の語がこれより少ない文("You must not.")は、何を決めているかが文の外にあるので比べない。 */
|
|
16
|
+
const MIN_CONTENT_WORDS = 2;
|
|
17
|
+
|
|
18
|
+
/** 互いに食い違う様相。must と may は食い違わない(しなければならないことは、してよい)。 */
|
|
19
|
+
const OPPOSITE: Readonly<Record<string, readonly string[]>> = {
|
|
20
|
+
must: ["must-not"],
|
|
21
|
+
"must-not": ["must", "may"],
|
|
22
|
+
may: ["must-not"],
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const overlaps = (token: Token, spans: readonly Span[]): boolean => spans.some((span) => token.span.start < span.end && span.start < token.span.end);
|
|
26
|
+
|
|
27
|
+
/** 文の中身の語を、原形の小文字で、重ねずに並べたもの。様相の語の範囲にかかる語は外す。 */
|
|
28
|
+
export const contentKey = (tokens: readonly Token[], markers: readonly Span[]): string =>
|
|
29
|
+
[
|
|
30
|
+
...new Set(
|
|
31
|
+
tokens
|
|
32
|
+
.filter((token) => CONTENT.has(token.pos) && !overlaps(token, markers))
|
|
33
|
+
.map((token) => (token.lemma !== undefined && token.lemma !== "" ? token.lemma : token.surface).toLowerCase()),
|
|
34
|
+
),
|
|
35
|
+
]
|
|
36
|
+
.toSorted((left, right) => left.localeCompare(right, "en"))
|
|
37
|
+
.join(" ");
|
|
38
|
+
|
|
39
|
+
/** offset を含む文。sentences は start の昇順で、二分探索で引く。 */
|
|
40
|
+
const sentenceAt = (sentences: readonly Sentence[], offset: number): Sentence | undefined => {
|
|
41
|
+
let low = 0;
|
|
42
|
+
let high = sentences.length - 1;
|
|
43
|
+
while (low <= high) {
|
|
44
|
+
const middle = (low + high) >> 1;
|
|
45
|
+
const sentence = sentences[middle];
|
|
46
|
+
if (sentence === undefined) return undefined;
|
|
47
|
+
if (offset < sentence.span.start) high = middle - 1;
|
|
48
|
+
else if (offset >= sentence.span.end) low = middle + 1;
|
|
49
|
+
else return sentence;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 様相の語を一つだけ持つ文の、様相と中身。二つ以上持つ文(shall do A and shall not do B)は、どの語がどの行為にかかるかが
|
|
56
|
+
* 中身の語の集まりからは分からないので外す。品詞の無い文も外す。
|
|
57
|
+
*/
|
|
58
|
+
export const modalStatements = (obligations: readonly Obligation[], sentences: readonly Sentence[]): ModalStatement[] => {
|
|
59
|
+
const bySentence = new Map<Sentence, Obligation[]>();
|
|
60
|
+
obligations.forEach((obligation) => {
|
|
61
|
+
const sentence = sentenceAt(sentences, obligation.start);
|
|
62
|
+
if (sentence === undefined) return;
|
|
63
|
+
const found = bySentence.get(sentence);
|
|
64
|
+
if (found === undefined) bySentence.set(sentence, [obligation]);
|
|
65
|
+
else found.push(obligation);
|
|
66
|
+
});
|
|
67
|
+
return [...bySentence].flatMap(([sentence, found]) => {
|
|
68
|
+
const [only] = found;
|
|
69
|
+
if (found.length !== 1 || only === undefined || sentence.tokens === undefined) return [];
|
|
70
|
+
const key = contentKey(sentence.tokens, [only]);
|
|
71
|
+
return key.split(" ").length < MIN_CONTENT_WORDS ? [] : [{ offset: sentence.span.start, type: only.type, marker: only.marker, key }];
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/** 前に同じ中身で逆の様相を書いた文がある文。中身と様相の組ごとに、最初の文と比べる。 */
|
|
76
|
+
export const modalConflicts = (statements: readonly ModalStatement[]): ModalConflict[] => {
|
|
77
|
+
const firsts = new Map<string, ModalStatement>();
|
|
78
|
+
return statements
|
|
79
|
+
.toSorted((left, right) => left.offset - right.offset)
|
|
80
|
+
.flatMap((statement) => {
|
|
81
|
+
const earlier = (OPPOSITE[statement.type] ?? []).map((type) => firsts.get(`${type}\u0000${statement.key}`)).find((found) => found !== undefined);
|
|
82
|
+
const own = `${statement.type}\u0000${statement.key}`;
|
|
83
|
+
if (!firsts.has(own)) firsts.set(own, statement);
|
|
84
|
+
return earlier === undefined ? [] : [{ statement, earlier }];
|
|
85
|
+
});
|
|
86
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { StructureNode } from "../plugin.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A numbered chapter (第1章), or an article numbered at the top level (第3条, 「1 適用範囲」, "2. Payment"). Clauses
|
|
5
|
+
* number from 1 at the top, so a tree whose articles are all dotted (## 0.18.0, ## 1.0 in a changelog) holds versions,
|
|
6
|
+
* not clauses. A 号 item or a heading is not a clause.
|
|
7
|
+
*/
|
|
8
|
+
const isClause = (node: StructureNode): boolean => node.kind === "chapter" || (node.kind === "article" && !node.address.includes("."));
|
|
9
|
+
|
|
10
|
+
/** Pure: whether the tree holds a numbered clause anywhere. */
|
|
11
|
+
export const numbersClauses = (node: StructureNode): boolean => isClause(node) || node.children.some(numbersClauses);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { StructureNode } from "../plugin.ts";
|
|
2
2
|
import { inDocumentOrder, type StructureIssue } from "./issues.ts";
|
|
3
|
+
import { numbersQuotedInside } from "./quoted-number.ts";
|
|
3
4
|
|
|
4
5
|
const labelOf = (node: StructureNode): string => String(node.attrs["label"] ?? node.address);
|
|
5
6
|
|
|
@@ -9,10 +10,10 @@ type Ordered = { readonly node: StructureNode; readonly ordinal: number; readonl
|
|
|
9
10
|
* 同じ親の子のうち、番号の付いたものを種類と深さごとに分ける。条と項は別の並び、項と号も別の並び。
|
|
10
11
|
* 法令の第 1 項は番号が無いので、その号(一、二)と第 2 項(2)は同じ条の直下に並ぶ。深さで分けないと「二の次が2」に見える。
|
|
11
12
|
*/
|
|
12
|
-
const sequencesOf = (parent: StructureNode): Ordered[][] => {
|
|
13
|
+
const sequencesOf = (parent: StructureNode, quoting: ReadonlySet<StructureNode>): Ordered[][] => {
|
|
13
14
|
const groups = new Map<string, Ordered[]>();
|
|
14
15
|
parent.children.forEach((node) => {
|
|
15
|
-
if (node.ordinal === undefined) return;
|
|
16
|
+
if (node.ordinal === undefined || quoting.has(node)) return;
|
|
16
17
|
const key = `${node.kind}/${String(node.level ?? "")}`;
|
|
17
18
|
// 配列を作り直さずに足す。条が何千もある法令で二乗にしない。
|
|
18
19
|
const group = groups.get(key) ?? [];
|
|
@@ -41,9 +42,12 @@ const breaksIn = (sequence: readonly Ordered[]): StructureIssue[] =>
|
|
|
41
42
|
* 番号の抜けと重なり。比べるのは同じ親の子どうしだけ。英米の法令は章ごとに Section 101、201 と百の位を変えるので、
|
|
42
43
|
* 文書全体の通し番号として比べると抜けに見える。最初の番号は見ない。日本語の項は 2 から番号を振る。
|
|
43
44
|
* 1 に戻った番号は新しい並びの始まりとして扱うので、「(a) の後の (a)」の重なりは見逃す。
|
|
45
|
+
* 同じ番号の節を中に持つ節(ほかの文書の条を引いた手本の見出し)は、並びに入れない。
|
|
44
46
|
*/
|
|
45
|
-
export const numberingBreaks = (tree: StructureNode): StructureIssue[] =>
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
export const numberingBreaks = (tree: StructureNode): StructureIssue[] => {
|
|
48
|
+
const quoting = numbersQuotedInside(tree);
|
|
49
|
+
return inDocumentOrder(tree)
|
|
50
|
+
.flatMap((parent) => sequencesOf(parent, quoting))
|
|
48
51
|
.flatMap(breaksIn)
|
|
49
52
|
.toSorted((left, right) => left.offset - right.offset);
|
|
53
|
+
};
|