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,118 @@
|
|
|
1
|
+
// Whether a team's regular expression can run away. JavaScript's engine backtracks, so a pattern such as (a+)+ takes time
|
|
2
|
+
// exponential in the length of a line that almost matches. Pure: the pattern is read as text, never run on a document.
|
|
3
|
+
|
|
4
|
+
/** Longer patterns are refused: a rule that needs one is better written as several. */
|
|
5
|
+
export const MAX_PATTERN_LENGTH = 500;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* More repeats of varying count (*, +, {1,9}) than this are refused. Repeats side by side (a*a*a*b, a{0,99}a{0,99}…) do
|
|
9
|
+
* not nest, but their work multiplies: a line that almost matches costs its length to the power of their number.
|
|
10
|
+
*/
|
|
11
|
+
export const MAX_REPEATS = 3;
|
|
12
|
+
|
|
13
|
+
export type RegexRefusal = "too-long" | "nested-quantifier" | "too-many-repeats" | "backreference" | "empty-match" | "invalid";
|
|
14
|
+
|
|
15
|
+
/** An open group: where its body starts, and whether it holds a repeat of varying count (a+, a?, a{1,3}) or an alternation. */
|
|
16
|
+
type Group = { readonly start: number; varies: boolean; alternation: boolean };
|
|
17
|
+
|
|
18
|
+
/** A quantifier: its length, whether it has no upper bound, whether its count varies, and whether it can repeat more than once. */
|
|
19
|
+
type Quantifier = { readonly length: number; readonly unbounded: boolean; readonly varies: boolean; readonly many: boolean };
|
|
20
|
+
|
|
21
|
+
type Scan = { at: number; repeats: number; readonly stack: Group[] };
|
|
22
|
+
|
|
23
|
+
const QUANTIFIER_START: ReadonlySet<string> = new Set(["*", "+", "?", "{"]);
|
|
24
|
+
const BRACE = /^\{(\d+)(,(\d*))?\}\??/u;
|
|
25
|
+
const BACKREFERENCE = /^\\(?:[1-9]|k<)/u;
|
|
26
|
+
const CLASS_BODY = /^\^?\]?(?:\\.|[^\]\\])*\]/u;
|
|
27
|
+
|
|
28
|
+
/** The quantifier at pattern[at], or undefined when none is there. */
|
|
29
|
+
const quantifierAt = (pattern: string, at: number): Quantifier | undefined => {
|
|
30
|
+
const char = pattern[at];
|
|
31
|
+
if (char === undefined || !QUANTIFIER_START.has(char)) return undefined;
|
|
32
|
+
if (char !== "{") return { length: pattern[at + 1] === "?" ? 2 : 1, unbounded: char !== "?", varies: true, many: char !== "?" };
|
|
33
|
+
const brace = BRACE.exec(pattern.slice(at));
|
|
34
|
+
if (brace === null) return undefined;
|
|
35
|
+
const [least, most] = [Number(brace[1]), brace[2] === undefined ? Number(brace[1]) : Number(brace[3] || Infinity)];
|
|
36
|
+
return { length: brace[0].length, unbounded: most === Infinity, varies: most !== least, many: most > 1 };
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Just past the "]" that closes the character class opened at pattern[at]. */
|
|
40
|
+
const classEnd = (pattern: string, at: number): number => {
|
|
41
|
+
const close = CLASS_BODY.exec(pattern.slice(at + 1));
|
|
42
|
+
return close === null ? pattern.length : at + 1 + close[0].length;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const innermost = (scan: Scan): Group => scan.stack[scan.stack.length - 1] ?? { start: 0, varies: false, alternation: false };
|
|
46
|
+
|
|
47
|
+
/** A fixed string: plain characters, and punctuation escaped (Mr\.). \d, \w and the like are classes, not literals. */
|
|
48
|
+
const LITERAL = /^(?:[^\\[\](){}*+?.|^$]|\\[^A-Za-z0-9])+$/u;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Alternatives that are plain words starting with different characters ((cat|dog)+) never compete for the same text, so
|
|
52
|
+
* repeating them is linear. Any other alternation under a repeat ((a|aa)*) may try every split of the line.
|
|
53
|
+
*/
|
|
54
|
+
const distinctWords = (body: string): boolean => {
|
|
55
|
+
const alternatives = body.replace(/^\?:/u, "").split("|");
|
|
56
|
+
const firsts = alternatives.map((alternative) => (alternative.startsWith("\\") ? alternative.charAt(1) : alternative.charAt(0)));
|
|
57
|
+
return alternatives.every((alternative) => LITERAL.test(alternative)) && new Set(firsts).size === firsts.length;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/** Whether the group's text can be split between repeats in more than one way: it varies in length, or its alternatives compete. */
|
|
61
|
+
const competes = (pattern: string, closed: Group, end: number): boolean =>
|
|
62
|
+
closed.varies || (closed.alternation && !distinctWords(pattern.slice(closed.start, end - 1)));
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* After an atom that ends at end (closed is the group it closes, if any). A group repeated a varying number of times, more than
|
|
66
|
+
* once ((…)+, (…)*, (…){1,10}), that can itself match in more than one way ((a+), (a{1,10}), (a|aa)) is refused.
|
|
67
|
+
*/
|
|
68
|
+
const afterAtom = (pattern: string, scan: Scan, end: number, closed: Group | undefined): RegexRefusal | undefined => {
|
|
69
|
+
const quantifier = quantifierAt(pattern, end);
|
|
70
|
+
scan.at = end + (quantifier?.length ?? 0);
|
|
71
|
+
const repeatsVariably = quantifier !== undefined && quantifier.varies && quantifier.many;
|
|
72
|
+
if (repeatsVariably) scan.repeats += 1;
|
|
73
|
+
if (scan.repeats > MAX_REPEATS) return "too-many-repeats";
|
|
74
|
+
// A group that can match in more than one way makes the group around it so too, quantified or not: ((a|aa))+ is (a|aa)+.
|
|
75
|
+
const closedCompetes = closed !== undefined && competes(pattern, closed, end);
|
|
76
|
+
if (closedCompetes && repeatsVariably) return "nested-quantifier";
|
|
77
|
+
if (quantifier?.varies === true || closedCompetes) innermost(scan).varies = true;
|
|
78
|
+
return undefined;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/** Reads one escape, class, bracket or character at scan.at. */
|
|
82
|
+
const step = (pattern: string, scan: Scan): RegexRefusal | undefined => {
|
|
83
|
+
const char = pattern[scan.at];
|
|
84
|
+
if (char === "\\") return BACKREFERENCE.test(pattern.slice(scan.at)) ? "backreference" : afterAtom(pattern, scan, scan.at + 2, undefined);
|
|
85
|
+
if (char === "[") return afterAtom(pattern, scan, classEnd(pattern, scan.at), undefined);
|
|
86
|
+
if (char === "(") {
|
|
87
|
+
scan.stack.push({ start: scan.at + 1, varies: false, alternation: false });
|
|
88
|
+
scan.at += 1;
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
if (char === ")") return afterAtom(pattern, scan, scan.at + 1, scan.stack.length > 1 ? scan.stack.pop() : undefined);
|
|
92
|
+
if (char === "|") innermost(scan).alternation = true;
|
|
93
|
+
return afterAtom(pattern, scan, scan.at + 1, undefined);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* A group repeated without bound that holds a repeat without bound or an alternation ((a+)+, (a|aa)*, (\w+\s?)*) is the shape
|
|
98
|
+
* that backtracks exponentially. The pattern is read once, left to right, with a stack of open groups.
|
|
99
|
+
*/
|
|
100
|
+
const nestedRepeat = (pattern: string): RegexRefusal | undefined => {
|
|
101
|
+
const scan: Scan = { at: 0, repeats: 0, stack: [{ start: 0, varies: false, alternation: false }] };
|
|
102
|
+
while (scan.at < pattern.length) {
|
|
103
|
+
const refusal = step(pattern, scan);
|
|
104
|
+
if (refusal !== undefined) return refusal;
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/** Why the pattern is refused, or undefined when it may run. flags are the ones the rule runs with ("u", "iu"). */
|
|
110
|
+
export const regexRefusal = (pattern: string, flags: string): RegexRefusal | undefined => {
|
|
111
|
+
if (pattern.length > MAX_PATTERN_LENGTH) return "too-long";
|
|
112
|
+
try {
|
|
113
|
+
if (new RegExp(pattern, flags).test("")) return "empty-match";
|
|
114
|
+
} catch {
|
|
115
|
+
return "invalid";
|
|
116
|
+
}
|
|
117
|
+
return nestedRepeat(pattern);
|
|
118
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Token, TokenCondition } from "../plugin.ts";
|
|
2
|
+
|
|
3
|
+
// A team's morphology pattern: a run of tokens, each matching a condition on its part of speech, base form or surface.
|
|
4
|
+
// 「〜を行う」 is [{ pos: 名詞 }, { surface: を }, { base: 行う }]. Pure: tokens come from the language adapter.
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Parts of speech are Universal Dependencies tags (NOUN, VERB, ADP), the same for every language. A team may also write the
|
|
8
|
+
* everyday name in Japanese or English; each maps to the tags the adapters give for it.
|
|
9
|
+
*/
|
|
10
|
+
const POS_NAMES: Readonly<Record<string, readonly string[]>> = {
|
|
11
|
+
名詞: ["NOUN", "PROPN", "PRON", "NUM"],
|
|
12
|
+
固有名詞: ["PROPN"],
|
|
13
|
+
代名詞: ["PRON"],
|
|
14
|
+
動詞: ["VERB"],
|
|
15
|
+
形容詞: ["ADJ"],
|
|
16
|
+
副詞: ["ADV"],
|
|
17
|
+
助詞: ["ADP", "PART", "SCONJ", "CCONJ"],
|
|
18
|
+
助動詞: ["AUX"],
|
|
19
|
+
接続詞: ["CCONJ", "SCONJ"],
|
|
20
|
+
連体詞: ["DET"],
|
|
21
|
+
記号: ["PUNCT", "SYM"],
|
|
22
|
+
noun: ["NOUN", "PROPN", "PRON"],
|
|
23
|
+
verb: ["VERB"],
|
|
24
|
+
adjective: ["ADJ"],
|
|
25
|
+
adverb: ["ADV"],
|
|
26
|
+
preposition: ["ADP"],
|
|
27
|
+
determiner: ["DET"],
|
|
28
|
+
pronoun: ["PRON"],
|
|
29
|
+
conjunction: ["CCONJ", "SCONJ"],
|
|
30
|
+
auxiliary: ["AUX"],
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const UPOS: ReadonlySet<string> = new Set([
|
|
34
|
+
"ADJ",
|
|
35
|
+
"ADP",
|
|
36
|
+
"ADV",
|
|
37
|
+
"AUX",
|
|
38
|
+
"CCONJ",
|
|
39
|
+
"DET",
|
|
40
|
+
"INTJ",
|
|
41
|
+
"NOUN",
|
|
42
|
+
"NUM",
|
|
43
|
+
"PART",
|
|
44
|
+
"PRON",
|
|
45
|
+
"PROPN",
|
|
46
|
+
"PUNCT",
|
|
47
|
+
"SCONJ",
|
|
48
|
+
"SYM",
|
|
49
|
+
"VERB",
|
|
50
|
+
"X",
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
/** The tags a written part of speech stands for, or undefined when chaff does not know the name. */
|
|
54
|
+
export const posTags = (written: string): readonly string[] | undefined => {
|
|
55
|
+
const upper = written.toUpperCase();
|
|
56
|
+
if (UPOS.has(upper)) return [upper];
|
|
57
|
+
return POS_NAMES[written] ?? POS_NAMES[written.toLowerCase()];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/** The names a team may write, for the message about an unknown one. */
|
|
61
|
+
export const POS_WRITTEN_NAMES: readonly string[] = [...UPOS, ...Object.keys(POS_NAMES)];
|
|
62
|
+
|
|
63
|
+
const sameWord = (left: string, right: string): boolean => left.toLowerCase() === right.toLowerCase();
|
|
64
|
+
|
|
65
|
+
const holds = (token: Token, condition: TokenCondition): boolean =>
|
|
66
|
+
(condition.pos === undefined || condition.pos.includes(token.pos)) &&
|
|
67
|
+
(condition.surface === undefined || sameWord(token.surface, condition.surface)) &&
|
|
68
|
+
(condition.base === undefined || sameWord(token.lemma ?? token.surface, condition.base));
|
|
69
|
+
|
|
70
|
+
/** Every run of consecutive tokens where each holds its condition, as [first, last] token indexes. Runs do not overlap. */
|
|
71
|
+
export const tokenRuns = (tokens: readonly Token[], conditions: readonly TokenCondition[]): (readonly [number, number])[] => {
|
|
72
|
+
if (conditions.length === 0) return [];
|
|
73
|
+
return tokens.reduce<{ runs: (readonly [number, number])[]; next: number }>(
|
|
74
|
+
(acc, _token, start) => {
|
|
75
|
+
if (start < acc.next || start + conditions.length > tokens.length) return acc;
|
|
76
|
+
const matches = conditions.every((condition, offset) => {
|
|
77
|
+
const token = tokens[start + offset];
|
|
78
|
+
return token !== undefined && holds(token, condition);
|
|
79
|
+
});
|
|
80
|
+
return matches ? { runs: [...acc.runs, [start, start + conditions.length - 1]], next: start + conditions.length } : acc;
|
|
81
|
+
},
|
|
82
|
+
{ runs: [], next: 0 },
|
|
83
|
+
).runs;
|
|
84
|
+
};
|
package/src/detect.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { parse } from "yaml";
|
|
1
5
|
import { japaneseRatio, latinRatio } from "./detect-language.ts";
|
|
6
|
+
import { referenceListSpans } from "./reference-lists.ts";
|
|
7
|
+
import { withoutSpans } from "./soft-break.ts";
|
|
2
8
|
|
|
3
9
|
export type LanguageGuess = { readonly language: string; readonly confidence: number; readonly from: string };
|
|
4
10
|
|
|
@@ -8,8 +14,28 @@ export type LanguageGuess = { readonly language: string; readonly confidence: nu
|
|
|
8
14
|
*/
|
|
9
15
|
const JAPANESE_FLOOR = 0.15;
|
|
10
16
|
|
|
17
|
+
const HEADINGS_FILE = join(dirname(fileURLToPath(import.meta.url)), "..", "reference-headings.yaml");
|
|
18
|
+
|
|
19
|
+
const isStringList = (value: unknown): value is string[] => Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
20
|
+
|
|
21
|
+
const readHeadings = (): string[] => {
|
|
22
|
+
const raw: unknown = parse(readFileSync(HEADINGS_FILE, "utf8"));
|
|
23
|
+
const headings: unknown = typeof raw === "object" && raw !== null && "headings" in raw ? raw.headings : undefined;
|
|
24
|
+
if (!isStringList(headings)) throw new Error(`${HEADINGS_FILE}: headings は文字列の並びであること`);
|
|
25
|
+
return headings;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const REFERENCE_HEADINGS = readHeadings();
|
|
29
|
+
|
|
30
|
+
/** 本文だけ。文献一覧は引いた文献の言語で書かれるので数えない。本文に字が無ければ(文献一覧だけの文書)全体。 */
|
|
31
|
+
const bodyOf = (source: string): string => {
|
|
32
|
+
const body = withoutSpans(source, referenceListSpans(source, REFERENCE_HEADINGS));
|
|
33
|
+
return body.trim() === "" ? source : body;
|
|
34
|
+
};
|
|
35
|
+
|
|
11
36
|
export const guessLanguage = (source: string): LanguageGuess => {
|
|
12
|
-
const
|
|
37
|
+
const body = bodyOf(source);
|
|
38
|
+
const japanese = japaneseRatio(body);
|
|
13
39
|
if (japanese >= JAPANESE_FLOOR) return { language: "ja", confidence: japanese, from: "content" };
|
|
14
|
-
return { language: "en", confidence: latinRatio(
|
|
40
|
+
return { language: "en", confidence: latinRatio(body), from: "content" };
|
|
15
41
|
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { escapeRegExp } from "../orthography.ts";
|
|
2
|
-
import { ROMAN_NUMERAL } from "./roman-numeral.ts";
|
|
2
|
+
import { ROMAN_NUMERAL, romanRangeOf } from "./roman-numeral.ts";
|
|
3
3
|
import { citationKeySpans } from "./citation-key.ts";
|
|
4
4
|
import { dottedNameSpans } from "./dotted-name.ts";
|
|
5
|
+
import { letterJoinedNameSpans } from "./letter-joined-name.ts";
|
|
5
6
|
import { loneNumeralSpans, nameNumeralSpans } from "./name-numeral.ts";
|
|
6
7
|
import { placeholderSpans } from "./placeholder.ts";
|
|
7
8
|
import { seriesLabelSpans } from "./series-label.ts";
|
|
@@ -23,8 +24,12 @@ export type NotationWords = {
|
|
|
23
24
|
readonly emphasis: readonly string[];
|
|
24
25
|
/** 番号を後ろに書く、文書の区切りの名前(Part、Section、Title)。 */
|
|
25
26
|
readonly divisions: readonly string[];
|
|
27
|
+
/** 番号を後ろに書く、点の付いた略した名前(Vol.、No.、FIG.)。 */
|
|
28
|
+
readonly abbreviatedLabels: readonly string[];
|
|
26
29
|
/** 速記録が大文字で書く発言者の姓の前に置く敬称(Mr.、Mrs.、Madam)。 */
|
|
27
30
|
readonly honorifics: readonly string[];
|
|
31
|
+
/** 大文字で書く姓の前に置く肩書き(Prime Minister、Governor)。後ろに略語も来る(the President NASA memo)ので、名前の形を求める。 */
|
|
32
|
+
readonly titles: readonly string[];
|
|
28
33
|
/** 日付・時刻の数字の後ろに書く単位(年、月、日、時、分)。その前の同じ大文字の繰り返し(YY年)は書式の置き場所。 */
|
|
29
34
|
readonly dateTimeUnits: readonly string[];
|
|
30
35
|
};
|
|
@@ -41,14 +46,35 @@ const ANY_MERIDIEM = String.raw`[AaPp]\.?[Mm]\.?`;
|
|
|
41
46
|
const AMOUNT = String.raw`(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?`;
|
|
42
47
|
|
|
43
48
|
/**
|
|
44
|
-
*
|
|
45
|
-
* CD や CI
|
|
49
|
+
* 区切りの名前や略した名前のすぐ後ろの番号(Part II、Section VIII、TITLE IV、Vol. XLIII、FIG. 3、FIGS. 1A-1C)。名前は語彙表の
|
|
50
|
+
* 書き方か、全部大文字。ローマ数字は範囲(Part II-IV)も番号。CD や CI のようにローマ数字としても読める略語は、この位置で
|
|
51
|
+
* なければ略語のまま数える。
|
|
46
52
|
*/
|
|
47
53
|
const divisionOf = (words: readonly string[]): string => oneOf(words.flatMap((word) => [word, word.toUpperCase()]));
|
|
48
54
|
|
|
55
|
+
/** 図や表の番号は短い(FIG. 3、TABLE 12、FIG. 1A)。長い数(FIG. 12345)の前の大文字は略語のまま数える。 */
|
|
56
|
+
const SHORT_NUMBER = String.raw`\d{1,3}[A-Za-z]?`;
|
|
57
|
+
const NUMBER_END = String.raw`(?![\p{L}\p{N}_&])`;
|
|
58
|
+
|
|
59
|
+
const numberedPatterns = (words: NotationWords): readonly RegExp[] => {
|
|
60
|
+
const label = String.raw`(?<![\p{L}\p{N}_])${divisionOf([...words.divisions, ...words.abbreviatedLabels])}\s+`;
|
|
61
|
+
return [new RegExp(`${label}${romanRangeOf(ROMAN_NUMERAL)}${NUMBER_END}`, "gu"), new RegExp(`${label}${SHORT_NUMBER}${NUMBER_END}`, "gu")];
|
|
62
|
+
};
|
|
63
|
+
|
|
49
64
|
/** 敬称のすぐ後ろの大文字の姓(Mr. HAWLEY、Dr. O'NEIL)。速記録は発言者をこう書き、略語ではない。 */
|
|
50
65
|
const SURNAME_IN_CAPITALS = String.raw`[A-Z]+(?:['’-][A-Z]+)*(?![\p{L}\p{N}_])`;
|
|
51
66
|
|
|
67
|
+
/**
|
|
68
|
+
* 肩書きの後ろの大文字の語が姓と読めるのは、名前の形のときだけ。行頭の発言者の印(Senator HAWLEY.、Chairman JORDAN:)か、
|
|
69
|
+
* 日本政府の英文が「姓 名」の順に書くローマ字の名前(Prime Minister ABE Shinzo)。the President NASA memo と
|
|
70
|
+
* The Secretary GDPR: Article 5 の略語は数える。
|
|
71
|
+
*/
|
|
72
|
+
const GIVEN_NAME_AFTER = String.raw`(?=\s+\p{Lu}\p{Ll}+(?![\p{L}\p{N}_]))`;
|
|
73
|
+
const titledName = (titles: string): readonly RegExp[] => [
|
|
74
|
+
new RegExp(String.raw`(?<=(?:^|\n)[ \t]*)${titles}\s+${SURNAME_IN_CAPITALS}(?=[.:])`, "gu"),
|
|
75
|
+
new RegExp(String.raw`(?<![\p{L}\p{N}_])${titles}\s+${SURNAME_IN_CAPITALS}${GIVEN_NAME_AFTER}`, "gu"),
|
|
76
|
+
];
|
|
77
|
+
|
|
52
78
|
// 強調の記号は空白に置き換えてある(**3:30** PM)ので、部品の間の空白は数を問わない。
|
|
53
79
|
const patternsOf = (words: NotationWords): readonly RegExp[] => [
|
|
54
80
|
new RegExp(String.raw`${CLOCK_12}\s*${oneOf(words.meridiem)}`, "gu"),
|
|
@@ -57,8 +83,9 @@ const patternsOf = (words: NotationWords): readonly RegExp[] => [
|
|
|
57
83
|
new RegExp(String.raw`(?<![\w.,])${AMOUNT}\s*${oneOf(words.currencies)}`, "gu"),
|
|
58
84
|
new RegExp(String.raw`,\s+${oneOf(words.usStates)}\s+\d{5}(?:-\d{4})?(?!\d)`, "gu"),
|
|
59
85
|
new RegExp(oneOf(words.emphasis), "gu"),
|
|
60
|
-
|
|
86
|
+
...numberedPatterns(words),
|
|
61
87
|
new RegExp(String.raw`(?<![\p{L}\p{N}_])${oneOf(words.honorifics)}\s+${SURNAME_IN_CAPITALS}`, "gu"),
|
|
88
|
+
...titledName(oneOf(words.titles)),
|
|
62
89
|
];
|
|
63
90
|
|
|
64
91
|
export type NotAcronymSpans = (text: string) => Span[];
|
|
@@ -73,6 +100,7 @@ export const notAcronymSpansOf = (words: NotationWords): NotAcronymSpans => {
|
|
|
73
100
|
...patterns.flatMap((pattern) => [...text.matchAll(pattern)].map((match) => ({ start: match.index, end: match.index + match[0].length }))),
|
|
74
101
|
...citationKeySpans(text),
|
|
75
102
|
...dottedNameSpans(text),
|
|
103
|
+
...letterJoinedNameSpans(text),
|
|
76
104
|
...nameNumeralSpans(text),
|
|
77
105
|
...loneNumeralSpans(text),
|
|
78
106
|
...seriesLabelSpans(text),
|
|
@@ -12,6 +12,7 @@ import { escapeRegExp } from "../orthography.ts";
|
|
|
12
12
|
* (single nucleotide polymorphism:SNP) 括弧の最後の項目が略語で、コロンの前の語の頭文字と揃う
|
|
13
13
|
* 人事部(以下「HR」という。) 括弧の中が定義の語と略語だけ
|
|
14
14
|
* overnight reverse repurchase agreement (ON RRP) 括弧の中が空白で繋いだ略語だけで、前の名前から文字が順に拾える
|
|
15
|
+
* Partnership On Wide Energy and Resources Resilience Asia (POWERR Asia) 括弧の中が略語と添えた語で、前の名前の頭文字と揃う
|
|
15
16
|
* 括弧と略語の間には、引用符((“MNDA”)、(「MNDA」))と空白だけを許す。
|
|
16
17
|
*/
|
|
17
18
|
const WRAP = String.raw`[\s"“”'‘’「」『』]*`;
|
|
@@ -149,12 +150,28 @@ const isJointBracketedAt = (body: string, acronym: string, at: number): boolean
|
|
|
149
150
|
return abbreviates(body.slice(0, start), body.slice(start, close));
|
|
150
151
|
};
|
|
151
152
|
|
|
153
|
+
/** 括弧の中で略語に添えた、大文字で始まる語((POWERR Asia)、(ZEC Initiative))と、閉じる括弧。 */
|
|
154
|
+
const QUALIFIER = new RegExp(String.raw`^(?<words>(?: [A-Z][a-z]+)+)${WRAP}[))]`, "u");
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 括弧の中が略語と、それに添えた語だけの形。括弧の前の名前の頭文字が略語と揃うときだけ展開と見なす((NASA Goddard) は揃わない)。
|
|
158
|
+
* 添えた語が名前の終わりにもあれば(… Resilience Asia (POWERR Asia))、それを除いて比べる。
|
|
159
|
+
*/
|
|
160
|
+
const isQualifiedAt = (body: string, acronym: string, at: number): boolean => {
|
|
161
|
+
if (!OPENED.test(body.slice(Math.max(0, at - NEAR), at))) return false;
|
|
162
|
+
const end = at + acronym.length;
|
|
163
|
+
const words = QUALIFIER.exec(body.slice(end, end + DEFINITION_REACH))?.groups?.["words"];
|
|
164
|
+
if (words === undefined) return false;
|
|
165
|
+
const name = body.slice(0, at).replace(ANY_OPENED, "").trimEnd();
|
|
166
|
+
return spellsOut(name.endsWith(words) ? name.slice(0, -words.length) : name, acronym);
|
|
167
|
+
};
|
|
168
|
+
|
|
152
169
|
const isBracketedAt = (body: string, acronym: string, at: number): boolean => {
|
|
153
170
|
const after = body.slice(at + acronym.length, at + acronym.length + NEAR);
|
|
154
171
|
const before = body.slice(Math.max(0, at - NEAR), at);
|
|
155
172
|
if (OPENS.test(after) || (OPENED.test(before) && CLOSES.test(after))) return true;
|
|
156
173
|
if (SQUARE_OPENED.test(before) && SQUARE_CLOSES.test(after) && spellsOut(body.slice(0, at), acronym)) return true;
|
|
157
|
-
return isSeparatedAt(body, acronym, at) || isNamedBeforeAt(body, acronym, at) || isJointBracketedAt(body, acronym, at);
|
|
174
|
+
return isSeparatedAt(body, acronym, at) || isNamedBeforeAt(body, acronym, at) || isJointBracketedAt(body, acronym, at) || isQualifiedAt(body, acronym, at);
|
|
158
175
|
};
|
|
159
176
|
|
|
160
177
|
/**
|
|
@@ -167,6 +184,120 @@ const EQUALS_DEFINITION = /^\s*[==]\s*(?=\p{L})\S*?[\p{Ll}\p{Lo}]/u;
|
|
|
167
184
|
const isEqualsDefinedAt = (body: string, acronym: string, at: number): boolean =>
|
|
168
185
|
EQUALS_DEFINITION.test(body.slice(at + acronym.length, at + acronym.length + DEFINITION_REACH));
|
|
169
186
|
|
|
187
|
+
/**
|
|
188
|
+
* 用語集の見出し語としての略語(## AFD、| AFD |、**AFD**:、- AFD —)。名前は見出し語のすぐ後ろ、つまり次の行・隣のセル・
|
|
189
|
+
* 区切りの後ろに書く。見出しと表は文にならないので、文をつないだ本文ではなく source の行を見る。
|
|
190
|
+
*/
|
|
191
|
+
const TERM = String.raw`[A-Z][A-Z&-]*[A-Z]`;
|
|
192
|
+
const STRONG = /\*\*|__/gu;
|
|
193
|
+
const LIST_MARK = String.raw`(?:[-*+]|\d+[.)])\s+`;
|
|
194
|
+
const TERM_SEPARATOR = String.raw`(?:[::]|\s[-–—]|[–—])`;
|
|
195
|
+
/** 行が略語だけの見出し・段落(## AFD、AFD:、**AFD**)。 */
|
|
196
|
+
const TERM_LINE = new RegExp(String.raw`^(?:#{1,6}\s+)?(?<term>${TERM})\s*(?<colon>[::])?(?:\s+#+)?$`, "u");
|
|
197
|
+
/** 見出しか強調の印。印の無い「RTO:」の行はメモの見出しにも書くので、コロンを付けた略語だけの行は印があるときだけ見出し語と読む。 */
|
|
198
|
+
const MARKED_LINE = /^(?:#|\*\*|__)/u;
|
|
199
|
+
/**
|
|
200
|
+
* 箇条書きの頭の略語と区切りの後ろの名前(- AFD — Area…)か、強調した略語とその後ろの名前(**AFD**: Area…、**AFD** Area…)。
|
|
201
|
+
* 印の無い行頭の略語とコロン(RTO: Review ticket ownership.)は、メモの見出しにも書くので見出し語と読まない。
|
|
202
|
+
*/
|
|
203
|
+
const TERM_LEAD = new RegExp(
|
|
204
|
+
String.raw`^(?:(?:${LIST_MARK})?(?<strong>\*\*|__)(?<strongTerm>${TERM})\s*(?:[::]\s*)?\k<strong>\s*${TERM_SEPARATOR}?|${LIST_MARK}(?<term>${TERM})\s*${TERM_SEPARATOR})\s*(?<rest>\S.*)$`,
|
|
205
|
+
"u",
|
|
206
|
+
);
|
|
207
|
+
const TABLE_ROW = /^\s*\|.*\|\s*$/u;
|
|
208
|
+
const WHOLE_TERM = new RegExp(String.raw`^${TERM}$`, "u");
|
|
209
|
+
/** 名前の終わり。文の終わり、区切り、括弧、空白で挟んだハイフン。読点は名前の中にも書く(Aviation, Range, and Aerospace Meteorology)ので、その前でも比べる。 */
|
|
210
|
+
const NAME_END = /[.;::((。|]|\s[-–—]\s|[–—]/u;
|
|
211
|
+
const NAME_COMMA = /[,,、]/u;
|
|
212
|
+
const LEADING_MARKS = /^[\s::>*+-]+/u;
|
|
213
|
+
|
|
214
|
+
/** 項目の頭の名前と、その読点の前まで(Service Level Agreement, a contract → Service Level Agreement)。 */
|
|
215
|
+
const namesOf = (text: string): string[] => {
|
|
216
|
+
const clause = (text.replaceAll(STRONG, "").replace(LEADING_MARKS, "").split(NAME_END)[0] ?? "").trim();
|
|
217
|
+
return [clause, (clause.split(NAME_COMMA)[0] ?? "").trim()].filter((name) => name !== "");
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/** 1 語の名前を縮めた略語(ABV → Above、ABNDT → Abundant)。名前は小文字を含む語で、略語そのもの(SEO.)ではない。 */
|
|
221
|
+
const shortensWord = (name: string, acronym: string): boolean => !/\s/u.test(name) && /\p{Ll}/u.test(name) && abbreviates(name, acronym);
|
|
222
|
+
|
|
223
|
+
const spellsName = (text: string, acronym: string): boolean => namesOf(text).some((name) => namesAcronym(name, acronym) || shortensWord(name, acronym));
|
|
224
|
+
|
|
225
|
+
const cellsOf = (row: string): string[] =>
|
|
226
|
+
row
|
|
227
|
+
.trim()
|
|
228
|
+
.replace(/^\||\|$/gu, "")
|
|
229
|
+
.split("|")
|
|
230
|
+
.map((cell) => cell.replaceAll(STRONG, "").trim());
|
|
231
|
+
|
|
232
|
+
/** 表の行で、略語だけのセルの隣(後ろか前)のセルが名前のもの。 */
|
|
233
|
+
const tableTerms = (row: string): string[] => {
|
|
234
|
+
const cells = cellsOf(row);
|
|
235
|
+
return cells.filter(
|
|
236
|
+
(cell, index) => WHOLE_TERM.test(cell) && [cells[index + 1], cells[index - 1]].some((next) => next !== undefined && spellsName(next, cell)),
|
|
237
|
+
);
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
const leadTerm = (line: string): string[] => {
|
|
241
|
+
const lead = TERM_LEAD.exec(line.trim());
|
|
242
|
+
const term = lead?.groups?.["strongTerm"] ?? lead?.groups?.["term"];
|
|
243
|
+
return term !== undefined && spellsName(lead?.groups?.["rest"] ?? "", term) ? [term] : [];
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/** 見出し語から名前までに見る行の数。空行が 2 つ挟まっても、次の段落を見る。 */
|
|
247
|
+
const NEXT_LINE_REACH = 3;
|
|
248
|
+
|
|
249
|
+
/** 略語だけの行と、その次の空でない行が名前のもの。 */
|
|
250
|
+
const lineTerm = (lines: readonly string[], index: number): string[] => {
|
|
251
|
+
const line = (lines[index] ?? "").trim();
|
|
252
|
+
const groups = TERM_LINE.exec(line.replaceAll(STRONG, ""))?.groups;
|
|
253
|
+
const term = groups?.["term"];
|
|
254
|
+
if (term === undefined || (groups?.["colon"] !== undefined && !MARKED_LINE.test(line))) return [];
|
|
255
|
+
const next = lines.slice(index + 1, index + 1 + NEXT_LINE_REACH).find((line) => line.trim() !== "");
|
|
256
|
+
return next !== undefined && spellsName(next, term) ? [term] : [];
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const FENCE = /^ {0,3}(?<fence>`{3,}|~{3,})/u;
|
|
260
|
+
const FRONT_MATTER_EDGE = /^(?:---|\.\.\.)\s*$/u;
|
|
261
|
+
|
|
262
|
+
type FenceScan = { readonly open: string | undefined; readonly kept: string[] };
|
|
263
|
+
|
|
264
|
+
/** 閉じる行は記号の並びだけ。後ろに語がある行(```ts)は囲みの中の行。 */
|
|
265
|
+
const CLOSING_FENCE = /^ {0,3}(?<fence>`{3,}|~{3,})\s*$/u;
|
|
266
|
+
|
|
267
|
+
const closes = (line: string, open: string): boolean => CLOSING_FENCE.exec(line)?.groups?.["fence"]?.startsWith(open) === true;
|
|
268
|
+
|
|
269
|
+
/** コードの囲みの中の行(開き・閉じの行も)を空にする。閉じるのは同じ記号で、開きと同じか長い並び。 */
|
|
270
|
+
const withoutFences = (lines: readonly string[]): string[] =>
|
|
271
|
+
lines.reduce<FenceScan>(
|
|
272
|
+
(scan, line) => {
|
|
273
|
+
const fence = FENCE.exec(line)?.groups?.["fence"];
|
|
274
|
+
const inside = scan.open !== undefined || fence !== undefined;
|
|
275
|
+
scan.kept.push(inside ? "" : line);
|
|
276
|
+
if (scan.open === undefined) return { open: fence, kept: scan.kept };
|
|
277
|
+
return { open: closes(line, scan.open) ? undefined : scan.open, kept: scan.kept };
|
|
278
|
+
},
|
|
279
|
+
{ open: undefined, kept: [] },
|
|
280
|
+
).kept;
|
|
281
|
+
|
|
282
|
+
/** 文書の頭の front matter(--- で始まり --- か ... で閉じる)の行数。無ければ 0。 */
|
|
283
|
+
const frontMatterLength = (lines: readonly string[]): number =>
|
|
284
|
+
lines[0]?.trim() === "---" ? lines.findIndex((line, index) => index > 0 && FRONT_MATTER_EDGE.test(line)) + 1 : 0;
|
|
285
|
+
|
|
286
|
+
/** 4 桁以上の字下げはコードとして書ける。入れ子の箇条書きと見分けずに外す(外しても、略語が報告されるほうへ倒れるだけ)。 */
|
|
287
|
+
const INDENTED = /^(?: {4}|\t)/u;
|
|
288
|
+
|
|
289
|
+
/** 本文として読まない行(front matter、コードの囲み、字下げしたコード)を空にした行。行の位置は変えない。 */
|
|
290
|
+
const proseLines = (lines: readonly string[]): string[] => {
|
|
291
|
+
const skipped = frontMatterLength(lines);
|
|
292
|
+
return withoutFences(lines.map((line, index) => (index < skipped || INDENTED.test(line) ? "" : line)));
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
/** 用語集の見出し語として、すぐ後ろに名前を書いた略語。 */
|
|
296
|
+
export const termEntryAcronyms = (source: string): ReadonlySet<string> => {
|
|
297
|
+
const lines = proseLines(source.split(/\r?\n/u));
|
|
298
|
+
return new Set(lines.flatMap((line, index) => (TABLE_ROW.test(line) ? tableTerms(line) : [...lineTerm(lines, index), ...leadTerm(line)])));
|
|
299
|
+
};
|
|
300
|
+
|
|
170
301
|
export type ExpandedAt = (body: string, acronym: string, at: number) => boolean;
|
|
171
302
|
|
|
172
303
|
/** body の at にある略語が、その場で展開・定義されているか。語彙表から一度だけ組み立てて、略語ごとに呼ぶ。 */
|