chaffjs 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/stays.d.ts +43 -0
- package/dist/derived/stays.d.ts.map +1 -0
- package/dist/derived/stays.js +105 -0
- package/dist/derived/stays.js.map +1 -0
- package/dist/detectors/acronym-context.d.ts +2 -2
- package/dist/detectors/acronym-context.d.ts.map +1 -1
- package/dist/detectors/acronym-context.js +6 -0
- package/dist/detectors/acronym-context.js.map +1 -1
- package/dist/detectors/address-word.d.ts +3 -0
- package/dist/detectors/address-word.d.ts.map +1 -0
- package/dist/detectors/address-word.js +7 -0
- package/dist/detectors/address-word.js.map +1 -0
- package/dist/detectors/agreement-slip.d.ts.map +1 -1
- package/dist/detectors/agreement-slip.js +4 -1
- package/dist/detectors/agreement-slip.js.map +1 -1
- package/dist/detectors/ai-phrasing.d.ts +0 -4
- package/dist/detectors/ai-phrasing.d.ts.map +1 -1
- package/dist/detectors/ai-phrasing.js +5 -1
- package/dist/detectors/ai-phrasing.js.map +1 -1
- package/dist/detectors/amount-range.d.ts +3 -0
- package/dist/detectors/amount-range.d.ts.map +1 -0
- package/dist/detectors/amount-range.js +38 -0
- package/dist/detectors/amount-range.js.map +1 -0
- package/dist/detectors/amount-scale.d.ts +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/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 +34 -0
- package/dist/detectors/date-outside-period.js.map +1 -0
- package/dist/detectors/default-values.d.ts +3 -0
- package/dist/detectors/default-values.d.ts.map +1 -0
- package/dist/detectors/default-values.js +14 -0
- package/dist/detectors/default-values.js.map +1 -0
- package/dist/detectors/defined-term-form.d.ts +6 -2
- package/dist/detectors/defined-term-form.d.ts.map +1 -1
- package/dist/detectors/defined-term-form.js +72 -12
- package/dist/detectors/defined-term-form.js.map +1 -1
- package/dist/detectors/definition-use.d.ts.map +1 -1
- package/dist/detectors/definition-use.js +8 -1
- package/dist/detectors/definition-use.js.map +1 -1
- package/dist/detectors/deprecated-use.d.ts +3 -0
- package/dist/detectors/deprecated-use.d.ts.map +1 -0
- package/dist/detectors/deprecated-use.js +14 -0
- package/dist/detectors/deprecated-use.js.map +1 -0
- package/dist/detectors/derived-numbers.d.ts +1 -1
- package/dist/detectors/derived-numbers.d.ts.map +1 -1
- package/dist/detectors/derived-numbers.js +70 -15
- 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 +82 -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/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/date-outside-period.d.ts +3 -0
- package/dist/detectors/registry/date-outside-period.d.ts.map +1 -0
- package/dist/detectors/registry/date-outside-period.js +3 -0
- package/dist/detectors/registry/date-outside-period.js.map +1 -0
- package/dist/detectors/registry/default-values.d.ts +3 -0
- package/dist/detectors/registry/default-values.d.ts.map +1 -0
- package/dist/detectors/registry/default-values.js +3 -0
- package/dist/detectors/registry/default-values.js.map +1 -0
- package/dist/detectors/registry/deprecated-use.d.ts +3 -0
- package/dist/detectors/registry/deprecated-use.d.ts.map +1 -0
- package/dist/detectors/registry/deprecated-use.js +3 -0
- package/dist/detectors/registry/deprecated-use.js.map +1 -0
- package/dist/detectors/registry/due-date.d.ts +3 -0
- package/dist/detectors/registry/due-date.d.ts.map +1 -0
- package/dist/detectors/registry/due-date.js +3 -0
- package/dist/detectors/registry/due-date.js.map +1 -0
- package/dist/detectors/registry/kana-function-word.d.ts +3 -0
- package/dist/detectors/registry/kana-function-word.d.ts.map +1 -0
- package/dist/detectors/registry/kana-function-word.js +3 -0
- package/dist/detectors/registry/kana-function-word.js.map +1 -0
- package/dist/detectors/registry/line-amount.d.ts +3 -0
- package/dist/detectors/registry/line-amount.d.ts.map +1 -0
- package/dist/detectors/registry/line-amount.js +3 -0
- package/dist/detectors/registry/line-amount.js.map +1 -0
- package/dist/detectors/registry/nado-closed-list.d.ts +3 -0
- package/dist/detectors/registry/nado-closed-list.d.ts.map +1 -0
- package/dist/detectors/registry/nado-closed-list.js +3 -0
- package/dist/detectors/registry/nado-closed-list.js.map +1 -0
- package/dist/detectors/registry/number-word-figure.d.ts +3 -0
- package/dist/detectors/registry/number-word-figure.d.ts.map +1 -0
- package/dist/detectors/registry/number-word-figure.js +3 -0
- package/dist/detectors/registry/number-word-figure.js.map +1 -0
- package/dist/detectors/registry/obligation-without-deadline.d.ts +3 -0
- package/dist/detectors/registry/obligation-without-deadline.d.ts.map +1 -0
- package/dist/detectors/registry/obligation-without-deadline.js +3 -0
- package/dist/detectors/registry/obligation-without-deadline.js.map +1 -0
- package/dist/detectors/registry/parameter-table.d.ts +3 -0
- package/dist/detectors/registry/parameter-table.d.ts.map +1 -0
- package/dist/detectors/registry/parameter-table.js +3 -0
- package/dist/detectors/registry/parameter-table.js.map +1 -0
- package/dist/detectors/registry/phone-number-variant.d.ts +3 -0
- package/dist/detectors/registry/phone-number-variant.d.ts.map +1 -0
- package/dist/detectors/registry/phone-number-variant.js +3 -0
- package/dist/detectors/registry/phone-number-variant.js.map +1 -0
- package/dist/detectors/registry/prerequisite-order.d.ts +3 -0
- package/dist/detectors/registry/prerequisite-order.d.ts.map +1 -0
- package/dist/detectors/registry/prerequisite-order.js +3 -0
- package/dist/detectors/registry/prerequisite-order.js.map +1 -0
- package/dist/detectors/registry/quote-unnamed-speaker.d.ts +3 -0
- package/dist/detectors/registry/quote-unnamed-speaker.d.ts.map +1 -0
- package/dist/detectors/registry/quote-unnamed-speaker.js +3 -0
- package/dist/detectors/registry/quote-unnamed-speaker.js.map +1 -0
- package/dist/detectors/registry/tax-amount.d.ts +3 -0
- package/dist/detectors/registry/tax-amount.d.ts.map +1 -0
- package/dist/detectors/registry/tax-amount.js +3 -0
- package/dist/detectors/registry/tax-amount.js.map +1 -0
- package/dist/detectors/registry/time-order.d.ts +3 -0
- package/dist/detectors/registry/time-order.d.ts.map +1 -0
- package/dist/detectors/registry/time-order.js +3 -0
- package/dist/detectors/registry/time-order.js.map +1 -0
- package/dist/detectors/registry/ui-label.d.ts +3 -0
- package/dist/detectors/registry/ui-label.d.ts.map +1 -0
- package/dist/detectors/registry/ui-label.js +3 -0
- package/dist/detectors/registry/ui-label.js.map +1 -0
- package/dist/detectors/registry/undefined-call.d.ts +3 -0
- package/dist/detectors/registry/undefined-call.d.ts.map +1 -0
- package/dist/detectors/registry/undefined-call.js +3 -0
- package/dist/detectors/registry/undefined-call.js.map +1 -0
- package/dist/detectors/registry/undefined-term.d.ts +3 -0
- package/dist/detectors/registry/undefined-term.d.ts.map +1 -0
- package/dist/detectors/registry/undefined-term.js +3 -0
- package/dist/detectors/registry/undefined-term.js.map +1 -0
- package/dist/detectors/registry/version-order.d.ts +3 -0
- package/dist/detectors/registry/version-order.d.ts.map +1 -0
- package/dist/detectors/registry/version-order.js +3 -0
- package/dist/detectors/registry/version-order.js.map +1 -0
- package/dist/detectors/registry/warning-action.d.ts +3 -0
- package/dist/detectors/registry/warning-action.d.ts.map +1 -0
- package/dist/detectors/registry/warning-action.js +3 -0
- package/dist/detectors/registry/warning-action.js.map +1 -0
- package/dist/detectors/requirement-smell.d.ts.map +1 -1
- package/dist/detectors/requirement-smell.js +25 -8
- package/dist/detectors/requirement-smell.js.map +1 -1
- package/dist/detectors/structure-tree.d.ts +12 -4
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +31 -14
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/superlative-scope.d.ts.map +1 -1
- package/dist/detectors/superlative-scope.js +11 -1
- package/dist/detectors/superlative-scope.js.map +1 -1
- package/dist/detectors/tax-amount.d.ts +3 -0
- package/dist/detectors/tax-amount.d.ts.map +1 -0
- package/dist/detectors/tax-amount.js +19 -0
- package/dist/detectors/tax-amount.js.map +1 -0
- package/dist/detectors/technical-docs.d.ts.map +1 -1
- package/dist/detectors/technical-docs.js +5 -1
- package/dist/detectors/technical-docs.js.map +1 -1
- package/dist/detectors/term-extension.d.ts +14 -0
- package/dist/detectors/term-extension.d.ts.map +1 -0
- package/dist/detectors/term-extension.js +67 -0
- package/dist/detectors/term-extension.js.map +1 -0
- package/dist/detectors/time-order.d.ts +4 -0
- package/dist/detectors/time-order.d.ts.map +1 -0
- package/dist/detectors/time-order.js +32 -0
- package/dist/detectors/time-order.js.map +1 -0
- package/dist/detectors/ui-label.d.ts +3 -0
- package/dist/detectors/ui-label.d.ts.map +1 -0
- package/dist/detectors/ui-label.js +16 -0
- package/dist/detectors/ui-label.js.map +1 -0
- package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
- package/dist/detectors/unbalanced-bracket.js +8 -13
- package/dist/detectors/unbalanced-bracket.js.map +1 -1
- package/dist/detectors/undefined-call.d.ts +3 -0
- package/dist/detectors/undefined-call.d.ts.map +1 -0
- package/dist/detectors/undefined-call.js +18 -0
- package/dist/detectors/undefined-call.js.map +1 -0
- package/dist/detectors/undefined-term.d.ts +22 -0
- package/dist/detectors/undefined-term.d.ts.map +1 -0
- package/dist/detectors/undefined-term.js +85 -0
- package/dist/detectors/undefined-term.js.map +1 -0
- package/dist/detectors/unknown-word.d.ts +1 -1
- package/dist/detectors/unknown-word.js +3 -3
- package/dist/detectors/unknown-word.js.map +1 -1
- package/dist/detectors/vague-deadline.d.ts +4 -0
- package/dist/detectors/vague-deadline.d.ts.map +1 -1
- package/dist/detectors/vague-deadline.js +3 -3
- package/dist/detectors/vague-deadline.js.map +1 -1
- package/dist/detectors/version-mismatch.d.ts.map +1 -1
- package/dist/detectors/version-mismatch.js +18 -1
- package/dist/detectors/version-mismatch.js.map +1 -1
- package/dist/detectors/version-order.d.ts +3 -0
- package/dist/detectors/version-order.d.ts.map +1 -0
- package/dist/detectors/version-order.js +43 -0
- package/dist/detectors/version-order.js.map +1 -0
- package/dist/detectors/warning-action.d.ts +3 -0
- package/dist/detectors/warning-action.d.ts.map +1 -0
- package/dist/detectors/warning-action.js +48 -0
- package/dist/detectors/warning-action.js.map +1 -0
- package/dist/facts/condition-pairs.d.ts +51 -0
- package/dist/facts/condition-pairs.d.ts.map +1 -0
- package/dist/facts/condition-pairs.js +203 -0
- package/dist/facts/condition-pairs.js.map +1 -0
- package/dist/facts/event-dates.d.ts +26 -0
- package/dist/facts/event-dates.d.ts.map +1 -0
- package/dist/facts/event-dates.js +38 -0
- package/dist/facts/event-dates.js.map +1 -0
- package/dist/facts/fact-scope.d.ts +2 -0
- package/dist/facts/fact-scope.d.ts.map +1 -1
- package/dist/facts/fact-scope.js +5 -0
- package/dist/facts/fact-scope.js.map +1 -1
- package/dist/facts/labelled-facts.d.ts +2 -0
- package/dist/facts/labelled-facts.d.ts.map +1 -1
- package/dist/facts/labelled-facts.js +9 -1
- package/dist/facts/labelled-facts.js.map +1 -1
- package/dist/facts/table-facts.d.ts +16 -0
- package/dist/facts/table-facts.d.ts.map +1 -1
- package/dist/facts/table-facts.js +2 -2
- package/dist/facts/table-facts.js.map +1 -1
- package/dist/grade/ai-score.d.ts +1 -1
- package/dist/grade/ai-score.d.ts.map +1 -1
- package/dist/grade/text.js +2 -2
- package/dist/grade/text.js.map +1 -1
- package/dist/heading-numbering.js +2 -2
- package/dist/heading-numbering.js.map +1 -1
- package/dist/html/fetch-page.d.ts +20 -0
- package/dist/html/fetch-page.d.ts.map +1 -0
- package/dist/html/fetch-page.js +51 -0
- package/dist/html/fetch-page.js.map +1 -0
- package/dist/html/fetched-text.d.ts +5 -0
- package/dist/html/fetched-text.d.ts.map +1 -0
- package/dist/html/fetched-text.js +25 -0
- package/dist/html/fetched-text.js.map +1 -0
- package/dist/html/html-content-block.d.ts +6 -0
- package/dist/html/html-content-block.d.ts.map +1 -0
- package/dist/html/html-content-block.js +86 -0
- package/dist/html/html-content-block.js.map +1 -0
- package/dist/html/html-elements.d.ts +41 -0
- package/dist/html/html-elements.d.ts.map +1 -0
- package/dist/html/html-elements.js +91 -0
- package/dist/html/html-elements.js.map +1 -0
- package/dist/html/html-footnote-marks.d.ts +2 -0
- package/dist/html/html-footnote-marks.d.ts.map +1 -0
- package/dist/html/html-footnote-marks.js +15 -0
- package/dist/html/html-footnote-marks.js.map +1 -0
- package/dist/html/html-heading-links.d.ts +6 -0
- package/dist/html/html-heading-links.d.ts.map +1 -0
- package/dist/html/html-heading-links.js +71 -0
- package/dist/html/html-heading-links.js.map +1 -0
- package/dist/html/html-lost-tags.d.ts +3 -0
- package/dist/html/html-lost-tags.d.ts.map +1 -0
- package/dist/html/html-lost-tags.js +11 -0
- package/dist/html/html-lost-tags.js.map +1 -0
- package/dist/html/html-markdown.d.ts +2 -0
- package/dist/html/html-markdown.d.ts.map +1 -0
- package/dist/html/html-markdown.js +347 -0
- package/dist/html/html-markdown.js.map +1 -0
- package/dist/html/html-preformatted.d.ts +17 -0
- package/dist/html/html-preformatted.d.ts.map +1 -0
- package/dist/html/html-preformatted.js +82 -0
- package/dist/html/html-preformatted.js.map +1 -0
- package/dist/html/html-reader-only.d.ts +6 -0
- package/dist/html/html-reader-only.d.ts.map +1 -0
- package/dist/html/html-reader-only.js +63 -0
- package/dist/html/html-reader-only.js.map +1 -0
- package/dist/html/html-run-in-headings.d.ts +2 -0
- package/dist/html/html-run-in-headings.d.ts.map +1 -0
- package/dist/html/html-run-in-headings.js +36 -0
- package/dist/html/html-run-in-headings.js.map +1 -0
- package/dist/html/html-tables.d.ts +3 -0
- package/dist/html/html-tables.d.ts.map +1 -0
- package/dist/html/html-tables.js +58 -0
- package/dist/html/html-tables.js.map +1 -0
- package/dist/html/html-widgets.d.ts +3 -0
- package/dist/html/html-widgets.d.ts.map +1 -0
- package/dist/html/html-widgets.js +71 -0
- package/dist/html/html-widgets.js.map +1 -0
- package/dist/html/markup-text.d.ts +5 -0
- package/dist/html/markup-text.d.ts.map +1 -0
- package/dist/html/markup-text.js +32 -0
- package/dist/html/markup-text.js.map +1 -0
- package/dist/html/page-document.d.ts +9 -0
- package/dist/html/page-document.d.ts.map +1 -0
- package/dist/html/page-document.js +19 -0
- package/dist/html/page-document.js.map +1 -0
- package/dist/inline-count.d.ts +19 -0
- package/dist/inline-count.d.ts.map +1 -0
- package/dist/inline-count.js +109 -0
- package/dist/inline-count.js.map +1 -0
- package/dist/kana-spelling.d.ts +5 -0
- package/dist/kana-spelling.d.ts.map +1 -1
- package/dist/kana-spelling.js +5 -0
- package/dist/kana-spelling.js.map +1 -1
- package/dist/location-part.d.ts +13 -0
- package/dist/location-part.d.ts.map +1 -0
- package/dist/location-part.js +24 -0
- package/dist/location-part.js.map +1 -0
- package/dist/nado-closed-list.d.ts +20 -0
- package/dist/nado-closed-list.d.ts.map +1 -0
- package/dist/nado-closed-list.js +72 -0
- package/dist/nado-closed-list.js.map +1 -0
- package/dist/name-cue.d.ts +17 -0
- package/dist/name-cue.d.ts.map +1 -0
- package/dist/name-cue.js +29 -0
- package/dist/name-cue.js.map +1 -0
- package/dist/name-variants.d.ts +23 -1
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +39 -8
- package/dist/name-variants.js.map +1 -1
- package/dist/paragraph-runs.d.ts +6 -1
- package/dist/paragraph-runs.d.ts.map +1 -1
- package/dist/paragraph-runs.js +9 -2
- package/dist/paragraph-runs.js.map +1 -1
- package/dist/parameter-table.d.ts +19 -0
- package/dist/parameter-table.d.ts.map +1 -0
- package/dist/parameter-table.js +191 -0
- package/dist/parameter-table.js.map +1 -0
- package/dist/phone-numbers.d.ts +23 -0
- package/dist/phone-numbers.d.ts.map +1 -0
- package/dist/phone-numbers.js +83 -0
- package/dist/phone-numbers.js.map +1 -0
- package/dist/place-names.d.ts +55 -0
- package/dist/place-names.d.ts.map +1 -0
- package/dist/place-names.js +196 -0
- package/dist/place-names.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/prerequisite-order.d.ts +16 -0
- package/dist/prerequisite-order.d.ts.map +1 -0
- package/dist/prerequisite-order.js +29 -0
- package/dist/prerequisite-order.js.map +1 -0
- package/dist/profile/parse.d.ts.map +1 -1
- package/dist/profile/parse.js +10 -1
- package/dist/profile/parse.js.map +1 -1
- package/dist/reasons.d.ts +2 -0
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +2 -0
- package/dist/reasons.js.map +1 -1
- package/dist/render/rules-json.d.ts.map +1 -1
- package/dist/render/rules-json.js +4 -0
- package/dist/render/rules-json.js.map +1 -1
- package/dist/render/rules-table.d.ts.map +1 -1
- package/dist/render/rules-table.js +6 -2
- package/dist/render/rules-table.js.map +1 -1
- package/dist/rule-genres.d.ts +5 -2
- package/dist/rule-genres.d.ts.map +1 -1
- package/dist/rule-genres.js +2 -0
- package/dist/rule-genres.js.map +1 -1
- package/dist/rule-load.d.ts.map +1 -1
- package/dist/rule-load.js +2 -1
- package/dist/rule-load.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +5 -1
- package/dist/run.js.map +1 -1
- package/dist/spelling.d.ts +2 -0
- package/dist/spelling.d.ts.map +1 -1
- package/dist/spelling.js +6 -0
- package/dist/spelling.js.map +1 -1
- package/dist/structure/action-due.d.ts +21 -0
- package/dist/structure/action-due.d.ts.map +1 -0
- package/dist/structure/action-due.js +126 -0
- package/dist/structure/action-due.js.map +1 -0
- package/dist/structure/amount-range.d.ts +30 -0
- package/dist/structure/amount-range.d.ts.map +1 -0
- package/dist/structure/amount-range.js +153 -0
- package/dist/structure/amount-range.js.map +1 -0
- package/dist/structure/amount-scale.d.ts +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/counted-amounts.d.ts +12 -0
- package/dist/structure/counted-amounts.d.ts.map +1 -0
- package/dist/structure/counted-amounts.js +30 -0
- package/dist/structure/counted-amounts.js.map +1 -0
- package/dist/structure/date-order.d.ts +24 -3
- package/dist/structure/date-order.d.ts.map +1 -1
- package/dist/structure/date-order.js +49 -17
- package/dist/structure/date-order.js.map +1 -1
- package/dist/structure/date-outside-period.d.ts +27 -0
- package/dist/structure/date-outside-period.d.ts.map +1 -0
- package/dist/structure/date-outside-period.js +86 -0
- package/dist/structure/date-outside-period.js.map +1 -0
- package/dist/structure/definition-use.d.ts +5 -2
- package/dist/structure/definition-use.d.ts.map +1 -1
- package/dist/structure/definition-use.js +11 -3
- package/dist/structure/definition-use.js.map +1 -1
- package/dist/structure/due-date.d.ts +19 -0
- package/dist/structure/due-date.d.ts.map +1 -0
- package/dist/structure/due-date.js +30 -0
- package/dist/structure/due-date.js.map +1 -0
- package/dist/structure/heading-runs.d.ts +9 -0
- package/dist/structure/heading-runs.d.ts.map +1 -0
- package/dist/structure/heading-runs.js +23 -0
- package/dist/structure/heading-runs.js.map +1 -0
- package/dist/structure/install-pin.d.ts +46 -0
- package/dist/structure/install-pin.d.ts.map +1 -0
- package/dist/structure/install-pin.js +85 -0
- package/dist/structure/install-pin.js.map +1 -0
- package/dist/structure/leg-times.d.ts +34 -0
- package/dist/structure/leg-times.d.ts.map +1 -0
- package/dist/structure/leg-times.js +135 -0
- package/dist/structure/leg-times.js.map +1 -0
- package/dist/structure/line-amount-unit.d.ts +24 -0
- package/dist/structure/line-amount-unit.d.ts.map +1 -0
- package/dist/structure/line-amount-unit.js +24 -0
- package/dist/structure/line-amount-unit.js.map +1 -0
- package/dist/structure/line-amount.d.ts +40 -0
- package/dist/structure/line-amount.d.ts.map +1 -0
- package/dist/structure/line-amount.js +118 -0
- package/dist/structure/line-amount.js.map +1 -0
- package/dist/structure/number-word-figure.d.ts +37 -0
- package/dist/structure/number-word-figure.d.ts.map +1 -0
- package/dist/structure/number-word-figure.js +151 -0
- package/dist/structure/number-word-figure.js.map +1 -0
- package/dist/structure/numbering.d.ts +1 -0
- package/dist/structure/numbering.d.ts.map +1 -1
- package/dist/structure/numbering.js +3 -0
- package/dist/structure/numbering.js.map +1 -1
- package/dist/structure/ordinal-runs.d.ts +45 -0
- package/dist/structure/ordinal-runs.d.ts.map +1 -0
- package/dist/structure/ordinal-runs.js +78 -0
- package/dist/structure/ordinal-runs.js.map +1 -0
- package/dist/structure/percent-sum-prose.d.ts +1 -1
- package/dist/structure/percent-sum-prose.d.ts.map +1 -1
- package/dist/structure/percent-sum-prose.js +45 -3
- package/dist/structure/percent-sum-prose.js.map +1 -1
- package/dist/structure/percent-sum.d.ts +8 -0
- package/dist/structure/percent-sum.d.ts.map +1 -1
- package/dist/structure/percent-sum.js +8 -1
- package/dist/structure/percent-sum.js.map +1 -1
- package/dist/structure/release-list.d.ts +9 -0
- package/dist/structure/release-list.d.ts.map +1 -0
- package/dist/structure/release-list.js +46 -0
- package/dist/structure/release-list.js.map +1 -0
- package/dist/structure/share-column.d.ts +7 -0
- package/dist/structure/share-column.d.ts.map +1 -0
- package/dist/structure/share-column.js +22 -0
- package/dist/structure/share-column.js.map +1 -0
- package/dist/structure/stated-period.d.ts +31 -0
- package/dist/structure/stated-period.d.ts.map +1 -0
- package/dist/structure/stated-period.js +127 -0
- package/dist/structure/stated-period.js.map +1 -0
- package/dist/structure/tax.d.ts +25 -0
- package/dist/structure/tax.d.ts.map +1 -0
- package/dist/structure/tax.js +86 -0
- package/dist/structure/tax.js.map +1 -0
- package/dist/structure/time-marks.d.ts +58 -0
- package/dist/structure/time-marks.d.ts.map +1 -0
- package/dist/structure/time-marks.js +74 -0
- package/dist/structure/time-marks.js.map +1 -0
- package/dist/structure/time-order.d.ts +21 -0
- package/dist/structure/time-order.d.ts.map +1 -0
- package/dist/structure/time-order.js +108 -0
- package/dist/structure/time-order.js.map +1 -0
- package/dist/structure/title-lines.d.ts +8 -0
- package/dist/structure/title-lines.d.ts.map +1 -0
- package/dist/structure/title-lines.js +27 -0
- package/dist/structure/title-lines.js.map +1 -0
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +3 -1
- package/dist/structure/total.js.map +1 -1
- package/dist/structure/version-mismatch.d.ts +1 -5
- package/dist/structure/version-mismatch.d.ts.map +1 -1
- package/dist/structure/version-mismatch.js +65 -12
- package/dist/structure/version-mismatch.js.map +1 -1
- package/dist/structure/version-order.d.ts +23 -0
- package/dist/structure/version-order.d.ts.map +1 -0
- package/dist/structure/version-order.js +67 -0
- package/dist/structure/version-order.js.map +1 -0
- package/dist/table-text.d.ts +9 -0
- package/dist/table-text.d.ts.map +1 -0
- package/dist/table-text.js +36 -0
- package/dist/table-text.js.map +1 -0
- package/dist/ui-labels.d.ts +16 -0
- package/dist/ui-labels.d.ts.map +1 -0
- package/dist/ui-labels.js +42 -0
- package/dist/ui-labels.js.map +1 -0
- package/dist/undefined-call.d.ts +13 -0
- package/dist/undefined-call.d.ts.map +1 -0
- package/dist/undefined-call.js +55 -0
- package/dist/undefined-call.js.map +1 -0
- package/dist/unnamed-speaker.d.ts +23 -0
- package/dist/unnamed-speaker.d.ts.map +1 -0
- package/dist/unnamed-speaker.js +176 -0
- package/dist/unnamed-speaker.js.map +1 -0
- package/dist/warning-action.d.ts +22 -0
- package/dist/warning-action.d.ts.map +1 -0
- package/dist/warning-action.js +58 -0
- package/dist/warning-action.js.map +1 -0
- package/genres.yaml +2 -0
- package/package.json +4 -3
- package/profiles/statute.yaml +8 -0
- package/rules/agreement-slip.yaml +2 -2
- package/rules/amount-range-reversed.yaml +52 -0
- package/rules/amount-scale-consistency.yaml +4 -4
- package/rules/announced-count-mismatch.yaml +9 -4
- package/rules/arrival-before-departure.yaml +48 -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 +12 -4
- 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 +14 -2
- package/rules/number-word-figure-mismatch.yaml +76 -0
- package/rules/numbering-gap.yaml +2 -2
- package/rules/obligation-without-deadline.yaml +95 -0
- package/rules/one-sentence-paragraph-run.yaml +2 -3
- package/rules/parameter-table-mismatch.yaml +90 -0
- package/rules/percent-sum-mismatch.yaml +2 -2
- package/rules/phone-number-variant.yaml +68 -0
- package/rules/prerequisite-after-step.yaml +78 -0
- package/rules/quote-unnamed-speaker.yaml +67 -0
- package/rules/quote-without-source.yaml +6 -6
- package/rules/requirement-smell.yaml +3 -3
- package/rules/sentence-initial-conjunction-run.yaml +13 -7
- package/rules/summary-fact-mismatch.yaml +4 -4
- package/rules/tax-mismatch.yaml +71 -0
- package/rules/time-order.yaml +65 -0
- package/rules/title-length.yaml +2 -2
- package/rules/ui-label-variant.yaml +70 -0
- package/rules/unbalanced-bracket.yaml +4 -4
- package/rules/uncomparable-graded.yaml +29 -10
- package/rules/undefined-function-call.yaml +77 -0
- package/rules/undefined-term.yaml +72 -0
- package/rules/unknown-word.yaml +2 -2
- package/rules/unqualified-superlative.yaml +2 -2
- package/rules/use-before-definition.yaml +2 -2
- package/rules/version-mismatch.yaml +12 -4
- package/rules/version-order.yaml +85 -0
- package/rules/very-adjective.yaml +31 -13
- package/rules/warning-without-action.yaml +64 -0
- package/rules/wordy-phrase.yaml +27 -9
- package/src/ai-score/of-document.ts +19 -9
- package/src/ai-score/render.ts +24 -4
- package/src/ai-score/score.ts +24 -3
- package/src/ai-score/signals.ts +12 -2
- package/src/ai-score/text.ts +7 -2
- package/src/announced-count.ts +19 -12
- package/src/check-source.ts +11 -2
- package/src/cli-text.ts +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/stays.ts +145 -0
- package/src/detectors/acronym-context.ts +10 -2
- package/src/detectors/address-word.ts +9 -0
- package/src/detectors/agreement-slip.ts +7 -1
- package/src/detectors/ai-phrasing.ts +6 -1
- package/src/detectors/amount-range.ts +54 -0
- package/src/detectors/amount-scale.ts +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/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 +38 -0
- package/src/detectors/default-values.ts +17 -0
- package/src/detectors/defined-term-form.ts +84 -15
- package/src/detectors/definition-use.ts +10 -2
- package/src/detectors/deprecated-use.ts +17 -0
- package/src/detectors/derived-numbers.ts +106 -15
- 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 +106 -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/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/date-outside-period.ts +4 -0
- package/src/detectors/registry/default-values.ts +4 -0
- package/src/detectors/registry/deprecated-use.ts +4 -0
- package/src/detectors/registry/due-date.ts +4 -0
- package/src/detectors/registry/kana-function-word.ts +4 -0
- package/src/detectors/registry/line-amount.ts +4 -0
- package/src/detectors/registry/nado-closed-list.ts +4 -0
- package/src/detectors/registry/number-word-figure.ts +4 -0
- package/src/detectors/registry/obligation-without-deadline.ts +4 -0
- package/src/detectors/registry/parameter-table.ts +4 -0
- package/src/detectors/registry/phone-number-variant.ts +4 -0
- package/src/detectors/registry/prerequisite-order.ts +4 -0
- package/src/detectors/registry/quote-unnamed-speaker.ts +4 -0
- package/src/detectors/registry/tax-amount.ts +4 -0
- package/src/detectors/registry/time-order.ts +4 -0
- package/src/detectors/registry/ui-label.ts +4 -0
- package/src/detectors/registry/undefined-call.ts +4 -0
- package/src/detectors/registry/undefined-term.ts +4 -0
- package/src/detectors/registry/version-order.ts +4 -0
- package/src/detectors/registry/warning-action.ts +4 -0
- package/src/detectors/requirement-smell.ts +29 -9
- package/src/detectors/structure-tree.ts +43 -21
- package/src/detectors/superlative-scope.ts +13 -1
- package/src/detectors/tax-amount.ts +25 -0
- package/src/detectors/technical-docs.ts +7 -1
- package/src/detectors/term-extension.ts +67 -0
- package/src/detectors/time-order.ts +49 -0
- package/src/detectors/ui-label.ts +17 -0
- package/src/detectors/unbalanced-bracket.ts +7 -14
- package/src/detectors/undefined-call.ts +19 -0
- package/src/detectors/undefined-term.ts +103 -0
- package/src/detectors/unknown-word.ts +3 -3
- package/src/detectors/vague-deadline.ts +3 -3
- package/src/detectors/version-mismatch.ts +26 -5
- package/src/detectors/version-order.ts +50 -0
- package/src/detectors/warning-action.ts +49 -0
- package/src/facts/condition-pairs.ts +289 -0
- package/src/facts/event-dates.ts +63 -0
- package/src/facts/fact-scope.ts +6 -0
- package/src/facts/labelled-facts.ts +13 -1
- package/src/facts/table-facts.ts +3 -3
- package/src/grade/ai-score.ts +1 -1
- package/src/grade/text.ts +2 -2
- package/src/heading-numbering.ts +2 -2
- package/src/html/fetch-page.ts +64 -0
- package/src/html/fetched-text.ts +32 -0
- package/src/html/html-content-block.ts +107 -0
- package/src/html/html-elements.ts +127 -0
- package/src/html/html-footnote-marks.ts +20 -0
- package/src/html/html-heading-links.ts +93 -0
- package/src/html/html-lost-tags.ts +14 -0
- package/src/html/html-markdown.ts +481 -0
- package/src/html/html-preformatted.ts +110 -0
- package/src/html/html-reader-only.ts +82 -0
- package/src/html/html-run-in-headings.ts +43 -0
- package/src/html/html-tables.ts +76 -0
- package/src/html/html-widgets.ts +114 -0
- package/src/html/markup-text.ts +35 -0
- package/src/html/page-document.ts +22 -0
- package/src/inline-count.ts +146 -0
- package/src/kana-spelling.ts +7 -0
- package/src/location-part.ts +30 -0
- package/src/nado-closed-list.ts +106 -0
- package/src/name-cue.ts +35 -0
- package/src/name-variants.ts +57 -11
- package/src/paragraph-runs.ts +12 -2
- package/src/parameter-table.ts +208 -0
- package/src/phone-numbers.ts +98 -0
- package/src/place-names.ts +248 -0
- package/src/plugin.ts +4 -0
- package/src/prerequisite-order.ts +39 -0
- package/src/profile/parse.ts +10 -1
- package/src/reasons.ts +4 -0
- package/src/render/rules-json.ts +4 -0
- package/src/render/rules-table.ts +6 -3
- package/src/rule-genres.ts +5 -2
- package/src/rule-load.ts +3 -2
- package/src/run.ts +3 -1
- package/src/spelling.ts +8 -0
- package/src/structure/action-due.ts +179 -0
- package/src/structure/amount-range.ts +219 -0
- package/src/structure/amount-scale.ts +18 -0
- package/src/structure/cite.ts +21 -2
- package/src/structure/counted-amounts.ts +42 -0
- package/src/structure/date-order.ts +72 -22
- package/src/structure/date-outside-period.ts +127 -0
- package/src/structure/definition-use.ts +24 -3
- package/src/structure/due-date.ts +46 -0
- package/src/structure/heading-runs.ts +24 -0
- package/src/structure/install-pin.ts +115 -0
- package/src/structure/leg-times.ts +198 -0
- package/src/structure/line-amount-unit.ts +35 -0
- package/src/structure/line-amount.ts +162 -0
- package/src/structure/number-word-figure.ts +199 -0
- package/src/structure/numbering.ts +3 -0
- package/src/structure/ordinal-runs.ts +107 -0
- package/src/structure/percent-sum-prose.ts +46 -3
- package/src/structure/percent-sum.ts +16 -2
- package/src/structure/release-list.ts +69 -0
- package/src/structure/share-column.ts +25 -0
- package/src/structure/stated-period.ts +161 -0
- package/src/structure/tax.ts +114 -0
- package/src/structure/time-marks.ts +127 -0
- package/src/structure/time-order.ts +140 -0
- package/src/structure/title-lines.ts +33 -0
- package/src/structure/total.ts +5 -1
- package/src/structure/version-mismatch.ts +67 -13
- package/src/structure/version-order.ts +84 -0
- package/src/table-text.ts +39 -0
- package/src/ui-labels.ts +55 -0
- package/src/undefined-call.ts +65 -0
- package/src/unnamed-speaker.ts +224 -0
- package/src/warning-action.ts +73 -0
- package/styles/koyobun.yaml +7 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-lost-tags.d.ts","sourceRoot":"","sources":["../../src/html/html-lost-tags.ts"],"names":[],"mappings":"AAWA,+EAA+E;AAC/E,eAAO,MAAM,6BAA6B,GAAI,MAAM,MAAM,KAAG,MAC2C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// A paragraph's start tag that lost its "<" upstream and so reached the page as text: the eCFR serves 16 CFR 310.4(b)
|
|
2
|
+
// with "… 45 CFR 160.103. P>(2) It is an abusive …", where "P>" is what is left of the <P> that opened paragraph (2).
|
|
3
|
+
// Read as text it glues the paragraph to the one before and leaves "P>" in the sentence. Only a P and a ">" standing
|
|
4
|
+
// after a sentence's end and right before a paragraph's designation ("(2)", "(iv)", "(A)") and a capital are taken for the lost
|
|
5
|
+
// tag; "P>0.05", "P > (2)" and a formula opening a sentence ("P>(2) follows") stay text. Pure.
|
|
6
|
+
const LOST_PARAGRAPH_TAG = /(?<=[.;:][)"'”’]?[ \t])[Pp](?:>|>)(?=\([0-9A-Za-z]{1,4}\)[ \t]\p{Lu})/gu;
|
|
7
|
+
/** Whether at is inside a tag. An attribute's ">" is escaped by then (withAttributeMarkupEscaped), so a tag has none before its end. */
|
|
8
|
+
const isInsideTag = (html, at) => html.lastIndexOf("<", at) > html.lastIndexOf(">", at - 1);
|
|
9
|
+
/** The HTML with each lost paragraph start tag in its text put back as <p>. */
|
|
10
|
+
export const withLostParagraphTagsRestored = (html) => html.replace(LOST_PARAGRAPH_TAG, (lost, at) => (isInsideTag(html, at) ? lost : "<p>"));
|
|
11
|
+
//# sourceMappingURL=html-lost-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-lost-tags.js","sourceRoot":"","sources":["../../src/html/html-lost-tags.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,yHAAyH;AACzH,qHAAqH;AACrH,gIAAgI;AAChI,+FAA+F;AAE/F,MAAM,kBAAkB,GAAG,4EAA4E,CAAC;AAExG,wIAAwI;AACxI,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAU,EAAW,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAErH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,IAAY,EAAU,EAAE,CACpE,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-markdown.d.ts","sourceRoot":"","sources":["../../src/html/html-markdown.ts"],"names":[],"mappings":"AA+cA,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,MAiB7C,CAAC"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
// An HTML page (a CRS report as EveryCRSReport serves it, a ministry's page) as plain Markdown: headings, paragraphs,
|
|
2
|
+
// list items and the text of links; ruby keeps its base text and loses its reading. Only the <main> element (else the
|
|
3
|
+
// role="main" element, else a sole <article>, else the block holding the title and nearly every sentence) is read when
|
|
4
|
+
// the page has one. Scripts, styles, the head, navigation (by
|
|
5
|
+
// element or by role, and breadcrumbs), asides, footers, forms, tables without sentences (html-tables.ts), footnote marks, lists and blocks of nothing but
|
|
6
|
+
// links (a menu, a table of contents, previous/next links, a breadcrumb trail, also as a list ending in the page's
|
|
7
|
+
// title), a list of the page in other languages, a block of icons with only a label, a block before the page's title that holds a menu or only links and no sentence (the site's header, with its tagline and
|
|
8
|
+
// labels), buttons outside a heading, controls (html-widgets.ts: tooltips, media players, scripted link buttons, paging
|
|
9
|
+
// bars, unspoken text), hidden elements, text for a screen reader only (a visually-hidden class, a skip
|
|
10
|
+
// link's target), a heading's link to its own section beside or after its title,
|
|
11
|
+
// lines of nothing but in-page or script links (never a heading), a heading drawn as an image unless its alt text is the page's
|
|
12
|
+
// title, blocks of nothing but links closing the page, and a copyright notice closing the page, with an address just
|
|
13
|
+
// before it, are dropped. A paragraph tag that lost its "<" upstream (html-lost-tags.ts) opens its paragraph again. Markup's spacing collapses; U+3000 is text and stays. Pure; a regular-expression reading that
|
|
14
|
+
// is enough for the documents in the corpus, not a parser for any HTML.
|
|
15
|
+
import { ANY_LINK, ATTRIBUTES, CLOSED_SENTENCE, asMarkup, elementRanges, hasNoWords, hasSentence, isFileLink, isInside, headingRanges, plainText, stripTags, withAttributeMarkupEscaped, withoutElementsOpening, withoutElementsWhere, withoutRanges, untilStable, } from "./html-elements.js";
|
|
16
|
+
import { contentBlock } from "./html-content-block.js";
|
|
17
|
+
import { withoutFootnoteMarks } from "./html-footnote-marks.js";
|
|
18
|
+
import { withoutHeadingSelfLinks } from "./html-heading-links.js";
|
|
19
|
+
import { withLostParagraphTagsRestored } from "./html-lost-tags.js";
|
|
20
|
+
import { withoutReaderOnlyText } from "./html-reader-only.js";
|
|
21
|
+
import { withRunInHeadingsRead } from "./html-run-in-headings.js";
|
|
22
|
+
import { withoutWidgets } from "./html-widgets.js";
|
|
23
|
+
import { withPreformattedRestored, withPreformattedStashed } from "./html-preformatted.js";
|
|
24
|
+
import { withTablesRead } from "./html-tables.js";
|
|
25
|
+
import { decodeEntities, tidyLines } from "./markup-text.js";
|
|
26
|
+
const DROPPED = ["script", "style", "head", "nav", "aside", "footer", "form", "noscript", "svg"];
|
|
27
|
+
const withoutElement = (html, tag) => {
|
|
28
|
+
const innermost = new RegExp(`<${tag}\\b[^>]*>(?:(?!<${tag}\\b)[\\s\\S])*?</${tag}\\s*>`, "giu");
|
|
29
|
+
return untilStable(html, (text) => text.replace(innermost, " "));
|
|
30
|
+
};
|
|
31
|
+
// HTML lets a ruby's parts omit their closing tags: a reading container (<rtc>) ends at the next <rb> or <rtc>, a
|
|
32
|
+
// reading (<rt>) or its bracket (<rp>) at the next <rb>, <rt> or <rp>; any of them at the end of the <ruby>.
|
|
33
|
+
const RUBY_TEXT_CONTAINER = /<rtc\b[^>]*>[\s\S]*?(?:<\/rtc\s*>|(?=<(?:rb|rtc)\b|$))/giu;
|
|
34
|
+
const RUBY_TEXT = /<(rt|rp)\b[^>]*>[\s\S]*?(?:<\/\1\s*>|(?=<(?:rb|rt|rp)\b|$))/giu;
|
|
35
|
+
/** Ruby as its base text alone: 漢字 with its reading becomes 漢字. */
|
|
36
|
+
const withoutRubyText = (html) => html.replace(/<ruby\b[^>]*>([\s\S]*?)<\/ruby\s*>/giu, (_whole, inside) => inside.replace(RUBY_TEXT_CONTAINER, "").replace(RUBY_TEXT, ""));
|
|
37
|
+
/**
|
|
38
|
+
* A link that moves within the page (a table of contents, "back to top"), through a series (rel="prev" / "next"), or
|
|
39
|
+
* goes nowhere and runs a script instead (href="javascript:…", a print or share button).
|
|
40
|
+
*/
|
|
41
|
+
const isChromeLink = (link) => /^<a\b[^>]*\bhref\s*=\s*(?:["']\s*)?(?:#|javascript:)/iu.test(link) || /^<a\b[^>]*\brel\s*=\s*(?:["'][^"']*\b)?(?:prev|next)\b/iu.test(link);
|
|
42
|
+
/** A list whose every item is only a link, such as a site menu or a table of contents. */
|
|
43
|
+
const isNavigation = (body) => [...body.matchAll(ANY_LINK)].length > 0 && stripTags(body.replace(ANY_LINK, "")).trim() === "";
|
|
44
|
+
// A role is a list of tokens and the first one counts: role="main document" is main.
|
|
45
|
+
const MAIN_ROLE = String.raw `${ATTRIBUTES}\s+role\s*=\s*(?:"\s*main(?:\s[^"]*)?"|'\s*main(?:\s[^']*)?'|main(?=[\s/>]))`;
|
|
46
|
+
/** The first element marked role="main" (a CMS's <article id="contents" role="main">), matched to its own closing tag. */
|
|
47
|
+
const mainLandmark = (html) => {
|
|
48
|
+
const tag = new RegExp(String.raw `<([a-z][a-z0-9]*)${MAIN_ROLE}`, "iu").exec(html)?.[1];
|
|
49
|
+
if (tag === undefined)
|
|
50
|
+
return undefined;
|
|
51
|
+
return elementRanges(html, tag).find((range) => new RegExp(String.raw `^<[a-z][a-z0-9]*${MAIN_ROLE}`, "iu").test(range.openTag))?.inner;
|
|
52
|
+
};
|
|
53
|
+
const isOutermost = (range, _index, all) => !all.some((outer) => isInside(outer, range));
|
|
54
|
+
const holdsEveryTitle = (html, range) => [...html.matchAll(/<h1\b/giu)].every((title) => title.index > range.start && title.index < range.end);
|
|
55
|
+
/**
|
|
56
|
+
* The one <article> not nested in another, when the page has exactly one and no <h1> outside it: the composition the
|
|
57
|
+
* page was made for. A page title outside the article means the article is only part of the page's content.
|
|
58
|
+
*/
|
|
59
|
+
const soleArticle = (html) => {
|
|
60
|
+
const [only, ...others] = elementRanges(html, "article").filter(isOutermost);
|
|
61
|
+
return only !== undefined && others.length === 0 && holdsEveryTitle(html, only) ? only.inner : undefined;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* The page's own content: inside <main>, else the element marked role="main", else a sole <article>, else the block
|
|
65
|
+
* holding the title and nearly every sentence (html-content-block.ts), else the whole page.
|
|
66
|
+
*/
|
|
67
|
+
const mainContent = (html) => /<main\b[^>]*>([\s\S]*)<\/main\s*>/iu.exec(html)?.[1] ?? mainLandmark(html) ?? soleArticle(html) ?? contentBlock(html) ?? html;
|
|
68
|
+
const LANDMARK = String.raw `(?:\brole\s*=\s*["']?navigation\b|\baria-label\s*=\s*(?:["'][^"']*|[^\s"'>]*)breadcrumb)`;
|
|
69
|
+
const LANDMARK_OPENING = new RegExp(String.raw `<([a-z][a-z0-9]*)\b[^>]*${LANDMARK}`, "giu");
|
|
70
|
+
const isLandmark = (range) => new RegExp(`^<[^>]*${LANDMARK}`, "iu").test(range.openTag);
|
|
71
|
+
/** Navigation that is not a <nav>: any element with role="navigation", or labelled as a breadcrumb. */
|
|
72
|
+
const withoutNavigationLandmarks = (html) => withoutElementsOpening(html, LANDMARK_OPENING, isLandmark);
|
|
73
|
+
// hidden="until-found" is found by the browser's search and opened, so its text is the page's.
|
|
74
|
+
const HIDDEN = String.raw `${ATTRIBUTES}\s+hidden(?=[\s/>=])(?!\s*=\s*(?:"until-found"|'until-found'|until-found(?=[\s/>])))`;
|
|
75
|
+
const HIDDEN_OPENING = new RegExp(String.raw `<([a-z][a-z0-9-]*)${HIDDEN}`, "giu");
|
|
76
|
+
const isHidden = (range) => new RegExp(String.raw `^<[a-z][a-z0-9-]*${HIDDEN}`, "iu").test(range.openTag);
|
|
77
|
+
/** Elements the page does not show (the hidden attribute): a tooltip, a closed menu. */
|
|
78
|
+
const withoutHiddenElements = (html) => withoutElementsOpening(html, HIDDEN_OPENING, isHidden);
|
|
79
|
+
/**
|
|
80
|
+
* Buttons are controls ("Close", "Share", "Cite this publication"), not prose, except one inside a heading, which is
|
|
81
|
+
* how an accordion draws its section's title.
|
|
82
|
+
*/
|
|
83
|
+
const withoutButtons = (html) => {
|
|
84
|
+
const headings = headingRanges(html);
|
|
85
|
+
return withoutElementsWhere(html, "button", (button) => !headings.some((heading) => isInside(heading, button)));
|
|
86
|
+
};
|
|
87
|
+
const LINK_MARK = "\u0003";
|
|
88
|
+
/** Links joined by ">" or another arrow, then the current page's name as plain text. */
|
|
89
|
+
const BREADCRUMB_TRAIL = new RegExp(`^\\s*(?:${LINK_MARK}\\s*[>›»>→]\\s*){2,}[^${LINK_MARK}>›»>→]*$`, "u");
|
|
90
|
+
/** A link wrapping blocks (a card with a title and a summary) carries content, not a way around the site. */
|
|
91
|
+
const isCard = (link) => /<(?:div|p|h[1-6]|ul|ol|dl|section|article|figure)\b/iu.test(link);
|
|
92
|
+
/** The links in html, or none when one of them wraps blocks. */
|
|
93
|
+
const plainLinks = (html) => {
|
|
94
|
+
const links = [...html.matchAll(ANY_LINK)].map((link) => link[0]);
|
|
95
|
+
return links.some(isCard) ? [] : links;
|
|
96
|
+
};
|
|
97
|
+
/** The text with each link standing as one mark. */
|
|
98
|
+
const withLinksMarked = (html) => decodeEntities(stripTags(html.replace(ANY_LINK, LINK_MARK)));
|
|
99
|
+
const isBreadcrumbTrail = (html) => plainLinks(html).length > 0 && BREADCRUMB_TRAIL.test(withLinksMarked(html));
|
|
100
|
+
const isOnlyLinks = (html) => hasNoWords(withLinksMarked(html).replaceAll(LINK_MARK, ""));
|
|
101
|
+
const MIN_GROUP_LINKS = 2;
|
|
102
|
+
/** A block made of two or more links and nothing else (a menu, previous and next), or a breadcrumb trail. */
|
|
103
|
+
const isLinkGroup = (range) => {
|
|
104
|
+
const links = plainLinks(range.inner);
|
|
105
|
+
if (links.length === 0)
|
|
106
|
+
return false;
|
|
107
|
+
return isOnlyLinks(range.inner) ? links.length >= MIN_GROUP_LINKS : isBreadcrumbTrail(range.inner);
|
|
108
|
+
};
|
|
109
|
+
/** A block of links and nothing else, even a single one: before the page's title, a way around the site ("English"). */
|
|
110
|
+
const isLinksOnly = (range) => plainLinks(range.inner).length > 0 && isOnlyLinks(range.inner);
|
|
111
|
+
const withoutLinkGroups = (html) => ["div", "section", "p"].reduce((text, tag) => withoutElementsWhere(text, tag, isLinkGroup), html);
|
|
112
|
+
/** The page's first <h1>: what it reads and where it opens. */
|
|
113
|
+
const pageTitle = (html) => {
|
|
114
|
+
const title = /<h1\b[^>]*>([\s\S]*?)<\/h1\s*>/iu.exec(html);
|
|
115
|
+
return title === null ? undefined : { text: plainText(title[1] ?? ""), start: title.index };
|
|
116
|
+
};
|
|
117
|
+
const MIN_TRAIL_LINKS = 2;
|
|
118
|
+
/**
|
|
119
|
+
* A breadcrumb as a list above the page's title: two or more items that are each only a link, then the title itself as
|
|
120
|
+
* the last item. The same list further down is the page's own content (steps ending in the one this page is about).
|
|
121
|
+
*/
|
|
122
|
+
const isBreadcrumbList = (body, at, title) => {
|
|
123
|
+
const items = body.split(/<li\b[^>]*>/iu).slice(1);
|
|
124
|
+
const current = items.at(-1);
|
|
125
|
+
const trail = items.slice(0, -1);
|
|
126
|
+
return (title !== undefined &&
|
|
127
|
+
at < title.start &&
|
|
128
|
+
current !== undefined &&
|
|
129
|
+
plainText(current) === title.text &&
|
|
130
|
+
trail.length >= MIN_TRAIL_LINKS &&
|
|
131
|
+
trail.every(isNavigation));
|
|
132
|
+
};
|
|
133
|
+
/** A list with items and not a word in them: buttons drawn as images, such as a text-size switch. */
|
|
134
|
+
const isWordlessList = (body) => /<li\b/iu.test(body) && hasNoWords(plainText(body));
|
|
135
|
+
const HREFLANG = /^<a\b[^>]*\shreflang\s*=/iu;
|
|
136
|
+
/**
|
|
137
|
+
* A list of this page in other languages: every link names its language (hreflang) and opens a page, and every other
|
|
138
|
+
* item is only a label, the language being read ("English", "Español"). An item with a sentence, or a link to a file
|
|
139
|
+
* (a form in each language), makes it the document's.
|
|
140
|
+
*/
|
|
141
|
+
const isLanguageSwitch = (body) => {
|
|
142
|
+
const links = [...body.matchAll(ANY_LINK)].map((link) => link[0]);
|
|
143
|
+
const items = body.split(/<li\b[^>]*>/iu).slice(1);
|
|
144
|
+
return (links.length > 0 &&
|
|
145
|
+
links.every((link) => HREFLANG.test(link) && !isFileLink(link)) &&
|
|
146
|
+
items.every((item) => isNavigation(item) || !/<a\b/iu.test(item)) &&
|
|
147
|
+
!hasSentence(body));
|
|
148
|
+
};
|
|
149
|
+
/** From the inside out, so a nested table of contents goes too once its inner lists are gone. */
|
|
150
|
+
const withoutNavigation = (html) => untilStable(html, (text) => {
|
|
151
|
+
const title = pageTitle(text);
|
|
152
|
+
return text.replace(/<(ul|ol)\b[^>]*>((?:(?!<[uo]l\b)[\s\S])*?)<\/\1\s*>/giu, (whole, _tag, body, at) => isNavigation(body) || isWordlessList(body) || isLanguageSwitch(body) || isBreadcrumbList(body, at, title) ? " " : whole);
|
|
153
|
+
});
|
|
154
|
+
const DEFINITION = /<dd\b[^>]*>([\s\S]*?)(?:<\/dd\s*>|(?=<d[dt]\b)|$)/giu;
|
|
155
|
+
const isMenuDefinition = (definition) => isNavigation(definition) || isBreadcrumbTrail(definition);
|
|
156
|
+
/**
|
|
157
|
+
* A definition list whose every definition is only links or a breadcrumb trail: a menu with its label as the term
|
|
158
|
+
* ("文字サイズ: 標準 大", "現在位置: トップ > 教育 > この頁").
|
|
159
|
+
*/
|
|
160
|
+
const isLabelledMenu = (list) => [...list.matchAll(DEFINITION)].every((definition) => isMenuDefinition(definition[1] ?? ""));
|
|
161
|
+
const isDefinitionList = (range) => /^<dl\b/iu.test(range.openTag);
|
|
162
|
+
/** What a block holds besides its menus: its link-only lists taken out, or a labelled menu's terms. */
|
|
163
|
+
const besideMenus = (range) => isDefinitionList(range) && isLabelledMenu(range.inner) ? range.inner.replace(DEFINITION, " ") : withoutNavigation(range.inner);
|
|
164
|
+
const holdsMenu = (range) => besideMenus(range) !== range.inner || isLinksOnly(range);
|
|
165
|
+
/** Nothing but labels beside the menus: a sentence beside a menu makes the block the document's. */
|
|
166
|
+
const hasNoSentenceBesideMenus = (range) => !CLOSED_SENTENCE.test(plainText(besideMenus(range)));
|
|
167
|
+
const HEADER_BLOCKS = ["div", "section", "header", "dl"];
|
|
168
|
+
/**
|
|
169
|
+
* The innermost block that closes before the page's title opens and holds a menu (or only links), with no sentence beside it, is part
|
|
170
|
+
* of the site's header: it goes whole, with the tagline and labels beside the menu. Only the innermost, so that text
|
|
171
|
+
* sharing an outer block with a menu block (an agency and docket number) is kept; so is a block with a sentence in it.
|
|
172
|
+
*/
|
|
173
|
+
const withoutSiteHeader = (html) => {
|
|
174
|
+
const title = pageTitle(html);
|
|
175
|
+
if (title === undefined)
|
|
176
|
+
return html;
|
|
177
|
+
const menus = HEADER_BLOCKS.flatMap((tag) => elementRanges(html, tag)).filter((range) => range.end <= title.start && holdsMenu(range));
|
|
178
|
+
const innermost = menus.filter((range) => !menus.some((inner) => isInside(range, inner)));
|
|
179
|
+
return withoutRanges(html, innermost.filter(hasNoSentenceBesideMenus).toSorted((left, right) => left.start - right.start));
|
|
180
|
+
};
|
|
181
|
+
const ICON_MENU_BLOCKS = ["div", "section"];
|
|
182
|
+
const LIST = /<(ul|ol)\b[^>]*>(?:(?!<[uo]l\b)[\s\S])*?<\/\1\s*>/giu;
|
|
183
|
+
const wordlessLists = (html) => [...html.matchAll(LIST)].map((list) => list[0]).filter((list) => isWordlessList(list.replace(/^<[^>]*>/u, "")));
|
|
184
|
+
/** What a block holds beside its lists of icons. */
|
|
185
|
+
const besideIcons = (range) => wordlessLists(range.inner).reduce((text, list) => text.replace(list, " "), range.inner);
|
|
186
|
+
/**
|
|
187
|
+
* Beside its wordless lists, one line, no sentence and no heading: the label of a row of icons ("Share & print",
|
|
188
|
+
* "Follow us"). A heading beside share buttons is the page's title.
|
|
189
|
+
*/
|
|
190
|
+
const isIconMenu = (range) => {
|
|
191
|
+
const beside = besideIcons(range);
|
|
192
|
+
return textLines(beside).length === 1 && !hasSentence(beside) && !/<h[1-6]\b/iu.test(beside);
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* The innermost block holding a list of icons (share buttons, social links) and anything else goes whole when that is
|
|
196
|
+
* only a label; a wrapper around the list alone is passed over for the block that holds its label.
|
|
197
|
+
*/
|
|
198
|
+
const withoutIconMenus = (html) => {
|
|
199
|
+
const menus = ICON_MENU_BLOCKS.flatMap((tag) => elementRanges(html, tag)).filter((range) => wordlessLists(range.inner).length > 0 && textLines(besideIcons(range)).length > 0);
|
|
200
|
+
const innermost = menus.filter((range) => !menus.some((inner) => isInside(range, inner)));
|
|
201
|
+
return withoutRanges(html, innermost.filter(isIconMenu).toSorted((left, right) => left.start - right.start));
|
|
202
|
+
};
|
|
203
|
+
const IMAGE = /<img\b[^>]*>/giu;
|
|
204
|
+
const ALT = /\salt\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+))/iu;
|
|
205
|
+
const altText = (image) => {
|
|
206
|
+
const alt = ALT.exec(image);
|
|
207
|
+
return plainText(alt?.[1] ?? alt?.[2] ?? alt?.[3] ?? "");
|
|
208
|
+
};
|
|
209
|
+
/** The page's <title>, which names the page wherever it is shown (a tab, a bookmark, a search result). */
|
|
210
|
+
const documentTitle = (html) => plainText(/<title\b[^>]*>([\s\S]*?)<\/title\s*>/iu.exec(html)?.[1] ?? "");
|
|
211
|
+
/**
|
|
212
|
+
* A heading holding images and nothing else (a logo, a banner, a title set as a picture) carries the images' alt text
|
|
213
|
+
* only when that text is the page's title, which the reader sees drawn there; otherwise it goes whole, since the
|
|
214
|
+
* converter keeps no image's alt text anywhere else either.
|
|
215
|
+
*/
|
|
216
|
+
const withImageHeadingsRead = (html, title) => html.replace(/<h([1-6])\b([^>]*)>([\s\S]*?)<\/h\1\s*>/giu, (whole, level, attributes, inside) => {
|
|
217
|
+
const images = inside.match(IMAGE) ?? [];
|
|
218
|
+
if (images.length === 0 || plainText(inside) !== "")
|
|
219
|
+
return whole;
|
|
220
|
+
const alt = images.map(altText).join(" ").trim();
|
|
221
|
+
return alt !== "" && alt === title ? `<h${level}${attributes}>${asMarkup(alt)}</h${level}>` : " ";
|
|
222
|
+
});
|
|
223
|
+
// An in-page link is wrapped in these marks so that one standing alone on its line ("Jump to main text") can be told
|
|
224
|
+
// from one inside a sentence ("see Table 1"); the first is dropped, the second keeps its text.
|
|
225
|
+
const LINK_START = "\u0001";
|
|
226
|
+
const LINK_END = "\u0002";
|
|
227
|
+
const markChromeLinks = (html) => html.replace(ANY_LINK, (link) => (isChromeLink(link) ? `${LINK_START}${stripTags(link)}${LINK_END}` : link));
|
|
228
|
+
const MARKED_LINK = new RegExp(`${LINK_START}[^${LINK_END}]*${LINK_END}`, "gu");
|
|
229
|
+
/**
|
|
230
|
+
* A line of in-page or paging links and at most a mark such as "▲" or "|" between them. Never a heading: a heading
|
|
231
|
+
* wrapped in a link back to the table of contents is still the section's title.
|
|
232
|
+
*/
|
|
233
|
+
const isChromeLinkLine = (line) => headingLevel(line) === 0 && line.includes(LINK_START) && hasNoWords(line.replace(MARKED_LINK, ""));
|
|
234
|
+
// Without a year only the sign marks a notice: "(c)" alone opens an enumerated paragraph, "Copyright" alone a sentence.
|
|
235
|
+
const COPYRIGHT_NOTICE = /^(?:(?:copyright\s*)?(?:©|\(c\)|copyright)\s*\d{4}\b|copyright\s*(?:©|\(c\))|©)/iu;
|
|
236
|
+
/** A copyright notice at the very end of the page, where a site puts it when it has no <footer>. */
|
|
237
|
+
const withoutClosingCopyright = (lines) => {
|
|
238
|
+
const last = lines.findLastIndex((line) => line !== "");
|
|
239
|
+
return last >= 0 && COPYRIGHT_NOTICE.test(lines[last] ?? "") ? withoutClosingCopyright(lines.slice(0, last)) : [...lines];
|
|
240
|
+
};
|
|
241
|
+
const headingLevel = (line) => /^#{1,6} /u.exec(line)?.[0].length ?? 0;
|
|
242
|
+
/** A rule drawn with characters ("_____", "-----"), which Markdown reads as a thematic break: a line, not text. */
|
|
243
|
+
const isDrawnRule = (line) => /^(?:([-_*=])\s*)(?:\1\s*){2,}$/u.test(line);
|
|
244
|
+
/**
|
|
245
|
+
* Headings with nothing under them before the next heading of the same or a higher level: what dropped navigation left.
|
|
246
|
+
* A drawn rule under a heading is not something under it.
|
|
247
|
+
*/
|
|
248
|
+
const withoutEmptySections = (lines) => lines.reduceRight((state, line) => {
|
|
249
|
+
if (line === "" || isDrawnRule(line))
|
|
250
|
+
return { kept: [line, ...state.kept], nextLevel: state.nextLevel };
|
|
251
|
+
const level = headingLevel(line) - 1;
|
|
252
|
+
if (level < 0)
|
|
253
|
+
return { kept: [line, ...state.kept], nextLevel: Number.POSITIVE_INFINITY };
|
|
254
|
+
if (state.nextLevel <= level)
|
|
255
|
+
return state;
|
|
256
|
+
return { kept: [line, ...state.kept], nextLevel: level };
|
|
257
|
+
}, { kept: [], nextLevel: 0 }).kept;
|
|
258
|
+
const BLOCK_TAGS = new Set([
|
|
259
|
+
"p",
|
|
260
|
+
"div",
|
|
261
|
+
"ul",
|
|
262
|
+
"ol",
|
|
263
|
+
"hr",
|
|
264
|
+
"blockquote",
|
|
265
|
+
"section",
|
|
266
|
+
"article",
|
|
267
|
+
"header",
|
|
268
|
+
"footer",
|
|
269
|
+
"main",
|
|
270
|
+
"aside",
|
|
271
|
+
"dl",
|
|
272
|
+
"dt",
|
|
273
|
+
"dd",
|
|
274
|
+
"figure",
|
|
275
|
+
"figcaption",
|
|
276
|
+
"pre",
|
|
277
|
+
"body",
|
|
278
|
+
"html",
|
|
279
|
+
]);
|
|
280
|
+
const heading = (_whole, level, inside) => `\n\n${"#".repeat(Number(level))} ${stripTags(inside).trim()}\n\n`;
|
|
281
|
+
const asLines = (html) => html
|
|
282
|
+
.replace(/<h([1-6])\b[^>]*>([\s\S]*?)<\/h\1\s*>/giu, heading)
|
|
283
|
+
.replace(/<li\b[^>]*>/giu, "\n- ")
|
|
284
|
+
.replace(/<\/li\s*>/giu, "")
|
|
285
|
+
.replace(/<br\s*\/?>/giu, "\n")
|
|
286
|
+
.replace(/<\/?([a-z][a-z0-9]*)\b[^>]*>/giu, (whole, tag) => (BLOCK_TAGS.has(tag.toLowerCase()) ? "\n\n" : whole));
|
|
287
|
+
const textLines = (html) => decodeEntities(stripTags(asLines(html)))
|
|
288
|
+
.split("\n")
|
|
289
|
+
.map((line) => line.trim())
|
|
290
|
+
.filter((line) => line !== "");
|
|
291
|
+
const ADDRESS = /<address\b[^>]*>[\s\S]*?<\/address\s*>/giu;
|
|
292
|
+
const isOnlyNotices = (html) => {
|
|
293
|
+
const lines = textLines(html);
|
|
294
|
+
return lines.length > 0 && lines.every((line) => COPYRIGHT_NOTICE.test(line));
|
|
295
|
+
};
|
|
296
|
+
const ADDRESS_BLOCKS = ["div", "section"];
|
|
297
|
+
/** What the innermost block around the address holds besides it, when it holds anything else. */
|
|
298
|
+
const besideAddress = (html, address) => {
|
|
299
|
+
const end = address.index + address[0].length;
|
|
300
|
+
const around = ADDRESS_BLOCKS.flatMap((tag) => elementRanges(html, tag))
|
|
301
|
+
.filter((range) => range.start < address.index && end <= range.end)
|
|
302
|
+
.toSorted((left, right) => right.start - left.start)
|
|
303
|
+
.map((range) => range.inner.replace(address[0], " "));
|
|
304
|
+
return around.find((beside) => textLines(beside).length > 0);
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* An <address> that shares its block with nothing but copyright notices, and has nothing but them after it, closes
|
|
308
|
+
* the page: the site's own contact line, in a footer written without <footer>. An address beside any other text (a
|
|
309
|
+
* label such as "Send comments to:"), with anything else after it, or with nothing after it, is kept.
|
|
310
|
+
*/
|
|
311
|
+
const withoutClosingAddress = (html) => {
|
|
312
|
+
const last = [...html.matchAll(ADDRESS)].at(-1);
|
|
313
|
+
if (last === undefined)
|
|
314
|
+
return html;
|
|
315
|
+
const end = last.index + last[0].length;
|
|
316
|
+
const beside = besideAddress(html, last);
|
|
317
|
+
const isFooter = beside !== undefined && isOnlyNotices(beside) && isOnlyNotices(html.slice(end));
|
|
318
|
+
return isFooter ? `${html.slice(0, last.index)} ${html.slice(end)}` : html;
|
|
319
|
+
};
|
|
320
|
+
const CLOSING_BLOCKS = ["div", "section", "p"];
|
|
321
|
+
const isClosingMenu = (text, range) => isLinksOnly(range) && !plainLinks(range.inner).some(isFileLink) && textLines(text.slice(range.end)).length === 0;
|
|
322
|
+
/** Blocks of links to pages with nothing after them ("一覧に戻る"): a way around the site, as a menu is above the title. */
|
|
323
|
+
const withoutClosingLinks = (html) => untilStable(html, (text) => {
|
|
324
|
+
const closing = CLOSING_BLOCKS.flatMap((tag) => elementRanges(text, tag)).filter((range) => isClosingMenu(text, range));
|
|
325
|
+
return withoutRanges(text, closing.toSorted((left, right) => left.start - right.start));
|
|
326
|
+
});
|
|
327
|
+
// Markup's own spacing, collapsed as HTML does; U+3000 is a character Japanese text writes (a clause number and its text), so it stays.
|
|
328
|
+
const MARKUP_SPACE = /[^\S\u3000]+/gu;
|
|
329
|
+
// A zero-width space or joiner draws nothing, so a line of nothing else is empty (a page-number anchor).
|
|
330
|
+
const INVISIBLE_ONLY = /^[\s\p{Cf}]*$/u;
|
|
331
|
+
// An <h2> with no text in it (a spacer, an emptied widget) becomes "##": a heading with nothing to read.
|
|
332
|
+
const UNTITLED_HEADING = /^#{1,6}$/u;
|
|
333
|
+
export const htmlToMarkdown = (html) => {
|
|
334
|
+
const uncommented = withLostParagraphTagsRestored(withAttributeMarkupEscaped(html).replace(/<!--[\s\S]*?-->|<\?[\s\S]*?\?>/gu, ""));
|
|
335
|
+
const preformatted = withPreformattedStashed(withTablesRead(DROPPED.reduce(withoutElement, withoutRubyText(uncommented))));
|
|
336
|
+
const kept = withoutFootnoteMarks(withoutHeadingSelfLinks(withoutWidgets(withoutButtons(withoutReaderOnlyText(withoutHiddenElements(mainContent(preformatted.html))))))).replace(MARKUP_SPACE, " ");
|
|
337
|
+
const content = withoutClosingLinks(withoutLinkGroups(withoutNavigation(withoutIconMenus(withoutSiteHeader(withoutNavigationLandmarks(withoutClosingAddress(kept)))))));
|
|
338
|
+
const text = decodeEntities(stripTags(asLines(markChromeLinks(withImageHeadingsRead(withRunInHeadingsRead(content), documentTitle(uncommented))))));
|
|
339
|
+
const lines = text
|
|
340
|
+
.split("\n")
|
|
341
|
+
.map((line) => (INVISIBLE_ONLY.test(line) ? "" : line.trim()))
|
|
342
|
+
.filter((line) => line !== "-" && !isChromeLinkLine(line))
|
|
343
|
+
.map((line) => line.replaceAll(LINK_START, "").replaceAll(LINK_END, ""))
|
|
344
|
+
.filter((line) => !UNTITLED_HEADING.test(line));
|
|
345
|
+
return tidyLines(withPreformattedRestored(withoutEmptySections(withoutClosingCopyright(withoutEmptySections(lines))), preformatted.blocks));
|
|
346
|
+
};
|
|
347
|
+
//# sourceMappingURL=html-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-markdown.js","sourceRoot":"","sources":["../../src/html/html-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type Preformatted = {
|
|
2
|
+
readonly isCode: boolean;
|
|
3
|
+
readonly lines: readonly string[];
|
|
4
|
+
};
|
|
5
|
+
export type StashedPage = {
|
|
6
|
+
readonly html: string;
|
|
7
|
+
readonly blocks: readonly Preformatted[];
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Every <pre> replaced by a placeholder holding its text on one line, as the page read before, so that what decides
|
|
11
|
+
* about the blocks around it (a menu, a sentence, a heading's content) sees the same words.
|
|
12
|
+
*/
|
|
13
|
+
export declare const withPreformattedStashed: (html: string) => StashedPage;
|
|
14
|
+
/** Each line that is a placeholder as its block; a placeholder inside a longer line (a heading) as its text on that line. */
|
|
15
|
+
export declare const withPreformattedRestored: (lines: readonly string[], blocks: readonly Preformatted[]) => string[];
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=html-preformatted.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-preformatted.d.ts","sourceRoot":"","sources":["../../src/html/html-preformatted.ts"],"names":[],"mappings":"AAOA,KAAK,YAAY,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,CAAC;AAuD9F;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,MAAM,MAAM,KAAG,WAYtD,CAAC;AAqBF,6HAA6H;AAC7H,eAAO,MAAM,wBAAwB,GAAI,OAAO,SAAS,MAAM,EAAE,EAAE,QAAQ,SAAS,YAAY,EAAE,KAAG,MAAM,EAOnG,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// A <pre> block of an HTML page, which the converter otherwise reads as one run of prose: code (a <pre> holding one
|
|
2
|
+
// <code>, or one whose markup declares a language) becomes a fenced code block, and any other preformatted text (a
|
|
3
|
+
// poem, an address, a plain-text notice) keeps its lines, each one a paragraph. Each block is set aside before the
|
|
4
|
+
// page's whitespace is collapsed and put back once the page is lines. Pure.
|
|
5
|
+
import { asMarkup, plainText, stripTags } from "./html-elements.js";
|
|
6
|
+
import { decodeEntities } from "./markup-text.js";
|
|
7
|
+
const PLACE_START = "\u0005";
|
|
8
|
+
const PLACE_TEXT = "\u0006";
|
|
9
|
+
const PRE = /<pre\b([^>]*)>([\s\S]*?)<\/pre\s*>/giu;
|
|
10
|
+
const WRAPPER = /^<[a-z][a-z0-9-]*\b[^>]*>\s*$/iu;
|
|
11
|
+
// A highlighter names the language on the <pre> or on a wrapper or two around it (Sphinx: two <div>s); the bound
|
|
12
|
+
// keeps a long run of opening tags from being walked back for every <pre>.
|
|
13
|
+
const MAX_WRAPPERS = 4;
|
|
14
|
+
/** The opening tags right before end, with nothing but whitespace between them: the elements wrapping a <pre>. */
|
|
15
|
+
const wrappersBefore = (html, end, depth) => {
|
|
16
|
+
const open = html.lastIndexOf("<", end - 1);
|
|
17
|
+
if (depth === 0 || open < 0 || !WRAPPER.test(html.slice(open, end)))
|
|
18
|
+
return "";
|
|
19
|
+
return `${wrappersBefore(html, open, depth - 1)}${html.slice(open, end)}`;
|
|
20
|
+
};
|
|
21
|
+
const SOLE_CODE = /^\s*<code\b[^>]*>[\s\S]*<\/code\s*>\s*$/iu;
|
|
22
|
+
const CLASS = /\sclass\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+))/iu;
|
|
23
|
+
const LANGUAGE_CLASS = /^(?:language|lang|highlight)-(.+)$/iu;
|
|
24
|
+
// The names highlighters give a block they leave unhighlighted: plain text, not code.
|
|
25
|
+
const PLAIN_LANGUAGES = new Set(["text", "txt", "plain", "plaintext", "none", "nohighlight"]);
|
|
26
|
+
const classTokens = (openTag) => {
|
|
27
|
+
const match = CLASS.exec(openTag);
|
|
28
|
+
return (match?.[1] ?? match?.[2] ?? match?.[3] ?? "").split(/\s+/u);
|
|
29
|
+
};
|
|
30
|
+
const declaresLanguage = (openTags) => openTags.split(">").some((tag) => classTokens(tag).some((token) => {
|
|
31
|
+
const language = LANGUAGE_CLASS.exec(token)?.[1];
|
|
32
|
+
return language !== undefined && !PLAIN_LANGUAGES.has(language.toLowerCase());
|
|
33
|
+
}));
|
|
34
|
+
const isSoleCode = (inner) => SOLE_CODE.test(inner) && (inner.match(/<code\b/giu) ?? []).length === 1;
|
|
35
|
+
/** The block's text as its lines, with the blank lines around them dropped. */
|
|
36
|
+
const textLinesOf = (inner) => {
|
|
37
|
+
const lines = decodeEntities(stripTags(inner.replace(/<br\s*\/?>/giu, "\n")))
|
|
38
|
+
.split(/\r?\n/u)
|
|
39
|
+
.map((line) => line.trimEnd());
|
|
40
|
+
const first = lines.findIndex((line) => line !== "");
|
|
41
|
+
return first === -1 ? [] : lines.slice(first, lines.findLastIndex((line) => line !== "") + 1);
|
|
42
|
+
};
|
|
43
|
+
const placeholder = (index, inner) => `${PLACE_START}${String(index)}${PLACE_TEXT}${asMarkup(plainText(inner))}${PLACE_START}`;
|
|
44
|
+
/**
|
|
45
|
+
* Every <pre> replaced by a placeholder holding its text on one line, as the page read before, so that what decides
|
|
46
|
+
* about the blocks around it (a menu, a sentence, a heading's content) sees the same words.
|
|
47
|
+
*/
|
|
48
|
+
export const withPreformattedStashed = (html) => {
|
|
49
|
+
const found = [...html.matchAll(PRE)];
|
|
50
|
+
const blocks = found.map((match) => {
|
|
51
|
+
const [, attributes = "", inner = ""] = match;
|
|
52
|
+
return { isCode: isSoleCode(inner) || declaresLanguage(`${wrappersBefore(html, match.index, MAX_WRAPPERS)}<pre${attributes}>`), lines: textLinesOf(inner) };
|
|
53
|
+
});
|
|
54
|
+
const indexAt = new Map(found.map((match, index) => [match.index, index]));
|
|
55
|
+
const stashed = html.replace(PRE, (_whole, attributes, inner, at) => `<pre${attributes}>${placeholder(indexAt.get(at) ?? -1, inner)}</pre>`);
|
|
56
|
+
return { html: stashed, blocks };
|
|
57
|
+
};
|
|
58
|
+
const MIN_FENCE = 3;
|
|
59
|
+
/** A fence longer than any run of backticks in the code, so that none of them closes it. */
|
|
60
|
+
const fenceFor = (lines) => {
|
|
61
|
+
const longest = lines.reduce((most, line) => (line.match(/`+/gu) ?? []).reduce((inLine, run) => Math.max(inLine, run.length), most), 0);
|
|
62
|
+
return "`".repeat(Math.max(MIN_FENCE, longest + 1));
|
|
63
|
+
};
|
|
64
|
+
const rendered = (block) => {
|
|
65
|
+
if (block.lines.length === 0)
|
|
66
|
+
return [];
|
|
67
|
+
if (!block.isCode)
|
|
68
|
+
return [...block.lines.map((line) => line.trim()).flatMap((line) => (line === "" ? [] : ["", line])), ""];
|
|
69
|
+
const fence = fenceFor(block.lines);
|
|
70
|
+
return ["", fence, ...block.lines, fence, ""];
|
|
71
|
+
};
|
|
72
|
+
const PLACEHOLDER = new RegExp(`${PLACE_START}(\\d+)${PLACE_TEXT}([^${PLACE_START}]*)${PLACE_START}`, "gu");
|
|
73
|
+
const WHOLE_PLACEHOLDER = new RegExp(`^${PLACEHOLDER.source}$`, "u");
|
|
74
|
+
/** Each line that is a placeholder as its block; a placeholder inside a longer line (a heading) as its text on that line. */
|
|
75
|
+
export const withPreformattedRestored = (lines, blocks) => blocks.length === 0
|
|
76
|
+
? [...lines]
|
|
77
|
+
: lines.flatMap((line) => {
|
|
78
|
+
const whole = WHOLE_PLACEHOLDER.exec(line);
|
|
79
|
+
const block = whole === null ? undefined : blocks[Number(whole[1])];
|
|
80
|
+
return block === undefined ? [line.replace(PLACEHOLDER, (_placeholder, _index, text) => text)] : rendered(block);
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=html-preformatted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-preformatted.js","sourceRoot":"","sources":["../../src/html/html-preformatted.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text the page writes for a screen reader and does not show. A focus target counts only standing alone outside a
|
|
3
|
+
* heading: inside a heading it is the heading's title, inside a sentence a word of it.
|
|
4
|
+
*/
|
|
5
|
+
export declare const withoutReaderOnlyText: (html: string) => string;
|
|
6
|
+
//# sourceMappingURL=html-reader-only.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-reader-only.d.ts","sourceRoot":"","sources":["../../src/html/html-reader-only.ts"],"names":[],"mappings":"AAuEA;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,MAMpD,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Text a page writes for a screen reader alone, which a sighted reader never sees: an element whose class follows a
|
|
2
|
+
// visually-hidden convention, and the anchor a skip link moves focus to. Pure; a regular-expression reading.
|
|
3
|
+
import { ATTRIBUTES, HEADING_TAGS, headingRanges, isInside, plainText, withoutElementsOpening, withoutElementsWhere, } from "./html-elements.js";
|
|
4
|
+
// The class names that frameworks and style guides give text written for a screen reader alone (sr-only,
|
|
5
|
+
// visually-hidden, govuk-visually-hidden, screen-reader-text), never negated (not-sr-only shows it); "hidden" only as
|
|
6
|
+
// a whole name (not hidden-xs).
|
|
7
|
+
const READER_ONLY_CLASS = /^(?:(?!not-)[a-z0-9]+-)*(?:sr-only|visually-?hidden|screen-reader-text|element-invisible)$/iu;
|
|
8
|
+
const CLASS_OPENING = /<([a-z][a-z0-9-]*)\b[^>]*\sclass\s*=/giu;
|
|
9
|
+
const CLASS_VALUE = new RegExp(String.raw `^<[a-z][a-z0-9-]*${ATTRIBUTES}\s+class\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+))`, "iu");
|
|
10
|
+
/** A variant (md:block, md:not-sr-only) shows the element on some screens or states, so it is not hidden from sight. */
|
|
11
|
+
const isReaderOnlyClass = (range) => {
|
|
12
|
+
const value = CLASS_VALUE.exec(range.openTag);
|
|
13
|
+
const names = (value?.[1] ?? value?.[2] ?? value?.[3] ?? "").split(/\s+/u);
|
|
14
|
+
if (names.some((name) => name.includes(":")))
|
|
15
|
+
return false;
|
|
16
|
+
return names.some((name) => READER_ONLY_CLASS.test(name)) || names.includes("hidden");
|
|
17
|
+
};
|
|
18
|
+
/** An anchor with no href that only a script can focus: where a skip link moves the reader ("ここから本文です。"). */
|
|
19
|
+
const isFocusTarget = (range) => !/\shref\s*=/iu.test(range.openTag) && /\stabindex\s*=\s*(?:"\s*-1\s*"|'\s*-1\s*'|-1(?=[\s/>]))/iu.test(range.openTag);
|
|
20
|
+
const LINE_TAGS = [
|
|
21
|
+
"p",
|
|
22
|
+
"div",
|
|
23
|
+
"li",
|
|
24
|
+
"dt",
|
|
25
|
+
"dd",
|
|
26
|
+
"td",
|
|
27
|
+
"th",
|
|
28
|
+
...HEADING_TAGS,
|
|
29
|
+
"section",
|
|
30
|
+
"article",
|
|
31
|
+
"header",
|
|
32
|
+
"footer",
|
|
33
|
+
"main",
|
|
34
|
+
"body",
|
|
35
|
+
"blockquote",
|
|
36
|
+
"ul",
|
|
37
|
+
"ol",
|
|
38
|
+
"dl",
|
|
39
|
+
"table",
|
|
40
|
+
"tr",
|
|
41
|
+
];
|
|
42
|
+
const LINE_BOUNDARY = new RegExp(String.raw `<\/?(?:${LINE_TAGS.join("|")})\b[^<>]*>|<br\b[^<>]*>`, "giu");
|
|
43
|
+
/** Text between the anchor and the block's edge on each side: what shares a line with it. */
|
|
44
|
+
const lineAround = (html, range) => {
|
|
45
|
+
const before = html.slice(0, range.start);
|
|
46
|
+
const lineStart = [...before.matchAll(LINE_BOUNDARY)].at(-1);
|
|
47
|
+
const after = html.slice(range.end);
|
|
48
|
+
const lineEnd = new RegExp(LINE_BOUNDARY.source, "iu").exec(after)?.index ?? after.length;
|
|
49
|
+
return [lineStart === undefined ? before : before.slice(lineStart.index + lineStart[0].length), after.slice(0, lineEnd)];
|
|
50
|
+
};
|
|
51
|
+
/** No other text on its line: the anchor is a block of its own, not a word in a sentence. */
|
|
52
|
+
const standsAlone = (html, range) => lineAround(html, range).every((beside) => plainText(beside) === "");
|
|
53
|
+
/**
|
|
54
|
+
* Text the page writes for a screen reader and does not show. A focus target counts only standing alone outside a
|
|
55
|
+
* heading: inside a heading it is the heading's title, inside a sentence a word of it.
|
|
56
|
+
*/
|
|
57
|
+
export const withoutReaderOnlyText = (html) => {
|
|
58
|
+
const shown = withoutElementsOpening(html, CLASS_OPENING, isReaderOnlyClass);
|
|
59
|
+
const headings = headingRanges(shown);
|
|
60
|
+
const isReaderTarget = (anchor) => isFocusTarget(anchor) && standsAlone(shown, anchor) && !headings.some((heading) => isInside(heading, anchor));
|
|
61
|
+
return withoutElementsWhere(shown, "a", isReaderTarget);
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=html-reader-only.js.map
|