chaffjs 0.24.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +179 -42
- package/dist/adapter-import.d.ts +2 -0
- package/dist/adapter-import.d.ts.map +1 -0
- package/dist/adapter-import.js +11 -0
- package/dist/adapter-import.js.map +1 -0
- package/dist/adapter-load.d.ts.map +1 -1
- package/dist/adapter-load.js +2 -9
- package/dist/adapter-load.js.map +1 -1
- package/dist/ai-score/human-shares.d.ts +4 -0
- package/dist/ai-score/human-shares.d.ts.map +1 -0
- package/dist/ai-score/human-shares.js +205 -0
- package/dist/ai-score/human-shares.js.map +1 -0
- package/dist/ai-score/lint-line.d.ts +4 -0
- package/dist/ai-score/lint-line.d.ts.map +1 -0
- package/dist/ai-score/lint-line.js +9 -0
- package/dist/ai-score/lint-line.js.map +1 -0
- package/dist/ai-score/of-document.d.ts +7 -0
- package/dist/ai-score/of-document.d.ts.map +1 -0
- package/dist/ai-score/of-document.js +40 -0
- package/dist/ai-score/of-document.js.map +1 -0
- package/dist/ai-score/render.d.ts +24 -0
- package/dist/ai-score/render.d.ts.map +1 -0
- package/dist/ai-score/render.js +100 -0
- package/dist/ai-score/render.js.map +1 -0
- package/dist/ai-score/score.d.ts +77 -0
- package/dist/ai-score/score.d.ts.map +1 -0
- package/dist/ai-score/score.js +52 -0
- package/dist/ai-score/score.js.map +1 -0
- package/dist/ai-score/signals.d.ts +19 -0
- package/dist/ai-score/signals.d.ts.map +1 -0
- package/dist/ai-score/signals.js +30 -0
- package/dist/ai-score/signals.js.map +1 -0
- package/dist/ai-score/text.d.ts +37 -0
- package/dist/ai-score/text.d.ts.map +1 -0
- package/dist/ai-score/text.js +59 -0
- package/dist/ai-score/text.js.map +1 -0
- package/dist/ai-score/view.d.ts +5 -0
- package/dist/ai-score/view.d.ts.map +1 -0
- package/dist/ai-score/view.js +19 -0
- package/dist/ai-score/view.js.map +1 -0
- package/dist/backends/anthropic.d.ts +0 -1
- package/dist/backends/anthropic.d.ts.map +1 -1
- package/dist/backends/anthropic.js +0 -1
- package/dist/backends/anthropic.js.map +1 -1
- package/dist/backends/default-model.d.ts +3 -0
- package/dist/backends/default-model.d.ts.map +1 -0
- package/dist/backends/default-model.js +5 -0
- package/dist/backends/default-model.js.map +1 -0
- package/dist/backends/openai.d.ts +0 -1
- package/dist/backends/openai.d.ts.map +1 -1
- package/dist/backends/openai.js +0 -1
- package/dist/backends/openai.js.map +1 -1
- package/dist/browser/adapter-import.d.ts +2 -0
- package/dist/browser/adapter-import.d.ts.map +1 -0
- package/dist/browser/adapter-import.js +17 -0
- package/dist/browser/adapter-import.js.map +1 -0
- package/dist/browser/bounded-match.d.ts +3 -0
- package/dist/browser/bounded-match.d.ts.map +1 -0
- package/dist/browser/bounded-match.js +4 -0
- package/dist/browser/bounded-match.js.map +1 -0
- package/dist/browser/check-text.d.ts +43 -0
- package/dist/browser/check-text.d.ts.map +1 -0
- package/dist/browser/check-text.js +50 -0
- package/dist/browser/check-text.js.map +1 -0
- package/dist/browser/detectors.d.ts +4 -0
- package/dist/browser/detectors.d.ts.map +1 -0
- package/dist/browser/detectors.js +22 -0
- package/dist/browser/detectors.js.map +1 -0
- package/dist/browser/package-files.d.ts +5 -0
- package/dist/browser/package-files.d.ts.map +1 -0
- package/dist/browser/package-files.js +8 -0
- package/dist/browser/package-files.js.map +1 -0
- package/dist/browser/path.d.ts +9 -0
- package/dist/browser/path.d.ts.map +1 -0
- package/dist/browser/path.js +70 -0
- package/dist/browser/path.js.map +1 -0
- package/dist/browser/working-dir.d.ts +2 -0
- package/dist/browser/working-dir.d.ts.map +1 -0
- package/dist/browser/working-dir.js +3 -0
- package/dist/browser/working-dir.js.map +1 -0
- package/dist/browser-files.d.ts +21 -0
- package/dist/browser-files.d.ts.map +1 -0
- package/dist/browser-files.js +65 -0
- package/dist/browser-files.js.map +1 -0
- package/dist/browser.d.ts +9 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +13 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli-text.d.ts.map +1 -1
- package/dist/cli-text.js +2 -0
- package/dist/cli-text.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/ai-score.d.ts +8 -0
- package/dist/commands/ai-score.d.ts.map +1 -0
- package/dist/commands/ai-score.js +59 -0
- package/dist/commands/ai-score.js.map +1 -0
- package/dist/commands/document-commands.d.ts.map +1 -1
- package/dist/commands/document-commands.js +2 -0
- package/dist/commands/document-commands.js.map +1 -1
- package/dist/config/by-path-problems.d.ts +5 -0
- package/dist/config/by-path-problems.d.ts.map +1 -0
- package/dist/config/by-path-problems.js +11 -0
- package/dist/config/by-path-problems.js.map +1 -0
- package/dist/config/load.d.ts +9 -2
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +21 -8
- package/dist/config/load.js.map +1 -1
- package/dist/config/read.d.ts +2 -0
- package/dist/config/read.d.ts.map +1 -1
- package/dist/config/read.js +4 -1
- package/dist/config/read.js.map +1 -1
- package/dist/config/warnings.d.ts +1 -1
- package/dist/config/warnings.d.ts.map +1 -1
- package/dist/config/warnings.js +3 -1
- package/dist/config/warnings.js.map +1 -1
- package/dist/config/working-dir.d.ts +2 -0
- package/dist/config/working-dir.d.ts.map +1 -0
- package/dist/config/working-dir.js +3 -0
- package/dist/config/working-dir.js.map +1 -0
- package/dist/custom/bounded-match.d.ts +1 -12
- package/dist/custom/bounded-match.d.ts.map +1 -1
- package/dist/custom/bounded-match.js +1 -11
- package/dist/custom/bounded-match.js.map +1 -1
- package/dist/custom/pattern-timeout.d.ts +13 -0
- package/dist/custom/pattern-timeout.d.ts.map +1 -0
- package/dist/custom/pattern-timeout.js +13 -0
- package/dist/custom/pattern-timeout.js.map +1 -0
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +4 -5
- package/dist/detect.js.map +1 -1
- package/dist/detectors/connective-hierarchy.d.ts +16 -0
- package/dist/detectors/connective-hierarchy.d.ts.map +1 -0
- package/dist/detectors/connective-hierarchy.js +68 -0
- package/dist/detectors/connective-hierarchy.js.map +1 -0
- package/dist/detectors/date-year.d.ts +10 -2
- package/dist/detectors/date-year.d.ts.map +1 -1
- package/dist/detectors/date-year.js +44 -8
- package/dist/detectors/date-year.js.map +1 -1
- package/dist/detectors/defined-term-form.d.ts +5 -0
- package/dist/detectors/defined-term-form.d.ts.map +1 -1
- package/dist/detectors/defined-term-form.js +22 -5
- package/dist/detectors/defined-term-form.js.map +1 -1
- package/dist/detectors/missing-final-period.d.ts +17 -0
- package/dist/detectors/missing-final-period.d.ts.map +1 -0
- package/dist/detectors/missing-final-period.js +62 -0
- package/dist/detectors/missing-final-period.js.map +1 -0
- package/dist/detectors/missing-space-after-comma.d.ts +10 -0
- package/dist/detectors/missing-space-after-comma.d.ts.map +1 -0
- package/dist/detectors/missing-space-after-comma.js +42 -0
- package/dist/detectors/missing-space-after-comma.js.map +1 -0
- package/dist/detectors/orthographic-variant.d.ts.map +1 -1
- package/dist/detectors/orthographic-variant.js +44 -17
- package/dist/detectors/orthographic-variant.js.map +1 -1
- package/dist/detectors/party-role-name.d.ts +3 -0
- package/dist/detectors/party-role-name.d.ts.map +1 -0
- package/dist/detectors/party-role-name.js +35 -0
- package/dist/detectors/party-role-name.js.map +1 -0
- package/dist/detectors/quote-without-source.d.ts +17 -0
- package/dist/detectors/quote-without-source.d.ts.map +1 -0
- package/dist/detectors/quote-without-source.js +64 -0
- package/dist/detectors/quote-without-source.js.map +1 -0
- package/dist/detectors/reference-text.js +1 -1
- package/dist/detectors/reference-text.js.map +1 -1
- package/dist/detectors/registry/connective-hierarchy.d.ts +3 -0
- package/dist/detectors/registry/connective-hierarchy.d.ts.map +1 -0
- package/dist/detectors/registry/connective-hierarchy.js +3 -0
- package/dist/detectors/registry/connective-hierarchy.js.map +1 -0
- package/dist/detectors/registry/missing-final-period.d.ts +3 -0
- package/dist/detectors/registry/missing-final-period.d.ts.map +1 -0
- package/dist/detectors/registry/missing-final-period.js +3 -0
- package/dist/detectors/registry/missing-final-period.js.map +1 -0
- package/dist/detectors/registry/missing-space-after-comma.d.ts +3 -0
- package/dist/detectors/registry/missing-space-after-comma.d.ts.map +1 -0
- package/dist/detectors/registry/missing-space-after-comma.js +3 -0
- package/dist/detectors/registry/missing-space-after-comma.js.map +1 -0
- package/dist/detectors/registry/party-role-name.d.ts +3 -0
- package/dist/detectors/registry/party-role-name.d.ts.map +1 -0
- package/dist/detectors/registry/party-role-name.js +3 -0
- package/dist/detectors/registry/party-role-name.js.map +1 -0
- package/dist/detectors/registry/quote-without-source.d.ts +3 -0
- package/dist/detectors/registry/quote-without-source.d.ts.map +1 -0
- package/dist/detectors/registry/quote-without-source.js +3 -0
- package/dist/detectors/registry/quote-without-source.js.map +1 -0
- package/dist/detectors/registry/vague-deadline.d.ts +3 -0
- package/dist/detectors/registry/vague-deadline.d.ts.map +1 -0
- package/dist/detectors/registry/vague-deadline.js +3 -0
- package/dist/detectors/registry/vague-deadline.js.map +1 -0
- package/dist/detectors/run-in-label.d.ts +7 -0
- package/dist/detectors/run-in-label.d.ts.map +1 -0
- package/dist/detectors/run-in-label.js +53 -0
- package/dist/detectors/run-in-label.js.map +1 -0
- package/dist/detectors/sentence-counts.d.ts +3 -1
- package/dist/detectors/sentence-counts.d.ts.map +1 -1
- package/dist/detectors/sentence-counts.js +11 -4
- package/dist/detectors/sentence-counts.js.map +1 -1
- package/dist/detectors/sentence-ending.d.ts +1 -1
- package/dist/detectors/sentence-ending.d.ts.map +1 -1
- package/dist/detectors/sentence-ending.js +2 -1
- package/dist/detectors/sentence-ending.js.map +1 -1
- package/dist/detectors/structure-tree.d.ts +4 -1
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +21 -2
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/unbalanced-bracket.d.ts +1 -1
- package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
- package/dist/detectors/unbalanced-bracket.js +23 -11
- package/dist/detectors/unbalanced-bracket.js.map +1 -1
- package/dist/detectors/vague-deadline.d.ts +25 -0
- package/dist/detectors/vague-deadline.d.ts.map +1 -0
- package/dist/detectors/vague-deadline.js +97 -0
- package/dist/detectors/vague-deadline.js.map +1 -0
- package/dist/furigana.d.ts +7 -0
- package/dist/furigana.d.ts.map +1 -0
- package/dist/furigana.js +16 -0
- package/dist/furigana.js.map +1 -0
- package/dist/genre-load.d.ts.map +1 -1
- package/dist/genre-load.js +5 -7
- package/dist/genre-load.js.map +1 -1
- package/dist/grade/ai-score.d.ts +16 -0
- package/dist/grade/ai-score.d.ts.map +1 -0
- package/dist/grade/ai-score.js +17 -0
- package/dist/grade/ai-score.js.map +1 -0
- package/dist/grade/finding.d.ts +6 -0
- package/dist/grade/finding.d.ts.map +1 -0
- package/dist/grade/finding.js +13 -0
- package/dist/grade/finding.js.map +1 -0
- package/dist/grade/grade-item.d.ts.map +1 -1
- package/dist/grade/grade-item.js +4 -11
- package/dist/grade/grade-item.js.map +1 -1
- package/dist/grade/render-variants.d.ts.map +1 -1
- package/dist/grade/render-variants.js +3 -0
- package/dist/grade/render-variants.js.map +1 -1
- package/dist/grade/render.d.ts.map +1 -1
- package/dist/grade/render.js +1 -0
- package/dist/grade/render.js.map +1 -1
- package/dist/grade/result.d.ts +3 -0
- package/dist/grade/result.d.ts.map +1 -1
- package/dist/grade/results-read.d.ts.map +1 -1
- package/dist/grade/results-read.js +13 -2
- package/dist/grade/results-read.js.map +1 -1
- package/dist/grade/summary.d.ts +3 -0
- package/dist/grade/summary.d.ts.map +1 -1
- package/dist/grade/summary.js +6 -0
- package/dist/grade/summary.js.map +1 -1
- package/dist/grade/text.d.ts +2 -0
- package/dist/grade/text.d.ts.map +1 -1
- package/dist/grade/text.js +2 -0
- package/dist/grade/text.js.map +1 -1
- package/dist/grade/variants-text.d.ts +3 -0
- package/dist/grade/variants-text.d.ts.map +1 -1
- package/dist/grade/variants-text.js +4 -0
- package/dist/grade/variants-text.js.map +1 -1
- package/dist/grade/variants.d.ts +3 -0
- package/dist/grade/variants.d.ts.map +1 -1
- package/dist/grade/variants.js +1 -0
- package/dist/grade/variants.js.map +1 -1
- package/dist/grade-api.d.ts +1 -0
- package/dist/grade-api.d.ts.map +1 -1
- package/dist/grade-api.js +2 -1
- package/dist/grade-api.js.map +1 -1
- package/dist/judge.d.ts +0 -1
- package/dist/judge.d.ts.map +1 -1
- package/dist/judge.js +0 -1
- package/dist/judge.js.map +1 -1
- package/dist/known-genres.js +2 -2
- package/dist/known-genres.js.map +1 -1
- package/dist/package-files.d.ts +6 -0
- package/dist/package-files.d.ts.map +1 -0
- package/dist/package-files.js +11 -0
- package/dist/package-files.js.map +1 -0
- package/dist/profile/load.d.ts.map +1 -1
- package/dist/profile/load.js +5 -6
- package/dist/profile/load.js.map +1 -1
- package/dist/rule-load.d.ts.map +1 -1
- package/dist/rule-load.js +5 -6
- package/dist/rule-load.js.map +1 -1
- package/dist/rule-offs.js +3 -3
- package/dist/rule-offs.js.map +1 -1
- package/dist/run.js +1 -1
- package/dist/run.js.map +1 -1
- package/dist/structure/date-range.d.ts +4 -0
- package/dist/structure/date-range.d.ts.map +1 -1
- package/dist/structure/date-range.js +23 -3
- package/dist/structure/date-range.js.map +1 -1
- package/dist/structure/issues.d.ts +17 -1
- package/dist/structure/issues.d.ts.map +1 -1
- package/dist/structure/issues.js +54 -5
- package/dist/structure/issues.js.map +1 -1
- package/dist/structure/party-role.d.ts +30 -0
- package/dist/structure/party-role.d.ts.map +1 -0
- package/dist/structure/party-role.js +58 -0
- package/dist/structure/party-role.js.map +1 -0
- package/dist/structure/prose-total.d.ts +28 -0
- package/dist/structure/prose-total.d.ts.map +1 -0
- package/dist/structure/prose-total.js +99 -0
- package/dist/structure/prose-total.js.map +1 -0
- package/dist/structure/reference-text.d.ts +5 -0
- package/dist/structure/reference-text.d.ts.map +1 -1
- package/dist/structure/reference-text.js +17 -4
- package/dist/structure/reference-text.js.map +1 -1
- package/dist/structure/term-prefix.d.ts +18 -0
- package/dist/structure/term-prefix.d.ts.map +1 -0
- package/dist/structure/term-prefix.js +40 -0
- package/dist/structure/term-prefix.js.map +1 -0
- package/dist/structure/total.d.ts +2 -0
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +2 -0
- package/dist/structure/total.js.map +1 -1
- package/dist/structure-shape/baseline-load.d.ts.map +1 -1
- package/dist/structure-shape/baseline-load.js +4 -5
- package/dist/structure-shape/baseline-load.js.map +1 -1
- package/dist/style-load.d.ts.map +1 -1
- package/dist/style-load.js +5 -6
- package/dist/style-load.js.map +1 -1
- package/package.json +24 -3
- package/rules/cliche.yaml +28 -8
- package/rules/connective-hierarchy.yaml +62 -0
- package/rules/date-without-year.yaml +28 -3
- package/rules/defined-term-form.yaml +9 -6
- package/rules/demonstrative-opener-run.yaml +24 -7
- package/rules/missing-final-period.yaml +76 -0
- package/rules/missing-space-after-comma.yaml +57 -0
- package/rules/no-mixed-desumasu.yaml +2 -2
- package/rules/orthographic-variant.yaml +2 -2
- package/rules/party-role-name.yaml +94 -0
- package/rules/quote-without-source.yaml +61 -0
- package/rules/total-mismatch.yaml +8 -8
- package/rules/vague-deadline.yaml +95 -0
- package/rules/weasel-word.yaml +25 -7
- package/skills/chaff/SKILL.md +32 -5
- package/src/adapter-import.ts +3 -0
- package/src/adapter-load.ts +2 -1
- package/src/ai-score/human-shares.ts +207 -0
- package/src/ai-score/lint-line.ts +10 -0
- package/src/ai-score/of-document.ts +46 -0
- package/src/ai-score/render.ts +124 -0
- package/src/ai-score/score.ts +121 -0
- package/src/ai-score/signals.ts +39 -0
- package/src/ai-score/text.ts +103 -0
- package/src/ai-score/view.ts +21 -0
- package/src/backends/anthropic.ts +0 -2
- package/src/backends/default-model.ts +9 -0
- package/src/backends/openai.ts +0 -2
- package/src/browser/adapter-import.ts +19 -0
- package/src/browser/bounded-match.ts +9 -0
- package/src/browser/check-text.ts +106 -0
- package/src/browser/detectors.ts +40 -0
- package/src/browser/import-meta-glob.d.ts +5 -0
- package/src/browser/package-files.ts +13 -0
- package/src/browser/path.ts +73 -0
- package/src/browser/working-dir.ts +3 -0
- package/src/browser-files.ts +87 -0
- package/src/browser.ts +19 -0
- package/src/cli-text.ts +2 -0
- package/src/cli.ts +4 -1
- package/src/commands/ai-score.ts +77 -0
- package/src/commands/document-commands.ts +2 -0
- package/src/config/by-path-problems.ts +17 -0
- package/src/config/load.ts +21 -8
- package/src/config/read.ts +5 -1
- package/src/config/warnings.ts +3 -1
- package/src/config/working-dir.ts +3 -0
- package/src/custom/bounded-match.ts +1 -16
- package/src/custom/pattern-timeout.ts +17 -0
- package/src/detect.ts +4 -5
- package/src/detectors/connective-hierarchy.ts +99 -0
- package/src/detectors/date-year.ts +51 -12
- package/src/detectors/defined-term-form.ts +28 -6
- package/src/detectors/missing-final-period.ts +79 -0
- package/src/detectors/missing-space-after-comma.ts +54 -0
- package/src/detectors/orthographic-variant.ts +59 -18
- package/src/detectors/party-role-name.ts +44 -0
- package/src/detectors/quote-without-source.ts +90 -0
- package/src/detectors/reference-text.ts +1 -1
- package/src/detectors/registry/connective-hierarchy.ts +4 -0
- package/src/detectors/registry/missing-final-period.ts +4 -0
- package/src/detectors/registry/missing-space-after-comma.ts +4 -0
- package/src/detectors/registry/party-role-name.ts +4 -0
- package/src/detectors/registry/quote-without-source.ts +4 -0
- package/src/detectors/registry/vague-deadline.ts +4 -0
- package/src/detectors/run-in-label.ts +60 -0
- package/src/detectors/sentence-counts.ts +13 -4
- package/src/detectors/sentence-ending.ts +3 -2
- package/src/detectors/structure-tree.ts +28 -6
- package/src/detectors/unbalanced-bracket.ts +25 -10
- package/src/detectors/vague-deadline.ts +132 -0
- package/src/furigana.ts +20 -0
- package/src/genre-load.ts +5 -7
- package/src/grade/ai-score.ts +32 -0
- package/src/grade/finding.ts +16 -0
- package/src/grade/grade-item.ts +4 -13
- package/src/grade/render-variants.ts +5 -0
- package/src/grade/render.ts +1 -0
- package/src/grade/result.ts +3 -0
- package/src/grade/results-read.ts +17 -2
- package/src/grade/summary.ts +9 -0
- package/src/grade/text.ts +6 -0
- package/src/grade/variants-text.ts +7 -0
- package/src/grade/variants.ts +4 -0
- package/src/grade-api.ts +3 -1
- package/src/judge.ts +0 -2
- package/src/known-genres.ts +2 -2
- package/src/package-files.ts +15 -0
- package/src/profile/load.ts +5 -6
- package/src/rule-load.ts +5 -6
- package/src/rule-offs.ts +3 -3
- package/src/run.ts +1 -1
- package/src/structure/date-range.ts +28 -3
- package/src/structure/issues.ts +61 -6
- package/src/structure/party-role.ts +94 -0
- package/src/structure/prose-total.ts +135 -0
- package/src/structure/reference-text.ts +17 -4
- package/src/structure/term-prefix.ts +54 -0
- package/src/structure/total.ts +4 -0
- package/src/structure-shape/baseline-load.ts +4 -5
- package/src/style-load.ts +5 -6
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { quoteAround } from "./quote-around.js";
|
|
2
|
+
/** A word of three letters or more (a possessive 's may follow), a comma, and a lower-case word of three letters or more. */
|
|
3
|
+
const JOINED = /(?<![\p{L}\p{N}])[A-Za-z]{3,}(?:['’]s)?,[a-z]{3,}(?![\p{L}\p{N}])/u;
|
|
4
|
+
/** Characters that make a run of text an address, a path, a parameter or data (a=b, a/b, a.b, @a, #a, a_b, 3,abc). */
|
|
5
|
+
const DATA_MARK = /[/\\=@#:.&?_|+*~$%^<>{}[\]\p{N}]/u;
|
|
6
|
+
/** Opening and closing marks a word of prose may carry ("(and,then)"), and the sentence's own end ("and,then."). */
|
|
7
|
+
const OPENERS = "(\"'“‘[";
|
|
8
|
+
const CLOSERS = ")\"'”’].,;!?";
|
|
9
|
+
/** A run quoted whole, inside brackets or not ("true,false", ("true,false")): a value written out, not two words of the sentence. */
|
|
10
|
+
const QUOTED_WHOLE = /^[([]*["'“‘].*["'”’][)\].,;!?]*$/u;
|
|
11
|
+
/** A run of text between whitespace. */
|
|
12
|
+
const RUN = /\S+/gu;
|
|
13
|
+
const COMMA = ",";
|
|
14
|
+
/** The run without the marks around it, trimmed by scanning rather than by a pattern that could backtrack. */
|
|
15
|
+
const bareOf = (run) => {
|
|
16
|
+
const chars = run.split("");
|
|
17
|
+
const start = chars.findIndex((char) => !OPENERS.includes(char));
|
|
18
|
+
const end = chars.findLastIndex((char) => !CLOSERS.includes(char));
|
|
19
|
+
return start === -1 || end < start ? "" : run.slice(start, end + 1);
|
|
20
|
+
};
|
|
21
|
+
/** A run holding one comma and nothing that marks it as data. */
|
|
22
|
+
const isProseRun = (run) => {
|
|
23
|
+
const bare = bareOf(run);
|
|
24
|
+
return bare.split(COMMA).length === 2 && !DATA_MARK.test(bare) && !QUOTED_WHOLE.test(run);
|
|
25
|
+
};
|
|
26
|
+
/** Each run is read once, so a long line of values costs one pass. */
|
|
27
|
+
export const tightCommasIn = (text) => [...text.matchAll(RUN)].flatMap((run) => {
|
|
28
|
+
const joined = isProseRun(run[0]) ? JOINED.exec(run[0]) : null;
|
|
29
|
+
return joined === null ? [] : [{ offset: run.index + joined.index + joined[0].indexOf(COMMA), written: joined[0] }];
|
|
30
|
+
});
|
|
31
|
+
export const missingSpaceAfterComma = (doc) => {
|
|
32
|
+
const text = doc.prose ?? doc.source;
|
|
33
|
+
return tightCommasIn(text).map((comma) => ({
|
|
34
|
+
rule: "",
|
|
35
|
+
severity: "warning",
|
|
36
|
+
line: 0,
|
|
37
|
+
column: 0,
|
|
38
|
+
quote: quoteAround(text, comma.offset, comma.offset + 1),
|
|
39
|
+
values: { written: comma.written, offset: comma.offset },
|
|
40
|
+
}));
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=missing-space-after-comma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-space-after-comma.js","sourceRoot":"","sources":["../../src/detectors/missing-space-after-comma.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orthographic-variant.d.ts","sourceRoot":"","sources":["../../src/detectors/orthographic-variant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2C,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"orthographic-variant.d.ts","sourceRoot":"","sources":["../../src/detectors/orthographic-variant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2C,MAAM,cAAc,CAAC;AAiLtF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAUjC,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { kanjiSkeleton, katakanaKey, lemmaReading } from "../kana-spelling.js";
|
|
|
3
3
|
import { isKatakanaWord, stemOf } from "../long-vowel.js";
|
|
4
4
|
import { QUOTATION_MARKS, isWithinAny, quotedSpans } from "../quoted-span.js";
|
|
5
5
|
import { nameSpans, touchesAny } from "../team-names.js";
|
|
6
|
+
import { furiganaSpans } from "../furigana.js";
|
|
6
7
|
/** Parts of speech that carry a word of their own. Particles and endings are written one way by the grammar. */
|
|
7
8
|
const CONTENT = new Set(["NOUN", "VERB", "ADJ", "ADV", "PRON", "CCONJ", "DET"]);
|
|
8
9
|
const JAPANESE_WORD = /^[\p{Script=Han}々ぁ-ゖァ-ヺー]+$/u;
|
|
@@ -14,38 +15,64 @@ const MIN_LATIN_KEY = 3;
|
|
|
14
15
|
/** Lexicons: readings and spellings whose kanji and kana forms mean different things (成る and なる, 者 and もの), and adverbs hiragana-fukushi reads. */
|
|
15
16
|
const DISTINCT = "orthographic-variant-distinct";
|
|
16
17
|
const FUKUSHI = "hiragana-fukushi";
|
|
18
|
+
/** Lexicon: idioms written as noun, particle and verb (気をつける). The verb there is compared apart from the verb on its own. */
|
|
19
|
+
const IDIOM = "orthographic-variant-idiom";
|
|
17
20
|
const patternsOf = (doc, id) => (doc.lexicons[id] ?? []).map((entry) => entry.pattern);
|
|
18
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Whether a stretch of the sentence is outside a quotation, the team's names and a reading in brackets (HTTP(えいちてぃーてぃーぴー)):
|
|
23
|
+
* the first two keep their own spelling, and a reading is not a spelling at all.
|
|
24
|
+
*/
|
|
19
25
|
const isOpenIn = (sentence, names) => {
|
|
20
|
-
const
|
|
26
|
+
const closed = [...quotedSpans(sentence.text, QUOTATION_MARKS), ...furiganaSpans(sentence.text)];
|
|
21
27
|
const named = nameSpans(sentence.text, names);
|
|
22
|
-
return (start, end) => !isWithinAny(
|
|
28
|
+
return (start, end) => !isWithinAny(closed, { start, end }) && !touchesAny(named, start, end);
|
|
23
29
|
};
|
|
24
|
-
|
|
30
|
+
/** A verb's て-form the tokenizer read as a conjunction (追って at the head of a sentence): a kanji stem and て or で. Connectives (そして, それで) are kana. */
|
|
31
|
+
const TE_FORM_CONJUNCTION = /^\p{Script=Han}.*[てで]$/u;
|
|
32
|
+
/** After a て-form (見てみる). The tokenizer reads the て as a joining word, or the whole て-form as a conjunction (追って / みる). */
|
|
33
|
+
const followsTeForm = (previous) => (previous?.pos === "SCONJ" && (previous.surface === "て" || previous.surface === "で")) ||
|
|
34
|
+
(previous?.pos === "CCONJ" && TE_FORM_CONJUNCTION.test(previous.surface));
|
|
35
|
+
const isHelper = ({ token, previous }) => token.features?.["Bound"] === "Yes" || followsTeForm(previous);
|
|
36
|
+
const isTouching = (left, right) => left !== undefined && left.span.end === right.span.start;
|
|
37
|
+
const HIRAGANA_ONLY = /^[ぁ-ゖー]+$/u;
|
|
38
|
+
/** A kana noun written onto a noun (全員ぶん): a suffix, which may not be the free noun of the same reading (文). */
|
|
39
|
+
const isKanaSuffix = ({ token, previous }) => token.pos === "NOUN" && previous?.pos === "NOUN" && isTouching(previous, token) && HIRAGANA_ONLY.test(token.surface);
|
|
40
|
+
/** The verb of an idiom (気をつける): the noun, the particle and the verb's dictionary form are in the idiom lexicon. */
|
|
41
|
+
const isIdiomVerb = ({ token, previous, before }, idioms) => token.pos === "VERB" && previous?.pos === "ADP" && before !== undefined && idioms.has(`${before.surface}${previous.surface}${token.lemma ?? token.surface}`);
|
|
25
42
|
/**
|
|
26
43
|
* A helper verb or a dependent noun (見て下さい, その事) is written kana by many guides while the full word keeps its kanji (資料を下さい).
|
|
27
|
-
* The two uses are compared apart, so a document that follows that convention is consistent. A suffix (
|
|
28
|
-
* it is not the dependent noun of the same reading (このように).
|
|
44
|
+
* The two uses are compared apart, so a document that follows that convention is consistent. A suffix (業務用, 全員ぶん) is a third use:
|
|
45
|
+
* it is not the dependent noun of the same reading (このように). The verb of an idiom (気をつける) is a fourth.
|
|
29
46
|
*/
|
|
30
|
-
const useOf = (
|
|
31
|
-
if (
|
|
47
|
+
const useOf = (word, idioms) => {
|
|
48
|
+
if (isIdiomVerb(word, idioms))
|
|
49
|
+
return "idiom";
|
|
50
|
+
if (isKanaSuffix(word))
|
|
51
|
+
return "suffix";
|
|
52
|
+
if (!isHelper(word))
|
|
32
53
|
return "free";
|
|
33
|
-
return token.pos === "NOUN" && token.features?.["NounType"] !== "Dependent" ? "suffix" : "bound";
|
|
54
|
+
return word.token.pos === "NOUN" && word.token.features?.["NounType"] !== "Dependent" ? "suffix" : "bound";
|
|
34
55
|
};
|
|
35
|
-
|
|
56
|
+
/** One katakana and then kana that is not katakana (スる): no verb stem is one katakana long, as サボる and ググる are two. */
|
|
57
|
+
const ONE_KATAKANA_HEAD = /^\p{Script=Katakana}(?!\p{Script=Katakana})/u;
|
|
58
|
+
const KATAKANA_END = /\p{Script=Katakana}$/u;
|
|
59
|
+
/** A piece the tokenizer cut out of a katakana run (ミスっ read as ミ and スる): not a word of its own. */
|
|
60
|
+
const isCutFromKatakana = ({ token, previous }) => ONE_KATAKANA_HEAD.test(token.surface) && token.surface.length > 1 && isTouching(previous, token) && KATAKANA_END.test(previous?.surface ?? "");
|
|
61
|
+
const readingKeyOf = (word, { skip, idioms }) => {
|
|
62
|
+
const { token } = word;
|
|
36
63
|
const lemma = token.lemma;
|
|
37
64
|
if (!CONTENT.has(token.pos) || token.reading === undefined || lemma === undefined || !JAPANESE_WORD.test(lemma) || skip.has(lemma))
|
|
38
65
|
return undefined;
|
|
39
66
|
const reading = lemmaReading(token.surface, lemma, token.reading);
|
|
40
|
-
if (reading === undefined || [...reading].length < MIN_READING || skip.has(reading))
|
|
67
|
+
if (reading === undefined || [...reading].length < MIN_READING || skip.has(reading) || isCutFromKatakana(word))
|
|
41
68
|
return undefined;
|
|
42
|
-
return `${token.pos}|${useOf(
|
|
69
|
+
return `${token.pos}|${useOf(word, idioms)}|${reading}`;
|
|
43
70
|
};
|
|
44
71
|
/** Japanese words keyed by part of speech, use and the reading of the dictionary form, spelled as the dictionary form. */
|
|
45
|
-
const readingWords = (sentence, isOpen,
|
|
72
|
+
const readingWords = (sentence, isOpen, skips) => {
|
|
46
73
|
const tokens = sentence.tokens ?? [];
|
|
47
74
|
return tokens.flatMap((token, at) => {
|
|
48
|
-
const key = readingKeyOf(token, tokens[at - 1],
|
|
75
|
+
const key = readingKeyOf({ token, previous: tokens[at - 1], before: tokens[at - 2] }, skips);
|
|
49
76
|
const local = token.span.start - sentence.span.start;
|
|
50
77
|
if (key === undefined || token.lemma === undefined || !isOpen(local, local + token.surface.length))
|
|
51
78
|
return [];
|
|
@@ -117,11 +144,11 @@ const findingOf = (words, odd) => ({
|
|
|
117
144
|
* document writes less is pointed at. No way is called right; limit is the largest share, in percent, the minority may have.
|
|
118
145
|
*/
|
|
119
146
|
export const orthographicVariant = (doc, options) => {
|
|
120
|
-
const
|
|
147
|
+
const skips = { skip: new Set([...patternsOf(doc, DISTINCT), ...patternsOf(doc, FUKUSHI)]), idioms: new Set(patternsOf(doc, IDIOM)) };
|
|
121
148
|
const placed = doc.sentences.map((sentence) => ({ sentence, isOpen: isOpenIn(sentence, doc.names ?? []) }));
|
|
122
|
-
const reading = byKanji(placed.flatMap(({ sentence, isOpen }) => readingWords(sentence, isOpen,
|
|
149
|
+
const reading = byKanji(placed.flatMap(({ sentence, isOpen }) => readingWords(sentence, isOpen, skips)));
|
|
123
150
|
const katakana = placed.flatMap(({ sentence, isOpen }) => katakanaWords(sentence, isOpen));
|
|
124
|
-
const latin = placed.flatMap(({ sentence, isOpen }) => latinWords(sentence, isOpen, skip));
|
|
151
|
+
const latin = placed.flatMap(({ sentence, isOpen }) => latinWords(sentence, isOpen, skips.skip));
|
|
125
152
|
const odd = [reading, katakana, latin].flatMap((words) => oddSpellings(words, options.limit));
|
|
126
153
|
const all = [...reading, ...katakana, ...latin];
|
|
127
154
|
// A word can be odd by its reading and by its katakana key at once; one place is said once.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orthographic-variant.js","sourceRoot":"","sources":["../../src/detectors/orthographic-variant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAoC,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"orthographic-variant.js","sourceRoot":"","sources":["../../src/detectors/orthographic-variant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"party-role-name.d.ts","sourceRoot":"","sources":["../../src/detectors/party-role-name.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,cAAc,CAAC;AAUrE,eAAO,MAAM,aAAa,EAAE,QA2B3B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// A party called by a role word (受託者, the Vendor) after the contract gave it a short name (乙, the "Supplier"). The
|
|
2
|
+
// definitions come from the document's structure tree; the role words, short names and company forms from the language
|
|
3
|
+
// package's word lists (party-role, party-short-name, company-form).
|
|
4
|
+
import { definedTerms } from "../structure/definition-use.js";
|
|
5
|
+
import { partiesOf, roleUses } from "../structure/party-role.js";
|
|
6
|
+
import { quoteAt } from "./structure-tree.js";
|
|
7
|
+
const patternsOf = (doc, lexicon) => (doc.lexicons[lexicon] ?? []).map((entry) => entry.pattern);
|
|
8
|
+
/** The sentence holding a definition: the role words in the sentences that name the parties are part of naming them. */
|
|
9
|
+
const sentenceAt = (doc, offset) => doc.sentences.find((sentence) => sentence.span.start <= offset && offset < sentence.span.end)?.span ?? { start: offset, end: offset };
|
|
10
|
+
const NAME_SEPARATOR = { ja: "、" };
|
|
11
|
+
export const partyRoleName = (doc) => {
|
|
12
|
+
if (doc.structure === undefined)
|
|
13
|
+
return [];
|
|
14
|
+
const terms = definedTerms(doc.structure);
|
|
15
|
+
const words = { roles: patternsOf(doc, "party-role"), shortNames: patternsOf(doc, "party-short-name"), companyForms: patternsOf(doc, "company-form") };
|
|
16
|
+
const parties = partiesOf(doc.source, terms, words);
|
|
17
|
+
if (parties.length === 0)
|
|
18
|
+
return [];
|
|
19
|
+
// From the sentence that names the first party: a party named later (a subcontractor ("Recipient")) does not hide the role words before it.
|
|
20
|
+
const naming = parties.map((party) => sentenceAt(doc, party.end - 1));
|
|
21
|
+
const after = Math.min(...naming.map((sentence) => sentence.end));
|
|
22
|
+
const names = [...new Set(parties.map((party) => party.term))].join(NAME_SEPARATOR[doc.language] ?? ", ");
|
|
23
|
+
const texts = doc.sentences.map((sentence) => ({ start: sentence.span.start, text: sentence.text }));
|
|
24
|
+
return roleUses(doc.source, texts, words.roles, terms.map((term) => term.term), after)
|
|
25
|
+
.filter((use) => !naming.some((sentence) => sentence.start <= use.offset && use.offset < sentence.end))
|
|
26
|
+
.map((use) => ({
|
|
27
|
+
rule: "party-role-name",
|
|
28
|
+
severity: "info",
|
|
29
|
+
line: 0,
|
|
30
|
+
column: 0,
|
|
31
|
+
quote: quoteAt(doc.source, use.offset),
|
|
32
|
+
values: { role: use.role, names, offset: use.offset },
|
|
33
|
+
}));
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=party-role-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"party-role-name.js","sourceRoot":"","sources":["../../src/detectors/party-role-name.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Detector, LexiconEntry } from "../plugin.ts";
|
|
2
|
+
export type QuoteText = {
|
|
3
|
+
readonly start: number;
|
|
4
|
+
readonly text: string;
|
|
5
|
+
};
|
|
6
|
+
export type QuoteParagraph = {
|
|
7
|
+
readonly source: string;
|
|
8
|
+
readonly sentences: readonly QuoteText[];
|
|
9
|
+
};
|
|
10
|
+
export type UnsourcedQuote = {
|
|
11
|
+
readonly offset: number;
|
|
12
|
+
readonly quote: string;
|
|
13
|
+
};
|
|
14
|
+
/** Each quotation given to someone, in a paragraph that names no source. cues: the word list quote-attribution. */
|
|
15
|
+
export declare const unsourcedQuotes: (paragraphs: readonly QuoteParagraph[], cues: readonly LexiconEntry[]) => UnsourcedQuote[];
|
|
16
|
+
export declare const quoteWithoutSource: Detector;
|
|
17
|
+
//# sourceMappingURL=quote-without-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-without-source.d.ts","sourceRoot":"","sources":["../../src/detectors/quote-without-source.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAW,YAAY,EAAiB,MAAM,cAAc,CAAC;AAEnF,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA4DjF,mHAAmH;AACnH,eAAO,MAAM,eAAe,GAAI,YAAY,SAAS,cAAc,EAAE,EAAE,MAAM,SAAS,YAAY,EAAE,KAAG,cAAc,EACyC,CAAC;AAE/J,eAAO,MAAM,kBAAkB,EAAE,QAc5B,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// A quotation the text gives to someone (「…」と述べている, according to X, "…") in a paragraph that names no source for it:
|
|
2
|
+
// no link, no footnote or numbered citation, no year in brackets. Whether the words are really that person's is for
|
|
3
|
+
// `chaff cite` against the source; this only says that there is nothing to check them against. The words that give a
|
|
4
|
+
// quotation to someone come from the language package's word list quote-attribution. Pure.
|
|
5
|
+
import { QUOTATION_MARKS, quotedSpans } from "../quoted-span.js";
|
|
6
|
+
/** Shorter than this, a quotation is a term or a label (「保存」, "Save"), not someone's words. */
|
|
7
|
+
const MIN_QUOTE_CHARS = 10;
|
|
8
|
+
/**
|
|
9
|
+
* A link, a bare URL, a footnote mark, a numbered citation ([3]) or a year that ends a bracket as a citation's does: alone
|
|
10
|
+
* ((1975), (1999年)), after a comma ((架空の本、1975年)) or after a name ((Brooks 1975)). Not (port 2000).
|
|
11
|
+
*/
|
|
12
|
+
const SOURCE_MARKS = [
|
|
13
|
+
/\]\(/u,
|
|
14
|
+
/https?:\/\//u,
|
|
15
|
+
/\[\^[^\]\s]+\]/u,
|
|
16
|
+
/\[\d{1,3}(?:[,,、–-]\s*\d{1,3})*\]/u,
|
|
17
|
+
/[((](?:1[5-9]|20)\d\d[a-z]?年?[))]/u,
|
|
18
|
+
/[((][^()()\n]*[,、,]\s*(?:1[5-9]|20)\d\d[a-z]?年?[))]/u,
|
|
19
|
+
/[((]\p{Lu}[^()()\n]*\s(?:1[5-9]|20)\d\d[a-z]?[))]/u,
|
|
20
|
+
];
|
|
21
|
+
/** How far before a quotation a cue may end ("According to the study, “…”", 先輩によれば「…」). */
|
|
22
|
+
const CUE_REACH_BEFORE = 40;
|
|
23
|
+
/** How far after a quotation a cue may start: a space ("“…,” said"), or none (「…」と述べた, not 「…」などと書く). */
|
|
24
|
+
const CUE_REACH_AFTER = 1;
|
|
25
|
+
const LATIN = /\p{Script=Latin}/u;
|
|
26
|
+
const LETTER = /\p{L}/u;
|
|
27
|
+
const namesSource = (paragraph) => SOURCE_MARKS.some((mark) => mark.test(paragraph));
|
|
28
|
+
const escaped = (word) => word.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
29
|
+
/**
|
|
30
|
+
* Where the cue stands in the sentence, ignoring case, in the sentence's own positions (lowercasing first would move them:
|
|
31
|
+
* İ becomes two units). An English cue is not read inside a longer word (says in essays).
|
|
32
|
+
*/
|
|
33
|
+
const cueStarts = (text, cue) => {
|
|
34
|
+
if (cue === "")
|
|
35
|
+
return [];
|
|
36
|
+
return [...text.matchAll(new RegExp(escaped(cue), "giu"))]
|
|
37
|
+
.map((match) => match.index)
|
|
38
|
+
.filter((at) => !LATIN.test(cue) || (!LETTER.test(text.charAt(at - 1)) && !LETTER.test(text.charAt(at + cue.length))));
|
|
39
|
+
};
|
|
40
|
+
/** A cue just before the quotation's opening mark, or just after its closing mark. position says which side it may stand on. */
|
|
41
|
+
const isAttributed = (text, quoted, cues) => cues.some((cue) => cueStarts(text, cue.pattern).some((at) => {
|
|
42
|
+
const before = cue.position !== "after" && at + cue.pattern.length <= quoted.start - 1 && at + cue.pattern.length >= quoted.start - 1 - CUE_REACH_BEFORE;
|
|
43
|
+
const after = cue.position !== "before" && at >= quoted.end + 1 && at <= quoted.end + 1 + CUE_REACH_AFTER;
|
|
44
|
+
return before || after;
|
|
45
|
+
}));
|
|
46
|
+
const quotesIn = (sentence, cues) => {
|
|
47
|
+
return quotedSpans(sentence.text, QUOTATION_MARKS)
|
|
48
|
+
.filter((span) => [...sentence.text.slice(span.start, span.end).trim()].length >= MIN_QUOTE_CHARS && isAttributed(sentence.text, span, cues))
|
|
49
|
+
.map((span) => ({ offset: sentence.start + span.start, quote: sentence.text.slice(span.start, span.end).trim() }));
|
|
50
|
+
};
|
|
51
|
+
/** Each quotation given to someone, in a paragraph that names no source. cues: the word list quote-attribution. */
|
|
52
|
+
export const unsourcedQuotes = (paragraphs, cues) => paragraphs.filter((paragraph) => !namesSource(paragraph.source)).flatMap((paragraph) => paragraph.sentences.flatMap((sentence) => quotesIn(sentence, cues)));
|
|
53
|
+
export const quoteWithoutSource = (doc) => unsourcedQuotes(doc.paragraphs.map((paragraph) => ({
|
|
54
|
+
source: doc.source.slice(paragraph.span.start, paragraph.span.end),
|
|
55
|
+
sentences: paragraph.sentences.map((sentence) => ({ start: sentence.span.start, text: sentence.text })),
|
|
56
|
+
})), doc.lexicons["quote-attribution"] ?? []).map((hit) => ({
|
|
57
|
+
rule: "quote-without-source",
|
|
58
|
+
severity: "info",
|
|
59
|
+
line: 0,
|
|
60
|
+
column: 0,
|
|
61
|
+
quote: hit.quote,
|
|
62
|
+
values: { quote: hit.quote, offset: hit.offset },
|
|
63
|
+
}));
|
|
64
|
+
//# sourceMappingURL=quote-without-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-without-source.js","sourceRoot":"","sources":["../../src/detectors/quote-without-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ const inputOf = (doc) => {
|
|
|
10
10
|
return {
|
|
11
11
|
source: doc.source,
|
|
12
12
|
references: inDocumentOrder(tree).filter((node) => node.kind === "reference" && node.attrs["document"] === undefined),
|
|
13
|
-
targetOf: referenceResolver(tree),
|
|
13
|
+
targetOf: referenceResolver(tree, doc.source),
|
|
14
14
|
words: {
|
|
15
15
|
asides: patternsOf(doc, "reference-aside"),
|
|
16
16
|
topicLinks: patternsOf(doc, "reference-topic-link"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-text.js","sourceRoot":"","sources":["../../src/detectors/reference-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAuB,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,WAAW,EAAuB,MAAM,gCAAgC,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,GAAkB,EAAE,EAAU,EAAY,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAExH,6DAA6D;AAC7D,MAAM,OAAO,GAAG,CAAC,GAAkB,EAA8B,EAAE;IACjE,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC;IAC3B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;QACrH,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"reference-text.js","sourceRoot":"","sources":["../../src/detectors/reference-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAuB,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,WAAW,EAAuB,MAAM,gCAAgC,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,GAAkB,EAAE,EAAU,EAAY,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAExH,6DAA6D;AAC7D,MAAM,OAAO,GAAG,CAAC,GAAkB,EAA8B,EAAE;IACjE,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC;IAC3B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;QACrH,QAAQ,EAAE,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC;QAC7C,KAAK,EAAE;YACL,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,iBAAiB,CAAC;YAC1C,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,sBAAsB,CAAC;YACnD,WAAW,EAAE,UAAU,CAAC,GAAG,EAAE,uBAAuB,CAAC;SACtD;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,GACd,CAAC,IAAY,EAAE,QAAqD,EAAY,EAAE,CAClF,CAAC,GAAG,EAAa,EAAE;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI;YACJ,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACxC,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;SAClD,CAAC,CAAC,CAAC;AACV,CAAC,CAAC;AAEJ,kCAAkC;AAClC,MAAM,CAAC,MAAM,sBAAsB,GAAa,UAAU,CAAC,0BAA0B,EAAE,eAAe,CAAC,CAAC;AAExG,gCAAgC;AAChC,MAAM,CAAC,MAAM,qBAAqB,GAAa,UAAU,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connective-hierarchy.d.ts","sourceRoot":"","sources":["../../../src/detectors/registry/connective-hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,eAAO,MAAM,QAAQ,EAAE,QAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connective-hierarchy.js","sourceRoot":"","sources":["../../../src/detectors/registry/connective-hierarchy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,QAAQ,GAAa,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-final-period.d.ts","sourceRoot":"","sources":["../../../src/detectors/registry/missing-final-period.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,eAAO,MAAM,QAAQ,EAAE,QAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-final-period.js","sourceRoot":"","sources":["../../../src/detectors/registry/missing-final-period.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAa,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-space-after-comma.d.ts","sourceRoot":"","sources":["../../../src/detectors/registry/missing-space-after-comma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,eAAO,MAAM,QAAQ,EAAE,QAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing-space-after-comma.js","sourceRoot":"","sources":["../../../src/detectors/registry/missing-space-after-comma.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,CAAC,MAAM,QAAQ,GAAa,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"party-role-name.d.ts","sourceRoot":"","sources":["../../../src/detectors/registry/party-role-name.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,eAAO,MAAM,QAAQ,EAAE,QAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"party-role-name.js","sourceRoot":"","sources":["../../../src/detectors/registry/party-role-name.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAa,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-without-source.d.ts","sourceRoot":"","sources":["../../../src/detectors/registry/quote-without-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,eAAO,MAAM,QAAQ,EAAE,QAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-without-source.js","sourceRoot":"","sources":["../../../src/detectors/registry/quote-without-source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAa,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vague-deadline.d.ts","sourceRoot":"","sources":["../../../src/detectors/registry/vague-deadline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,eAAO,MAAM,QAAQ,EAAE,QAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vague-deadline.js","sourceRoot":"","sources":["../../../src/detectors/registry/vague-deadline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,MAAM,QAAQ,GAAa,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Span } from "../plugin.ts";
|
|
2
|
+
/**
|
|
3
|
+
* 行の頭の太字だけでできた文で、同じ行に続きがあるもの(「- **速く書ける。** 細かな文法を覚えなくても書けます。」の「速く書ける。」)。
|
|
4
|
+
* 項目や段落の札で、見出しと同じく本文の文ではない。太字だけの行(「**注意してください。**」)は札ではなく文。
|
|
5
|
+
*/
|
|
6
|
+
export declare const isRunInLabel: (source: string, span: Span) => boolean;
|
|
7
|
+
//# sourceMappingURL=run-in-label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-in-label.d.ts","sourceRoot":"","sources":["../../src/detectors/run-in-label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAiDzC;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,MAAM,IAAI,KAAG,OAMzD,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** 行の頭の引用の印と字下げ、箇条の印、チェックボックス。この後ろで太字が開く。 */
|
|
2
|
+
const QUOTE_INDENT = /^(?:[ \t]*>)*[ \t]*/u;
|
|
3
|
+
const ITEM_MARKER = /^(?:[-*+]|\d{1,9}[.)])[ \t]+/u;
|
|
4
|
+
const TASK_BOX = /^\[[ xX]\][ \t]+/u;
|
|
5
|
+
const BOLD = /^(?:\*\*|__)$/u;
|
|
6
|
+
/** 行の頭から文の始まりまで(before)が、印の後ろで開いた太字だけか。 */
|
|
7
|
+
const openingOf = (before) => {
|
|
8
|
+
const unquoted = before.replace(QUOTE_INDENT, "");
|
|
9
|
+
const rest = unquoted.replace(ITEM_MARKER, "").replace(TASK_BOX, "");
|
|
10
|
+
return BOLD.test(rest) ? { marker: rest, item: rest.length < unquoted.length } : undefined;
|
|
11
|
+
};
|
|
12
|
+
/** 段落の切れ目になる前の行: 空の行(引用の中の空の行も)と見出し。 */
|
|
13
|
+
const BLOCK_BEFORE = /^(?:[ \t]*>)*[ \t]*(?:#.*)?$/u;
|
|
14
|
+
/** 文の終わりの句読点。札の句点を太字の外に書く形(**速く書ける**。)もある。 */
|
|
15
|
+
const STOP = /[。..!?!?]$/u;
|
|
16
|
+
const lineAround = (source, offset) => {
|
|
17
|
+
const end = source.indexOf("\n", offset);
|
|
18
|
+
return { start: source.lastIndexOf("\n", offset - 1) + 1, end: end === -1 ? source.length : end };
|
|
19
|
+
};
|
|
20
|
+
/** 太字が閉じる位置。文の直後か、文末の句読点の直前。 */
|
|
21
|
+
const closingOf = (source, span, marker) => {
|
|
22
|
+
if (source.startsWith(marker, span.end))
|
|
23
|
+
return span.end;
|
|
24
|
+
const stop = STOP.exec(source.slice(span.start, span.end))?.[0];
|
|
25
|
+
const before = stop === undefined ? -1 : span.end - stop.length - marker.length;
|
|
26
|
+
return before > span.start && source.startsWith(marker, before) ? before : undefined;
|
|
27
|
+
};
|
|
28
|
+
/** 文全体を一つの太字が包むなら、太字と文の後ろの位置。途中で閉じる太字(**a** と **b。**)は包んでいない。 */
|
|
29
|
+
const closedAt = (source, span, marker) => {
|
|
30
|
+
const closing = closingOf(source, span, marker);
|
|
31
|
+
if (closing === undefined || source.slice(span.start, closing).includes(marker))
|
|
32
|
+
return undefined;
|
|
33
|
+
return Math.max(closing + marker.length, span.end);
|
|
34
|
+
};
|
|
35
|
+
/** 行の頭が段落の頭か。箇条の印のある行は項目の頭。折り返した段落の続きの行(前の行に文がある)は頭ではない。 */
|
|
36
|
+
const opensBlock = (source, lineStart, item) => {
|
|
37
|
+
if (item || lineStart === 0)
|
|
38
|
+
return true;
|
|
39
|
+
return BLOCK_BEFORE.test(source.slice(source.lastIndexOf("\n", lineStart - 2) + 1, lineStart - 1));
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* 行の頭の太字だけでできた文で、同じ行に続きがあるもの(「- **速く書ける。** 細かな文法を覚えなくても書けます。」の「速く書ける。」)。
|
|
43
|
+
* 項目や段落の札で、見出しと同じく本文の文ではない。太字だけの行(「**注意してください。**」)は札ではなく文。
|
|
44
|
+
*/
|
|
45
|
+
export const isRunInLabel = (source, span) => {
|
|
46
|
+
const line = lineAround(source, span.start);
|
|
47
|
+
const opening = openingOf(source.slice(line.start, span.start));
|
|
48
|
+
if (opening === undefined || !opensBlock(source, line.start, opening.item))
|
|
49
|
+
return false;
|
|
50
|
+
const after = closedAt(source, span, opening.marker);
|
|
51
|
+
return after !== undefined && after <= line.end && /\S/u.test(source.slice(after, line.end));
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=run-in-label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-in-label.js","sourceRoot":"","sources":["../../src/detectors/run-in-label.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,10 @@ type Opened = {
|
|
|
11
11
|
readonly sentence: Sentence;
|
|
12
12
|
readonly opener: string | undefined;
|
|
13
13
|
};
|
|
14
|
+
/** The phrases that open a sentence with a lexicon word but do not point back (this-document references). */
|
|
15
|
+
export declare const NOT_OPENER_LEXICON = "demonstrative-not-opener";
|
|
14
16
|
/** Runs of consecutive sentences in one paragraph that each open with a lexicon word. */
|
|
15
|
-
export declare const openerRuns: (sentences: readonly Sentence[], lexicon: Lexicon) => Opened[][];
|
|
17
|
+
export declare const openerRuns: (sentences: readonly Sentence[], lexicon: Lexicon, notOpeners?: Lexicon) => Opened[][];
|
|
16
18
|
/** More than limit sentences in a row within one paragraph, each opening with a word from the lexicon (これ, その). */
|
|
17
19
|
export declare const openerRun: Detector;
|
|
18
20
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentence-counts.d.ts","sourceRoot":"","sources":["../../src/detectors/sentence-counts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA4B,OAAO,EAAiB,QAAQ,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA6BhH,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,EAAE,QAG/B,CAAC;AAsBF,gIAAgI;AAChI,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,EAAE,QAAQ,SAAS,KAAK,EAAE,KAAG,OACyB,CAAC;AAEhG,mHAAmH;AACnH,eAAO,MAAM,kBAAkB,EAAE,QAGhC,CAAC;AAIF,yIAAyI;AACzI,eAAO,MAAM,wBAAwB,EAAE,QAGtC,CAAC;AAEF,KAAK,MAAM,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sentence-counts.d.ts","sourceRoot":"","sources":["../../src/detectors/sentence-counts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA4B,OAAO,EAAiB,QAAQ,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA6BhH,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,EAAE,QAG/B,CAAC;AAsBF,gIAAgI;AAChI,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,EAAE,QAAQ,SAAS,KAAK,EAAE,KAAG,OACyB,CAAC;AAEhG,mHAAmH;AACnH,eAAO,MAAM,kBAAkB,EAAE,QAGhC,CAAC;AAIF,yIAAyI;AACzI,eAAO,MAAM,wBAAwB,EAAE,QAGtC,CAAC;AAEF,KAAK,MAAM,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AASnF,6GAA6G;AAC7G,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAE7D,yFAAyF;AACzF,eAAO,MAAM,UAAU,GAAI,WAAW,SAAS,QAAQ,EAAE,EAAE,SAAS,OAAO,EAAE,aAAY,OAAY,KAAG,MAAM,EAAE,EAW5E,CAAC;AAcrC,mHAAmH;AACnH,eAAO,MAAM,SAAS,EAAE,QAQvB,CAAC"}
|