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
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { bareUrls } from "../bare-url.js";
|
|
2
|
+
import { linkChrome } from "../document.js";
|
|
3
|
+
import { opaqueSpans } from "../markdown-read.js";
|
|
4
|
+
import { spanOf } from "../markdown-node.js";
|
|
5
|
+
import { maskSpans } from "../mask.js";
|
|
6
|
+
import { eachPreOrder } from "../tree-walk.js";
|
|
7
|
+
import { overlapsAny, spanIndex } from "./spans.js";
|
|
8
|
+
/** Nodes whose whole span is not read as prose: a link reference definition's URL is read as a URL, an image is not text. */
|
|
9
|
+
const WHOLE = new Set(["definition", "image", "imageReference"]);
|
|
10
|
+
const LINKS = new Set(["link", "linkReference"]);
|
|
11
|
+
/** `1.` or `1)` at the start of an ordered list item. */
|
|
12
|
+
const ORDERED_MARKER = /^\s*\d{1,9}[.)]/u;
|
|
13
|
+
const listMarker = (node, source) => {
|
|
14
|
+
const span = spanOf(node);
|
|
15
|
+
if (node.type !== "listItem" || span === undefined)
|
|
16
|
+
return [];
|
|
17
|
+
const marker = ORDERED_MARKER.exec(source.slice(span.start, span.end));
|
|
18
|
+
return marker === null ? [] : [{ start: span.start, end: span.start + marker[0].length }];
|
|
19
|
+
};
|
|
20
|
+
const markdownParts = (root, source) => {
|
|
21
|
+
const parts = { chrome: [], linkSpans: [], listMarkers: [] };
|
|
22
|
+
eachPreOrder(root, (node) => {
|
|
23
|
+
const span = spanOf(node);
|
|
24
|
+
if (span === undefined)
|
|
25
|
+
return;
|
|
26
|
+
if (WHOLE.has(node.type))
|
|
27
|
+
parts.chrome.push(span);
|
|
28
|
+
if (LINKS.has(node.type)) {
|
|
29
|
+
parts.chrome.push(...linkChrome(node));
|
|
30
|
+
parts.linkSpans.push(span);
|
|
31
|
+
}
|
|
32
|
+
parts.listMarkers.push(...listMarker(node, source));
|
|
33
|
+
});
|
|
34
|
+
return parts;
|
|
35
|
+
};
|
|
36
|
+
/** root is the Markdown tree, or undefined for a plain-text document, where nothing is code and URLs are bare. */
|
|
37
|
+
export const factTextOf = (source, root) => {
|
|
38
|
+
const code = root === undefined ? [] : opaqueSpans(root);
|
|
39
|
+
const codeless = maskSpans(source, code);
|
|
40
|
+
const parts = root === undefined ? { chrome: [], linkSpans: [], listMarkers: [] } : markdownParts(root, source);
|
|
41
|
+
const insideLinks = spanIndex(parts.linkSpans);
|
|
42
|
+
// An autolink's text is its URL: it is read once, as the link.
|
|
43
|
+
const bare = bareUrls(codeless).filter((url) => !overlapsAny(insideLinks, url));
|
|
44
|
+
const blanked = [...code, ...parts.chrome, ...bare];
|
|
45
|
+
return { text: maskSpans(source, blanked), codeless, blanked: spanIndex(blanked), bareUrls: bare, listMarkers: parts.listMarkers };
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=fact-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fact-text.js","sourceRoot":"","sources":["../../src/compare/fact-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type MarkdownNode } from "../markdown-node.ts";
|
|
2
|
+
import type { Markup } from "../plugin.ts";
|
|
3
|
+
import type { BareUrl } from "../bare-url.ts";
|
|
4
|
+
import type { Atom } from "./atom.ts";
|
|
5
|
+
/** Inline code and code blocks, compared as written: the key is the code itself, without its backticks or fences. */
|
|
6
|
+
export declare const codeAtoms: (root: MarkdownNode, lineOf: (offset: number) => number) => Atom[];
|
|
7
|
+
/** Where links point (a Markdown link, an autolink, a used reference definition) and URLs written bare. */
|
|
8
|
+
export declare const urlAtoms: (markup: Markup | undefined, bare: readonly BareUrl[], lineOf: (offset: number) => number) => Atom[];
|
|
9
|
+
/** Markdown headings as structure: the key is the level, so a reworded heading is the same heading in another form. */
|
|
10
|
+
export declare const headingAtoms: (markup: Markup | undefined, lineOf: (offset: number) => number) => Atom[];
|
|
11
|
+
//# sourceMappingURL=markup-atoms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup-atoms.d.ts","sourceRoot":"","sources":["../../src/compare/markup-atoms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAItC,qHAAqH;AACrH,eAAO,MAAM,SAAS,GAAI,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,KAAG,IAAI,EAStF,CAAC;AAEF,2GAA2G;AAC3G,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,SAAS,OAAO,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,KAAG,IAAI,EAGvH,CAAC;AAEF,uHAAuH;AACvH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,KAAG,IAAI,EACiD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { spanOf } from "../markdown-node.js";
|
|
2
|
+
import { eachPreOrder } from "../tree-walk.js";
|
|
3
|
+
const CODE = new Set(["code", "inlineCode"]);
|
|
4
|
+
/** Inline code and code blocks, compared as written: the key is the code itself, without its backticks or fences. */
|
|
5
|
+
export const codeAtoms = (root, lineOf) => {
|
|
6
|
+
const found = [];
|
|
7
|
+
eachPreOrder(root, (node) => {
|
|
8
|
+
const span = spanOf(node);
|
|
9
|
+
if (!CODE.has(node.type) || span === undefined)
|
|
10
|
+
return;
|
|
11
|
+
const code = node.value ?? "";
|
|
12
|
+
found.push({ kind: "code", key: code, text: code, line: lineOf(span.start) });
|
|
13
|
+
});
|
|
14
|
+
return found;
|
|
15
|
+
};
|
|
16
|
+
/** Where links point (a Markdown link, an autolink, a used reference definition) and URLs written bare. */
|
|
17
|
+
export const urlAtoms = (markup, bare, lineOf) => [
|
|
18
|
+
...(markup?.links ?? []).map((link) => ({ kind: "url", key: link.destination, text: link.destination, line: lineOf(link.start) })),
|
|
19
|
+
...bare.map((url) => ({ kind: "url", key: url.url, text: url.url, line: lineOf(url.start) })),
|
|
20
|
+
];
|
|
21
|
+
/** Markdown headings as structure: the key is the level, so a reworded heading is the same heading in another form. */
|
|
22
|
+
export const headingAtoms = (markup, lineOf) => (markup?.headings ?? []).map((heading) => ({ kind: "heading", key: "#".repeat(heading.depth), text: heading.text, line: lineOf(heading.start) }));
|
|
23
|
+
//# sourceMappingURL=markup-atoms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup-atoms.js","sourceRoot":"","sources":["../../src/compare/markup-atoms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7C,qHAAqH;AACrH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAkB,EAAE,MAAkC,EAAU,EAAE;IAC1F,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAA0B,EAAE,IAAwB,EAAE,MAAkC,EAAU,EAAE,CAAC;IAC5H,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3I,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;CACvG,CAAC;AAEF,uHAAuH;AACvH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAA0B,EAAE,MAAkC,EAAU,EAAE,CACrG,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Atom } from "./atom.ts";
|
|
2
|
+
/** The same fact written another way: 1,000円 and 1000円, 2026年4月1日 and 2026/4/1, a reworded heading. */
|
|
3
|
+
export type Reformed = {
|
|
4
|
+
readonly before: Atom;
|
|
5
|
+
readonly after: Atom;
|
|
6
|
+
};
|
|
7
|
+
export type Comparison = {
|
|
8
|
+
/** In the first document and not in the second. */
|
|
9
|
+
readonly dropped: readonly Atom[];
|
|
10
|
+
/** In the second document and not in the first. */
|
|
11
|
+
readonly added: readonly Atom[];
|
|
12
|
+
readonly reformed: readonly Reformed[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The facts of two documents compared as multisets: where a fact is written does not matter, how many times it is
|
|
16
|
+
* stated does. Pure: the same atoms always give the same comparison.
|
|
17
|
+
*/
|
|
18
|
+
export declare const compareAtoms: (before: readonly Atom[], after: readonly Atom[]) => Comparison;
|
|
19
|
+
//# sourceMappingURL=match.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../src/compare/match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,uGAAuG;AACvG,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,UAAU,GAAG;IACvB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAClC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;CACxC,CAAC;AA0EF;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,SAAS,IAAI,EAAE,EAAE,OAAO,SAAS,IAAI,EAAE,KAAG,UAe9E,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const identity = (atom) => `${atom.kind}\u0000${atom.key}`;
|
|
2
|
+
const groupBy = (items, keyOf) => {
|
|
3
|
+
const groups = new Map();
|
|
4
|
+
items.forEach((item) => {
|
|
5
|
+
const key = keyOf(item);
|
|
6
|
+
const group = groups.get(key);
|
|
7
|
+
if (group === undefined)
|
|
8
|
+
groups.set(key, [item]);
|
|
9
|
+
else
|
|
10
|
+
group.push(item);
|
|
11
|
+
});
|
|
12
|
+
return groups;
|
|
13
|
+
};
|
|
14
|
+
const queuesOf = (items, keyOf) => ({ groups: groupBy(items, keyOf), taken: new Map() });
|
|
15
|
+
/** The next item not yet taken under key. A cursor, not shift(): shift moves every item left, which is quadratic over a long queue. */
|
|
16
|
+
const takeFrom = (queues, key) => {
|
|
17
|
+
const next = queues.taken.get(key) ?? 0;
|
|
18
|
+
const item = queues.groups.get(key)?.[next];
|
|
19
|
+
if (item !== undefined)
|
|
20
|
+
queues.taken.set(key, next + 1);
|
|
21
|
+
return item;
|
|
22
|
+
};
|
|
23
|
+
/** Atoms of one fact: written the same way they need no report; written differently they pair as reformed; the rest are surplus. */
|
|
24
|
+
const matchGroup = (before, after) => {
|
|
25
|
+
const afterByText = queuesOf(after, (atom) => atom.text);
|
|
26
|
+
const sameText = new Set();
|
|
27
|
+
const unmatchedBefore = before.filter((atom) => {
|
|
28
|
+
const twin = takeFrom(afterByText, atom.text);
|
|
29
|
+
if (twin !== undefined)
|
|
30
|
+
sameText.add(twin);
|
|
31
|
+
return twin === undefined;
|
|
32
|
+
});
|
|
33
|
+
const unmatchedAfter = after.filter((atom) => !sameText.has(atom));
|
|
34
|
+
const pairs = Math.min(unmatchedBefore.length, unmatchedAfter.length);
|
|
35
|
+
return {
|
|
36
|
+
reformed: unmatchedBefore.slice(0, pairs).map((atom, index) => ({ before: atom, after: unmatchedAfter[index] ?? atom })),
|
|
37
|
+
dropped: unmatchedBefore.slice(pairs),
|
|
38
|
+
added: unmatchedAfter.slice(pairs),
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
const unitQueue = (value, unitless) => `${value ?? ""}\u0000${unitless ? "bare" : "unit"}`;
|
|
42
|
+
/**
|
|
43
|
+
* A number one side wrote with a unit the language package read (30 GB) and the other wrote so the unit was not read
|
|
44
|
+
* (30GB) is one number in another form. Two different units (5 件, 5 人) stay a dropped and an added fact.
|
|
45
|
+
*/
|
|
46
|
+
const pairUnits = (comparison) => {
|
|
47
|
+
const addedNumbers = queuesOf(comparison.added.filter((atom) => atom.kind === "number"), (atom) => unitQueue(atom.value, atom.unitless === true));
|
|
48
|
+
const paired = new Set();
|
|
49
|
+
const reformed = comparison.dropped.flatMap((atom) => {
|
|
50
|
+
// Two unitless numbers of one value share a key and were already paired; only the other side's kind can match.
|
|
51
|
+
const found = atom.kind === "number" ? takeFrom(addedNumbers, unitQueue(atom.value, atom.unitless !== true)) : undefined;
|
|
52
|
+
if (found === undefined)
|
|
53
|
+
return [];
|
|
54
|
+
paired.add(atom).add(found);
|
|
55
|
+
return [{ before: atom, after: found }];
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
dropped: comparison.dropped.filter((atom) => !paired.has(atom)),
|
|
59
|
+
added: comparison.added.filter((atom) => !paired.has(atom)),
|
|
60
|
+
reformed: [...comparison.reformed, ...reformed],
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const byLine = (left, right) => left.line - right.line;
|
|
64
|
+
/**
|
|
65
|
+
* The facts of two documents compared as multisets: where a fact is written does not matter, how many times it is
|
|
66
|
+
* stated does. Pure: the same atoms always give the same comparison.
|
|
67
|
+
*/
|
|
68
|
+
export const compareAtoms = (before, after) => {
|
|
69
|
+
const beforeGroups = groupBy(before, identity);
|
|
70
|
+
const afterGroups = groupBy(after, identity);
|
|
71
|
+
const keys = [...new Set([...beforeGroups.keys(), ...afterGroups.keys()])];
|
|
72
|
+
const groups = keys.map((key) => matchGroup(beforeGroups.get(key) ?? [], afterGroups.get(key) ?? []));
|
|
73
|
+
const paired = pairUnits({
|
|
74
|
+
dropped: groups.flatMap((group) => group.dropped),
|
|
75
|
+
added: groups.flatMap((group) => group.added),
|
|
76
|
+
reformed: groups.flatMap((group) => group.reformed),
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
dropped: paired.dropped.toSorted(byLine),
|
|
80
|
+
added: paired.added.toSorted(byLine),
|
|
81
|
+
reformed: paired.reformed.toSorted((left, right) => byLine(left.before, right.before)),
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/compare/match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type Atom, type AtomKind, type Extraction, type Unread } from "./atom.ts";
|
|
2
|
+
import { type Reformed } from "./match.ts";
|
|
3
|
+
/** One document as compared: where it is, how many facts of each kind it states, and what could not be read. */
|
|
4
|
+
export type Side = {
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly counts: Readonly<Record<AtomKind, number>>;
|
|
7
|
+
readonly unread: readonly Unread[];
|
|
8
|
+
};
|
|
9
|
+
/** A dropped or added fact, and whether the command line allowed its kind to change. */
|
|
10
|
+
export type Change = Atom & {
|
|
11
|
+
readonly allowed: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type Outcome = {
|
|
14
|
+
readonly before: Side;
|
|
15
|
+
readonly after: Side;
|
|
16
|
+
readonly dropped: readonly Change[];
|
|
17
|
+
readonly added: readonly Change[];
|
|
18
|
+
readonly reformed: readonly Reformed[];
|
|
19
|
+
/** No fact dropped or added, other than of a kind allowed to be. */
|
|
20
|
+
readonly ok: boolean;
|
|
21
|
+
};
|
|
22
|
+
/** Kinds whose facts may be dropped or added on purpose (--allow-dropped, --allow-added). */
|
|
23
|
+
export type Allowed = {
|
|
24
|
+
readonly dropped: ReadonlySet<AtomKind>;
|
|
25
|
+
readonly added: ReadonlySet<AtomKind>;
|
|
26
|
+
};
|
|
27
|
+
export type Compared = {
|
|
28
|
+
readonly path: string;
|
|
29
|
+
readonly extraction: Extraction;
|
|
30
|
+
};
|
|
31
|
+
/** What `chaff compare` reports: the comparison of two documents' facts, with the allowed kinds set aside. */
|
|
32
|
+
export declare const outcomeOf: (before: Compared, after: Compared, allowed?: Allowed) => Outcome;
|
|
33
|
+
//# sourceMappingURL=outcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../src/compare/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGzD,gHAAgH;AAChH,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEF,wFAAwF;AACxF,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAC;IACvC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,6FAA6F;AAC7F,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;CAAE,CAAC;AA6BzG,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAElF,8GAA8G;AAC9G,eAAO,MAAM,SAAS,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,EAAE,UAAS,OAAyB,KAAG,OAYjG,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {} from "./atom.js";
|
|
2
|
+
import { compareAtoms } from "./match.js";
|
|
3
|
+
import { unwrittenNames } from "./written-names.js";
|
|
4
|
+
const NOTHING_ALLOWED = { dropped: new Set(), added: new Set() };
|
|
5
|
+
const NO_FACTS = {
|
|
6
|
+
number: 0,
|
|
7
|
+
date: 0,
|
|
8
|
+
time: 0,
|
|
9
|
+
url: 0,
|
|
10
|
+
code: 0,
|
|
11
|
+
name: 0,
|
|
12
|
+
quote: 0,
|
|
13
|
+
heading: 0,
|
|
14
|
+
reference: 0,
|
|
15
|
+
footnote: 0,
|
|
16
|
+
};
|
|
17
|
+
const countsOf = (atoms) => {
|
|
18
|
+
const counts = { ...NO_FACTS };
|
|
19
|
+
atoms.forEach((atom) => {
|
|
20
|
+
counts[atom.kind] += 1;
|
|
21
|
+
});
|
|
22
|
+
return counts;
|
|
23
|
+
};
|
|
24
|
+
const sideOf = (path, extraction) => ({ path, counts: countsOf(extraction.atoms), unread: extraction.unread });
|
|
25
|
+
const marked = (atoms, allowed) => atoms.map((atom) => ({ ...atom, allowed: allowed.has(atom.kind) }));
|
|
26
|
+
/** What `chaff compare` reports: the comparison of two documents' facts, with the allowed kinds set aside. */
|
|
27
|
+
export const outcomeOf = (before, after, allowed = NOTHING_ALLOWED) => {
|
|
28
|
+
const comparison = compareAtoms(before.extraction.atoms, after.extraction.atoms);
|
|
29
|
+
const dropped = marked(unwrittenNames(comparison.dropped, before.extraction.atoms, after.extraction.nameText), allowed.dropped);
|
|
30
|
+
const added = marked(unwrittenNames(comparison.added, after.extraction.atoms, before.extraction.nameText), allowed.added);
|
|
31
|
+
return {
|
|
32
|
+
before: sideOf(before.path, before.extraction),
|
|
33
|
+
after: sideOf(after.path, after.extraction),
|
|
34
|
+
dropped,
|
|
35
|
+
added,
|
|
36
|
+
reformed: comparison.reformed,
|
|
37
|
+
ok: [...dropped, ...added].every((change) => change.allowed),
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../src/compare/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,MAAM,WAAW,CAAC;AACnF,OAAO,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAyBpD,MAAM,eAAe,GAAY,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAE1E,MAAM,QAAQ,GAAuC;IACnD,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAA4B,EAAE;IACpE,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC/B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,UAAsB,EAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AAEzI,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAE,OAA8B,EAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAIzJ,8GAA8G;AAC9G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAE,KAAe,EAAE,UAAmB,eAAe,EAAW,EAAE;IAC1G,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChI,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1H,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;QAC9C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC;QAC3C,OAAO;QACP,KAAK;QACL,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,EAAE,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;KAC7D,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProseDocument } from "../plugin.ts";
|
|
2
|
+
import type { Atom } from "./atom.ts";
|
|
3
|
+
import { type SpanIndex } from "./spans.ts";
|
|
4
|
+
export type NounInput = {
|
|
5
|
+
readonly doc: ProseDocument;
|
|
6
|
+
/** Facts other readers took and what is not prose: a proper noun inside one is read as that, not again here. */
|
|
7
|
+
readonly taken: SpanIndex;
|
|
8
|
+
readonly lineOf: (offset: number) => number;
|
|
9
|
+
};
|
|
10
|
+
/** A name as one spelling: full-width letters and line breaks inside a name do not make another name. */
|
|
11
|
+
export declare const nameKey: (written: string) => string;
|
|
12
|
+
/** Whether the language package tagged parts of speech: without them, a document with sentences has no proper nouns to read. */
|
|
13
|
+
export declare const readsProperNouns: (doc: ProseDocument) => boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Proper nouns as the part-of-speech tagger reads them in sentences. Headings are left out: they are compared as
|
|
16
|
+
* headings, may be reworded, and a title-case heading makes every word look like a name.
|
|
17
|
+
*/
|
|
18
|
+
export declare const properNouns: (input: NounInput) => Atom[];
|
|
19
|
+
//# sourceMappingURL=proper-nouns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proper-nouns.d.ts","sourceRoot":"","sources":["../../src/compare/proper-nouns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAmCzD,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,gHAAgH;IAChH,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,MAAyD,CAAC;AAEpG,gIAAgI;AAChI,eAAO,MAAM,gBAAgB,GAAI,KAAK,aAAa,KAAG,OAAwG,CAAC;AAE/J;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,SAAS,KAAG,IAAI,EAUlD,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { overlapsAny } from "./spans.js";
|
|
2
|
+
const PROPER_NOUN = "PROPN";
|
|
3
|
+
/** Two proper nouns with at most one space between them are one name: New York, 日本 銀行. */
|
|
4
|
+
const MAX_GAP = 1;
|
|
5
|
+
const joins = (run, token, text) => run !== undefined && token.span.start - run.end <= MAX_GAP && text.slice(run.end, token.span.start).trim() === "";
|
|
6
|
+
/** Adjacent proper nouns, each run one name. */
|
|
7
|
+
const runsOf = (tokens, text) => tokens.reduce((runs, token) => {
|
|
8
|
+
if (token.pos !== PROPER_NOUN)
|
|
9
|
+
return runs;
|
|
10
|
+
const last = runs.at(-1);
|
|
11
|
+
if (joins(last, token, text))
|
|
12
|
+
runs[runs.length - 1] = { start: last.start, end: token.span.end, words: last.words + 1 };
|
|
13
|
+
else
|
|
14
|
+
runs.push({ start: token.span.start, end: token.span.end, words: 1 });
|
|
15
|
+
return runs;
|
|
16
|
+
}, []);
|
|
17
|
+
/** Words written in lower case. A capitalised word the same document also writes this way is a common word that began a sentence. */
|
|
18
|
+
const LOWER_CASE_WORD = /(?<![\p{L}\p{M}])\p{Ll}[\p{L}\p{M}]*/gu;
|
|
19
|
+
const lowerCaseWords = (source) => new Set(source.match(LOWER_CASE_WORD) ?? []);
|
|
20
|
+
const withLowerFirst = (word) => `${word.charAt(0).toLowerCase()}${word.slice(1)}`;
|
|
21
|
+
/** A one-word name the document also writes in lower case ("Scammers" opening a sentence, "scammers" elsewhere). */
|
|
22
|
+
const isCommonWord = (run, written, lowerCase) => {
|
|
23
|
+
const lowered = withLowerFirst(written);
|
|
24
|
+
return run.words === 1 && lowered !== written && lowerCase.has(lowered);
|
|
25
|
+
};
|
|
26
|
+
/** A name as one spelling: full-width letters and line breaks inside a name do not make another name. */
|
|
27
|
+
export const nameKey = (written) => written.normalize("NFKC").replace(/\s+/gu, " ");
|
|
28
|
+
/** Whether the language package tagged parts of speech: without them, a document with sentences has no proper nouns to read. */
|
|
29
|
+
export const readsProperNouns = (doc) => doc.sentences.length === 0 || doc.sentences.some((sentence) => sentence.tokens !== undefined);
|
|
30
|
+
/**
|
|
31
|
+
* Proper nouns as the part-of-speech tagger reads them in sentences. Headings are left out: they are compared as
|
|
32
|
+
* headings, may be reworded, and a title-case heading makes every word look like a name.
|
|
33
|
+
*/
|
|
34
|
+
export const properNouns = (input) => {
|
|
35
|
+
const { source } = input.doc;
|
|
36
|
+
const lowerCase = lowerCaseWords(source);
|
|
37
|
+
return input.doc.sentences.flatMap((sentence) => runsOf(sentence.tokens ?? [], source).flatMap((run) => {
|
|
38
|
+
const text = source.slice(run.start, run.end);
|
|
39
|
+
if (overlapsAny(input.taken, run) || isCommonWord(run, text, lowerCase))
|
|
40
|
+
return [];
|
|
41
|
+
return [{ kind: "name", key: nameKey(text), text, line: input.lineOf(run.start) }];
|
|
42
|
+
}));
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=proper-nouns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proper-nouns.js","sourceRoot":"","sources":["../../src/compare/proper-nouns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Outcome } from "./outcome.ts";
|
|
2
|
+
import type { CompareText } from "./text.ts";
|
|
3
|
+
/** For a person: what was dropped and added, with the line in each file, then what only changed its form. */
|
|
4
|
+
export declare const renderFriendly: (outcome: Outcome, text: CompareText) => string;
|
|
5
|
+
/** For an engineer and grep: one line per fact, the words dropped / added / reformed and the kind in English. */
|
|
6
|
+
export declare const renderCompact: (outcome: Outcome, text: CompareText) => string;
|
|
7
|
+
/** For an AI to act on: every dropped and added fact with its line, the reformed pairs, and the counts per kind. */
|
|
8
|
+
export declare const renderJson: (outcome: Outcome) => string;
|
|
9
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/compare/render.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAU,OAAO,EAAQ,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAuC7C,6GAA6G;AAC7G,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,EAAE,MAAM,WAAW,KAAG,MAqBpE,CAAC;AAKF,iHAAiH;AACjH,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,EAAE,MAAM,WAAW,KAAG,MAcnE,CAAC;AAIF,oHAAoH;AACpH,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,KAAG,MAY3C,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ATOM_KINDS } from "./atom.js";
|
|
2
|
+
/** How much of a fact is shown: a code block is shown by its first line. */
|
|
3
|
+
const SHOWN_WIDTH = 60;
|
|
4
|
+
/** One line of a fact as written: a code block or a wrapped quotation is shown on one line, cut at SHOWN_WIDTH. */
|
|
5
|
+
const shown = (text) => {
|
|
6
|
+
const oneLine = text.replace(/\s+/gu, " ").trim();
|
|
7
|
+
return oneLine.length > SHOWN_WIDTH ? `${oneLine.slice(0, SHOWN_WIDTH)}…` : oneLine;
|
|
8
|
+
};
|
|
9
|
+
const totalOf = (side) => ATOM_KINDS.reduce((sum, kind) => sum + side.counts[kind], 0);
|
|
10
|
+
/** The count line. Every kind is listed, zeros too: "nothing dropped" reads as N facts checked, never as nothing looked at. */
|
|
11
|
+
const checkedLine = (outcome, text) => {
|
|
12
|
+
const perKind = ATOM_KINDS.map((kind) => `${text.kinds[kind]} ${String(outcome.before.counts[kind])}→${String(outcome.after.counts[kind])}`);
|
|
13
|
+
return text.checked(totalOf(outcome.before), totalOf(outcome.after), perKind.join(text.separator));
|
|
14
|
+
};
|
|
15
|
+
const failing = (changes) => changes.filter((change) => !change.allowed).length;
|
|
16
|
+
const verdict = (outcome, text) => (outcome.ok ? text.clean : text.failed(failing(outcome.dropped), failing(outcome.added)));
|
|
17
|
+
const kindColumn = (kind, text) => `${text.kind[kind]}: `;
|
|
18
|
+
const changeLine = (change, path, flag, text) => ` ${kindColumn(change.kind, text)}${shown(change.text)} (${path}:${String(change.line)})${change.allowed ? text.allowed(flag) : ""}`;
|
|
19
|
+
const reformedLine = (pair, text) => ` ${kindColumn(pair.before.kind, text)}${shown(pair.before.text)} → ${shown(pair.after.text)} (${text.lines(pair.before.line, pair.after.line)})`;
|
|
20
|
+
const block = (heading, lines) => (lines.length === 0 ? [] : ["", heading, ...lines]);
|
|
21
|
+
const unreadBlock = (outcome, text) => {
|
|
22
|
+
const sides = [outcome.before, outcome.after];
|
|
23
|
+
const lines = sides.flatMap((side) => side.unread.map((unread) => ` ${side.path}: ${text.unread(unread.kind, unread.reason)}`));
|
|
24
|
+
return block(text.unreadHeading, lines);
|
|
25
|
+
};
|
|
26
|
+
/** For a person: what was dropped and added, with the line in each file, then what only changed its form. */
|
|
27
|
+
export const renderFriendly = (outcome, text) => {
|
|
28
|
+
const { before, after } = outcome;
|
|
29
|
+
return [
|
|
30
|
+
`${before.path} → ${after.path}`,
|
|
31
|
+
...block(text.droppedHeading(outcome.dropped.length, before.path, after.path), outcome.dropped.map((change) => changeLine(change, before.path, "--allow-dropped", text))),
|
|
32
|
+
...block(text.addedHeading(outcome.added.length, after.path), outcome.added.map((change) => changeLine(change, after.path, "--allow-added", text))),
|
|
33
|
+
...block(text.reformedHeading(outcome.reformed.length), outcome.reformed.map((pair) => reformedLine(pair, text))),
|
|
34
|
+
...unreadBlock(outcome, text),
|
|
35
|
+
"",
|
|
36
|
+
checkedLine(outcome, text),
|
|
37
|
+
verdict(outcome, text),
|
|
38
|
+
].join("\n");
|
|
39
|
+
};
|
|
40
|
+
const compactChange = (change, path, word) => `${path}:${String(change.line)}: ${word} ${change.kind} ${shown(change.text)}${change.allowed ? " (allowed)" : ""}`;
|
|
41
|
+
/** For an engineer and grep: one line per fact, the words dropped / added / reformed and the kind in English. */
|
|
42
|
+
export const renderCompact = (outcome, text) => {
|
|
43
|
+
const { before, after } = outcome;
|
|
44
|
+
return [
|
|
45
|
+
...outcome.dropped.map((change) => compactChange(change, before.path, "dropped")),
|
|
46
|
+
...outcome.added.map((change) => compactChange(change, after.path, "added")),
|
|
47
|
+
...outcome.reformed.map((pair) => `${before.path}:${String(pair.before.line)} → ${after.path}:${String(pair.after.line)}: reformed ${pair.before.kind} ${shown(pair.before.text)} → ${shown(pair.after.text)}`),
|
|
48
|
+
...before.unread.map((unread) => `${before.path}: unread ${unread.kind} (${unread.reason})`),
|
|
49
|
+
...after.unread.map((unread) => `${after.path}: unread ${unread.kind} (${unread.reason})`),
|
|
50
|
+
checkedLine(outcome, text),
|
|
51
|
+
text.tally(failing(outcome.dropped), failing(outcome.added), outcome.reformed.length),
|
|
52
|
+
].join("\n");
|
|
53
|
+
};
|
|
54
|
+
const atomJson = (atom) => ({ kind: atom.kind, key: atom.key, text: atom.text, line: atom.line });
|
|
55
|
+
/** For an AI to act on: every dropped and added fact with its line, the reformed pairs, and the counts per kind. */
|
|
56
|
+
export const renderJson = (outcome) => JSON.stringify({
|
|
57
|
+
ok: outcome.ok,
|
|
58
|
+
before: outcome.before,
|
|
59
|
+
after: outcome.after,
|
|
60
|
+
dropped: outcome.dropped.map((change) => ({ ...atomJson(change), allowed: change.allowed })),
|
|
61
|
+
added: outcome.added.map((change) => ({ ...atomJson(change), allowed: change.allowed })),
|
|
62
|
+
reformed: outcome.reformed.map((pair) => ({ kind: pair.before.kind, key: pair.before.key, before: atomJson(pair.before), after: atomJson(pair.after) })),
|
|
63
|
+
}, null, 2);
|
|
64
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/compare/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Span } from "../plugin.ts";
|
|
2
|
+
/** Spans made ready for lookups: sorted and merged, so each lookup is a binary search, not a scan of every span. */
|
|
3
|
+
export type SpanIndex = readonly Span[];
|
|
4
|
+
export declare const spanIndex: (spans: readonly Span[]) => SpanIndex;
|
|
5
|
+
/** Whether span shares at least one character with a span in the index. */
|
|
6
|
+
export declare const overlapsAny: (index: SpanIndex, span: Span) => boolean;
|
|
7
|
+
/** Whether the character at offset is inside a span in the index. */
|
|
8
|
+
export declare const coversOffset: (index: SpanIndex, offset: number) => boolean;
|
|
9
|
+
//# sourceMappingURL=spans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../../src/compare/spans.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAIzC,oHAAoH;AACpH,MAAM,MAAM,SAAS,GAAG,SAAS,IAAI,EAAE,CAAC;AAExC,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,IAAI,EAAE,KAAG,SAAqC,CAAC;AAEzF,2EAA2E;AAC3E,eAAO,MAAM,WAAW,GAAI,OAAO,SAAS,EAAE,MAAM,IAAI,KAAG,OAG1D,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,YAAY,GAAI,OAAO,SAAS,EAAE,QAAQ,MAAM,KAAG,OAAiE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { firstEndingAfter } from "../soft-break.js";
|
|
2
|
+
import { mergeSpans } from "../span-merge.js";
|
|
3
|
+
export const spanIndex = (spans) => mergeSpans(spans, false);
|
|
4
|
+
/** Whether span shares at least one character with a span in the index. */
|
|
5
|
+
export const overlapsAny = (index, span) => {
|
|
6
|
+
const region = index[firstEndingAfter(index, span.start)];
|
|
7
|
+
return region !== undefined && region.start < span.end;
|
|
8
|
+
};
|
|
9
|
+
/** Whether the character at offset is inside a span in the index. */
|
|
10
|
+
export const coversOffset = (index, offset) => overlapsAny(index, { start: offset, end: offset + 1 });
|
|
11
|
+
//# sourceMappingURL=spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.js","sourceRoot":"","sources":["../../src/compare/spans.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAsB,EAAa,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAEzF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,IAAU,EAAW,EAAE;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;AACzD,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAgB,EAAE,MAAc,EAAW,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Span } from "../plugin.ts";
|
|
2
|
+
import type { Atom } from "./atom.ts";
|
|
3
|
+
import { type SpanIndex } from "./spans.ts";
|
|
4
|
+
/** Where a reader looks, and how it says where it found something. */
|
|
5
|
+
export type TextInput = {
|
|
6
|
+
readonly text: string;
|
|
7
|
+
readonly source: string;
|
|
8
|
+
readonly lineOf: (offset: number) => number;
|
|
9
|
+
};
|
|
10
|
+
/** A fact found in the text: where it is and its key. */
|
|
11
|
+
export type Found = Span & {
|
|
12
|
+
readonly key: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const atomsOf: (found: readonly Found[], kind: Atom["kind"], input: TextInput) => Atom[];
|
|
15
|
+
/** Dates written in figures only, where the language's date reader did not already read a date. */
|
|
16
|
+
export declare const numericDates: (text: string, taken: SpanIndex) => Found[];
|
|
17
|
+
export declare const footnotes: (text: string) => Found[];
|
|
18
|
+
/** Numbers no other reader took: written with no unit the language package knows, or with none at all. */
|
|
19
|
+
export declare const bareNumbers: (input: TextInput, taken: SpanIndex) => Atom[];
|
|
20
|
+
/** Quoted strings: 「」『』, “” and "". The key is what is inside; the marks are how it is written. */
|
|
21
|
+
export declare const quotations: (input: TextInput) => Atom[];
|
|
22
|
+
/** The team's own names (chaff.yaml's `names:`), wherever they are written. Longer names first: "Acme Cloud" before "Acme". */
|
|
23
|
+
export declare const teamNames: (text: string, names: readonly string[]) => Found[];
|
|
24
|
+
//# sourceMappingURL=text-atoms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-atoms.d.ts","sourceRoot":"","sources":["../../src/compare/text-atoms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAElF,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAC;AAExH,yDAAyD;AACzD,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,eAAO,MAAM,OAAO,GAAI,OAAO,SAAS,KAAK,EAAE,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,SAAS,KAAG,IAAI,EACoC,CAAC;AAkBjI,mGAAmG;AACnG,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,OAAO,SAAS,KAAG,KAAK,EAK/D,CAAC;AAKL,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,KAAK,EAC4E,CAAC;AAO3H,0GAA0G;AAC1G,eAAO,MAAM,WAAW,GAAI,OAAO,SAAS,EAAE,OAAO,SAAS,KAAG,IAAI,EAKjE,CAAC;AAaL,mGAAmG;AACnG,eAAO,MAAM,UAAU,GAAI,OAAO,SAAS,KAAG,IAAI,EAO/C,CAAC;AAQJ,+HAA+H;AAC/H,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,OAAO,SAAS,MAAM,EAAE,KAAG,KAAK,EASvE,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { QUOTATION_MARKS, quotedSpans } from "../quoted-span.js";
|
|
2
|
+
import { coversOffset, overlapsAny, spanIndex } from "./spans.js";
|
|
3
|
+
export const atomsOf = (found, kind, input) => found.map((fact) => ({ kind, key: fact.key, text: input.source.slice(fact.start, fact.end), line: input.lineOf(fact.start) }));
|
|
4
|
+
const DIGIT = "[0-90-9]";
|
|
5
|
+
const DATE_SEPARATOR = "[-/./.]";
|
|
6
|
+
/** 2026/4/1, 2026-04-01, 2026.4.1: a year of four digits first, so the order is never in doubt. */
|
|
7
|
+
const NUMERIC_DATE = new RegExp(`(?<![0-90-9])(${DIGIT}{4})${DATE_SEPARATOR}(${DIGIT}{1,2})${DATE_SEPARATOR}(${DIGIT}{1,2})(?![0-90-9])`, "gu");
|
|
8
|
+
const MONTHS = 12;
|
|
9
|
+
const LAST_DAY = 31;
|
|
10
|
+
const PADDED = 2;
|
|
11
|
+
const dateKey = (year, month, day) => {
|
|
12
|
+
const [m, d] = [Number(month.normalize("NFKC")), Number(day.normalize("NFKC"))];
|
|
13
|
+
if (m < 1 || m > MONTHS || d < 1 || d > LAST_DAY)
|
|
14
|
+
return undefined;
|
|
15
|
+
return [year.normalize("NFKC"), String(m).padStart(PADDED, "0"), String(d).padStart(PADDED, "0")].join("-");
|
|
16
|
+
};
|
|
17
|
+
/** Dates written in figures only, where the language's date reader did not already read a date. */
|
|
18
|
+
export const numericDates = (text, taken) => [...text.matchAll(NUMERIC_DATE)].flatMap((match) => {
|
|
19
|
+
const key = dateKey(match[1] ?? "", match[2] ?? "", match[3] ?? "");
|
|
20
|
+
const span = { start: match.index, end: match.index + match[0].length };
|
|
21
|
+
return key === undefined || overlapsAny(taken, span) ? [] : [{ ...span, key }];
|
|
22
|
+
});
|
|
23
|
+
/** A footnote mark `[^1]`, or the footnote itself `[^1]:`. */
|
|
24
|
+
const FOOTNOTE = /\[\^[^\]\s]+\]:?/gu;
|
|
25
|
+
export const footnotes = (text) => [...text.matchAll(FOOTNOTE)].map((match) => ({ start: match.index, end: match.index + match[0].length, key: match[0] }));
|
|
26
|
+
/** 1,200 or 12.5 or 3: the digits, a thousands separator only between groups of three, and a decimal part. */
|
|
27
|
+
const NUMBER = /[0-90-9]+(?:[,,][0-90-9]{3})*(?:[..][0-90-9]+)?/gu;
|
|
28
|
+
const valueOf = (written) => String(Number(written.normalize("NFKC").replace(/,/gu, "")));
|
|
29
|
+
/** Numbers no other reader took: written with no unit the language package knows, or with none at all. */
|
|
30
|
+
export const bareNumbers = (input, taken) => [...input.text.matchAll(NUMBER)].flatMap((match) => {
|
|
31
|
+
if (coversOffset(taken, match.index))
|
|
32
|
+
return [];
|
|
33
|
+
const value = valueOf(match[0]);
|
|
34
|
+
return [{ kind: "number", key: `${value} `, text: match[0], line: input.lineOf(match.index), unitless: true, value }];
|
|
35
|
+
});
|
|
36
|
+
/** A paragraph break: a quotation does not run over one, and reading paragraph by paragraph keeps each read short. */
|
|
37
|
+
const PARAGRAPH_BREAK = /\n[ \t]*\n/gu;
|
|
38
|
+
const paragraphsOf = (text) => {
|
|
39
|
+
const breaks = [...text.matchAll(PARAGRAPH_BREAK)].map((match) => match.index);
|
|
40
|
+
return [-1, ...breaks].map((from, index) => ({ start: from + 1, end: breaks[index] ?? text.length }));
|
|
41
|
+
};
|
|
42
|
+
/** What is quoted, as one spelling: line breaks and runs of spaces are how it was wrapped, not what it says. */
|
|
43
|
+
const quoteKey = (inner) => inner.normalize("NFKC").replace(/\s+/gu, " ").trim();
|
|
44
|
+
/** Quoted strings: 「」『』, “” and "". The key is what is inside; the marks are how it is written. */
|
|
45
|
+
export const quotations = (input) => paragraphsOf(input.text).flatMap((paragraph) => quotedSpans(input.text.slice(paragraph.start, paragraph.end), QUOTATION_MARKS).flatMap((inner) => {
|
|
46
|
+
const key = quoteKey(input.text.slice(paragraph.start + inner.start, paragraph.start + inner.end));
|
|
47
|
+
const span = { start: paragraph.start + inner.start - 1, end: paragraph.start + inner.end + 1 };
|
|
48
|
+
return key === "" ? [] : atomsOf([{ ...span, key }], "quote", input);
|
|
49
|
+
}));
|
|
50
|
+
const occurrences = (text, name) => {
|
|
51
|
+
const found = [];
|
|
52
|
+
for (let at = text.indexOf(name); at !== -1; at = text.indexOf(name, at + name.length))
|
|
53
|
+
found.push({ start: at, end: at + name.length });
|
|
54
|
+
return found;
|
|
55
|
+
};
|
|
56
|
+
/** The team's own names (chaff.yaml's `names:`), wherever they are written. Longer names first: "Acme Cloud" before "Acme". */
|
|
57
|
+
export const teamNames = (text, names) => {
|
|
58
|
+
const longestFirst = [...new Set(names.filter((name) => name !== ""))].toSorted((left, right) => right.length - left.length);
|
|
59
|
+
return longestFirst
|
|
60
|
+
.reduce((taken, name) => {
|
|
61
|
+
const index = spanIndex(taken);
|
|
62
|
+
const fresh = occurrences(text, name).filter((span) => !overlapsAny(index, span));
|
|
63
|
+
return [...taken, ...fresh.map((span) => ({ ...span, key: name }))];
|
|
64
|
+
}, [])
|
|
65
|
+
.toSorted((left, right) => left.start - right.start);
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=text-atoms.js.map
|