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
package/src/reasons.ts
CHANGED
|
@@ -9,6 +9,8 @@ export type Reasons = {
|
|
|
9
9
|
readonly unreadTags: string;
|
|
10
10
|
readonly semantic: string;
|
|
11
11
|
readonly experimental: string;
|
|
12
|
+
/** A rule of one house style: it runs when chaff.yaml names that style, or gives the rule a level. */
|
|
13
|
+
readonly optIn: string;
|
|
12
14
|
readonly turnedOff: string;
|
|
13
15
|
readonly presetOff: (genre: string) => string;
|
|
14
16
|
readonly noStructure: (language: string) => string;
|
|
@@ -41,6 +43,7 @@ export const REASONS: Texts<Reasons> = {
|
|
|
41
43
|
unreadTags: "言語のパッケージがこの文書を読めなかったため(品詞の取れない段落があります)",
|
|
42
44
|
semantic: "意味を読む検査のため(npx chaffjs test で動きます)",
|
|
43
45
|
experimental: "まだ試験中のため",
|
|
46
|
+
optIn: "決まった書き方(chaff.yaml の style)のための rule で、style か rules で動かすため",
|
|
44
47
|
turnedOff: "設定で止めているため",
|
|
45
48
|
presetOff: (genre) => `ジャンル ${genre} では見ないため`,
|
|
46
49
|
noStructure: (language) => `${language} のパッケージは文書の構造を読めないため`,
|
|
@@ -63,6 +66,7 @@ export const REASONS: Texts<Reasons> = {
|
|
|
63
66
|
unreadTags: "the language package could not read this document (some paragraphs have no parts of speech)",
|
|
64
67
|
semantic: "it reads meaning; npx chaffjs test runs it",
|
|
65
68
|
experimental: "still experimental",
|
|
69
|
+
optIn: "it belongs to a house style, and runs when chaff.yaml names the style or gives it a level",
|
|
66
70
|
turnedOff: "turned off in the settings",
|
|
67
71
|
presetOff: (genre) => `the ${genre} genre does not check it`,
|
|
68
72
|
noStructure: (language) => `the ${language} package cannot read a document's structure`,
|
package/src/render/rules-json.ts
CHANGED
|
@@ -21,6 +21,7 @@ const TEXT: Texts<{
|
|
|
21
21
|
readonly offByGenre: (genre: string) => string;
|
|
22
22
|
readonly offUnsuited: (genre: string) => string;
|
|
23
23
|
readonly offExperimental: string;
|
|
24
|
+
readonly offOptIn: string;
|
|
24
25
|
readonly valuesNote: string;
|
|
25
26
|
readonly reason: string;
|
|
26
27
|
readonly byFile: string;
|
|
@@ -32,6 +33,7 @@ const TEXT: Texts<{
|
|
|
32
33
|
offByGenre: (genre) => `ジャンル ${genre} では見ない`,
|
|
33
34
|
offUnsuited: (genre) => `ジャンル ${genre} の文書には向かない rule(use_for)`,
|
|
34
35
|
offExperimental: "experimental な rule は既定で動かさない",
|
|
36
|
+
offOptIn: "決まった書き方(style)のための rule で、chaff.yaml の style か rules で動かす",
|
|
35
37
|
valuesNote: "この 4 語のかわりに数字を直接書いてもよい。4 語のほうを勧める。",
|
|
36
38
|
reason: "<理由>",
|
|
37
39
|
byFile: "chaff.yaml の rules に <rule-id>: <level> を足す。既定のままのものは書かない。",
|
|
@@ -49,6 +51,7 @@ const TEXT: Texts<{
|
|
|
49
51
|
offByGenre: (genre) => `the ${genre} genre does not check it`,
|
|
50
52
|
offUnsuited: (genre) => `not a rule for ${genre} documents (use_for)`,
|
|
51
53
|
offExperimental: "experimental rules do not run by default",
|
|
54
|
+
offOptIn: "a house style's rule: it runs when chaff.yaml names the style or gives it a level",
|
|
52
55
|
valuesNote: "A number may be written instead of these four words. The words are recommended.",
|
|
53
56
|
reason: "<reason>",
|
|
54
57
|
byFile: "Add <rule-id>: <level> under rules in chaff.yaml. Leave out anything at its default.",
|
|
@@ -76,6 +79,7 @@ const now = (rule: RuleDefinition, config: Config, limits: Limits, genre: string
|
|
|
76
79
|
const limit = rule.level_sets === "severity" ? undefined : limits[rule.id];
|
|
77
80
|
if (limit !== undefined) return { level: "normal", limit, set_as: "number" };
|
|
78
81
|
if (explicit !== undefined) return { level: explicit, ...effectAt(rule, explicit, genre) };
|
|
82
|
+
if (rule.opt_in === true) return { level: "off", why_off: text.offOptIn };
|
|
79
83
|
if (rule.status === "experimental" && !config.experimental) {
|
|
80
84
|
const alone = offOnlyAsExperimental(rule, config, genre, preset, language);
|
|
81
85
|
return { level: "off", why_off: text.offExperimental, ...(alone ? { turn_on_with: `npx chaffjs enable ${rule.id}` } : {}) };
|
|
@@ -7,7 +7,7 @@ import { nowFor } from "./rules-json.ts";
|
|
|
7
7
|
// `chaff rules`: every rule, grouped the way the reference groups them, with the level it runs at now.
|
|
8
8
|
// `chaff rules --json` carries the same and more, for an AI to read.
|
|
9
9
|
|
|
10
|
-
type RunsWhen = "default" | "experimental" | "team" | "test";
|
|
10
|
+
type RunsWhen = "default" | "experimental" | "style" | "team" | "test";
|
|
11
11
|
|
|
12
12
|
const TEXT: Texts<{
|
|
13
13
|
readonly heading: (genre: string, count: number) => string;
|
|
@@ -17,11 +17,12 @@ const TEXT: Texts<{
|
|
|
17
17
|
}> = {
|
|
18
18
|
ja: {
|
|
19
19
|
heading: (genre, count) => `chaff のルール ${count} 本(ジャンル ${genre})`,
|
|
20
|
-
runsWhen: { default: "既定", experimental: "試験中", team: "要設定", test: "AI" },
|
|
20
|
+
runsWhen: { default: "既定", experimental: "試験中", style: "style", team: "要設定", test: "AI" },
|
|
21
21
|
ungrouped: "(グループ未設定)",
|
|
22
22
|
footer: [
|
|
23
23
|
"既定: 何も書かなくても動く 試験中: --experimental か chaff.yaml で動く",
|
|
24
24
|
"要設定: chaff.yaml に語や見出しを書いたときだけ AI: npx chaffjs test で動く",
|
|
25
|
+
"style: chaff.yaml の style(koyobun など)か rules で動く",
|
|
25
26
|
"",
|
|
26
27
|
"詳しく: npx chaffjs explain <rule>",
|
|
27
28
|
"AI に渡す: npx chaffjs rules --json",
|
|
@@ -29,11 +30,12 @@ const TEXT: Texts<{
|
|
|
29
30
|
},
|
|
30
31
|
en: {
|
|
31
32
|
heading: (genre, count) => `chaff's ${count} rules (genre ${genre})`,
|
|
32
|
-
runsWhen: { default: "default", experimental: "experimental", team: "needs list", test: "AI" },
|
|
33
|
+
runsWhen: { default: "default", experimental: "experimental", style: "style", team: "needs list", test: "AI" },
|
|
33
34
|
ungrouped: "(no group yet)",
|
|
34
35
|
footer: [
|
|
35
36
|
"default: runs with no settings experimental: runs with --experimental or a level in chaff.yaml",
|
|
36
37
|
"needs list: runs only on words or headings listed in chaff.yaml AI: runs with npx chaffjs test",
|
|
38
|
+
"style: runs with a style in chaff.yaml (koyobun and others) or a level under rules",
|
|
37
39
|
"",
|
|
38
40
|
"More on one rule: npx chaffjs explain <rule>",
|
|
39
41
|
"For an AI: npx chaffjs rules --json",
|
|
@@ -44,6 +46,7 @@ const TEXT: Texts<{
|
|
|
44
46
|
const runsWhenOf = (rule: RuleDefinition): RunsWhen => {
|
|
45
47
|
if (rule.layer === "L4") return "test";
|
|
46
48
|
if (rule.guide?.group === "team") return "team";
|
|
49
|
+
if (rule.opt_in === true) return "style";
|
|
47
50
|
return rule.status === "experimental" ? "experimental" : "default";
|
|
48
51
|
};
|
|
49
52
|
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
// One function's return type stated two ways on one page: the signature in a code block against a "Returns:" line, a
|
|
2
|
+
// table's return column, or a sentence ("measure returns a string", 「measure は文字列を返します」). Pure; reads the
|
|
3
|
+
// Markdown source. The words (Returns, 戻り値, returns, 返します, は, and the type words string, 文字列) come from the
|
|
4
|
+
// language's lexicons. A statement is compared only with the signatures of the function it names, and only when both
|
|
5
|
+
// sides are readable. The signature reader is small and TypeScript/Python-shaped; it may later be shared with
|
|
6
|
+
// parameter-table.ts.
|
|
7
|
+
|
|
8
|
+
/** The words of one language that state a return type. `kinds` maps a lower-cased type word to a kind (string, array). */
|
|
9
|
+
export type ReturnWords = {
|
|
10
|
+
readonly labels: readonly string[];
|
|
11
|
+
readonly verbs: readonly string[];
|
|
12
|
+
/** What may follow the function's name before the verb (は, が); none for a language that puts the verb first. */
|
|
13
|
+
readonly subjects: readonly string[];
|
|
14
|
+
readonly kinds: ReadonlyMap<string, string>;
|
|
15
|
+
/** Words opening a clause about when (when, とき): a type word on the far side of one names the input, not the result. */
|
|
16
|
+
readonly clauses: readonly string[];
|
|
17
|
+
/** Words making the type word before them one item of the result (per, ごと). */
|
|
18
|
+
readonly items: readonly string[];
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** A statement that disagrees with every signature of its function: what it says, what a signature says, and where. */
|
|
22
|
+
export type ReturnTypeClash = { readonly fn: string; readonly stated: string; readonly signature: string; readonly offset: number };
|
|
23
|
+
|
|
24
|
+
/** A return type as written: a type in code (`string[]`), or the kind a type word names (a string → string). */
|
|
25
|
+
type Stated = { readonly code: string; readonly written: string } | { readonly kind: string; readonly written: string };
|
|
26
|
+
|
|
27
|
+
type Statement = { readonly fn: string; readonly stated: Stated; readonly offset: number };
|
|
28
|
+
type Signature = { readonly fn: string; readonly params: string; readonly returns: string; readonly offset: number };
|
|
29
|
+
type Line = { readonly text: string; readonly start: number; readonly fenced: boolean; readonly section: number };
|
|
30
|
+
|
|
31
|
+
const FENCE = /^ {0,3}(`{3,}|~{3,})/u;
|
|
32
|
+
const HEADING = /^ {0,3}#{1,6}[ \t]/u;
|
|
33
|
+
const TABLE_ROW = /^[ \t]{0,3}\|/u;
|
|
34
|
+
const DELIMITER_ROW = /^[ \t]{0,3}\|?[ \t]*:?-{3,}/u;
|
|
35
|
+
const IDENTIFIER = /^[A-Za-z_$][\w$]*/u;
|
|
36
|
+
const DECLARATION_HEAD = /^(?:(?:export|default|declare|async|public|static)\s+)*(?:(?:function\*?|def|fn|func)\s+)?/u;
|
|
37
|
+
const ARROW_HEAD = /^(?:(?:export|declare)\s+)*(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s*)?/u;
|
|
38
|
+
const RETURN_MARK = /^\s*(?::|->)\s*/u;
|
|
39
|
+
/** What may close a declaration line after its return type: an arrow's `=>` or a body's `{` with what follows, `;`, Python's `:`. */
|
|
40
|
+
const withoutDeclarationTail = (text: string): string => {
|
|
41
|
+
const cut = [text.indexOf("=>"), text.indexOf("{")].filter((at) => at !== -1);
|
|
42
|
+
const head = (cut.length === 0 ? text : text.slice(0, Math.min(...cut))).trim();
|
|
43
|
+
return head.endsWith(";") || head.endsWith(":") ? head.slice(0, -1).trim() : head;
|
|
44
|
+
};
|
|
45
|
+
const GENERICS = /^<[^<>()]*>/u;
|
|
46
|
+
const TYPE_NAME = String.raw`[A-Za-z_$][\w$.]*(?:<[\w$.,\s<>[\]|]*>|\[[\w$.,\s[\]|]*\])?(?:\[\])*`;
|
|
47
|
+
/** A type as code writes it: names, generic arguments, array brackets, and unions of those. */
|
|
48
|
+
const TYPE_TEXT = new RegExp(String.raw`^${TYPE_NAME}(?:\s*\|\s*${TYPE_NAME})*$`, "u");
|
|
49
|
+
/** Where a sentence ends, so a type word of the next sentence is not read as this one's. */
|
|
50
|
+
const SENTENCE_END = /[。!?!?;]|\.(?=\s|$)/u;
|
|
51
|
+
const NOTHING_TYPES: ReadonlySet<string> = new Set(["null", "undefined", "void", "None"]);
|
|
52
|
+
/** The kind of a type name in code; a name not listed (a class, a generic parameter, Promise<…>) has none. */
|
|
53
|
+
const CODE_KINDS: ReadonlyMap<string, string> = new Map([
|
|
54
|
+
["string", "string"],
|
|
55
|
+
["str", "string"],
|
|
56
|
+
["number", "number"],
|
|
57
|
+
["int", "number"],
|
|
58
|
+
["float", "number"],
|
|
59
|
+
["bigint", "number"],
|
|
60
|
+
["boolean", "boolean"],
|
|
61
|
+
["bool", "boolean"],
|
|
62
|
+
["list", "array"],
|
|
63
|
+
["tuple", "array"],
|
|
64
|
+
]);
|
|
65
|
+
|
|
66
|
+
const linesOf = (source: string): Line[] => {
|
|
67
|
+
const state = { start: 0, fence: "", section: 0 };
|
|
68
|
+
return source.split("\n").map((text) => {
|
|
69
|
+
const start = state.start;
|
|
70
|
+
state.start += text.length + 1;
|
|
71
|
+
const mark = FENCE.exec(text)?.[1];
|
|
72
|
+
const closes = mark !== undefined && state.fence !== "" && mark[0] === state.fence[0] && mark.length >= state.fence.length;
|
|
73
|
+
if (mark !== undefined && (state.fence === "" || closes)) {
|
|
74
|
+
state.fence = closes ? "" : mark;
|
|
75
|
+
return { text, start, fenced: true, section: state.section };
|
|
76
|
+
}
|
|
77
|
+
if (state.fence === "" && HEADING.test(text)) state.section += 1;
|
|
78
|
+
return { text, start, fenced: state.fence !== "", section: state.section };
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/** The index of the ) that closes the ( at `open`, or -1. */
|
|
83
|
+
const closingParen = (text: string, open: number): number => {
|
|
84
|
+
const state = { depth: 0, at: -1 };
|
|
85
|
+
Array.from(text.slice(open)).some((char, index) => {
|
|
86
|
+
if (char === "(") state.depth += 1;
|
|
87
|
+
if (char === ")") state.depth -= 1;
|
|
88
|
+
if (state.depth === 0) state.at = open + index;
|
|
89
|
+
return state.depth === 0;
|
|
90
|
+
});
|
|
91
|
+
return state.at;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const squeeze = (text: string): string => text.replace(/\s+/gu, "");
|
|
95
|
+
|
|
96
|
+
/** `Array<string>` is `string[]`: the inner generic first, so Array<Array<string>> becomes string[][]. */
|
|
97
|
+
const withoutArrayGenerics = (type: string): string => {
|
|
98
|
+
const next = type.replace(/(?<![\w$.])Array<([^<>]*)>/u, (_whole, inner: string) => (inner.includes("|") ? `(${inner})[]` : `${inner}[]`));
|
|
99
|
+
return next === type ? type : withoutArrayGenerics(next);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/** The members of a union at its top level, outside brackets. */
|
|
103
|
+
const unionMembers = (type: string): string[] => {
|
|
104
|
+
const state = { depth: 0, from: 0 };
|
|
105
|
+
const members: string[] = [];
|
|
106
|
+
Array.from(type).forEach((char, index) => {
|
|
107
|
+
if ("(<[{".includes(char)) state.depth += 1;
|
|
108
|
+
if (")>]}".includes(char)) state.depth -= 1;
|
|
109
|
+
if (char !== "|" || state.depth !== 0) return;
|
|
110
|
+
members.push(type.slice(state.from, index));
|
|
111
|
+
state.from = index + 1;
|
|
112
|
+
});
|
|
113
|
+
return [...members, type.slice(state.from)].filter((member) => member !== "");
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/** A code type's members in one spelling: no spaces, Array<T> as T[], sorted. */
|
|
117
|
+
export const typeMembers = (type: string): string[] =>
|
|
118
|
+
unionMembers(withoutArrayGenerics(squeeze(type))).toSorted((left, right) => left.localeCompare(right, "en"));
|
|
119
|
+
|
|
120
|
+
/** The kind of one member, or undefined when its name says nothing a type word could (WrapResult, T, Promise<…>). */
|
|
121
|
+
const kindOfMember = (member: string): string | undefined => {
|
|
122
|
+
if (member.endsWith("[]") || /^(?:list|List|tuple|Tuple)\[/u.test(member)) return "array";
|
|
123
|
+
return CODE_KINDS.get(member);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* A type in a sentence or a cell is read only when it can be a type and not a parameter's name: each member has a kind, is
|
|
128
|
+
* null or the like, or is a capitalised name (WrapResult). `text` is a name, and `null` alone says when, not what.
|
|
129
|
+
*/
|
|
130
|
+
const isReadableCode = (type: string): boolean => {
|
|
131
|
+
const members = typeMembers(type);
|
|
132
|
+
const readable = members.every((member) => kindOfMember(member) !== undefined || NOTHING_TYPES.has(member) || /^[A-Z]/u.test(member));
|
|
133
|
+
return TYPE_TEXT.test(type.trim()) && readable && members.some((member) => !NOTHING_TYPES.has(member));
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const declaredAt = (line: string): { readonly fn: string; readonly afterName: number } | undefined => {
|
|
137
|
+
const arrow = ARROW_HEAD.exec(line);
|
|
138
|
+
if (arrow?.[1] !== undefined) return { fn: arrow[1], afterName: arrow[0].length };
|
|
139
|
+
const headLength = DECLARATION_HEAD.exec(line)?.[0].length ?? 0;
|
|
140
|
+
const fn = IDENTIFIER.exec(line.slice(headLength))?.[0];
|
|
141
|
+
return fn === undefined ? undefined : { fn, afterName: headLength + fn.length };
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/** A declaration with a return type (`wrap(text: string): string[]`, `def f(x) -> str:`); a call has none. */
|
|
145
|
+
export const signatureOf = (line: string, offset = 0): Signature | undefined => {
|
|
146
|
+
const declared = declaredAt(line);
|
|
147
|
+
if (declared === undefined) return undefined;
|
|
148
|
+
const open = declared.afterName + (GENERICS.exec(line.slice(declared.afterName))?.[0].length ?? 0);
|
|
149
|
+
const close = line[open] === "(" ? closingParen(line, open) : -1;
|
|
150
|
+
const mark = close === -1 ? null : RETURN_MARK.exec(line.slice(close + 1));
|
|
151
|
+
if (close === -1 || mark === null) return undefined;
|
|
152
|
+
const returns = withoutDeclarationTail(line.slice(close + 1 + mark[0].length));
|
|
153
|
+
return TYPE_TEXT.test(returns) ? { fn: declared.fn, params: squeeze(line.slice(open + 1, close)), returns, offset } : undefined;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const signaturesOf = (lines: readonly Line[]): Signature[] =>
|
|
157
|
+
lines.flatMap((line) => {
|
|
158
|
+
const lead = line.text.length - line.text.trimStart().length;
|
|
159
|
+
const signature = line.fenced ? signatureOf(line.text.trim(), line.start + lead) : undefined;
|
|
160
|
+
return signature === undefined ? [] : [signature];
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
const escaped = (text: string): string => text.replace(/[.*+?^${}()|[\]\\]/gu, String.raw`\$&`);
|
|
164
|
+
|
|
165
|
+
const isSpaced = (word: string): boolean => /^[A-Za-z]/u.test(word);
|
|
166
|
+
|
|
167
|
+
/** A word's occurrences: whole words where words are spaced, any occurrence where they are not. */
|
|
168
|
+
const wordPattern = (word: string): RegExp => (isSpaced(word) ? new RegExp(String.raw`\b${escaped(word)}\b`, "giu") : new RegExp(escaped(word), "gu"));
|
|
169
|
+
|
|
170
|
+
const startsWithWord = (text: string, word: string): boolean =>
|
|
171
|
+
isSpaced(word) ? new RegExp(String.raw`^${escaped(word)}\b`, "iu").test(text) : text.startsWith(word);
|
|
172
|
+
|
|
173
|
+
/** "returns true when …" is a boolean: a literal says its kind in any language, in code or not. */
|
|
174
|
+
const LITERAL_KINDS: ReadonlyMap<string, string> = new Map([
|
|
175
|
+
["true", "boolean"],
|
|
176
|
+
["false", "boolean"],
|
|
177
|
+
]);
|
|
178
|
+
|
|
179
|
+
/** Whether `word` stands in `text` as a whole value, not followed by a word making it one item (string per line). */
|
|
180
|
+
const namesWhole = (text: string, word: string, items: readonly string[]): boolean =>
|
|
181
|
+
[...text.matchAll(wordPattern(word))].some((match) => {
|
|
182
|
+
const next = text.slice(match.index + match[0].length).trimStart();
|
|
183
|
+
return !items.some((item) => startsWithWord(next, item));
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
/** The type words in a stretch of text, outside code spans other than a literal (`false`). */
|
|
187
|
+
const typeWordsIn = (text: string, words: ReturnWords): [string, string][] => {
|
|
188
|
+
const bare = text.replace(/`([^`]*)`/gu, (_whole, inner: string) => (LITERAL_KINDS.has(inner.toLowerCase()) ? ` ${inner} ` : " "));
|
|
189
|
+
return [...words.kinds, ...LITERAL_KINDS].filter(([word]) => namesWhole(bare, word, words.items));
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
/** A language with no subject words (en) puts the verb right after the name, and a clause about when after the result. */
|
|
193
|
+
const isVerbFirst = (words: ReturnWords): boolean => words.subjects.length === 0;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* The part of a statement that can name what is returned, without a clause about when (when …, …とき): before the first
|
|
197
|
+
* clause word where the verb comes first, after the last where the verb comes last.
|
|
198
|
+
*/
|
|
199
|
+
const returnedPart = (text: string, words: ReturnWords): string => {
|
|
200
|
+
const cuts = words.clauses.flatMap((word) =>
|
|
201
|
+
[...text.matchAll(wordPattern(word))].map((match) => ({ from: match.index, to: match.index + match[0].length })),
|
|
202
|
+
);
|
|
203
|
+
if (cuts.length === 0) return text;
|
|
204
|
+
return isVerbFirst(words) ? text.slice(0, Math.min(...cuts.map((cut) => cut.from))) : text.slice(Math.max(...cuts.map((cut) => cut.to)));
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
/** The one kind a stretch's type words name. */
|
|
208
|
+
const kindIn = (text: string, returnWords: ReturnWords): Stated | undefined => {
|
|
209
|
+
const words = typeWordsIn(text, returnWords);
|
|
210
|
+
const named = new Set(words.map(([, kind]) => kind));
|
|
211
|
+
return named.size === 1 && words[0] !== undefined ? { kind: words[0][1], written: words[0][0] } : undefined;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
/** What a stretch of text says is returned: one readable code span, else the one kind its type words name. */
|
|
215
|
+
const statedIn = (text: string, words: ReturnWords): Stated | undefined => {
|
|
216
|
+
const trimmed = returnedPart(text, words).trim();
|
|
217
|
+
if (TYPE_TEXT.test(trimmed) && isReadableCode(trimmed)) return { code: trimmed, written: trimmed };
|
|
218
|
+
const spans = new Set([...trimmed.matchAll(/`([^`]+)`/gu)].map((match) => match[1] ?? "").filter(isReadableCode));
|
|
219
|
+
if (spans.size === 1) return { code: [...spans][0] ?? "", written: [...spans][0] ?? "" };
|
|
220
|
+
return spans.size === 0 ? kindIn(trimmed, words) : undefined;
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const firstSentence = (text: string): string => text.split(SENTENCE_END)[0] ?? "";
|
|
224
|
+
|
|
225
|
+
const lineOf = (lines: readonly Line[], offset: number): Line | undefined =>
|
|
226
|
+
lines.find((line) => line.start <= offset && offset <= line.start + line.text.length);
|
|
227
|
+
|
|
228
|
+
/** The function each section's "Returns:" line is about: the one function its code blocks declare. */
|
|
229
|
+
const sectionFunctions = (lines: readonly Line[], signatures: readonly Signature[]): Map<number, string> => {
|
|
230
|
+
const bySection = new Map<number, Set<string>>();
|
|
231
|
+
signatures.forEach((signature) => {
|
|
232
|
+
const section = lineOf(lines, signature.offset)?.section ?? -1;
|
|
233
|
+
bySection.set(section, (bySection.get(section) ?? new Set<string>()).add(signature.fn));
|
|
234
|
+
});
|
|
235
|
+
return new Map([...bySection].flatMap(([section, names]): [number, string][] => (names.size === 1 ? [[section, [...names].join("")]] : [])));
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const labelPattern = (labels: readonly string[]): RegExp =>
|
|
239
|
+
new RegExp(String.raw`^[ \t]*(?:[-*+][ \t]+)?(?:\*\*|__)?(?:${labels.map(escaped).join("|")})(?:\*\*|__)?[ \t]*[::](?:\*\*|__)?`, "iu");
|
|
240
|
+
|
|
241
|
+
/** A "Returns:" line under a heading whose code blocks declare one function. */
|
|
242
|
+
const labelStatements = (lines: readonly Line[], functions: ReadonlyMap<number, string>, words: ReturnWords): Statement[] => {
|
|
243
|
+
if (words.labels.length === 0) return [];
|
|
244
|
+
const label = labelPattern(words.labels);
|
|
245
|
+
return lines.flatMap((line) => {
|
|
246
|
+
const head = line.fenced ? null : label.exec(line.text);
|
|
247
|
+
const fn = functions.get(line.section);
|
|
248
|
+
if (head === null || fn === undefined) return [];
|
|
249
|
+
const stated = statedIn(firstSentence(line.text.slice(head[0].length)), words);
|
|
250
|
+
return stated === undefined ? [] : [{ fn, stated, offset: line.start }];
|
|
251
|
+
});
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
const cellsOf = (row: string): string[] => row.trim().replace(/^\|/u, "").replace(/\|$/u, "").split("|");
|
|
255
|
+
|
|
256
|
+
const cellText = (cell: string): string => cell.trim().replace(/^(?:\*\*|__)(.*)(?:\*\*|__)$/u, "$1");
|
|
257
|
+
|
|
258
|
+
/** The function a table row names in its first cell: `wrap`, wrap(), `measure(text)`. */
|
|
259
|
+
const rowFunction = (cell: string): string => {
|
|
260
|
+
const name = cellText(cell).replace(/`/gu, "").trim();
|
|
261
|
+
const open = name.indexOf("(");
|
|
262
|
+
return name.endsWith(")") && open > 0 ? name.slice(0, open).trim() : name;
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
/** A table with a return column (Returns, 戻り値) whose rows name functions in their first cell. */
|
|
266
|
+
const tableStatements = (lines: readonly Line[], known: ReadonlySet<string>, words: ReturnWords): Statement[] => {
|
|
267
|
+
const labels = new Set(words.labels.map((label) => label.toLowerCase()));
|
|
268
|
+
const state = { column: -1 };
|
|
269
|
+
return lines.flatMap((line, index) => {
|
|
270
|
+
if (line.fenced || !TABLE_ROW.test(line.text)) {
|
|
271
|
+
state.column = -1;
|
|
272
|
+
return [];
|
|
273
|
+
}
|
|
274
|
+
if (DELIMITER_ROW.test(line.text)) {
|
|
275
|
+
state.column = cellsOf(lines[index - 1]?.text ?? "").findIndex((cell) => labels.has(cellText(cell).toLowerCase()));
|
|
276
|
+
return [];
|
|
277
|
+
}
|
|
278
|
+
const cells = cellsOf(line.text);
|
|
279
|
+
const fn = rowFunction(cells[0] ?? "");
|
|
280
|
+
const stated = state.column > 0 && known.has(fn) ? statedIn(cells[state.column] ?? "", words) : undefined;
|
|
281
|
+
return stated === undefined ? [] : [{ fn, stated, offset: line.start }];
|
|
282
|
+
});
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
/** `measure returns …` / 「measure は … 返します」: the function's name, an optional subject word, then the verb. */
|
|
286
|
+
const sentencePattern = (fn: string, words: ReturnWords): RegExp => {
|
|
287
|
+
const subject = words.subjects.length === 0 ? "" : String.raw`(?:(?:${words.subjects.map(escaped).join("|")})[、,]?)?`;
|
|
288
|
+
const verbs = words.verbs.map(escaped).join("|");
|
|
289
|
+
return new RegExp(String.raw`(?<![\w$.])\x60?${escaped(fn)}(?:\(\))?\x60?\s*${subject}([^。!?!?;]*?)(?:${verbs})(?![\p{L}\p{N}])`, "gu");
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
/** A sentence whose subject is a function's name and whose verb says it returns something. */
|
|
293
|
+
const sentenceStatements = (lines: readonly Line[], known: ReadonlySet<string>, words: ReturnWords): Statement[] => {
|
|
294
|
+
if (words.verbs.length === 0) return [];
|
|
295
|
+
const prose = lines.filter((line) => !line.fenced && !HEADING.test(line.text) && !TABLE_ROW.test(line.text));
|
|
296
|
+
return [...known].flatMap((fn) =>
|
|
297
|
+
prose.flatMap((line) =>
|
|
298
|
+
[...line.text.matchAll(sentencePattern(fn, words))].flatMap((match) => {
|
|
299
|
+
const between = match[1] ?? "";
|
|
300
|
+
// Where the verb comes first, nothing stands between the name and the verb.
|
|
301
|
+
const verbFirst = isVerbFirst(words);
|
|
302
|
+
if (verbFirst && between.trim() !== "") return [];
|
|
303
|
+
const after = firstSentence(line.text.slice(match.index + match[0].length));
|
|
304
|
+
const stated = statedIn(verbFirst ? after : between, words);
|
|
305
|
+
return stated === undefined ? [] : [{ fn, stated, offset: line.start + match.index }];
|
|
306
|
+
}),
|
|
307
|
+
),
|
|
308
|
+
);
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
const isSubset = (small: readonly string[], large: readonly string[]): boolean => small.every((member) => large.includes(member));
|
|
312
|
+
|
|
313
|
+
/** Whether a statement can be the signature's return type; true when either side is too vague to say otherwise. */
|
|
314
|
+
const agrees = (stated: Stated, returns: string): boolean => {
|
|
315
|
+
const members = typeMembers(returns);
|
|
316
|
+
if ("code" in stated) {
|
|
317
|
+
const said = typeMembers(stated.code);
|
|
318
|
+
return isSubset(said, members);
|
|
319
|
+
}
|
|
320
|
+
const kinds = members.filter((member) => !NOTHING_TYPES.has(member)).map(kindOfMember);
|
|
321
|
+
return kinds.includes(undefined) || kinds.includes(stated.kind);
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
const clashOf = (fn: string, stated: string, signature: Signature, offset: number): ReturnTypeClash => ({
|
|
325
|
+
fn,
|
|
326
|
+
stated,
|
|
327
|
+
signature: signature.returns,
|
|
328
|
+
offset,
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
/** Two declarations with the same parameters and different return types; overloads (other parameters) are left alone. */
|
|
332
|
+
const signatureClashes = (signatures: readonly Signature[]): ReturnTypeClash[] =>
|
|
333
|
+
signatures.flatMap((later, index) => {
|
|
334
|
+
const earlier = signatures
|
|
335
|
+
.slice(0, index)
|
|
336
|
+
.find(
|
|
337
|
+
(signature) =>
|
|
338
|
+
signature.fn === later.fn && signature.params === later.params && typeMembers(signature.returns).join("|") !== typeMembers(later.returns).join("|"),
|
|
339
|
+
);
|
|
340
|
+
return earlier === undefined ? [] : [clashOf(later.fn, later.returns, earlier, later.offset)];
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
/** Every place on the page that states a function's return type differently from all of the function's signatures. */
|
|
344
|
+
export const returnTypeClashes = (source: string, words: ReturnWords): ReturnTypeClash[] => {
|
|
345
|
+
const lines = linesOf(source);
|
|
346
|
+
const signatures = signaturesOf(lines);
|
|
347
|
+
const known = new Set(signatures.map((signature) => signature.fn));
|
|
348
|
+
const statements = [
|
|
349
|
+
...labelStatements(lines, sectionFunctions(lines, signatures), words),
|
|
350
|
+
...tableStatements(lines, known, words),
|
|
351
|
+
...sentenceStatements(lines, known, words),
|
|
352
|
+
];
|
|
353
|
+
const statementClashes = statements.flatMap((statement) => {
|
|
354
|
+
const own = signatures.filter((signature) => signature.fn === statement.fn);
|
|
355
|
+
const first = own[0];
|
|
356
|
+
return first === undefined || own.some((signature) => agrees(statement.stated, signature.returns))
|
|
357
|
+
? []
|
|
358
|
+
: [clashOf(statement.fn, statement.stated.written, first, statement.offset)];
|
|
359
|
+
});
|
|
360
|
+
return [...signatureClashes(signatures), ...statementClashes].toSorted((left, right) => left.offset - right.offset);
|
|
361
|
+
};
|
package/src/rule-genres.ts
CHANGED
|
@@ -2,24 +2,27 @@ import type { Level, RuleDefinition } from "./plugin.ts";
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* How a rule stands in one genre, with no chaff.yaml: the same order of precedence as a run (use_for, then the genre's
|
|
5
|
-
* preset, then the rule's status).
|
|
5
|
+
* preset, then opt_in, then the rule's status).
|
|
6
6
|
* unsuited: the rule is not for this kind of document (use_for), and does not run
|
|
7
7
|
* genre-off: the genre's preset turns it off
|
|
8
|
+
* opt-in: it runs only where chaff.yaml's style or rules give it a level
|
|
8
9
|
* experimental: it runs only with --experimental or a level in chaff.yaml
|
|
9
10
|
* on: it runs, at this level
|
|
10
11
|
*/
|
|
11
12
|
export type GenreStanding =
|
|
12
13
|
| { readonly kind: "unsuited" }
|
|
13
14
|
| { readonly kind: "genre-off" }
|
|
15
|
+
| { readonly kind: "opt-in" }
|
|
14
16
|
| { readonly kind: "experimental" }
|
|
15
17
|
| { readonly kind: "on"; readonly level: Exclude<Level, "off">; readonly byPreset: boolean };
|
|
16
18
|
|
|
17
|
-
type RuleFacts = Pick<RuleDefinition, "id" | "status" | "use_for">;
|
|
19
|
+
type RuleFacts = Pick<RuleDefinition, "id" | "status" | "use_for" | "opt_in">;
|
|
18
20
|
|
|
19
21
|
export const standingIn = (rule: RuleFacts, genre: string, preset: Readonly<Record<string, Level>>): GenreStanding => {
|
|
20
22
|
if (!rule.use_for.some((target) => genre.startsWith(target))) return { kind: "unsuited" };
|
|
21
23
|
const fromPreset = preset[rule.id];
|
|
22
24
|
if (fromPreset === "off") return { kind: "genre-off" };
|
|
23
25
|
if (fromPreset !== undefined) return { kind: "on", level: fromPreset, byPreset: true };
|
|
26
|
+
if (rule.opt_in === true) return { kind: "opt-in" };
|
|
24
27
|
return rule.status === "experimental" ? { kind: "experimental" } : { kind: "on", level: "normal", byPreset: false };
|
|
25
28
|
};
|
package/src/rule-load.ts
CHANGED
|
@@ -105,10 +105,11 @@ const numberFor = (raw: unknown, language: string): number | undefined => {
|
|
|
105
105
|
|
|
106
106
|
const stringList = (value: unknown): string[] | undefined => (Array.isArray(value) ? value.map((entry) => String(entry)) : undefined);
|
|
107
107
|
|
|
108
|
-
/** What only some rules declare: options beyond the level,
|
|
109
|
-
const extrasOf = (raw: Record<string, unknown>, file: string): Pick<RuleDefinition, "options" | "token_features"> => ({
|
|
108
|
+
/** What only some rules declare: options beyond the level, token features the adapter computes on request, and opt_in. */
|
|
109
|
+
const extrasOf = (raw: Record<string, unknown>, file: string): Pick<RuleDefinition, "options" | "token_features" | "opt_in"> => ({
|
|
110
110
|
...(raw["options"] === undefined ? {} : { options: optionsOf(raw["options"], file) }),
|
|
111
111
|
...(raw["token_features"] === undefined ? {} : { token_features: stringList(raw["token_features"]) ?? [] }),
|
|
112
|
+
...(raw["opt_in"] === true ? { opt_in: true } : {}),
|
|
112
113
|
});
|
|
113
114
|
|
|
114
115
|
/** The table flattenLevels reads, before its severities become numbers. */
|
package/src/run.ts
CHANGED
|
@@ -47,14 +47,16 @@ export const levelFor = (rule: RuleDefinition, settings: Settings, experimental:
|
|
|
47
47
|
// ジャンルの既定は chaff.yaml より弱く、status の既定より強い。--experimental でも、ジャンルが止めたものは止めたまま。
|
|
48
48
|
const fromPreset = preset[rule.id];
|
|
49
49
|
if (fromPreset !== undefined) return fromPreset;
|
|
50
|
+
if (rule.opt_in === true) return "off";
|
|
50
51
|
if (rule.status === "experimental" && !experimental) return "off";
|
|
51
52
|
return "normal";
|
|
52
53
|
};
|
|
53
54
|
|
|
54
|
-
/** Why a rule at off did not run: chaff.yaml turned it off, the genre's preset did, or it is experimental. */
|
|
55
|
+
/** Why a rule at off did not run: chaff.yaml turned it off, the genre's preset did, it waits for a style, or it is experimental. */
|
|
55
56
|
const offSkip = (rule: RuleDefinition, settings: Settings, preset: Settings, genre: string, reasons: Reasons): Skipped => {
|
|
56
57
|
if (settings[rule.id] !== undefined) return { rule: rule.id, why: reasons.turnedOff };
|
|
57
58
|
if (preset[rule.id] !== undefined) return { rule: rule.id, why: reasons.presetOff(genre) };
|
|
59
|
+
if (rule.opt_in === true) return { rule: rule.id, why: reasons.optIn };
|
|
58
60
|
return { rule: rule.id, why: reasons.experimental, offUntilExperimental: true };
|
|
59
61
|
};
|
|
60
62
|
|
package/src/spelling.ts
CHANGED
|
@@ -79,3 +79,11 @@ export const wordsToCheck = (text: string, minLength: number, maxLength: number)
|
|
|
79
79
|
)
|
|
80
80
|
.map((match) => ({ offset: match.index, word: match[0] }));
|
|
81
81
|
};
|
|
82
|
+
|
|
83
|
+
/** 頭の字を強調(**G**lobally)や角括弧(引用を変えた [e]xpressions)で分けた語の残りの、直前の形。 */
|
|
84
|
+
const SPLIT_HEAD = /(?:\p{L}[*_~]+|\[\p{L}\])$/u;
|
|
85
|
+
/** 直前を見る字の数。強調の印と頭の字が収まればよい。 */
|
|
86
|
+
const SPLIT_LOOKBACK = 8;
|
|
87
|
+
|
|
88
|
+
/** source(Markdown のままの文書)の offset から始まる語が、頭の字を分けた語の残りか。 */
|
|
89
|
+
export const isSplitWord = (source: string, offset: number): boolean => SPLIT_HEAD.test(source.slice(Math.max(0, offset - SPLIT_LOOKBACK), offset));
|