chaffjs 0.16.0 → 0.18.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/dist/announced-count.d.ts +26 -0
- package/dist/announced-count.d.ts.map +1 -0
- package/dist/announced-count.js +104 -0
- package/dist/announced-count.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 +9 -2
- package/dist/calendar-number.d.ts.map +1 -1
- package/dist/calendar-number.js +18 -4
- 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.map +1 -1
- package/dist/cli-text.js +8 -4
- package/dist/cli-text.js.map +1 -1
- package/dist/cli.js +33 -30
- package/dist/cli.js.map +1 -1
- package/dist/closing-numbers.d.ts +20 -0
- package/dist/closing-numbers.d.ts.map +1 -0
- package/dist/closing-numbers.js +56 -0
- package/dist/closing-numbers.js.map +1 -0
- package/dist/commands/compare.d.ts +8 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +72 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +17 -9
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/feedback.d.ts +5 -2
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +11 -5
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +13 -13
- 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 +65 -0
- package/dist/compare/clock-time.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 +58 -0
- package/dist/compare/extract.js.map +1 -0
- package/dist/compare/fact-text.d.ts +23 -0
- package/dist/compare/fact-text.d.ts.map +1 -0
- package/dist/compare/fact-text.js +47 -0
- package/dist/compare/fact-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 +19 -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 +33 -0
- package/dist/compare/outcome.d.ts.map +1 -0
- package/dist/compare/outcome.js +40 -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 +44 -0
- package/dist/compare/proper-nouns.js.map +1 -0
- package/dist/compare/render.d.ts +9 -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 +24 -0
- package/dist/compare/text-atoms.d.ts.map +1 -0
- package/dist/compare/text-atoms.js +67 -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 +15 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +5 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/option-problems.d.ts +16 -0
- package/dist/config/option-problems.d.ts.map +1 -0
- package/dist/config/option-problems.js +58 -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 +16 -0
- package/dist/config/style.d.ts.map +1 -0
- package/dist/config/style.js +36 -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 +8 -0
- package/dist/custom/load.d.ts.map +1 -0
- package/dist/custom/load.js +11 -0
- package/dist/custom/load.js.map +1 -0
- package/dist/custom/parse.d.ts +70 -0
- package/dist/custom/parse.d.ts.map +1 -0
- package/dist/custom/parse.js +215 -0
- package/dist/custom/parse.js.map +1 -0
- package/dist/custom/problems.d.ts +5 -0
- package/dist/custom/problems.d.ts.map +1 -0
- package/dist/custom/problems.js +78 -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.d.ts.map +1 -1
- package/dist/detect.js +24 -2
- package/dist/detect.js.map +1 -1
- package/dist/detectors/acronym-context.d.ts +4 -0
- package/dist/detectors/acronym-context.d.ts.map +1 -1
- package/dist/detectors/acronym-context.js +25 -4
- package/dist/detectors/acronym-context.js.map +1 -1
- package/dist/detectors/acronym-expansion.d.ts +2 -0
- package/dist/detectors/acronym-expansion.d.ts.map +1 -1
- package/dist/detectors/acronym-expansion.js +104 -1
- package/dist/detectors/acronym-expansion.js.map +1 -1
- package/dist/detectors/agreement-slip.d.ts +32 -0
- package/dist/detectors/agreement-slip.d.ts.map +1 -0
- package/dist/detectors/agreement-slip.js +137 -0
- package/dist/detectors/agreement-slip.js.map +1 -0
- package/dist/detectors/ai-phrasing.d.ts +20 -0
- package/dist/detectors/ai-phrasing.d.ts.map +1 -0
- package/dist/detectors/ai-phrasing.js +112 -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/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/content-morphemes.d.ts +4 -0
- package/dist/detectors/content-morphemes.d.ts.map +1 -0
- package/dist/detectors/content-morphemes.js +12 -0
- package/dist/detectors/content-morphemes.js.map +1 -0
- 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 +4 -0
- package/dist/detectors/dangling-figure.d.ts.map +1 -0
- package/dist/detectors/dangling-figure.js +18 -0
- package/dist/detectors/dangling-figure.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 +33 -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/en-shape.d.ts +0 -1
- package/dist/detectors/en-shape.d.ts.map +1 -1
- package/dist/detectors/en-shape.js +0 -235
- package/dist/detectors/en-shape.js.map +1 -1
- 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/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/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 +17 -20
- 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/heading-overlap.d.ts +13 -0
- package/dist/detectors/heading-overlap.d.ts.map +1 -0
- package/dist/detectors/heading-overlap.js +52 -0
- package/dist/detectors/heading-overlap.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 +40 -2
- package/dist/detectors/index.js.map +1 -1
- 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/letter-joined-name.d.ts +13 -0
- package/dist/detectors/letter-joined-name.d.ts.map +1 -0
- package/dist/detectors/letter-joined-name.js +11 -0
- package/dist/detectors/letter-joined-name.js.map +1 -0
- package/dist/detectors/lexicon-match.d.ts +4 -0
- package/dist/detectors/lexicon-match.d.ts.map +1 -1
- package/dist/detectors/lexicon-match.js +7 -2
- package/dist/detectors/lexicon-match.js.map +1 -1
- package/dist/detectors/lexicon.d.ts.map +1 -1
- package/dist/detectors/lexicon.js +5 -2
- 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 +65 -0
- package/dist/detectors/list-sentence.d.ts.map +1 -0
- package/dist/detectors/list-sentence.js +105 -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 +57 -0
- package/dist/detectors/long-vowel.js.map +1 -0
- package/dist/detectors/markup-finding.d.ts +6 -0
- package/dist/detectors/markup-finding.d.ts.map +1 -0
- package/dist/detectors/markup-finding.js +19 -0
- package/dist/detectors/markup-finding.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/orthography.d.ts.map +1 -1
- package/dist/detectors/orthography.js +16 -12
- package/dist/detectors/orthography.js.map +1 -1
- package/dist/detectors/oxford-comma.d.ts +9 -0
- package/dist/detectors/oxford-comma.d.ts.map +1 -0
- package/dist/detectors/oxford-comma.js +246 -0
- package/dist/detectors/oxford-comma.js.map +1 -0
- 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/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/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 +94 -54
- package/dist/detectors/signals.js.map +1 -1
- package/dist/detectors/stacked-hedge.d.ts +0 -7
- package/dist/detectors/stacked-hedge.d.ts.map +1 -1
- package/dist/detectors/stacked-hedge.js +6 -3
- package/dist/detectors/stacked-hedge.js.map +1 -1
- package/dist/detectors/stray-space.d.ts +7 -0
- package/dist/detectors/stray-space.d.ts.map +1 -0
- package/dist/detectors/stray-space.js +34 -0
- package/dist/detectors/stray-space.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 +37 -1
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/structure.d.ts +4 -4
- package/dist/detectors/structure.d.ts.map +1 -1
- package/dist/detectors/structure.js +7 -6
- package/dist/detectors/structure.js.map +1 -1
- 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 +19 -0
- package/dist/detectors/url-run-on.js.map +1 -0
- 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 +11 -4
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +99 -95
- 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/figure-references.d.ts +30 -0
- package/dist/figure-references.d.ts.map +1 -0
- package/dist/figure-references.js +76 -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/genre-parse.d.ts +5 -1
- package/dist/genre-parse.d.ts.map +1 -1
- package/dist/genre-parse.js +16 -3
- package/dist/genre-parse.js.map +1 -1
- package/dist/genre-suggest.d.ts.map +1 -1
- package/dist/genre-suggest.js +15 -1
- package/dist/genre-suggest.js.map +1 -1
- 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/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 +36 -11
- package/dist/line-paragraphs.js.map +1 -1
- package/dist/long-vowel.d.ts +35 -0
- package/dist/long-vowel.d.ts.map +1 -0
- package/dist/long-vowel.js +71 -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 +180 -0
- package/dist/markup.js.map +1 -0
- package/dist/mask.d.ts.map +1 -1
- package/dist/mask.js +10 -16
- package/dist/mask.js.map +1 -1
- package/dist/number-name.d.ts +21 -5
- package/dist/number-name.d.ts.map +1 -1
- package/dist/number-name.js +120 -18
- package/dist/number-name.js.map +1 -1
- package/dist/opening-line.d.ts +3 -0
- package/dist/opening-line.d.ts.map +1 -0
- package/dist/opening-line.js +14 -0
- package/dist/opening-line.js.map +1 -0
- package/dist/orthography.d.ts +7 -1
- package/dist/orthography.d.ts.map +1 -1
- package/dist/orthography.js +16 -5
- package/dist/orthography.js.map +1 -1
- 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/paragraph-length.d.ts +7 -0
- package/dist/paragraph-length.d.ts.map +1 -0
- package/dist/paragraph-length.js +10 -0
- package/dist/paragraph-length.js.map +1 -0
- 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 +121 -0
- 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 +0 -2
- package/dist/quoted-span.d.ts.map +1 -1
- package/dist/quoted-span.js +9 -4
- package/dist/quoted-span.js.map +1 -1
- package/dist/reasons.d.ts +3 -0
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +6 -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/explain.d.ts +7 -1
- package/dist/render/explain.d.ts.map +1 -1
- package/dist/render/explain.js +36 -12
- 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 +102 -12
- 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/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 +54 -0
- package/dist/rule-guide.d.ts.map +1 -0
- package/dist/rule-guide.js +81 -0
- package/dist/rule-guide.js.map +1 -0
- package/dist/rule-load.d.ts.map +1 -1
- package/dist/rule-load.js +94 -32
- 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 +3 -1
- package/dist/run-semantic.d.ts.map +1 -1
- package/dist/run-semantic.js +8 -3
- package/dist/run-semantic.js.map +1 -1
- package/dist/run.d.ts +15 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +57 -10
- package/dist/run.js.map +1 -1
- package/dist/semantic.d.ts +1 -1
- package/dist/semantic.d.ts.map +1 -1
- package/dist/semantic.js +10 -3
- package/dist/semantic.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 +6 -1
- package/dist/setting-problems.js.map +1 -1
- 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/span-merge.d.ts +4 -0
- package/dist/span-merge.d.ts.map +1 -0
- package/dist/span-merge.js +12 -0
- package/dist/span-merge.js.map +1 -0
- package/dist/speaker-labels.d.ts +4 -0
- package/dist/speaker-labels.d.ts.map +1 -0
- package/dist/speaker-labels.js +106 -0
- package/dist/speaker-labels.js.map +1 -0
- package/dist/stray-space.d.ts +17 -0
- package/dist/stray-space.d.ts.map +1 -0
- package/dist/stray-space.js +66 -0
- package/dist/stray-space.js.map +1 -0
- 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 +21 -0
- package/dist/structure/date-range.d.ts.map +1 -0
- package/dist/structure/date-range.js +45 -0
- package/dist/structure/date-range.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/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 +94 -42
- 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 +17 -2
- 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 +19 -0
- package/dist/style-parse.d.ts.map +1 -0
- package/dist/style-parse.js +60 -0
- package/dist/style-parse.js.map +1 -0
- package/dist/subheading-line.d.ts +6 -0
- package/dist/subheading-line.d.ts.map +1 -0
- package/dist/subheading-line.js +57 -0
- package/dist/subheading-line.js.map +1 -0
- package/dist/team-names.d.ts.map +1 -1
- package/dist/team-names.js +11 -14
- package/dist/team-names.js.map +1 -1
- 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 +60 -2
- package/package.json +5 -3
- package/reference-headings.yaml +17 -0
- package/rules/adverb-overuse.yaml +19 -0
- package/rules/agentless-passive.yaml +19 -0
- package/rules/agreement-slip.yaml +49 -0
- package/rules/ai-generated-composite.yaml +102 -0
- package/rules/ai-tell.yaml +23 -0
- package/rules/announced-count-mismatch.yaml +57 -0
- package/rules/announcing-opener.yaml +51 -0
- package/rules/assistant-residue.yaml +52 -0
- package/rules/bold-density.yaml +31 -0
- package/rules/broken-link.yaml +65 -0
- package/rules/closing-cliche.yaml +33 -0
- package/rules/colon-lead-in.yaml +59 -0
- package/rules/concrete-evidence-density.yaml +41 -0
- package/rules/contraction-consistency.yaml +18 -0
- package/rules/contrast-framing.yaml +57 -0
- package/rules/cushion-phrase-density.yaml +25 -0
- package/rules/dangling-figure-reference.yaml +61 -0
- package/rules/dangling-reference.yaml +53 -1
- package/rules/date-order.yaml +33 -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/doubled-punctuation.yaml +45 -0
- package/rules/doubled-word.yaml +17 -1
- package/rules/duplicate-definition.yaml +59 -1
- package/rules/emoji-density.yaml +25 -0
- package/rules/empty-conclusion.yaml +29 -0
- package/rules/empty-intensifier.yaml +19 -0
- package/rules/excessive-hedging.yaml +19 -0
- package/rules/expletive-construction.yaml +19 -0
- package/rules/heading-echo.yaml +32 -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/katakana-long-vowel.yaml +98 -0
- package/rules/kutoten-consistency.yaml +53 -0
- package/rules/latin-spacing.yaml +23 -4
- package/rules/max-kanji-continuous.yaml +16 -0
- package/rules/max-paragraph-length.yaml +42 -2
- package/rules/max-sentence-length.yaml +36 -0
- package/rules/ngram-repetition.yaml +29 -2
- package/rules/no-doubled-joshi.yaml +16 -0
- package/rules/no-em-dash.yaml +25 -0
- package/rules/no-mixed-desumasu.yaml +27 -2
- package/rules/no-nakaguro-parallel.yaml +20 -0
- package/rules/numbering-gap.yaml +53 -1
- package/rules/oxford-comma-consistency.yaml +19 -1
- package/rules/padded-intro.yaml +19 -0
- package/rules/paragraph-length-variance.yaml +49 -0
- package/rules/percent-sum-mismatch.yaml +58 -0
- package/rules/preamble-length.yaml +56 -0
- package/rules/preferred-term.yaml +27 -0
- package/rules/proper-noun-density.yaml +26 -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/risk-disclosure.yaml +22 -0
- package/rules/rule-of-three.yaml +97 -0
- package/rules/sasete-itadaku.yaml +18 -0
- package/rules/section-length-uniformity.yaml +89 -0
- package/rules/sentence-initial-conjunction-run.yaml +18 -0
- package/rules/sentence-rhythm.yaml +25 -0
- package/rules/stock-transition.yaml +55 -0
- package/rules/stray-space.yaml +56 -0
- package/rules/taigen-dome-in-prose.yaml +19 -0
- package/rules/title-case-consistency.yaml +42 -0
- package/rules/total-mismatch.yaml +37 -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 +19 -0
- package/rules/unsourced-number.yaml +16 -0
- package/rules/url-run-on.yaml +45 -0
- package/skills/chaff/SKILL.md +70 -0
- package/src/announced-count.ts +148 -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 +33 -10
- package/src/cli-args.ts +6 -0
- package/src/cli-text.ts +8 -4
- package/src/cli.ts +37 -37
- package/src/closing-numbers.ts +72 -0
- package/src/commands/compare.ts +80 -0
- package/src/commands/eval.ts +19 -8
- package/src/commands/feedback.ts +12 -6
- package/src/commands/test.ts +20 -17
- package/src/commands/tree.ts +41 -5
- package/src/compare/atom.ts +33 -0
- package/src/compare/clock-time.ts +86 -0
- package/src/compare/extract.ts +78 -0
- package/src/compare/fact-text.ts +68 -0
- package/src/compare/markup-atoms.ts +29 -0
- package/src/compare/match.ts +105 -0
- package/src/compare/outcome.ts +70 -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 +95 -0
- package/src/compare/text.ts +120 -0
- package/src/compare/tree-atoms.ts +80 -0
- package/src/compare/written-names.ts +26 -0
- package/src/config/load.ts +21 -0
- package/src/config/option-problems.ts +70 -0
- package/src/config/read.ts +8 -0
- package/src/config/rule-problems.ts +12 -2
- package/src/config/style.ts +42 -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 +15 -0
- package/src/custom/parse.ts +274 -0
- package/src/custom/problems.ts +89 -0
- package/src/custom/regex-safety.ts +118 -0
- package/src/custom/token-pattern.ts +84 -0
- package/src/detect.ts +28 -2
- package/src/detectors/acronym-context.ts +32 -4
- package/src/detectors/acronym-expansion.ts +132 -1
- package/src/detectors/agreement-slip.ts +191 -0
- package/src/detectors/ai-phrasing.ts +137 -0
- package/src/detectors/announced-count.ts +25 -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/content-morphemes.ts +19 -0
- package/src/detectors/contrast-frame.ts +54 -0
- package/src/detectors/custom.ts +89 -0
- package/src/detectors/dangling-figure.ts +22 -0
- package/src/detectors/doubled-punctuation.ts +49 -0
- package/src/detectors/doubled-word.ts +19 -4
- package/src/detectors/en-shape.ts +0 -269
- package/src/detectors/enumerated-runs.ts +13 -4
- 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/heading-case.ts +30 -2
- package/src/detectors/heading-code-words.ts +35 -0
- package/src/detectors/heading-echo.ts +18 -22
- package/src/detectors/heading-level-skip.ts +19 -0
- package/src/detectors/heading-overlap.ts +65 -0
- package/src/detectors/image-alt-text.ts +11 -0
- package/src/detectors/index.ts +49 -2
- package/src/detectors/kutoten-consistency.ts +96 -0
- package/src/detectors/lead-in.ts +3 -1
- package/src/detectors/letter-joined-name.ts +15 -0
- package/src/detectors/lexicon-match.ts +9 -2
- package/src/detectors/lexicon.ts +6 -2
- 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 +157 -0
- package/src/detectors/list-view.ts +157 -0
- package/src/detectors/long-vowel.ts +66 -0
- package/src/detectors/markup-finding.ts +24 -0
- package/src/detectors/name-numeral.ts +4 -2
- package/src/detectors/orthography.ts +24 -18
- package/src/detectors/oxford-comma.ts +297 -0
- 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/register.ts +37 -10
- 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 +110 -53
- package/src/detectors/stacked-hedge.ts +6 -3
- package/src/detectors/stray-space.ts +40 -0
- package/src/detectors/structure-tree.ts +45 -1
- package/src/detectors/structure.ts +13 -6
- 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 +27 -0
- package/src/document-sections.ts +46 -0
- package/src/document.ts +116 -127
- package/src/email-parts.ts +269 -0
- package/src/eval.ts +14 -4
- package/src/figure-references.ts +112 -0
- package/src/files.ts +5 -0
- package/src/genre-parse.ts +30 -5
- package/src/genre-suggest.ts +15 -2
- package/src/heading-label.ts +55 -0
- package/src/in-page-nav.ts +48 -19
- package/src/joined-view.ts +1 -0
- package/src/levels.ts +14 -1
- package/src/line-paragraphs.ts +56 -10
- package/src/long-vowel.ts +99 -0
- package/src/markdown-node.ts +19 -0
- package/src/markdown-read.ts +44 -0
- package/src/markup.ts +210 -0
- package/src/mask.ts +10 -19
- package/src/number-name.ts +152 -25
- package/src/opening-line.ts +17 -0
- package/src/orthography.ts +20 -5
- package/src/page-furniture.ts +11 -2
- package/src/paragraph-length.ts +9 -0
- package/src/plain-source.ts +2 -1
- package/src/plugin.ts +107 -1
- package/src/profile/for-file.ts +3 -1
- package/src/quoted-span.ts +10 -4
- package/src/reasons.ts +9 -0
- package/src/reference-lists.ts +91 -0
- package/src/render/explain.ts +47 -13
- package/src/render/friendly.ts +20 -9
- package/src/render/options.ts +58 -0
- package/src/render/rules-json.ts +130 -14
- 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/text.ts +21 -7
- package/src/resolve-genre.ts +4 -1
- package/src/rule-genres.ts +25 -0
- package/src/rule-guide.ts +135 -0
- package/src/rule-load.ts +98 -33
- package/src/rule-options.ts +131 -0
- package/src/run-semantic.ts +28 -20
- package/src/run.ts +78 -11
- package/src/semantic.ts +11 -3
- package/src/sentence-shape.ts +4 -5
- package/src/setting-problems.ts +7 -1
- package/src/span-cut.ts +28 -0
- package/src/span-merge.ts +13 -0
- package/src/speaker-labels.ts +129 -0
- package/src/stray-space.ts +81 -0
- 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 +69 -0
- package/src/structure/known-mentions.ts +96 -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 +104 -42
- 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 +24 -4
- package/src/structure/wrapped-tail.ts +38 -13
- package/src/style-load.ts +28 -0
- package/src/style-parse.ts +77 -0
- package/src/subheading-line.ts +68 -0
- package/src/team-names.ts +13 -13
- 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 +29 -0
- package/styles/jis-z8301-2011.yaml +25 -0
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { DocumentProfile, Mention, RelativeVocabulary, Span } from "../plugin.ts";
|
|
2
|
+
import { isOneCharacter, withoutClosedPairs } from "./closed-pairs.ts";
|
|
3
|
+
import { asideDepth, characters, type AsideDepth } from "./aside-depth.ts";
|
|
4
|
+
import { knownMentions, type KnownMentions } from "./known-mentions.ts";
|
|
2
5
|
|
|
3
6
|
/**
|
|
4
7
|
* 前条・次項・同号・本条・前各項・前二項・前条第二項、条を書かない「第一項」を行の中から探す。語は文書の種類(profiles/*.yaml)が決める。
|
|
@@ -74,17 +77,6 @@ const countOf = (count: string | undefined, vocabulary: RelativeVocabulary, numb
|
|
|
74
77
|
|
|
75
78
|
type Substitution = NonNullable<RelativeVocabulary["substitution"]>;
|
|
76
79
|
|
|
77
|
-
/** 文字と、その位置(UTF-16 の単位で)。絵文字のような 2 単位の文字も 1 文字として読む。 */
|
|
78
|
-
const characters = (text: string): { readonly char: string; readonly at: number }[] => {
|
|
79
|
-
const found: { char: string; at: number }[] = [];
|
|
80
|
-
let at = 0;
|
|
81
|
-
for (const char of text) {
|
|
82
|
-
found.push({ char, at });
|
|
83
|
-
at += char.length;
|
|
84
|
-
}
|
|
85
|
-
return found;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
80
|
/** 一番外側の括弧の範囲。閉じの無い開きは捨てる。 */
|
|
89
81
|
const outerQuotes = (text: string, quote: Substitution): Span[] => {
|
|
90
82
|
const spans: Span[] = [];
|
|
@@ -118,20 +110,23 @@ export const substitutedDocuments = (mentions: readonly Mention[], text: string,
|
|
|
118
110
|
);
|
|
119
111
|
};
|
|
120
112
|
|
|
121
|
-
/**
|
|
113
|
+
/**
|
|
114
|
+
* 閉じた括弧書きを内側から外す。開きと閉じが 1 字ずつなら、組ごと 1 度で外す(深い入れ子でも本文を読み直さない)。
|
|
115
|
+
* 2 字以上の括弧は、内側の組を外すのを変わらなくなるまで繰り返す。
|
|
116
|
+
*/
|
|
122
117
|
const withoutAsides = (gap: string, aside: RelativeVocabulary["aside"]): string => {
|
|
123
118
|
if (aside === undefined) return gap;
|
|
119
|
+
if (isOneCharacter(aside.open) && isOneCharacter(aside.close)) return withoutClosedPairs(gap, aside.open, aside.close);
|
|
124
120
|
const inner = new RegExp(`${escape(aside.open)}[^${escape(aside.open)}${escape(aside.close)}]*${escape(aside.close)}`, "gu");
|
|
125
|
-
|
|
126
|
-
|
|
121
|
+
let rest = gap;
|
|
122
|
+
for (let once = rest.replace(inner, ""); once !== rest; once = rest.replace(inner, "")) rest = once;
|
|
123
|
+
return rest;
|
|
127
124
|
};
|
|
128
125
|
|
|
129
126
|
/** あいだが、並びをつなぐもの・つなぎの語・閉じた括弧書き・空白だけか。 */
|
|
130
127
|
const onlyJoins = (gap: string, patterns: Compiled, vocabulary: RelativeVocabulary): boolean =>
|
|
131
128
|
withoutAsides(gap, vocabulary.aside).replace(patterns.joins, "").trim() === "";
|
|
132
129
|
|
|
133
|
-
const overlaps = (start: number, end: number, others: readonly Mention[]): boolean => others.some((other) => start < other.end && other.start < end);
|
|
134
|
-
|
|
135
130
|
/** 行き先を決められない番地。並びの続きを止めるためだけに覚え、参照にはしない。 */
|
|
136
131
|
const OPAQUE = "opaque";
|
|
137
132
|
|
|
@@ -154,53 +149,45 @@ const bareCandidates = (text: string, patterns: Compiled, vocabulary: RelativeVo
|
|
|
154
149
|
/** 並びの中での扱い: 前の参照の続きか、今いるところの中か、行き先を決められないか。 */
|
|
155
150
|
type BareWay = { readonly way: string; readonly continues?: Mention | undefined };
|
|
156
151
|
|
|
157
|
-
/**
|
|
158
|
-
|
|
152
|
+
/** 本文と、その括弧書きの深さ。並びは同じ深さの参照どうしでつながる。 */
|
|
153
|
+
type Line = { readonly text: string; readonly asides: AsideDepth };
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 並びの中での扱い: 前の参照の続きか、今いるところの中か、行き先を決められないか。続きなら、どの参照の続きか。
|
|
157
|
+
* 前の参照とつながらなくても、参照の直後に開いた括弧書きの中なら、その参照の続き。
|
|
158
|
+
* 「第二十七条(第四項を除き、第五項及び第六項の規定を…)」の番地は、どれも第二十七条の中。
|
|
159
|
+
*/
|
|
160
|
+
const wayOfBare = (line: Line, bare: Bare, known: KnownMentions, patterns: Compiled, vocabulary: RelativeVocabulary): BareWay => {
|
|
161
|
+
const { text, asides } = line;
|
|
159
162
|
if (glued(text, bare.start, patterns)) return { way: OPAQUE };
|
|
160
|
-
const
|
|
161
|
-
const sameDepth = known.filter((other) => other.end <= bare.start && openAsides(text, other.end, vocabulary).length === depth);
|
|
162
|
-
const previous = sameDepth.toSorted((left, right) => left.end - right.end).at(-1);
|
|
163
|
+
const previous = known.previous(bare.start, asides.depth(bare.start));
|
|
163
164
|
const joined = previous !== undefined && onlyJoins(text.slice(previous.end, bare.start), patterns, vocabulary) ? previous : undefined;
|
|
164
|
-
const
|
|
165
|
+
const open = asides.innermost(bare.start);
|
|
166
|
+
const continues = joined ?? (open === undefined ? undefined : known.endingAt(open));
|
|
165
167
|
if (continues === undefined) return { way: "current" };
|
|
166
168
|
return continues.attrs["relative"] === OPAQUE ? { way: OPAQUE } : { way: "continue", continues };
|
|
167
169
|
};
|
|
168
170
|
|
|
169
|
-
/** at の位置で開いたままの括弧書きの開きの位置。並びは同じ深さの参照どうしでつながる。 */
|
|
170
|
-
const openAsides = (text: string, at: number, vocabulary: RelativeVocabulary): number[] => {
|
|
171
|
-
const aside = vocabulary.aside;
|
|
172
|
-
const opens: number[] = [];
|
|
173
|
-
if (aside === undefined) return opens;
|
|
174
|
-
characters(text.slice(0, at)).forEach(({ char, at: position }) => {
|
|
175
|
-
if (char === aside.open) opens.push(position);
|
|
176
|
-
if (char === aside.close) opens.pop();
|
|
177
|
-
});
|
|
178
|
-
return opens;
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* 参照の直後に開いた括弧書きの中なら、その参照。「第二十七条(第四項を除き、第五項及び第六項の規定を…)」の番地は、どれも第二十七条の中。
|
|
183
|
-
*/
|
|
184
|
-
const ownerOfAside = (text: string, at: number, known: readonly Mention[], vocabulary: RelativeVocabulary): Mention | undefined => {
|
|
185
|
-
const open = openAsides(text, at, vocabulary).at(-1);
|
|
186
|
-
return open === undefined ? undefined : known.find((other) => other.end === open);
|
|
187
|
-
};
|
|
188
|
-
|
|
189
171
|
/**
|
|
190
172
|
* 条を書かない「第一項」。すぐ前の参照とのあいだがつなぎの語だけなら、その参照の続き(continue)。
|
|
191
173
|
* そうでなければ、書いた場所を含む一つ上のまとまり(current)の中。
|
|
192
174
|
*/
|
|
193
175
|
const bareMentions = (text: string, patterns: Compiled, vocabulary: RelativeVocabulary, number: NumberReader, before: readonly Mention[]): Mention[] => {
|
|
176
|
+
const candidates = bareCandidates(text, patterns, vocabulary, number);
|
|
177
|
+
if (candidates.length === 0) return [];
|
|
178
|
+
const line = { text, asides: asideDepth(text, vocabulary.aside) };
|
|
179
|
+
const known = knownMentions(before, line.asides.depth);
|
|
194
180
|
const found: Mention[] = [];
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
const { way, continues } = wayOfBare(text, bare, known, patterns, vocabulary);
|
|
181
|
+
candidates.forEach((bare) => {
|
|
182
|
+
if (known.overlaps(bare.start, bare.end)) return;
|
|
183
|
+
const { way, continues } = wayOfBare(line, bare, known, patterns, vocabulary);
|
|
199
184
|
// 条を書かない番地は、その一つ上(level)ではなく、書いた単位(level + 1)から名指しする。「第一項」は「同条」の行き先を変えない。
|
|
200
185
|
// continues は、続きの元の参照がどれだけ前から始まるか。木の中で、その参照を位置で引く。
|
|
201
186
|
const back = continues === undefined ? {} : { continues: bare.start - continues.start };
|
|
202
187
|
const attrs = { label: bare.label, relative: way, level: bare.first - 1, count: 1, suffix: bare.suffix, names: bare.first, ...back };
|
|
203
|
-
|
|
188
|
+
const mention = { start: bare.start, end: bare.end, attrs };
|
|
189
|
+
found.push(mention);
|
|
190
|
+
known.add(mention, line.asides.depth(mention.end));
|
|
204
191
|
});
|
|
205
192
|
return found.filter((mention) => mention.attrs["relative"] !== OPAQUE);
|
|
206
193
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { StructureNode } from "../plugin.ts";
|
|
2
|
+
import { preOrder } from "../tree-walk.ts";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* 相対の参照(relative-find.ts が見つけたもの)に番地を与える。木ができてからでないと「次条」は決まらないので、ここは木を読むだけの後段。
|
|
@@ -10,7 +11,13 @@ import type { StructureNode } from "../plugin.ts";
|
|
|
10
11
|
/** range は「第四十三条から第五十五条まで 削除」のように、一行で並びをまとめたもの。番地は最初のものしか持たない。 */
|
|
11
12
|
type Place = { readonly address: string; readonly level: number; readonly range?: boolean };
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
/**
|
|
15
|
+
* 参照が指した文書: 他の文書の名前と、番号を名指した単位の語。
|
|
16
|
+
* 単位の語は、見出しに「1 目的」と番号を振った指針の「法第16条」が、条で数える別の文書の条だと決めるのに使う(unit-word.ts)。
|
|
17
|
+
*/
|
|
18
|
+
type Cited = { readonly document: string | undefined; readonly unitWord: string | undefined };
|
|
19
|
+
|
|
20
|
+
type Last = Cited & { readonly target: string };
|
|
14
21
|
|
|
15
22
|
const NUMBERED = new Set(["chapter", "article", "item"]);
|
|
16
23
|
|
|
@@ -18,11 +25,18 @@ const placeOf = (node: StructureNode): Place | undefined =>
|
|
|
18
25
|
NUMBERED.has(node.kind) && node.level !== undefined ? { address: node.address, level: node.level, range: node.ordinalTo !== undefined } : undefined;
|
|
19
26
|
|
|
20
27
|
/** 番号の付いた子。Markdown の見出し(section)は番号の外なので、その中まで見る。 */
|
|
21
|
-
const numberedChildren = (node: StructureNode, level: number): StructureNode[] =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
const numberedChildren = (node: StructureNode, level: number): StructureNode[] => {
|
|
29
|
+
const found: StructureNode[] = [];
|
|
30
|
+
const pending = node.children.toReversed();
|
|
31
|
+
while (pending.length > 0) {
|
|
32
|
+
const child = pending.pop();
|
|
33
|
+
if (child === undefined) break;
|
|
34
|
+
if (NUMBERED.has(child.kind)) {
|
|
35
|
+
if (child.level === level) found.push(child);
|
|
36
|
+
} else if (child.kind === "section") child.children.toReversed().forEach((inner) => pending.push(inner));
|
|
37
|
+
}
|
|
38
|
+
return found;
|
|
39
|
+
};
|
|
26
40
|
|
|
27
41
|
type Context = {
|
|
28
42
|
readonly articles: readonly Place[];
|
|
@@ -100,21 +114,21 @@ const continued = (level: number, node: StructureNode, context: Context): Last |
|
|
|
100
114
|
if (origin === undefined || context.articleLevel === undefined || level < context.articleLevel) return undefined;
|
|
101
115
|
const parts = origin.target.split(".");
|
|
102
116
|
const kept = level - context.articleLevel + 1;
|
|
103
|
-
return parts.length < kept ? undefined : { target: parts.slice(0, kept).join(".")
|
|
117
|
+
return parts.length < kept ? undefined : { ...origin, target: parts.slice(0, kept).join(".") };
|
|
104
118
|
};
|
|
105
119
|
|
|
106
120
|
/**
|
|
107
121
|
* 参照が名指しした深さを覚える。名指しは、書き出しの深さ(第〇条なら条、前項なら項)から番地の深さまで。
|
|
108
122
|
* 番地を深さで切る起点は条。条より外のまとまりは番地の形が違うので覚えない。
|
|
109
123
|
*/
|
|
110
|
-
const remember = (context: Context,
|
|
124
|
+
const remember = (context: Context, reference: Last, from: number): void => {
|
|
111
125
|
const articleLevel = context.articleLevel;
|
|
112
126
|
// 章・節は番地の形(ch1)が条から始まらないので覚えない。覚えると「同条」が章を指してしまう。
|
|
113
127
|
if (articleLevel === undefined || from < articleLevel) return;
|
|
114
|
-
const parts = target.split(".");
|
|
128
|
+
const parts = reference.target.split(".");
|
|
115
129
|
parts.forEach((_, index) => {
|
|
116
130
|
const level = articleLevel + index;
|
|
117
|
-
if (level >= from) context.last.set(level, { target: parts.slice(0, index + 1).join(".")
|
|
131
|
+
if (level >= from) context.last.set(level, { ...reference, target: parts.slice(0, index + 1).join(".") });
|
|
118
132
|
});
|
|
119
133
|
};
|
|
120
134
|
|
|
@@ -145,12 +159,17 @@ const baseOf = (way: string, node: StructureNode, anchor: Anchor | undefined, la
|
|
|
145
159
|
return anchor === undefined ? undefined : byPosition(way, Number(node.attrs["count"]), anchor);
|
|
146
160
|
};
|
|
147
161
|
|
|
148
|
-
/**
|
|
149
|
-
const
|
|
150
|
-
if (way === "same") return last
|
|
151
|
-
return way === "continue" ? continued(Number(node.attrs["level"]), node, context)
|
|
162
|
+
/** 同と並びの続きは、元の参照が指した文書を引き継ぐ。前・次・本はこの文書の中。 */
|
|
163
|
+
const citedOf = (way: string, node: StructureNode, last: Last | undefined, context: Context): Cited | undefined => {
|
|
164
|
+
if (way === "same") return last;
|
|
165
|
+
return way === "continue" ? continued(Number(node.attrs["level"]), node, context) : undefined;
|
|
152
166
|
};
|
|
153
167
|
|
|
168
|
+
const citedAttrs = (cited: Cited | undefined): Record<string, string> => ({
|
|
169
|
+
...(cited?.document === undefined ? {} : { document: cited.document }),
|
|
170
|
+
...(cited?.unitWord === undefined ? {} : { unitWord: cited.unitWord }),
|
|
171
|
+
});
|
|
172
|
+
|
|
154
173
|
const resolveOne = (node: StructureNode, path: readonly StructureNode[], context: Context): StructureNode | undefined => {
|
|
155
174
|
const way = String(node.attrs["relative"]);
|
|
156
175
|
const level = Number(node.attrs["level"]);
|
|
@@ -160,50 +179,93 @@ const resolveOne = (node: StructureNode, path: readonly StructureNode[], context
|
|
|
160
179
|
const place = base === undefined ? undefined : withSuffix(base, String(node.attrs["suffix"] ?? ""), context.implicitLevel);
|
|
161
180
|
if (place === undefined) return undefined;
|
|
162
181
|
const fallback = fallbackOf(place, context.implicitLevel);
|
|
163
|
-
const document = documentOf(way, node, last, context);
|
|
164
182
|
const attrs = {
|
|
165
183
|
target: place.address,
|
|
166
184
|
label: String(node.attrs["label"]),
|
|
167
185
|
...(fallback === undefined ? {} : { fallback }),
|
|
168
|
-
...(
|
|
186
|
+
...citedAttrs(citedOf(way, node, last, context)),
|
|
169
187
|
};
|
|
170
188
|
return { ...node, attrs };
|
|
171
189
|
};
|
|
172
190
|
|
|
173
191
|
const isRelative = (node: StructureNode): boolean => node.kind === "reference" && node.attrs["relative"] !== undefined;
|
|
174
192
|
|
|
175
|
-
/**
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
193
|
+
/** 相対の参照に番地を決めて、その番地を覚える。決まらなければ木から外す(undefined)。 */
|
|
194
|
+
const resolvedReference = (node: StructureNode, path: readonly StructureNode[], context: Context): StructureNode | undefined => {
|
|
195
|
+
const resolved = resolveOne(node, path, context);
|
|
196
|
+
if (resolved === undefined) return undefined;
|
|
197
|
+
const reference = lastOf(resolved);
|
|
198
|
+
context.byStart.set(node.span.start, reference);
|
|
199
|
+
remember(context, reference, Number(node.attrs["names"] ?? node.attrs["level"]));
|
|
200
|
+
return resolved;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/** 番地を名指した参照の番地を覚える。 */
|
|
204
|
+
const noteReference = (node: StructureNode, context: Context): void => {
|
|
205
|
+
if (node.kind !== "reference") return;
|
|
206
|
+
const reference = lastOf(node);
|
|
207
|
+
context.byStart.set(node.span.start, reference);
|
|
208
|
+
remember(context, reference, context.articleLevel ?? 0);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
/** 子を読んでいる節点。next は次に読む子。 */
|
|
212
|
+
type Visit = { readonly node: StructureNode; readonly kept: StructureNode[]; next: number };
|
|
213
|
+
|
|
214
|
+
/** 読み終えた節点を、残した子で作り直して親に渡す。親が無ければ(根なら)それを返す。 */
|
|
215
|
+
const close = (visits: Visit[]): StructureNode | undefined => {
|
|
216
|
+
const visit = visits.pop();
|
|
217
|
+
if (visit === undefined) return undefined;
|
|
218
|
+
const rebuilt = { ...visit.node, children: visit.kept };
|
|
219
|
+
const parent = visits.at(-1);
|
|
220
|
+
if (parent === undefined) return rebuilt;
|
|
221
|
+
parent.kept.push(rebuilt);
|
|
222
|
+
return undefined;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/** 文書の順に読み、参照ごとに「その前の参照」を覚える。相対の参照は置き換えて、その中は読まない。 */
|
|
226
|
+
const walk = (tree: StructureNode, context: Context): StructureNode | undefined => {
|
|
227
|
+
if (isRelative(tree)) return resolvedReference(tree, [], context);
|
|
228
|
+
noteReference(tree, context);
|
|
229
|
+
const visits: Visit[] = [{ node: tree, kept: [], next: 0 }];
|
|
230
|
+
while (visits.length > 0) {
|
|
231
|
+
const visit = visits.at(-1);
|
|
232
|
+
const child = visit?.node.children[visit.next];
|
|
233
|
+
if (visit === undefined || child === undefined) {
|
|
234
|
+
const root = close(visits);
|
|
235
|
+
if (root !== undefined) return root;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
visit.next += 1;
|
|
239
|
+
if (isRelative(child)) {
|
|
240
|
+
const resolved = resolvedReference(
|
|
241
|
+
child,
|
|
242
|
+
visits.map((open) => open.node),
|
|
243
|
+
context,
|
|
244
|
+
);
|
|
245
|
+
if (resolved !== undefined) visit.kept.push(resolved);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
noteReference(child, context);
|
|
249
|
+
visits.push({ node: child, kept: [], next: 0 });
|
|
190
250
|
}
|
|
191
|
-
|
|
192
|
-
const children = node.children.flatMap((child) => {
|
|
193
|
-
const kept = walk(child, inside, context);
|
|
194
|
-
return kept === undefined ? [] : [kept];
|
|
195
|
-
});
|
|
196
|
-
return { ...node, children };
|
|
251
|
+
return undefined;
|
|
197
252
|
};
|
|
198
253
|
|
|
199
254
|
const optional = (value: string | number | undefined): string | undefined => (value === undefined ? undefined : String(value));
|
|
200
255
|
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
256
|
+
const lastOf = (reference: StructureNode): Last => ({
|
|
257
|
+
target: String(reference.attrs["target"]),
|
|
258
|
+
document: optional(reference.attrs["document"]),
|
|
259
|
+
unitWord: optional(reference.attrs["unitWord"]),
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
const articlesOf = (root: StructureNode): Place[] =>
|
|
263
|
+
preOrder(root).flatMap((node) => {
|
|
264
|
+
const place = node.kind === "article" ? placeOf(node) : undefined;
|
|
265
|
+
return place === undefined ? [] : [place];
|
|
266
|
+
});
|
|
205
267
|
|
|
206
268
|
export const resolveRelative = (tree: StructureNode, implicitLevel: number | undefined): StructureNode => {
|
|
207
269
|
const articles = articlesOf(tree);
|
|
208
|
-
return walk(tree,
|
|
270
|
+
return walk(tree, { articles, articleLevel: articles[0]?.level, implicitLevel, last: new Map(), byStart: new Map() }) ?? tree;
|
|
209
271
|
};
|
package/src/structure/runs.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
type Kind = "list" | "table";
|
|
6
6
|
|
|
7
7
|
const LIST_ITEM = /^[ \t]{0,12}(?:[-*+]|\d{1,3}[.)])[ \t]/u;
|
|
8
|
-
const TABLE_ROW = /^[ \t]{0,12}\|/u;
|
|
8
|
+
export const TABLE_ROW = /^[ \t]{0,12}\|/u;
|
|
9
9
|
|
|
10
|
-
const TABLE_RULE = /^[ \t]{0,12}\|?[ \t]{0,4}:?-{3,}/u;
|
|
10
|
+
export const TABLE_RULE = /^[ \t]{0,12}\|?[ \t]{0,4}:?-{3,}/u;
|
|
11
11
|
const INDENT = /^[ \t]*/u;
|
|
12
12
|
|
|
13
13
|
export type Line = { readonly start: number; readonly end: number; readonly kind: Kind | undefined; readonly indent: number; readonly rule: boolean };
|
package/src/structure/sexp.ts
CHANGED
|
@@ -20,9 +20,21 @@ const keywords = (node: StructureNode): string[] => [
|
|
|
20
20
|
* 木を S 式にする。人と AI が読むための形で、JSON と同じ木から作る。
|
|
21
21
|
* `(kind "番地" :key value ... 子)`。番地を持たない葉は番地を書かない。
|
|
22
22
|
*/
|
|
23
|
-
export const toSexp = (
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
23
|
+
export const toSexp = (root: StructureNode, indent = ""): string => {
|
|
24
|
+
const lines: string[] = [];
|
|
25
|
+
// 1 行に 1 節点。節点を閉じる ")" は、その部分木の最後の行の後ろに付く。
|
|
26
|
+
const pending = [{ node: root, depth: 0, closing: false }];
|
|
27
|
+
while (pending.length > 0) {
|
|
28
|
+
const next = pending.pop();
|
|
29
|
+
if (next === undefined) break;
|
|
30
|
+
if (next.closing) {
|
|
31
|
+
lines.push(`${lines.pop() ?? ""})`);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const head = [next.node.kind, ...(next.node.address === "" ? [] : [quote(next.node.address)]), ...keywords(next.node)].join(" ");
|
|
35
|
+
lines.push(`${indent}${" ".repeat(next.depth)}(${head}`);
|
|
36
|
+
pending.push({ ...next, closing: true });
|
|
37
|
+
next.node.children.toReversed().forEach((child) => pending.push({ node: child, depth: next.depth + 1, closing: false }));
|
|
38
|
+
}
|
|
39
|
+
return lines.join("\n");
|
|
28
40
|
};
|
package/src/structure/total.ts
CHANGED
|
@@ -27,7 +27,7 @@ type Cell = { readonly column: number; readonly unit: string };
|
|
|
27
27
|
type Placed = Amount & Cell & { readonly cents: number | undefined };
|
|
28
28
|
type Entry = { readonly label: boolean; readonly amounts: readonly Placed[] };
|
|
29
29
|
|
|
30
|
-
const columnOf = (source: string, line: Line, offset: number): number => source.slice(line.start, offset).split(CELL_SEPARATOR).length - 1;
|
|
30
|
+
export const columnOf = (source: string, line: Line, offset: number): number => source.slice(line.start, offset).split(CELL_SEPARATOR).length - 1;
|
|
31
31
|
|
|
32
32
|
const isNegative = (source: string, line: Line, amount: Amount): boolean => {
|
|
33
33
|
const before = source.slice(line.start, amount.offset);
|
|
@@ -48,7 +48,7 @@ const leadingText = (text: string): string =>
|
|
|
48
48
|
*/
|
|
49
49
|
const AFTER_LABEL = /^[*_]*[ \t\u3000]*(?:$|[::|((]|[-−▲△$€£¥¥\p{N}])/u;
|
|
50
50
|
|
|
51
|
-
const isTotalLabel = (text: string, labels: readonly string[]): boolean => {
|
|
51
|
+
export const isTotalLabel = (text: string, labels: readonly string[]): boolean => {
|
|
52
52
|
const lead = leadingText(text).toLowerCase();
|
|
53
53
|
return labels.some((label) => lead.startsWith(label.toLowerCase()) && AFTER_LABEL.test(lead.slice(label.length)));
|
|
54
54
|
};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { NumberedLine, NumberingContext } from "../plugin.ts";
|
|
1
|
+
import type { NumberedLine, NumberingContext, StructurePatterns } from "../plugin.ts";
|
|
2
|
+
import { numberInSentence } from "./number-in-sentence.ts";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* 「4.2 設定」「3.1.4 Scope」のような通し番号。数字と点だけで書くので言語を問わない。
|
|
5
6
|
* 各部分を 3 桁・深さを 6 までに抑え、後戻りが爆発しない形にしてある。
|
|
6
7
|
*/
|
|
7
|
-
const DOTTED = /^[ \t]{0,3}(?<number>\d{1,3}(?:\.\d{1,3}){0,5})
|
|
8
|
+
const DOTTED = /^[ \t]{0,3}(?<number>\d{1,3}(?:\.\d{1,3}){0,5})(?<closing>\.)?[ \t\u3000]+(?<rest>\S.*)$/u;
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* RFC のようなテキストの仕様書(Markdown でないもの)の章見出し「5. Security Considerations」。Markdown では、行内のコードを伏せた空白が
|
|
@@ -17,16 +18,35 @@ const MAX_TITLE = 80;
|
|
|
17
18
|
|
|
18
19
|
const isTopSection = (line: string, rest: string): boolean => TOP_SECTION.test(line) && rest.length <= MAX_TITLE && !SENTENCE_END.test(rest);
|
|
19
20
|
|
|
21
|
+
/** closedByDot: 番号を点で閉じたか(「5. 」)。「1.5 万人」の 1.5 は閉じていない。 */
|
|
22
|
+
type DottedLine = NumberedLine & { readonly closedByDot: boolean };
|
|
23
|
+
|
|
20
24
|
/**
|
|
21
25
|
* 本文の「1. 」は箇条書きで、見出しの「1. 」は章番号。点を含まない番号は、見出しの行か、テキストの章見出しの形でだけ読む。
|
|
22
26
|
* 「4.2 」のように点を含むものは、.txt の仕様書でも見出しとして書かれるので本文でも読む。
|
|
23
27
|
*/
|
|
24
|
-
export const dottedNumber = (line: string, context: NumberingContext, plainText = false):
|
|
28
|
+
export const dottedNumber = (line: string, context: NumberingContext, plainText = false): DottedLine | undefined => {
|
|
25
29
|
const groups = DOTTED.exec(line)?.groups;
|
|
26
30
|
const number = groups?.["number"];
|
|
27
31
|
if (number === undefined) return undefined;
|
|
28
32
|
const depth = number.split(".").length;
|
|
29
33
|
const rest = groups?.["rest"]?.trim() ?? "";
|
|
30
34
|
if (depth < 2 && !context.isHeading && !(plainText && isTopSection(line, rest))) return undefined;
|
|
31
|
-
|
|
35
|
+
const closedByDot = groups?.["closing"] !== undefined;
|
|
36
|
+
return { kind: "article", depth, number, absolute: true, label: number, heading: rest, rest, ordinal: Number(number.split(".").at(-1)), closedByDot };
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 番号の後ろが単位なら数量(「1.5 万人」「2.5 days」)。点で閉じた番号(「5. ページ自身の通信」「2. Days off」)は札で、
|
|
41
|
+
* 数量はそう書かないので、後ろに単位の語が来ても数量にしない。
|
|
42
|
+
*/
|
|
43
|
+
export const isAmount = (dotted: DottedLine, countedAfter: StructurePatterns["countedAfter"]): boolean =>
|
|
44
|
+
!dotted.closedByDot && countedAfter?.(dotted.number, dotted.rest) === true;
|
|
45
|
+
|
|
46
|
+
/** 言語を問わない通し番号。後ろが単位なら数量、本文の文の続きなら文の中の数なので、番号にしない。 */
|
|
47
|
+
export const universalNumber = (patterns: StructurePatterns, text: string, context: NumberingContext, plainText: boolean): NumberedLine | undefined => {
|
|
48
|
+
const dotted = dottedNumber(text, context, plainText);
|
|
49
|
+
if (dotted === undefined || isAmount(dotted, patterns.countedAfter)) return undefined;
|
|
50
|
+
const numbered = { number: dotted.number, rest: dotted.rest, isHeading: context.isHeading };
|
|
51
|
+
return numberInSentence(numbered, patterns.continuesSentence) ? undefined : dotted;
|
|
32
52
|
};
|
|
@@ -1,22 +1,47 @@
|
|
|
1
1
|
import type { Mention } from "../plugin.ts";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* 参照を読む行と、その前後につないだ行。
|
|
5
5
|
*
|
|
6
|
-
* 72 桁で折り返す RFC は「Section 16.3.2\n of [HTTP]
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* 72 桁で折り返す RFC は「Section 16.3.2\n of [HTTP]」「RFC 7657\n (Sections 5.1 …)」のように、参照と「どの文書の」を別の行に書く。
|
|
7
|
+
* 行だけを読むと自分の文書の 16.3.2 に見える。改行と字下げは読み手には空白一つなので、そうつないだ文字列を言語の読み手に渡す。
|
|
8
|
+
* 拾った参照は行の中にあるものだけを残す。前後の行の参照は、その行を読むときに拾う。位置は行の上のまま。
|
|
9
|
+
* leadLength は text の先頭につないだ前の行の長さ(つなぎの空白を含む)。前の行をつながなければ無い。
|
|
9
10
|
*/
|
|
10
|
-
export type WrappedLine = { readonly line: string; readonly text: string; readonly lineLength: number };
|
|
11
|
+
export type WrappedLine = { readonly line: string; readonly text: string; readonly lineLength: number; readonly leadLength?: number };
|
|
11
12
|
|
|
12
|
-
/**
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* 前の行は末尾のこれだけを読む。文書の名前(「35 CFR」「RFC 7657」)は数語なので足りる。長く読むと前の行の参照
|
|
15
|
+
* (「Article 58 of the UK GDPR (powers),」)まで入り、その文書が次の行の括弧の中の参照に移る。
|
|
16
|
+
*/
|
|
17
|
+
export const LEAD_REACH = 24;
|
|
18
|
+
|
|
19
|
+
/** 前の行の末尾。長ければ LEAD_REACH の内側の最初の空白から後ろにして、語の途中から始めない。空白が無ければ読まない。 */
|
|
20
|
+
const leadOf = (previous: string | undefined): string => {
|
|
21
|
+
const trimmed = previous?.trim() ?? "";
|
|
22
|
+
if (trimmed.length <= LEAD_REACH) return trimmed;
|
|
23
|
+
const end = trimmed.slice(-LEAD_REACH);
|
|
24
|
+
const space = end.search(/\s/u);
|
|
25
|
+
return space === -1 ? "" : end.slice(space).trimStart();
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** 見出しは前後の行へ続かない。見出しの行か、前後の行が無い・空なら、その側はつながない。 */
|
|
29
|
+
export const wrappedLine = (text: string, onHeading: boolean, next: string | undefined, previous?: string): WrappedLine => {
|
|
14
30
|
const tail = onHeading ? "" : (next?.trim() ?? "");
|
|
15
|
-
|
|
16
|
-
const kept = text.trimEnd();
|
|
17
|
-
|
|
31
|
+
const lead = onHeading ? "" : leadOf(previous);
|
|
32
|
+
const kept = tail === "" ? text : text.trimEnd();
|
|
33
|
+
const joined = tail === "" ? text : `${kept} ${tail}`;
|
|
34
|
+
if (lead === "") return { line: text, text: joined, lineLength: kept.length };
|
|
35
|
+
// 全角どうしでも空白でつなぐ。詰めると、前の行の宛名(「…担当課」)が次の行の法令名(「構造改革特別区域法」)に付く。
|
|
36
|
+
const joint = `${lead} `;
|
|
37
|
+
return { line: text, text: `${joint}${joined}`, lineLength: kept.length, leadLength: joint.length };
|
|
18
38
|
};
|
|
19
39
|
|
|
20
|
-
/**
|
|
21
|
-
export const onLine = (mentions: readonly Mention[], wrapped: WrappedLine): readonly Mention[] =>
|
|
22
|
-
|
|
40
|
+
/** 行の中で始まり、行の中で終わる参照だけを、行の上の位置で。つないだ前後の行に入り込んだもの(「Sections 1,\n 2」の 2)は捨てる。 */
|
|
41
|
+
export const onLine = (mentions: readonly Mention[], wrapped: WrappedLine): readonly Mention[] => {
|
|
42
|
+
const lead = wrapped.leadLength ?? 0;
|
|
43
|
+
if (lead === 0) return mentions.filter((mention) => mention.end <= wrapped.lineLength);
|
|
44
|
+
return mentions
|
|
45
|
+
.filter((mention) => mention.start >= lead && mention.end <= lead + wrapped.lineLength)
|
|
46
|
+
.map((mention) => ({ ...mention, start: mention.start - lead, end: mention.end - lead }));
|
|
47
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFileSync, readdirSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { parse } from "yaml";
|
|
5
|
+
import { parseStyle, type StyleDefinition } from "./style-parse.ts";
|
|
6
|
+
|
|
7
|
+
const STYLES_DIR = join(dirname(fileURLToPath(import.meta.url)), "..", "styles");
|
|
8
|
+
|
|
9
|
+
const loaded: { value: readonly StyleDefinition[] | undefined } = { value: undefined };
|
|
10
|
+
|
|
11
|
+
const readStyle = (dir: string, file: string): StyleDefinition => {
|
|
12
|
+
try {
|
|
13
|
+
return parseStyle(parse(readFileSync(join(dir, file), "utf8")), file);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
throw new Error(`cannot read ${join(dir, file)}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** The bundled house styles (styles/*.yaml), by file name. Read once. */
|
|
20
|
+
export const loadStyles = (dir: string = STYLES_DIR): readonly StyleDefinition[] => {
|
|
21
|
+
if (dir === STYLES_DIR && loaded.value !== undefined) return loaded.value;
|
|
22
|
+
const styles = readdirSync(dir)
|
|
23
|
+
.filter((file) => file.endsWith(".yaml"))
|
|
24
|
+
.toSorted((left, right) => left.localeCompare(right, "en"))
|
|
25
|
+
.map((file) => readStyle(dir, file));
|
|
26
|
+
if (dir === STYLES_DIR) loaded.value = styles;
|
|
27
|
+
return styles;
|
|
28
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { isLevel } from "./levels.ts";
|
|
2
|
+
import type { Level, Localized } from "./plugin.ts";
|
|
3
|
+
|
|
4
|
+
// A house style (styles/*.yaml): a well-known guideline a team picks with style: in chaff.yaml. It sets rule levels and
|
|
5
|
+
// options, and says where they come from. Pure: the YAML comes in already parsed.
|
|
6
|
+
|
|
7
|
+
export type StyleSource = { readonly title: Localized; readonly url: string };
|
|
8
|
+
|
|
9
|
+
export type StyleDefinition = {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly name: Localized;
|
|
12
|
+
/** What the style decides, in one or two plain sentences. */
|
|
13
|
+
readonly summary: Localized;
|
|
14
|
+
/** The guideline the style follows, so a reader can check it. */
|
|
15
|
+
readonly source: StyleSource;
|
|
16
|
+
readonly rules: Readonly<Record<string, Level>>;
|
|
17
|
+
/** { rule id: { option: value } }, checked against the rules' declared options by the tests. */
|
|
18
|
+
readonly options: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
22
|
+
|
|
23
|
+
const isLocalized = (value: unknown): value is Localized =>
|
|
24
|
+
isRecord(value) && typeof value["ja"] === "string" && typeof value["en"] === "string" && value["ja"] !== "" && value["en"] !== "";
|
|
25
|
+
|
|
26
|
+
const localizedOf = (value: unknown, field: string, where: string): Localized => {
|
|
27
|
+
if (!isLocalized(value)) throw new Error(`${where}: ${field} needs a ja and an en text`);
|
|
28
|
+
return value;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const sourceOf = (value: unknown, where: string): StyleSource => {
|
|
32
|
+
if (!isRecord(value)) throw new Error(`${where}: source needs a title and a url`);
|
|
33
|
+
const url = value["url"];
|
|
34
|
+
if (typeof url !== "string" || !url.startsWith("https://")) throw new Error(`${where}: source.url must be an https:// address`);
|
|
35
|
+
return { title: localizedOf(value["title"], "source.title", where), url };
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const levelsOf = (value: unknown, where: string): Record<string, Level> => {
|
|
39
|
+
if (value === undefined) return {};
|
|
40
|
+
if (!isRecord(value)) throw new Error(`${where}: rules must be a map of rule ids to levels`);
|
|
41
|
+
return Object.fromEntries(
|
|
42
|
+
Object.entries(value).map(([id, level]) => {
|
|
43
|
+
if (!isLevel(level)) throw new Error(`${where}: ${id} has the level ${String(level)}; use strict, normal, relaxed or off`);
|
|
44
|
+
return [id, level];
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const optionsOf = (value: unknown, where: string): Record<string, Readonly<Record<string, unknown>>> => {
|
|
50
|
+
if (value === undefined) return {};
|
|
51
|
+
if (!isRecord(value)) throw new Error(`${where}: options must be a map of rule ids`);
|
|
52
|
+
return Object.fromEntries(
|
|
53
|
+
Object.entries(value).map(([id, options]) => {
|
|
54
|
+
if (!isRecord(options)) throw new Error(`${where}: options.${id} must be a map of option names to values`);
|
|
55
|
+
return [id, options];
|
|
56
|
+
}),
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/** One style file. Throws on anything it cannot read: the file ships with chaff, so a wrong entry is chaff's bug. */
|
|
61
|
+
export const parseStyle = (raw: unknown, file: string): StyleDefinition => {
|
|
62
|
+
if (!isRecord(raw)) throw new Error(`${file}: a style must be a map`);
|
|
63
|
+
const id = raw["id"];
|
|
64
|
+
if (typeof id !== "string" || `${id}.yaml` !== file) throw new Error(`${file}: id must be the file's name without .yaml`);
|
|
65
|
+
const where = `${file}`;
|
|
66
|
+
const rules = levelsOf(raw["rules"], where);
|
|
67
|
+
const options = optionsOf(raw["options"], where);
|
|
68
|
+
if (Object.keys(rules).length === 0 && Object.keys(options).length === 0) throw new Error(`${where}: a style must set rules or options`);
|
|
69
|
+
return {
|
|
70
|
+
id,
|
|
71
|
+
name: localizedOf(raw["name"], "name", where),
|
|
72
|
+
summary: localizedOf(raw["summary"], "summary", where),
|
|
73
|
+
source: sourceOf(raw["source"], where),
|
|
74
|
+
rules,
|
|
75
|
+
options,
|
|
76
|
+
};
|
|
77
|
+
};
|