chaffjs 0.28.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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 +38 -16
- 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/session-hours.d.ts +26 -0
- package/dist/derived/session-hours.d.ts.map +1 -0
- package/dist/derived/session-hours.js +29 -0
- package/dist/derived/session-hours.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/derived/time-lengths.d.ts +37 -0
- package/dist/derived/time-lengths.d.ts.map +1 -0
- package/dist/derived/time-lengths.js +168 -0
- package/dist/derived/time-lengths.js.map +1 -0
- package/dist/derived/unit-counts.d.ts +7 -0
- package/dist/derived/unit-counts.d.ts.map +1 -0
- package/dist/derived/unit-counts.js +13 -0
- package/dist/derived/unit-counts.js.map +1 -0
- package/dist/derived/working-hours.d.ts +36 -0
- package/dist/derived/working-hours.d.ts.map +1 -0
- package/dist/derived/working-hours.js +55 -0
- package/dist/derived/working-hours.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/acronym-expansion.d.ts +1 -1
- package/dist/detectors/acronym-expansion.d.ts.map +1 -1
- package/dist/detectors/acronym-expansion.js +46 -2
- package/dist/detectors/acronym-expansion.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 +6 -1
- package/dist/detectors/amount-scale.d.ts.map +1 -1
- package/dist/detectors/amount-scale.js +33 -9
- package/dist/detectors/amount-scale.js.map +1 -1
- 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/capitalised-term.d.ts +44 -0
- package/dist/detectors/capitalised-term.d.ts.map +1 -0
- package/dist/detectors/capitalised-term.js +101 -0
- package/dist/detectors/capitalised-term.js.map +1 -0
- 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.map +1 -1
- package/dist/detectors/currency-notation.js +2 -1
- 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 +37 -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 +3 -1
- package/dist/detectors/derived-numbers.d.ts.map +1 -1
- package/dist/detectors/derived-numbers.js +119 -10
- 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 +76 -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 +129 -8
- 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/party-order.d.ts +3 -0
- package/dist/detectors/party-order.d.ts.map +1 -0
- package/dist/detectors/party-order.js +46 -0
- package/dist/detectors/party-order.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/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/connection-time-short.d.ts +3 -0
- package/dist/detectors/registry/connection-time-short.d.ts.map +1 -0
- package/dist/detectors/registry/connection-time-short.js +3 -0
- package/dist/detectors/registry/connection-time-short.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/duration-product-mismatch.d.ts +3 -0
- package/dist/detectors/registry/duration-product-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/duration-product-mismatch.js +3 -0
- package/dist/detectors/registry/duration-product-mismatch.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/party-order.d.ts +3 -0
- package/dist/detectors/registry/party-order.d.ts.map +1 -0
- package/dist/detectors/registry/party-order.js +3 -0
- package/dist/detectors/registry/party-order.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/requirement-lists.d.ts +3 -0
- package/dist/detectors/registry/requirement-lists.d.ts.map +1 -0
- package/dist/detectors/registry/requirement-lists.js +3 -0
- package/dist/detectors/registry/requirement-lists.js.map +1 -0
- package/dist/detectors/registry/return-type.d.ts +3 -0
- package/dist/detectors/registry/return-type.d.ts.map +1 -0
- package/dist/detectors/registry/return-type.js +3 -0
- package/dist/detectors/registry/return-type.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-lists.d.ts +3 -0
- package/dist/detectors/requirement-lists.d.ts.map +1 -0
- package/dist/detectors/requirement-lists.js +46 -0
- package/dist/detectors/requirement-lists.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/return-type.d.ts +3 -0
- package/dist/detectors/return-type.d.ts.map +1 -0
- package/dist/detectors/return-type.js +24 -0
- package/dist/detectors/return-type.js.map +1 -0
- 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 +40 -15
- 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 +5 -0
- package/dist/detectors/time-order.d.ts.map +1 -0
- package/dist/detectors/time-order.js +58 -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 +101 -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/document.d.ts.map +1 -1
- package/dist/document.js +4 -1
- package/dist/document.js.map +1 -1
- 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/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 +18 -0
- package/dist/facts/table-facts.d.ts.map +1 -1
- package/dist/facts/table-facts.js +4 -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 +29 -2
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +107 -8
- package/dist/name-variants.js.map +1 -1
- package/dist/name-word-order.d.ts +49 -0
- package/dist/name-word-order.d.ts.map +1 -0
- package/dist/name-word-order.js +114 -0
- package/dist/name-word-order.js.map +1 -0
- 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 +11 -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/return-type.d.ts +33 -0
- package/dist/return-type.d.ts.map +1 -0
- package/dist/return-type.js +302 -0
- package/dist/return-type.js.map +1 -0
- 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 +6 -0
- package/dist/structure/amount-scale.d.ts.map +1 -1
- package/dist/structure/amount-scale.js +13 -0
- package/dist/structure/amount-scale.js.map +1 -1
- 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/connection-times.d.ts +56 -0
- package/dist/structure/connection-times.d.ts.map +1 -0
- package/dist/structure/connection-times.js +165 -0
- package/dist/structure/connection-times.js.map +1 -0
- 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-tie.d.ts +13 -0
- package/dist/structure/date-order-tie.d.ts.map +1 -0
- package/dist/structure/date-order-tie.js +61 -0
- package/dist/structure/date-order-tie.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 +66 -17
- package/dist/structure/date-order.js.map +1 -1
- package/dist/structure/date-outside-period.d.ts +33 -0
- package/dist/structure/date-outside-period.d.ts.map +1 -0
- package/dist/structure/date-outside-period.js +132 -0
- package/dist/structure/date-outside-period.js.map +1 -0
- package/dist/structure/date-range.d.ts +5 -2
- package/dist/structure/date-range.d.ts.map +1 -1
- package/dist/structure/date-range.js +37 -9
- package/dist/structure/date-range.js.map +1 -1
- 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 +36 -0
- package/dist/structure/leg-times.d.ts.map +1 -0
- package/dist/structure/leg-times.js +148 -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/party-order.d.ts +33 -0
- package/dist/structure/party-order.d.ts.map +1 -0
- package/dist/structure/party-order.js +79 -0
- package/dist/structure/party-order.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/requirement-lists.d.ts +37 -0
- package/dist/structure/requirement-lists.d.ts.map +1 -0
- package/dist/structure/requirement-lists.js +89 -0
- package/dist/structure/requirement-lists.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/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 +42 -0
- package/dist/structure/time-order.d.ts.map +1 -0
- package/dist/structure/time-order.js +107 -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 +25 -0
- package/dist/structure/version-order.d.ts.map +1 -0
- package/dist/structure/version-order.js +77 -0
- package/dist/structure/version-order.js.map +1 -0
- package/dist/surname-near.d.ts +6 -0
- package/dist/surname-near.d.ts.map +1 -0
- package/dist/surname-near.js +31 -0
- package/dist/surname-near.js.map +1 -0
- package/dist/table-cells.d.ts +13 -0
- package/dist/table-cells.d.ts.map +1 -0
- package/dist/table-cells.js +36 -0
- package/dist/table-cells.js.map +1 -0
- package/dist/table-names.d.ts +42 -0
- package/dist/table-names.d.ts.map +1 -0
- package/dist/table-names.js +94 -0
- package/dist/table-names.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 +4 -4
- package/rules/announced-count-mismatch.yaml +9 -4
- package/rules/arrival-before-departure.yaml +48 -0
- package/rules/connection-time-short.yaml +52 -0
- 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 +15 -4
- package/rules/duration-product-mismatch.yaml +73 -0
- 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 +20 -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/party-order.yaml +84 -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/required-listed-as-preferred.yaml +102 -0
- package/rules/requirement-smell.yaml +3 -3
- package/rules/return-type-mismatch.yaml +79 -0
- 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 +86 -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 +38 -16
- 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/session-hours.ts +62 -0
- package/src/derived/stays.ts +145 -0
- package/src/derived/time-lengths.ts +226 -0
- package/src/derived/unit-counts.ts +18 -0
- package/src/derived/working-hours.ts +97 -0
- package/src/detectors/acronym-context.ts +10 -2
- package/src/detectors/acronym-expansion.ts +57 -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 +50 -17
- 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/capitalised-term.ts +147 -0
- 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 +2 -1
- package/src/detectors/date-outside-period.ts +41 -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 +174 -10
- 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 +95 -3
- 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 +164 -13
- 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/party-order.ts +50 -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/arrival-before-departure.ts +4 -0
- package/src/detectors/registry/connection-time-short.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/duration-product-mismatch.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/party-order.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/requirement-lists.ts +4 -0
- package/src/detectors/registry/return-type.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-lists.ts +65 -0
- package/src/detectors/requirement-smell.ts +29 -9
- package/src/detectors/return-type.ts +30 -0
- package/src/detectors/structure-tree.ts +55 -22
- 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 +84 -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 +120 -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/document.ts +4 -1
- package/src/facts/condition-pairs.ts +289 -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 +6 -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 +133 -12
- package/src/name-word-order.ts +149 -0
- 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 +9 -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/return-type.ts +361 -0
- 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 +18 -0
- package/src/structure/cite.ts +21 -2
- package/src/structure/connection-times.ts +226 -0
- package/src/structure/counted-amounts.ts +42 -0
- package/src/structure/date-order-tie.ts +86 -0
- package/src/structure/date-order.ts +100 -23
- package/src/structure/date-outside-period.ts +192 -0
- package/src/structure/date-range.ts +45 -9
- 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 +213 -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/party-order.ts +115 -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/requirement-lists.ts +145 -0
- package/src/structure/share-column.ts +25 -0
- package/src/structure/stated-period.ts +161 -0
- package/src/structure/tax.ts +114 -0
- package/src/structure/time-marks.ts +127 -0
- package/src/structure/time-order.ts +141 -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 +94 -0
- package/src/surname-near.ts +31 -0
- package/src/table-cells.ts +41 -0
- package/src/table-names.ts +113 -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,208 @@
|
|
|
1
|
+
// A function's signature in a code block against the parameter table written under it: a row naming a parameter the
|
|
2
|
+
// signature does not take, or a parameter of the signature the table leaves out. Pure; reads the Markdown source. The
|
|
3
|
+
// header words that make a table a parameter table (Parameter, 引数) come from the language's lexicon.
|
|
4
|
+
|
|
5
|
+
/** A name, where it is written, and the function it belongs to. */
|
|
6
|
+
export type ParameterSlip = { readonly name: string; readonly offset: number; readonly fn: string; readonly side: "table" | "signature" };
|
|
7
|
+
|
|
8
|
+
type Line = { readonly text: string; readonly start: number };
|
|
9
|
+
type Signature = { readonly fn: string; readonly params: readonly { readonly name: string; readonly offset: number }[] };
|
|
10
|
+
|
|
11
|
+
const FENCE = /^ {0,3}(`{3,}|~{3,})/u;
|
|
12
|
+
const HEADING = /^ {0,3}#{1,6}[ \t]/u;
|
|
13
|
+
const TABLE_ROW = /^[ \t]{0,3}\|/u;
|
|
14
|
+
const DELIMITER_ROW = /^[ \t]{0,3}\|?[ \t]*:?-{3,}/u;
|
|
15
|
+
|
|
16
|
+
const MODIFIERS = /^[ \t]*(?:(?:export|declare|async)[ \t]+)*/u;
|
|
17
|
+
const KEYWORD = /^(?:function\*?|def|fn|func)[ \t]+/u;
|
|
18
|
+
const BINDING = /^(?:const|let|var)[ \t]+/u;
|
|
19
|
+
/** After a bound name, up to the arrow function's list: `: Wrap = async (`. */
|
|
20
|
+
const ARROW_START = /^[^=]*=[ \t]*(?:async[ \t]*)?\(/u;
|
|
21
|
+
/** After an arrow function's list: an optional return type, then =>. */
|
|
22
|
+
const ARROW_END = /^[ \t]*(?::[^=]*)?=>/u;
|
|
23
|
+
const RETURN_TYPE = /^[ \t]*(?::|->)/u;
|
|
24
|
+
const GENERICS = /^[ \t]*<[^<>()]*>/u;
|
|
25
|
+
|
|
26
|
+
const IDENTIFIER = /^[A-Za-z_$][\w$]*/u;
|
|
27
|
+
/** What may stand before a parameter's name: a spread (...rest, *args, **kwargs) or a Rust borrow (&self, &mut self, mut x). */
|
|
28
|
+
const SPREAD = /^(?:\.\.\.|\*{1,2}|&(?:mut[ \t]+)?|mut[ \t]+)/u;
|
|
29
|
+
/** The receiver a method declares first, which a call does not pass. */
|
|
30
|
+
const RECEIVERS: ReadonlySet<string> = new Set(["self", "cls", "this"]);
|
|
31
|
+
const OPENERS = "([{<";
|
|
32
|
+
const CLOSERS = ")]}>";
|
|
33
|
+
const ARROW_HEADS = "=-";
|
|
34
|
+
|
|
35
|
+
const linesOf = (source: string): Line[] => {
|
|
36
|
+
const starts = [0, ...[...source.matchAll(/\n/gu)].map((match) => match.index + 1)];
|
|
37
|
+
return starts.map((start, index) => ({ text: source.slice(start, (starts[index + 1] ?? source.length + 1) - 1), start }));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** The parameters' text split at the commas outside brackets, with where each starts. */
|
|
41
|
+
const splitParams = (text: string): { readonly text: string; readonly from: number }[] => {
|
|
42
|
+
const parts: { text: string; from: number }[] = [];
|
|
43
|
+
const state = { depth: 0, from: 0 };
|
|
44
|
+
[...text].forEach((char, index) => {
|
|
45
|
+
if (OPENERS.includes(char)) state.depth += 1;
|
|
46
|
+
// The > of an arrow (=> in a callback's type, -> in a return type) closes no bracket.
|
|
47
|
+
if (CLOSERS.includes(char) && !(char === ">" && ARROW_HEADS.includes(text[index - 1] ?? " "))) state.depth -= 1;
|
|
48
|
+
if (char !== "," || state.depth !== 0) return;
|
|
49
|
+
parts.push({ text: text.slice(state.from, index), from: state.from });
|
|
50
|
+
state.from = index + 1;
|
|
51
|
+
});
|
|
52
|
+
parts.push({ text: text.slice(state.from), from: state.from });
|
|
53
|
+
return parts.filter((part) => part.text.trim() !== "");
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const skipSpaces = (text: string, at: number): number => at + (text.slice(at).length - text.slice(at).trimStart().length);
|
|
57
|
+
|
|
58
|
+
/** The index of the ) that closes the ( at `open`, or -1. */
|
|
59
|
+
const closingParen = (text: string, open: number): number => {
|
|
60
|
+
const state = { depth: 0, at: -1 };
|
|
61
|
+
Array.from(text.slice(open)).some((char, index) => {
|
|
62
|
+
if (char === "(") state.depth += 1;
|
|
63
|
+
if (char === ")") state.depth -= 1;
|
|
64
|
+
if (state.depth === 0) state.at = open + index;
|
|
65
|
+
return state.depth === 0;
|
|
66
|
+
});
|
|
67
|
+
return state.at;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
type Declared = { readonly fn: string; readonly params: string; readonly paramsAt: number };
|
|
71
|
+
|
|
72
|
+
/** The parameter list that opens at `open`, if it closes and `isDeclaration` holds for the text after it. */
|
|
73
|
+
const listAt = (line: string, fn: string, open: number, isDeclaration: (after: string) => boolean): Declared | undefined => {
|
|
74
|
+
const close = line[open] === "(" ? closingParen(line, open) : -1;
|
|
75
|
+
return close === -1 || !isDeclaration(line.slice(close + 1)) ? undefined : { fn, params: line.slice(open + 1, close), paramsAt: open + 1 };
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/** An arrow function bound to a name: `const wrap = (text: string): string[] =>`. */
|
|
79
|
+
const arrowOf = (line: string, at: number): Declared | undefined => {
|
|
80
|
+
const binding = BINDING.exec(line.slice(at));
|
|
81
|
+
const fn = binding === null ? undefined : IDENTIFIER.exec(line.slice(at + binding[0].length))?.[0];
|
|
82
|
+
if (binding === null || fn === undefined) return undefined;
|
|
83
|
+
const afterName = at + binding[0].length + fn.length;
|
|
84
|
+
const start = ARROW_START.exec(line.slice(afterName));
|
|
85
|
+
return start === null ? undefined : listAt(line, fn, afterName + start[0].length - 1, (after) => ARROW_END.test(after));
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* A declaration: a keyword before the name (function, def, fn, func with a Go receiver or without) or a return type after
|
|
90
|
+
* the list (`): number`, `) -> int`). A call (`wrap(text, 10);`) has neither.
|
|
91
|
+
*/
|
|
92
|
+
const functionOf = (line: string, at: number): Declared | undefined => {
|
|
93
|
+
const keyword = KEYWORD.exec(line.slice(at))?.[0];
|
|
94
|
+
const afterKeyword = at + (keyword?.length ?? 0);
|
|
95
|
+
const receiverEnd = keyword?.startsWith("func") === true && line[afterKeyword] === "(" ? closingParen(line, afterKeyword) : -1;
|
|
96
|
+
const nameAt = receiverEnd === -1 ? afterKeyword : skipSpaces(line, receiverEnd + 1);
|
|
97
|
+
const fn = IDENTIFIER.exec(line.slice(nameAt))?.[0];
|
|
98
|
+
if (fn === undefined) return undefined;
|
|
99
|
+
const afterName = nameAt + fn.length;
|
|
100
|
+
const generics = GENERICS.exec(line.slice(afterName))?.[0] ?? "";
|
|
101
|
+
const open = skipSpaces(line, afterName + generics.length);
|
|
102
|
+
return listAt(line, fn, open, (after) => keyword !== undefined || RETURN_TYPE.test(after));
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const declarationOf = (line: string): Declared | undefined => {
|
|
106
|
+
const at = MODIFIERS.exec(line)?.[0].length ?? 0;
|
|
107
|
+
return arrowOf(line, at) ?? functionOf(line, at);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/** The signature a line declares; undefined for a call, or for a parameter that is not a plain name (a destructured one). */
|
|
111
|
+
export const signatureOf = (line: string, offset = 0): Signature | undefined => {
|
|
112
|
+
const declared = declarationOf(line);
|
|
113
|
+
if (declared === undefined) return undefined;
|
|
114
|
+
const { paramsAt } = declared;
|
|
115
|
+
const params = splitParams(declared.params).map((part) => {
|
|
116
|
+
const lead = part.text.length - part.text.trimStart().length;
|
|
117
|
+
const spread = SPREAD.exec(part.text.trimStart())?.[0] ?? "";
|
|
118
|
+
const name = IDENTIFIER.exec(part.text.trimStart().slice(spread.length))?.[0];
|
|
119
|
+
return { name, offset: offset + paramsAt + part.from + lead + spread.length };
|
|
120
|
+
});
|
|
121
|
+
if (params.some((param) => param.name === undefined)) return undefined;
|
|
122
|
+
return {
|
|
123
|
+
fn: declared.fn,
|
|
124
|
+
params: params.flatMap((param) => (param.name === undefined || RECEIVERS.has(param.name) ? [] : [{ name: param.name, offset: param.offset }])),
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const cellsOf = (text: string): { readonly text: string; readonly from: number }[] => {
|
|
129
|
+
const bounds = [-1, ...[...text.matchAll(/(?<!\\)\|/gu)].map((match) => match.index), text.length];
|
|
130
|
+
const cells = bounds.slice(1).map((end, index) => ({ text: text.slice((bounds[index] ?? -1) + 1, end), from: (bounds[index] ?? -1) + 1 }));
|
|
131
|
+
return cells.slice(cells[0]?.text.trim() === "" ? 1 : 0);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const WRAPPING_MARKS = "`*_";
|
|
135
|
+
|
|
136
|
+
/** A cell's text without the code and emphasis marks around it (`width`, **width**). */
|
|
137
|
+
const unwrap = (text: string): string => {
|
|
138
|
+
const chars = [...text.trim()];
|
|
139
|
+
const from = chars.findIndex((char) => !WRAPPING_MARKS.includes(char));
|
|
140
|
+
return from === -1 ? "" : chars.slice(from, chars.findLastIndex((char) => !WRAPPING_MARKS.includes(char)) + 1).join("");
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/** A parameter row's name: `options.prefix` is a field of options, `width?` the parameter width. */
|
|
144
|
+
const rowName = (line: Line): { readonly name: string; readonly offset: number } | undefined => {
|
|
145
|
+
const cell = cellsOf(line.text)[0];
|
|
146
|
+
if (cell === undefined) return undefined;
|
|
147
|
+
const bare = unwrap(cell.text);
|
|
148
|
+
const name = IDENTIFIER.exec(bare.replace(SPREAD, ""))?.[0];
|
|
149
|
+
return name === undefined ? undefined : { name, offset: line.start + cell.from + cell.text.indexOf(bare) };
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const isHeaderOf = (line: Line, headers: ReadonlySet<string>): boolean => headers.has(unwrap(cellsOf(line.text)[0]?.text ?? "").toLowerCase());
|
|
153
|
+
|
|
154
|
+
/** The rows of the table whose header is at `index`, up to the first line that is not a row. */
|
|
155
|
+
const rowsFrom = (lines: readonly Line[], index: number): Line[] => {
|
|
156
|
+
const end = lines.findIndex((line, at) => at > index + 1 && !TABLE_ROW.test(line.text));
|
|
157
|
+
return lines.slice(index + 2, end === -1 ? lines.length : end);
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const compare = (signature: Signature & { readonly line: number }, rows: readonly Line[]): ParameterSlip[] => {
|
|
161
|
+
const named = rows.flatMap((row) => rowName(row) ?? []);
|
|
162
|
+
const inTable = new Set(named.map((row) => row.name));
|
|
163
|
+
const inSignature = new Set(signature.params.map((param) => param.name));
|
|
164
|
+
return [
|
|
165
|
+
...signature.params.filter((param) => !inTable.has(param.name)).map((param) => ({ ...param, fn: signature.fn, side: "signature" as const })),
|
|
166
|
+
...named.filter((row) => !inSignature.has(row.name)).map((row) => ({ ...row, fn: signature.fn, side: "table" as const })),
|
|
167
|
+
].toSorted((left, right) => left.offset - right.offset);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
type Walk = { fence: string | undefined; signatures: (Signature & { line: number })[]; pending: (Signature & { line: number }) | undefined };
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Every parameter table that follows a code block declaring exactly one function, before the next heading or code
|
|
174
|
+
* block, compared with that function's signature. headers are the lowercase words a parameter table's first header has.
|
|
175
|
+
*/
|
|
176
|
+
/** A line inside a code block: a declaration is collected, and the closing fence leaves the block's one signature pending. */
|
|
177
|
+
const inBlock = (walk: Walk, line: Line, index: number, fence: string | undefined): void => {
|
|
178
|
+
const open = walk.fence ?? "";
|
|
179
|
+
if (fence !== undefined && fence[0] === open[0] && fence.length >= open.length) {
|
|
180
|
+
walk.pending = walk.signatures.length === 1 ? walk.signatures[0] : undefined;
|
|
181
|
+
walk.fence = undefined;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const signature = signatureOf(line.text, line.start);
|
|
185
|
+
if (signature !== undefined) walk.signatures.push({ ...signature, line: index });
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
export const parameterSlips = (source: string, headers: ReadonlySet<string>): ParameterSlip[] => {
|
|
189
|
+
const lines = linesOf(source);
|
|
190
|
+
const walk: Walk = { fence: undefined, signatures: [], pending: undefined };
|
|
191
|
+
return lines.flatMap((line, index) => {
|
|
192
|
+
const fence = FENCE.exec(line.text)?.[1];
|
|
193
|
+
if (walk.fence !== undefined) {
|
|
194
|
+
inBlock(walk, line, index, fence);
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
if (fence !== undefined || HEADING.test(line.text)) {
|
|
198
|
+
walk.fence = fence;
|
|
199
|
+
walk.signatures = [];
|
|
200
|
+
walk.pending = undefined;
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
const pending = walk.pending;
|
|
204
|
+
if (pending === undefined || !TABLE_ROW.test(line.text) || !DELIMITER_ROW.test(lines[index + 1]?.text ?? "")) return [];
|
|
205
|
+
walk.pending = undefined;
|
|
206
|
+
return isHeaderOf(line, headers) ? compare(pending, rowsFrom(lines, index)) : [];
|
|
207
|
+
});
|
|
208
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// One phone number written two ways in a document: the same digits with two neighbours swapped (0120-123-456 and
|
|
2
|
+
// 0120-123-465), both after a label of the same kind. Pure: reads the document's text; the labels (電話, Phone, FAX) come
|
|
3
|
+
// from the language's phone-label lexicon, grouped by what they label, so a phone number and a fax number are never compared.
|
|
4
|
+
import type { LexiconEntry } from "./plugin.ts";
|
|
5
|
+
import { escapeRegExp } from "./orthography.ts";
|
|
6
|
+
|
|
7
|
+
/** A number as written, where it is, its digits and the group of the nearest label before it on its line. */
|
|
8
|
+
export type PhoneNumber = { readonly offset: number; readonly written: string; readonly digits: string; readonly label: string };
|
|
9
|
+
|
|
10
|
+
/** A number whose digits are another's with two neighbours swapped, and that other number. */
|
|
11
|
+
export type PhoneVariant = { readonly number: PhoneNumber; readonly other: PhoneNumber };
|
|
12
|
+
|
|
13
|
+
const MIN_DIGITS = 9;
|
|
14
|
+
const MAX_DIGITS = 13;
|
|
15
|
+
/** What joins two groups of digits: a hyphen, a closing bracket (with a space or hyphen after it) or an opening one. */
|
|
16
|
+
const GROUP_JOIN = String.raw`(?:[-‐−]|[))][ \-‐−]?|[((])`;
|
|
17
|
+
/** Not part of a longer number, a date's or an amount's digits. */
|
|
18
|
+
const NUMBER_EDGE_BEFORE = String.raw`(?<![\d,.\-‐−])`;
|
|
19
|
+
const NUMBER_EDGE_AFTER = String.raw`(?![\d\-‐−]|[.,]\d)`;
|
|
20
|
+
const COUNTRY_CODE = String.raw`(?:\+\d{1,3}[ -]?)?`;
|
|
21
|
+
/** Groups of digits joined by hyphens or brackets (03-1234-5678, 03(1234)5678, (555) 123-4567, +81-3-1234-5678). */
|
|
22
|
+
const NUMBER_SHAPE = new RegExp(String.raw`${NUMBER_EDGE_BEFORE}${COUNTRY_CODE}[((]?\d{1,5}(?:${GROUP_JOIN}\d{1,5}){1,3}${NUMBER_EDGE_AFTER}`, "gu");
|
|
23
|
+
const NOT_DIGIT = /\D/gu;
|
|
24
|
+
const LATIN_START = /^[A-Za-z]/u;
|
|
25
|
+
const LETTER = /\p{L}/u;
|
|
26
|
+
/** How far before a number its label may end: 「電話でのお問合せは、」, "by phone, call". */
|
|
27
|
+
const MAX_LABEL_GAP = 15;
|
|
28
|
+
const URL = /\b(?:https?:\/\/|www\.)\S+/giu;
|
|
29
|
+
|
|
30
|
+
/** Where a label last occurs in a line's text before a number; a Latin label only as a whole word (tel, not hotel). */
|
|
31
|
+
const lastPlace = (before: string, label: string): number => {
|
|
32
|
+
const lowered = label.toLowerCase();
|
|
33
|
+
const places = [...before.matchAll(new RegExp(escapeRegExp(lowered), "gu"))].map((match) => match.index);
|
|
34
|
+
const whole = LATIN_START.test(label) ? places.filter((at) => !LETTER.test(before[at - 1] ?? "") && !LETTER.test(before[at + lowered.length] ?? "")) : places;
|
|
35
|
+
return whole.at(-1) ?? -1;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** The group of the label ending nearest before a number on its line, the longest when two end together (携帯電話 over 電話). */
|
|
39
|
+
const labelBefore = (text: string, offset: number, labels: readonly LexiconEntry[]): string | undefined => {
|
|
40
|
+
const lineStart = text.lastIndexOf("\n", offset - 1) + 1;
|
|
41
|
+
const before = text.slice(lineStart, offset).toLowerCase();
|
|
42
|
+
const nearest = labels
|
|
43
|
+
.map((entry) => {
|
|
44
|
+
const at = lastPlace(before, entry.pattern);
|
|
45
|
+
return { group: entry.group ?? entry.pattern, at, end: at + entry.pattern.length };
|
|
46
|
+
})
|
|
47
|
+
.filter((hit) => hit.at >= 0 && before.length - hit.end <= MAX_LABEL_GAP)
|
|
48
|
+
.toSorted((a, b) => b.end - a.end || a.at - b.at)[0];
|
|
49
|
+
return nearest?.group;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** URLs covered with spaces, so neither a path segment (/call/) nor an id in one is read. Offsets stay the same. */
|
|
53
|
+
const withoutUrls = (text: string): string => text.replaceAll(URL, (url) => " ".repeat(url.length));
|
|
54
|
+
|
|
55
|
+
/** The phone numbers of a text that have a label shortly before them on their line; unlabelled digits and URLs are not read. */
|
|
56
|
+
export const labelledPhoneNumbers = (source: string, labels: readonly LexiconEntry[]): PhoneNumber[] => {
|
|
57
|
+
const text = withoutUrls(source);
|
|
58
|
+
return [...text.matchAll(NUMBER_SHAPE)].flatMap((match) => {
|
|
59
|
+
const digits = match[0].replaceAll(NOT_DIGIT, "");
|
|
60
|
+
if (digits.length < MIN_DIGITS || digits.length > MAX_DIGITS) return [];
|
|
61
|
+
const label = labelBefore(text, match.index, labels);
|
|
62
|
+
return label === undefined ? [] : [{ offset: match.index, written: match[0].trim(), digits, label }];
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** Whether two digit strings are the same but for one pair of neighbours swapped. */
|
|
67
|
+
export const swapsNeighbours = (a: string, b: string): boolean => {
|
|
68
|
+
if (a.length !== b.length || a === b) return false;
|
|
69
|
+
const differ = [...a].flatMap((digit, index) => (digit === b[index] ? [] : [index]));
|
|
70
|
+
const [first, second] = differ;
|
|
71
|
+
return differ.length === 2 && first !== undefined && second === first + 1 && a[first] === b[second] && a[second] === b[first];
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const keyOf = (number: PhoneNumber): string => `${number.label}\u0000${number.digits}`;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Every writing of a number that is another number of the same label with two neighbours swapped: of the two, the one
|
|
78
|
+
* written fewer times, or the one first written later when both are written as often. Each comes with the other number.
|
|
79
|
+
*/
|
|
80
|
+
export const phoneVariants = (numbers: readonly PhoneNumber[]): PhoneVariant[] => {
|
|
81
|
+
const writings = numbers.reduce((byKey, number) => byKey.set(keyOf(number), [...(byKey.get(keyOf(number)) ?? []), number]), new Map<string, PhoneNumber[]>());
|
|
82
|
+
const timesOf = (number: PhoneNumber): number => writings.get(keyOf(number))?.length ?? 0;
|
|
83
|
+
const firsts = [...writings.values()].flatMap((group) => group.slice(0, 1));
|
|
84
|
+
const minorityOf = (a: PhoneNumber, b: PhoneNumber): PhoneNumber => {
|
|
85
|
+
if (timesOf(a) !== timesOf(b)) return timesOf(a) < timesOf(b) ? a : b;
|
|
86
|
+
return a.offset > b.offset ? a : b;
|
|
87
|
+
};
|
|
88
|
+
return firsts
|
|
89
|
+
.flatMap((first, index) =>
|
|
90
|
+
firsts.slice(index + 1).flatMap((second) => {
|
|
91
|
+
if (first.label !== second.label || !swapsNeighbours(first.digits, second.digits)) return [];
|
|
92
|
+
const minority = minorityOf(first, second);
|
|
93
|
+
const other = minority === first ? second : first;
|
|
94
|
+
return (writings.get(keyOf(minority)) ?? []).map((number) => ({ number, other }));
|
|
95
|
+
}),
|
|
96
|
+
)
|
|
97
|
+
.toSorted((a, b) => a.number.offset - b.number.offset);
|
|
98
|
+
};
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { isNearWord, nameKey } from "./name-variants.ts";
|
|
2
|
+
import { escapeRegExp } from "./orthography.ts";
|
|
3
|
+
import { toKatakana } from "./kana-spelling.ts";
|
|
4
|
+
|
|
5
|
+
// 場所の名前を、文書の中で二通りに書いた所(八重洲中央口 と 八重州中央口、11th Street と 11th St.、King's Cross と Kings Cross)。
|
|
6
|
+
// 場所の名前は、場所を言う語(口、駅、センター、Street、Station)で終わる名前。場所の語は語彙表 place-word が言い、group が同じ語は
|
|
7
|
+
// 同じ語の別の書き方(Street と St.、Center と Centre)。名前の部分は、場所の語のすぐ前の、名前に使う字の連なり。
|
|
8
|
+
|
|
9
|
+
type Span = { readonly start: number; readonly end: number };
|
|
10
|
+
|
|
11
|
+
export type PlaceWord = { readonly pattern: string; readonly group: string };
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* surface は場所の語も含めた書いたまま。base は名前の部分、place は場所の語の組。reading は名前の部分の読み(読めなければ無い)。properAt は
|
|
15
|
+
* base の字のうち、品詞解析が固有名詞と読んだ語に入る字の位置(八重洲中央口 の 八・重・洲)。
|
|
16
|
+
*/
|
|
17
|
+
export type PlaceMention = {
|
|
18
|
+
readonly surface: string;
|
|
19
|
+
readonly offset: number;
|
|
20
|
+
readonly base: string;
|
|
21
|
+
readonly place: string;
|
|
22
|
+
readonly reading?: string | undefined;
|
|
23
|
+
readonly properAt: readonly number[];
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 名前の現れの読み方。properWords は範囲に掛かる、品詞解析が固有名詞と読んだ語の範囲、isFunctionWord は名前の頭に立たない語(The、At)、readingOf は範囲の読み、joiners は
|
|
28
|
+
* 英字の名前の中に立つ小さい語(of)。
|
|
29
|
+
*/
|
|
30
|
+
export type PlaceReader = {
|
|
31
|
+
readonly properWords: (start: number, end: number) => readonly Span[];
|
|
32
|
+
readonly joiners: ReadonlySet<string>;
|
|
33
|
+
readonly isFunctionWord: (start: number, end: number) => boolean;
|
|
34
|
+
readonly readingOf: (start: number, end: number) => string | undefined;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** spelling は記号・幅・大小だけ、place-word は場所の語の書き方、reading は読みが同じ、near は名前の一字違い。 */
|
|
38
|
+
export type PlaceRelation = "spelling" | "place-word" | "reading" | "near";
|
|
39
|
+
|
|
40
|
+
export type PlaceVariant = { readonly mention: PlaceMention; readonly usual: string; readonly kind: PlaceRelation };
|
|
41
|
+
|
|
42
|
+
const LATIN = /\p{Script=Latin}/u;
|
|
43
|
+
const LETTER = /\p{L}/u;
|
|
44
|
+
/** 漢字・カタカナの名前に使う字。ひらがなは名前の外(の、で、にて)。 */
|
|
45
|
+
const CJK_NAME = /[\p{Script=Katakana}\p{Script=Han}\p{Script=Latin}\p{N}ー・々]/u;
|
|
46
|
+
const HIRAGANA = /\p{Script=Hiragana}/u;
|
|
47
|
+
const JOINER = "・";
|
|
48
|
+
/** かなだけの名前の前に立つもの。空白、行の頭、開き括弧。読点のあと(、この口)は文の続き。 */
|
|
49
|
+
const KANA_NAME_OPENS = /^$|[\s(「『【([]/u;
|
|
50
|
+
/** 英字の名前の一語。大文字で始まる語か、序数(11th)。 */
|
|
51
|
+
const LATIN_NAME_WORD = /^(?:\p{Lu}[\p{L}'’&-]*|\d+(?:st|nd|rd|th))$/u;
|
|
52
|
+
|
|
53
|
+
/** 場所の語が語の終わりに立つか。続く字が名前の字なら、長い語の一部(口座、Streetcar)。 */
|
|
54
|
+
const endsWord = (source: string, end: number, latin: boolean): boolean => {
|
|
55
|
+
const next = source.charAt(end);
|
|
56
|
+
return latin ? !LETTER.test(next) : !CJK_NAME.test(next) || next === JOINER;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/** 名前を探す、場所の語の前の範囲(UTF-16 の単位)。 */
|
|
60
|
+
const LOOKBACK = 40;
|
|
61
|
+
|
|
62
|
+
/** end のすぐ前の、char の字の連なりの始まり。 */
|
|
63
|
+
const runStart = (source: string, end: number, char: RegExp): number => {
|
|
64
|
+
const chars = Array.from(source.slice(Math.max(0, end - LOOKBACK), end));
|
|
65
|
+
return end - chars.slice(chars.findLastIndex((letter) => !char.test(letter)) + 1).join("").length;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 漢字・カタカナの名前: 場所の語の前の、名前に使う字の連なり。それが無く、空白や開き括弧のあとにひらがなだけが続くなら、かなで書いた
|
|
70
|
+
* 名前(博多駅 ちくし口)。語のあとのひらがな(東京駅の北口 の の)は名前の外。
|
|
71
|
+
*/
|
|
72
|
+
const cjkBaseBefore = (source: string, end: number): Span | undefined => {
|
|
73
|
+
const start = runStart(source, end, CJK_NAME);
|
|
74
|
+
const kanaStart = start === end ? runStart(source, end, HIRAGANA) : start;
|
|
75
|
+
const from = kanaStart < start && !KANA_NAME_OPENS.test(source.charAt(kanaStart - 1)) ? start : kanaStart;
|
|
76
|
+
const trimmed = source.startsWith(JOINER, from) ? from + 1 : from;
|
|
77
|
+
return trimmed < end ? { start: trimmed, end } : undefined;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/** 英字の名前の一語の前に、空白一つで続く語。 */
|
|
81
|
+
const wordBefore = (source: string, at: number): Span | undefined => {
|
|
82
|
+
if (source.charAt(at - 1) !== " ") return undefined;
|
|
83
|
+
const from = Math.max(0, at - 1 - LOOKBACK);
|
|
84
|
+
const text = source.slice(from, at - 1);
|
|
85
|
+
const parts = text.split(/\s/u);
|
|
86
|
+
const word = parts.at(-1) ?? "";
|
|
87
|
+
if (word === "" || (from > 0 && parts.length === 1)) return undefined;
|
|
88
|
+
const start = from + text.length - word.length;
|
|
89
|
+
return { start, end: start + word.length };
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/** 名前の前の、大文字で始まる短い略語(St. George Street の St.)。名前はそこから続くので、どこからが名前か分からない。 */
|
|
93
|
+
const LEADING_ABBREVIATION = /^\p{Lu}\p{L}{0,2}\.$/u;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 英字の名前: 場所の語の前の、空白一つでつながる大文字の語か序数の続き。名前の中の小さい語(University of Tokyo の of)は語彙表
|
|
97
|
+
* place-name-joiner が言う。頭の機能語(The、At)は外す。前に略語(St.)が立てば、名前の始まりが分からないので読まない。
|
|
98
|
+
*/
|
|
99
|
+
const latinBaseBefore = (source: string, end: number, reader: PlaceReader): Span | undefined => {
|
|
100
|
+
const words: Span[] = [];
|
|
101
|
+
const isNameWord = (span: Span | undefined): span is Span => span !== undefined && LATIN_NAME_WORD.test(source.slice(span.start, span.end));
|
|
102
|
+
const step = (at: number): Span | undefined => {
|
|
103
|
+
const word = wordBefore(source, at);
|
|
104
|
+
if (word === undefined) return undefined;
|
|
105
|
+
const joined = reader.joiners.has(source.slice(word.start, word.end)) && isNameWord(wordBefore(source, word.start));
|
|
106
|
+
if (!isNameWord(word) && !joined) return word;
|
|
107
|
+
words.unshift(word);
|
|
108
|
+
return step(word.start);
|
|
109
|
+
};
|
|
110
|
+
const stopper = step(end);
|
|
111
|
+
if (stopper !== undefined && LEADING_ABBREVIATION.test(source.slice(stopper.start, stopper.end))) return undefined;
|
|
112
|
+
const name = words.slice(
|
|
113
|
+
Math.max(
|
|
114
|
+
0,
|
|
115
|
+
words.findIndex((word) => !reader.isFunctionWord(word.start, word.end)),
|
|
116
|
+
),
|
|
117
|
+
);
|
|
118
|
+
const [first, last] = [name[0], name.at(-1)];
|
|
119
|
+
return first === undefined || last === undefined || reader.isFunctionWord(first.start, first.end) ? undefined : { start: first.start, end: last.end };
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* base の字のうち、名前の部分の中で閉じる固有名詞の語に入る字の位置。場所の語まで続く固有名詞(北口、日比谷公園)は、名前でなく
|
|
124
|
+
* 出口や施設の呼び名として読まれたものなので数えない。
|
|
125
|
+
*/
|
|
126
|
+
const properIndexes = (source: string, base: Span, properWords: readonly Span[]): number[] => {
|
|
127
|
+
const inside = properWords.filter((word) => word.end <= base.end);
|
|
128
|
+
return Array.from(source.slice(base.start, base.end)).flatMap((_char, index, chars) => {
|
|
129
|
+
const at = base.start + chars.slice(0, index).join("").length;
|
|
130
|
+
return inside.some((word) => word.start <= at && at < word.end) ? [index] : [];
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const mentionAt = (source: string, word: PlaceWord, at: number, reader: PlaceReader): PlaceMention | undefined => {
|
|
135
|
+
const latin = LATIN.test(word.pattern);
|
|
136
|
+
const end = at + word.pattern.length;
|
|
137
|
+
if (!endsWord(source, end, latin) || (latin && LETTER.test(source.charAt(at - 1)))) return undefined;
|
|
138
|
+
const base = latin ? latinBaseBefore(source, at, reader) : cjkBaseBefore(source, at);
|
|
139
|
+
if (base === undefined) return undefined;
|
|
140
|
+
return {
|
|
141
|
+
surface: source.slice(base.start, end),
|
|
142
|
+
offset: base.start,
|
|
143
|
+
base: source.slice(base.start, latin ? at - 1 : at),
|
|
144
|
+
place: word.group,
|
|
145
|
+
reading: latin ? undefined : reader.readingOf(base.start, at),
|
|
146
|
+
properAt: latin ? [] : properIndexes(source, base, reader.properWords(base.start, end)),
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/** 文書の中の場所の名前の現れ。同じ所で終わる場所の語は長いほうを取る(中央口 と 口)。 */
|
|
151
|
+
export const placeMentionsIn = (source: string, words: readonly PlaceWord[], reader: PlaceReader): PlaceMention[] => {
|
|
152
|
+
const ends = new Set<number>();
|
|
153
|
+
return words
|
|
154
|
+
.toSorted((left, right) => right.pattern.length - left.pattern.length)
|
|
155
|
+
.flatMap((word) =>
|
|
156
|
+
[...source.matchAll(new RegExp(escapeRegExp(word.pattern), "gu"))].flatMap((match) => {
|
|
157
|
+
const end = match.index + word.pattern.length;
|
|
158
|
+
if (ends.has(end)) return [];
|
|
159
|
+
const mention = mentionAt(source, word, match.index, reader);
|
|
160
|
+
if (mention !== undefined) ends.add(end);
|
|
161
|
+
return mention === undefined ? [] : [mention];
|
|
162
|
+
}),
|
|
163
|
+
)
|
|
164
|
+
.toSorted((left, right) => left.offset - right.offset);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const DIGIT = /\p{N}/u;
|
|
168
|
+
|
|
169
|
+
/** 漢字・かなの名前の部分が一字だけ違い、その字が、多いほうで固有名詞の語に入る(八重洲 と 八重州)。数字や方角(北口 と 南口)は別の所。 */
|
|
170
|
+
const isCjkSlip = (slip: PlaceMention, usual: PlaceMention): boolean => {
|
|
171
|
+
const [slipChars, usualChars] = [[...slip.base], [...usual.base]];
|
|
172
|
+
if (slipChars.length !== usualChars.length) return false;
|
|
173
|
+
const differ = usualChars.flatMap((char, index) => (char === slipChars[index] ? [] : [index]));
|
|
174
|
+
const [at] = differ;
|
|
175
|
+
return differ.length === 1 && at !== undefined && usual.properAt.includes(at) && !DIGIT.test(usualChars[at] ?? "") && !DIGIT.test(slipChars[at] ?? "");
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
const latinWords = (base: string): string[] =>
|
|
179
|
+
base
|
|
180
|
+
.toLowerCase()
|
|
181
|
+
.replaceAll(/['’]/gu, "")
|
|
182
|
+
.split(/[\s-]+/u);
|
|
183
|
+
|
|
184
|
+
/** 英字の名前の部分が、一語だけ一字違い(Union と Unoin)。 */
|
|
185
|
+
const isLatinSlip = (slip: PlaceMention, usual: PlaceMention): boolean => {
|
|
186
|
+
const [slipWords, usualWords] = [latinWords(slip.base), latinWords(usual.base)];
|
|
187
|
+
const differ = usualWords.flatMap((word, index) => (word === slipWords[index] ? [] : [index]));
|
|
188
|
+
const [at] = differ;
|
|
189
|
+
return slipWords.length === usualWords.length && differ.length === 1 && at !== undefined && isNearWord(slipWords[at] ?? "", usualWords[at] ?? "");
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const HIRAGANA_ONLY = /^\p{Script=Hiragana}+$/u;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* ひらがなで書いた名前(ちくし)が、漢字で書いた名前(筑紫)の読みと同じか、一字だけ違う。解析器は地名の読みを一通りしか持たず
|
|
196
|
+
* (筑紫 を ツクシ と読む)、かなで書いた読み(チクシ)と一字ずれることがある。
|
|
197
|
+
*/
|
|
198
|
+
const isKanaSpellingOf = (slip: PlaceMention, usual: PlaceMention): boolean => {
|
|
199
|
+
if (!HIRAGANA_ONLY.test(slip.base) || usual.reading === undefined || HIRAGANA_ONLY.test(usual.base)) return false;
|
|
200
|
+
const [kana, reading] = [[...toKatakana(slip.base)], [...usual.reading]];
|
|
201
|
+
return kana.length === reading.length && kana.filter((char, index) => char !== reading[index]).length <= 1;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/** 一度だけ書いた形と、二度以上書いた形。読みの同じ別の所や一字違いの別の所もあるので、書き損じと見るのはこのときだけ。 */
|
|
205
|
+
type Counted = { readonly mention: PlaceMention; readonly count: number };
|
|
206
|
+
|
|
207
|
+
const isSlipOf = (slip: Counted, usual: Counted): boolean => slip.count === 1 && usual.count >= 2;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 二つの書き方が、同じ所を二通りに書いたものか。場所の語の組が同じで、名前と語の全体が記号・幅・大小だけ違うか、場所の語の
|
|
211
|
+
* 書き方だけが違う(11th St. と 11th Street)か。名前の部分の読みが同じか、かなで書いた読み(筑紫口 と ちくし口)か、一字違い
|
|
212
|
+
* (八重洲 と 八重州)なのは、
|
|
213
|
+
* 少ないほうが一度だけ、多いほうが二度以上のときに限る。
|
|
214
|
+
*/
|
|
215
|
+
export const placeRelation = (slip: Counted, usual: Counted): PlaceRelation | undefined => {
|
|
216
|
+
const [left, right] = [slip.mention, usual.mention];
|
|
217
|
+
if (left.surface === right.surface || left.place !== right.place) return undefined;
|
|
218
|
+
if (nameKey(left.surface) === nameKey(right.surface)) return "spelling";
|
|
219
|
+
if (nameKey(left.base) === nameKey(right.base)) return "place-word";
|
|
220
|
+
if (!isSlipOf(slip, usual)) return undefined;
|
|
221
|
+
if ((left.reading !== undefined && left.reading === right.reading) || isKanaSpellingOf(left, right)) return "reading";
|
|
222
|
+
const latin = LATIN.test(left.base) && LATIN.test(right.base);
|
|
223
|
+
const slipped = latin ? isLatinSlip(left, right) : isCjkSlip(left, right);
|
|
224
|
+
return slipped ? "near" : undefined;
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const talliesOf = (mentions: readonly PlaceMention[]): Counted[] => {
|
|
228
|
+
const tallies = new Map<string, Counted>();
|
|
229
|
+
mentions.forEach((mention) => {
|
|
230
|
+
const tally = tallies.get(mention.surface);
|
|
231
|
+
tallies.set(mention.surface, { mention: tally?.mention ?? mention, count: (tally?.count ?? 0) + 1 });
|
|
232
|
+
});
|
|
233
|
+
return [...tallies.values()];
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
/** 多いほうが先。同数なら先に書いたほう。 */
|
|
237
|
+
const byUsage = (left: Counted, right: Counted): number => right.count - left.count || left.mention.offset - right.mention.offset;
|
|
238
|
+
|
|
239
|
+
/** 同じ所の、少ないほうの書き方。同じ所と言える相手のうち一番多いものと比べる。書き方ごとに最初の現れを一つ。 */
|
|
240
|
+
export const placeVariants = (mentions: readonly PlaceMention[]): PlaceVariant[] => {
|
|
241
|
+
const tallies = talliesOf(mentions);
|
|
242
|
+
return tallies.flatMap((tally) => {
|
|
243
|
+
const [usual] = tallies.filter((other) => other !== tally && placeRelation(tally, other) !== undefined).toSorted(byUsage);
|
|
244
|
+
if (usual === undefined || byUsage(usual, tally) > 0) return [];
|
|
245
|
+
const kind = placeRelation(tally, usual);
|
|
246
|
+
return kind === undefined ? [] : [{ mention: tally.mention, usual: usual.mention.surface, kind }];
|
|
247
|
+
});
|
|
248
|
+
};
|
package/src/plugin.ts
CHANGED
|
@@ -275,6 +275,8 @@ export type DocumentProfile = {
|
|
|
275
275
|
* inside の単位の行に、番号の後ろの本文が続くときだけ。
|
|
276
276
|
*/
|
|
277
277
|
readonly unnumbered?: { readonly indent: string; readonly inside: string; readonly depth: number } | undefined;
|
|
278
|
+
/** 定義した語を括弧に入れて、語そのものを指す(「株主」とあるのは、"controller" has the same meaning)。定義し直しでも、括弧の付け忘れでもない。 */
|
|
279
|
+
readonly quoteMentionsTerm?: boolean | undefined;
|
|
278
280
|
};
|
|
279
281
|
|
|
280
282
|
/**
|
|
@@ -360,8 +362,13 @@ export type ProseDocument = {
|
|
|
360
362
|
readonly markup?: Markup | undefined;
|
|
361
363
|
/** adapter の綴りの辞書。持たない言語では無い。 */
|
|
362
364
|
readonly dictionary?: (() => ReadonlySet<string>) | undefined;
|
|
365
|
+
/** 表の本体の升と、升ごとに解析した語(位置は source の上)。本文(prose)は表を覆うので、升の語は sentences に入らない。呼んだときに作る。 */
|
|
366
|
+
readonly tableCells?: (() => readonly TableCell[]) | undefined;
|
|
363
367
|
};
|
|
364
368
|
|
|
369
|
+
/** 表の升一つ。text は区切りの | のあいだの字のまま。tokens は升の字を adapter が解析した語で、解析しない adapter では無い。 */
|
|
370
|
+
export type TableCell = Span & { readonly text: string; readonly tokens?: readonly Token[] };
|
|
371
|
+
|
|
365
372
|
/** 見出し 1 つ。text は属性(`{#id}`)を外した言葉。 */
|
|
366
373
|
export type MarkupHeading = { readonly depth: number; readonly text: string; readonly start: number; readonly end: number };
|
|
367
374
|
|
|
@@ -497,6 +504,8 @@ export type RuleDefinition = {
|
|
|
497
504
|
/** 動かす言語。未指定は全言語。「ですます調」のように言語に固有の rule が使う。 */
|
|
498
505
|
readonly languages: readonly string[] | undefined;
|
|
499
506
|
readonly use_for: readonly string[];
|
|
507
|
+
/** Off unless chaff.yaml or its style gives the rule a level: a house style's own rule (a 公用文 spelling), wrong for other documents. */
|
|
508
|
+
readonly opt_in?: true;
|
|
500
509
|
readonly severity: Severity;
|
|
501
510
|
/** Options beyond the level (the direction and length for katakana-long-vowel). Most rules have none. */
|
|
502
511
|
readonly options?: Readonly<Record<string, RuleOption>>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// A prerequisite ("Before you begin, stop the service", 「作業を始める前に、」) written after the numbered steps of its own
|
|
2
|
+
// section: the reader has done the steps by the time they read it. Pure; the openers come from the language's
|
|
3
|
+
// prerequisite-opener lexicon.
|
|
4
|
+
|
|
5
|
+
/** A span of the source, and the text of a sentence there. */
|
|
6
|
+
export type Placed = { readonly start: number; readonly end: number };
|
|
7
|
+
export type PlacedSentence = Placed & { readonly text: string };
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* What may follow an opener: a comma, or the end of the sentence. "Before you begin step 3" names one step, and
|
|
11
|
+
* 「始める前に戻すには」 is a state to return to, not a prerequisite.
|
|
12
|
+
*/
|
|
13
|
+
const AFTER_OPENER = new Set([",", "、", ",", ""]);
|
|
14
|
+
|
|
15
|
+
/** Whether a sentence opens with one of the openers, as a phrase of its own. */
|
|
16
|
+
export const opensWithPrerequisite = (text: string, openers: readonly string[]): boolean => {
|
|
17
|
+
const lowered = text.trimStart().toLowerCase();
|
|
18
|
+
return openers.some((opener) => {
|
|
19
|
+
const target = opener.toLowerCase();
|
|
20
|
+
return lowered.startsWith(target) && AFTER_OPENER.has(lowered.charAt(target.length));
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The sentences that open with a prerequisite and come after a numbered procedure ending in the same section. A section's
|
|
26
|
+
* prerequisite for a later section's steps comes before those steps, in that section, and is not reported.
|
|
27
|
+
*/
|
|
28
|
+
export const latePrerequisites = (
|
|
29
|
+
sections: readonly Placed[],
|
|
30
|
+
procedures: readonly Placed[],
|
|
31
|
+
sentences: readonly PlacedSentence[],
|
|
32
|
+
openers: readonly string[],
|
|
33
|
+
): PlacedSentence[] =>
|
|
34
|
+
sentences.filter((sentence) => {
|
|
35
|
+
if (!opensWithPrerequisite(sentence.text, openers)) return false;
|
|
36
|
+
const section = sections.findLast((candidate) => candidate.start <= sentence.start && sentence.start < candidate.end);
|
|
37
|
+
if (section === undefined) return false;
|
|
38
|
+
return procedures.some((procedure) => procedure.start >= section.start && procedure.end <= sentence.start);
|
|
39
|
+
});
|
package/src/profile/parse.ts
CHANGED
|
@@ -90,7 +90,16 @@ const languagesOf = (id: string, raw: Record<string, unknown>): Record<string, D
|
|
|
90
90
|
const unnumbered = unnumberedOf(section["unnumbered"]);
|
|
91
91
|
return [
|
|
92
92
|
language,
|
|
93
|
-
{
|
|
93
|
+
{
|
|
94
|
+
id,
|
|
95
|
+
addresses: strings(section["addresses"]),
|
|
96
|
+
connectives: strings(section["connectives"]),
|
|
97
|
+
addressEnd,
|
|
98
|
+
caption,
|
|
99
|
+
relative,
|
|
100
|
+
unnumbered,
|
|
101
|
+
...(section["quote_mentions_term"] === true ? { quoteMentionsTerm: true } : {}),
|
|
102
|
+
},
|
|
94
103
|
];
|
|
95
104
|
}),
|
|
96
105
|
);
|