chaffjs 0.29.0 → 0.31.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/announced-count.d.ts +2 -0
- package/dist/announced-count.d.ts.map +1 -1
- package/dist/announced-count.js +4 -3
- package/dist/announced-count.js.map +1 -1
- package/dist/contacts/addresses.d.ts +21 -0
- package/dist/contacts/addresses.d.ts.map +1 -0
- package/dist/contacts/addresses.js +144 -0
- package/dist/contacts/addresses.js.map +1 -0
- package/dist/contacts/emails.d.ts +11 -0
- package/dist/contacts/emails.d.ts.map +1 -0
- package/dist/contacts/emails.js +51 -0
- package/dist/contacts/emails.js.map +1 -0
- package/dist/contacts/variants.d.ts +14 -0
- package/dist/contacts/variants.d.ts.map +1 -0
- package/dist/contacts/variants.js +25 -0
- package/dist/contacts/variants.js.map +1 -0
- package/dist/derived/battery-runtime.d.ts +85 -0
- package/dist/derived/battery-runtime.d.ts.map +1 -0
- package/dist/derived/battery-runtime.js +217 -0
- package/dist/derived/battery-runtime.js.map +1 -0
- package/dist/derived/period-counts.d.ts +48 -0
- package/dist/derived/period-counts.d.ts.map +1 -0
- package/dist/derived/period-counts.js +128 -0
- package/dist/derived/period-counts.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/time-lengths.d.ts +37 -0
- package/dist/derived/time-lengths.d.ts.map +1 -0
- package/dist/derived/time-lengths.js +171 -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/use-interval.d.ts +33 -0
- package/dist/derived/use-interval.d.ts.map +1 -0
- package/dist/derived/use-interval.js +93 -0
- package/dist/derived/use-interval.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-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/announced-count.d.ts.map +1 -1
- package/dist/detectors/announced-count.js +1 -0
- package/dist/detectors/announced-count.js.map +1 -1
- package/dist/detectors/capacity-runtime.d.ts +7 -0
- package/dist/detectors/capacity-runtime.d.ts.map +1 -0
- package/dist/detectors/capacity-runtime.js +98 -0
- package/dist/detectors/capacity-runtime.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/contact-variant.d.ts +3 -0
- package/dist/detectors/contact-variant.d.ts.map +1 -0
- package/dist/detectors/contact-variant.js +21 -0
- package/dist/detectors/contact-variant.js.map +1 -0
- package/dist/detectors/count-over-capacity.d.ts +4 -0
- package/dist/detectors/count-over-capacity.d.ts.map +1 -0
- package/dist/detectors/count-over-capacity.js +26 -0
- package/dist/detectors/count-over-capacity.js.map +1 -0
- package/dist/detectors/date-outside-period.d.ts.map +1 -1
- package/dist/detectors/date-outside-period.js +5 -1
- package/dist/detectors/date-outside-period.js.map +1 -1
- package/dist/detectors/date-stamp-order.d.ts +3 -0
- package/dist/detectors/date-stamp-order.d.ts.map +1 -0
- package/dist/detectors/date-stamp-order.js +24 -0
- package/dist/detectors/date-stamp-order.js.map +1 -0
- package/dist/detectors/defined-term-form.d.ts.map +1 -1
- package/dist/detectors/defined-term-form.js +57 -7
- package/dist/detectors/defined-term-form.js.map +1 -1
- package/dist/detectors/definition-use.d.ts +1 -1
- package/dist/detectors/definition-use.d.ts.map +1 -1
- package/dist/detectors/definition-use.js +4 -2
- package/dist/detectors/definition-use.js.map +1 -1
- package/dist/detectors/derived-numbers.d.ts +11 -1
- package/dist/detectors/derived-numbers.d.ts.map +1 -1
- package/dist/detectors/derived-numbers.js +74 -20
- package/dist/detectors/derived-numbers.js.map +1 -1
- package/dist/detectors/due-date.d.ts.map +1 -1
- package/dist/detectors/due-date.js +6 -0
- package/dist/detectors/due-date.js.map +1 -1
- package/dist/detectors/en-shape.d.ts.map +1 -1
- package/dist/detectors/en-shape.js +7 -4
- package/dist/detectors/en-shape.js.map +1 -1
- package/dist/detectors/event-deadline.d.ts +3 -0
- package/dist/detectors/event-deadline.d.ts.map +1 -0
- package/dist/detectors/event-deadline.js +24 -0
- package/dist/detectors/event-deadline.js.map +1 -0
- package/dist/detectors/fact-consistency.d.ts +1 -1
- package/dist/detectors/fact-consistency.d.ts.map +1 -1
- package/dist/detectors/fact-consistency.js +52 -3
- package/dist/detectors/fact-consistency.js.map +1 -1
- package/dist/detectors/heading-case.d.ts +5 -2
- package/dist/detectors/heading-case.d.ts.map +1 -1
- package/dist/detectors/heading-case.js +12 -4
- package/dist/detectors/heading-case.js.map +1 -1
- package/dist/detectors/heading-echo.d.ts +5 -0
- package/dist/detectors/heading-echo.d.ts.map +1 -1
- package/dist/detectors/heading-echo.js +14 -1
- package/dist/detectors/heading-echo.js.map +1 -1
- package/dist/detectors/layout-code.d.ts +5 -0
- package/dist/detectors/layout-code.d.ts.map +1 -0
- package/dist/detectors/layout-code.js +124 -0
- package/dist/detectors/layout-code.js.map +1 -0
- package/dist/detectors/measured-facts.d.ts +8 -0
- package/dist/detectors/measured-facts.d.ts.map +1 -0
- package/dist/detectors/measured-facts.js +18 -0
- package/dist/detectors/measured-facts.js.map +1 -0
- package/dist/detectors/name-variant-model-codes.d.ts +11 -0
- package/dist/detectors/name-variant-model-codes.d.ts.map +1 -0
- package/dist/detectors/name-variant-model-codes.js +21 -0
- package/dist/detectors/name-variant-model-codes.js.map +1 -0
- package/dist/detectors/name-variant.d.ts.map +1 -1
- package/dist/detectors/name-variant.js +78 -10
- package/dist/detectors/name-variant.js.map +1 -1
- package/dist/detectors/orthographic-variant.d.ts.map +1 -1
- package/dist/detectors/orthographic-variant.js +62 -7
- package/dist/detectors/orthographic-variant.js.map +1 -1
- package/dist/detectors/orthography.d.ts.map +1 -1
- package/dist/detectors/orthography.js +12 -6
- package/dist/detectors/orthography.js.map +1 -1
- 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/quantity-range.d.ts +3 -0
- package/dist/detectors/quantity-range.d.ts.map +1 -0
- package/dist/detectors/quantity-range.js +35 -0
- package/dist/detectors/quantity-range.js.map +1 -0
- package/dist/detectors/range-band.d.ts +5 -0
- package/dist/detectors/range-band.d.ts.map +1 -0
- package/dist/detectors/range-band.js +80 -0
- package/dist/detectors/range-band.js.map +1 -0
- package/dist/detectors/registry/capacity-runtime-mismatch.d.ts +3 -0
- package/dist/detectors/registry/capacity-runtime-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/capacity-runtime-mismatch.js +3 -0
- package/dist/detectors/registry/capacity-runtime-mismatch.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/contact-variant.d.ts +3 -0
- package/dist/detectors/registry/contact-variant.d.ts.map +1 -0
- package/dist/detectors/registry/contact-variant.js +3 -0
- package/dist/detectors/registry/contact-variant.js.map +1 -0
- package/dist/detectors/registry/count-over-capacity.d.ts +3 -0
- package/dist/detectors/registry/count-over-capacity.d.ts.map +1 -0
- package/dist/detectors/registry/count-over-capacity.js +3 -0
- package/dist/detectors/registry/count-over-capacity.js.map +1 -0
- package/dist/detectors/registry/date-stamp-order.d.ts +3 -0
- package/dist/detectors/registry/date-stamp-order.d.ts.map +1 -0
- package/dist/detectors/registry/date-stamp-order.js +3 -0
- package/dist/detectors/registry/date-stamp-order.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/event-deadline.d.ts +3 -0
- package/dist/detectors/registry/event-deadline.d.ts.map +1 -0
- package/dist/detectors/registry/event-deadline.js +3 -0
- package/dist/detectors/registry/event-deadline.js.map +1 -0
- package/dist/detectors/registry/interval-count-mismatch.d.ts +3 -0
- package/dist/detectors/registry/interval-count-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/interval-count-mismatch.js +3 -0
- package/dist/detectors/registry/interval-count-mismatch.js.map +1 -0
- package/dist/detectors/registry/layout-code-mismatch.d.ts +3 -0
- package/dist/detectors/registry/layout-code-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/layout-code-mismatch.js +3 -0
- package/dist/detectors/registry/layout-code-mismatch.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/quantity-range.d.ts +3 -0
- package/dist/detectors/registry/quantity-range.d.ts.map +1 -0
- package/dist/detectors/registry/quantity-range.js +3 -0
- package/dist/detectors/registry/quantity-range.js.map +1 -0
- package/dist/detectors/registry/range-band-mismatch.d.ts +3 -0
- package/dist/detectors/registry/range-band-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/range-band-mismatch.js +3 -0
- package/dist/detectors/registry/range-band-mismatch.js.map +1 -0
- package/dist/detectors/registry/rent-multiple-mismatch.d.ts +3 -0
- package/dist/detectors/registry/rent-multiple-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/rent-multiple-mismatch.js +3 -0
- package/dist/detectors/registry/rent-multiple-mismatch.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/scaled-quantity-mismatch.d.ts +3 -0
- package/dist/detectors/registry/scaled-quantity-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/scaled-quantity-mismatch.js +3 -0
- package/dist/detectors/registry/scaled-quantity-mismatch.js.map +1 -0
- package/dist/detectors/registry/step-time-sum-mismatch.d.ts +3 -0
- package/dist/detectors/registry/step-time-sum-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/step-time-sum-mismatch.js +3 -0
- package/dist/detectors/registry/step-time-sum-mismatch.js.map +1 -0
- package/dist/detectors/registry/time-range-reversed.d.ts +3 -0
- package/dist/detectors/registry/time-range-reversed.d.ts.map +1 -0
- package/dist/detectors/registry/time-range-reversed.js +3 -0
- package/dist/detectors/registry/time-range-reversed.js.map +1 -0
- package/dist/detectors/registry/unlisted-item-used.d.ts +3 -0
- package/dist/detectors/registry/unlisted-item-used.d.ts.map +1 -0
- package/dist/detectors/registry/unlisted-item-used.js +3 -0
- package/dist/detectors/registry/unlisted-item-used.js.map +1 -0
- package/dist/detectors/registry/walk-time-distance-mismatch.d.ts +3 -0
- package/dist/detectors/registry/walk-time-distance-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/walk-time-distance-mismatch.js +3 -0
- package/dist/detectors/registry/walk-time-distance-mismatch.js.map +1 -0
- package/dist/detectors/rent-multiple-mismatch.d.ts +3 -0
- package/dist/detectors/rent-multiple-mismatch.d.ts.map +1 -0
- package/dist/detectors/rent-multiple-mismatch.js +39 -0
- package/dist/detectors/rent-multiple-mismatch.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/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/scaled-quantity.d.ts +3 -0
- package/dist/detectors/scaled-quantity.d.ts.map +1 -0
- package/dist/detectors/scaled-quantity.js +37 -0
- package/dist/detectors/scaled-quantity.js.map +1 -0
- package/dist/detectors/signals.d.ts.map +1 -1
- package/dist/detectors/signals.js +3 -1
- package/dist/detectors/signals.js.map +1 -1
- package/dist/detectors/step-time-sum.d.ts +3 -0
- package/dist/detectors/step-time-sum.d.ts.map +1 -0
- package/dist/detectors/step-time-sum.js +46 -0
- package/dist/detectors/step-time-sum.js.map +1 -0
- package/dist/detectors/structure-tree.d.ts +2 -0
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +31 -6
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/structure.js +1 -1
- package/dist/detectors/structure.js.map +1 -1
- package/dist/detectors/technical-docs.d.ts +5 -0
- package/dist/detectors/technical-docs.d.ts.map +1 -1
- package/dist/detectors/technical-docs.js +12 -0
- package/dist/detectors/technical-docs.js.map +1 -1
- package/dist/detectors/time-order.d.ts +2 -0
- package/dist/detectors/time-order.d.ts.map +1 -1
- package/dist/detectors/time-order.js +33 -5
- package/dist/detectors/time-order.js.map +1 -1
- package/dist/detectors/undefined-term.d.ts.map +1 -1
- package/dist/detectors/undefined-term.js +19 -3
- package/dist/detectors/undefined-term.js.map +1 -1
- package/dist/detectors/unit-consistency.d.ts +1 -1
- package/dist/detectors/unit-consistency.d.ts.map +1 -1
- package/dist/detectors/unit-consistency.js +46 -38
- package/dist/detectors/unit-consistency.js.map +1 -1
- package/dist/detectors/unlisted-items.d.ts +3 -0
- package/dist/detectors/unlisted-items.d.ts.map +1 -0
- package/dist/detectors/unlisted-items.js +57 -0
- package/dist/detectors/unlisted-items.js.map +1 -0
- package/dist/detectors/use-count-words.d.ts +8 -0
- package/dist/detectors/use-count-words.d.ts.map +1 -0
- package/dist/detectors/use-count-words.js +20 -0
- package/dist/detectors/use-count-words.js.map +1 -0
- package/dist/detectors/use-interval.d.ts +3 -0
- package/dist/detectors/use-interval.d.ts.map +1 -0
- package/dist/detectors/use-interval.js +39 -0
- package/dist/detectors/use-interval.js.map +1 -0
- package/dist/detectors/walk-time-distance-mismatch.d.ts +4 -0
- package/dist/detectors/walk-time-distance-mismatch.d.ts.map +1 -0
- package/dist/detectors/walk-time-distance-mismatch.js +38 -0
- package/dist/detectors/walk-time-distance-mismatch.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/approximate-tolerance.d.ts +7 -0
- package/dist/facts/approximate-tolerance.d.ts.map +1 -0
- package/dist/facts/approximate-tolerance.js +16 -0
- package/dist/facts/approximate-tolerance.js.map +1 -0
- package/dist/facts/item-amounts.d.ts +18 -0
- package/dist/facts/item-amounts.d.ts.map +1 -0
- package/dist/facts/item-amounts.js +67 -0
- package/dist/facts/item-amounts.js.map +1 -0
- package/dist/facts/labelled-facts.d.ts +4 -0
- package/dist/facts/labelled-facts.d.ts.map +1 -1
- package/dist/facts/labelled-facts.js +21 -6
- package/dist/facts/labelled-facts.js.map +1 -1
- package/dist/facts/measure-units.d.ts +5 -0
- package/dist/facts/measure-units.d.ts.map +1 -0
- package/dist/facts/measure-units.js +28 -0
- package/dist/facts/measure-units.js.map +1 -0
- package/dist/facts/measures.d.ts +23 -4
- package/dist/facts/measures.d.ts.map +1 -1
- package/dist/facts/measures.js +68 -19
- package/dist/facts/measures.js.map +1 -1
- package/dist/facts/retention-periods.d.ts +51 -0
- package/dist/facts/retention-periods.d.ts.map +1 -0
- package/dist/facts/retention-periods.js +148 -0
- package/dist/facts/retention-periods.js.map +1 -0
- package/dist/facts/table-facts.d.ts +2 -0
- package/dist/facts/table-facts.d.ts.map +1 -1
- package/dist/facts/table-facts.js +2 -0
- package/dist/facts/table-facts.js.map +1 -1
- package/dist/facts/unit-conflicts.d.ts +3 -2
- package/dist/facts/unit-conflicts.d.ts.map +1 -1
- package/dist/facts/unit-conflicts.js +15 -7
- package/dist/facts/unit-conflicts.js.map +1 -1
- package/dist/facts/unit-equivalents.d.ts +13 -0
- package/dist/facts/unit-equivalents.d.ts.map +1 -0
- package/dist/facts/unit-equivalents.js +56 -0
- package/dist/facts/unit-equivalents.js.map +1 -0
- package/dist/facts/unit-tolerance.d.ts +4 -0
- package/dist/facts/unit-tolerance.d.ts.map +1 -0
- package/dist/facts/unit-tolerance.js +13 -0
- package/dist/facts/unit-tolerance.js.map +1 -0
- package/dist/facts/unit-word.d.ts +8 -0
- package/dist/facts/unit-word.d.ts.map +1 -0
- package/dist/facts/unit-word.js +34 -0
- package/dist/facts/unit-word.js.map +1 -0
- package/dist/facts/written-precision.d.ts +10 -0
- package/dist/facts/written-precision.d.ts.map +1 -0
- package/dist/facts/written-precision.js +20 -0
- package/dist/facts/written-precision.js.map +1 -0
- package/dist/kana-spelling.d.ts +12 -0
- package/dist/kana-spelling.d.ts.map +1 -1
- package/dist/kana-spelling.js +23 -0
- package/dist/kana-spelling.js.map +1 -1
- package/dist/model-codes.d.ts +23 -0
- package/dist/model-codes.d.ts.map +1 -0
- package/dist/model-codes.js +81 -0
- package/dist/model-codes.js.map +1 -0
- package/dist/name-spelling-chars.d.ts +16 -0
- package/dist/name-spelling-chars.d.ts.map +1 -0
- package/dist/name-spelling-chars.js +14 -0
- package/dist/name-spelling-chars.js.map +1 -0
- package/dist/name-variants.d.ts +8 -2
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +72 -7
- 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/phone-numbers.d.ts.map +1 -1
- package/dist/phone-numbers.js +22 -5
- package/dist/phone-numbers.js.map +1 -1
- package/dist/place-names.d.ts +12 -5
- package/dist/place-names.d.ts.map +1 -1
- package/dist/place-names.js +34 -14
- package/dist/place-names.js.map +1 -1
- package/dist/plugin.d.ts +12 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/preamble-paragraphs.d.ts +2 -1
- package/dist/preamble-paragraphs.d.ts.map +1 -1
- package/dist/preamble-paragraphs.js +16 -1
- package/dist/preamble-paragraphs.js.map +1 -1
- package/dist/profile/parse.d.ts.map +1 -1
- package/dist/profile/parse.js +11 -0
- package/dist/profile/parse.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/spacing-code.d.ts +6 -0
- package/dist/spacing-code.d.ts.map +1 -0
- package/dist/spacing-code.js +16 -0
- package/dist/spacing-code.js.map +1 -0
- package/dist/structure/amount-range.d.ts +2 -2
- package/dist/structure/amount-range.d.ts.map +1 -1
- package/dist/structure/amount-range.js +12 -5
- package/dist/structure/amount-range.js.map +1 -1
- package/dist/structure/capacity-count.d.ts +59 -0
- package/dist/structure/capacity-count.d.ts.map +1 -0
- package/dist/structure/capacity-count.js +118 -0
- package/dist/structure/capacity-count.js.map +1 -0
- 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 +6 -0
- package/dist/structure/counted-amounts.d.ts.map +1 -1
- package/dist/structure/counted-amounts.js +4 -4
- package/dist/structure/counted-amounts.js.map +1 -1
- 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 +2 -2
- package/dist/structure/date-order.d.ts.map +1 -1
- package/dist/structure/date-order.js +26 -9
- package/dist/structure/date-order.js.map +1 -1
- package/dist/structure/date-outside-period.d.ts +8 -0
- package/dist/structure/date-outside-period.d.ts.map +1 -1
- package/dist/structure/date-outside-period.js +52 -3
- package/dist/structure/date-outside-period.js.map +1 -1
- package/dist/structure/date-range.d.ts +6 -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/deadline-after-event.d.ts +23 -0
- package/dist/structure/deadline-after-event.d.ts.map +1 -0
- package/dist/structure/deadline-after-event.js +42 -0
- package/dist/structure/deadline-after-event.js.map +1 -0
- package/dist/structure/definition-use.d.ts +1 -1
- package/dist/structure/definition-use.d.ts.map +1 -1
- package/dist/structure/definition-use.js +55 -2
- package/dist/structure/definition-use.js.map +1 -1
- package/dist/structure/due-date.d.ts.map +1 -1
- package/dist/structure/due-date.js +5 -27
- package/dist/structure/due-date.js.map +1 -1
- package/dist/structure/labelled-date-order.d.ts +38 -0
- package/dist/structure/labelled-date-order.d.ts.map +1 -0
- package/dist/structure/labelled-date-order.js +41 -0
- package/dist/structure/labelled-date-order.js.map +1 -0
- package/dist/structure/layout-codes.d.ts +68 -0
- package/dist/structure/layout-codes.d.ts.map +1 -0
- package/dist/structure/layout-codes.js +161 -0
- package/dist/structure/layout-codes.js.map +1 -0
- package/dist/structure/leg-times.d.ts +2 -0
- package/dist/structure/leg-times.d.ts.map +1 -1
- package/dist/structure/leg-times.js +13 -0
- package/dist/structure/leg-times.js.map +1 -1
- package/dist/structure/measured-amounts.d.ts +17 -0
- package/dist/structure/measured-amounts.d.ts.map +1 -0
- package/dist/structure/measured-amounts.js +110 -0
- package/dist/structure/measured-amounts.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/quantity-range.d.ts +8 -0
- package/dist/structure/quantity-range.d.ts.map +1 -0
- package/dist/structure/quantity-range.js +36 -0
- package/dist/structure/quantity-range.js.map +1 -0
- package/dist/structure/range-bands.d.ts +75 -0
- package/dist/structure/range-bands.d.ts.map +1 -0
- package/dist/structure/range-bands.js +244 -0
- package/dist/structure/range-bands.js.map +1 -0
- package/dist/structure/rent-multiple.d.ts +76 -0
- package/dist/structure/rent-multiple.d.ts.map +1 -0
- package/dist/structure/rent-multiple.js +186 -0
- package/dist/structure/rent-multiple.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/scaled-quantities.d.ts +50 -0
- package/dist/structure/scaled-quantities.d.ts.map +1 -0
- package/dist/structure/scaled-quantities.js +153 -0
- package/dist/structure/scaled-quantities.js.map +1 -0
- package/dist/structure/stamp-order.d.ts +16 -0
- package/dist/structure/stamp-order.d.ts.map +1 -0
- package/dist/structure/stamp-order.js +78 -0
- package/dist/structure/stamp-order.js.map +1 -0
- package/dist/structure/step-times.d.ts +49 -0
- package/dist/structure/step-times.d.ts.map +1 -0
- package/dist/structure/step-times.js +128 -0
- package/dist/structure/step-times.js.map +1 -0
- package/dist/structure/term-deadline.d.ts +19 -0
- package/dist/structure/term-deadline.d.ts.map +1 -0
- package/dist/structure/term-deadline.js +28 -0
- package/dist/structure/term-deadline.js.map +1 -0
- package/dist/structure/time-order.d.ts +21 -0
- package/dist/structure/time-order.d.ts.map +1 -1
- package/dist/structure/time-order.js +5 -6
- package/dist/structure/time-order.js.map +1 -1
- package/dist/structure/time-range.d.ts +16 -0
- package/dist/structure/time-range.d.ts.map +1 -0
- package/dist/structure/time-range.js +57 -0
- package/dist/structure/time-range.js.map +1 -0
- package/dist/structure/total-line.d.ts +16 -0
- package/dist/structure/total-line.d.ts.map +1 -0
- package/dist/structure/total-line.js +44 -0
- package/dist/structure/total-line.js.map +1 -0
- package/dist/structure/total.d.ts +7 -1
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +28 -5
- package/dist/structure/total.js.map +1 -1
- package/dist/structure/unlisted-items.d.ts +70 -0
- package/dist/structure/unlisted-items.d.ts.map +1 -0
- package/dist/structure/unlisted-items.js +152 -0
- package/dist/structure/unlisted-items.js.map +1 -0
- package/dist/structure/version-order.d.ts +2 -0
- package/dist/structure/version-order.d.ts.map +1 -1
- package/dist/structure/version-order.js +10 -0
- package/dist/structure/version-order.js.map +1 -1
- package/dist/structure/walk-time.d.ts +87 -0
- package/dist/structure/walk-time.d.ts.map +1 -0
- package/dist/structure/walk-time.js +195 -0
- package/dist/structure/walk-time.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/package.json +3 -3
- package/profiles/listing.yaml +20 -0
- package/rules/announced-count-mismatch.yaml +2 -2
- package/rules/capacity-runtime-mismatch.yaml +66 -0
- package/rules/connection-time-short.yaml +52 -0
- package/rules/contact-variant.yaml +76 -0
- package/rules/count-over-capacity.yaml +55 -0
- package/rules/date-outside-period.yaml +4 -4
- package/rules/date-stamp-order.yaml +82 -0
- package/rules/deadline-after-event.yaml +67 -0
- package/rules/defined-name-repeated.yaml +2 -2
- package/rules/due-before-issue.yaml +11 -7
- package/rules/duration-mismatch.yaml +7 -4
- package/rules/duration-product-mismatch.yaml +73 -0
- package/rules/fact-conflict.yaml +9 -4
- package/rules/heading-echo.yaml +2 -2
- package/rules/interval-count-mismatch.yaml +54 -0
- package/rules/latin-spacing.yaml +2 -2
- package/rules/layout-code-mismatch.yaml +68 -0
- package/rules/name-variant.yaml +14 -2
- package/rules/no-em-dash.yaml +2 -2
- package/rules/party-order.yaml +84 -0
- package/rules/preamble-length.yaml +2 -2
- package/rules/quantity-range-reversed.yaml +53 -0
- package/rules/range-band-mismatch.yaml +70 -0
- package/rules/rent-multiple-mismatch.yaml +61 -0
- package/rules/required-listed-as-preferred.yaml +102 -0
- package/rules/return-type-mismatch.yaml +79 -0
- package/rules/scaled-quantity-mismatch.yaml +69 -0
- package/rules/step-time-sum-mismatch.yaml +65 -0
- package/rules/time-range-reversed.yaml +48 -0
- package/rules/title-case-consistency.yaml +2 -2
- package/rules/total-mismatch.yaml +2 -2
- package/rules/undefined-term.yaml +21 -7
- package/rules/unit-mismatch.yaml +12 -4
- package/rules/unlisted-item-used.yaml +90 -0
- package/rules/unused-definition.yaml +2 -2
- package/rules/use-before-definition.yaml +2 -2
- package/rules/walk-time-distance-mismatch.yaml +55 -0
- package/src/announced-count.ts +6 -3
- package/src/contacts/addresses.ts +179 -0
- package/src/contacts/emails.ts +63 -0
- package/src/contacts/variants.ts +33 -0
- package/src/derived/battery-runtime.ts +284 -0
- package/src/derived/period-counts.ts +178 -0
- package/src/derived/session-hours.ts +62 -0
- package/src/derived/time-lengths.ts +229 -0
- package/src/derived/unit-counts.ts +18 -0
- package/src/derived/use-interval.ts +151 -0
- package/src/derived/working-hours.ts +97 -0
- package/src/detectors/acronym-expansion.ts +57 -2
- package/src/detectors/announced-count.ts +1 -0
- package/src/detectors/capacity-runtime.ts +128 -0
- package/src/detectors/capitalised-term.ts +147 -0
- package/src/detectors/contact-variant.ts +24 -0
- package/src/detectors/count-over-capacity.ts +37 -0
- package/src/detectors/date-outside-period.ts +5 -1
- package/src/detectors/date-stamp-order.ts +28 -0
- package/src/detectors/defined-term-form.ts +63 -7
- package/src/detectors/definition-use.ts +6 -2
- package/src/detectors/derived-numbers.ts +97 -24
- package/src/detectors/due-date.ts +10 -2
- package/src/detectors/en-shape.ts +11 -4
- package/src/detectors/event-deadline.ts +29 -0
- package/src/detectors/fact-consistency.ts +64 -3
- package/src/detectors/heading-case.ts +13 -4
- package/src/detectors/heading-echo.ts +17 -1
- package/src/detectors/layout-code.ts +174 -0
- package/src/detectors/measured-facts.ts +20 -0
- package/src/detectors/name-variant-model-codes.ts +27 -0
- package/src/detectors/name-variant.ts +99 -15
- package/src/detectors/orthographic-variant.ts +78 -9
- package/src/detectors/orthography.ts +16 -6
- package/src/detectors/party-order.ts +50 -0
- package/src/detectors/quantity-range.ts +47 -0
- package/src/detectors/range-band.ts +125 -0
- package/src/detectors/registry/capacity-runtime-mismatch.ts +4 -0
- package/src/detectors/registry/connection-time-short.ts +4 -0
- package/src/detectors/registry/contact-variant.ts +4 -0
- package/src/detectors/registry/count-over-capacity.ts +4 -0
- package/src/detectors/registry/date-stamp-order.ts +4 -0
- package/src/detectors/registry/duration-product-mismatch.ts +4 -0
- package/src/detectors/registry/event-deadline.ts +4 -0
- package/src/detectors/registry/interval-count-mismatch.ts +4 -0
- package/src/detectors/registry/layout-code-mismatch.ts +4 -0
- package/src/detectors/registry/party-order.ts +4 -0
- package/src/detectors/registry/quantity-range.ts +4 -0
- package/src/detectors/registry/range-band-mismatch.ts +4 -0
- package/src/detectors/registry/rent-multiple-mismatch.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/scaled-quantity-mismatch.ts +4 -0
- package/src/detectors/registry/step-time-sum-mismatch.ts +4 -0
- package/src/detectors/registry/time-range-reversed.ts +4 -0
- package/src/detectors/registry/unlisted-item-used.ts +4 -0
- package/src/detectors/registry/walk-time-distance-mismatch.ts +4 -0
- package/src/detectors/rent-multiple-mismatch.ts +56 -0
- package/src/detectors/requirement-lists.ts +65 -0
- package/src/detectors/return-type.ts +30 -0
- package/src/detectors/scaled-quantity.ts +49 -0
- package/src/detectors/signals.ts +3 -1
- package/src/detectors/step-time-sum.ts +55 -0
- package/src/detectors/structure-tree.ts +42 -6
- package/src/detectors/structure.ts +1 -1
- package/src/detectors/technical-docs.ts +12 -0
- package/src/detectors/time-order.ts +45 -6
- package/src/detectors/undefined-term.ts +20 -3
- package/src/detectors/unit-consistency.ts +50 -38
- package/src/detectors/unlisted-items.ts +72 -0
- package/src/detectors/use-count-words.ts +32 -0
- package/src/detectors/use-interval.ts +51 -0
- package/src/detectors/walk-time-distance-mismatch.ts +45 -0
- package/src/document.ts +4 -1
- package/src/facts/approximate-tolerance.ts +19 -0
- package/src/facts/item-amounts.ts +94 -0
- package/src/facts/labelled-facts.ts +29 -7
- package/src/facts/measure-units.ts +31 -0
- package/src/facts/measures.ts +113 -25
- package/src/facts/retention-periods.ts +216 -0
- package/src/facts/table-facts.ts +3 -0
- package/src/facts/unit-conflicts.ts +22 -9
- package/src/facts/unit-equivalents.ts +70 -0
- package/src/facts/unit-tolerance.ts +17 -0
- package/src/facts/unit-word.ts +35 -0
- package/src/facts/written-precision.ts +23 -0
- package/src/kana-spelling.ts +25 -0
- package/src/model-codes.ts +104 -0
- package/src/name-spelling-chars.ts +34 -0
- package/src/name-variants.ts +83 -7
- package/src/name-word-order.ts +149 -0
- package/src/phone-numbers.ts +26 -6
- package/src/place-names.ts +53 -14
- package/src/plugin.ts +7 -0
- package/src/preamble-paragraphs.ts +21 -2
- package/src/profile/parse.ts +10 -0
- package/src/return-type.ts +361 -0
- package/src/spacing-code.ts +26 -0
- package/src/structure/amount-range.ts +16 -7
- package/src/structure/capacity-count.ts +196 -0
- package/src/structure/connection-times.ts +226 -0
- package/src/structure/counted-amounts.ts +5 -4
- package/src/structure/date-order-tie.ts +86 -0
- package/src/structure/date-order.ts +41 -14
- package/src/structure/date-outside-period.ts +77 -7
- package/src/structure/date-range.ts +45 -9
- package/src/structure/deadline-after-event.ts +67 -0
- package/src/structure/definition-use.ts +59 -2
- package/src/structure/due-date.ts +8 -32
- package/src/structure/labelled-date-order.ts +84 -0
- package/src/structure/layout-codes.ts +210 -0
- package/src/structure/leg-times.ts +15 -0
- package/src/structure/measured-amounts.ts +138 -0
- package/src/structure/party-order.ts +115 -0
- package/src/structure/quantity-range.ts +54 -0
- package/src/structure/range-bands.ts +316 -0
- package/src/structure/rent-multiple.ts +277 -0
- package/src/structure/requirement-lists.ts +145 -0
- package/src/structure/scaled-quantities.ts +225 -0
- package/src/structure/stamp-order.ts +100 -0
- package/src/structure/step-times.ts +169 -0
- package/src/structure/term-deadline.ts +35 -0
- package/src/structure/time-order.ts +8 -7
- package/src/structure/time-range.ts +64 -0
- package/src/structure/total-line.ts +63 -0
- package/src/structure/total.ts +41 -6
- package/src/structure/unlisted-items.ts +207 -0
- package/src/structure/version-order.ts +10 -0
- package/src/structure/walk-time.ts +285 -0
- package/src/surname-near.ts +31 -0
- package/src/table-cells.ts +41 -0
- package/src/table-names.ts +113 -0
|
@@ -6,9 +6,13 @@ import { weekdayMismatches } from "../structure/weekday.ts";
|
|
|
6
6
|
import { documentDateOf } from "./document-date.ts";
|
|
7
7
|
import { dateOrderBreaks } from "../structure/date-order.ts";
|
|
8
8
|
import { totalMismatches, type Amount } from "../structure/total.ts";
|
|
9
|
+
import { isTotalLine } from "../structure/total-line.ts";
|
|
9
10
|
import { proseTotalMismatches } from "../structure/prose-total.ts";
|
|
10
11
|
import { countedAmounts, type SummedCounter } from "../structure/counted-amounts.ts";
|
|
12
|
+
import { measuredAmounts, type MeasureMarks, type SummedMeasure } from "../structure/measured-amounts.ts";
|
|
13
|
+
import { measureUnitsOf } from "../facts/measure-units.ts";
|
|
11
14
|
import { rangeFrameOf, reversedRanges, type DatedSpan, type RangeWords } from "../structure/date-range.ts";
|
|
15
|
+
import { afterLabel } from "../structure/stated-period.ts";
|
|
12
16
|
import { percentSumMismatches, type ShareWords } from "../structure/percent-sum.ts";
|
|
13
17
|
import { proseShareMismatches } from "../structure/percent-sum-prose.ts";
|
|
14
18
|
import { isQuotedAlone } from "../quoted-span.ts";
|
|
@@ -183,11 +187,33 @@ const summableAmountsOf = (doc: ProseDocument, tree: NonNullable<ProseDocument["
|
|
|
183
187
|
return [...known, ...countedAmounts(doc.source, summedCountersOf(doc), known)].toSorted((left, right) => left.offset - right.offset);
|
|
184
188
|
};
|
|
185
189
|
|
|
186
|
-
/**
|
|
190
|
+
/** 合計の行で足す量の種類。換算の倍率は語彙表の weight。 */
|
|
191
|
+
const SUMMED_DIMENSIONS = ["unit-mass", "unit-volume", "unit-length"] as const;
|
|
192
|
+
|
|
193
|
+
/** 足す単位。零点のずれた単位(°F)は足せないので除く。 */
|
|
194
|
+
const summedMeasuresOf = (doc: ProseDocument): SummedMeasure[] =>
|
|
195
|
+
measureUnitsOf(doc).filter((unit) => unit.zero === 0 && SUMMED_DIMENSIONS.some((dimension) => dimension === unit.dimension));
|
|
196
|
+
|
|
197
|
+
const positionedOf = (doc: ProseDocument, lexicon: string, position: "before" | "after"): string[] =>
|
|
198
|
+
(doc.lexicons[lexicon] ?? []).filter((entry) => (entry.position ?? "before") === position).map((entry) => entry.pattern);
|
|
199
|
+
|
|
200
|
+
const measureMarksOf = (doc: ProseDocument): MeasureMarks => ({
|
|
201
|
+
roughBefore: positionedOf(doc, "approximate-marker", "before"),
|
|
202
|
+
roughAfter: positionedOf(doc, "approximate-marker", "after"),
|
|
203
|
+
connectors: patternsOf(doc, "range-connector"),
|
|
204
|
+
perMarks: patternsOf(doc, "measure-per-mark"),
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
/** 表と箇条書きの合計で足す数量。金額と助数詞の数に、単位の付いた量(300 mg、0.5 g)を加える。 */
|
|
208
|
+
const lineAmountsOf = (doc: ProseDocument, amounts: readonly Amount[]): Amount[] =>
|
|
209
|
+
[...amounts, ...measuredAmounts(doc.source, summedMeasuresOf(doc), measureMarksOf(doc), amounts)].toSorted((left, right) => left.offset - right.offset);
|
|
210
|
+
|
|
211
|
+
/** 合計の行と内訳の行、文の中の合計と内訳。同じ金額は一度だけ言う。単位の付いた量は、表と箇条書きの合計だけで足す。 */
|
|
187
212
|
const totalIssues = (doc: ProseDocument, tree: NonNullable<ProseDocument["structure"]>): StructureIssue[] => {
|
|
188
213
|
const amounts = summableAmountsOf(doc, tree);
|
|
189
|
-
const
|
|
190
|
-
const
|
|
214
|
+
const words = { labels: patternsOf(doc, "total-label"), qualifiers: doc.lexicons["total-label-qualifier"] ?? [] };
|
|
215
|
+
const lines = totalMismatches(doc.source, lineAmountsOf(doc, amounts), (text) => isTotalLine(text, words));
|
|
216
|
+
const phrases = {
|
|
191
217
|
totals: patternsOf(doc, "total-phrase"),
|
|
192
218
|
breakdowns: patternsOf(doc, "breakdown-phrase"),
|
|
193
219
|
discounts: patternsOf(doc, "discount-word"),
|
|
@@ -197,7 +223,7 @@ const totalIssues = (doc: ProseDocument, tree: NonNullable<ProseDocument["struct
|
|
|
197
223
|
doc.source,
|
|
198
224
|
doc.sentences.map((sentence) => sentence.span),
|
|
199
225
|
amounts,
|
|
200
|
-
|
|
226
|
+
phrases,
|
|
201
227
|
);
|
|
202
228
|
return [...lines, ...prose.filter((issue) => !lines.some((line) => line.offset === issue.offset))];
|
|
203
229
|
};
|
|
@@ -218,7 +244,7 @@ export const totalMismatch: Detector = (doc): Finding[] =>
|
|
|
218
244
|
values: { ...issue.values, offset: issue.offset },
|
|
219
245
|
}));
|
|
220
246
|
|
|
221
|
-
const rangeWordsOf = (doc: ProseDocument): RangeWords => ({
|
|
247
|
+
export const rangeWordsOf = (doc: ProseDocument): RangeWords => ({
|
|
222
248
|
connectors: (doc.lexicons["range-connector"] ?? []).map((entry) => entry.pattern),
|
|
223
249
|
openers: (doc.lexicons["range-opener"] ?? []).map((entry) => entry.pattern),
|
|
224
250
|
closers: (doc.lexicons["range-closer"] ?? []).map((entry) => entry.pattern),
|
|
@@ -227,11 +253,21 @@ const rangeWordsOf = (doc: ProseDocument): RangeWords => ({
|
|
|
227
253
|
weekdays: (doc.lexicons["weekday"] ?? []).map((entry) => entry.pattern),
|
|
228
254
|
});
|
|
229
255
|
|
|
256
|
+
/** その位置が、期間の語(period-label)で始まる行の、語より後ろにあるか。 */
|
|
257
|
+
const labelledAt =
|
|
258
|
+
(doc: ProseDocument) =>
|
|
259
|
+
(offset: number): boolean => {
|
|
260
|
+
const lineStart = doc.source.lastIndexOf("\n", offset - 1) + 1;
|
|
261
|
+
const lineEnd = doc.source.indexOf("\n", offset);
|
|
262
|
+
const after = afterLabel(doc.source.slice(lineStart, lineEnd === -1 ? doc.source.length : lineEnd), patternsOf(doc, "period-label"));
|
|
263
|
+
return after !== undefined && offset >= lineStart + after;
|
|
264
|
+
};
|
|
265
|
+
|
|
230
266
|
/** 期間の終わりが始まりより前。範囲の記号と語は言語パッケージの語彙表(range-connector、range-opener、range-closer)から取る。 */
|
|
231
267
|
export const dateRangeReversed: Detector = (doc): Finding[] => {
|
|
232
268
|
if (doc.structure === undefined) return [];
|
|
233
269
|
const dates = datedSpans(doc.structure);
|
|
234
|
-
return reversedRanges(doc.source, dates, rangeWordsOf(doc))
|
|
270
|
+
return reversedRanges(doc.source, dates, rangeWordsOf(doc), labelledAt(doc))
|
|
235
271
|
.filter((issue) => {
|
|
236
272
|
const start = dateAt(dates, issue.offset);
|
|
237
273
|
return !quotedDates(doc, dates[start], dates[start + 1]);
|
|
@@ -138,7 +138,7 @@ const withoutDateStamps = (doc: ProseDocument, paragraphs: readonly Paragraph[])
|
|
|
138
138
|
export const preambleLength: Detector = (doc, options): Finding[] => {
|
|
139
139
|
const body = bodySectionOf(doc.sections);
|
|
140
140
|
if (body === undefined) return [];
|
|
141
|
-
const all = preambleParagraphs(doc.paragraphs, body.span.start);
|
|
141
|
+
const all = preambleParagraphs(doc.paragraphs, body.span.start, doc.source);
|
|
142
142
|
if (all.length <= options.limit) return [];
|
|
143
143
|
const before = withoutDateStamps(doc, all);
|
|
144
144
|
if (before.length <= options.limit) return [];
|
|
@@ -191,6 +191,17 @@ const isInflected = (token: Token): boolean =>
|
|
|
191
191
|
token.lemma !== undefined && token.lemma !== "" && token.surface.toLowerCase() !== token.lemma && token.features?.["VerbForm"] !== "Part";
|
|
192
192
|
|
|
193
193
|
const NOMINAL = new Set(["NOUN", "PROPN"]);
|
|
194
|
+
/** What an adjective at the head of a subject goes on to: the noun it describes, or another word describing it. */
|
|
195
|
+
const DESCRIBED = new Set(["NOUN", "PROPN", "ADJ"]);
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* An adjective opening a subject is followed by what it describes (Each user, Large files). One followed by a preposition
|
|
199
|
+
* or an article is an imperative the tagger read as an adjective (Bake in the oven, Open the file).
|
|
200
|
+
*/
|
|
201
|
+
export const opensWithMisreadImperative = (tokens: readonly Token[]): boolean => {
|
|
202
|
+
const [head, next] = tokens.filter((token) => !SKIPPED.has(token.pos));
|
|
203
|
+
return head?.pos === "ADJ" && !DESCRIBED.has(next?.pos ?? "");
|
|
204
|
+
};
|
|
194
205
|
|
|
195
206
|
/** A determiner right after a noun opens a clause inside the phrase (a buffer that is big): the verb after it is the clause's, not a subject's. */
|
|
196
207
|
const opensClause = (words: readonly Token[]): boolean => words.some((token, at) => at > 0 && token.pos === "DET" && NOMINAL.has(words[at - 1]?.pos ?? ""));
|
|
@@ -204,6 +215,7 @@ export const isStatement = (tokens: readonly Token[]): boolean => {
|
|
|
204
215
|
const words = tokens.filter((token) => !SKIPPED.has(token.pos));
|
|
205
216
|
const [head, ...rest] = words;
|
|
206
217
|
if (head === undefined || words.length < MIN_STEP_TOKENS || !SUBJECT_HEAD.has(head.pos)) return false;
|
|
218
|
+
if (opensWithMisreadImperative(words)) return false;
|
|
207
219
|
const verbAt = rest.findIndex((token) => PREDICATE.has(token.pos));
|
|
208
220
|
const verb = rest[verbAt];
|
|
209
221
|
const subject = [head, ...rest.slice(0, verbAt)];
|
|
@@ -3,11 +3,14 @@ import type { StructureIssue } from "../structure/issues.ts";
|
|
|
3
3
|
import { inDocumentOrder } from "../structure/issues.ts";
|
|
4
4
|
import { clockTimes } from "../compare/clock-time.ts";
|
|
5
5
|
import { secondsOf, type DateSpan, type Mark, type TimeSpan, type TimeWords } from "../structure/time-marks.ts";
|
|
6
|
-
import { timeOrderBreaks } from "../structure/time-order.ts";
|
|
7
|
-
import { arrivalsBeforeDeparture } from "../structure/leg-times.ts";
|
|
8
|
-
import {
|
|
6
|
+
import { scheduleDays, timeOrderBreaks } from "../structure/time-order.ts";
|
|
7
|
+
import { arrivalOffsets, arrivalsBeforeDeparture } from "../structure/leg-times.ts";
|
|
8
|
+
import { shortConnections, type TravelLength, type TravelWords } from "../structure/connection-times.ts";
|
|
9
|
+
import { timeLengths } from "../derived/time-lengths.ts";
|
|
10
|
+
import { reversedTimeRanges } from "../structure/time-range.ts";
|
|
11
|
+
import { quoteAt, rangeWordsOf } from "./structure-tree.ts";
|
|
9
12
|
|
|
10
|
-
// 一日の予定の時刻の順番(time-order
|
|
13
|
+
// 一日の予定の時刻の順番(time-order)、発より前の着(arrival-before-departure)、移動の時間より短い乗り継ぎ(connection-time-short)。時刻は compare/clock-time.ts が読み、
|
|
11
14
|
// 発着・翌日・時間帯の語は言語パッケージの語彙表(leg-mark、leg-column、day-shift-mark、time-zone、local-time-mark)から取る。
|
|
12
15
|
|
|
13
16
|
const marksOf = (doc: ProseDocument, lexicon: string): Mark[] =>
|
|
@@ -29,13 +32,13 @@ const datesOf = (doc: ProseDocument): DateSpan[] =>
|
|
|
29
32
|
|
|
30
33
|
const timesOf = (text: string): TimeSpan[] => clockTimes(text).map((time) => ({ start: time.start, end: time.end, seconds: secondsOf(time.key) }));
|
|
31
34
|
|
|
32
|
-
type Finder = (source: string, times: readonly TimeSpan[], dates: readonly DateSpan[], words: TimeWords) => StructureIssue[];
|
|
35
|
+
type Finder = (source: string, times: readonly TimeSpan[], dates: readonly DateSpan[], words: TimeWords, doc: ProseDocument) => StructureIssue[];
|
|
33
36
|
|
|
34
37
|
/** 表と箇条書きを行のまま読むので、原文を渡す(doc.prose は表を覆う)。 */
|
|
35
38
|
const detectorOf =
|
|
36
39
|
(rule: string, find: Finder): Detector =>
|
|
37
40
|
(doc): Finding[] =>
|
|
38
|
-
find(doc.source, timesOf(doc.source), datesOf(doc), timeWordsOf(doc)).map((issue) => ({
|
|
41
|
+
find(doc.source, timesOf(doc.source), datesOf(doc), timeWordsOf(doc), doc).map((issue) => ({
|
|
39
42
|
rule,
|
|
40
43
|
severity: "warning",
|
|
41
44
|
line: 0,
|
|
@@ -47,3 +50,39 @@ const detectorOf =
|
|
|
47
50
|
|
|
48
51
|
export const timeOrder: Detector = detectorOf("time-order", timeOrderBreaks);
|
|
49
52
|
export const arrivalBeforeDeparture: Detector = detectorOf("arrival-before-departure", arrivalsBeforeDeparture);
|
|
53
|
+
export const timeRangeReversed: Detector = detectorOf("time-range-reversed", (source, times, _dates, words, doc) =>
|
|
54
|
+
reversedTimeRanges(source, times, rangeWordsOf(doc), words),
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const SECONDS_PER_HOUR = 3600;
|
|
58
|
+
const SECONDS_PER_MINUTE = 60;
|
|
59
|
+
|
|
60
|
+
const patternsOf = (doc: ProseDocument, lexicon: string, weight?: number): string[] =>
|
|
61
|
+
(doc.lexicons[lexicon] ?? []).filter((entry) => weight === undefined || entry.weight === weight).map((entry) => entry.pattern);
|
|
62
|
+
|
|
63
|
+
/** 時間と分の長さ(約10分、about 40 minutes)。単位は unit-time の重さ(秒)で時間と分に分ける。 */
|
|
64
|
+
const travelLengthsOf = (doc: ProseDocument): TravelLength[] =>
|
|
65
|
+
timeLengths(doc.source, {
|
|
66
|
+
hourUnits: patternsOf(doc, "unit-time", SECONDS_PER_HOUR),
|
|
67
|
+
minuteUnits: patternsOf(doc, "unit-time", SECONDS_PER_MINUTE),
|
|
68
|
+
halves: patternsOf(doc, "length-half"),
|
|
69
|
+
numberWords: patternsOf(doc, "count-number"),
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const travelWordsOf = (doc: ProseDocument): TravelWords => {
|
|
73
|
+
const marks = marksOf(doc, "travel-time-word");
|
|
74
|
+
return { cues: marks.filter((mark) => mark.group === "travel"), bounds: marks.filter((mark) => mark.group === "bound") };
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const connectionTimeShort: Detector = detectorOf("connection-time-short", (source, times, dates, words, doc) =>
|
|
78
|
+
shortConnections({
|
|
79
|
+
source,
|
|
80
|
+
times,
|
|
81
|
+
dates,
|
|
82
|
+
words,
|
|
83
|
+
travel: travelWordsOf(doc),
|
|
84
|
+
lengths: travelLengthsOf(doc),
|
|
85
|
+
arrivals: arrivalOffsets(source, times, dates, words),
|
|
86
|
+
days: scheduleDays(source, times, dates, words),
|
|
87
|
+
}),
|
|
88
|
+
);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { definedTerms } from "../structure/definition-use.ts";
|
|
7
7
|
import { prefixGroupsOf, prefixVariants } from "../structure/term-prefix.ts";
|
|
8
8
|
import { quoteAt } from "./structure-tree.ts";
|
|
9
|
+
import { capitalisedTerms, namedWords, readableText, setApartSpans, type Defined } from "./capitalised-term.ts";
|
|
9
10
|
import type { Detector, Finding, ProseDocument, Token } from "../plugin.ts";
|
|
10
11
|
|
|
11
12
|
export type UndefinedTerm = { readonly offset: number; readonly term: string };
|
|
@@ -89,15 +90,31 @@ const findingOf = (doc: ProseDocument, use: UndefinedTerm): Finding => ({
|
|
|
89
90
|
values: { term: use.term, offset: use.offset },
|
|
90
91
|
});
|
|
91
92
|
|
|
93
|
+
const NAME_LISTS = ["proper-name-word", "place-region", "calendar-name", "month-name", "company-form", "party-role"] as const;
|
|
94
|
+
|
|
95
|
+
/** Capitalised terms, for a language whose package lists the words that join one name (name-joiner); Japanese has none. */
|
|
96
|
+
const capitalisedUses = (doc: ProseDocument, sentences: readonly (readonly Token[])[], defined: readonly Defined[]): UndefinedTerm[] => {
|
|
97
|
+
if (doc.lexicons["name-joiner"] === undefined) return [];
|
|
98
|
+
const words = {
|
|
99
|
+
names: NAME_LISTS.flatMap((id) => patternsOf(doc, id)),
|
|
100
|
+
divisions: patternsOf(doc, "numbered-division"),
|
|
101
|
+
joiners: patternsOf(doc, "name-joiner"),
|
|
102
|
+
};
|
|
103
|
+
const marked = [...(doc.markup?.headings ?? []), ...doc.links, ...setApartSpans(doc.source)];
|
|
104
|
+
return capitalisedTerms({ source: doc.source, readable: readableText(doc.source), sentences, defined, named: namedWords(doc.source), marked, words });
|
|
105
|
+
};
|
|
106
|
+
|
|
92
107
|
export const undefinedTerm: Detector = (doc): Finding[] => {
|
|
93
108
|
if (doc.structure === undefined) return [];
|
|
94
109
|
const prefixEntries = doc.lexicons["defined-term-prefix"] ?? [];
|
|
95
110
|
const sentences = doc.sentences.map((sentence) => sentence.tokens ?? []);
|
|
96
|
-
const
|
|
97
|
-
|
|
111
|
+
const definitions = definedTerms(doc.structure);
|
|
112
|
+
const defined = definitions.map((term) => term.term);
|
|
113
|
+
const prefixed = undefinedTerms(doc.source, sentences, defined, {
|
|
98
114
|
prefixes: prefixEntries.map((entry) => entry.pattern),
|
|
99
115
|
prefixGroups: prefixGroupsOf(prefixEntries),
|
|
100
116
|
selfNouns: [...patternsOf(doc, "self-reference-noun"), ...patternsOf(doc, "document-kind")],
|
|
101
117
|
isQuoted: (term) => QUOTE_PAIRS.some(([open, close]) => doc.source.includes(`${open}${term}${close}`)),
|
|
102
|
-
})
|
|
118
|
+
});
|
|
119
|
+
return [...prefixed, ...capitalisedUses(doc, sentences, definitions)].map((use) => findingOf(doc, use));
|
|
103
120
|
};
|
|
@@ -1,55 +1,67 @@
|
|
|
1
1
|
import type { Detector, Finding, ProseDocument, StructureNode } from "../plugin.ts";
|
|
2
|
-
import { nameSpans } from "../compare/proper-nouns.ts";
|
|
3
|
-
import { overlapsAny, spanIndex } from "../compare/spans.ts";
|
|
4
|
-
import { factValues, type FactValue } from "../facts/fact-values.ts";
|
|
5
2
|
import { labelledFacts } from "../facts/labelled-facts.ts";
|
|
6
3
|
import { tableFacts } from "../facts/table-facts.ts";
|
|
7
4
|
import { scopedFacts } from "../facts/fact-scope.ts";
|
|
8
|
-
import {
|
|
5
|
+
import type { Measured } from "../facts/measures.ts";
|
|
9
6
|
import { unitConflicts } from "../facts/unit-conflicts.ts";
|
|
7
|
+
import { unitPairs } from "../facts/unit-equivalents.ts";
|
|
8
|
+
import { itemConflicts } from "../facts/item-amounts.ts";
|
|
10
9
|
import { factWordsOf } from "./fact-consistency.ts";
|
|
10
|
+
import { measuredOf, valuesWith } from "./measured-facts.ts";
|
|
11
11
|
import { quoteAt } from "./structure-tree.ts";
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
const DIMENSIONS = ["unit-length", "unit-mass", "unit-time", "unit-volume", "unit-data"] as const;
|
|
13
|
+
const patternsOf = (doc: ProseDocument, id: string): string[] => (doc.lexicons[id] ?? []).map((entry) => entry.pattern);
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
DIMENSIONS.flatMap((dimension) => {
|
|
18
|
-
const factors = new Map<string, number[]>();
|
|
19
|
-
(doc.lexicons[dimension] ?? []).forEach((entry) => {
|
|
20
|
-
if (entry.weight !== undefined) factors.set(entry.pattern, [...(factors.get(entry.pattern) ?? []), entry.weight]);
|
|
21
|
-
});
|
|
22
|
-
return [...factors.entries()].map(([pattern, weights]) => ({ pattern, dimension, factors: weights }));
|
|
23
|
-
});
|
|
15
|
+
type Mismatch = { readonly label: string; readonly measured: Measured; readonly other: Measured; readonly variant?: string };
|
|
24
16
|
|
|
25
|
-
/**
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
17
|
+
/** 同じ範囲の同じ名前の量(「距離:5 km」と「距離:3000 m」)。名前と量のあいだの目安の語(「重さは約1.2kg」)は外して読む。 */
|
|
18
|
+
const labelledMismatches = (doc: ProseDocument, tree: StructureNode, measured: readonly Measured[]): Mismatch[] => {
|
|
19
|
+
const byStart = new Map(measured.map((value) => [value.start, value]));
|
|
20
|
+
const values = valuesWith(tree, doc, measured);
|
|
21
|
+
const words = { ...factWordsOf(doc), valueLeads: patternsOf(doc, "measure-value-lead") };
|
|
22
|
+
const facts = [...labelledFacts(doc.source, values, words), ...tableFacts(doc.source, values)];
|
|
23
|
+
const scoped = scopedFacts(facts, tree, doc.source, []);
|
|
24
|
+
return unitConflicts(scoped, (fact) => byStart.get(fact.value.start), doc.source).map((conflict) => ({
|
|
25
|
+
label: conflict.fact.label,
|
|
26
|
+
measured: conflict.measured,
|
|
27
|
+
other: conflict.other,
|
|
28
|
+
}));
|
|
30
29
|
};
|
|
31
30
|
|
|
32
|
-
|
|
31
|
+
const mismatchesOf = (doc: ProseDocument, tree: StructureNode, measured: readonly Measured[]): Mismatch[] => [
|
|
32
|
+
...labelledMismatches(doc, tree, measured),
|
|
33
|
+
...unitPairs(doc.source, measured, patternsOf(doc, "unit-equivalent-hedge")).map((pair) => ({ label: "", ...pair, variant: "bracket" })),
|
|
34
|
+
...itemConflicts(doc.source, measured, { links: patternsOf(doc, "unit-item-link"), determiners: patternsOf(doc, "fact-label-drop") }).map((conflict) => ({
|
|
35
|
+
label: conflict.name,
|
|
36
|
+
measured: conflict.measured,
|
|
37
|
+
other: conflict.other,
|
|
38
|
+
variant: "item",
|
|
39
|
+
})),
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
const findingOf = (doc: ProseDocument, mismatch: Mismatch): Finding => ({
|
|
43
|
+
rule: "unit-mismatch",
|
|
44
|
+
severity: "warning",
|
|
45
|
+
line: 0,
|
|
46
|
+
column: 0,
|
|
47
|
+
quote: quoteAt(doc.source, mismatch.measured.start),
|
|
48
|
+
values: {
|
|
49
|
+
label: mismatch.label,
|
|
50
|
+
value: doc.source.slice(mismatch.measured.start, mismatch.measured.end),
|
|
51
|
+
other: doc.source.slice(mismatch.other.start, mismatch.other.end),
|
|
52
|
+
offset: mismatch.measured.start,
|
|
53
|
+
},
|
|
54
|
+
...(mismatch.variant === undefined ? {} : { variant: mismatch.variant }),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
/** 同じ量を、違う単位で書いて、換算すると合わない。一つの量は一度だけ言う。 */
|
|
33
58
|
export const unitMismatch: Detector = (doc): Finding[] => {
|
|
34
59
|
const tree = doc.structure;
|
|
35
60
|
if (tree === undefined) return [];
|
|
36
|
-
const measured =
|
|
61
|
+
const measured = measuredOf(doc);
|
|
37
62
|
if (measured.length === 0) return [];
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return unitConflicts(scoped, (fact) => byStart.get(fact.value.start)).map((conflict) => ({
|
|
43
|
-
rule: "unit-mismatch",
|
|
44
|
-
severity: "warning",
|
|
45
|
-
line: 0,
|
|
46
|
-
column: 0,
|
|
47
|
-
quote: quoteAt(doc.source, conflict.measured.start),
|
|
48
|
-
values: {
|
|
49
|
-
label: conflict.fact.label,
|
|
50
|
-
value: doc.source.slice(conflict.measured.start, conflict.measured.end),
|
|
51
|
-
other: doc.source.slice(conflict.other.start, conflict.other.end),
|
|
52
|
-
offset: conflict.measured.start,
|
|
53
|
-
},
|
|
54
|
-
}));
|
|
63
|
+
const mismatches = mismatchesOf(doc, tree, measured);
|
|
64
|
+
return mismatches
|
|
65
|
+
.filter((mismatch, index) => mismatches.findIndex((other) => other.measured.start === mismatch.measured.start) === index)
|
|
66
|
+
.map((mismatch) => findingOf(doc, mismatch));
|
|
55
67
|
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// unlisted-item-used: a numbered step uses a thing the document's list of what is needed does not name
|
|
2
|
+
// (structure/unlisted-items.ts). The words are the language package's item-list-heading, item-use, item-amount,
|
|
3
|
+
// item-at-hand and enumeration-joiner.
|
|
4
|
+
import type { Detector, Finding, ProseDocument, Token } from "../plugin.ts";
|
|
5
|
+
import { itemLists, unlistedItems, type ItemStep, type ItemToken, type ItemWords, type UseGroup, type UseMarker } from "../structure/unlisted-items.ts";
|
|
6
|
+
import { quoteAround } from "./quote-around.ts";
|
|
7
|
+
|
|
8
|
+
const USE_GROUPS: readonly UseGroup[] = ["object", "place", "instrument"];
|
|
9
|
+
|
|
10
|
+
const patternsOf = (doc: ProseDocument, lexicon: string, group?: string): string[] =>
|
|
11
|
+
(doc.lexicons[lexicon] ?? []).filter((entry) => group === undefined || entry.group === group).map((entry) => entry.pattern);
|
|
12
|
+
|
|
13
|
+
const markersOf = (doc: ProseDocument): UseMarker[] =>
|
|
14
|
+
(doc.lexicons["item-use"] ?? []).flatMap((entry) => {
|
|
15
|
+
const group = USE_GROUPS.find((use) => use === entry.group);
|
|
16
|
+
return group === undefined || entry.position === undefined ? [] : [{ word: entry.pattern, group, position: entry.position }];
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const wordsOf = (doc: ProseDocument): ItemWords => ({
|
|
20
|
+
ingredientHeadings: patternsOf(doc, "item-list-heading", "ingredient"),
|
|
21
|
+
toolHeadings: patternsOf(doc, "item-list-heading", "tool"),
|
|
22
|
+
markers: markersOf(doc),
|
|
23
|
+
verbs: Object.fromEntries(USE_GROUPS.map((group) => [group, patternsOf(doc, "item-use", `${group}-verb`)])),
|
|
24
|
+
negations: patternsOf(doc, "item-use", "negation"),
|
|
25
|
+
actions: patternsOf(doc, "item-use", "action"),
|
|
26
|
+
joiners: patternsOf(doc, "enumeration-joiner"),
|
|
27
|
+
partitives: patternsOf(doc, "item-use", "partitive"),
|
|
28
|
+
amounts: patternsOf(doc, "item-amount"),
|
|
29
|
+
atHand: patternsOf(doc, "item-at-hand"),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const NUMBERED_LINE = /^[ \t]*\d+[.).)][ \t]+/gmu;
|
|
33
|
+
|
|
34
|
+
const itemToken = (token: Token): ItemToken => ({
|
|
35
|
+
surface: token.surface,
|
|
36
|
+
pos: token.pos,
|
|
37
|
+
lemma: token.lemma ?? token.surface,
|
|
38
|
+
start: token.span.start,
|
|
39
|
+
end: token.span.end,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
/** Each numbered line, with the words of the sentences that start on it. */
|
|
43
|
+
const stepsOf = (doc: ProseDocument): ItemStep[] =>
|
|
44
|
+
[...doc.source.matchAll(NUMBERED_LINE)].map((match) => {
|
|
45
|
+
const lineEnd = doc.source.indexOf("\n", match.index);
|
|
46
|
+
const end = lineEnd === -1 ? doc.source.length : lineEnd;
|
|
47
|
+
const sentences = doc.sentences.filter((sentence) => sentence.span.start >= match.index && sentence.span.start < end);
|
|
48
|
+
return { start: match.index, tokens: sentences.flatMap((sentence) => (sentence.tokens ?? []).map(itemToken)) };
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const headingsOf = (doc: ProseDocument): string[] => doc.sections.filter((section) => section.depth > 0).map((section) => section.heading);
|
|
52
|
+
|
|
53
|
+
/** Every word the tagger read, in the text and in the table cells (a list of ingredients is often a table). */
|
|
54
|
+
const wordsWritten = (doc: ProseDocument): ItemToken[] => [
|
|
55
|
+
...doc.sentences.flatMap((sentence) => (sentence.tokens ?? []).map(itemToken)),
|
|
56
|
+
...(doc.tableCells?.() ?? []).flatMap((cell) => (cell.tokens ?? []).map(itemToken)),
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
export const unlistedItemUsed: Detector = (doc): Finding[] => {
|
|
60
|
+
const words = wordsOf(doc);
|
|
61
|
+
const headings = headingsOf(doc);
|
|
62
|
+
// Reading every table cell is not free; a document without a list heading needs none of it.
|
|
63
|
+
if (itemLists(headings, words).length === 0) return [];
|
|
64
|
+
return unlistedItems({ source: doc.source, words: wordsWritten(doc) }, headings, stepsOf(doc), words).map((item) => ({
|
|
65
|
+
rule: "unlisted-item-used",
|
|
66
|
+
severity: "warning",
|
|
67
|
+
line: 0,
|
|
68
|
+
column: 0,
|
|
69
|
+
quote: quoteAround(doc.source, item.offset, item.offset + item.item.length),
|
|
70
|
+
values: { item: item.item, list: item.list, offset: item.offset },
|
|
71
|
+
}));
|
|
72
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ProseDocument } from "../plugin.ts";
|
|
2
|
+
import type { Mark } from "../structure/time-marks.ts";
|
|
3
|
+
import type { CountWord, LimitWords, PeriodCountWords, PeriodWord } from "../derived/period-counts.ts";
|
|
4
|
+
|
|
5
|
+
// 期間あたりの回数の語(use-count-word)と、語で書いた数(count-number)。product-exceeds-maximum と interval-count-mismatch が読む。
|
|
6
|
+
|
|
7
|
+
const entriesOf = (doc: ProseDocument, lexicon: string, group?: string) =>
|
|
8
|
+
(doc.lexicons[lexicon] ?? []).filter((entry) => group === undefined || entry.group === group);
|
|
9
|
+
|
|
10
|
+
export const marksOf = (doc: ProseDocument, lexicon: string, group?: string): Mark[] =>
|
|
11
|
+
entriesOf(doc, lexicon, group).map((entry) => ({ pattern: entry.pattern, position: entry.position, group: entry.group }));
|
|
12
|
+
|
|
13
|
+
const periodsOf = (doc: ProseDocument): PeriodWord[] =>
|
|
14
|
+
entriesOf(doc, "use-count-word", "period").map((entry) => ({ pattern: entry.pattern, position: entry.position, hours: entry.weight ?? 0 }));
|
|
15
|
+
|
|
16
|
+
/** one, two, …: the position in count-number is the value. once, twice: the weight in use-count-word. */
|
|
17
|
+
const numberWordsOf = (doc: ProseDocument): CountWord[] => [
|
|
18
|
+
...entriesOf(doc, "count-number").map((entry, index) => ({ pattern: entry.pattern, value: index + 1, alone: false })),
|
|
19
|
+
...entriesOf(doc, "use-count-word", "alone").map((entry) => ({ pattern: entry.pattern, value: entry.weight ?? 0, alone: true })),
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const periodCountWordsOf = (doc: ProseDocument): PeriodCountWords => ({
|
|
23
|
+
periods: periodsOf(doc),
|
|
24
|
+
counters: entriesOf(doc, "use-count-word", "counter").map((entry) => entry.pattern),
|
|
25
|
+
numberWords: numberWordsOf(doc),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
/** The limit words, the ones that need a negation before them ("more than"), and the negations. */
|
|
29
|
+
export const limitWordsOf = (doc: ProseDocument): LimitWords => ({
|
|
30
|
+
limits: [...marksOf(doc, "use-count-word", "limit"), ...marksOf(doc, "use-count-word", "limit-negated")],
|
|
31
|
+
negations: marksOf(doc, "use-count-word", "negation").map((mark) => mark.pattern),
|
|
32
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Detector, Finding, ProseDocument, Span } from "../plugin.ts";
|
|
2
|
+
import { intervalCountMismatches, type IntervalMismatch, type IntervalWords } from "../derived/use-interval.ts";
|
|
3
|
+
import { paragraphsOf } from "../derived/period-counts.ts";
|
|
4
|
+
import { timeLengths, type TimeLength } from "../derived/time-lengths.ts";
|
|
5
|
+
import { limitWordsOf, marksOf, periodCountWordsOf } from "./use-count-words.ts";
|
|
6
|
+
import { quoteAt } from "./structure-tree.ts";
|
|
7
|
+
|
|
8
|
+
// 使う間隔の下限と期間あたりの回数の上限が両立しない、または表の回数と合わない(interval-count-mismatch)。
|
|
9
|
+
// 語は use-count-word と use-interval-word、長さの単位は unit-time から取る。
|
|
10
|
+
|
|
11
|
+
const SECONDS_PER_HOUR = 3600;
|
|
12
|
+
const SECONDS_PER_MINUTE = 60;
|
|
13
|
+
|
|
14
|
+
const patternsOf = (doc: ProseDocument, lexicon: string, weight?: number): string[] =>
|
|
15
|
+
(doc.lexicons[lexicon] ?? []).filter((entry) => weight === undefined || entry.weight === weight).map((entry) => entry.pattern);
|
|
16
|
+
|
|
17
|
+
const lengthsOf = (doc: ProseDocument): TimeLength[] =>
|
|
18
|
+
timeLengths(doc.source, {
|
|
19
|
+
hourUnits: patternsOf(doc, "unit-time", SECONDS_PER_HOUR),
|
|
20
|
+
minuteUnits: patternsOf(doc, "unit-time", SECONDS_PER_MINUTE),
|
|
21
|
+
halves: patternsOf(doc, "length-half"),
|
|
22
|
+
numberWords: patternsOf(doc, "count-number"),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const wordsOf = (doc: ProseDocument): IntervalWords => ({
|
|
26
|
+
...periodCountWordsOf(doc),
|
|
27
|
+
...limitWordsOf(doc),
|
|
28
|
+
minimum: marksOf(doc, "use-interval-word", "minimum"),
|
|
29
|
+
cues: marksOf(doc, "use-interval-word", "cue").map((mark) => mark.pattern),
|
|
30
|
+
columns: (doc.lexicons["use-interval-word"] ?? [])
|
|
31
|
+
.filter((entry) => entry.group === "column")
|
|
32
|
+
.map((entry) => ({ pattern: entry.pattern, hours: entry.weight ?? 0 })),
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const written = (doc: ProseDocument, span: Span): string => doc.source.slice(span.start, span.end);
|
|
36
|
+
|
|
37
|
+
const valuesOf = (doc: ProseDocument, mismatch: IntervalMismatch): Record<string, string | number> =>
|
|
38
|
+
mismatch.kind === "interval"
|
|
39
|
+
? { count: written(doc, mismatch.count), interval: written(doc, mismatch.interval), needed: mismatch.neededHours, hours: mismatch.count.hours }
|
|
40
|
+
: { count: written(doc, mismatch.count), column: mismatch.column, table: mismatch.tableCount };
|
|
41
|
+
|
|
42
|
+
export const intervalCountMismatch: Detector = (doc): Finding[] =>
|
|
43
|
+
intervalCountMismatches(doc.source, paragraphsOf(doc.source), lengthsOf(doc), wordsOf(doc)).map((mismatch) => ({
|
|
44
|
+
rule: "interval-count-mismatch",
|
|
45
|
+
severity: "warning",
|
|
46
|
+
line: 0,
|
|
47
|
+
column: 0,
|
|
48
|
+
quote: quoteAt(doc.source, mismatch.count.start),
|
|
49
|
+
values: { ...valuesOf(doc, mismatch), offset: mismatch.count.start },
|
|
50
|
+
...(mismatch.kind === "table" ? { variant: "table" } : {}),
|
|
51
|
+
}));
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// A walking time that does not match the stated distance at the document's walking speed (walk-time-distance-mismatch).
|
|
2
|
+
// The words come from the language package (walk-word, walk-rate, unit-length, unit-time, unit-equivalent-hedge); the speed
|
|
3
|
+
// used when the document states none comes from its profile (profiles/listing.yaml).
|
|
4
|
+
import { walkTimeMismatches, type WalkMark, type WalkRate, type WalkWords } from "../structure/walk-time.ts";
|
|
5
|
+
import { proseAndTablesOf } from "../table-text.ts";
|
|
6
|
+
import { quoteAt } from "./structure-tree.ts";
|
|
7
|
+
import type { Detector, Finding, ProseDocument } from "../plugin.ts";
|
|
8
|
+
|
|
9
|
+
const marksOf = (doc: ProseDocument, lexicon: string, group?: string): WalkMark[] =>
|
|
10
|
+
(doc.lexicons[lexicon] ?? [])
|
|
11
|
+
.filter((entry) => group === undefined || entry.group === group)
|
|
12
|
+
.map((entry) => ({ pattern: entry.pattern, position: entry.position, weight: entry.weight }));
|
|
13
|
+
|
|
14
|
+
const patternsOf = (doc: ProseDocument, lexicon: string, group?: string): string[] => marksOf(doc, lexicon, group).map((mark) => mark.pattern);
|
|
15
|
+
|
|
16
|
+
const walkWords = (doc: ProseDocument): WalkWords => ({
|
|
17
|
+
walks: marksOf(doc, "walk-word", "walk"),
|
|
18
|
+
gaps: patternsOf(doc, "walk-word", "gap"),
|
|
19
|
+
bounds: marksOf(doc, "walk-word", "bound"),
|
|
20
|
+
ranges: patternsOf(doc, "walk-word", "range"),
|
|
21
|
+
fillers: patternsOf(doc, "walk-word", "filler"),
|
|
22
|
+
lengths: marksOf(doc, "unit-length"),
|
|
23
|
+
times: marksOf(doc, "unit-time"),
|
|
24
|
+
hedges: patternsOf(doc, "unit-equivalent-hedge"),
|
|
25
|
+
perTimes: marksOf(doc, "walk-rate", "per"),
|
|
26
|
+
roundUps: patternsOf(doc, "walk-rate", "round-up"),
|
|
27
|
+
notRoundUps: patternsOf(doc, "walk-rate", "not-round-up"),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
/** The speed the document's profile walks at when the document states none (a real-estate listing: 80 m a minute, rounded up). */
|
|
31
|
+
const profileRate = (doc: ProseDocument): WalkRate | undefined => {
|
|
32
|
+
const rate = doc.profile?.walkRate;
|
|
33
|
+
return rate === undefined ? undefined : { metresPerMinute: rate.metresPerMinute, rounding: rate.roundUp ? "up" : "any" };
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/** The prose with its tables put back, so code is not read; offsets are the source's. */
|
|
37
|
+
export const walkTimeDistanceMismatch: Detector = (doc): Finding[] =>
|
|
38
|
+
walkTimeMismatches(proseAndTablesOf(doc), walkWords(doc), profileRate(doc)).map((issue) => ({
|
|
39
|
+
rule: "walk-time-distance-mismatch",
|
|
40
|
+
severity: "warning",
|
|
41
|
+
line: 0,
|
|
42
|
+
column: 0,
|
|
43
|
+
quote: quoteAt(doc.source, issue.offset),
|
|
44
|
+
values: { ...issue.values, offset: issue.offset },
|
|
45
|
+
}));
|
package/src/document.ts
CHANGED
|
@@ -25,6 +25,7 @@ import { cutTextSpans } from "./span-cut.ts";
|
|
|
25
25
|
import { markdownFigures } from "./text-figures.ts";
|
|
26
26
|
import { documentMarkup } from "./markup.ts";
|
|
27
27
|
import { BARE_URL } from "./bare-url.ts";
|
|
28
|
+
import { lazyCells, tableCellsOf } from "./table-cells.ts";
|
|
28
29
|
import type { BulletList, LanguageAdapter, Markup, Paragraph, ProseDocument, Sentence, Span, StructureNode, DocumentProfile } from "./plugin.ts";
|
|
29
30
|
|
|
30
31
|
/**
|
|
@@ -355,7 +356,7 @@ const documentOf = (path: string, source: string, adapter: LanguageAdapter, team
|
|
|
355
356
|
markdown,
|
|
356
357
|
profile,
|
|
357
358
|
}));
|
|
358
|
-
|
|
359
|
+
const doc: ProseDocument = {
|
|
359
360
|
path,
|
|
360
361
|
source,
|
|
361
362
|
language: adapter.id,
|
|
@@ -381,7 +382,9 @@ const documentOf = (path: string, source: string, adapter: LanguageAdapter, team
|
|
|
381
382
|
get markup(): Markup {
|
|
382
383
|
return documentMarkup(root, source, markdown, [...emailLayout.replyQuotes, ...syntax]);
|
|
383
384
|
},
|
|
385
|
+
tableCells: lazyCells(() => tableCellsOf(doc, (text) => adapter.segment(text))),
|
|
384
386
|
};
|
|
387
|
+
return doc;
|
|
385
388
|
};
|
|
386
389
|
|
|
387
390
|
/**
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Measured, Tolerance } from "./measures.ts";
|
|
2
|
+
|
|
3
|
+
const HALF = 0.5;
|
|
4
|
+
const DECIMAL_BASE = 10;
|
|
5
|
+
|
|
6
|
+
/** 目安の量(約1.2kg)が言える幅を、基準の単位で。書いた最後の桁の半分(約1.2kg は 1.15〜1.25 kg)。 */
|
|
7
|
+
const writtenHalfStep = (value: Measured): number => {
|
|
8
|
+
const step = HALF * DECIMAL_BASE ** -value.decimals;
|
|
9
|
+
return step * Math.max(...value.factors);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 目安と書いた量を含む二つを比べるときの、合うとみなす差。目安の量は書いた桁までしか言っていないので、その桁の半分までの差は合う。
|
|
14
|
+
* 量の種類ごとの差(tolerance)のほうが広ければ、そちら。
|
|
15
|
+
*/
|
|
16
|
+
export const approximateTolerance = (tolerance: Tolerance, approximate: readonly Measured[]): Tolerance => ({
|
|
17
|
+
relative: tolerance.relative,
|
|
18
|
+
absolute: Math.max(tolerance.absolute, ...approximate.map(writtenHalfStep)),
|
|
19
|
+
});
|