chaffjs 0.27.1 → 0.29.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 +2 -1
- package/dist/ai-score/of-document.d.ts.map +1 -1
- package/dist/ai-score/of-document.js +23 -14
- package/dist/ai-score/of-document.js.map +1 -1
- package/dist/ai-score/render.d.ts.map +1 -1
- package/dist/ai-score/render.js +13 -4
- package/dist/ai-score/render.js.map +1 -1
- package/dist/ai-score/score.d.ts +16 -1
- package/dist/ai-score/score.d.ts.map +1 -1
- package/dist/ai-score/score.js +15 -3
- package/dist/ai-score/score.js.map +1 -1
- package/dist/ai-score/signals.d.ts +2 -4
- package/dist/ai-score/signals.d.ts.map +1 -1
- package/dist/ai-score/signals.js +11 -2
- package/dist/ai-score/signals.js.map +1 -1
- package/dist/ai-score/text.d.ts +2 -0
- package/dist/ai-score/text.d.ts.map +1 -1
- package/dist/ai-score/text.js +4 -2
- package/dist/ai-score/text.js.map +1 -1
- package/dist/announced-count.d.ts +2 -0
- package/dist/announced-count.d.ts.map +1 -1
- package/dist/announced-count.js +14 -7
- package/dist/announced-count.js.map +1 -1
- package/dist/check-source.d.ts +3 -1
- package/dist/check-source.d.ts.map +1 -1
- package/dist/check-source.js +3 -1
- package/dist/check-source.js.map +1 -1
- package/dist/cli-text.d.ts.map +1 -1
- package/dist/cli-text.js +42 -18
- package/dist/cli-text.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/cite-claims.d.ts +36 -0
- package/dist/commands/cite-claims.d.ts.map +1 -0
- package/dist/commands/cite-claims.js +81 -0
- package/dist/commands/cite-claims.js.map +1 -0
- package/dist/commands/cite-page.d.ts +14 -0
- package/dist/commands/cite-page.d.ts.map +1 -0
- package/dist/commands/cite-page.js +47 -0
- package/dist/commands/cite-page.js.map +1 -0
- package/dist/commands/cite-scaffold.d.ts +16 -0
- package/dist/commands/cite-scaffold.d.ts.map +1 -0
- package/dist/commands/cite-scaffold.js +21 -0
- package/dist/commands/cite-scaffold.js.map +1 -0
- package/dist/commands/cite.d.ts +3 -12
- package/dist/commands/cite.d.ts.map +1 -1
- package/dist/commands/cite.js +110 -51
- package/dist/commands/cite.js.map +1 -1
- package/dist/company-names.d.ts +34 -0
- package/dist/company-names.d.ts.map +1 -0
- package/dist/company-names.js +158 -0
- package/dist/company-names.js.map +1 -0
- package/dist/default-values.d.ts +17 -0
- package/dist/default-values.d.ts.map +1 -0
- package/dist/default-values.js +134 -0
- package/dist/default-values.js.map +1 -0
- package/dist/deprecated-use.d.ts +17 -0
- package/dist/deprecated-use.d.ts.map +1 -0
- package/dist/deprecated-use.js +95 -0
- package/dist/deprecated-use.js.map +1 -0
- package/dist/derived/number-word-counts.d.ts +10 -0
- package/dist/derived/number-word-counts.d.ts.map +1 -0
- package/dist/derived/number-word-counts.js +21 -0
- package/dist/derived/number-word-counts.js.map +1 -0
- package/dist/derived/stays.d.ts +43 -0
- package/dist/derived/stays.d.ts.map +1 -0
- package/dist/derived/stays.js +105 -0
- package/dist/derived/stays.js.map +1 -0
- package/dist/detectors/acronym-context.d.ts +2 -2
- package/dist/detectors/acronym-context.d.ts.map +1 -1
- package/dist/detectors/acronym-context.js +6 -0
- package/dist/detectors/acronym-context.js.map +1 -1
- package/dist/detectors/address-word.d.ts +3 -0
- package/dist/detectors/address-word.d.ts.map +1 -0
- package/dist/detectors/address-word.js +7 -0
- package/dist/detectors/address-word.js.map +1 -0
- package/dist/detectors/agreement-slip.d.ts.map +1 -1
- package/dist/detectors/agreement-slip.js +4 -1
- package/dist/detectors/agreement-slip.js.map +1 -1
- package/dist/detectors/ai-phrasing.d.ts +0 -4
- package/dist/detectors/ai-phrasing.d.ts.map +1 -1
- package/dist/detectors/ai-phrasing.js +5 -1
- package/dist/detectors/ai-phrasing.js.map +1 -1
- package/dist/detectors/amount-range.d.ts +3 -0
- package/dist/detectors/amount-range.d.ts.map +1 -0
- package/dist/detectors/amount-range.js +38 -0
- package/dist/detectors/amount-range.js.map +1 -0
- package/dist/detectors/amount-scale.d.ts +8 -0
- package/dist/detectors/amount-scale.d.ts.map +1 -0
- package/dist/detectors/amount-scale.js +74 -0
- package/dist/detectors/amount-scale.js.map +1 -0
- package/dist/detectors/announced-count.d.ts +1 -1
- package/dist/detectors/announced-count.d.ts.map +1 -1
- package/dist/detectors/announced-count.js +18 -3
- package/dist/detectors/announced-count.js.map +1 -1
- package/dist/detectors/bare-comparative.d.ts.map +1 -1
- package/dist/detectors/bare-comparative.js +4 -1
- package/dist/detectors/bare-comparative.js.map +1 -1
- package/dist/detectors/block-quotation.d.ts +13 -0
- package/dist/detectors/block-quotation.d.ts.map +1 -0
- package/dist/detectors/block-quotation.js +86 -0
- package/dist/detectors/block-quotation.js.map +1 -0
- package/dist/detectors/bracket-label.d.ts +10 -0
- package/dist/detectors/bracket-label.d.ts.map +1 -0
- package/dist/detectors/bracket-label.js +51 -0
- package/dist/detectors/bracket-label.js.map +1 -0
- package/dist/detectors/change-rate.d.ts.map +1 -1
- package/dist/detectors/change-rate.js +12 -1
- package/dist/detectors/change-rate.js.map +1 -1
- package/dist/detectors/citation-entry.d.ts +5 -0
- package/dist/detectors/citation-entry.d.ts.map +1 -1
- package/dist/detectors/citation-entry.js +19 -5
- package/dist/detectors/citation-entry.js.map +1 -1
- package/dist/detectors/code-before.d.ts +6 -0
- package/dist/detectors/code-before.d.ts.map +1 -0
- package/dist/detectors/code-before.js +15 -0
- package/dist/detectors/code-before.js.map +1 -0
- package/dist/detectors/connective-hierarchy.d.ts +11 -1
- package/dist/detectors/connective-hierarchy.d.ts.map +1 -1
- package/dist/detectors/connective-hierarchy.js +26 -6
- package/dist/detectors/connective-hierarchy.js.map +1 -1
- package/dist/detectors/currency-notation.d.ts +3 -1
- package/dist/detectors/currency-notation.d.ts.map +1 -1
- package/dist/detectors/currency-notation.js +4 -3
- package/dist/detectors/currency-notation.js.map +1 -1
- package/dist/detectors/date-outside-period.d.ts +4 -0
- package/dist/detectors/date-outside-period.d.ts.map +1 -0
- package/dist/detectors/date-outside-period.js +34 -0
- package/dist/detectors/date-outside-period.js.map +1 -0
- package/dist/detectors/default-values.d.ts +3 -0
- package/dist/detectors/default-values.d.ts.map +1 -0
- package/dist/detectors/default-values.js +14 -0
- package/dist/detectors/default-values.js.map +1 -0
- package/dist/detectors/defined-term-form.d.ts +6 -2
- package/dist/detectors/defined-term-form.d.ts.map +1 -1
- package/dist/detectors/defined-term-form.js +72 -12
- package/dist/detectors/defined-term-form.js.map +1 -1
- package/dist/detectors/definition-use.d.ts.map +1 -1
- package/dist/detectors/definition-use.js +8 -1
- package/dist/detectors/definition-use.js.map +1 -1
- package/dist/detectors/deprecated-use.d.ts +3 -0
- package/dist/detectors/deprecated-use.d.ts.map +1 -0
- package/dist/detectors/deprecated-use.js +14 -0
- package/dist/detectors/deprecated-use.js.map +1 -0
- package/dist/detectors/derived-numbers.d.ts +1 -1
- package/dist/detectors/derived-numbers.d.ts.map +1 -1
- package/dist/detectors/derived-numbers.js +79 -16
- package/dist/detectors/derived-numbers.js.map +1 -1
- package/dist/detectors/document-shape.d.ts +1 -0
- package/dist/detectors/document-shape.d.ts.map +1 -1
- package/dist/detectors/document-shape.js +4 -1
- package/dist/detectors/document-shape.js.map +1 -1
- package/dist/detectors/due-date.d.ts +3 -0
- package/dist/detectors/due-date.d.ts.map +1 -0
- package/dist/detectors/due-date.js +38 -0
- package/dist/detectors/due-date.js.map +1 -0
- package/dist/detectors/en-shape.d.ts.map +1 -1
- package/dist/detectors/en-shape.js +17 -9
- package/dist/detectors/en-shape.js.map +1 -1
- package/dist/detectors/fact-consistency.d.ts.map +1 -1
- package/dist/detectors/fact-consistency.js +89 -2
- package/dist/detectors/fact-consistency.js.map +1 -1
- package/dist/detectors/heading-echo.d.ts.map +1 -1
- package/dist/detectors/heading-echo.js +10 -1
- package/dist/detectors/heading-echo.js.map +1 -1
- package/dist/detectors/kana-function-word.d.ts +12 -0
- package/dist/detectors/kana-function-word.d.ts.map +1 -0
- package/dist/detectors/kana-function-word.js +59 -0
- package/dist/detectors/kana-function-word.js.map +1 -0
- package/dist/detectors/line-amount.d.ts +3 -0
- package/dist/detectors/line-amount.d.ts.map +1 -0
- package/dist/detectors/line-amount.js +22 -0
- package/dist/detectors/line-amount.js.map +1 -0
- package/dist/detectors/location-pointer.d.ts +6 -0
- package/dist/detectors/location-pointer.d.ts.map +1 -0
- package/dist/detectors/location-pointer.js +22 -0
- package/dist/detectors/location-pointer.js.map +1 -0
- package/dist/detectors/mark-shape.d.ts.map +1 -1
- package/dist/detectors/mark-shape.js +13 -1
- package/dist/detectors/mark-shape.js.map +1 -1
- package/dist/detectors/nado-closed-list.d.ts +3 -0
- package/dist/detectors/nado-closed-list.d.ts.map +1 -0
- package/dist/detectors/nado-closed-list.js +21 -0
- package/dist/detectors/nado-closed-list.js.map +1 -0
- package/dist/detectors/name-variant.d.ts.map +1 -1
- package/dist/detectors/name-variant.js +92 -10
- package/dist/detectors/name-variant.js.map +1 -1
- package/dist/detectors/next-word.d.ts.map +1 -1
- package/dist/detectors/next-word.js +41 -8
- package/dist/detectors/next-word.js.map +1 -1
- package/dist/detectors/number-word-figure.d.ts +5 -0
- package/dist/detectors/number-word-figure.d.ts.map +1 -0
- package/dist/detectors/number-word-figure.js +32 -0
- package/dist/detectors/number-word-figure.js.map +1 -0
- package/dist/detectors/obligation-without-deadline.d.ts +39 -0
- package/dist/detectors/obligation-without-deadline.d.ts.map +1 -0
- package/dist/detectors/obligation-without-deadline.js +148 -0
- package/dist/detectors/obligation-without-deadline.js.map +1 -0
- package/dist/detectors/open-end-names.d.ts +23 -0
- package/dist/detectors/open-end-names.d.ts.map +1 -0
- package/dist/detectors/open-end-names.js +95 -0
- package/dist/detectors/open-end-names.js.map +1 -0
- package/dist/detectors/ordinal-run-gaps.d.ts +8 -0
- package/dist/detectors/ordinal-run-gaps.d.ts.map +1 -0
- package/dist/detectors/ordinal-run-gaps.js +80 -0
- package/dist/detectors/ordinal-run-gaps.js.map +1 -0
- package/dist/detectors/orthographic-variant.d.ts.map +1 -1
- package/dist/detectors/orthographic-variant.js +26 -9
- package/dist/detectors/orthographic-variant.js.map +1 -1
- package/dist/detectors/orthography.d.ts.map +1 -1
- package/dist/detectors/orthography.js +5 -0
- package/dist/detectors/orthography.js.map +1 -1
- package/dist/detectors/parameter-table.d.ts +3 -0
- package/dist/detectors/parameter-table.d.ts.map +1 -0
- package/dist/detectors/parameter-table.js +16 -0
- package/dist/detectors/parameter-table.js.map +1 -0
- package/dist/detectors/phone-number-variant.d.ts +3 -0
- package/dist/detectors/phone-number-variant.d.ts.map +1 -0
- package/dist/detectors/phone-number-variant.js +18 -0
- package/dist/detectors/phone-number-variant.js.map +1 -0
- package/dist/detectors/prerequisite-order.d.ts +3 -0
- package/dist/detectors/prerequisite-order.d.ts.map +1 -0
- package/dist/detectors/prerequisite-order.js +30 -0
- package/dist/detectors/prerequisite-order.js.map +1 -0
- package/dist/detectors/quote-unnamed-speaker.d.ts +3 -0
- package/dist/detectors/quote-unnamed-speaker.d.ts.map +1 -0
- package/dist/detectors/quote-unnamed-speaker.js +18 -0
- package/dist/detectors/quote-unnamed-speaker.js.map +1 -0
- package/dist/detectors/quote-without-source.d.ts +12 -2
- package/dist/detectors/quote-without-source.d.ts.map +1 -1
- package/dist/detectors/quote-without-source.js +45 -11
- package/dist/detectors/quote-without-source.js.map +1 -1
- package/dist/detectors/registry/amount-range.d.ts +3 -0
- package/dist/detectors/registry/amount-range.d.ts.map +1 -0
- package/dist/detectors/registry/amount-range.js +3 -0
- package/dist/detectors/registry/amount-range.js.map +1 -0
- package/dist/detectors/registry/amount-scale.d.ts +3 -0
- package/dist/detectors/registry/amount-scale.d.ts.map +1 -0
- package/dist/detectors/registry/amount-scale.js +3 -0
- package/dist/detectors/registry/amount-scale.js.map +1 -0
- package/dist/detectors/registry/arrival-before-departure.d.ts +3 -0
- package/dist/detectors/registry/arrival-before-departure.d.ts.map +1 -0
- package/dist/detectors/registry/arrival-before-departure.js +3 -0
- package/dist/detectors/registry/arrival-before-departure.js.map +1 -0
- package/dist/detectors/registry/date-outside-period.d.ts +3 -0
- package/dist/detectors/registry/date-outside-period.d.ts.map +1 -0
- package/dist/detectors/registry/date-outside-period.js +3 -0
- package/dist/detectors/registry/date-outside-period.js.map +1 -0
- package/dist/detectors/registry/default-values.d.ts +3 -0
- package/dist/detectors/registry/default-values.d.ts.map +1 -0
- package/dist/detectors/registry/default-values.js +3 -0
- package/dist/detectors/registry/default-values.js.map +1 -0
- package/dist/detectors/registry/deprecated-use.d.ts +3 -0
- package/dist/detectors/registry/deprecated-use.d.ts.map +1 -0
- package/dist/detectors/registry/deprecated-use.js +3 -0
- package/dist/detectors/registry/deprecated-use.js.map +1 -0
- package/dist/detectors/registry/due-date.d.ts +3 -0
- package/dist/detectors/registry/due-date.d.ts.map +1 -0
- package/dist/detectors/registry/due-date.js +3 -0
- package/dist/detectors/registry/due-date.js.map +1 -0
- package/dist/detectors/registry/kana-function-word.d.ts +3 -0
- package/dist/detectors/registry/kana-function-word.d.ts.map +1 -0
- package/dist/detectors/registry/kana-function-word.js +3 -0
- package/dist/detectors/registry/kana-function-word.js.map +1 -0
- package/dist/detectors/registry/line-amount.d.ts +3 -0
- package/dist/detectors/registry/line-amount.d.ts.map +1 -0
- package/dist/detectors/registry/line-amount.js +3 -0
- package/dist/detectors/registry/line-amount.js.map +1 -0
- package/dist/detectors/registry/nado-closed-list.d.ts +3 -0
- package/dist/detectors/registry/nado-closed-list.d.ts.map +1 -0
- package/dist/detectors/registry/nado-closed-list.js +3 -0
- package/dist/detectors/registry/nado-closed-list.js.map +1 -0
- package/dist/detectors/registry/number-word-figure.d.ts +3 -0
- package/dist/detectors/registry/number-word-figure.d.ts.map +1 -0
- package/dist/detectors/registry/number-word-figure.js +3 -0
- package/dist/detectors/registry/number-word-figure.js.map +1 -0
- package/dist/detectors/registry/obligation-without-deadline.d.ts +3 -0
- package/dist/detectors/registry/obligation-without-deadline.d.ts.map +1 -0
- package/dist/detectors/registry/obligation-without-deadline.js +3 -0
- package/dist/detectors/registry/obligation-without-deadline.js.map +1 -0
- package/dist/detectors/registry/parameter-table.d.ts +3 -0
- package/dist/detectors/registry/parameter-table.d.ts.map +1 -0
- package/dist/detectors/registry/parameter-table.js +3 -0
- package/dist/detectors/registry/parameter-table.js.map +1 -0
- package/dist/detectors/registry/phone-number-variant.d.ts +3 -0
- package/dist/detectors/registry/phone-number-variant.d.ts.map +1 -0
- package/dist/detectors/registry/phone-number-variant.js +3 -0
- package/dist/detectors/registry/phone-number-variant.js.map +1 -0
- package/dist/detectors/registry/prerequisite-order.d.ts +3 -0
- package/dist/detectors/registry/prerequisite-order.d.ts.map +1 -0
- package/dist/detectors/registry/prerequisite-order.js +3 -0
- package/dist/detectors/registry/prerequisite-order.js.map +1 -0
- package/dist/detectors/registry/quote-unnamed-speaker.d.ts +3 -0
- package/dist/detectors/registry/quote-unnamed-speaker.d.ts.map +1 -0
- package/dist/detectors/registry/quote-unnamed-speaker.js +3 -0
- package/dist/detectors/registry/quote-unnamed-speaker.js.map +1 -0
- package/dist/detectors/registry/tax-amount.d.ts +3 -0
- package/dist/detectors/registry/tax-amount.d.ts.map +1 -0
- package/dist/detectors/registry/tax-amount.js +3 -0
- package/dist/detectors/registry/tax-amount.js.map +1 -0
- package/dist/detectors/registry/time-order.d.ts +3 -0
- package/dist/detectors/registry/time-order.d.ts.map +1 -0
- package/dist/detectors/registry/time-order.js +3 -0
- package/dist/detectors/registry/time-order.js.map +1 -0
- package/dist/detectors/registry/ui-label.d.ts +3 -0
- package/dist/detectors/registry/ui-label.d.ts.map +1 -0
- package/dist/detectors/registry/ui-label.js +3 -0
- package/dist/detectors/registry/ui-label.js.map +1 -0
- package/dist/detectors/registry/undefined-call.d.ts +3 -0
- package/dist/detectors/registry/undefined-call.d.ts.map +1 -0
- package/dist/detectors/registry/undefined-call.js +3 -0
- package/dist/detectors/registry/undefined-call.js.map +1 -0
- package/dist/detectors/registry/undefined-term.d.ts +3 -0
- package/dist/detectors/registry/undefined-term.d.ts.map +1 -0
- package/dist/detectors/registry/undefined-term.js +3 -0
- package/dist/detectors/registry/undefined-term.js.map +1 -0
- package/dist/detectors/registry/version-order.d.ts +3 -0
- package/dist/detectors/registry/version-order.d.ts.map +1 -0
- package/dist/detectors/registry/version-order.js +3 -0
- package/dist/detectors/registry/version-order.js.map +1 -0
- package/dist/detectors/registry/warning-action.d.ts +3 -0
- package/dist/detectors/registry/warning-action.d.ts.map +1 -0
- package/dist/detectors/registry/warning-action.js +3 -0
- package/dist/detectors/registry/warning-action.js.map +1 -0
- package/dist/detectors/requirement-smell.d.ts.map +1 -1
- package/dist/detectors/requirement-smell.js +25 -8
- package/dist/detectors/requirement-smell.js.map +1 -1
- package/dist/detectors/structure-tree.d.ts +12 -4
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +31 -14
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/superlative-scope.d.ts.map +1 -1
- package/dist/detectors/superlative-scope.js +11 -1
- package/dist/detectors/superlative-scope.js.map +1 -1
- package/dist/detectors/tax-amount.d.ts +3 -0
- package/dist/detectors/tax-amount.d.ts.map +1 -0
- package/dist/detectors/tax-amount.js +19 -0
- package/dist/detectors/tax-amount.js.map +1 -0
- package/dist/detectors/technical-docs.d.ts.map +1 -1
- package/dist/detectors/technical-docs.js +5 -1
- package/dist/detectors/technical-docs.js.map +1 -1
- package/dist/detectors/term-extension.d.ts +14 -0
- package/dist/detectors/term-extension.d.ts.map +1 -0
- package/dist/detectors/term-extension.js +67 -0
- package/dist/detectors/term-extension.js.map +1 -0
- package/dist/detectors/time-order.d.ts +4 -0
- package/dist/detectors/time-order.d.ts.map +1 -0
- package/dist/detectors/time-order.js +32 -0
- package/dist/detectors/time-order.js.map +1 -0
- package/dist/detectors/ui-label.d.ts +3 -0
- package/dist/detectors/ui-label.d.ts.map +1 -0
- package/dist/detectors/ui-label.js +16 -0
- package/dist/detectors/ui-label.js.map +1 -0
- package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
- package/dist/detectors/unbalanced-bracket.js +8 -13
- package/dist/detectors/unbalanced-bracket.js.map +1 -1
- package/dist/detectors/undefined-call.d.ts +3 -0
- package/dist/detectors/undefined-call.d.ts.map +1 -0
- package/dist/detectors/undefined-call.js +18 -0
- package/dist/detectors/undefined-call.js.map +1 -0
- package/dist/detectors/undefined-term.d.ts +22 -0
- package/dist/detectors/undefined-term.d.ts.map +1 -0
- package/dist/detectors/undefined-term.js +85 -0
- package/dist/detectors/undefined-term.js.map +1 -0
- package/dist/detectors/unknown-word.d.ts +1 -1
- package/dist/detectors/unknown-word.js +3 -3
- package/dist/detectors/unknown-word.js.map +1 -1
- package/dist/detectors/vague-deadline.d.ts +4 -0
- package/dist/detectors/vague-deadline.d.ts.map +1 -1
- package/dist/detectors/vague-deadline.js +3 -3
- package/dist/detectors/vague-deadline.js.map +1 -1
- package/dist/detectors/version-mismatch.d.ts.map +1 -1
- package/dist/detectors/version-mismatch.js +18 -1
- package/dist/detectors/version-mismatch.js.map +1 -1
- package/dist/detectors/version-order.d.ts +3 -0
- package/dist/detectors/version-order.d.ts.map +1 -0
- package/dist/detectors/version-order.js +43 -0
- package/dist/detectors/version-order.js.map +1 -0
- package/dist/detectors/warning-action.d.ts +3 -0
- package/dist/detectors/warning-action.d.ts.map +1 -0
- package/dist/detectors/warning-action.js +48 -0
- package/dist/detectors/warning-action.js.map +1 -0
- package/dist/facts/condition-pairs.d.ts +51 -0
- package/dist/facts/condition-pairs.d.ts.map +1 -0
- package/dist/facts/condition-pairs.js +203 -0
- package/dist/facts/condition-pairs.js.map +1 -0
- package/dist/facts/counted-facts.d.ts +16 -0
- package/dist/facts/counted-facts.d.ts.map +1 -0
- package/dist/facts/counted-facts.js +45 -0
- package/dist/facts/counted-facts.js.map +1 -0
- package/dist/facts/event-dates.d.ts +26 -0
- package/dist/facts/event-dates.d.ts.map +1 -0
- package/dist/facts/event-dates.js +38 -0
- package/dist/facts/event-dates.js.map +1 -0
- package/dist/facts/fact-scope.d.ts +2 -0
- package/dist/facts/fact-scope.d.ts.map +1 -1
- package/dist/facts/fact-scope.js +5 -0
- package/dist/facts/fact-scope.js.map +1 -1
- package/dist/facts/labelled-facts.d.ts +2 -0
- package/dist/facts/labelled-facts.d.ts.map +1 -1
- package/dist/facts/labelled-facts.js +9 -1
- package/dist/facts/labelled-facts.js.map +1 -1
- package/dist/facts/table-facts.d.ts +16 -0
- package/dist/facts/table-facts.d.ts.map +1 -1
- package/dist/facts/table-facts.js +2 -2
- package/dist/facts/table-facts.js.map +1 -1
- package/dist/grade/ai-score.d.ts +1 -1
- package/dist/grade/ai-score.d.ts.map +1 -1
- package/dist/grade/text.js +2 -2
- package/dist/grade/text.js.map +1 -1
- package/dist/heading-numbering.js +2 -2
- package/dist/heading-numbering.js.map +1 -1
- package/dist/html/fetch-page.d.ts +20 -0
- package/dist/html/fetch-page.d.ts.map +1 -0
- package/dist/html/fetch-page.js +51 -0
- package/dist/html/fetch-page.js.map +1 -0
- package/dist/html/fetched-text.d.ts +5 -0
- package/dist/html/fetched-text.d.ts.map +1 -0
- package/dist/html/fetched-text.js +25 -0
- package/dist/html/fetched-text.js.map +1 -0
- package/dist/html/html-content-block.d.ts +6 -0
- package/dist/html/html-content-block.d.ts.map +1 -0
- package/dist/html/html-content-block.js +86 -0
- package/dist/html/html-content-block.js.map +1 -0
- package/dist/html/html-elements.d.ts +41 -0
- package/dist/html/html-elements.d.ts.map +1 -0
- package/dist/html/html-elements.js +91 -0
- package/dist/html/html-elements.js.map +1 -0
- package/dist/html/html-footnote-marks.d.ts +2 -0
- package/dist/html/html-footnote-marks.d.ts.map +1 -0
- package/dist/html/html-footnote-marks.js +15 -0
- package/dist/html/html-footnote-marks.js.map +1 -0
- package/dist/html/html-heading-links.d.ts +6 -0
- package/dist/html/html-heading-links.d.ts.map +1 -0
- package/dist/html/html-heading-links.js +71 -0
- package/dist/html/html-heading-links.js.map +1 -0
- package/dist/html/html-lost-tags.d.ts +3 -0
- package/dist/html/html-lost-tags.d.ts.map +1 -0
- package/dist/html/html-lost-tags.js +11 -0
- package/dist/html/html-lost-tags.js.map +1 -0
- package/dist/html/html-markdown.d.ts +2 -0
- package/dist/html/html-markdown.d.ts.map +1 -0
- package/dist/html/html-markdown.js +347 -0
- package/dist/html/html-markdown.js.map +1 -0
- package/dist/html/html-preformatted.d.ts +17 -0
- package/dist/html/html-preformatted.d.ts.map +1 -0
- package/dist/html/html-preformatted.js +82 -0
- package/dist/html/html-preformatted.js.map +1 -0
- package/dist/html/html-reader-only.d.ts +6 -0
- package/dist/html/html-reader-only.d.ts.map +1 -0
- package/dist/html/html-reader-only.js +63 -0
- package/dist/html/html-reader-only.js.map +1 -0
- package/dist/html/html-run-in-headings.d.ts +2 -0
- package/dist/html/html-run-in-headings.d.ts.map +1 -0
- package/dist/html/html-run-in-headings.js +36 -0
- package/dist/html/html-run-in-headings.js.map +1 -0
- package/dist/html/html-tables.d.ts +3 -0
- package/dist/html/html-tables.d.ts.map +1 -0
- package/dist/html/html-tables.js +58 -0
- package/dist/html/html-tables.js.map +1 -0
- package/dist/html/html-widgets.d.ts +3 -0
- package/dist/html/html-widgets.d.ts.map +1 -0
- package/dist/html/html-widgets.js +71 -0
- package/dist/html/html-widgets.js.map +1 -0
- package/dist/html/markup-text.d.ts +5 -0
- package/dist/html/markup-text.d.ts.map +1 -0
- package/dist/html/markup-text.js +32 -0
- package/dist/html/markup-text.js.map +1 -0
- package/dist/html/page-document.d.ts +9 -0
- package/dist/html/page-document.d.ts.map +1 -0
- package/dist/html/page-document.js +19 -0
- package/dist/html/page-document.js.map +1 -0
- package/dist/inline-count.d.ts +19 -0
- package/dist/inline-count.d.ts.map +1 -0
- package/dist/inline-count.js +109 -0
- package/dist/inline-count.js.map +1 -0
- package/dist/kana-spelling.d.ts +5 -0
- package/dist/kana-spelling.d.ts.map +1 -1
- package/dist/kana-spelling.js +5 -0
- package/dist/kana-spelling.js.map +1 -1
- package/dist/location-part.d.ts +13 -0
- package/dist/location-part.d.ts.map +1 -0
- package/dist/location-part.js +24 -0
- package/dist/location-part.js.map +1 -0
- package/dist/nado-closed-list.d.ts +20 -0
- package/dist/nado-closed-list.d.ts.map +1 -0
- package/dist/nado-closed-list.js +72 -0
- package/dist/nado-closed-list.js.map +1 -0
- package/dist/name-cue.d.ts +17 -0
- package/dist/name-cue.d.ts.map +1 -0
- package/dist/name-cue.js +29 -0
- package/dist/name-cue.js.map +1 -0
- package/dist/name-variants.d.ts +41 -5
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +93 -8
- package/dist/name-variants.js.map +1 -1
- package/dist/paragraph-runs.d.ts +6 -1
- package/dist/paragraph-runs.d.ts.map +1 -1
- package/dist/paragraph-runs.js +9 -2
- package/dist/paragraph-runs.js.map +1 -1
- package/dist/parameter-table.d.ts +19 -0
- package/dist/parameter-table.d.ts.map +1 -0
- package/dist/parameter-table.js +191 -0
- package/dist/parameter-table.js.map +1 -0
- package/dist/phone-numbers.d.ts +23 -0
- package/dist/phone-numbers.d.ts.map +1 -0
- package/dist/phone-numbers.js +83 -0
- package/dist/phone-numbers.js.map +1 -0
- package/dist/place-names.d.ts +55 -0
- package/dist/place-names.d.ts.map +1 -0
- package/dist/place-names.js +196 -0
- package/dist/place-names.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/prerequisite-order.d.ts +16 -0
- package/dist/prerequisite-order.d.ts.map +1 -0
- package/dist/prerequisite-order.js +29 -0
- package/dist/prerequisite-order.js.map +1 -0
- package/dist/profile/parse.d.ts.map +1 -1
- package/dist/profile/parse.js +10 -1
- package/dist/profile/parse.js.map +1 -1
- package/dist/reasons.d.ts +2 -0
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +2 -0
- package/dist/reasons.js.map +1 -1
- package/dist/render/rules-json.d.ts.map +1 -1
- package/dist/render/rules-json.js +4 -0
- package/dist/render/rules-json.js.map +1 -1
- package/dist/render/rules-table.d.ts.map +1 -1
- package/dist/render/rules-table.js +6 -2
- package/dist/render/rules-table.js.map +1 -1
- package/dist/rule-genres.d.ts +5 -2
- package/dist/rule-genres.d.ts.map +1 -1
- package/dist/rule-genres.js +2 -0
- package/dist/rule-genres.js.map +1 -1
- package/dist/rule-load.d.ts.map +1 -1
- package/dist/rule-load.js +2 -1
- package/dist/rule-load.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +5 -1
- package/dist/run.js.map +1 -1
- package/dist/spelling.d.ts +2 -0
- package/dist/spelling.d.ts.map +1 -1
- package/dist/spelling.js +6 -0
- package/dist/spelling.js.map +1 -1
- package/dist/structure/action-due.d.ts +21 -0
- package/dist/structure/action-due.d.ts.map +1 -0
- package/dist/structure/action-due.js +126 -0
- package/dist/structure/action-due.js.map +1 -0
- package/dist/structure/amount-range.d.ts +30 -0
- package/dist/structure/amount-range.d.ts.map +1 -0
- package/dist/structure/amount-range.js +153 -0
- package/dist/structure/amount-range.js.map +1 -0
- package/dist/structure/amount-scale.d.ts +35 -0
- package/dist/structure/amount-scale.d.ts.map +1 -0
- package/dist/structure/amount-scale.js +83 -0
- package/dist/structure/amount-scale.js.map +1 -0
- package/dist/structure/cite.d.ts +5 -2
- package/dist/structure/cite.d.ts.map +1 -1
- package/dist/structure/cite.js +20 -1
- package/dist/structure/cite.js.map +1 -1
- package/dist/structure/counted-amounts.d.ts +12 -0
- package/dist/structure/counted-amounts.d.ts.map +1 -0
- package/dist/structure/counted-amounts.js +30 -0
- package/dist/structure/counted-amounts.js.map +1 -0
- package/dist/structure/date-order.d.ts +24 -3
- package/dist/structure/date-order.d.ts.map +1 -1
- package/dist/structure/date-order.js +49 -17
- package/dist/structure/date-order.js.map +1 -1
- package/dist/structure/date-outside-period.d.ts +27 -0
- package/dist/structure/date-outside-period.d.ts.map +1 -0
- package/dist/structure/date-outside-period.js +86 -0
- package/dist/structure/date-outside-period.js.map +1 -0
- package/dist/structure/definition-use.d.ts +5 -2
- package/dist/structure/definition-use.d.ts.map +1 -1
- package/dist/structure/definition-use.js +11 -3
- package/dist/structure/definition-use.js.map +1 -1
- package/dist/structure/due-date.d.ts +19 -0
- package/dist/structure/due-date.d.ts.map +1 -0
- package/dist/structure/due-date.js +30 -0
- package/dist/structure/due-date.js.map +1 -0
- package/dist/structure/heading-runs.d.ts +9 -0
- package/dist/structure/heading-runs.d.ts.map +1 -0
- package/dist/structure/heading-runs.js +23 -0
- package/dist/structure/heading-runs.js.map +1 -0
- package/dist/structure/install-pin.d.ts +46 -0
- package/dist/structure/install-pin.d.ts.map +1 -0
- package/dist/structure/install-pin.js +85 -0
- package/dist/structure/install-pin.js.map +1 -0
- package/dist/structure/leg-times.d.ts +34 -0
- package/dist/structure/leg-times.d.ts.map +1 -0
- package/dist/structure/leg-times.js +135 -0
- package/dist/structure/leg-times.js.map +1 -0
- package/dist/structure/line-amount-unit.d.ts +24 -0
- package/dist/structure/line-amount-unit.d.ts.map +1 -0
- package/dist/structure/line-amount-unit.js +24 -0
- package/dist/structure/line-amount-unit.js.map +1 -0
- package/dist/structure/line-amount.d.ts +40 -0
- package/dist/structure/line-amount.d.ts.map +1 -0
- package/dist/structure/line-amount.js +118 -0
- package/dist/structure/line-amount.js.map +1 -0
- package/dist/structure/number-word-figure.d.ts +37 -0
- package/dist/structure/number-word-figure.d.ts.map +1 -0
- package/dist/structure/number-word-figure.js +151 -0
- package/dist/structure/number-word-figure.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 +3 -0
- package/dist/structure/numbering.js.map +1 -1
- package/dist/structure/ordinal-runs.d.ts +45 -0
- package/dist/structure/ordinal-runs.d.ts.map +1 -0
- package/dist/structure/ordinal-runs.js +78 -0
- package/dist/structure/ordinal-runs.js.map +1 -0
- package/dist/structure/percent-sum-prose.d.ts +1 -1
- package/dist/structure/percent-sum-prose.d.ts.map +1 -1
- package/dist/structure/percent-sum-prose.js +45 -3
- package/dist/structure/percent-sum-prose.js.map +1 -1
- package/dist/structure/percent-sum.d.ts +8 -0
- package/dist/structure/percent-sum.d.ts.map +1 -1
- package/dist/structure/percent-sum.js +8 -1
- package/dist/structure/percent-sum.js.map +1 -1
- package/dist/structure/release-list.d.ts +9 -0
- package/dist/structure/release-list.d.ts.map +1 -0
- package/dist/structure/release-list.js +46 -0
- package/dist/structure/release-list.js.map +1 -0
- package/dist/structure/share-column.d.ts +7 -0
- package/dist/structure/share-column.d.ts.map +1 -0
- package/dist/structure/share-column.js +22 -0
- package/dist/structure/share-column.js.map +1 -0
- package/dist/structure/stated-period.d.ts +31 -0
- package/dist/structure/stated-period.d.ts.map +1 -0
- package/dist/structure/stated-period.js +127 -0
- package/dist/structure/stated-period.js.map +1 -0
- package/dist/structure/subject-change.d.ts +8 -0
- package/dist/structure/subject-change.d.ts.map +1 -0
- package/dist/structure/subject-change.js +31 -0
- package/dist/structure/subject-change.js.map +1 -0
- package/dist/structure/tax.d.ts +25 -0
- package/dist/structure/tax.d.ts.map +1 -0
- package/dist/structure/tax.js +86 -0
- package/dist/structure/tax.js.map +1 -0
- package/dist/structure/time-marks.d.ts +58 -0
- package/dist/structure/time-marks.d.ts.map +1 -0
- package/dist/structure/time-marks.js +74 -0
- package/dist/structure/time-marks.js.map +1 -0
- package/dist/structure/time-order.d.ts +21 -0
- package/dist/structure/time-order.d.ts.map +1 -0
- package/dist/structure/time-order.js +108 -0
- package/dist/structure/time-order.js.map +1 -0
- package/dist/structure/title-lines.d.ts +8 -0
- package/dist/structure/title-lines.d.ts.map +1 -0
- package/dist/structure/title-lines.js +27 -0
- package/dist/structure/title-lines.js.map +1 -0
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +3 -1
- package/dist/structure/total.js.map +1 -1
- package/dist/structure/version-mismatch.d.ts +1 -5
- package/dist/structure/version-mismatch.d.ts.map +1 -1
- package/dist/structure/version-mismatch.js +65 -12
- package/dist/structure/version-mismatch.js.map +1 -1
- package/dist/structure/version-order.d.ts +23 -0
- package/dist/structure/version-order.d.ts.map +1 -0
- package/dist/structure/version-order.js +67 -0
- package/dist/structure/version-order.js.map +1 -0
- package/dist/table-text.d.ts +9 -0
- package/dist/table-text.d.ts.map +1 -0
- package/dist/table-text.js +36 -0
- package/dist/table-text.js.map +1 -0
- package/dist/ui-labels.d.ts +16 -0
- package/dist/ui-labels.d.ts.map +1 -0
- package/dist/ui-labels.js +42 -0
- package/dist/ui-labels.js.map +1 -0
- package/dist/undefined-call.d.ts +13 -0
- package/dist/undefined-call.d.ts.map +1 -0
- package/dist/undefined-call.js +55 -0
- package/dist/undefined-call.js.map +1 -0
- package/dist/unnamed-speaker.d.ts +23 -0
- package/dist/unnamed-speaker.d.ts.map +1 -0
- package/dist/unnamed-speaker.js +176 -0
- package/dist/unnamed-speaker.js.map +1 -0
- package/dist/warning-action.d.ts +22 -0
- package/dist/warning-action.d.ts.map +1 -0
- package/dist/warning-action.js +58 -0
- package/dist/warning-action.js.map +1 -0
- package/genres.yaml +2 -0
- package/package.json +4 -3
- package/profiles/statute.yaml +8 -0
- package/rules/agreement-slip.yaml +2 -2
- package/rules/amount-range-reversed.yaml +52 -0
- package/rules/amount-scale-consistency.yaml +74 -0
- package/rules/announced-count-mismatch.yaml +9 -4
- package/rules/arrival-before-departure.yaml +48 -0
- package/rules/change-rate-mismatch.yaml +5 -4
- package/rules/connective-hierarchy.yaml +3 -3
- package/rules/currency-notation-consistency.yaml +2 -2
- package/rules/date-order.yaml +9 -4
- package/rules/date-outside-period.yaml +64 -0
- package/rules/default-value-mismatch.yaml +79 -0
- package/rules/defined-term-form.yaml +9 -7
- package/rules/deprecated-option-used.yaml +78 -0
- package/rules/doubled-nado.yaml +28 -12
- package/rules/due-before-issue.yaml +68 -0
- package/rules/duplicate-definition.yaml +2 -2
- package/rules/duration-mismatch.yaml +12 -4
- package/rules/elapsed-years-mismatch.yaml +2 -2
- package/rules/heading-echo.yaml +2 -2
- package/rules/hyphen-as-dash.yaml +2 -2
- package/rules/kana-function-word.yaml +58 -0
- package/rules/latin-spacing.yaml +6 -5
- package/rules/line-amount-mismatch.yaml +58 -0
- package/rules/nado-closed-list.yaml +77 -0
- package/rules/name-variant.yaml +17 -2
- package/rules/number-word-figure-mismatch.yaml +76 -0
- package/rules/numbering-gap.yaml +2 -2
- package/rules/obligation-without-deadline.yaml +95 -0
- package/rules/one-sentence-paragraph-run.yaml +2 -3
- package/rules/parameter-table-mismatch.yaml +90 -0
- package/rules/percent-sum-mismatch.yaml +2 -2
- package/rules/phone-number-variant.yaml +68 -0
- package/rules/prerequisite-after-step.yaml +78 -0
- package/rules/quote-unnamed-speaker.yaml +67 -0
- package/rules/quote-without-source.yaml +6 -6
- package/rules/requirement-smell.yaml +3 -3
- package/rules/sentence-initial-conjunction-run.yaml +13 -7
- package/rules/summary-fact-mismatch.yaml +4 -4
- package/rules/tax-mismatch.yaml +71 -0
- package/rules/time-order.yaml +65 -0
- package/rules/title-length.yaml +2 -2
- package/rules/ui-label-variant.yaml +70 -0
- package/rules/unbalanced-bracket.yaml +4 -4
- package/rules/uncomparable-graded.yaml +29 -10
- package/rules/undefined-function-call.yaml +77 -0
- package/rules/undefined-term.yaml +72 -0
- package/rules/unknown-word.yaml +2 -2
- package/rules/unqualified-superlative.yaml +2 -2
- package/rules/use-before-definition.yaml +2 -2
- package/rules/version-mismatch.yaml +12 -4
- package/rules/version-order.yaml +85 -0
- package/rules/very-adjective.yaml +31 -13
- package/rules/warning-without-action.yaml +64 -0
- package/rules/wordy-phrase.yaml +27 -9
- package/src/ai-score/of-document.ts +19 -9
- package/src/ai-score/render.ts +24 -4
- package/src/ai-score/score.ts +24 -3
- package/src/ai-score/signals.ts +12 -2
- package/src/ai-score/text.ts +7 -2
- package/src/announced-count.ts +19 -12
- package/src/check-source.ts +11 -2
- package/src/cli-text.ts +42 -18
- package/src/cli.ts +2 -1
- package/src/commands/cite-claims.ts +103 -0
- package/src/commands/cite-page.ts +61 -0
- package/src/commands/cite-scaffold.ts +27 -0
- package/src/commands/cite.ts +127 -58
- package/src/company-names.ts +202 -0
- package/src/default-values.ts +158 -0
- package/src/deprecated-use.ts +122 -0
- package/src/derived/number-word-counts.ts +28 -0
- package/src/derived/stays.ts +145 -0
- package/src/detectors/acronym-context.ts +10 -2
- package/src/detectors/address-word.ts +9 -0
- package/src/detectors/agreement-slip.ts +7 -1
- package/src/detectors/ai-phrasing.ts +6 -1
- package/src/detectors/amount-range.ts +54 -0
- package/src/detectors/amount-scale.ts +96 -0
- package/src/detectors/announced-count.ts +29 -11
- package/src/detectors/bare-comparative.ts +7 -2
- package/src/detectors/block-quotation.ts +95 -0
- package/src/detectors/bracket-label.ts +58 -0
- package/src/detectors/change-rate.ts +15 -2
- package/src/detectors/citation-entry.ts +20 -5
- package/src/detectors/code-before.ts +14 -0
- package/src/detectors/connective-hierarchy.ts +39 -11
- package/src/detectors/currency-notation.ts +4 -3
- package/src/detectors/date-outside-period.ts +38 -0
- package/src/detectors/default-values.ts +17 -0
- package/src/detectors/defined-term-form.ts +84 -15
- package/src/detectors/definition-use.ts +10 -2
- package/src/detectors/deprecated-use.ts +17 -0
- package/src/detectors/derived-numbers.ts +115 -17
- package/src/detectors/document-shape.ts +6 -1
- package/src/detectors/due-date.ts +47 -0
- package/src/detectors/en-shape.ts +27 -11
- package/src/detectors/fact-consistency.ts +110 -2
- package/src/detectors/heading-echo.ts +11 -1
- package/src/detectors/kana-function-word.ts +71 -0
- package/src/detectors/line-amount.ts +33 -0
- package/src/detectors/location-pointer.ts +30 -0
- package/src/detectors/mark-shape.ts +18 -1
- package/src/detectors/nado-closed-list.ts +25 -0
- package/src/detectors/name-variant.ts +114 -11
- package/src/detectors/next-word.ts +56 -9
- package/src/detectors/number-word-figure.ts +43 -0
- package/src/detectors/obligation-without-deadline.ts +192 -0
- package/src/detectors/open-end-names.ts +140 -0
- package/src/detectors/ordinal-run-gaps.ts +101 -0
- package/src/detectors/orthographic-variant.ts +39 -14
- package/src/detectors/orthography.ts +6 -1
- package/src/detectors/parameter-table.ts +17 -0
- package/src/detectors/phone-number-variant.ts +18 -0
- package/src/detectors/prerequisite-order.ts +35 -0
- package/src/detectors/quote-unnamed-speaker.ts +19 -0
- package/src/detectors/quote-without-source.ts +57 -10
- package/src/detectors/registry/amount-range.ts +4 -0
- package/src/detectors/registry/amount-scale.ts +4 -0
- package/src/detectors/registry/arrival-before-departure.ts +4 -0
- package/src/detectors/registry/date-outside-period.ts +4 -0
- package/src/detectors/registry/default-values.ts +4 -0
- package/src/detectors/registry/deprecated-use.ts +4 -0
- package/src/detectors/registry/due-date.ts +4 -0
- package/src/detectors/registry/kana-function-word.ts +4 -0
- package/src/detectors/registry/line-amount.ts +4 -0
- package/src/detectors/registry/nado-closed-list.ts +4 -0
- package/src/detectors/registry/number-word-figure.ts +4 -0
- package/src/detectors/registry/obligation-without-deadline.ts +4 -0
- package/src/detectors/registry/parameter-table.ts +4 -0
- package/src/detectors/registry/phone-number-variant.ts +4 -0
- package/src/detectors/registry/prerequisite-order.ts +4 -0
- package/src/detectors/registry/quote-unnamed-speaker.ts +4 -0
- package/src/detectors/registry/tax-amount.ts +4 -0
- package/src/detectors/registry/time-order.ts +4 -0
- package/src/detectors/registry/ui-label.ts +4 -0
- package/src/detectors/registry/undefined-call.ts +4 -0
- package/src/detectors/registry/undefined-term.ts +4 -0
- package/src/detectors/registry/version-order.ts +4 -0
- package/src/detectors/registry/warning-action.ts +4 -0
- package/src/detectors/requirement-smell.ts +29 -9
- package/src/detectors/structure-tree.ts +43 -21
- package/src/detectors/superlative-scope.ts +13 -1
- package/src/detectors/tax-amount.ts +25 -0
- package/src/detectors/technical-docs.ts +7 -1
- package/src/detectors/term-extension.ts +67 -0
- package/src/detectors/time-order.ts +49 -0
- package/src/detectors/ui-label.ts +17 -0
- package/src/detectors/unbalanced-bracket.ts +7 -14
- package/src/detectors/undefined-call.ts +19 -0
- package/src/detectors/undefined-term.ts +103 -0
- package/src/detectors/unknown-word.ts +3 -3
- package/src/detectors/vague-deadline.ts +3 -3
- package/src/detectors/version-mismatch.ts +26 -5
- package/src/detectors/version-order.ts +50 -0
- package/src/detectors/warning-action.ts +49 -0
- package/src/facts/condition-pairs.ts +289 -0
- package/src/facts/counted-facts.ts +59 -0
- package/src/facts/event-dates.ts +63 -0
- package/src/facts/fact-scope.ts +6 -0
- package/src/facts/labelled-facts.ts +13 -1
- package/src/facts/table-facts.ts +3 -3
- package/src/grade/ai-score.ts +1 -1
- package/src/grade/text.ts +2 -2
- package/src/heading-numbering.ts +2 -2
- package/src/html/fetch-page.ts +64 -0
- package/src/html/fetched-text.ts +32 -0
- package/src/html/html-content-block.ts +107 -0
- package/src/html/html-elements.ts +127 -0
- package/src/html/html-footnote-marks.ts +20 -0
- package/src/html/html-heading-links.ts +93 -0
- package/src/html/html-lost-tags.ts +14 -0
- package/src/html/html-markdown.ts +481 -0
- package/src/html/html-preformatted.ts +110 -0
- package/src/html/html-reader-only.ts +82 -0
- package/src/html/html-run-in-headings.ts +43 -0
- package/src/html/html-tables.ts +76 -0
- package/src/html/html-widgets.ts +114 -0
- package/src/html/markup-text.ts +35 -0
- package/src/html/page-document.ts +22 -0
- package/src/inline-count.ts +146 -0
- package/src/kana-spelling.ts +7 -0
- package/src/location-part.ts +30 -0
- package/src/nado-closed-list.ts +106 -0
- package/src/name-cue.ts +35 -0
- package/src/name-variants.ts +152 -11
- package/src/paragraph-runs.ts +12 -2
- package/src/parameter-table.ts +208 -0
- package/src/phone-numbers.ts +98 -0
- package/src/place-names.ts +248 -0
- package/src/plugin.ts +4 -0
- package/src/prerequisite-order.ts +39 -0
- package/src/profile/parse.ts +10 -1
- package/src/reasons.ts +4 -0
- package/src/render/rules-json.ts +4 -0
- package/src/render/rules-table.ts +6 -3
- package/src/rule-genres.ts +5 -2
- package/src/rule-load.ts +3 -2
- package/src/run.ts +3 -1
- package/src/spelling.ts +8 -0
- package/src/structure/action-due.ts +179 -0
- package/src/structure/amount-range.ts +219 -0
- package/src/structure/amount-scale.ts +115 -0
- package/src/structure/cite.ts +21 -2
- package/src/structure/counted-amounts.ts +42 -0
- package/src/structure/date-order.ts +72 -22
- package/src/structure/date-outside-period.ts +127 -0
- package/src/structure/definition-use.ts +24 -3
- package/src/structure/due-date.ts +46 -0
- package/src/structure/heading-runs.ts +24 -0
- package/src/structure/install-pin.ts +115 -0
- package/src/structure/leg-times.ts +198 -0
- package/src/structure/line-amount-unit.ts +35 -0
- package/src/structure/line-amount.ts +162 -0
- package/src/structure/number-word-figure.ts +199 -0
- package/src/structure/numbering.ts +3 -0
- package/src/structure/ordinal-runs.ts +107 -0
- package/src/structure/percent-sum-prose.ts +46 -3
- package/src/structure/percent-sum.ts +16 -2
- package/src/structure/release-list.ts +69 -0
- package/src/structure/share-column.ts +25 -0
- package/src/structure/stated-period.ts +161 -0
- package/src/structure/subject-change.ts +35 -0
- package/src/structure/tax.ts +114 -0
- package/src/structure/time-marks.ts +127 -0
- package/src/structure/time-order.ts +140 -0
- package/src/structure/title-lines.ts +33 -0
- package/src/structure/total.ts +5 -1
- package/src/structure/version-mismatch.ts +67 -13
- package/src/structure/version-order.ts +84 -0
- package/src/table-text.ts +39 -0
- package/src/ui-labels.ts +55 -0
- package/src/undefined-call.ts +65 -0
- package/src/unnamed-speaker.ts +224 -0
- package/src/warning-action.ts +73 -0
- package/styles/koyobun.yaml +7 -4
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
id: version-order
|
|
2
|
+
layer: L1
|
|
3
|
+
status: stable
|
|
4
|
+
how_to_find: version-order
|
|
5
|
+
requires: [markdown]
|
|
6
|
+
severity: warning
|
|
7
|
+
|
|
8
|
+
name:
|
|
9
|
+
ja: 版の並びが前後している
|
|
10
|
+
en: A version out of order in a changelog
|
|
11
|
+
|
|
12
|
+
why:
|
|
13
|
+
ja: 変更履歴は新しい版から順に(または古い版から順に)並べるのが決まりです。一つだけ並びから外れた版があると、読み手はどれが最新か、どの変更がどの版に入ったかを取り違えます。版を書き間違えたときや、項目を違う場所に足したときに起きます。見出しや箇条書き、表の行の先頭に書いた版(3.2.0、v3.2.0、[3.2.0])を並びとして読み、並びの向きは多いほうで決めて、その向きの最も長い並びに入らない版を指します。
|
|
14
|
+
en: A changelog lists its versions newest first (or oldest first). One version out of that order makes the reader mistake which release is the latest, or which change went into which release. It happens when a version is mistyped or an entry is added in the wrong place. The versions at the start of headings, list items or table rows (3.2.0, v3.2.0, [3.2.0]) are read as a sequence; its direction is taken from most of its steps, and a version that fits in no longest run along that direction is pointed out.
|
|
15
|
+
|
|
16
|
+
message:
|
|
17
|
+
ja: 「{version}」が、前後の版の並びから外れています(前は「{previous}」)
|
|
18
|
+
en: "{version} breaks the order of the versions around it (after {previous})"
|
|
19
|
+
|
|
20
|
+
how_to_fix:
|
|
21
|
+
ja: 版の番号を確かめて、書き間違いなら直し、置き場所が違うなら正しい位置へ移してください。
|
|
22
|
+
en: Check the version number. Correct it if it is a typo, or move the entry to where it belongs.
|
|
23
|
+
|
|
24
|
+
levels: { strict: error, normal: warning, relaxed: info }
|
|
25
|
+
|
|
26
|
+
use_for: [technical, docs, blog, legal, academic, literature, speech]
|
|
27
|
+
off_for:
|
|
28
|
+
legal: "Changelogs and release lists belong to technical writing."
|
|
29
|
+
academic: "Changelogs and release lists belong to technical writing."
|
|
30
|
+
literature: "Changelogs and release lists belong to technical writing."
|
|
31
|
+
speech: "Changelogs and release lists belong to technical writing."
|
|
32
|
+
|
|
33
|
+
group: facts
|
|
34
|
+
summary:
|
|
35
|
+
ja: 変更履歴の見出しや版の一覧で、一つだけ順番から外れた版
|
|
36
|
+
en: One version out of order in a changelog or a list of releases
|
|
37
|
+
example:
|
|
38
|
+
ja:
|
|
39
|
+
config: { genre: technical/readme }
|
|
40
|
+
before: |
|
|
41
|
+
# 変更履歴
|
|
42
|
+
|
|
43
|
+
## 3.2.0 - 2026-09-14
|
|
44
|
+
|
|
45
|
+
## 3.1.1 - 2026-07-08
|
|
46
|
+
|
|
47
|
+
## 3.3.0 - 2026-06-02
|
|
48
|
+
|
|
49
|
+
## 3.0.0 - 2026-03-20
|
|
50
|
+
after: |
|
|
51
|
+
# 変更履歴
|
|
52
|
+
|
|
53
|
+
## 3.2.0 - 2026-09-14
|
|
54
|
+
|
|
55
|
+
## 3.1.1 - 2026-07-08
|
|
56
|
+
|
|
57
|
+
## 3.1.0 - 2026-06-02
|
|
58
|
+
|
|
59
|
+
## 3.0.0 - 2026-03-20
|
|
60
|
+
en:
|
|
61
|
+
config: { genre: technical/readme }
|
|
62
|
+
before: |
|
|
63
|
+
# Changelog
|
|
64
|
+
|
|
65
|
+
## 3.2.0 - 2026-09-14
|
|
66
|
+
|
|
67
|
+
## 3.1.1 - 2026-07-08
|
|
68
|
+
|
|
69
|
+
## 3.3.0 - 2026-06-02
|
|
70
|
+
|
|
71
|
+
## 3.0.0 - 2026-03-20
|
|
72
|
+
after: |
|
|
73
|
+
# Changelog
|
|
74
|
+
|
|
75
|
+
## 3.2.0 - 2026-09-14
|
|
76
|
+
|
|
77
|
+
## 3.1.1 - 2026-07-08
|
|
78
|
+
|
|
79
|
+
## 3.1.0 - 2026-06-02
|
|
80
|
+
|
|
81
|
+
## 3.0.0 - 2026-03-20
|
|
82
|
+
|
|
83
|
+
not_flagged:
|
|
84
|
+
ja: 並べた版が三つ未満のもの、上がりと下がりが同じ数で向きが決まらないもの、向きに沿う版が半分以下の一覧(名前順の一覧)、同じ版の繰り返し、文の中の版、コードブロックの中の例、点で三つに区切っていない番号(3.1、22.04)は見ません。末尾が 0 の版(3.1.0)が無く上がっていく並び(1.2.1、1.2.2)は節の番号として numbering-gap が見ます。見出しは同じ深さどうし、箇条書きと表は続いた行どうしを比べます。
|
|
85
|
+
en: "Fewer than three versions, a sequence with as many steps up as down, a list where no more than half of the versions follow one direction (sorted by name), a repeated version, versions in running text, examples in a code block, and numbers not in three dotted parts (3.1, 22.04) are not checked. A sequence that goes up with no version ending in zero (1.2.1, 1.2.2) is read as section numbers, which numbering-gap checks. Headings are compared with headings of the same depth, and list items and table rows with the lines they run on from."
|
|
@@ -3,26 +3,26 @@ layer: L2
|
|
|
3
3
|
status: stable
|
|
4
4
|
how_to_find: intensified-adjective
|
|
5
5
|
word_list: very-intensifier
|
|
6
|
-
extra_word_lists: [very-exception]
|
|
6
|
+
extra_word_lists: [very-exception, very-copula]
|
|
7
7
|
requires: [pos]
|
|
8
|
-
languages: [en]
|
|
8
|
+
languages: [ja, en]
|
|
9
9
|
severity: info
|
|
10
10
|
|
|
11
11
|
name:
|
|
12
|
-
ja:
|
|
12
|
+
ja: 「とても + 形容詞」(very + 形容詞)の多用
|
|
13
13
|
en: Too many "very" + adjective
|
|
14
14
|
|
|
15
15
|
why:
|
|
16
|
-
ja:
|
|
17
|
-
en: '"Very important" and "very good" lean on "very" where a stronger word (critical, excellent), or saying what and how much, would do. One or two are ordinary; many for the length make every "very" weightless.
|
|
16
|
+
ja: 「とても便利」「非常に危険」(英語の very important、very good)の強めは、何がどう便利なのか、どの程度危険なのかを書けば要らない語です。一つ二つなら普通ですが、文書の長さのわりに多いと、どの強めも効かなくなります。強めの語と、数えない言い方(the very first、very few)は言語ごとの語彙表にあります。
|
|
17
|
+
en: '"Very important" and "very good" (とても便利, 非常に危険) lean on "very" where a stronger word (critical, excellent), or saying what and how much, would do. One or two are ordinary; many for the length make every "very" weightless. The intensifiers, and set phrases not counted such as "the very first" and "very few", are listed in the lexicon.'
|
|
18
18
|
|
|
19
19
|
message:
|
|
20
|
-
ja: 「{matched}
|
|
20
|
+
ja: 「{matched}」など、強め + 形容詞が 1000 字あたり {density} 個あります({limit} 個まで)
|
|
21
21
|
en: '"{matched}" and other "very" + adjective: {density} per 1000 words (limit {limit})'
|
|
22
22
|
|
|
23
23
|
how_to_fix:
|
|
24
|
-
ja:
|
|
25
|
-
en: Use a stronger word, or say what and how much ("very important" → "critical", "very fast" → "under a second").
|
|
24
|
+
ja: 強めを外して、何がどの程度なのかを書いてください(とても速い → 1 秒以内に開く、very important → critical)。
|
|
25
|
+
en: Use a stronger word, or say what and how much ("very important" → "critical", "very fast" → "under a second"; とても速い → 1 秒以内に開く).
|
|
26
26
|
|
|
27
27
|
levels: { strict: 1, normal: 2, relaxed: 4 }
|
|
28
28
|
|
|
@@ -33,9 +33,15 @@ off_for:
|
|
|
33
33
|
|
|
34
34
|
group: wording
|
|
35
35
|
summary:
|
|
36
|
-
ja:
|
|
37
|
-
en: '"Very" + adjective, such as "very important", dense for the document''s length'
|
|
36
|
+
ja: 「とても便利」「非常に危険」(very important)のような強め + 形容詞が、文書の長さのわりに多い所
|
|
37
|
+
en: '"Very" + adjective, such as "very important" (とても便利), dense for the document''s length'
|
|
38
38
|
example:
|
|
39
|
+
ja:
|
|
40
|
+
pad: true
|
|
41
|
+
before: |
|
|
42
|
+
新しい画面はとても便利です。読み込みもすごく速いです。ただ、設定は非常に複雑です。
|
|
43
|
+
after: |
|
|
44
|
+
新しい画面では、よく使う三つの操作が一か所にまとまりました。読み込みは 1 秒以内です。ただ、設定の項目は 40 あります。
|
|
39
45
|
en:
|
|
40
46
|
pad: true
|
|
41
47
|
before: |
|
|
@@ -44,13 +50,25 @@ example:
|
|
|
44
50
|
The launch was critical. The team was stretched, and the plan held.
|
|
45
51
|
|
|
46
52
|
not_flagged:
|
|
47
|
-
ja:
|
|
48
|
-
en: Only "very" before an adjective ("very well" is not counted), and not "the very first", "very few" or "very much". Short documents are not measured. The fiction and speech presets turn it off, since dialogue speaks that way.
|
|
53
|
+
ja: 強めの後ろが形容詞のときだけ数えます(very well、とても助かる は数えない)。日本語の「便利」「静か」のような語は、後ろに「な」「で」「だ」「です」が続くときだけ形容詞と見ます。「the very first」「very few」「very much」と、empty-intensifier が見る「とても重要」は数えません。「大変」は決まった挨拶(大変お世話になりました)に使うので数えません。短い文書は密度を測りません。小説と話し言葉では既定で止めています(会話の言葉のため)。
|
|
54
|
+
en: Only "very" before an adjective ("very well" is not counted), and not "the very first", "very few" or "very much". In Japanese, a word such as 便利 counts as an adjective only before な, で, だ or です; とても重要 is left to empty-intensifier, and 大変, used in set courtesies (大変お世話になりました), is not counted. Short documents are not measured. The fiction and speech presets turn it off, since dialogue speaks that way.
|
|
49
55
|
level_meaning:
|
|
50
|
-
ja:
|
|
56
|
+
ja: 強め + 形容詞が 1000 字あたり {limit} 個まで
|
|
51
57
|
en: up to {limit} "very" + adjective per 1000 words
|
|
52
58
|
rewrite:
|
|
53
59
|
depth: light
|
|
60
|
+
ja:
|
|
61
|
+
direction: 強め(とても、すごく、非常に)を外し、本文や出典が言う具体(数、何がどうなのか)に置き換えてください。本文が何も言っていなければ、強めを外した形容詞だけにします。
|
|
62
|
+
pairs:
|
|
63
|
+
- before: 新しい画面はとても便利です。
|
|
64
|
+
after: 新しい画面では、よく使う三つの操作が一か所にまとまりました。
|
|
65
|
+
- before: 読み込みがすごく速いです。
|
|
66
|
+
after: 読み込みは 1 秒以内です。
|
|
67
|
+
keep:
|
|
68
|
+
- 各文の主張
|
|
69
|
+
avoid:
|
|
70
|
+
- 強めを別の強め(本当に、極めて)に替えるだけ
|
|
71
|
+
- 本文に無い数を作る
|
|
54
72
|
en:
|
|
55
73
|
direction: Replace "very" + adjective with a stronger single word, or with what the text says about how much. If the text says nothing more, a plain adjective without "very" will do.
|
|
56
74
|
pairs:
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
id: warning-without-action
|
|
2
|
+
layer: L3
|
|
3
|
+
status: stable
|
|
4
|
+
how_to_find: warning-action
|
|
5
|
+
# The labels and the words of an action come from the language's warning-label and warning-action lexicons; an English
|
|
6
|
+
# sentence that opens with its verb is read from the parts of speech when they are available.
|
|
7
|
+
uses: [pos]
|
|
8
|
+
languages: [ja, en]
|
|
9
|
+
severity: info
|
|
10
|
+
|
|
11
|
+
name:
|
|
12
|
+
ja: することの書かれていない注意書き
|
|
13
|
+
en: Warning that gives no action
|
|
14
|
+
|
|
15
|
+
why:
|
|
16
|
+
ja: 「注意:復元すると、今のデータベースは置き換わります。」のように危険だけを書いた注意書きは、読み手を不安にするだけで、何をすれば防げるのかを教えません。手順書の注意書きは、何が起きるかと、それを防ぐために読み手がすること(先に書き出す、電源を切らない)を一緒に書くものです。「注意」「警告」「危険」で始まる段落の、どの文にも「〜してください」「〜しないこと」のような読み手のすることが無いとき指します。
|
|
17
|
+
en: 'A warning that only names a risk ("Warning: the restore replaces the current database.") alarms the reader without saying how to avoid it. A warning in a manual says what happens and what the reader does to prevent it (export first, do not unplug the drive). A paragraph that opens with Warning, Caution or Danger is reported when none of its sentences tells the reader what to do: no "do not", "make sure", "must" and no sentence that opens with its verb ("Export today''s orders first").'
|
|
18
|
+
|
|
19
|
+
message:
|
|
20
|
+
ja: この注意書きは危険を述べるだけで、読み手がすることを書いていません
|
|
21
|
+
en: This warning names a risk but not what the reader should do
|
|
22
|
+
|
|
23
|
+
how_to_fix:
|
|
24
|
+
ja: 危険を避けるために読み手がすることを、同じ段落に書き足してください(「先に〜を書き出してください」「〜の間は電源を切らないでください」)。
|
|
25
|
+
en: Add what the reader does to avoid the risk to the same paragraph ("Export today's orders first", "Do not unplug the drive while it runs").
|
|
26
|
+
|
|
27
|
+
levels: { strict: warning, normal: info, relaxed: info }
|
|
28
|
+
|
|
29
|
+
use_for: [technical, docs, blog, legal, academic, literature, speech]
|
|
30
|
+
off_for:
|
|
31
|
+
legal: "Warnings with an action to take are a convention of manuals and technical writing."
|
|
32
|
+
academic: "Warnings with an action to take are a convention of manuals and technical writing."
|
|
33
|
+
literature: "Warnings with an action to take are a convention of manuals and technical writing."
|
|
34
|
+
speech: "Warnings with an action to take are a convention of manuals and technical writing."
|
|
35
|
+
|
|
36
|
+
group: wording
|
|
37
|
+
summary:
|
|
38
|
+
ja: 「注意」「警告」で始まる段落で、危険だけを書き、読み手のすること(〜してください、〜しないこと)が無いもの
|
|
39
|
+
en: A paragraph opening with Warning or Caution that names a risk and no action for the reader
|
|
40
|
+
example:
|
|
41
|
+
ja:
|
|
42
|
+
config: { genre: docs/manual }
|
|
43
|
+
before: |
|
|
44
|
+
# バックアップを復元する
|
|
45
|
+
|
|
46
|
+
注意:復元すると、今のデータベースは置き換わります。
|
|
47
|
+
after: |
|
|
48
|
+
# バックアップを復元する
|
|
49
|
+
|
|
50
|
+
注意:復元すると、今のデータベースは置き換わります。先に、今日の注文を書き出してください。
|
|
51
|
+
en:
|
|
52
|
+
config: { genre: docs/manual }
|
|
53
|
+
before: |
|
|
54
|
+
# Restoring a backup
|
|
55
|
+
|
|
56
|
+
Warning: the restore replaces the current database.
|
|
57
|
+
after: |
|
|
58
|
+
# Restoring a backup
|
|
59
|
+
|
|
60
|
+
Warning: the restore replaces the current database. Export today's orders first.
|
|
61
|
+
|
|
62
|
+
not_flagged:
|
|
63
|
+
ja: 「注意」「警告」「危険」をそれだけで頭に置いた段落(「注意:」「**警告**」「> [!WARNING]」)だけを読みます。GitHub の注意(> [!WARNING])は引用の終わりまでを一つの注意書きとして読みます。箇条書きの項目の中の注意書き、「メモ」「ヒント」「重要」の段落、「注意深く」のように語の一部になったもの、どれかの文が読み手のすること(〜してください、〜しないこと、〜する必要があります)で終わる注意書きは指しません。技術文書・手順書・ブログでだけ動きます。
|
|
64
|
+
en: 'Only paragraphs opening with Warning, Caution or Danger standing alone ("Warning:", "**Caution**", "> [!WARNING]") are read. A GitHub alert (> [!WARNING]) is read to the end of its block quote. Warnings inside list items, notes, tips and "Important" paragraphs, words that merely start with the label ("Warnings are logged"), and warnings with any sentence that gives an action (do not, make sure, must, or a sentence opening with its verb) are not reported. Technical documents, manuals and blogs only.'
|
package/rules/wordy-phrase.yaml
CHANGED
|
@@ -4,7 +4,7 @@ status: stable
|
|
|
4
4
|
how_to_find: phrase-match
|
|
5
5
|
word_list: wordy-phrase
|
|
6
6
|
requires: [pos]
|
|
7
|
-
languages: [en]
|
|
7
|
+
languages: [ja, en]
|
|
8
8
|
severity: info
|
|
9
9
|
|
|
10
10
|
name:
|
|
@@ -12,16 +12,16 @@ name:
|
|
|
12
12
|
en: Wordy phrase
|
|
13
13
|
|
|
14
14
|
why:
|
|
15
|
-
ja:
|
|
16
|
-
en: '"In order to", "due to the fact that" and "at this point in time" say in several words what "to", "because" and "now" say in one. The reader reads more and learns nothing more. The phrases and their short forms are listed in the lexicon. Phrases that contracts and statutes use on purpose ("with regard to", "prior to") are left out.'
|
|
15
|
+
ja: 「することが可能」「現時点において」(英語の in order to、at this point in time)は、「できる」「現在」と同じことを何語もかけて言います。読み手は語を多く読むだけで、得るものは増えません。言い回しと短い形の組は言語ごとの語彙表にあります。契約や法令がわざと使う言い方(with regard to、prior to)は入れていません。
|
|
16
|
+
en: '"In order to", "due to the fact that" and "at this point in time" (することが可能, 現時点において) say in several words what "to", "because" and "now" say in one. The reader reads more and learns nothing more. The phrases and their short forms are listed in the lexicon. Phrases that contracts and statutes use on purpose ("with regard to", "prior to") are left out.'
|
|
17
17
|
|
|
18
18
|
message:
|
|
19
19
|
ja: 「{matched}」は、もっと短く言えます
|
|
20
20
|
en: '"{matched}" can be said in fewer words'
|
|
21
21
|
|
|
22
22
|
how_to_fix:
|
|
23
|
-
ja:
|
|
24
|
-
en: Use the short form ("in order to" → "to", "due to the fact that" → "because", "in the event that" → "if").
|
|
23
|
+
ja: 短い形に置き換えてください(することが可能です → できます、現時点において → 現在、in order to → to、due to the fact that → because)。
|
|
24
|
+
en: Use the short form ("in order to" → "to", "due to the fact that" → "because", "in the event that" → "if"; することが可能です → できます).
|
|
25
25
|
|
|
26
26
|
# 指摘に要る文の数。1 つなら書き手の癖とは言えないので、2 つから。
|
|
27
27
|
levels: { strict: 1, normal: 2, relaxed: 4 }
|
|
@@ -34,9 +34,14 @@ off_for:
|
|
|
34
34
|
|
|
35
35
|
group: wording
|
|
36
36
|
summary:
|
|
37
|
-
ja:
|
|
38
|
-
en: Phrases such as "in order to" and "due to the fact that" that take several words to say what one says
|
|
37
|
+
ja: 「することが可能」「現時点において」(in order to、due to the fact that)のように、一語で言えることを何語もかけて言う所
|
|
38
|
+
en: Phrases such as "in order to" and "due to the fact that" (することが可能, 現時点において) that take several words to say what one says
|
|
39
39
|
example:
|
|
40
|
+
ja:
|
|
41
|
+
before: |
|
|
42
|
+
資料は社内から閲覧することが可能です。現時点において、追加の予定はありません。
|
|
43
|
+
after: |
|
|
44
|
+
資料は社内から閲覧できます。現在、追加の予定はありません。
|
|
40
45
|
en:
|
|
41
46
|
before: |
|
|
42
47
|
In order to save time, we met online. Due to the fact that the room was booked, we stayed home.
|
|
@@ -44,13 +49,26 @@ example:
|
|
|
44
49
|
To save time, we met online. Because the room was booked, we stayed home.
|
|
45
50
|
|
|
46
51
|
not_flagged:
|
|
47
|
-
ja:
|
|
48
|
-
en: Only the phrases on chaff's list are checked
|
|
52
|
+
ja: 一覧にある言い回しだけを見ます。契約や法令がわざと使う言い方(with regard to、prior to、in accordance with)は一覧に入れていません。日本語では、人の書いた文章でもふつうの「することができる」と、名詞として要る「必要性」は入れていません。翻訳調(を可能にする)は translationese-density が、「〜を行う」は nominalization が見ます。
|
|
53
|
+
en: Only the phrases on chaff's list are checked. Phrases that contracts and statutes use on purpose ("with regard to", "prior to", "in accordance with") are not on it. In Japanese, することができる, ordinary in human writing, and 必要性, which a noun phrase may need, are left out; translationese (を可能にする) is translationese-density's and 〜を行う is nominalization's.
|
|
49
54
|
level_meaning:
|
|
50
55
|
ja: 回りくどい言い回しを含む文が {limit} 文あれば指摘
|
|
51
56
|
en: reported once {limit} sentences hold one
|
|
52
57
|
rewrite:
|
|
53
58
|
depth: light
|
|
59
|
+
ja:
|
|
60
|
+
direction: 回りくどい言い回しを、語彙表の短い形に置き換えてください。文のほかの所は変えません。
|
|
61
|
+
pairs:
|
|
62
|
+
- before: 資料は社内から閲覧することが可能です。
|
|
63
|
+
after: 資料は社内から閲覧できます。
|
|
64
|
+
- before: 現時点において、追加の予定はありません。
|
|
65
|
+
after: 現在、追加の予定はありません。
|
|
66
|
+
- before: 今回の結果は成功であると言えます。
|
|
67
|
+
after: 今回の結果は成功です。
|
|
68
|
+
keep:
|
|
69
|
+
- 文のほかの所と、文が言っていること
|
|
70
|
+
avoid:
|
|
71
|
+
- 言い回しを縮めるついでに、文のほかの所を書き換える
|
|
54
72
|
en:
|
|
55
73
|
direction: Replace the wordy phrase with its short form from the lexicon. Leave the rest of the sentence alone.
|
|
56
74
|
pairs:
|
|
@@ -7,7 +7,7 @@ import { MIN_DOCUMENT_LENGTH } from "../detectors/signals.ts";
|
|
|
7
7
|
import { structureOf } from "../structure-shape/of-document.ts";
|
|
8
8
|
import { HUMAN_SHARES } from "./human-shares.ts";
|
|
9
9
|
import { aiScoreOf, type AiScore, type SignalRun } from "./score.ts";
|
|
10
|
-
import { measuredLevelsOf, scoredSignalIds } from "./signals.ts";
|
|
10
|
+
import { compositeSignalIds, measuredLevelsOf, scoredSignalIds } from "./signals.ts";
|
|
11
11
|
|
|
12
12
|
const STRUCTURE_RULE = "ai-structure";
|
|
13
13
|
|
|
@@ -20,27 +20,37 @@ const structureApplies = (rules: readonly RuleDefinition[], genre: string): bool
|
|
|
20
20
|
return rule !== undefined && standingIn(rule, genre, presetLevels(genre)).kind === "on";
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
type SignalResult = { readonly runs: SignalRun[]; readonly compositeFired: string[] };
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The AI-shape rules run on the document at the levels the human shares were measured at, whatever chaff.yaml sets,
|
|
27
|
+
* with ai-structure beside them: it is not counted as a signal, but it is one of the composite's.
|
|
28
|
+
*/
|
|
29
|
+
const signalRuns = (doc: ProseDocument, rules: readonly RuleDefinition[], genre: string): SignalResult => {
|
|
25
30
|
const ofLanguage = rules.filter((rule) => rule.languages === undefined || rule.languages.includes(doc.language));
|
|
26
31
|
const ids = scoredSignalIds(ofLanguage);
|
|
27
|
-
const
|
|
28
|
-
const result = runRulesWith(doc,
|
|
29
|
-
|
|
32
|
+
const runRules = ofLanguage.filter((rule) => ids.includes(rule.id) || rule.id === STRUCTURE_RULE);
|
|
33
|
+
const result = runRulesWith(doc, runRules, { settings: measuredLevelsOf(runRules, presetLevels(genre)), experimental: true, genre });
|
|
34
|
+
const fired = (rule: string): boolean => result.findings.some((finding) => finding.rule === rule);
|
|
35
|
+
const runs = ids.map((rule) => {
|
|
30
36
|
const notRun = result.skipped.find((skip) => skip.rule === rule)?.why;
|
|
31
37
|
const count = result.findings.filter((finding) => finding.rule === rule).length;
|
|
32
38
|
return notRun === undefined ? { rule, count } : { rule, count, notRun };
|
|
33
39
|
});
|
|
40
|
+
return { runs, compositeFired: compositeSignalIds(ofLanguage).filter(fired) };
|
|
34
41
|
};
|
|
35
42
|
|
|
36
43
|
/** The quick score of a document read as lint reads it, against human documents of its genre group. */
|
|
37
|
-
export const aiScoreOfDocument = (doc: ProseDocument, rules: readonly RuleDefinition[], genre: string): AiScore =>
|
|
38
|
-
|
|
44
|
+
export const aiScoreOfDocument = (doc: ProseDocument, rules: readonly RuleDefinition[], genre: string): AiScore => {
|
|
45
|
+
const { runs, compositeFired } = signalRuns(doc, rules, genre);
|
|
46
|
+
return aiScoreOf({
|
|
39
47
|
group: genreGroupOf(genre),
|
|
40
48
|
length: wordsOf(doc),
|
|
41
49
|
minimum: MIN_DOCUMENT_LENGTH[doc.lengthUnit],
|
|
42
50
|
unit: doc.lengthUnit,
|
|
43
|
-
signals:
|
|
51
|
+
signals: runs,
|
|
44
52
|
shares: HUMAN_SHARES,
|
|
45
53
|
structure: structureApplies(rules, genre) ? structureOf(doc) : undefined,
|
|
54
|
+
compositeFired,
|
|
46
55
|
});
|
|
56
|
+
};
|
package/src/ai-score/render.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import type { LengthUnit, Localized } from "../plugin.ts";
|
|
2
2
|
import { localized } from "../render/text.ts";
|
|
3
3
|
import type { StructureText } from "../outline/structure-text.ts";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
HIGH_SIGNS,
|
|
6
|
+
MEDIUM_SIGNS,
|
|
7
|
+
shownSignsOf,
|
|
8
|
+
TOGETHER_SIGNALS,
|
|
9
|
+
type AiScore,
|
|
10
|
+
type NotScored,
|
|
11
|
+
type SignalPlace,
|
|
12
|
+
type StructurePlace,
|
|
13
|
+
type Together,
|
|
14
|
+
} from "./score.ts";
|
|
5
15
|
import type { AiScoreText } from "./text.ts";
|
|
6
16
|
|
|
7
17
|
/** What a rendering needs besides the score: the texts, the rules' names, and the genre group's name, in one language. */
|
|
@@ -46,7 +56,15 @@ const signalLine = (signal: SignalPlace, view: ScoreView): string => {
|
|
|
46
56
|
const namesLine = (names: readonly string[], line: (names: string) => string, view: ScoreView): string[] =>
|
|
47
57
|
names.length === 0 ? [] : [` ${line(names.join(view.text.listSeparator))}`];
|
|
48
58
|
|
|
49
|
-
const
|
|
59
|
+
const COMPOSITE = "ai-generated-composite";
|
|
60
|
+
|
|
61
|
+
const togetherLines = (together: Together, view: ScoreView): string[] => {
|
|
62
|
+
if (!together.counted) return [];
|
|
63
|
+
const names = together.fired.map((rule) => nameOf(rule, view)).join(view.text.listSeparator);
|
|
64
|
+
return [` ${view.text.together(nameOf(COMPOSITE, view), names, together.fired.length, TOGETHER_SIGNALS)}`];
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const signalLines = (signals: readonly SignalPlace[], together: Together, view: ScoreView): string[] => {
|
|
50
68
|
const compared = signals.filter((signal) => signal.human !== undefined);
|
|
51
69
|
const shown = compared.filter((signal) => signal.count > 0);
|
|
52
70
|
const quiet = compared.length - shown.length;
|
|
@@ -55,6 +73,7 @@ const signalLines = (signals: readonly SignalPlace[], view: ScoreView): string[]
|
|
|
55
73
|
return [
|
|
56
74
|
view.text.signalsHeading,
|
|
57
75
|
...shown.map((signal) => ` ${signalLine(signal, view)}`),
|
|
76
|
+
...togetherLines(together, view),
|
|
58
77
|
...(quiet > 0 ? [` ${view.text.quiet(quiet)}`] : []),
|
|
59
78
|
...namesLine(unshared, view.text.noHumanShare, view),
|
|
60
79
|
...namesLine(notRun, view.text.notRun, view),
|
|
@@ -85,7 +104,7 @@ export const renderAiScoreFriendly = (path: string, score: AiScore, view: ScoreV
|
|
|
85
104
|
` ${view.text.signs(score.signs, score.compared, MEDIUM_SIGNS, HIGH_SIGNS)}`,
|
|
86
105
|
` ${view.text.disclaimer}`,
|
|
87
106
|
"",
|
|
88
|
-
...signalLines(score.signals, view),
|
|
107
|
+
...signalLines(score.signals, score.together, view),
|
|
89
108
|
"",
|
|
90
109
|
...structureBlock(score, view),
|
|
91
110
|
];
|
|
@@ -104,7 +123,7 @@ export const aiScoreJson = (score: AiScore): Readonly<Record<string, unknown>> =
|
|
|
104
123
|
group: score.group,
|
|
105
124
|
signs: score.signs,
|
|
106
125
|
compared: score.compared,
|
|
107
|
-
thresholds: { medium: MEDIUM_SIGNS, high: HIGH_SIGNS },
|
|
126
|
+
thresholds: { medium: MEDIUM_SIGNS, high: HIGH_SIGNS, together: TOGETHER_SIGNALS },
|
|
108
127
|
signals: score.signals.map((signal) => ({
|
|
109
128
|
rule: signal.rule,
|
|
110
129
|
count: signal.count,
|
|
@@ -121,4 +140,5 @@ export const aiScoreJson = (score: AiScore): Readonly<Record<string, unknown>> =
|
|
|
121
140
|
beyond: place.beyond,
|
|
122
141
|
sameAs: place.sameAs ?? null,
|
|
123
142
|
})) ?? null,
|
|
143
|
+
together: { fired: score.together.fired, counted: score.together.counted },
|
|
124
144
|
});
|
package/src/ai-score/score.ts
CHANGED
|
@@ -27,6 +27,12 @@ export const MIN_BASELINE_DOCUMENTS = Math.ceil(1 / RARE_SHARE);
|
|
|
27
27
|
export const MEDIUM_SIGNS = 3;
|
|
28
28
|
export const HIGH_SIGNS = 5;
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* In the composite's own signals: ai-generated-composite's strict level, held to it by test_ai_score.ts. That many of
|
|
32
|
+
* them firing in one document is one more sign: `yarn ai-score:corpus --all` shows how many human documents reach it.
|
|
33
|
+
*/
|
|
34
|
+
export const TOGETHER_SIGNALS = 2;
|
|
35
|
+
|
|
30
36
|
export type AiLevel = "low" | "medium" | "high";
|
|
31
37
|
|
|
32
38
|
/** One AI-shape rule's run on the document: how many findings it made, or why it did not run. */
|
|
@@ -43,6 +49,9 @@ export type SignalPlace = SignalRun & {
|
|
|
43
49
|
/** One structure measure against human articles. sameAs: the rule that reads the same shape, when that rule already counts it. */
|
|
44
50
|
export type StructurePlace = Placement & { readonly sameAs: string | undefined };
|
|
45
51
|
|
|
52
|
+
/** The composite's signals that fired in the document, and whether enough fired together to count as one more sign. */
|
|
53
|
+
export type Together = { readonly fired: readonly string[]; readonly counted: boolean };
|
|
54
|
+
|
|
46
55
|
export type NotScored =
|
|
47
56
|
| { readonly reason: "too-short"; readonly length: number; readonly minimum: number; readonly unit: LengthUnit }
|
|
48
57
|
| { readonly reason: "no-baseline"; readonly compared: number; readonly needed: number };
|
|
@@ -59,6 +68,7 @@ export type AiScore = {
|
|
|
59
68
|
readonly signals: readonly SignalPlace[];
|
|
60
69
|
/** The structure measures against human articles, or undefined where they are not compared for the genre. */
|
|
61
70
|
readonly structure: readonly StructurePlace[] | undefined;
|
|
71
|
+
readonly together: Together;
|
|
62
72
|
};
|
|
63
73
|
|
|
64
74
|
/** What the score is computed from. structure: undefined where the structure baseline does not apply to the genre. */
|
|
@@ -70,6 +80,8 @@ export type ScoreInput = {
|
|
|
70
80
|
readonly signals: readonly SignalRun[];
|
|
71
81
|
readonly shares: HumanShares;
|
|
72
82
|
readonly structure: StructureScore | undefined;
|
|
83
|
+
/** The ids of ai-generated-composite's signals that fired, at the levels the human shares were measured at. */
|
|
84
|
+
readonly compositeFired: readonly string[];
|
|
73
85
|
};
|
|
74
86
|
|
|
75
87
|
export const levelOf = (signs: number): AiLevel => {
|
|
@@ -106,16 +118,25 @@ export const aiScoreOf = (input: ScoreInput): AiScore => {
|
|
|
106
118
|
const signals = input.signals.map((run) => placeSignal(run, input.shares, input.group));
|
|
107
119
|
const placements = input.structure?.placements.map((placement) => placeStructure(placement, signals));
|
|
108
120
|
const measures = placements ?? [];
|
|
109
|
-
const
|
|
121
|
+
const together = { fired: input.compositeFired, counted: input.compositeFired.length >= TOGETHER_SIGNALS };
|
|
122
|
+
const signs =
|
|
123
|
+
signals.filter((signal) => signal.unusual).length +
|
|
124
|
+
measures.filter((place) => place.beyond && place.sameAs === undefined).length +
|
|
125
|
+
(together.counted ? 1 : 0);
|
|
110
126
|
const compared =
|
|
111
127
|
signals.filter((signal) => signal.human !== undefined).length +
|
|
112
128
|
measures.filter((place) => place.pastShare !== undefined && !comparedTwice(place, signals)).length;
|
|
113
129
|
const notScored = notScoredOf(input, compared);
|
|
114
|
-
|
|
130
|
+
const level = notScored === undefined ? levelOf(signs) : undefined;
|
|
131
|
+
return { group: input.group, level, notScored, signs, compared, signals, structure: placements, together };
|
|
115
132
|
};
|
|
116
133
|
|
|
117
|
-
/**
|
|
134
|
+
/** How the together sign shows in one line: the composite's id at the level whose count it uses. */
|
|
135
|
+
export const TOGETHER_SIGN = "ai-generated-composite:strict";
|
|
136
|
+
|
|
137
|
+
/** The signs that counted, for one line: rule ids, structure measures as structure:<id>, and TOGETHER_SIGN. */
|
|
118
138
|
export const shownSignsOf = (score: AiScore): string[] => [
|
|
119
139
|
...score.signals.filter((signal) => signal.unusual).map((signal) => signal.rule),
|
|
120
140
|
...(score.structure ?? []).filter((place) => place.beyond && place.sameAs === undefined).map((place) => `structure:${place.feature.id}`),
|
|
141
|
+
...(score.together.counted ? [TOGETHER_SIGN] : []),
|
|
121
142
|
];
|
package/src/ai-score/signals.ts
CHANGED
|
@@ -28,12 +28,22 @@ export const SAME_SHAPE: Readonly<Partial<Record<FeatureId, string>>> = {
|
|
|
28
28
|
"three-item-lists": "rule-of-three",
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
+
/** The signals ai-generated-composite reads: the together sign counts how many of them fired. */
|
|
32
|
+
export const compositeSignalIds = (rules: readonly RuleDefinition[]): readonly string[] => rules.find((rule) => rule.id === COMPOSITE)?.from ?? [];
|
|
33
|
+
|
|
31
34
|
/** The composite's levels: the score's level boundaries are held to them (test_ai_score.ts). */
|
|
32
35
|
export const compositeLevels = (rules: readonly RuleDefinition[]): LevelTable => rules.find((rule) => rule.id === COMPOSITE)?.levels ?? {};
|
|
33
36
|
|
|
34
37
|
/**
|
|
35
38
|
* The level each rule runs at when measured on human documents (`yarn rules:measure`): the genre's level, and normal
|
|
36
|
-
* where the genre turns the rule off, so a share exists for every genre group the rule can run in.
|
|
39
|
+
* where the genre turns the rule off, so a share exists for every genre group the rule can run in. A rule that runs only
|
|
40
|
+
* with a style (opt_in) stays off: how often it fires on documents that never chose the style says nothing about it.
|
|
37
41
|
*/
|
|
42
|
+
const measuredLevel = (rule: RuleDefinition, preset: Readonly<Record<string, Level>>): Level => {
|
|
43
|
+
if (rule.opt_in === true) return "off";
|
|
44
|
+
const level = preset[rule.id];
|
|
45
|
+
return level === undefined || level === "off" ? "normal" : level;
|
|
46
|
+
};
|
|
47
|
+
|
|
38
48
|
export const measuredLevelsOf = (rules: readonly RuleDefinition[], preset: Readonly<Record<string, Level>>): Record<string, Level> =>
|
|
39
|
-
Object.fromEntries(rules.map((rule) => [rule.id,
|
|
49
|
+
Object.fromEntries(rules.map((rule) => [rule.id, measuredLevel(rule, preset)]));
|
package/src/ai-score/text.ts
CHANGED
|
@@ -18,6 +18,8 @@ export type AiScoreText = {
|
|
|
18
18
|
readonly fired: (name: string, count: number, fired: number, documents: number, group: string) => string;
|
|
19
19
|
/** A signal that fired but is common in human documents of the group, so it does not count. */
|
|
20
20
|
readonly common: (name: string, count: number, fired: number, documents: number) => string;
|
|
21
|
+
/** The composite's signals that fired together, enough at its strict level to count as one more sign. */
|
|
22
|
+
readonly together: (name: string, names: string, count: number, limit: number) => string;
|
|
21
23
|
readonly quiet: (count: number) => string;
|
|
22
24
|
/** The structure measures within what human articles show. */
|
|
23
25
|
readonly usual: (count: number) => string;
|
|
@@ -59,6 +61,7 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
|
|
|
59
61
|
`✗ ${name}: ${String(count)} 件 人が書いた文書(${group})${String(documents)} 本のうち ${String(fired)} 本`,
|
|
60
62
|
common: (name, count, fired, documents) =>
|
|
61
63
|
`· ${name}: ${String(count)} 件 人の文書でも出る(${String(documents)} 本のうち ${String(fired)} 本)ので数えません`,
|
|
64
|
+
together: (name, names, count, limit) => `✗ ${name}: ${String(count)} 種(${names})。厳しめの段階の ${String(limit)} 種から、目印 1 個に数えます`,
|
|
62
65
|
quiet: (count) => `· ほかの ${String(count)} 項目は出ていません`,
|
|
63
66
|
usual: (count) => `· ほかの ${String(count)} 項目は人の記事でふつうの値です`,
|
|
64
67
|
noHumanShare: (names) => `比べていない(人の文書の基準が無い): ${names}`,
|
|
@@ -67,7 +70,7 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
|
|
|
67
70
|
sameAs: (name) => `「${name}」と同じ形なので 1 つに数えます`,
|
|
68
71
|
summary: (headline, signs, path) => `${headline}: 目印 ${String(signs)} 個 ※ 書いたのが AI かどうかの判定ではありません。内訳: chaff ai-score ${path}`,
|
|
69
72
|
summaryNotScored: (reason) => `AI らしさ: 測っていません(${reason})`,
|
|
70
|
-
usage: "使い方: chaff ai-score <file>... [--genre <ジャンル>] [--format text|json] [--compact]",
|
|
73
|
+
usage: "使い方: chaff ai-score <file>... [--genre <ジャンル>] [--language ja|en|…] [--format text|json] [--json] [--compact]",
|
|
71
74
|
unknownFormat: (format) => `--format は text か json です(${format} は知りません)`,
|
|
72
75
|
listSeparator: "、",
|
|
73
76
|
aside: (main, inner) => `${main}(${inner})`,
|
|
@@ -86,6 +89,8 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
|
|
|
86
89
|
`✗ ${name}: ${String(count)} in ${String(fired)} of ${String(documents)} human-written documents (${group})`,
|
|
87
90
|
common: (name, count, fired, documents) =>
|
|
88
91
|
`· ${name}: ${String(count)} common in human documents too (${String(fired)} of ${String(documents)}), not counted`,
|
|
92
|
+
together: (name, names, count, limit) =>
|
|
93
|
+
`✗ ${name}: ${String(count)} of its signals (${names}); from ${String(limit)}, its strict level, that is one more sign`,
|
|
89
94
|
quiet: (count) => `· the other ${String(count)} did not show`,
|
|
90
95
|
usual: (count) => `· the other ${String(count)} are usual for human articles`,
|
|
91
96
|
noHumanShare: (names) => `not compared (no human baseline): ${names}`,
|
|
@@ -95,7 +100,7 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
|
|
|
95
100
|
summary: (headline, signs, path) =>
|
|
96
101
|
`${headline}: ${String(signs)} ${signs === 1 ? "sign" : "signs"}. Not a verdict on whether AI wrote it. Breakdown: chaff ai-score ${path}`,
|
|
97
102
|
summaryNotScored: (reason) => `AI-likeness: not scored (${reason})`,
|
|
98
|
-
usage: "usage: chaff ai-score <file>... [--genre <genre>] [--format text|json] [--compact]",
|
|
103
|
+
usage: "usage: chaff ai-score <file>... [--genre <genre>] [--language ja|en|…] [--format text|json] [--json] [--compact]",
|
|
99
104
|
unknownFormat: (format) => `--format is text or json (not ${format})`,
|
|
100
105
|
listSeparator: ", ",
|
|
101
106
|
aside: (main, inner) => `${main} (${inner})`,
|
package/src/announced-count.ts
CHANGED
|
@@ -44,7 +44,7 @@ const lastSentenceStart = (text: string): number => {
|
|
|
44
44
|
return ends.at(-1) ?? 0;
|
|
45
45
|
};
|
|
46
46
|
|
|
47
|
-
const alternation = (words: readonly string[]): string =>
|
|
47
|
+
export const alternation = (words: readonly string[]): string =>
|
|
48
48
|
words
|
|
49
49
|
.toSorted((a, b) => b.length - a.length)
|
|
50
50
|
.map(escapeRegExp)
|
|
@@ -52,16 +52,18 @@ const alternation = (words: readonly string[]): string =>
|
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
54
|
* 数と、それが数えるもの。数の前が数字・英字・数の字なら数の途中(十三、23、eleven の中)。
|
|
55
|
-
* 英語は数と数える語の間に語を二つまで置ける(three key steps)。数える語が無くても、文がコロンで終わる直前の数(the following two
|
|
55
|
+
* 英語は数と数える語の間に語を二つまで置ける(three key steps)。数える語が無くても、文がコロンで終わる直前の数(the following two:)と、
|
|
56
|
+
* その後ろに語が一つだけある数(the following three documents:)は数に読む。どちらも先を指す語のすぐ後ろでだけ予告になる(pointsAhead)。
|
|
56
57
|
*/
|
|
57
58
|
const phrasePattern = (words: CountWords): RegExp => {
|
|
58
59
|
const numberChars = escapeRegExp([...new Set(words.numbers.join(""))].join(""));
|
|
59
60
|
const numbers = words.numbers.length === 0 ? "\\p{Nd}+" : `\\p{Nd}+|${alternation(words.numbers)}`;
|
|
60
61
|
const counted = `[ \\t\\u00a0]?(?:\\p{Ll}[\\p{Ll}-]*[ \\t]){0,2}(${alternation(words.counters)})(?![A-Za-z])`;
|
|
61
|
-
|
|
62
|
+
const uncounted = String.raw`(?:[ \t]\p{Ll}[\p{Ll}-]*)?(?=[ \t]?[::][ \t]*$)`;
|
|
63
|
+
return new RegExp(`(?<![\\p{N}A-Za-z${numberChars}])(${numbers})(?:${counted}|${uncounted})`, "giu");
|
|
62
64
|
};
|
|
63
65
|
|
|
64
|
-
const valueOf = (written: string, numbers: readonly string[]): number => {
|
|
66
|
+
export const valueOf = (written: string, numbers: readonly string[]): number => {
|
|
65
67
|
const digits = Number(written.normalize("NFKC"));
|
|
66
68
|
if (!Number.isNaN(digits)) return digits;
|
|
67
69
|
return numbers.findIndex((number) => number.toLowerCase() === written.toLowerCase()) + 1;
|
|
@@ -111,15 +113,20 @@ const pointsAhead = (sentence: string, phrase: Phrase, anchors: readonly string[
|
|
|
111
113
|
return COLON_END.test(sentence.trimEnd()) && !number.test(sentence.slice(phrase.end));
|
|
112
114
|
};
|
|
113
115
|
|
|
114
|
-
/**
|
|
116
|
+
/**
|
|
117
|
+
* 最後の一文の予告。数がちょうど一つで、目安や順番でなく、先を指しているときだけ。数える語の無い数に語が続くもの
|
|
118
|
+
* (2 weeks:)は、先を指す語のすぐ後ろでなければ数に数えない(within 2 weeks: は期限で、予告の数を消さない)。
|
|
119
|
+
*/
|
|
115
120
|
const announcedIn = (sentence: string, words: CountWords, patterns: Patterns): Phrase | undefined => {
|
|
116
|
-
const phrases = [...sentence.matchAll(patterns.phrase)]
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
const phrases = [...sentence.matchAll(patterns.phrase)]
|
|
122
|
+
.map((match) => ({
|
|
123
|
+
start: match.index,
|
|
124
|
+
numberEnd: match.index + (match[1] ?? "").length,
|
|
125
|
+
end: match.index + match[0].length,
|
|
126
|
+
announced: valueOf(match[1] ?? "", words.numbers),
|
|
127
|
+
counted: match[2] !== undefined,
|
|
128
|
+
}))
|
|
129
|
+
.filter((phrase) => phrase.counted || phrase.end === phrase.numberEnd || pointsAhead(sentence, phrase, words.anchors, patterns.number));
|
|
123
130
|
const only = phrases.length === 1 ? phrases[0] : undefined;
|
|
124
131
|
if (only === undefined || only.announced < 1 || isHedged(sentence, only, words)) return undefined;
|
|
125
132
|
return pointsAhead(sentence, only, words.anchors, patterns.number) ? only : undefined;
|