chaffjs 0.17.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 +2 -0
- package/dist/calendar-number.d.ts.map +1 -1
- package/dist/calendar-number.js +9 -2
- package/dist/calendar-number.js.map +1 -1
- package/dist/cli-args.d.ts +4 -0
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +5 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-text.d.ts.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/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 +2 -4
- 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 +2 -0
- package/dist/detectors/acronym-context.d.ts.map +1 -1
- package/dist/detectors/acronym-context.js +12 -4
- package/dist/detectors/acronym-context.js.map +1 -1
- package/dist/detectors/ai-phrasing.d.ts +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/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/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 +7 -4
- package/dist/detectors/heading-echo.js.map +1 -1
- package/dist/detectors/heading-level-skip.d.ts +12 -0
- package/dist/detectors/heading-level-skip.d.ts.map +1 -0
- package/dist/detectors/heading-level-skip.js +11 -0
- package/dist/detectors/heading-level-skip.js.map +1 -0
- package/dist/detectors/image-alt-text.d.ts +3 -0
- package/dist/detectors/image-alt-text.d.ts.map +1 -0
- package/dist/detectors/image-alt-text.js +9 -0
- package/dist/detectors/image-alt-text.js.map +1 -0
- package/dist/detectors/index.d.ts.map +1 -1
- package/dist/detectors/index.js +34 -1
- 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/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/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 +14 -10
- package/dist/detectors/orthography.js.map +1 -1
- package/dist/detectors/oxford-comma.d.ts +7 -1
- package/dist/detectors/oxford-comma.d.ts.map +1 -1
- package/dist/detectors/oxford-comma.js +135 -229
- package/dist/detectors/oxford-comma.js.map +1 -1
- package/dist/detectors/place-run.d.ts.map +1 -1
- package/dist/detectors/place-run.js +10 -6
- package/dist/detectors/place-run.js.map +1 -1
- package/dist/detectors/placeholder-text.d.ts +9 -0
- package/dist/detectors/placeholder-text.d.ts.map +1 -0
- package/dist/detectors/placeholder-text.js +18 -0
- package/dist/detectors/placeholder-text.js.map +1 -0
- package/dist/detectors/quote-around.d.ts +3 -0
- package/dist/detectors/quote-around.d.ts.map +1 -0
- package/dist/detectors/quote-around.js +8 -0
- package/dist/detectors/quote-around.js.map +1 -0
- package/dist/detectors/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 +67 -46
- package/dist/detectors/signals.js.map +1 -1
- 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 +1 -3
- package/dist/detectors/structure.d.ts.map +1 -1
- package/dist/detectors/structure.js +3 -4
- 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 +90 -98
- 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/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 +33 -10
- 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.js +8 -5
- 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 +119 -17
- package/dist/number-name.js.map +1 -1
- package/dist/orthography.d.ts +2 -0
- package/dist/orthography.d.ts.map +1 -1
- package/dist/orthography.js +9 -4
- 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/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 +115 -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.map +1 -1
- package/dist/quoted-span.js +8 -3
- 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 +87 -33
- package/dist/rule-load.js.map +1 -1
- package/dist/rule-options.d.ts +50 -0
- package/dist/rule-options.d.ts.map +1 -0
- package/dist/rule-options.js +106 -0
- package/dist/rule-options.js.map +1 -0
- package/dist/run.d.ts +13 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +54 -10
- package/dist/run.js.map +1 -1
- package/dist/sentence-shape.d.ts.map +1 -1
- package/dist/sentence-shape.js +4 -4
- package/dist/sentence-shape.js.map +1 -1
- package/dist/setting-problems.d.ts +2 -1
- package/dist/setting-problems.d.ts.map +1 -1
- package/dist/setting-problems.js +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/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 +76 -30
- package/dist/structure/relative-resolve.js.map +1 -1
- package/dist/structure/runs.d.ts +2 -0
- package/dist/structure/runs.d.ts.map +1 -1
- package/dist/structure/runs.js +2 -2
- package/dist/structure/runs.js.map +1 -1
- package/dist/structure/sexp.d.ts +1 -1
- package/dist/structure/sexp.d.ts.map +1 -1
- package/dist/structure/sexp.js +18 -6
- package/dist/structure/sexp.js.map +1 -1
- package/dist/structure/total.d.ts +3 -0
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +2 -2
- package/dist/structure/total.js.map +1 -1
- package/dist/structure/universal.d.ts +14 -2
- package/dist/structure/universal.d.ts.map +1 -1
- package/dist/structure/universal.js +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/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 +26 -0
- 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 +14 -1
- 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 +28 -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 +31 -0
- package/rules/heading-level-skip.yaml +78 -0
- package/rules/hiragana-fukushi.yaml +16 -0
- package/rules/image-alt-text.yaml +54 -0
- package/rules/internal-jargon.yaml +21 -0
- package/rules/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 +33 -0
- package/rules/max-sentence-length.yaml +32 -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 +18 -0
- 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 +18 -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 +22 -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 +18 -4
- package/src/cli-args.ts +6 -0
- package/src/cli-text.ts +8 -4
- package/src/cli.ts +37 -37
- 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 +2 -4
- 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 +16 -4
- 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/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/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 +8 -4
- package/src/detectors/heading-level-skip.ts +19 -0
- package/src/detectors/image-alt-text.ts +11 -0
- package/src/detectors/index.ts +43 -1
- package/src/detectors/kutoten-consistency.ts +96 -0
- package/src/detectors/lead-in.ts +3 -1
- package/src/detectors/lexicon-match.ts +9 -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 +23 -17
- package/src/detectors/oxford-comma.ts +178 -283
- 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 +80 -46
- package/src/detectors/structure-tree.ts +45 -1
- package/src/detectors/structure.ts +3 -4
- 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 +106 -138
- 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/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 +52 -9
- 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 +8 -8
- package/src/number-name.ts +151 -24
- package/src/orthography.ts +10 -3
- package/src/page-furniture.ts +11 -2
- package/src/plain-source.ts +2 -1
- package/src/plugin.ts +101 -1
- package/src/profile/for-file.ts +3 -1
- package/src/quoted-span.ts +9 -3
- 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 +91 -34
- package/src/rule-options.ts +131 -0
- package/src/run.ts +74 -11
- package/src/sentence-shape.ts +4 -5
- package/src/setting-problems.ts +7 -1
- package/src/span-cut.ts +28 -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 +77 -30
- package/src/structure/runs.ts +2 -2
- package/src/structure/sexp.ts +17 -5
- package/src/structure/total.ts +2 -2
- package/src/structure/universal.ts +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/template-syntax.ts +164 -0
- package/src/text-above.ts +49 -0
- package/src/text-figures.ts +147 -0
- package/src/trailing-aside.ts +50 -0
- package/src/tree-walk.ts +48 -0
- package/styles/bunkacho.yaml +25 -0
- package/styles/ieice.yaml +29 -0
- package/styles/jis-z8301-2011.yaml +25 -0
|
@@ -1,87 +1,54 @@
|
|
|
1
1
|
import type { Detector, Finding, Lexicon, Token } from "../plugin.ts";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const start = clause.tokens.slice(0, at).findLastIndex((token) => CLAUSE_BREAK.has(token.surface)) + 1;
|
|
53
|
-
return clause.tokens
|
|
54
|
-
.slice(start, at)
|
|
55
|
-
.reduce<Token[][]>(
|
|
56
|
-
(items, token, offset) => {
|
|
57
|
-
if (isComma(token) && clause.depths[start + offset] === level) return [...items, []];
|
|
58
|
-
return [...items.slice(0, -1), [...(items.at(-1) ?? []), token]];
|
|
59
|
-
},
|
|
60
|
-
[[]],
|
|
61
|
-
)
|
|
62
|
-
.filter((item) => item.length > 0);
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* and / or で始まる項目で、前の並びは閉じている(offering, giving, or receiving, directly or indirectly)。
|
|
67
|
-
* 次の並びはその項目から始まる。項目が動詞で始まれば、その目的語から(Develop, maintain, and track courses, materials and events)。
|
|
68
|
-
*/
|
|
69
|
-
const afterClosedList = (items: readonly Token[][]): Token[][] => {
|
|
70
|
-
const closed = items.findLastIndex((item) => LIST_CONJUNCTION.has(openingOf(item)?.surface.toLowerCase() ?? ""));
|
|
71
|
-
const closing = items[closed];
|
|
72
|
-
if (closing === undefined) return [...items];
|
|
73
|
-
const body = closing.slice(closing.findIndex((token) => LIST_CONJUNCTION.has(token.surface.toLowerCase())) + 1);
|
|
74
|
-
const head = body.findIndex(isContent);
|
|
75
|
-
const rest = VERBAL.has(body[head]?.pos ?? "") ? body.slice(head + 1) : body;
|
|
76
|
-
// 項目が残らなければ、後ろは新しい句の頭。導入の句(directly or indirectly,)を外す。
|
|
77
|
-
return rest.some(isContent) ? [rest, ...items.slice(closed + 1)] : [...withoutLead(items.slice(closed + 1))];
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
/** and / or の後ろの項目。次の読点か節の切れ目まで。 */
|
|
81
|
-
const itemAfter = (tokens: readonly Token[], at: number): Token[] => {
|
|
82
|
-
const end = tokens.findIndex((token, index) => index > at && (isComma(token) || CLAUSE_BREAK.has(token.surface)));
|
|
83
|
-
return tokens.slice(at + 1, end === -1 ? undefined : end);
|
|
84
|
-
};
|
|
2
|
+
import {
|
|
3
|
+
contentCount,
|
|
4
|
+
exampleEnd,
|
|
5
|
+
firstAt,
|
|
6
|
+
firstContent,
|
|
7
|
+
firstNoun,
|
|
8
|
+
hasAdposition,
|
|
9
|
+
hasContent,
|
|
10
|
+
hasDeterminer,
|
|
11
|
+
hasListConjunction,
|
|
12
|
+
hasParticiple,
|
|
13
|
+
hasVerb,
|
|
14
|
+
isClause,
|
|
15
|
+
isModifiedNoun,
|
|
16
|
+
isModifier,
|
|
17
|
+
isParticiple,
|
|
18
|
+
isPluralNounPhrase,
|
|
19
|
+
itemAfter,
|
|
20
|
+
lastContent,
|
|
21
|
+
lastNoun,
|
|
22
|
+
leadShape,
|
|
23
|
+
openingKind,
|
|
24
|
+
openingOf,
|
|
25
|
+
participleOpening,
|
|
26
|
+
shapeOf,
|
|
27
|
+
} from "./list-item.ts";
|
|
28
|
+
import { listReader, type ItemList } from "./list-items.ts";
|
|
29
|
+
import { APPOSITIVE_ANCHOR, isListConjunction, listSentenceOf, VERBAL, type ItemScope, type ListWords } from "./list-sentence.ts";
|
|
30
|
+
import {
|
|
31
|
+
after,
|
|
32
|
+
contentOnlyWith,
|
|
33
|
+
every,
|
|
34
|
+
findAfterFirst,
|
|
35
|
+
findLast,
|
|
36
|
+
firstOf,
|
|
37
|
+
lastOf,
|
|
38
|
+
sameShapes,
|
|
39
|
+
secondLastOf,
|
|
40
|
+
secondOf,
|
|
41
|
+
sizeOf,
|
|
42
|
+
some,
|
|
43
|
+
wholeList,
|
|
44
|
+
withoutFirst,
|
|
45
|
+
type View,
|
|
46
|
+
} from "./list-view.ts";
|
|
47
|
+
import { lowerBound, type TokenRange } from "./token-column.ts";
|
|
48
|
+
|
|
49
|
+
const EMPTY: TokenRange = { start: 0, end: 0 };
|
|
50
|
+
|
|
51
|
+
const commaBefore = (scope: ItemScope, at: number): boolean => scope.sentence.tokens[at - 1]?.surface === ",";
|
|
85
52
|
|
|
86
53
|
/**
|
|
87
54
|
* 導入の句(After the review, / If it fails, / Finally, / To test it, / Based on the review,)は並列の項目ではない。
|
|
@@ -91,76 +58,50 @@ const itemAfter = (tokens: readonly Token[], at: number): Token[] => {
|
|
|
91
58
|
*/
|
|
92
59
|
const LEAD_POS = new Set(["ADP", "SCONJ", "ADV", "PART"]);
|
|
93
60
|
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
const withoutLead = (items: readonly Token[][]): readonly Token[][] => {
|
|
104
|
-
const [first, second] = items;
|
|
105
|
-
const opening = first === undefined ? undefined : openingOf(first);
|
|
106
|
-
if (first === undefined || second === undefined || opening === undefined) return items;
|
|
107
|
-
if (!LEAD_POS.has(opening.pos) && !isParticiple(opening)) return items;
|
|
108
|
-
return openingKind(first) === openingKind(second) ? items : items.slice(1);
|
|
61
|
+
const withoutLead = (view: View): View => {
|
|
62
|
+
const { scope } = view.list;
|
|
63
|
+
const [first, second] = [firstOf(view), secondOf(view)];
|
|
64
|
+
const opening = first === undefined ? undefined : openingOf(scope, first.item);
|
|
65
|
+
if (first === undefined || second === undefined || opening === undefined) return view;
|
|
66
|
+
if (!LEAD_POS.has(opening.pos) && !isParticiple(opening)) return view;
|
|
67
|
+
return openingKind(scope, first.item) === openingKind(scope, second.item) ? view : withoutFirst(view);
|
|
109
68
|
};
|
|
110
69
|
|
|
111
70
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
|
|
115
|
-
const lastContent = (item: readonly Token[]): Token | undefined => item.findLast(isContent);
|
|
116
|
-
|
|
117
|
-
const joinAdjectives = (items: readonly Token[][]): Token[][] =>
|
|
118
|
-
items.reduce<Token[][]>((joined, item) => {
|
|
119
|
-
const previous = joined.at(-1);
|
|
120
|
-
const stacked = previous !== undefined && lastContent(previous)?.pos === "ADJ" && lastContent(item)?.pos !== "ADJ";
|
|
121
|
-
if (stacked) joined[joined.length - 1] = [...previous, ...item];
|
|
122
|
-
else joined.push(item);
|
|
123
|
-
return joined;
|
|
124
|
-
}, []);
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* 節を並べるなら、どの項目も節。Additionally, others can learn, and the mistake is rarer. の
|
|
128
|
-
* Additionally は項目ではなく、and の前の読点は節をつなぐ読点。名詞の並びは最初の項目に前置き
|
|
129
|
-
* (We shipped the parser)を抱えるので、この確かめは節の並びだけにする。
|
|
130
|
-
* and の後ろだけが節なのは主語の並び(The parser, the renderer and the exporter shipped.)なので外さない。
|
|
71
|
+
* and / or で始まる項目で、前の並びは閉じている(offering, giving, or receiving, directly or indirectly)。
|
|
72
|
+
* 次の並びはその項目から始まる。項目が動詞で始まれば、その目的語から(Develop, maintain, and track courses, materials and events)。
|
|
73
|
+
* 項目が残らなければ、後ろは新しい句の頭。導入の句(directly or indirectly,)を外す。
|
|
131
74
|
*/
|
|
132
|
-
const
|
|
133
|
-
const
|
|
134
|
-
if (
|
|
135
|
-
|
|
75
|
+
const afterClosedList = (view: View): View => {
|
|
76
|
+
const closing = findLast(view, "closed");
|
|
77
|
+
if (closing === undefined) return view;
|
|
78
|
+
const { scope } = view.list;
|
|
79
|
+
const conjunction = firstAt(scope, "conjunction", closing.item);
|
|
80
|
+
const body = { start: conjunction === -1 ? closing.item.start : conjunction + 1, end: closing.item.end };
|
|
81
|
+
const head = firstAt(scope, "content", body);
|
|
82
|
+
const rest = VERBAL.has(scope.sentence.tokens[head]?.pos ?? "") ? { start: head + 1, end: body.end } : body;
|
|
83
|
+
return hasContent(scope, rest) ? { ...after(view, closing), pre: rest } : withoutLead(after(view, closing));
|
|
136
84
|
};
|
|
137
85
|
|
|
138
86
|
/**
|
|
139
|
-
*
|
|
140
|
-
*
|
|
87
|
+
* 例の句(such as / including / e.g.)のあとが並び。句の前の項目は並びではない(the screen lock on your phone, such as a PIN or
|
|
88
|
+
* phone-based fingerprint は 2 つ)。句の中の項目の形が揃わなければ句で切らない(materials such as green steel, utilizing ..., and
|
|
89
|
+
* adopting ... / (e.g., by location, contract type, or contract preference))。句の中に and / or があれば句はもう閉じていて、
|
|
90
|
+
* 句ごと 1 つの項目(apples, oranges such as navels and mandarins, and pears)。
|
|
141
91
|
*/
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const form = token.features?.["VerbForm"];
|
|
151
|
-
return form !== undefined && VERB_FORMS.has(form) ? form : undefined;
|
|
92
|
+
const fromExample = (view: View): View => {
|
|
93
|
+
const phrase = findLast(view, "example");
|
|
94
|
+
if (phrase === undefined) return view;
|
|
95
|
+
const { scope } = view.list;
|
|
96
|
+
const examples = { start: exampleEnd(scope, phrase.item), end: phrase.item.end };
|
|
97
|
+
if (hasListConjunction(scope, examples)) return view;
|
|
98
|
+
const inPhrase = contentOnlyWith(after(view, phrase), examples);
|
|
99
|
+
return sameShapes(inPhrase) ? inPhrase : view;
|
|
152
100
|
};
|
|
153
101
|
|
|
154
|
-
/**
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
const opening = item[at];
|
|
158
|
-
if (opening === undefined) return undefined;
|
|
159
|
-
const form = words.has(opening.surface.toLowerCase()) ? "Ger" : verbFormOf(opening);
|
|
160
|
-
return form === undefined ? undefined : { at, form };
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
const hasParticiple = (item: readonly Token[], form: string): boolean => item.some((token) => verbFormOf(token) === form);
|
|
102
|
+
/** 解析器は過去形と過去分詞(fixed)を見分けられない。動詞のある項目のあとの「過去分詞」の並びは、述語の並びと読む。 */
|
|
103
|
+
const pastPredicates = (scope: ItemScope, first: TokenRange, form: string, afterItem: TokenRange): boolean =>
|
|
104
|
+
form === "Part" && participleOpening(scope, afterItem)?.form === "Part" && hasVerb(scope, first);
|
|
164
105
|
|
|
165
106
|
/**
|
|
166
107
|
* 最初より後ろの項目が分詞で始まるとき。最初の項目にも同じ形の分詞があれば分詞の並び
|
|
@@ -171,96 +112,54 @@ const hasParticiple = (item: readonly Token[], form: string): boolean => item.so
|
|
|
171
112
|
* 句は挿入で、並びは句の後ろだけ(relief, including an injunction, in any court ... and without / including before the date, to a
|
|
172
113
|
* Recipient ... “confidential”, “proprietary”, or the like)。
|
|
173
114
|
*/
|
|
174
|
-
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
const rest = items.slice(at + 1);
|
|
185
|
-
const predicates = rest.some((item) => VERBAL.has(shapeOf(item) ?? "")) || pastPredicates(first, opening.form, after, words);
|
|
186
|
-
if (hasParticiple(first, opening.form) || predicates) return items;
|
|
187
|
-
const inPhrase = withoutLead([phrase.slice(opening.at + 1), ...rest].filter((item) => item.some(isContent)));
|
|
188
|
-
return new Set(inPhrase.map(shapeOf)).size > 1 ? rest : inPhrase;
|
|
115
|
+
const fromParticiplePhrase = (view: View, afterItem: TokenRange): View => {
|
|
116
|
+
const { scope } = view.list;
|
|
117
|
+
const [first, phrase] = [firstOf(view), findAfterFirst(view, "participle")];
|
|
118
|
+
const opening = phrase === undefined ? undefined : participleOpening(scope, phrase.item);
|
|
119
|
+
if (first === undefined || phrase === undefined || opening === undefined) return view;
|
|
120
|
+
const rest = after(view, phrase);
|
|
121
|
+
const predicates = some(rest, "verbalShape") || pastPredicates(scope, first.item, opening.form, afterItem);
|
|
122
|
+
if (hasParticiple(scope, first.item, opening.form) || predicates) return view;
|
|
123
|
+
const inPhrase = withoutLead(contentOnlyWith(rest, { start: opening.at + 1, end: phrase.item.end }));
|
|
124
|
+
return sameShapes(inPhrase) ? inPhrase : rest;
|
|
189
125
|
};
|
|
190
126
|
|
|
191
|
-
/** 大文字小文字も比べる。頭文字の E.G. Evans / I.E. Evans は e.g. / i.e. ではない。文頭の句の前には項目が無いので、大文字で始まる句は要らない。 */
|
|
192
|
-
const sameSurfaces = (tokens: readonly Token[], words: readonly Token[]): boolean =>
|
|
193
|
-
tokens.length === words.length && words.every((word, index) => tokens[index]?.surface === word.surface);
|
|
194
|
-
|
|
195
|
-
/** 項目の中で、and / or と同じ深さにある最後の例の句(such as / e.g.)の直後の位置。無ければ -1。 */
|
|
196
|
-
const exampleEnd = (clause: Clause, level: number, item: readonly Token[]): number =>
|
|
197
|
-
item.reduce((end, token, at) => {
|
|
198
|
-
const words = clause.words.example.find(({ tokens = [] }) => tokens.length > 0 && sameSurfaces(item.slice(at, at + tokens.length), tokens))?.tokens ?? [];
|
|
199
|
-
return words.length > 0 && clause.depths[clause.tokens.indexOf(token)] === level ? at + words.length : end;
|
|
200
|
-
}, -1);
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* 例の句(such as / including / e.g.)のあとが並び。句の前の項目は並びではない(the screen lock on your phone, such as a PIN or
|
|
204
|
-
* phone-based fingerprint は 2 つ)。句の中の項目の形が揃わなければ句で切らない(materials such as green steel, utilizing ..., and
|
|
205
|
-
* adopting ... / (e.g., by location, contract type, or contract preference))。句の中に and / or があれば句はもう閉じていて、
|
|
206
|
-
* 句ごと 1 つの項目(apples, oranges such as navels and mandarins, and pears)。
|
|
207
|
-
*/
|
|
208
|
-
const fromExample = (clause: Clause, at: number, items: readonly Token[][]): readonly Token[][] => {
|
|
209
|
-
const level = clause.depths[at] ?? 0;
|
|
210
|
-
const phraseAt = items.findLastIndex((item) => exampleEnd(clause, level, item) !== -1);
|
|
211
|
-
const phrase = items[phraseAt];
|
|
212
|
-
if (phrase === undefined) return items;
|
|
213
|
-
const examples = phrase.slice(exampleEnd(clause, level, phrase));
|
|
214
|
-
if (examples.some((token) => LIST_CONJUNCTION.has(token.surface.toLowerCase()))) return items;
|
|
215
|
-
const rest = items.slice(phraseAt + 1);
|
|
216
|
-
const inPhrase = [examples, ...rest].filter((item) => item.some(isContent));
|
|
217
|
-
return new Set(inPhrase.map(shapeOf)).size > 1 ? items : inPhrase;
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
const APPOSITIVE_ANCHOR = new Set(["NOUN", "PROPN"]);
|
|
221
|
-
|
|
222
127
|
/**
|
|
223
128
|
* 名詞のすぐ後ろの、読点で挟まれた X and Y は同格(two HPV types, HPV16 and HPV18, that account / Governments, both state and
|
|
224
129
|
* federal, spend)。項目が 2 つに見え、and の前に読点が無く、and の後ろの項目が読点で閉じ、後ろの 2 つに動詞が無いときに同格と読む。
|
|
225
130
|
* 2 つを結ぶ同格に Oxford comma は打たないので、and の前に読点があれば 3 つの並び(the subcommittee, full committee, and
|
|
226
131
|
* chamber levels, as well as)。読点の無い本当の並び(apples, pears and plums, then ...)はこの形と見分けられず、判定から外れる。
|
|
132
|
+
* 閉じた読点のあとに and / or が続くなら、並びのあとに節をつないでいる(apples, pears and plums, and went home)。
|
|
227
133
|
*/
|
|
228
|
-
const isAppositive = (
|
|
229
|
-
const [anchor, head] =
|
|
230
|
-
if (
|
|
231
|
-
const end =
|
|
232
|
-
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
return closed && APPOSITIVE_ANCHOR.has(lastContent(anchor)?.pos ?? "") && !hasVerb(head) && !hasVerb(after);
|
|
134
|
+
const isAppositive = (scope: ItemScope, at: number, view: View, afterItem: TokenRange): boolean => {
|
|
135
|
+
const [anchor, head] = [firstOf(view), secondOf(view)];
|
|
136
|
+
if (sizeOf(view) !== 2 || anchor === undefined || head === undefined || commaBefore(scope, at)) return false;
|
|
137
|
+
const end = afterItem.end;
|
|
138
|
+
const joinsClause = isListConjunction(scope.sentence.tokens[end + 1]);
|
|
139
|
+
const closed = scope.sentence.tokens[end]?.surface === "," && scope.sentence.depths[end] === scope.sentence.depths[at] && !joinsClause;
|
|
140
|
+
return closed && APPOSITIVE_ANCHOR.has(lastContent(scope, anchor.item)?.pos ?? "") && !hasVerb(scope, head.item) && !hasVerb(scope, afterItem);
|
|
236
141
|
};
|
|
237
142
|
|
|
238
|
-
/** 副詞を飛ばした頭の形。explain and justify と ultimately ensure は同じ動詞の項目。 */
|
|
239
|
-
const leadShape = (item: readonly Token[]): string | undefined => shapeOf(item.filter((token) => token.pos !== "ADV"));
|
|
240
|
-
|
|
241
143
|
/**
|
|
242
144
|
* and の後ろの項目に読点と、同じ形の項目を連れた and / or が続くなら、この and は項目の中にある(searches and seizures, and
|
|
243
145
|
* the Eighth's ban)。頭の形か、節かどうかが違えば別の節をつなぐ and で、この and までが並び(apples, pears and plums, and went home / and figs fell)。
|
|
244
146
|
*/
|
|
245
|
-
const listContinues = (
|
|
246
|
-
const next =
|
|
247
|
-
if (
|
|
248
|
-
const following = itemAfter(
|
|
249
|
-
const shape = leadShape(following);
|
|
250
|
-
return shape !== undefined && shape === leadShape(
|
|
147
|
+
const listContinues = (scope: ItemScope, afterItem: TokenRange): boolean => {
|
|
148
|
+
const next = afterItem.end;
|
|
149
|
+
if (scope.sentence.tokens[next]?.surface !== "," || !isListConjunction(scope.sentence.tokens[next + 1])) return false;
|
|
150
|
+
const following = itemAfter(scope, next + 1);
|
|
151
|
+
const shape = leadShape(scope, following);
|
|
152
|
+
return shape !== undefined && shape === leadShape(scope, afterItem) && isClause(scope, following) === isClause(scope, afterItem);
|
|
251
153
|
};
|
|
252
154
|
|
|
253
|
-
const isPluralNounPhrase = (tokens: readonly Token[]): boolean =>
|
|
254
|
-
tokens.filter(isContent).every((token) => NOUN_PHRASE_TAIL.has(token.pos)) && lastContent(tokens)?.features?.["Number"] === "Plur";
|
|
255
|
-
|
|
256
155
|
/**
|
|
257
156
|
* 語のあとが複数形の名詞句なら、語は名詞にかかる語で、2 つはもう揃っている(the renderer in both modes and the exporter)。
|
|
258
157
|
* and の後ろも冠詞の無い複数形の名詞句なら、2 つを結ぶ語(both project goals and business goals)。
|
|
259
158
|
*/
|
|
260
|
-
const pairComplete = (member:
|
|
261
|
-
const end =
|
|
262
|
-
const partner = end === -1 ?
|
|
263
|
-
return isPluralNounPhrase(member) && !(isPluralNounPhrase(partner) && !
|
|
159
|
+
const pairComplete = (scope: ItemScope, member: TokenRange, afterItem: TokenRange): boolean => {
|
|
160
|
+
const end = firstAt(scope, "conjunction", afterItem);
|
|
161
|
+
const partner = end === -1 ? afterItem : { start: afterItem.start, end };
|
|
162
|
+
return isPluralNounPhrase(scope, member) && !(isPluralNounPhrase(scope, partner) && !hasDeterminer(scope, partner));
|
|
264
163
|
};
|
|
265
164
|
|
|
266
165
|
/**
|
|
@@ -268,31 +167,14 @@ const pairComplete = (member: readonly Token[], after: readonly Token[]): boolea
|
|
|
268
167
|
* and / or がまだ無く、読点も無ければ、この and / or はその 2 つを結ぶ(the Key Terms between Provider and Customer, and any policies)。
|
|
269
168
|
* 相手でなければ語は名詞にかかるだけ(the impact of either option and implementation)。括弧の中の語は外の接続詞と組まない。
|
|
270
169
|
*/
|
|
271
|
-
const pairsInLastItem = (
|
|
272
|
-
const last =
|
|
273
|
-
const conjunction =
|
|
274
|
-
const
|
|
275
|
-
const opener = last.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
if (opener === -1 || commaBefore(clause.tokens, at) || pairComplete(member, after)) return false;
|
|
280
|
-
return !member.some((token) => LIST_CONJUNCTION.has(token.surface.toLowerCase()));
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
/** 名詞にかかる語。解析器は分詞を過去形とも読む(registered or certified mail の certified)ので、動詞も数える。 */
|
|
284
|
-
const MODIFIER = new Set(["ADJ", "VERB"]);
|
|
285
|
-
|
|
286
|
-
const isModifier = (token: Token | undefined): boolean => token?.pos === "ADJ" || (token !== undefined && isParticiple(token));
|
|
287
|
-
|
|
288
|
-
const NOUN_PHRASE_TAIL = new Set(["ADJ", "NOUN", "PROPN"]);
|
|
289
|
-
|
|
290
|
-
/** 修飾語と名詞だけの句(certified mail / artificial flavor)。冠詞や目的語を連れた動詞(adopt their resources)は違う。 */
|
|
291
|
-
const isModifiedNoun = (item: readonly Token[]): boolean => {
|
|
292
|
-
const [head, ...tail] = item.filter((token) => token.pos !== "PUNCT" && token.pos !== "X");
|
|
293
|
-
return (
|
|
294
|
-
MODIFIER.has(head?.pos ?? "") && tail.length > 0 && tail.every((token) => NOUN_PHRASE_TAIL.has(token.pos)) && APPOSITIVE_ANCHOR.has(tail.at(-1)?.pos ?? "")
|
|
295
|
-
);
|
|
170
|
+
const pairsInLastItem = (scope: ItemScope, at: number, view: View, afterItem: TokenRange): boolean => {
|
|
171
|
+
const last = lastOf(view)?.item ?? EMPTY;
|
|
172
|
+
const conjunction = scope.sentence.tokens[at]?.surface.toLowerCase() ?? "";
|
|
173
|
+
const openers = scope.sentence.pairOpeners.get(conjunction)?.get(scope.sentence.depths[at] ?? 0) ?? [];
|
|
174
|
+
const opener = openers[lowerBound(openers, last.end) - 1] ?? -1;
|
|
175
|
+
if (opener < last.start || commaBefore(scope, at)) return false;
|
|
176
|
+
const member = { start: opener + 1, end: last.end };
|
|
177
|
+
return !pairComplete(scope, member, afterItem) && !hasListConjunction(scope, member);
|
|
296
178
|
};
|
|
297
179
|
|
|
298
180
|
/**
|
|
@@ -300,77 +182,90 @@ const isModifiedNoun = (item: readonly Token[]): boolean => {
|
|
|
300
182
|
* registered or certified mail)。前の項目も修飾語で終われば、修飾語の並び(red, white and blue flags)。and / or の前に読点があれば、
|
|
301
183
|
* 項目の区切り(Federal government, military, and agricultural workers)。
|
|
302
184
|
*/
|
|
303
|
-
const sharesNoun = (
|
|
304
|
-
const [previous, last] =
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
return isModifier(lone[0]) && !isModifier(lastContent(previous)) && isModifiedNoun(after);
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
/** 頭の語のあとに前置詞の句を連れた項目(updates on the Google Doc)。 */
|
|
311
|
-
const hasPrepositionalTail = (item: readonly Token[]): boolean => {
|
|
312
|
-
const head = item.findIndex(isContent);
|
|
313
|
-
return item.some((token, index) => index > head && token.pos === "ADP");
|
|
185
|
+
const sharesNoun = (scope: ItemScope, at: number, view: View, afterItem: TokenRange): boolean => {
|
|
186
|
+
const [previous, last] = [secondLastOf(view), lastOf(view)];
|
|
187
|
+
if (commaBefore(scope, at) || previous === undefined || last === undefined || contentCount(scope, last.item) !== 1) return false;
|
|
188
|
+
return isModifier(firstContent(scope, last.item)) && !isModifier(lastContent(scope, previous.item)) && isModifiedNoun(scope, afterItem);
|
|
314
189
|
};
|
|
315
190
|
|
|
316
191
|
/**
|
|
317
192
|
* and / or の後ろの最初の名詞が、最後の項目の前置詞の目的語と同じ品詞で、どの項目の頭とも違う(chat in Slack or Google Hangouts /
|
|
318
193
|
* Teams (beta): 固有名詞どうし)。頭と同じ品詞なら項目とも読める(petitions for waivers and appeals)ので、並びのまま。
|
|
319
194
|
*/
|
|
320
|
-
const
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
const likeLastObject = (items: readonly Token[][], after: readonly Token[]): boolean => {
|
|
325
|
-
const kind = after.find(isNoun)?.pos;
|
|
326
|
-
return kind !== undefined && lastNoun(items.at(-1) ?? [])?.pos === kind && items.every((item) => item.find(isContent)?.pos !== kind);
|
|
195
|
+
const likeLastObject = (scope: ItemScope, view: View, afterItem: TokenRange): boolean => {
|
|
196
|
+
const kind = firstNoun(scope, afterItem)?.pos;
|
|
197
|
+
if (kind === undefined) return false;
|
|
198
|
+
return lastNoun(scope, lastOf(view)?.item ?? EMPTY)?.pos === kind && every(view, kind === "NOUN" ? "notNounHead" : "notProperNounHead");
|
|
327
199
|
};
|
|
328
200
|
|
|
329
201
|
/**
|
|
330
202
|
* どの項目も前置詞の句を連れ、and / or の後ろだけが連れておらず、その目的語に似ていれば、and / or は最後の項目の前置詞の目的語を結ぶ
|
|
331
203
|
* (updates on the Google Doc, chat in Slack or Google Hangouts は 2 つ)。and / or の前に読点があれば、項目の区切りなので並び。
|
|
332
204
|
*/
|
|
333
|
-
const joinsObjects = (
|
|
334
|
-
!commaBefore(
|
|
335
|
-
|
|
336
|
-
!
|
|
337
|
-
!hasVerb(
|
|
338
|
-
likeLastObject(
|
|
205
|
+
const joinsObjects = (scope: ItemScope, at: number, view: View, afterItem: TokenRange): boolean =>
|
|
206
|
+
!commaBefore(scope, at) &&
|
|
207
|
+
every(view, "prepositionalTail") &&
|
|
208
|
+
!hasAdposition(scope, afterItem) &&
|
|
209
|
+
!hasVerb(scope, afterItem) &&
|
|
210
|
+
likeLastObject(scope, view, afterItem);
|
|
339
211
|
|
|
340
212
|
/** and / or が並びの最後の継ぎ目ではなく、最後の項目の中にある。 */
|
|
341
|
-
const insideLastItem = (
|
|
342
|
-
pairsInLastItem(
|
|
213
|
+
const insideLastItem = (scope: ItemScope, at: number, view: View, afterItem: TokenRange): boolean =>
|
|
214
|
+
pairsInLastItem(scope, at, view, afterItem) || sharesNoun(scope, at, view, afterItem) || joinsObjects(scope, at, view, afterItem);
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* 節を並べるなら、どの項目も節。Additionally, others can learn, and the mistake is rarer. の Additionally は項目ではなく、
|
|
218
|
+
* and の前の読点は節をつなぐ読点。名詞の並びは最初の項目に前置き(We shipped the parser)を抱えるので、この確かめは節の並びだけにする。
|
|
219
|
+
* and の後ろだけが節なのは主語の並び(The parser, the renderer and the exporter shipped.)なので外さない。
|
|
220
|
+
* 動詞で始まる項目を並べるなら、どの項目にも動詞がある。The scope, in contrast, is larger, and covers ... の The scope は項目ではない。
|
|
221
|
+
*/
|
|
222
|
+
const itemsAgree = (scope: ItemScope, view: View, afterItem: TokenRange, shape: string): boolean => {
|
|
223
|
+
const last = lastOf(view);
|
|
224
|
+
const clausesAgree = last === undefined || !isClause(scope, last.item) || (isClause(scope, afterItem) && every(view, "isClause"));
|
|
225
|
+
return clausesAgree && (!VERBAL.has(shape) || every(view, "hasVerb"));
|
|
226
|
+
};
|
|
343
227
|
|
|
344
228
|
/**
|
|
345
229
|
* 読点で区切った項目が and / or の前に 2 つ以上あり、最後の項目と and の後ろが同じ形のときだけ並列。
|
|
346
230
|
* 導入の読点(After the review, the team fixed the bug and shipped it.)や、節をつなぐ読点
|
|
347
231
|
* (We tested it, and the team shipped it.)は、Oxford comma を打つかどうかの選択を見せない。
|
|
232
|
+
* 題名の読点は題名を付けた人のもの。書き手の流儀の票にしない。
|
|
233
|
+
*/
|
|
234
|
+
const listAt = (list: ItemList, at: number): boolean | undefined => {
|
|
235
|
+
const { scope } = list;
|
|
236
|
+
const afterItem = itemAfter(scope, at);
|
|
237
|
+
const items = fromParticiplePhrase(fromExample(afterClosedList(withoutLead(wholeList(list)))), afterItem);
|
|
238
|
+
if (listContinues(scope, afterItem) || isAppositive(scope, at, items, afterItem) || insideLastItem(scope, at, items, afterItem)) return undefined;
|
|
239
|
+
const last = lastOf(items);
|
|
240
|
+
const shape = last === undefined ? undefined : shapeOf(scope, last.item);
|
|
241
|
+
if (sizeOf(items) < 2 || shape === undefined || shape !== shapeOf(scope, afterItem)) return undefined;
|
|
242
|
+
return itemsAgree(scope, items, afterItem, shape) ? commaBefore(scope, at) : undefined;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
const isJudgedConjunction = (token: Token, at: number): boolean => at > 0 && isListConjunction(token);
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* 文の and / or ごとの、並びの判定(読点を打てば true、打たなければ false、並びでなければ undefined)。文は一度だけ読み、
|
|
249
|
+
* 項目は and / or の位置まで読み進めた並びから取る。
|
|
348
250
|
*/
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
const
|
|
352
|
-
const
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
if (!clausesAgree(items, after) || !predicatesAgree(items, shape)) return undefined;
|
|
358
|
-
return commaBefore(clause.tokens, at);
|
|
251
|
+
export const listVerdicts = (tokens: readonly Token[], words: ListWords, source: string): (boolean | undefined)[] => {
|
|
252
|
+
if (!tokens.some(isJudgedConjunction)) return [];
|
|
253
|
+
const sentence = listSentenceOf(tokens, words, source);
|
|
254
|
+
const readItems = listReader(sentence);
|
|
255
|
+
return tokens.flatMap((token, at) => {
|
|
256
|
+
if (!isJudgedConjunction(token, at)) return [];
|
|
257
|
+
return [sentence.inCitedTitle(at) ? undefined : listAt(readItems(at), at)];
|
|
258
|
+
});
|
|
359
259
|
};
|
|
360
260
|
|
|
361
261
|
/**
|
|
362
262
|
* 3 つ以上の並列の最後の and / or の前に読点を打つか。Oxford comma。
|
|
363
263
|
*
|
|
364
264
|
* どちらが正しいかは決めない。スタイルガイドで割れる論点に立場を取ると rule ごと無視される。
|
|
365
|
-
* 見るのは 1 つの文書で揃っているかだけ。spec §12.3
|
|
265
|
+
* 見るのは 1 つの文書で揃っているかだけ。spec §12.3。最初に判定できた並びで決める。
|
|
366
266
|
*/
|
|
367
|
-
const oxfordIn = (tokens: readonly Token[], words: ListWords): boolean | undefined =>
|
|
368
|
-
|
|
369
|
-
return tokens.reduce<boolean | undefined>(
|
|
370
|
-
(found, token, at) => found ?? (at > 0 && LIST_CONJUNCTION.has(token.surface.toLowerCase()) ? listAt(clause, at) : undefined),
|
|
371
|
-
undefined,
|
|
372
|
-
);
|
|
373
|
-
};
|
|
267
|
+
const oxfordIn = (tokens: readonly Token[], words: ListWords, source: string): boolean | undefined =>
|
|
268
|
+
listVerdicts(tokens, words, source).find((verdict) => verdict !== undefined);
|
|
374
269
|
|
|
375
270
|
const patternsOf = (lexicon: Lexicon | undefined): ReadonlySet<string> => new Set((lexicon ?? []).map((entry) => entry.pattern.toLowerCase()));
|
|
376
271
|
|
|
@@ -381,7 +276,7 @@ export const oxfordComma: Detector = (doc, options): Finding[] => {
|
|
|
381
276
|
pair: patternsOf(doc.lexicons["pair-opener"]),
|
|
382
277
|
};
|
|
383
278
|
const judged = doc.sentences.flatMap((sentence) => {
|
|
384
|
-
const oxford = oxfordIn(sentence.tokens ?? [], words);
|
|
279
|
+
const oxford = oxfordIn(sentence.tokens ?? [], words, doc.source);
|
|
385
280
|
return oxford === undefined ? [] : [{ sentence, oxford }];
|
|
386
281
|
});
|
|
387
282
|
const withComma = judged.filter((entry) => entry.oxford).length;
|
|
@@ -20,10 +20,13 @@ type Run = { readonly tokens: readonly Token[]; readonly last: number; readonly
|
|
|
20
20
|
* 閉じれば、そこまでが 1 つの地名。連なりの外(「に」「の」も 1 字)までは読まない。
|
|
21
21
|
*/
|
|
22
22
|
const closedByUnit = (run: Run, index: number): boolean => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
for (let at = index; at <= run.last; at += 1) {
|
|
24
|
+
const token = run.tokens[at];
|
|
25
|
+
if (token === undefined) return false;
|
|
26
|
+
if (isGeoUnit(token)) return !run.topUnits.has(token.surface);
|
|
27
|
+
if (!isNamePiece(token)) return false;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
27
30
|
};
|
|
28
31
|
|
|
29
32
|
/**
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Lexicon } from "../plugin.ts";
|
|
2
|
+
|
|
3
|
+
type Span = { readonly start: number; readonly end: number };
|
|
4
|
+
|
|
5
|
+
/** 雛形の空欄を囲む括弧。記号の形で、どの言語でも同じ。 */
|
|
6
|
+
const BRACKETED = /\[([^[\]\n]{1,60})\]|【([^【】\n]{1,30})】|[([^[]\n]{1,30})]/gu;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 括弧のすぐ後ろ。Markdown のリンク([text](url)、[text][ref])と参照の定義([ref]: url)、
|
|
10
|
+
* 値が続く見出しの札(【氏名】山田、【日付】2024年)は空欄ではない。助詞(【会社名】の)や空白・句読点が続くなら空欄。
|
|
11
|
+
*/
|
|
12
|
+
const FILLED_AFTER = /^[([::\p{Script=Han}\p{Script=Katakana}\p{Script=Latin}\p{N}]/u;
|
|
13
|
+
|
|
14
|
+
const innerOf = (match: RegExpExecArray): string => (match[1] ?? match[2] ?? match[3] ?? "").trim().toLowerCase();
|
|
15
|
+
|
|
16
|
+
/** 括弧の中身が語彙表の語そのものか、その語で始まって空白・アポストロフィが続くか([Your Name]、[Insert Date])。 */
|
|
17
|
+
const holdsWord = (inner: string, words: Lexicon): boolean =>
|
|
18
|
+
words.some((word) => {
|
|
19
|
+
const pattern = word.pattern.toLowerCase();
|
|
20
|
+
return inner === pattern || (inner.startsWith(pattern) && /^[\s'’]/u.test(inner.slice(pattern.length)));
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/** 文の中の、埋め忘れた雛形の空欄([Your Name]、【会社名】)の範囲。words は空欄に書く語。 */
|
|
24
|
+
export const placeholderSpans = (text: string, words: Lexicon): Span[] =>
|
|
25
|
+
[...text.matchAll(BRACKETED)]
|
|
26
|
+
.filter((match) => !FILLED_AFTER.test(text.slice(match.index + match[0].length)) && holdsWord(innerOf(match), words))
|
|
27
|
+
.map((match) => ({ start: match.index, end: match.index + match[0].length }));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** 見せる前後の字数。記号 1 つの指摘は、周りの言葉が無いとどこか分からない。 */
|
|
2
|
+
const QUOTE_REACH = 20;
|
|
3
|
+
|
|
4
|
+
/** text の start から end の前後を、空白をならして引く。 */
|
|
5
|
+
export const quoteAround = (text: string, start: number, end: number = start + 1): string =>
|
|
6
|
+
text
|
|
7
|
+
.slice(Math.max(0, start - QUOTE_REACH), end + QUOTE_REACH)
|
|
8
|
+
.replace(/\s+/gu, " ")
|
|
9
|
+
.trim();
|