chaffjs 0.31.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +330 -0
- package/README.md +119 -257
- package/dist/company-kana-spelling.d.ts +31 -0
- package/dist/company-kana-spelling.d.ts.map +1 -0
- package/dist/company-kana-spelling.js +79 -0
- package/dist/company-kana-spelling.js.map +1 -0
- package/dist/company-names.d.ts +32 -1
- package/dist/company-names.d.ts.map +1 -1
- package/dist/company-names.js +129 -22
- package/dist/company-names.js.map +1 -1
- package/dist/contacts/table-rows.d.ts +7 -0
- package/dist/contacts/table-rows.d.ts.map +1 -0
- package/dist/contacts/table-rows.js +42 -0
- package/dist/contacts/table-rows.js.map +1 -0
- package/dist/derived/age-on-date.d.ts +53 -0
- package/dist/derived/age-on-date.d.ts.map +1 -0
- package/dist/derived/age-on-date.js +114 -0
- package/dist/derived/age-on-date.js.map +1 -0
- package/dist/derived/durations.d.ts +17 -2
- package/dist/derived/durations.d.ts.map +1 -1
- package/dist/derived/durations.js +61 -10
- package/dist/derived/durations.js.map +1 -1
- package/dist/derived/hours-and-minutes.d.ts +26 -0
- package/dist/derived/hours-and-minutes.d.ts.map +1 -0
- package/dist/derived/hours-and-minutes.js +24 -0
- package/dist/derived/hours-and-minutes.js.map +1 -0
- package/dist/derived/hyphenated-counts.d.ts +15 -0
- package/dist/derived/hyphenated-counts.d.ts.map +1 -0
- package/dist/derived/hyphenated-counts.js +31 -0
- package/dist/derived/hyphenated-counts.js.map +1 -0
- package/dist/derived/marked-dates.d.ts +15 -0
- package/dist/derived/marked-dates.d.ts.map +1 -0
- package/dist/derived/marked-dates.js +41 -0
- package/dist/derived/marked-dates.js.map +1 -0
- package/dist/derived/money-span.d.ts +9 -0
- package/dist/derived/money-span.d.ts.map +1 -0
- package/dist/derived/money-span.js +6 -0
- package/dist/derived/money-span.js.map +1 -0
- package/dist/derived/period-parts.d.ts +55 -0
- package/dist/derived/period-parts.d.ts.map +1 -0
- package/dist/derived/period-parts.js +283 -0
- package/dist/derived/period-parts.js.map +1 -0
- package/dist/derived/readable-date.d.ts +20 -0
- package/dist/derived/readable-date.d.ts.map +1 -0
- package/dist/derived/readable-date.js +50 -0
- package/dist/derived/readable-date.js.map +1 -0
- package/dist/derived/stays.d.ts +3 -1
- package/dist/derived/stays.d.ts.map +1 -1
- package/dist/derived/stays.js +3 -0
- package/dist/derived/stays.js.map +1 -1
- package/dist/derived/timesheet-hours.d.ts +27 -0
- package/dist/derived/timesheet-hours.d.ts.map +1 -0
- package/dist/derived/timesheet-hours.js +86 -0
- package/dist/derived/timesheet-hours.js.map +1 -0
- package/dist/derived/use-maximum.d.ts +27 -0
- package/dist/derived/use-maximum.d.ts.map +1 -0
- package/dist/derived/use-maximum.js +104 -0
- package/dist/derived/use-maximum.js.map +1 -0
- package/dist/derived/working-hours.d.ts +4 -5
- package/dist/derived/working-hours.d.ts.map +1 -1
- package/dist/detectors/annual-holidays-mismatch.d.ts +3 -0
- package/dist/detectors/annual-holidays-mismatch.d.ts.map +1 -0
- package/dist/detectors/annual-holidays-mismatch.js +29 -0
- package/dist/detectors/annual-holidays-mismatch.js.map +1 -0
- package/dist/detectors/annual-pay-mismatch.d.ts +3 -0
- package/dist/detectors/annual-pay-mismatch.d.ts.map +1 -0
- package/dist/detectors/annual-pay-mismatch.js +52 -0
- package/dist/detectors/annual-pay-mismatch.js.map +1 -0
- package/dist/detectors/blank-structure.d.ts +3 -1
- package/dist/detectors/blank-structure.d.ts.map +1 -1
- package/dist/detectors/blank-structure.js +45 -12
- package/dist/detectors/blank-structure.js.map +1 -1
- package/dist/detectors/bmi-mismatch.d.ts +3 -0
- package/dist/detectors/bmi-mismatch.d.ts.map +1 -0
- package/dist/detectors/bmi-mismatch.js +70 -0
- package/dist/detectors/bmi-mismatch.js.map +1 -0
- package/dist/detectors/change-rate.d.ts.map +1 -1
- package/dist/detectors/change-rate.js +24 -9
- package/dist/detectors/change-rate.js.map +1 -1
- package/dist/detectors/closing-balance-mismatch.d.ts +3 -0
- package/dist/detectors/closing-balance-mismatch.d.ts.map +1 -0
- package/dist/detectors/closing-balance-mismatch.js +42 -0
- package/dist/detectors/closing-balance-mismatch.js.map +1 -0
- package/dist/detectors/contact-variant.d.ts.map +1 -1
- package/dist/detectors/contact-variant.js +6 -2
- package/dist/detectors/contact-variant.js.map +1 -1
- package/dist/detectors/cumulative-below-current.d.ts +3 -0
- package/dist/detectors/cumulative-below-current.d.ts.map +1 -0
- package/dist/detectors/cumulative-below-current.js +25 -0
- package/dist/detectors/cumulative-below-current.js.map +1 -0
- package/dist/detectors/currency-column.d.ts +3 -0
- package/dist/detectors/currency-column.d.ts.map +1 -0
- package/dist/detectors/currency-column.js +32 -0
- package/dist/detectors/currency-column.js.map +1 -0
- package/dist/detectors/date-any-year.d.ts +24 -0
- package/dist/detectors/date-any-year.d.ts.map +1 -0
- package/dist/detectors/date-any-year.js +103 -0
- package/dist/detectors/date-any-year.js.map +1 -0
- package/dist/detectors/date-outside-period.d.ts.map +1 -1
- package/dist/detectors/date-outside-period.js +4 -10
- package/dist/detectors/date-outside-period.js.map +1 -1
- package/dist/detectors/date-stamp-order.d.ts.map +1 -1
- package/dist/detectors/date-stamp-order.js +2 -1
- package/dist/detectors/date-stamp-order.js.map +1 -1
- package/dist/detectors/date-year.d.ts +18 -6
- package/dist/detectors/date-year.d.ts.map +1 -1
- package/dist/detectors/date-year.js +39 -11
- package/dist/detectors/date-year.js.map +1 -1
- package/dist/detectors/deductible-exceeds-limit.d.ts +4 -0
- package/dist/detectors/deductible-exceeds-limit.d.ts.map +1 -0
- package/dist/detectors/deductible-exceeds-limit.js +46 -0
- package/dist/detectors/deductible-exceeds-limit.js.map +1 -0
- package/dist/detectors/defined-term-form.d.ts.map +1 -1
- package/dist/detectors/defined-term-form.js +6 -20
- package/dist/detectors/defined-term-form.js.map +1 -1
- package/dist/detectors/derived-numbers.d.ts +4 -3
- package/dist/detectors/derived-numbers.d.ts.map +1 -1
- package/dist/detectors/derived-numbers.js +43 -70
- package/dist/detectors/derived-numbers.js.map +1 -1
- package/dist/detectors/discount-rate.d.ts +3 -0
- package/dist/detectors/discount-rate.d.ts.map +1 -0
- package/dist/detectors/discount-rate.js +35 -0
- package/dist/detectors/discount-rate.js.map +1 -0
- package/dist/detectors/due-date.d.ts.map +1 -1
- package/dist/detectors/due-date.js +11 -4
- package/dist/detectors/due-date.js.map +1 -1
- package/dist/detectors/email-letter.d.ts +10 -2
- package/dist/detectors/email-letter.d.ts.map +1 -1
- package/dist/detectors/email-letter.js +24 -5
- package/dist/detectors/email-letter.js.map +1 -1
- package/dist/detectors/event-deadline.d.ts.map +1 -1
- package/dist/detectors/event-deadline.js +11 -2
- package/dist/detectors/event-deadline.js.map +1 -1
- package/dist/detectors/fact-consistency.d.ts.map +1 -1
- package/dist/detectors/fact-consistency.js +112 -5
- package/dist/detectors/fact-consistency.js.map +1 -1
- package/dist/detectors/gloss-year.d.ts +11 -0
- package/dist/detectors/gloss-year.d.ts.map +1 -0
- package/dist/detectors/gloss-year.js +14 -0
- package/dist/detectors/gloss-year.js.map +1 -0
- package/dist/detectors/gpa-mismatch.d.ts +3 -0
- package/dist/detectors/gpa-mismatch.d.ts.map +1 -0
- package/dist/detectors/gpa-mismatch.js +39 -0
- package/dist/detectors/gpa-mismatch.js.map +1 -0
- package/dist/detectors/impossible-date.d.ts.map +1 -1
- package/dist/detectors/impossible-date.js +22 -6
- package/dist/detectors/impossible-date.js.map +1 -1
- package/dist/detectors/installment-total-mismatch.d.ts +3 -0
- package/dist/detectors/installment-total-mismatch.d.ts.map +1 -0
- package/dist/detectors/installment-total-mismatch.js +49 -0
- package/dist/detectors/installment-total-mismatch.js.map +1 -0
- package/dist/detectors/interest.d.ts +3 -0
- package/dist/detectors/interest.d.ts.map +1 -0
- package/dist/detectors/interest.js +38 -0
- package/dist/detectors/interest.js.map +1 -0
- package/dist/detectors/lab-columns.d.ts +4 -0
- package/dist/detectors/lab-columns.d.ts.map +1 -0
- package/dist/detectors/lab-columns.js +3 -0
- package/dist/detectors/lab-columns.js.map +1 -0
- package/dist/detectors/labelled-age.d.ts +4 -0
- package/dist/detectors/labelled-age.d.ts.map +1 -0
- package/dist/detectors/labelled-age.js +110 -0
- package/dist/detectors/labelled-age.js.map +1 -0
- package/dist/detectors/line-amount.d.ts.map +1 -1
- package/dist/detectors/line-amount.js +45 -2
- package/dist/detectors/line-amount.js.map +1 -1
- package/dist/detectors/measured-facts.d.ts +1 -1
- package/dist/detectors/measured-facts.d.ts.map +1 -1
- package/dist/detectors/measured-facts.js.map +1 -1
- package/dist/detectors/meter-usage.d.ts +3 -0
- package/dist/detectors/meter-usage.d.ts.map +1 -0
- package/dist/detectors/meter-usage.js +37 -0
- package/dist/detectors/meter-usage.js.map +1 -0
- package/dist/detectors/name-field.d.ts +13 -0
- package/dist/detectors/name-field.d.ts.map +1 -0
- package/dist/detectors/name-field.js +38 -0
- package/dist/detectors/name-field.js.map +1 -0
- package/dist/detectors/name-variant.d.ts.map +1 -1
- package/dist/detectors/name-variant.js +128 -14
- package/dist/detectors/name-variant.js.map +1 -1
- package/dist/detectors/net-amount-mismatch.d.ts +10 -0
- package/dist/detectors/net-amount-mismatch.d.ts.map +1 -0
- package/dist/detectors/net-amount-mismatch.js +70 -0
- package/dist/detectors/net-amount-mismatch.js.map +1 -0
- package/dist/detectors/net-gross-weight.d.ts +3 -0
- package/dist/detectors/net-gross-weight.d.ts.map +1 -0
- package/dist/detectors/net-gross-weight.js +35 -0
- package/dist/detectors/net-gross-weight.js.map +1 -0
- package/dist/detectors/nominal-step.d.ts +3 -0
- package/dist/detectors/nominal-step.d.ts.map +1 -0
- package/dist/detectors/nominal-step.js +28 -0
- package/dist/detectors/nominal-step.js.map +1 -0
- package/dist/detectors/number-style.d.ts +2 -0
- package/dist/detectors/number-style.d.ts.map +1 -1
- package/dist/detectors/number-style.js +8 -2
- package/dist/detectors/number-style.js.map +1 -1
- package/dist/detectors/order-quantity.d.ts +10 -0
- package/dist/detectors/order-quantity.d.ts.map +1 -0
- package/dist/detectors/order-quantity.js +35 -0
- package/dist/detectors/order-quantity.js.map +1 -0
- package/dist/detectors/orthographic-variant.d.ts.map +1 -1
- package/dist/detectors/orthographic-variant.js +35 -10
- package/dist/detectors/orthographic-variant.js.map +1 -1
- package/dist/detectors/orthography.d.ts.map +1 -1
- package/dist/detectors/orthography.js +15 -7
- package/dist/detectors/orthography.js.map +1 -1
- package/dist/detectors/period-label-conflict.d.ts +4 -0
- package/dist/detectors/period-label-conflict.d.ts.map +1 -0
- package/dist/detectors/period-label-conflict.js +34 -0
- package/dist/detectors/period-label-conflict.js.map +1 -0
- package/dist/detectors/period-multiple-mismatch.d.ts +3 -0
- package/dist/detectors/period-multiple-mismatch.d.ts.map +1 -0
- package/dist/detectors/period-multiple-mismatch.js +36 -0
- package/dist/detectors/period-multiple-mismatch.js.map +1 -0
- package/dist/detectors/period-part.d.ts +4 -0
- package/dist/detectors/period-part.d.ts.map +1 -0
- package/dist/detectors/period-part.js +58 -0
- package/dist/detectors/period-part.js.map +1 -0
- package/dist/detectors/range-words.d.ts +5 -0
- package/dist/detectors/range-words.d.ts.map +1 -0
- package/dist/detectors/range-words.js +14 -0
- package/dist/detectors/range-words.js.map +1 -0
- package/dist/detectors/ratio-mismatch.d.ts +7 -0
- package/dist/detectors/ratio-mismatch.d.ts.map +1 -0
- package/dist/detectors/ratio-mismatch.js +89 -0
- package/dist/detectors/ratio-mismatch.js.map +1 -0
- package/dist/detectors/readable-dates.d.ts +9 -0
- package/dist/detectors/readable-dates.d.ts.map +1 -0
- package/dist/detectors/readable-dates.js +23 -0
- package/dist/detectors/readable-dates.js.map +1 -0
- package/dist/detectors/reference-flag.d.ts +3 -0
- package/dist/detectors/reference-flag.d.ts.map +1 -0
- package/dist/detectors/reference-flag.js +31 -0
- package/dist/detectors/reference-flag.js.map +1 -0
- package/dist/detectors/reference-number-repeated.d.ts +3 -0
- package/dist/detectors/reference-number-repeated.d.ts.map +1 -0
- package/dist/detectors/reference-number-repeated.js +22 -0
- package/dist/detectors/reference-number-repeated.js.map +1 -0
- package/dist/detectors/reference-number-variant.d.ts +3 -0
- package/dist/detectors/reference-number-variant.d.ts.map +1 -0
- package/dist/detectors/reference-number-variant.js +40 -0
- package/dist/detectors/reference-number-variant.js.map +1 -0
- package/dist/detectors/reference-unit.d.ts +3 -0
- package/dist/detectors/reference-unit.d.ts.map +1 -0
- package/dist/detectors/reference-unit.js +19 -0
- package/dist/detectors/reference-unit.js.map +1 -0
- package/dist/detectors/registry/annual-holidays-mismatch.d.ts +3 -0
- package/dist/detectors/registry/annual-holidays-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/annual-holidays-mismatch.js +3 -0
- package/dist/detectors/registry/annual-holidays-mismatch.js.map +1 -0
- package/dist/detectors/registry/annual-pay-mismatch.d.ts +3 -0
- package/dist/detectors/registry/annual-pay-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/annual-pay-mismatch.js +3 -0
- package/dist/detectors/registry/annual-pay-mismatch.js.map +1 -0
- package/dist/detectors/registry/backorder-mismatch.d.ts +3 -0
- package/dist/detectors/registry/backorder-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/backorder-mismatch.js +3 -0
- package/dist/detectors/registry/backorder-mismatch.js.map +1 -0
- package/dist/detectors/registry/bmi-mismatch.d.ts +3 -0
- package/dist/detectors/registry/bmi-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/bmi-mismatch.js +3 -0
- package/dist/detectors/registry/bmi-mismatch.js.map +1 -0
- package/dist/detectors/registry/closing-balance-mismatch.d.ts +3 -0
- package/dist/detectors/registry/closing-balance-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/closing-balance-mismatch.js +3 -0
- package/dist/detectors/registry/closing-balance-mismatch.js.map +1 -0
- package/dist/detectors/registry/cumulative-below-current.d.ts +3 -0
- package/dist/detectors/registry/cumulative-below-current.d.ts.map +1 -0
- package/dist/detectors/registry/cumulative-below-current.js +3 -0
- package/dist/detectors/registry/cumulative-below-current.js.map +1 -0
- package/dist/detectors/registry/currency-column-mix.d.ts +3 -0
- package/dist/detectors/registry/currency-column-mix.d.ts.map +1 -0
- package/dist/detectors/registry/currency-column-mix.js +3 -0
- package/dist/detectors/registry/currency-column-mix.js.map +1 -0
- package/dist/detectors/registry/deductible-exceeds-limit.d.ts +3 -0
- package/dist/detectors/registry/deductible-exceeds-limit.d.ts.map +1 -0
- package/dist/detectors/registry/deductible-exceeds-limit.js +3 -0
- package/dist/detectors/registry/deductible-exceeds-limit.js.map +1 -0
- package/dist/detectors/registry/delivered-over-ordered.d.ts +3 -0
- package/dist/detectors/registry/delivered-over-ordered.d.ts.map +1 -0
- package/dist/detectors/registry/delivered-over-ordered.js +3 -0
- package/dist/detectors/registry/delivered-over-ordered.js.map +1 -0
- package/dist/detectors/registry/discount-rate.d.ts +3 -0
- package/dist/detectors/registry/discount-rate.d.ts.map +1 -0
- package/dist/detectors/registry/discount-rate.js +3 -0
- package/dist/detectors/registry/discount-rate.js.map +1 -0
- package/dist/detectors/registry/elapsed-years-mismatch.js +1 -1
- package/dist/detectors/registry/elapsed-years-mismatch.js.map +1 -1
- package/dist/detectors/registry/gpa-mismatch.d.ts +3 -0
- package/dist/detectors/registry/gpa-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/gpa-mismatch.js +3 -0
- package/dist/detectors/registry/gpa-mismatch.js.map +1 -0
- package/dist/detectors/registry/installment-total-mismatch.d.ts +3 -0
- package/dist/detectors/registry/installment-total-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/installment-total-mismatch.js +3 -0
- package/dist/detectors/registry/installment-total-mismatch.js.map +1 -0
- package/dist/detectors/registry/interest.d.ts +3 -0
- package/dist/detectors/registry/interest.d.ts.map +1 -0
- package/dist/detectors/registry/interest.js +3 -0
- package/dist/detectors/registry/interest.js.map +1 -0
- package/dist/detectors/registry/meter-usage.d.ts +3 -0
- package/dist/detectors/registry/meter-usage.d.ts.map +1 -0
- package/dist/detectors/registry/meter-usage.js +3 -0
- package/dist/detectors/registry/meter-usage.js.map +1 -0
- package/dist/detectors/registry/net-amount-mismatch.d.ts +3 -0
- package/dist/detectors/registry/net-amount-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/net-amount-mismatch.js +3 -0
- package/dist/detectors/registry/net-amount-mismatch.js.map +1 -0
- package/dist/detectors/registry/net-over-gross.d.ts +3 -0
- package/dist/detectors/registry/net-over-gross.d.ts.map +1 -0
- package/dist/detectors/registry/net-over-gross.js +3 -0
- package/dist/detectors/registry/net-over-gross.js.map +1 -0
- package/dist/detectors/registry/period-label-conflict.d.ts +3 -0
- package/dist/detectors/registry/period-label-conflict.d.ts.map +1 -0
- package/dist/detectors/registry/period-label-conflict.js +3 -0
- package/dist/detectors/registry/period-label-conflict.js.map +1 -0
- package/dist/detectors/registry/period-multiple-mismatch.d.ts +3 -0
- package/dist/detectors/registry/period-multiple-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/period-multiple-mismatch.js +3 -0
- package/dist/detectors/registry/period-multiple-mismatch.js.map +1 -0
- package/dist/detectors/registry/period-part-exceeds-whole.d.ts +3 -0
- package/dist/detectors/registry/period-part-exceeds-whole.d.ts.map +1 -0
- package/dist/detectors/registry/period-part-exceeds-whole.js +3 -0
- package/dist/detectors/registry/period-part-exceeds-whole.js.map +1 -0
- package/dist/detectors/registry/product-exceeds-maximum.d.ts +3 -0
- package/dist/detectors/registry/product-exceeds-maximum.d.ts.map +1 -0
- package/dist/detectors/registry/product-exceeds-maximum.js +3 -0
- package/dist/detectors/registry/product-exceeds-maximum.js.map +1 -0
- package/dist/detectors/registry/ratio-mismatch.d.ts +3 -0
- package/dist/detectors/registry/ratio-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/ratio-mismatch.js +3 -0
- package/dist/detectors/registry/ratio-mismatch.js.map +1 -0
- package/dist/detectors/registry/reference-flag-mismatch.d.ts +3 -0
- package/dist/detectors/registry/reference-flag-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/reference-flag-mismatch.js +3 -0
- package/dist/detectors/registry/reference-flag-mismatch.js.map +1 -0
- package/dist/detectors/registry/reference-number-repeated.d.ts +3 -0
- package/dist/detectors/registry/reference-number-repeated.d.ts.map +1 -0
- package/dist/detectors/registry/reference-number-repeated.js +3 -0
- package/dist/detectors/registry/reference-number-repeated.js.map +1 -0
- package/dist/detectors/registry/reference-number-variant.d.ts +3 -0
- package/dist/detectors/registry/reference-number-variant.d.ts.map +1 -0
- package/dist/detectors/registry/reference-number-variant.js +3 -0
- package/dist/detectors/registry/reference-number-variant.js.map +1 -0
- package/dist/detectors/registry/reference-unit.d.ts +3 -0
- package/dist/detectors/registry/reference-unit.d.ts.map +1 -0
- package/dist/detectors/registry/reference-unit.js +3 -0
- package/dist/detectors/registry/reference-unit.js.map +1 -0
- package/dist/detectors/registry/revision-direction.d.ts +3 -0
- package/dist/detectors/registry/revision-direction.d.ts.map +1 -0
- package/dist/detectors/registry/revision-direction.js +3 -0
- package/dist/detectors/registry/revision-direction.js.map +1 -0
- package/dist/detectors/registry/running-balance.d.ts +3 -0
- package/dist/detectors/registry/running-balance.d.ts.map +1 -0
- package/dist/detectors/registry/running-balance.js +3 -0
- package/dist/detectors/registry/running-balance.js.map +1 -0
- package/dist/detectors/registry/serial-range.d.ts +3 -0
- package/dist/detectors/registry/serial-range.d.ts.map +1 -0
- package/dist/detectors/registry/serial-range.js +3 -0
- package/dist/detectors/registry/serial-range.js.map +1 -0
- package/dist/detectors/registry/share-amount.d.ts +3 -0
- package/dist/detectors/registry/share-amount.d.ts.map +1 -0
- package/dist/detectors/registry/share-amount.js +3 -0
- package/dist/detectors/registry/share-amount.js.map +1 -0
- package/dist/detectors/registry/table-unit-mix.d.ts +3 -0
- package/dist/detectors/registry/table-unit-mix.d.ts.map +1 -0
- package/dist/detectors/registry/table-unit-mix.js +3 -0
- package/dist/detectors/registry/table-unit-mix.js.map +1 -0
- package/dist/detectors/registry/tier-threshold.d.ts +3 -0
- package/dist/detectors/registry/tier-threshold.d.ts.map +1 -0
- package/dist/detectors/registry/tier-threshold.js +3 -0
- package/dist/detectors/registry/tier-threshold.js.map +1 -0
- package/dist/detectors/registry/variance-mismatch.d.ts +3 -0
- package/dist/detectors/registry/variance-mismatch.d.ts.map +1 -0
- package/dist/detectors/registry/variance-mismatch.js +3 -0
- package/dist/detectors/registry/variance-mismatch.js.map +1 -0
- package/dist/detectors/relative-dates.d.ts.map +1 -1
- package/dist/detectors/relative-dates.js +2 -1
- package/dist/detectors/relative-dates.js.map +1 -1
- package/dist/detectors/relative-day-words.d.ts.map +1 -1
- package/dist/detectors/relative-day-words.js +2 -1
- package/dist/detectors/relative-day-words.js.map +1 -1
- package/dist/detectors/rent-multiple-mismatch.d.ts.map +1 -1
- package/dist/detectors/rent-multiple-mismatch.js.map +1 -1
- package/dist/detectors/request-owner.d.ts +3 -1
- package/dist/detectors/request-owner.d.ts.map +1 -1
- package/dist/detectors/request-owner.js +5 -2
- package/dist/detectors/request-owner.js.map +1 -1
- package/dist/detectors/revision-direction.d.ts +3 -0
- package/dist/detectors/revision-direction.d.ts.map +1 -0
- package/dist/detectors/revision-direction.js +32 -0
- package/dist/detectors/revision-direction.js.map +1 -0
- package/dist/detectors/row-sentence-amounts.d.ts +5 -0
- package/dist/detectors/row-sentence-amounts.d.ts.map +1 -0
- package/dist/detectors/row-sentence-amounts.js +71 -0
- package/dist/detectors/row-sentence-amounts.js.map +1 -0
- package/dist/detectors/running-balance.d.ts +3 -0
- package/dist/detectors/running-balance.d.ts.map +1 -0
- package/dist/detectors/running-balance.js +26 -0
- package/dist/detectors/running-balance.js.map +1 -0
- package/dist/detectors/scaled-quantity.js +1 -1
- package/dist/detectors/scaled-quantity.js.map +1 -1
- package/dist/detectors/serial-range.d.ts +3 -0
- package/dist/detectors/serial-range.d.ts.map +1 -0
- package/dist/detectors/serial-range.js +29 -0
- package/dist/detectors/serial-range.js.map +1 -0
- package/dist/detectors/share-amount.d.ts +3 -0
- package/dist/detectors/share-amount.d.ts.map +1 -0
- package/dist/detectors/share-amount.js +45 -0
- package/dist/detectors/share-amount.js.map +1 -0
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +42 -10
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/table-scale.d.ts +3 -0
- package/dist/detectors/table-scale.d.ts.map +1 -0
- package/dist/detectors/table-scale.js +32 -0
- package/dist/detectors/table-scale.js.map +1 -0
- package/dist/detectors/tax-amount.d.ts.map +1 -1
- package/dist/detectors/tax-amount.js +34 -10
- package/dist/detectors/tax-amount.js.map +1 -1
- package/dist/detectors/technical-docs.d.ts +1 -1
- package/dist/detectors/technical-docs.d.ts.map +1 -1
- package/dist/detectors/technical-docs.js +3 -2
- package/dist/detectors/technical-docs.js.map +1 -1
- package/dist/detectors/tier-threshold.d.ts +3 -0
- package/dist/detectors/tier-threshold.d.ts.map +1 -0
- package/dist/detectors/tier-threshold.js +86 -0
- package/dist/detectors/tier-threshold.js.map +1 -0
- package/dist/detectors/time-order.d.ts +1 -0
- package/dist/detectors/time-order.d.ts.map +1 -1
- package/dist/detectors/time-order.js +43 -13
- package/dist/detectors/time-order.js.map +1 -1
- package/dist/detectors/use-maximum.d.ts +3 -0
- package/dist/detectors/use-maximum.d.ts.map +1 -0
- package/dist/detectors/use-maximum.js +32 -0
- package/dist/detectors/use-maximum.js.map +1 -0
- package/dist/detectors/variance.d.ts +3 -0
- package/dist/detectors/variance.d.ts.map +1 -0
- package/dist/detectors/variance.js +28 -0
- package/dist/detectors/variance.js.map +1 -0
- package/dist/detectors/whole-count-findings.d.ts +4 -0
- package/dist/detectors/whole-count-findings.d.ts.map +1 -0
- package/dist/detectors/whole-count-findings.js +38 -0
- package/dist/detectors/whole-count-findings.js.map +1 -0
- package/dist/detectors/working-hours-findings.d.ts +9 -0
- package/dist/detectors/working-hours-findings.d.ts.map +1 -0
- package/dist/detectors/working-hours-findings.js +79 -0
- package/dist/detectors/working-hours-findings.js.map +1 -0
- package/dist/facts/age-values.d.ts +22 -0
- package/dist/facts/age-values.d.ts.map +1 -0
- package/dist/facts/age-values.js +76 -0
- package/dist/facts/age-values.js.map +1 -0
- package/dist/facts/cell-keys.d.ts +12 -0
- package/dist/facts/cell-keys.d.ts.map +1 -0
- package/dist/facts/cell-keys.js +19 -0
- package/dist/facts/cell-keys.js.map +1 -0
- package/dist/facts/count-labels.d.ts +15 -0
- package/dist/facts/count-labels.d.ts.map +1 -0
- package/dist/facts/count-labels.js +19 -0
- package/dist/facts/count-labels.js.map +1 -0
- package/dist/facts/document-terms.d.ts +43 -0
- package/dist/facts/document-terms.d.ts.map +1 -0
- package/dist/facts/document-terms.js +74 -0
- package/dist/facts/document-terms.js.map +1 -0
- package/dist/facts/duration-scale.d.ts +11 -0
- package/dist/facts/duration-scale.d.ts.map +1 -0
- package/dist/facts/duration-scale.js +14 -0
- package/dist/facts/duration-scale.js.map +1 -0
- package/dist/facts/duration-values.d.ts +15 -0
- package/dist/facts/duration-values.d.ts.map +1 -0
- package/dist/facts/duration-values.js +29 -0
- package/dist/facts/duration-values.js.map +1 -0
- package/dist/facts/fact-values.d.ts +9 -1
- package/dist/facts/fact-values.d.ts.map +1 -1
- package/dist/facts/fact-values.js +19 -6
- package/dist/facts/fact-values.js.map +1 -1
- package/dist/facts/labelled-facts.d.ts +15 -1
- package/dist/facts/labelled-facts.d.ts.map +1 -1
- package/dist/facts/labelled-facts.js +51 -8
- package/dist/facts/labelled-facts.js.map +1 -1
- package/dist/facts/measure-units.d.ts.map +1 -1
- package/dist/facts/measure-units.js +23 -8
- package/dist/facts/measure-units.js.map +1 -1
- package/dist/facts/measures.js +11 -9
- package/dist/facts/measures.js.map +1 -1
- package/dist/facts/qualified-labels.d.ts +28 -0
- package/dist/facts/qualified-labels.d.ts.map +1 -0
- package/dist/facts/qualified-labels.js +96 -0
- package/dist/facts/qualified-labels.js.map +1 -0
- package/dist/facts/rate-values.d.ts +40 -0
- package/dist/facts/rate-values.d.ts.map +1 -0
- package/dist/facts/rate-values.js +68 -0
- package/dist/facts/rate-values.js.map +1 -0
- package/dist/facts/row-sentence-amounts.d.ts +51 -0
- package/dist/facts/row-sentence-amounts.d.ts.map +1 -0
- package/dist/facts/row-sentence-amounts.js +71 -0
- package/dist/facts/row-sentence-amounts.js.map +1 -0
- package/dist/facts/superscript-power.d.ts +3 -0
- package/dist/facts/superscript-power.d.ts.map +1 -0
- package/dist/facts/superscript-power.js +5 -0
- package/dist/facts/superscript-power.js.map +1 -0
- package/dist/facts/table-facts.d.ts +18 -2
- package/dist/facts/table-facts.d.ts.map +1 -1
- package/dist/facts/table-facts.js +16 -6
- package/dist/facts/table-facts.js.map +1 -1
- package/dist/facts/term-values.d.ts +34 -0
- package/dist/facts/term-values.d.ts.map +1 -0
- package/dist/facts/term-values.js +195 -0
- package/dist/facts/term-values.js.map +1 -0
- package/dist/facts/unit-word.d.ts +5 -0
- package/dist/facts/unit-word.d.ts.map +1 -1
- package/dist/facts/unit-word.js +9 -0
- package/dist/facts/unit-word.js.map +1 -1
- package/dist/facts/verb-quantity-facts.d.ts +22 -0
- package/dist/facts/verb-quantity-facts.d.ts.map +1 -0
- package/dist/facts/verb-quantity-facts.js +58 -0
- package/dist/facts/verb-quantity-facts.js.map +1 -0
- package/dist/facts/whole-counts.d.ts +58 -0
- package/dist/facts/whole-counts.d.ts.map +1 -0
- package/dist/facts/whole-counts.js +118 -0
- package/dist/facts/whole-counts.js.map +1 -0
- package/dist/name-char-reading.d.ts +16 -0
- package/dist/name-char-reading.d.ts.map +1 -0
- package/dist/name-char-reading.js +18 -0
- package/dist/name-char-reading.js.map +1 -0
- package/dist/name-line-block.d.ts +6 -0
- package/dist/name-line-block.d.ts.map +1 -0
- package/dist/name-line-block.js +35 -0
- package/dist/name-line-block.js.map +1 -0
- package/dist/name-lookalike-chars.d.ts +16 -0
- package/dist/name-lookalike-chars.d.ts.map +1 -0
- package/dist/name-lookalike-chars.js +41 -0
- package/dist/name-lookalike-chars.js.map +1 -0
- package/dist/name-neighbours.d.ts +7 -0
- package/dist/name-neighbours.d.ts.map +1 -0
- package/dist/name-neighbours.js +55 -0
- package/dist/name-neighbours.js.map +1 -0
- package/dist/name-ordinary-word.d.ts +13 -0
- package/dist/name-ordinary-word.d.ts.map +1 -0
- package/dist/name-ordinary-word.js +54 -0
- package/dist/name-ordinary-word.js.map +1 -0
- package/dist/name-person.d.ts +9 -0
- package/dist/name-person.d.ts.map +1 -0
- package/dist/name-person.js +25 -0
- package/dist/name-person.js.map +1 -0
- package/dist/name-separator.d.ts +14 -0
- package/dist/name-separator.d.ts.map +1 -0
- package/dist/name-separator.js +33 -0
- package/dist/name-separator.js.map +1 -0
- package/dist/name-variants.d.ts +8 -8
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +28 -81
- package/dist/name-variants.js.map +1 -1
- package/dist/name-weight.d.ts +10 -0
- package/dist/name-weight.d.ts.map +1 -0
- package/dist/name-weight.js +7 -0
- package/dist/name-weight.js.map +1 -0
- package/dist/person-field.d.ts +6 -0
- package/dist/person-field.d.ts.map +1 -0
- package/dist/person-field.js +40 -0
- package/dist/person-field.js.map +1 -0
- package/dist/person-full-name.d.ts +12 -0
- package/dist/person-full-name.d.ts.map +1 -0
- package/dist/person-full-name.js +52 -0
- package/dist/person-full-name.js.map +1 -0
- package/dist/phone-numbers.d.ts +23 -3
- package/dist/phone-numbers.d.ts.map +1 -1
- package/dist/phone-numbers.js +49 -21
- package/dist/phone-numbers.js.map +1 -1
- package/dist/plugin.d.ts +2 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/product-names.d.ts +33 -0
- package/dist/product-names.d.ts.map +1 -0
- package/dist/product-names.js +74 -0
- package/dist/product-names.js.map +1 -0
- package/dist/reference-numbers.d.ts +26 -0
- package/dist/reference-numbers.d.ts.map +1 -0
- package/dist/reference-numbers.js +43 -0
- package/dist/reference-numbers.js.map +1 -0
- package/dist/spaced-person-name.d.ts +17 -0
- package/dist/spaced-person-name.d.ts.map +1 -0
- package/dist/spaced-person-name.js +82 -0
- package/dist/spaced-person-name.js.map +1 -0
- package/dist/spacing-code.d.ts +1 -0
- package/dist/spacing-code.d.ts.map +1 -1
- package/dist/spacing-code.js +15 -1
- package/dist/spacing-code.js.map +1 -1
- package/dist/structure/annual-holidays.d.ts +56 -0
- package/dist/structure/annual-holidays.d.ts.map +1 -0
- package/dist/structure/annual-holidays.js +159 -0
- package/dist/structure/annual-holidays.js.map +1 -0
- package/dist/structure/annual-pay.d.ts +97 -0
- package/dist/structure/annual-pay.d.ts.map +1 -0
- package/dist/structure/annual-pay.js +236 -0
- package/dist/structure/annual-pay.js.map +1 -0
- package/dist/structure/bmi.d.ts +63 -0
- package/dist/structure/bmi.d.ts.map +1 -0
- package/dist/structure/bmi.js +106 -0
- package/dist/structure/bmi.js.map +1 -0
- package/dist/structure/change-rate-table.d.ts +46 -0
- package/dist/structure/change-rate-table.d.ts.map +1 -0
- package/dist/structure/change-rate-table.js +110 -0
- package/dist/structure/change-rate-table.js.map +1 -0
- package/dist/structure/change-rate.d.ts +13 -1
- package/dist/structure/change-rate.d.ts.map +1 -1
- package/dist/structure/change-rate.js +51 -19
- package/dist/structure/change-rate.js.map +1 -1
- package/dist/structure/closing-balance.d.ts +24 -0
- package/dist/structure/closing-balance.d.ts.map +1 -0
- package/dist/structure/closing-balance.js +79 -0
- package/dist/structure/closing-balance.js.map +1 -0
- package/dist/structure/column-date-order.d.ts +5 -0
- package/dist/structure/column-date-order.d.ts.map +1 -0
- package/dist/structure/column-date-order.js +57 -0
- package/dist/structure/column-date-order.js.map +1 -0
- package/dist/structure/compound-hours.d.ts +5 -0
- package/dist/structure/compound-hours.d.ts.map +1 -0
- package/dist/structure/compound-hours.js +45 -0
- package/dist/structure/compound-hours.js.map +1 -0
- package/dist/structure/cumulative-below-current.d.ts +21 -0
- package/dist/structure/cumulative-below-current.d.ts.map +1 -0
- package/dist/structure/cumulative-below-current.js +48 -0
- package/dist/structure/cumulative-below-current.js.map +1 -0
- package/dist/structure/currency-column.d.ts +21 -0
- package/dist/structure/currency-column.d.ts.map +1 -0
- package/dist/structure/currency-column.js +74 -0
- package/dist/structure/currency-column.js.map +1 -0
- package/dist/structure/date-deadline-mark.d.ts +15 -0
- package/dist/structure/date-deadline-mark.d.ts.map +1 -0
- package/dist/structure/date-deadline-mark.js +22 -0
- package/dist/structure/date-deadline-mark.js.map +1 -0
- package/dist/structure/date-outside-period.d.ts +5 -1
- package/dist/structure/date-outside-period.d.ts.map +1 -1
- package/dist/structure/date-outside-period.js +13 -9
- package/dist/structure/date-outside-period.js.map +1 -1
- package/dist/structure/date-range.d.ts +2 -1
- package/dist/structure/date-range.d.ts.map +1 -1
- package/dist/structure/date-range.js +4 -6
- package/dist/structure/date-range.js.map +1 -1
- package/dist/structure/deadline-after-event.d.ts +35 -2
- package/dist/structure/deadline-after-event.d.ts.map +1 -1
- package/dist/structure/deadline-after-event.js +77 -6
- package/dist/structure/deadline-after-event.js.map +1 -1
- package/dist/structure/deductible-limit.d.ts +69 -0
- package/dist/structure/deductible-limit.d.ts.map +1 -0
- package/dist/structure/deductible-limit.js +191 -0
- package/dist/structure/deductible-limit.js.map +1 -0
- package/dist/structure/discount-rate.d.ts +35 -0
- package/dist/structure/discount-rate.d.ts.map +1 -0
- package/dist/structure/discount-rate.js +172 -0
- package/dist/structure/discount-rate.js.map +1 -0
- package/dist/structure/generic-role.d.ts +2 -0
- package/dist/structure/generic-role.d.ts.map +1 -0
- package/dist/structure/generic-role.js +8 -0
- package/dist/structure/generic-role.js.map +1 -0
- package/dist/structure/gpa.d.ts +74 -0
- package/dist/structure/gpa.d.ts.map +1 -0
- package/dist/structure/gpa.js +170 -0
- package/dist/structure/gpa.js.map +1 -0
- package/dist/structure/installment-total.d.ts +110 -0
- package/dist/structure/installment-total.d.ts.map +1 -0
- package/dist/structure/installment-total.js +224 -0
- package/dist/structure/installment-total.js.map +1 -0
- package/dist/structure/interest.d.ts +22 -0
- package/dist/structure/interest.d.ts.map +1 -0
- package/dist/structure/interest.js +107 -0
- package/dist/structure/interest.js.map +1 -0
- package/dist/structure/key-value-row.d.ts +14 -0
- package/dist/structure/key-value-row.d.ts.map +1 -0
- package/dist/structure/key-value-row.js +38 -0
- package/dist/structure/key-value-row.js.map +1 -0
- package/dist/structure/lab-columns.d.ts +12 -0
- package/dist/structure/lab-columns.d.ts.map +1 -0
- package/dist/structure/lab-columns.js +11 -0
- package/dist/structure/lab-columns.js.map +1 -0
- package/dist/structure/labelled-date-order.d.ts +33 -16
- package/dist/structure/labelled-date-order.d.ts.map +1 -1
- package/dist/structure/labelled-date-order.js +38 -30
- package/dist/structure/labelled-date-order.js.map +1 -1
- package/dist/structure/labelled-order.d.ts +59 -0
- package/dist/structure/labelled-order.d.ts.map +1 -0
- package/dist/structure/labelled-order.js +65 -0
- package/dist/structure/labelled-order.js.map +1 -0
- package/dist/structure/labelled-time-order.d.ts +17 -0
- package/dist/structure/labelled-time-order.d.ts.map +1 -0
- package/dist/structure/labelled-time-order.js +79 -0
- package/dist/structure/labelled-time-order.js.map +1 -0
- package/dist/structure/line-amount-label.d.ts +31 -0
- package/dist/structure/line-amount-label.d.ts.map +1 -0
- package/dist/structure/line-amount-label.js +77 -0
- package/dist/structure/line-amount-label.js.map +1 -0
- package/dist/structure/line-amount-rate.d.ts +47 -0
- package/dist/structure/line-amount-rate.d.ts.map +1 -0
- package/dist/structure/line-amount-rate.js +141 -0
- package/dist/structure/line-amount-rate.js.map +1 -0
- package/dist/structure/line-amount-unit.d.ts +7 -0
- package/dist/structure/line-amount-unit.d.ts.map +1 -1
- package/dist/structure/line-amount-unit.js +11 -0
- package/dist/structure/line-amount-unit.js.map +1 -1
- package/dist/structure/line-amount.d.ts +33 -7
- package/dist/structure/line-amount.d.ts.map +1 -1
- package/dist/structure/line-amount.js +152 -42
- package/dist/structure/line-amount.js.map +1 -1
- package/dist/structure/meter-usage-read.d.ts +21 -0
- package/dist/structure/meter-usage-read.d.ts.map +1 -0
- package/dist/structure/meter-usage-read.js +116 -0
- package/dist/structure/meter-usage-read.js.map +1 -0
- package/dist/structure/meter-usage.d.ts +62 -0
- package/dist/structure/meter-usage.d.ts.map +1 -0
- package/dist/structure/meter-usage.js +157 -0
- package/dist/structure/meter-usage.js.map +1 -0
- package/dist/structure/net-amount.d.ts +81 -0
- package/dist/structure/net-amount.d.ts.map +1 -0
- package/dist/structure/net-amount.js +161 -0
- package/dist/structure/net-amount.js.map +1 -0
- package/dist/structure/net-gross-weight.d.ts +30 -0
- package/dist/structure/net-gross-weight.d.ts.map +1 -0
- package/dist/structure/net-gross-weight.js +79 -0
- package/dist/structure/net-gross-weight.js.map +1 -0
- package/dist/structure/order-quantity.d.ts +38 -0
- package/dist/structure/order-quantity.d.ts.map +1 -0
- package/dist/structure/order-quantity.js +104 -0
- package/dist/structure/order-quantity.js.map +1 -0
- package/dist/structure/party-role.d.ts.map +1 -1
- package/dist/structure/party-role.js +4 -1
- package/dist/structure/party-role.js.map +1 -1
- package/dist/structure/percent-sum.d.ts +2 -0
- package/dist/structure/percent-sum.d.ts.map +1 -1
- package/dist/structure/percent-sum.js +2 -0
- package/dist/structure/percent-sum.js.map +1 -1
- package/dist/structure/period-label-conflict.d.ts +52 -0
- package/dist/structure/period-label-conflict.d.ts.map +1 -0
- package/dist/structure/period-label-conflict.js +105 -0
- package/dist/structure/period-label-conflict.js.map +1 -0
- package/dist/structure/period-labels.d.ts +36 -0
- package/dist/structure/period-labels.d.ts.map +1 -0
- package/dist/structure/period-labels.js +86 -0
- package/dist/structure/period-labels.js.map +1 -0
- package/dist/structure/period-multiple.d.ts +46 -0
- package/dist/structure/period-multiple.d.ts.map +1 -0
- package/dist/structure/period-multiple.js +123 -0
- package/dist/structure/period-multiple.js.map +1 -0
- package/dist/structure/quantity-range.d.ts.map +1 -1
- package/dist/structure/quantity-range.js +1 -5
- package/dist/structure/quantity-range.js.map +1 -1
- package/dist/structure/range-bands.d.ts +2 -0
- package/dist/structure/range-bands.d.ts.map +1 -1
- package/dist/structure/range-bands.js +1 -1
- package/dist/structure/range-bands.js.map +1 -1
- package/dist/structure/range-years.d.ts +18 -0
- package/dist/structure/range-years.d.ts.map +1 -0
- package/dist/structure/range-years.js +60 -0
- package/dist/structure/range-years.js.map +1 -0
- package/dist/structure/ratio.d.ts +136 -0
- package/dist/structure/ratio.d.ts.map +1 -0
- package/dist/structure/ratio.js +214 -0
- package/dist/structure/ratio.js.map +1 -0
- package/dist/structure/reference-flags.d.ts +55 -0
- package/dist/structure/reference-flags.d.ts.map +1 -0
- package/dist/structure/reference-flags.js +116 -0
- package/dist/structure/reference-flags.js.map +1 -0
- package/dist/structure/reference-number-repeated.d.ts +12 -0
- package/dist/structure/reference-number-repeated.d.ts.map +1 -0
- package/dist/structure/reference-number-repeated.js +43 -0
- package/dist/structure/reference-number-repeated.js.map +1 -0
- package/dist/structure/reference-unit.d.ts +24 -0
- package/dist/structure/reference-unit.d.ts.map +1 -0
- package/dist/structure/reference-unit.js +80 -0
- package/dist/structure/reference-unit.js.map +1 -0
- package/dist/structure/rent-multiple.d.ts +2 -22
- package/dist/structure/rent-multiple.d.ts.map +1 -1
- package/dist/structure/rent-multiple.js +2 -49
- package/dist/structure/rent-multiple.js.map +1 -1
- package/dist/structure/revision-direction.d.ts +51 -0
- package/dist/structure/revision-direction.d.ts.map +1 -0
- package/dist/structure/revision-direction.js +163 -0
- package/dist/structure/revision-direction.js.map +1 -0
- package/dist/structure/running-balance.d.ts +36 -0
- package/dist/structure/running-balance.d.ts.map +1 -0
- package/dist/structure/running-balance.js +126 -0
- package/dist/structure/running-balance.js.map +1 -0
- package/dist/structure/scaled-quantities.d.ts +1 -1
- package/dist/structure/scaled-quantities.d.ts.map +1 -1
- package/dist/structure/scaled-quantities.js +23 -6
- package/dist/structure/scaled-quantities.js.map +1 -1
- package/dist/structure/serial-range.d.ts +9 -0
- package/dist/structure/serial-range.d.ts.map +1 -0
- package/dist/structure/serial-range.js +41 -0
- package/dist/structure/serial-range.js.map +1 -0
- package/dist/structure/share-amount.d.ts +55 -0
- package/dist/structure/share-amount.d.ts.map +1 -0
- package/dist/structure/share-amount.js +162 -0
- package/dist/structure/share-amount.js.map +1 -0
- package/dist/structure/shift-times.d.ts +32 -0
- package/dist/structure/shift-times.d.ts.map +1 -0
- package/dist/structure/shift-times.js +112 -0
- package/dist/structure/shift-times.js.map +1 -0
- package/dist/structure/span-label.d.ts +3 -0
- package/dist/structure/span-label.d.ts.map +1 -0
- package/dist/structure/span-label.js +27 -0
- package/dist/structure/span-label.js.map +1 -0
- package/dist/structure/stated-multiple.d.ts +39 -0
- package/dist/structure/stated-multiple.d.ts.map +1 -0
- package/dist/structure/stated-multiple.js +49 -0
- package/dist/structure/stated-multiple.js.map +1 -0
- package/dist/structure/stated-period.d.ts +3 -2
- package/dist/structure/stated-period.d.ts.map +1 -1
- package/dist/structure/stated-period.js +17 -11
- package/dist/structure/stated-period.js.map +1 -1
- package/dist/structure/table-scale.d.ts +45 -0
- package/dist/structure/table-scale.d.ts.map +1 -0
- package/dist/structure/table-scale.js +188 -0
- package/dist/structure/table-scale.js.map +1 -0
- package/dist/structure/tax-price.d.ts +29 -0
- package/dist/structure/tax-price.d.ts.map +1 -0
- package/dist/structure/tax-price.js +112 -0
- package/dist/structure/tax-price.js.map +1 -0
- package/dist/structure/tax.d.ts +2 -0
- package/dist/structure/tax.d.ts.map +1 -1
- package/dist/structure/tax.js +46 -23
- package/dist/structure/tax.js.map +1 -1
- package/dist/structure/tier-threshold.d.ts +65 -0
- package/dist/structure/tier-threshold.d.ts.map +1 -0
- package/dist/structure/tier-threshold.js +170 -0
- package/dist/structure/tier-threshold.js.map +1 -0
- package/dist/structure/time-range.d.ts +2 -0
- package/dist/structure/time-range.d.ts.map +1 -1
- package/dist/structure/time-range.js +7 -2
- package/dist/structure/time-range.js.map +1 -1
- package/dist/structure/total-line.d.ts +34 -2
- package/dist/structure/total-line.d.ts.map +1 -1
- package/dist/structure/total-line.js +124 -3
- package/dist/structure/total-line.js.map +1 -1
- package/dist/structure/total-row-blank.d.ts +10 -0
- package/dist/structure/total-row-blank.d.ts.map +1 -0
- package/dist/structure/total-row-blank.js +15 -0
- package/dist/structure/total-row-blank.js.map +1 -0
- package/dist/structure/total.d.ts +13 -3
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +80 -7
- package/dist/structure/total.js.map +1 -1
- package/dist/structure/variance-table.d.ts +34 -0
- package/dist/structure/variance-table.d.ts.map +1 -0
- package/dist/structure/variance-table.js +130 -0
- package/dist/structure/variance-table.js.map +1 -0
- package/dist/table-names.d.ts +4 -3
- package/dist/table-names.d.ts.map +1 -1
- package/dist/table-names.js +6 -6
- package/dist/table-names.js.map +1 -1
- package/dist/unlabelled-references.d.ts +16 -0
- package/dist/unlabelled-references.d.ts.map +1 -0
- package/dist/unlabelled-references.js +73 -0
- package/dist/unlabelled-references.js.map +1 -0
- package/dist/vehicle-plates.d.ts +28 -0
- package/dist/vehicle-plates.d.ts.map +1 -0
- package/dist/vehicle-plates.js +116 -0
- package/dist/vehicle-plates.js.map +1 -0
- package/dist/whole-word-runs.d.ts +24 -0
- package/dist/whole-word-runs.d.ts.map +1 -0
- package/dist/whole-word-runs.js +26 -0
- package/dist/whole-word-runs.js.map +1 -0
- package/package.json +4 -3
- package/rules/absolute-exception.yaml +1 -1
- package/rules/ai-generated-composite.yaml +1 -1
- package/rules/ai-tell.yaml +1 -1
- package/rules/amount-range-reversed.yaml +1 -1
- package/rules/amount-scale-consistency.yaml +1 -1
- package/rules/announcing-opener.yaml +1 -1
- package/rules/annual-holidays-mismatch.yaml +65 -0
- package/rules/annual-pay-mismatch.yaml +64 -0
- package/rules/article-sound.yaml +1 -1
- package/rules/assistant-residue.yaml +1 -1
- package/rules/attachment-not-attached.yaml +1 -1
- package/rules/backorder-mismatch.yaml +57 -0
- package/rules/bmi-mismatch.yaml +63 -0
- package/rules/bold-label-list.yaml +1 -1
- package/rules/broken-link.yaml +1 -1
- package/rules/capacity-runtime-mismatch.yaml +1 -1
- package/rules/change-rate-mismatch.yaml +6 -6
- package/rules/chat-citation-residue.yaml +2 -2
- package/rules/cliche.yaml +2 -2
- package/rules/closing-balance-mismatch.yaml +63 -0
- package/rules/colon-lead-in.yaml +1 -1
- package/rules/comparative-without-baseline.yaml +1 -1
- package/rules/concrete-evidence-density.yaml +1 -1
- package/rules/connection-time-short.yaml +1 -1
- package/rules/contact-variant.yaml +4 -4
- package/rules/contrast-framing.yaml +2 -2
- package/rules/cross-doc-broken-link.yaml +1 -1
- package/rules/cross-doc-fact-conflict.yaml +1 -1
- package/rules/cross-doc-term-variant.yaml +1 -1
- package/rules/cumulative-below-current.yaml +59 -0
- package/rules/currency-column-mix.yaml +70 -0
- package/rules/currency-notation-consistency.yaml +2 -2
- package/rules/cushion-phrase-density.yaml +1 -1
- package/rules/dangling-participle.yaml +2 -2
- package/rules/dangling-reference.yaml +1 -1
- package/rules/date-format-consistency.yaml +1 -1
- package/rules/date-outside-period.yaml +5 -5
- package/rules/date-range-reversed.yaml +2 -2
- package/rules/date-stamp-order.yaml +2 -2
- package/rules/date-without-year.yaml +12 -12
- package/rules/deadline-after-event.yaml +11 -6
- package/rules/deductible-exceeds-limit.yaml +54 -0
- package/rules/defined-name-repeated.yaml +3 -3
- package/rules/defined-term-form.yaml +2 -2
- package/rules/delivered-over-ordered.yaml +57 -0
- package/rules/demonstrative-opener-run.yaml +1 -1
- package/rules/discount-rate-mismatch.yaml +66 -0
- package/rules/due-before-issue.yaml +33 -12
- package/rules/duration-mismatch.yaml +16 -7
- package/rules/duration-product-mismatch.yaml +11 -3
- package/rules/elapsed-years-mismatch.yaml +11 -6
- package/rules/email-greeting-closing.yaml +2 -2
- package/rules/empty-conclusion.yaml +1 -1
- package/rules/empty-intensifier.yaml +1 -1
- package/rules/empty-list-item.yaml +1 -1
- package/rules/empty-section.yaml +1 -1
- package/rules/empty-table-cell.yaml +2 -2
- package/rules/expletive-construction.yaml +1 -1
- package/rules/fact-conflict.yaml +16 -4
- package/rules/figurative-density.yaml +1 -1
- package/rules/figure-reference-order.yaml +1 -1
- package/rules/footnote-mismatch.yaml +1 -1
- package/rules/fullwidth-alnum-consistency.yaml +1 -1
- package/rules/gpa-mismatch.yaml +80 -0
- package/rules/heading-end-punctuation-mix.yaml +1 -1
- package/rules/heading-level-skip.yaml +1 -1
- package/rules/heading-numbering-mix.yaml +3 -3
- package/rules/homophone-slip.yaml +1 -1
- package/rules/humble-for-others.yaml +1 -1
- package/rules/idiom-misuse.yaml +1 -1
- package/rules/ime-residue.yaml +1 -1
- package/rules/impossible-date.yaml +10 -6
- package/rules/installment-total-mismatch.yaml +58 -0
- package/rules/interest-mismatch.yaml +50 -0
- package/rules/interval-count-mismatch.yaml +1 -1
- package/rules/invisible-character.yaml +1 -1
- package/rules/kana-function-word.yaml +2 -2
- package/rules/katakana-density.yaml +1 -1
- package/rules/katakana-long-vowel.yaml +2 -2
- package/rules/kutoten-consistency.yaml +1 -1
- package/rules/latin-spacing.yaml +20 -6
- package/rules/layout-code-mismatch.yaml +1 -1
- package/rules/less-for-fewer.yaml +1 -1
- package/rules/line-amount-mismatch.yaml +8 -7
- package/rules/link-text-url-mismatch.yaml +1 -1
- package/rules/list-item-form-mix.yaml +1 -1
- package/rules/lookalike-character.yaml +1 -1
- package/rules/max-kanji-continuous.yaml +1 -1
- package/rules/meter-usage-mismatch.yaml +64 -0
- package/rules/misconversion.yaml +1 -1
- package/rules/modal-conflict.yaml +1 -1
- package/rules/name-variant.yaml +12 -3
- package/rules/net-amount-mismatch.yaml +57 -0
- package/rules/net-over-gross.yaml +57 -0
- package/rules/no-doubled-joshi.yaml +1 -1
- package/rules/no-mixed-desumasu.yaml +1 -1
- package/rules/no-nakaguro-parallel.yaml +1 -1
- package/rules/nominalization.yaml +1 -1
- package/rules/nonstandard-word.yaml +1 -1
- package/rules/number-style-consistency.yaml +3 -3
- package/rules/number-without-unit.yaml +1 -1
- package/rules/number-word-figure-mismatch.yaml +1 -1
- package/rules/numbering-gap.yaml +1 -1
- package/rules/obligation-without-deadline.yaml +1 -1
- package/rules/ordinal-suffix-mismatch.yaml +1 -1
- package/rules/orthographic-variant.yaml +2 -2
- package/rules/outside-announced-list.yaml +1 -1
- package/rules/padded-intro.yaml +1 -1
- package/rules/paragraph-restatement.yaml +1 -1
- package/rules/party-role-name.yaml +3 -3
- package/rules/percent-sum-mismatch.yaml +2 -2
- package/rules/period-label-conflict.yaml +68 -0
- package/rules/period-multiple-mismatch.yaml +61 -0
- package/rules/period-part-exceeds-whole.yaml +62 -0
- package/rules/person-consistency.yaml +1 -1
- package/rules/phone-number-variant.yaml +3 -3
- package/rules/preferred-term.yaml +2 -2
- package/rules/prerequisite-after-step.yaml +1 -1
- package/rules/product-exceeds-maximum.yaml +49 -0
- package/rules/proper-noun-density.yaml +1 -1
- package/rules/quantity-range-reversed.yaml +2 -2
- package/rules/range-band-mismatch.yaml +1 -1
- package/rules/ratio-mismatch.yaml +64 -0
- package/rules/reference-flag-mismatch.yaml +74 -0
- package/rules/reference-number-repeated.yaml +63 -0
- package/rules/reference-number-variant.yaml +81 -0
- package/rules/reference-title-mismatch.yaml +1 -1
- package/rules/reference-topic-missing.yaml +1 -1
- package/rules/reference-unit-mismatch.yaml +62 -0
- package/rules/relative-date-mismatch.yaml +1 -1
- package/rules/request-without-deadline.yaml +3 -3
- package/rules/required-listed-as-preferred.yaml +1 -1
- package/rules/required-sections.yaml +2 -2
- package/rules/requirement-modal.yaml +2 -2
- package/rules/requirement-smell.yaml +1 -1
- package/rules/revision-direction-mismatch.yaml +66 -0
- package/rules/risk-disclosure.yaml +1 -1
- package/rules/running-balance-mismatch.yaml +59 -0
- package/rules/scaled-quantity-mismatch.yaml +1 -1
- package/rules/serial-range-reversed.yaml +52 -0
- package/rules/share-amount-mismatch.yaml +58 -0
- package/rules/share-over-hundred.yaml +1 -1
- package/rules/shell-prompt-mix.yaml +1 -1
- package/rules/space-before-punctuation.yaml +1 -1
- package/rules/spelling-consistency.yaml +1 -1
- package/rules/step-statement-mix.yaml +3 -3
- package/rules/stock-transition.yaml +1 -1
- package/rules/summary-fact-mismatch.yaml +1 -1
- package/rules/table-header-variant.yaml +1 -1
- package/rules/table-unit-mix.yaml +82 -0
- package/rules/taigen-dome-in-prose.yaml +1 -1
- package/rules/tax-mismatch.yaml +13 -7
- package/rules/tier-threshold-mismatch.yaml +73 -0
- package/rules/time-order.yaml +7 -4
- package/rules/time-range-reversed.yaml +9 -4
- package/rules/toc-heading-mismatch.yaml +1 -1
- package/rules/topic-predicate-distance.yaml +1 -1
- package/rules/total-mismatch.yaml +5 -5
- package/rules/ui-label-variant.yaml +1 -1
- package/rules/unclosed-code-fence.yaml +1 -1
- package/rules/uncomparable-graded.yaml +2 -2
- package/rules/undefined-term.yaml +2 -2
- package/rules/unfilled-placeholder.yaml +2 -2
- package/rules/unit-mismatch.yaml +1 -1
- package/rules/unit-spacing-consistency.yaml +1 -1
- package/rules/unknown-word.yaml +1 -1
- package/rules/url-run-on.yaml +1 -1
- package/rules/vague-deadline.yaml +1 -1
- package/rules/vague-figure-reference.yaml +1 -1
- package/rules/vague-word-density.yaml +2 -2
- package/rules/variance-mismatch.yaml +67 -0
- package/rules/very-adjective.yaml +1 -1
- package/rules/walk-time-distance-mismatch.yaml +1 -1
- package/rules/warning-without-action.yaml +1 -1
- package/rules/weasel-word.yaml +2 -2
- package/rules/wordy-phrase.yaml +2 -2
- package/rules/yori-as-from.yaml +1 -1
- package/skills/chaff/SKILL.md +59 -9
- package/src/company-kana-spelling.ts +105 -0
- package/src/company-names.ts +159 -26
- package/src/contacts/table-rows.ts +51 -0
- package/src/derived/age-on-date.ts +161 -0
- package/src/derived/durations.ts +83 -12
- package/src/derived/hours-and-minutes.ts +41 -0
- package/src/derived/hyphenated-counts.ts +38 -0
- package/src/derived/marked-dates.ts +61 -0
- package/src/derived/money-span.ts +10 -0
- package/src/derived/period-parts.ts +360 -0
- package/src/derived/readable-date.ts +63 -0
- package/src/derived/stays.ts +7 -2
- package/src/derived/timesheet-hours.ts +112 -0
- package/src/derived/use-maximum.ts +158 -0
- package/src/derived/working-hours.ts +2 -2
- package/src/detectors/annual-holidays-mismatch.ts +41 -0
- package/src/detectors/annual-pay-mismatch.ts +71 -0
- package/src/detectors/blank-structure.ts +54 -14
- package/src/detectors/bmi-mismatch.ts +82 -0
- package/src/detectors/change-rate.ts +27 -4
- package/src/detectors/closing-balance-mismatch.ts +52 -0
- package/src/detectors/contact-variant.ts +8 -2
- package/src/detectors/cumulative-below-current.ts +30 -0
- package/src/detectors/currency-column.ts +37 -0
- package/src/detectors/date-any-year.ts +130 -0
- package/src/detectors/date-outside-period.ts +4 -10
- package/src/detectors/date-stamp-order.ts +2 -1
- package/src/detectors/date-year.ts +55 -13
- package/src/detectors/deductible-exceeds-limit.ts +55 -0
- package/src/detectors/defined-term-form.ts +6 -23
- package/src/detectors/derived-numbers.ts +50 -89
- package/src/detectors/discount-rate.ts +41 -0
- package/src/detectors/due-date.ts +21 -7
- package/src/detectors/email-letter.ts +45 -15
- package/src/detectors/event-deadline.ts +13 -3
- package/src/detectors/fact-consistency.ts +145 -7
- package/src/detectors/gloss-year.ts +21 -0
- package/src/detectors/gpa-mismatch.ts +43 -0
- package/src/detectors/impossible-date.ts +25 -3
- package/src/detectors/installment-total-mismatch.ts +68 -0
- package/src/detectors/interest.ts +43 -0
- package/src/detectors/lab-columns.ts +9 -0
- package/src/detectors/labelled-age.ts +154 -0
- package/src/detectors/line-amount.ts +58 -3
- package/src/detectors/measured-facts.ts +1 -1
- package/src/detectors/meter-usage.ts +49 -0
- package/src/detectors/name-field.ts +43 -0
- package/src/detectors/name-variant.ts +160 -16
- package/src/detectors/net-amount-mismatch.ts +86 -0
- package/src/detectors/net-gross-weight.ts +39 -0
- package/src/detectors/nominal-step.ts +35 -0
- package/src/detectors/number-style.ts +11 -2
- package/src/detectors/order-quantity.ts +46 -0
- package/src/detectors/orthographic-variant.ts +40 -10
- package/src/detectors/orthography.ts +27 -11
- package/src/detectors/period-label-conflict.ts +43 -0
- package/src/detectors/period-multiple-mismatch.ts +54 -0
- package/src/detectors/period-part.ts +71 -0
- package/src/detectors/range-words.ts +17 -0
- package/src/detectors/ratio-mismatch.ts +116 -0
- package/src/detectors/readable-dates.ts +36 -0
- package/src/detectors/reference-flag.ts +36 -0
- package/src/detectors/reference-number-repeated.ts +25 -0
- package/src/detectors/reference-number-variant.ts +44 -0
- package/src/detectors/reference-unit.ts +24 -0
- package/src/detectors/registry/annual-holidays-mismatch.ts +4 -0
- package/src/detectors/registry/annual-pay-mismatch.ts +4 -0
- package/src/detectors/registry/backorder-mismatch.ts +4 -0
- package/src/detectors/registry/bmi-mismatch.ts +4 -0
- package/src/detectors/registry/closing-balance-mismatch.ts +4 -0
- package/src/detectors/registry/cumulative-below-current.ts +4 -0
- package/src/detectors/registry/currency-column-mix.ts +4 -0
- package/src/detectors/registry/deductible-exceeds-limit.ts +4 -0
- package/src/detectors/registry/delivered-over-ordered.ts +4 -0
- package/src/detectors/registry/discount-rate.ts +4 -0
- package/src/detectors/registry/elapsed-years-mismatch.ts +1 -1
- package/src/detectors/registry/gpa-mismatch.ts +4 -0
- package/src/detectors/registry/installment-total-mismatch.ts +4 -0
- package/src/detectors/registry/interest.ts +4 -0
- package/src/detectors/registry/meter-usage.ts +4 -0
- package/src/detectors/registry/net-amount-mismatch.ts +4 -0
- package/src/detectors/registry/net-over-gross.ts +4 -0
- package/src/detectors/registry/period-label-conflict.ts +4 -0
- package/src/detectors/registry/period-multiple-mismatch.ts +4 -0
- package/src/detectors/registry/period-part-exceeds-whole.ts +4 -0
- package/src/detectors/registry/product-exceeds-maximum.ts +4 -0
- package/src/detectors/registry/ratio-mismatch.ts +4 -0
- package/src/detectors/registry/reference-flag-mismatch.ts +4 -0
- package/src/detectors/registry/reference-number-repeated.ts +4 -0
- package/src/detectors/registry/reference-number-variant.ts +4 -0
- package/src/detectors/registry/reference-unit.ts +4 -0
- package/src/detectors/registry/revision-direction.ts +4 -0
- package/src/detectors/registry/running-balance.ts +4 -0
- package/src/detectors/registry/serial-range.ts +4 -0
- package/src/detectors/registry/share-amount.ts +4 -0
- package/src/detectors/registry/table-unit-mix.ts +4 -0
- package/src/detectors/registry/tier-threshold.ts +4 -0
- package/src/detectors/registry/variance-mismatch.ts +4 -0
- package/src/detectors/relative-dates.ts +2 -1
- package/src/detectors/relative-day-words.ts +2 -1
- package/src/detectors/rent-multiple-mismatch.ts +3 -2
- package/src/detectors/request-owner.ts +5 -2
- package/src/detectors/revision-direction.ts +44 -0
- package/src/detectors/row-sentence-amounts.ts +96 -0
- package/src/detectors/running-balance.ts +31 -0
- package/src/detectors/scaled-quantity.ts +1 -1
- package/src/detectors/serial-range.ts +37 -0
- package/src/detectors/share-amount.ts +51 -0
- package/src/detectors/structure-tree.ts +58 -10
- package/src/detectors/table-scale.ts +37 -0
- package/src/detectors/tax-amount.ts +45 -13
- package/src/detectors/technical-docs.ts +4 -2
- package/src/detectors/tier-threshold.ts +108 -0
- package/src/detectors/time-order.ts +52 -18
- package/src/detectors/use-maximum.ts +38 -0
- package/src/detectors/variance.ts +33 -0
- package/src/detectors/whole-count-findings.ts +48 -0
- package/src/detectors/working-hours-findings.ts +100 -0
- package/src/facts/age-values.ts +124 -0
- package/src/facts/cell-keys.ts +21 -0
- package/src/facts/count-labels.ts +28 -0
- package/src/facts/document-terms.ts +107 -0
- package/src/facts/duration-scale.ts +22 -0
- package/src/facts/duration-values.ts +44 -0
- package/src/facts/fact-values.ts +36 -7
- package/src/facts/labelled-facts.ts +66 -9
- package/src/facts/measure-units.ts +28 -10
- package/src/facts/measures.ts +11 -11
- package/src/facts/qualified-labels.ts +126 -0
- package/src/facts/rate-values.ts +117 -0
- package/src/facts/row-sentence-amounts.ts +113 -0
- package/src/facts/superscript-power.ts +5 -0
- package/src/facts/table-facts.ts +35 -7
- package/src/facts/term-values.ts +236 -0
- package/src/facts/unit-word.ts +13 -0
- package/src/facts/verb-quantity-facts.ts +84 -0
- package/src/facts/whole-counts.ts +183 -0
- package/src/name-char-reading.ts +24 -0
- package/src/name-line-block.ts +40 -0
- package/src/name-lookalike-chars.ts +53 -0
- package/src/name-neighbours.ts +58 -0
- package/src/name-ordinary-word.ts +68 -0
- package/src/name-person.ts +31 -0
- package/src/name-separator.ts +48 -0
- package/src/name-variants.ts +42 -86
- package/src/name-weight.ts +12 -0
- package/src/person-field.ts +43 -0
- package/src/person-full-name.ts +70 -0
- package/src/phone-numbers.ts +54 -18
- package/src/plugin.ts +2 -0
- package/src/product-names.ts +98 -0
- package/src/reference-numbers.ts +55 -0
- package/src/spaced-person-name.ts +97 -0
- package/src/spacing-code.ts +22 -1
- package/src/structure/annual-holidays.ts +222 -0
- package/src/structure/annual-pay.ts +339 -0
- package/src/structure/bmi.ts +133 -0
- package/src/structure/change-rate-table.ts +135 -0
- package/src/structure/change-rate.ts +54 -17
- package/src/structure/closing-balance.ts +104 -0
- package/src/structure/column-date-order.ts +73 -0
- package/src/structure/compound-hours.ts +49 -0
- package/src/structure/cumulative-below-current.ts +66 -0
- package/src/structure/currency-column.ts +97 -0
- package/src/structure/date-deadline-mark.ts +30 -0
- package/src/structure/date-outside-period.ts +17 -9
- package/src/structure/date-range.ts +6 -9
- package/src/structure/deadline-after-event.ts +125 -8
- package/src/structure/deductible-limit.ts +255 -0
- package/src/structure/discount-rate.ts +209 -0
- package/src/structure/generic-role.ts +8 -0
- package/src/structure/gpa.ts +218 -0
- package/src/structure/installment-total.ts +343 -0
- package/src/structure/interest.ts +133 -0
- package/src/structure/key-value-row.ts +45 -0
- package/src/structure/lab-columns.ts +21 -0
- package/src/structure/labelled-date-order.ts +68 -52
- package/src/structure/labelled-order.ts +122 -0
- package/src/structure/labelled-time-order.ts +100 -0
- package/src/structure/line-amount-label.ts +100 -0
- package/src/structure/line-amount-rate.ts +178 -0
- package/src/structure/line-amount-unit.ts +16 -0
- package/src/structure/line-amount.ts +200 -48
- package/src/structure/meter-usage-read.ts +139 -0
- package/src/structure/meter-usage.ts +224 -0
- package/src/structure/net-amount.ts +243 -0
- package/src/structure/net-gross-weight.ts +97 -0
- package/src/structure/order-quantity.ts +125 -0
- package/src/structure/party-role.ts +4 -1
- package/src/structure/percent-sum.ts +3 -0
- package/src/structure/period-label-conflict.ts +174 -0
- package/src/structure/period-labels.ts +147 -0
- package/src/structure/period-multiple.ts +186 -0
- package/src/structure/quantity-range.ts +1 -8
- package/src/structure/range-bands.ts +1 -1
- package/src/structure/range-years.ts +75 -0
- package/src/structure/ratio.ts +296 -0
- package/src/structure/reference-flags.ts +156 -0
- package/src/structure/reference-number-repeated.ts +57 -0
- package/src/structure/reference-unit.ts +105 -0
- package/src/structure/rent-multiple.ts +12 -82
- package/src/structure/revision-direction.ts +214 -0
- package/src/structure/running-balance.ts +157 -0
- package/src/structure/scaled-quantities.ts +20 -6
- package/src/structure/serial-range.ts +52 -0
- package/src/structure/share-amount.ts +206 -0
- package/src/structure/shift-times.ts +136 -0
- package/src/structure/span-label.ts +26 -0
- package/src/structure/stated-multiple.ts +82 -0
- package/src/structure/stated-period.ts +23 -11
- package/src/structure/table-scale.ts +239 -0
- package/src/structure/tax-price.ts +136 -0
- package/src/structure/tax.ts +55 -20
- package/src/structure/tier-threshold.ts +218 -0
- package/src/structure/time-range.ts +9 -3
- package/src/structure/total-line.ts +174 -5
- package/src/structure/total-row-blank.ts +23 -0
- package/src/structure/total.ts +122 -13
- package/src/structure/variance-table.ts +167 -0
- package/src/table-names.ts +6 -6
- package/src/unlabelled-references.ts +83 -0
- package/src/vehicle-plates.ts +142 -0
- package/src/whole-word-runs.ts +38 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bmi-mismatch: the deciding half. A BMI written next to the height and the weight of the same person, against the weight in
|
|
3
|
+
* kilograms divided by the square of the height in metres. Which labels name the three, and which units a height or a weight
|
|
4
|
+
* may be written in, is data (lexicons bmi-term, bmi-unit, unit-length, unit-mass). Pure.
|
|
5
|
+
*/
|
|
6
|
+
import { keyOf, labelKey, noteOf, readNumber, type TableCell, type TableRow } from "./ratio.ts";
|
|
7
|
+
|
|
8
|
+
export type BodyKind = "height" | "weight" | "bmi";
|
|
9
|
+
|
|
10
|
+
export type BodyTerm = { readonly pattern: string; readonly kind: BodyKind };
|
|
11
|
+
|
|
12
|
+
/** A unit and its factor to the base unit the lexicon counts in (metres for a length, grams for a mass). */
|
|
13
|
+
export type BodyUnit = { readonly pattern: string; readonly factor: number };
|
|
14
|
+
|
|
15
|
+
export type BodyWords = {
|
|
16
|
+
readonly terms: readonly BodyTerm[];
|
|
17
|
+
readonly lengthUnits: readonly BodyUnit[];
|
|
18
|
+
readonly massUnits: readonly BodyUnit[];
|
|
19
|
+
readonly bmiUnits: readonly string[];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** A measure as written, in the base unit: its value and the half step of its last written digit. */
|
|
23
|
+
export type Measure = { readonly value: number; readonly half: number };
|
|
24
|
+
|
|
25
|
+
/** A BMI as written: where it starts, its value and the number of its decimals. */
|
|
26
|
+
export type WrittenBmi = { readonly start: number; readonly value: number; readonly decimals: number };
|
|
27
|
+
|
|
28
|
+
export type BmiIssue = { readonly offset: number; readonly values: Readonly<Record<string, string>> };
|
|
29
|
+
|
|
30
|
+
const HALF = 0.5;
|
|
31
|
+
const DECIMAL_BASE = 10;
|
|
32
|
+
const GRAMS_PER_KILOGRAM = 1000;
|
|
33
|
+
/** Floating error must not push a BMI that sits on the edge of its rounding out of it. */
|
|
34
|
+
const FLOAT_SLACK = 1e-9;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The BMI the height and the weight give, when the written BMI cannot be it; undefined when it can. Every written figure
|
|
38
|
+
* stands for the half step of its last digit around it (22.0 is 21.95 to 22.05, 178 cm is 177.5 to 178.5 cm), and the
|
|
39
|
+
* BMI is compared with the whole range the height and weight can give: the lightest weight over the tallest height to the
|
|
40
|
+
* heaviest weight over the shortest height.
|
|
41
|
+
*/
|
|
42
|
+
export const bmiDisagreement = (bmi: WrittenBmi, height: Measure, weight: Measure): string | undefined => {
|
|
43
|
+
const shortest = height.value - height.half;
|
|
44
|
+
if (shortest <= 0 || weight.value <= 0) return undefined;
|
|
45
|
+
const lowest = Math.max(0, weight.value - weight.half) / (height.value + height.half) ** 2;
|
|
46
|
+
const highest = (weight.value + weight.half) / shortest ** 2;
|
|
47
|
+
const half = HALF * DECIMAL_BASE ** -bmi.decimals + FLOAT_SLACK;
|
|
48
|
+
if (bmi.value + half >= lowest && bmi.value - half <= highest) return undefined;
|
|
49
|
+
return (weight.value / height.value ** 2).toFixed(bmi.decimals);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const unitFactor = (unit: string, units: readonly BodyUnit[]): number | undefined => units.find((entry) => keyOf(entry.pattern) === keyOf(unit))?.factor;
|
|
53
|
+
|
|
54
|
+
/** The unit a row label notes in brackets (身長(cm), Weight (kg)), without the brackets. */
|
|
55
|
+
const notedUnit = (label: string): string => noteOf(label).slice(1, -1);
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* A cell read as a measure in the base unit: one plain number and a unit of the list after it, or nothing after it when the
|
|
59
|
+
* row label notes the unit. Anything else (a range, 約, a second number, a unit not listed) is not read, nor is a row whose
|
|
60
|
+
* label notes something other than a unit (Weight (last year)).
|
|
61
|
+
*/
|
|
62
|
+
export const cellMeasure = (text: string, label: string, units: readonly BodyUnit[]): Measure | undefined => {
|
|
63
|
+
const cell = readNumber(text);
|
|
64
|
+
const noted = notedUnit(label);
|
|
65
|
+
if (cell === undefined || cell.prefix !== "" || (noted !== "" && unitFactor(noted, units) === undefined)) return undefined;
|
|
66
|
+
const factor = unitFactor(cell.suffix === "" ? noted : cell.suffix, units);
|
|
67
|
+
return factor === undefined ? undefined : { value: cell.value * factor, half: HALF * DECIMAL_BASE ** -cell.decimals * factor };
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/** The text without a BMI unit at its end. The unit is cut off before the number is read, as its ² is a digit after NFKC. */
|
|
71
|
+
const withoutBmiUnit = (text: string, units: readonly string[]): string => {
|
|
72
|
+
const plain = text.normalize("NFKC").trim();
|
|
73
|
+
const unit = units.map((entry) => entry.normalize("NFKC")).find((entry) => plain.toLowerCase().endsWith(entry.toLowerCase()));
|
|
74
|
+
return unit === undefined ? plain : plain.slice(0, -unit.length);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* A cell read as a BMI: one plain number, with nothing after it or a BMI unit (kg/m²). A row whose label notes something
|
|
79
|
+
* other than a BMI unit (BMI (percentile)) is not read.
|
|
80
|
+
*/
|
|
81
|
+
export const cellBmi = (cell: TableCell, label: string, units: readonly string[]): WrittenBmi | undefined => {
|
|
82
|
+
const noted = notedUnit(label);
|
|
83
|
+
if (noted !== "" && withoutBmiUnit(noted, units) !== "") return undefined;
|
|
84
|
+
const read = readNumber(withoutBmiUnit(cell.text, units));
|
|
85
|
+
if (read === undefined || read.prefix !== "" || read.suffix !== "") return undefined;
|
|
86
|
+
return { start: cell.start, value: read.value, decimals: read.decimals };
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const kindOf = (row: TableRow, terms: readonly BodyTerm[]): BodyKind | undefined => terms.find((term) => keyOf(term.pattern) === labelKey(row.label))?.kind;
|
|
90
|
+
|
|
91
|
+
/** The rows of one kind, from every group. */
|
|
92
|
+
const rowsOfKind = (groups: readonly (readonly TableRow[])[], terms: readonly BodyTerm[], kind: BodyKind): { group: number; row: TableRow }[] =>
|
|
93
|
+
groups.flatMap((rows, group) => rows.filter((row) => kindOf(row, terms) === kind).map((row) => ({ group, row })));
|
|
94
|
+
|
|
95
|
+
type Trio = { readonly height: TableRow; readonly weight: TableRow; readonly bmi: TableRow };
|
|
96
|
+
|
|
97
|
+
/** The one height, weight and BMI row of a section, all in the same group; undefined when any is missing or written twice. */
|
|
98
|
+
const trioOf = (groups: readonly (readonly TableRow[])[], terms: readonly BodyTerm[]): Trio | undefined => {
|
|
99
|
+
const only = (kind: BodyKind): { group: number; row: TableRow } | undefined => {
|
|
100
|
+
const found = rowsOfKind(groups, terms, kind);
|
|
101
|
+
return found.length === 1 ? found[0] : undefined;
|
|
102
|
+
};
|
|
103
|
+
const [height, weight, bmi] = [only("height"), only("weight"), only("bmi")];
|
|
104
|
+
if (height === undefined || weight === undefined || bmi === undefined) return undefined;
|
|
105
|
+
if (height.group !== bmi.group || weight.group !== bmi.group) return undefined;
|
|
106
|
+
return { height: height.row, weight: weight.row, bmi: bmi.row };
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const sameWidth = (trio: Trio): boolean => trio.height.cells.length === trio.bmi.cells.length && trio.weight.cells.length === trio.bmi.cells.length;
|
|
110
|
+
|
|
111
|
+
const columnIssue = (trio: Trio, column: number, words: BodyWords): BmiIssue[] => {
|
|
112
|
+
const [heightCell, weightCell, bmiCell] = [trio.height.cells[column], trio.weight.cells[column], trio.bmi.cells[column]];
|
|
113
|
+
if (heightCell === undefined || weightCell === undefined || bmiCell === undefined) return [];
|
|
114
|
+
const height = cellMeasure(heightCell.text, trio.height.label, words.lengthUnits);
|
|
115
|
+
const mass = cellMeasure(weightCell.text, trio.weight.label, words.massUnits);
|
|
116
|
+
const bmi = cellBmi(bmiCell, trio.bmi.label, words.bmiUnits);
|
|
117
|
+
if (height === undefined || mass === undefined || bmi === undefined) return [];
|
|
118
|
+
const weight = { value: mass.value / GRAMS_PER_KILOGRAM, half: mass.half / GRAMS_PER_KILOGRAM };
|
|
119
|
+
const computed = bmiDisagreement(bmi, height, weight);
|
|
120
|
+
return computed === undefined ? [] : [{ offset: bmi.start, values: { written: bmi.value.toFixed(bmi.decimals), computed } }];
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* One section of a document is one person. Its groups are its tables and, as one more group, its "label: value" lines, each
|
|
125
|
+
* read as a row of one cell. When the section has exactly one height, one weight and one BMI row, all in one group, the three
|
|
126
|
+
* are compared column by column. Two heights or two weights (two people, or a before and an after) leave it unread, and so
|
|
127
|
+
* does a table whose three rows have different numbers of cells (its columns may not line up).
|
|
128
|
+
*/
|
|
129
|
+
export const sectionBmiMismatches = (groups: readonly (readonly TableRow[])[], words: BodyWords): BmiIssue[] => {
|
|
130
|
+
const trio = trioOf(groups, words.terms);
|
|
131
|
+
if (trio === undefined || !sameWidth(trio)) return [];
|
|
132
|
+
return trio.bmi.cells.flatMap((_, column) => columnIssue(trio, column, words));
|
|
133
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// change-rate-mismatch in a table: a row with the earlier value, the later one and the rate of change, each in a column the
|
|
2
|
+
// header names (「| 売上高 | 1,200 | 1,320 | 12.0% |」 under 前期 / 当期 / 増減率, "Prior year / Current year / YoY"). Pure.
|
|
3
|
+
import type { Span } from "../plugin.ts";
|
|
4
|
+
import type { StructureIssue } from "./issues.ts";
|
|
5
|
+
import { disagreeingRate } from "./change-rate.ts";
|
|
6
|
+
import { escapeRegExp } from "../orthography.ts";
|
|
7
|
+
|
|
8
|
+
export type ColumnRole = "base" | "current" | "rate" | "change";
|
|
9
|
+
export type ColumnWord = { readonly pattern: string; readonly role: ColumnRole };
|
|
10
|
+
export type TableCell = Span & { readonly text: string };
|
|
11
|
+
export type ChangeTable = { readonly header: readonly TableCell[]; readonly rows: readonly (readonly TableCell[])[] };
|
|
12
|
+
|
|
13
|
+
/** Rate words first: 「前期比」 holds 前期 and "change vs prior year" holds "prior year", and both are rates. */
|
|
14
|
+
const ROLE_ORDER: readonly ColumnRole[] = ["rate", "change", "base", "current"];
|
|
15
|
+
const LATIN = /[a-z]/u;
|
|
16
|
+
/** A calendar year in a heading (FY2025, 2025年3月期, 2026年度), not part of a longer number. */
|
|
17
|
+
const YEAR = /(?<!\d|\d[.,])(?:1[89]|2[01])\d{2}(?!\d|[.,]\d)/gu;
|
|
18
|
+
const PERCENT_MARK = /%/u;
|
|
19
|
+
/** A rate cell: a sign (+, -, −, ▲, △), the number, and % when the cell carries it. 1.2pt, (5.0)% and — are not rates. */
|
|
20
|
+
const RATE_CELL = /^([+\-−▲△])?\s*(\d{1,3}(?:,\d{3})+|\d+)(?:\.(\d+))?\s*(%)?$/u;
|
|
21
|
+
/** A value cell: the number with what is written around it (¥, $, 百万円, million), and no sign, bracket or %. */
|
|
22
|
+
const VALUE_CELL = /^([^\d+\-−▲△()%]*?)(\d{1,3}(?:,\d{3})+|\d+)(?:\.(\d+))?([^\d+\-−▲△()%]*)$/u;
|
|
23
|
+
const NEGATIVE_SIGNS: ReadonlySet<string> = new Set(["-", "−", "▲", "△"]);
|
|
24
|
+
const DECIMAL_BASE = 10;
|
|
25
|
+
|
|
26
|
+
export const plain = (text: string): string => text.normalize("NFKC").replace(/[*_`]/gu, "").trim();
|
|
27
|
+
|
|
28
|
+
/** A Latin word stands as a whole word (change is not in "exchange"); anything else as written. */
|
|
29
|
+
export const holds = (heading: string, word: string): boolean => {
|
|
30
|
+
const key = plain(word).toLowerCase();
|
|
31
|
+
if (!LATIN.test(key)) return heading.includes(key);
|
|
32
|
+
return new RegExp(`(?<![a-z0-9])${escapeRegExp(key)}(?![a-z0-9])`, "u").test(heading);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const roleOf = (heading: string, words: readonly ColumnWord[]): ColumnRole | undefined => {
|
|
36
|
+
const key = plain(heading).toLowerCase();
|
|
37
|
+
return ROLE_ORDER.find((role) => words.some((word) => word.role === role && holds(key, word.pattern)));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const onlyIndex = (indexes: readonly number[]): number | undefined => (indexes.length === 1 ? indexes[0] : undefined);
|
|
41
|
+
|
|
42
|
+
type Columns = { readonly base: number; readonly current: number; readonly rate: number; readonly percentOnly: boolean };
|
|
43
|
+
|
|
44
|
+
/** Two columns each headed by one calendar year and no word of role: the earlier year's is the earlier value. */
|
|
45
|
+
const datedColumns = (headings: readonly string[], roles: readonly (ColumnRole | undefined)[]): { base: number; current: number } | undefined => {
|
|
46
|
+
const dated = headings.flatMap((heading, index) => {
|
|
47
|
+
const years = [...plain(heading).matchAll(YEAR)].map((match) => Number(match[0]));
|
|
48
|
+
const [year] = years;
|
|
49
|
+
return years.length === 1 && year !== undefined && roles[index] === undefined ? [{ index, year }] : [];
|
|
50
|
+
});
|
|
51
|
+
const [first, second] = dated;
|
|
52
|
+
if (dated.length !== 2 || first === undefined || second === undefined || first.year === second.year) return undefined;
|
|
53
|
+
return first.year < second.year ? { base: first.index, current: second.index } : { base: second.index, current: first.index };
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/** What a heading writes in brackets, less its numbers: 「(百万円)」, "(thousand yen)"; 「(2025年3月期)」 keeps only 「年月期」. */
|
|
57
|
+
const BRACKET = /[()()]/u;
|
|
58
|
+
const bracketedOf = (heading: string): string =>
|
|
59
|
+
plain(heading)
|
|
60
|
+
.split(BRACKET)
|
|
61
|
+
.filter((_, index) => index % 2 === 1)
|
|
62
|
+
.map((inside) => inside.replace(/[\d.,]/gu, "").trim())
|
|
63
|
+
.join("|");
|
|
64
|
+
|
|
65
|
+
/** The two period columns do not name different units in their headings ("FY2025 (thousand yen)", "FY2026 (million yen)"). */
|
|
66
|
+
export const sameHeadingUnits = (base: string | undefined, current: string | undefined): boolean => bracketedOf(base ?? "") === bracketedOf(current ?? "");
|
|
67
|
+
|
|
68
|
+
/** The one column of each role. A rate column is one headed by a rate word, else the one change column whose cells carry %. */
|
|
69
|
+
export const columnsOf = (headings: readonly string[], words: readonly ColumnWord[]): Columns | undefined => {
|
|
70
|
+
const roles = headings.map((heading) => roleOf(heading, words));
|
|
71
|
+
const indexesOf = (role: ColumnRole): number[] => roles.flatMap((found, index) => (found === role ? [index] : []));
|
|
72
|
+
const rateColumn = onlyIndex(indexesOf("rate"));
|
|
73
|
+
const changeColumn = indexesOf("rate").length === 0 ? onlyIndex(indexesOf("change")) : undefined;
|
|
74
|
+
const rate = rateColumn ?? changeColumn;
|
|
75
|
+
const [base, current] = [onlyIndex(indexesOf("base")), onlyIndex(indexesOf("current"))];
|
|
76
|
+
const periods = base !== undefined && current !== undefined ? { base, current } : datedColumns(headings, roles);
|
|
77
|
+
if (rate === undefined || periods === undefined || !sameHeadingUnits(headings[periods.base], headings[periods.current])) return undefined;
|
|
78
|
+
return { ...periods, rate, percentOnly: rateColumn === undefined && !PERCENT_MARK.test(plain(headings[rate] ?? "")) };
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const numberText = (whole: string, fraction: string): string => [whole, fraction].filter((part) => part !== "").join(".");
|
|
82
|
+
|
|
83
|
+
type WrittenRate = { readonly sign: string; readonly value: number; readonly decimals: number; readonly digits: string };
|
|
84
|
+
|
|
85
|
+
/** The signed rate a cell writes, undefined when it is not one (1.2pt, (5.0)%, —) or lacks the % its column needs. */
|
|
86
|
+
export const rateIn = (text: string, percentOnly: boolean): WrittenRate | undefined => {
|
|
87
|
+
const match = RATE_CELL.exec(plain(text));
|
|
88
|
+
if (match === null || (percentOnly && match[4] === undefined)) return undefined;
|
|
89
|
+
const [, sign = "", whole = "", fraction = ""] = match;
|
|
90
|
+
const magnitude = Number(numberText(whole.replaceAll(",", ""), fraction));
|
|
91
|
+
const digits = numberText(whole, fraction);
|
|
92
|
+
return { sign, value: NEGATIVE_SIGNS.has(sign) ? -magnitude : magnitude, decimals: fraction.length, digits };
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
type WrittenValue = { readonly value: number; readonly step: number; readonly marks: string };
|
|
96
|
+
|
|
97
|
+
/** The value a cell writes, with what stands around the number (¥, 百万円, million) as the unit to compare. */
|
|
98
|
+
export const valueIn = (text: string): WrittenValue | undefined => {
|
|
99
|
+
const match = VALUE_CELL.exec(plain(text));
|
|
100
|
+
if (match === null) return undefined;
|
|
101
|
+
const [, before = "", whole = "", fraction = "", after = ""] = match;
|
|
102
|
+
const value = Number(numberText(whole.replaceAll(",", ""), fraction));
|
|
103
|
+
return { value, step: DECIMAL_BASE ** -fraction.length, marks: `${before.trim()}|${after.trim()}` };
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** The computed rate written the way the cell writes its sign: 「△5.3」 beside 「△5.0」, "+10.0" beside "+12.0". */
|
|
107
|
+
const shownRate = (computed: number, written: WrittenRate): string => {
|
|
108
|
+
const magnitude = Math.abs(computed).toFixed(written.decimals);
|
|
109
|
+
const negative = NEGATIVE_SIGNS.has(written.sign) ? written.sign : "-";
|
|
110
|
+
if (computed < 0) return `${negative}${magnitude}`;
|
|
111
|
+
return `${written.sign === "+" ? "+" : ""}${magnitude}`;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const issueInRow = (row: readonly TableCell[], columns: Columns): StructureIssue[] => {
|
|
115
|
+
const [baseCell, currentCell, rateCell] = [row[columns.base], row[columns.current], row[columns.rate]];
|
|
116
|
+
const base = baseCell === undefined ? undefined : valueIn(baseCell.text);
|
|
117
|
+
const current = currentCell === undefined ? undefined : valueIn(currentCell.text);
|
|
118
|
+
const rate = rateCell === undefined ? undefined : rateIn(rateCell.text, columns.percentOnly);
|
|
119
|
+
if (rateCell === undefined || base === undefined || current === undefined || rate === undefined || base.marks !== current.marks) return [];
|
|
120
|
+
const computed = disagreeingRate(base, current, rate.value, rate.decimals);
|
|
121
|
+
if (computed === undefined) return [];
|
|
122
|
+
const offset = rateCell.start + (rateCell.text.length - rateCell.text.trimStart().length);
|
|
123
|
+
return [{ offset, values: { rate: `${rate.sign}${rate.digits}`, computed: shownRate(computed, rate) } }];
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/** Each row whose rate of change the two values in the columns the header names do not give. */
|
|
127
|
+
export const tableRateMismatches = (tables: readonly ChangeTable[], words: readonly ColumnWord[]): StructureIssue[] =>
|
|
128
|
+
tables.flatMap((table) => {
|
|
129
|
+
const columns = columnsOf(
|
|
130
|
+
table.header.map((cell) => cell.text),
|
|
131
|
+
words,
|
|
132
|
+
);
|
|
133
|
+
if (columns === undefined) return [];
|
|
134
|
+
return table.rows.filter((row) => row.length === table.header.length).flatMap((row) => issueInRow(row, columns));
|
|
135
|
+
});
|
|
@@ -76,12 +76,6 @@ const isBaseFor = (figure: Figure, rate: Rate, marks: readonly BaseMark[]): bool
|
|
|
76
76
|
return mark !== undefined && Math.min(distance(figure, rate), distance(mark, rate)) <= BASE_REACH;
|
|
77
77
|
};
|
|
78
78
|
|
|
79
|
-
/**
|
|
80
|
-
* The later value is written before the rate (「1,200社となり、…20%増えました」"1,200 companies, up 20%") or marked as the
|
|
81
|
-
* value reached (「1,200社に」"to 1,200"). Another amount after the rate is about something else ("…, and revenue was $1,300").
|
|
82
|
-
*/
|
|
83
|
-
const isCurrentFor = (figure: Figure, rate: Rate, targets: readonly BaseMark[]): boolean => figure.end <= rate.start || markOf(figure, targets) !== undefined;
|
|
84
|
-
|
|
85
79
|
/** The one sign the direction words beside the rate agree on. */
|
|
86
80
|
const signNear = (rate: Rate, directions: readonly Direction[]): 1 | -1 | undefined => {
|
|
87
81
|
const signs = new Set(directions.filter((direction) => distance(direction, rate) <= DIRECTION_REACH).map((direction) => direction.sign));
|
|
@@ -93,13 +87,26 @@ const signNear = (rate: Rate, directions: readonly Direction[]): 1 | -1 | undefi
|
|
|
93
87
|
* The rates of change the two values allow. Each value may be off by half the step it is written to: 12億 is anything from
|
|
94
88
|
* 11.5億 to 12.5億, so 12億 from 10億 is a rise of 9.5% to 31.6%, and only a rate outside that is a mistake.
|
|
95
89
|
*/
|
|
96
|
-
|
|
90
|
+
type Rounded = Pick<Figure, "value" | "step">;
|
|
91
|
+
|
|
92
|
+
const rateRange = (base: Rounded, current: Rounded): readonly [number, number] | undefined => {
|
|
97
93
|
const [baseLow, baseHigh] = [base.value - base.step * HALF, base.value + base.step * HALF];
|
|
98
94
|
const [currentLow, currentHigh] = [current.value - current.step * HALF, current.value + current.step * HALF];
|
|
99
95
|
if (baseLow <= 0) return undefined;
|
|
100
96
|
return [(currentLow / baseHigh - 1) * PERCENT, (currentHigh / baseLow - 1) * PERCENT];
|
|
101
97
|
};
|
|
102
98
|
|
|
99
|
+
/**
|
|
100
|
+
* The rate in percent the two values give, when the written rate (signed, with its decimals) is one their rounding cannot
|
|
101
|
+
* reach; undefined when it can, or when the earlier value may be zero or below.
|
|
102
|
+
*/
|
|
103
|
+
export const disagreeingRate = (base: Rounded, current: Rounded, written: number, decimals: number): number | undefined => {
|
|
104
|
+
const range = rateRange(base, current);
|
|
105
|
+
const slack = HALF * DECIMAL_BASE ** -decimals;
|
|
106
|
+
if (range === undefined || (written >= range[0] - slack && written <= range[1] + slack)) return undefined;
|
|
107
|
+
return (current.value / base.value - 1) * PERCENT;
|
|
108
|
+
};
|
|
109
|
+
|
|
103
110
|
type Pair = { readonly base: Figure; readonly current: Figure };
|
|
104
111
|
/** One sentence's parts, with the rate: the one percentage that has a word of direction beside it. */
|
|
105
112
|
type Reading = ChangeText & { readonly rate: Rate; readonly sign: 1 | -1 };
|
|
@@ -110,16 +117,48 @@ const brokenBetween = (text: Reading, one: Span, other: Span): boolean => {
|
|
|
110
117
|
return text.breaks.some((word) => within(gap, word));
|
|
111
118
|
};
|
|
112
119
|
|
|
120
|
+
/** right follows left closely, with no value, rate or word of another subject or clause between them. */
|
|
121
|
+
const followsClosely = (text: Reading, left: Span, right: Span, reach: number): boolean => {
|
|
122
|
+
const gap = gapBetween(left, right);
|
|
123
|
+
if (gap.start > gap.end || gapLength(text.source, gap) > reach) return false;
|
|
124
|
+
return ![...text.figures, ...text.rates, ...text.breaks].some((span) => within(gap, span));
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* The later value is written before the rate (「1,200社となり、…20%増えました」"1,200 companies, up 20%") or marked as the
|
|
129
|
+
* value reached right after the rate or the earlier value (「から20%増加し、1,200社となりました」"from 1,000 to 1,200"), in the
|
|
130
|
+
* same clause. Another amount after the rate is about something else ("…, and revenue was $1,300", 「…増加し、利益は300万円に」).
|
|
131
|
+
*/
|
|
132
|
+
const isCurrentFor = (text: Reading, figure: Figure, base: Figure): boolean => {
|
|
133
|
+
if (figure.end <= text.rate.start) return true;
|
|
134
|
+
const from = text.rate.end < base.end && base.end <= figure.start ? base : text.rate;
|
|
135
|
+
return markOf(figure, text.targets) !== undefined && followsClosely(text, from, figure, BASE_REACH) && !brokenBetween(text, text.rate, figure);
|
|
136
|
+
};
|
|
137
|
+
|
|
113
138
|
/** The earlier value marked beside the rate, and the one value in its unit before the rate or marked as reached. */
|
|
114
139
|
const besideRate = (text: Reading): Pair | undefined => {
|
|
115
140
|
const bases = text.figures.filter((figure) => isBaseFor(figure, text.rate, text.marks) && !brokenBetween(text, figure, text.rate));
|
|
116
141
|
const [base] = bases;
|
|
117
142
|
if (bases.length !== 1 || base === undefined) return undefined;
|
|
118
|
-
const currents = text.figures.filter((figure) => figure !== base && figure.unit === base.unit && isCurrentFor(
|
|
143
|
+
const currents = text.figures.filter((figure) => figure !== base && figure.unit === base.unit && isCurrentFor(text, figure, base));
|
|
119
144
|
const [current] = currents;
|
|
120
145
|
return currents.length === 1 && current !== undefined ? { base, current } : undefined;
|
|
121
146
|
};
|
|
122
147
|
|
|
148
|
+
/**
|
|
149
|
+
* The value reached right after the rate, and the earlier value right after it ("rose 12% to $2,640 million from $2,400
|
|
150
|
+
* million"): the earlier value stands too far from the rate to be read beside it.
|
|
151
|
+
*/
|
|
152
|
+
const reachedThenBase = (text: Reading): Pair | undefined => {
|
|
153
|
+
const pairs = text.figures.flatMap((current, index) => {
|
|
154
|
+
const base = text.figures[index + 1];
|
|
155
|
+
if (base?.unit !== current.unit || markOf(current, text.targets) === undefined || markOf(base, text.marks) === undefined) return [];
|
|
156
|
+
return followsClosely(text, text.rate, current, BASE_REACH) && followsClosely(text, current, base, PAIR_GAP) ? [{ base, current }] : [];
|
|
157
|
+
});
|
|
158
|
+
const [pair] = pairs;
|
|
159
|
+
return pairs.length === 1 ? pair : undefined;
|
|
160
|
+
};
|
|
161
|
+
|
|
123
162
|
const yearsBeside = (text: Reading, figure: Figure, side: "before" | "after", bound: Span): Period[] =>
|
|
124
163
|
text.periods.filter((period) => {
|
|
125
164
|
const [left, right] = side === "before" ? [period, figure] : [figure, period];
|
|
@@ -205,19 +244,17 @@ const readingIn = (text: ChangeText, sentence: Span): Reading | undefined => {
|
|
|
205
244
|
|
|
206
245
|
const issueIn = (text: ChangeText, sentence: Span): StructureIssue[] => {
|
|
207
246
|
const reading = readingIn(text, sentence);
|
|
208
|
-
const pair = reading === undefined ? undefined : (besideRate(reading) ?? beforeRate(reading));
|
|
209
|
-
|
|
210
|
-
if (reading === undefined || pair === undefined || range === undefined) return [];
|
|
247
|
+
const pair = reading === undefined ? undefined : (besideRate(reading) ?? beforeRate(reading) ?? reachedThenBase(reading));
|
|
248
|
+
if (reading === undefined || pair === undefined) return [];
|
|
211
249
|
const { rate, sign } = reading;
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
const computed = Math.abs((pair.current.value / pair.base.value - 1) * PERCENT).toFixed(rate.decimals);
|
|
216
|
-
return [{ offset: rate.start, values: { rate: String(rate.value), computed } }];
|
|
250
|
+
const computed = disagreeingRate(pair.base, pair.current, sign * rate.value, rate.decimals);
|
|
251
|
+
if (computed === undefined) return [];
|
|
252
|
+
return [{ offset: rate.start, values: { rate: String(rate.value), computed: Math.abs(computed).toFixed(rate.decimals) } }];
|
|
217
253
|
};
|
|
218
254
|
|
|
219
255
|
/**
|
|
220
256
|
* Each sentence with one rate of change and its direction, and the two values it is computed from, that disagree: the
|
|
221
|
-
* earlier value marked beside the rate,
|
|
257
|
+
* earlier value marked beside the rate, the two values written together right before it, or the value reached and then
|
|
258
|
+
* the earlier one right after it.
|
|
222
259
|
*/
|
|
223
260
|
export const changeRateMismatches = (text: ChangeText): StructureIssue[] => text.sentences.flatMap((sentence) => issueIn(text, sentence));
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* closing-balance-mismatch: the deciding half. A closing balance (当月末残高, Closing balance) against the opening balance
|
|
3
|
+
* (前月末残高, Opening balance) plus the total paid in (お預入れ合計, Total deposits) less the total paid out (お引出し合計,
|
|
4
|
+
* Total withdrawals), written in the same table or the same section. Which words name them is data (lexicon
|
|
5
|
+
* closing-balance-label, grouped opening / inflow / outflow / closing); an amount is read as net-amount-mismatch reads one.
|
|
6
|
+
* Pure.
|
|
7
|
+
*/
|
|
8
|
+
import { keyOf, labelKey, noteOf } from "./ratio.ts";
|
|
9
|
+
import { amountOf, isExact, shown, type LabelledLine, type NetAmount, type NetCell, type NetIssue, type NetWords } from "./net-amount.ts";
|
|
10
|
+
|
|
11
|
+
export const BALANCE_ROLES = ["opening", "inflow", "outflow", "closing"] as const;
|
|
12
|
+
export type BalanceRole = (typeof BALANCE_ROLES)[number];
|
|
13
|
+
|
|
14
|
+
export type BalanceWords = Pick<NetWords, "magnitudes" | "percentUnits"> & { readonly labels: Readonly<Record<BalanceRole, readonly string[]>> };
|
|
15
|
+
|
|
16
|
+
export type BalanceAmount = NetAmount & { readonly role: BalanceRole };
|
|
17
|
+
|
|
18
|
+
const DECIMAL_BASE = 10;
|
|
19
|
+
const HALF = 0.5;
|
|
20
|
+
/** Four amounts each rounded on their own to nearest may leave the sum off by up to two steps of the coarsest digit. */
|
|
21
|
+
const ROUNDED_STEPS = 2;
|
|
22
|
+
|
|
23
|
+
export const balanceRoleOf = (label: string, words: BalanceWords): BalanceRole | undefined =>
|
|
24
|
+
BALANCE_ROLES.find((role) => words.labels[role].some((pattern) => keyOf(pattern) === labelKey(label)));
|
|
25
|
+
|
|
26
|
+
/** The one amount of a role in a scope; undefined when the role is missing or written more than once. */
|
|
27
|
+
const onlyAmount = (amounts: readonly BalanceAmount[], role: BalanceRole): BalanceAmount | undefined => {
|
|
28
|
+
const mine = amounts.filter((amount) => amount.role === role);
|
|
29
|
+
return mine.length === 1 ? mine[0] : undefined;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const allowedGap = (amounts: readonly BalanceAmount[], words: BalanceWords): number => {
|
|
33
|
+
const finest = Math.max(...amounts.map((amount) => amount.decimals));
|
|
34
|
+
const coarsest = Math.min(...amounts.map((amount) => amount.decimals));
|
|
35
|
+
const exact = amounts.every((amount) => isExact(amount, words));
|
|
36
|
+
return HALF * DECIMAL_BASE ** -finest + (exact ? 0 : ROUNDED_STEPS * DECIMAL_BASE ** -coarsest);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* One scope: opening, inflow, outflow and closing each found once, all in one unit. The closing balance is reported when it
|
|
41
|
+
* is not opening + inflow − outflow beyond rounding. A sum below zero is not compared: an overdrawn balance is written with
|
|
42
|
+
* a sign, which is not read as an amount.
|
|
43
|
+
*/
|
|
44
|
+
export const closingMismatch = (amounts: readonly BalanceAmount[], words: BalanceWords): NetIssue | undefined => {
|
|
45
|
+
const found = BALANCE_ROLES.map((role) => onlyAmount(amounts, role));
|
|
46
|
+
const [opening, inflow, outflow, closing] = found;
|
|
47
|
+
if (opening === undefined || inflow === undefined || outflow === undefined || closing === undefined) return undefined;
|
|
48
|
+
const four = [opening, inflow, outflow, closing];
|
|
49
|
+
if (four.some((amount) => amount.unit !== closing.unit)) return undefined;
|
|
50
|
+
const decimals = Math.max(...four.map((amount) => amount.decimals));
|
|
51
|
+
const expected = Math.round((opening.value + inflow.value - outflow.value) * DECIMAL_BASE ** decimals) / DECIMAL_BASE ** decimals;
|
|
52
|
+
if (!Number.isSafeInteger(Math.round(expected * DECIMAL_BASE ** decimals))) return undefined;
|
|
53
|
+
if (expected < 0 || Math.abs(expected - closing.value) <= allowedGap(four, words)) return undefined;
|
|
54
|
+
return { offset: closing.start, values: { written: closing.written, expected: shown(expected, closing, decimals) } };
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const labelledCells = (labels: readonly NetCell[], values: readonly NetCell[], words: BalanceWords): BalanceAmount[] =>
|
|
58
|
+
labels.flatMap((label, column) => {
|
|
59
|
+
const role = balanceRoleOf(label.text, words);
|
|
60
|
+
const value = values[column];
|
|
61
|
+
const amount = role === undefined || value === undefined ? undefined : amountOf(value.text, value.start, noteOf(label.text), words);
|
|
62
|
+
return role === undefined || amount === undefined ? [] : [{ ...amount, role }];
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const issuesOf = (scopes: readonly (readonly BalanceAmount[])[], words: BalanceWords): NetIssue[] =>
|
|
66
|
+
scopes.flatMap((amounts) => {
|
|
67
|
+
const issue = closingMismatch(amounts, words);
|
|
68
|
+
return issue === undefined ? [] : [issue];
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/** A table whose header names the four columns (one month a row): each body row of the same width is one scope. */
|
|
72
|
+
const byColumns = (header: readonly NetCell[], rows: readonly (readonly NetCell[])[], words: BalanceWords): NetIssue[] =>
|
|
73
|
+
issuesOf(
|
|
74
|
+
rows.filter((row) => row.length === header.length).map((row) => labelledCells(header, row, words)),
|
|
75
|
+
words,
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
/** A table whose rows are labelled in their first cell: each column after the labels is one scope. */
|
|
79
|
+
const byRows = (rows: readonly (readonly NetCell[])[], words: BalanceWords): NetIssue[] => {
|
|
80
|
+
const labelled = rows.filter((row) => row[0] !== undefined && balanceRoleOf(row[0].text, words) !== undefined);
|
|
81
|
+
const width = labelled[0]?.length ?? 0;
|
|
82
|
+
if (labelled.length === 0 || labelled.some((row) => row.length !== width)) return [];
|
|
83
|
+
const columns = Array.from({ length: width - 1 }, (_, index) => index + 1);
|
|
84
|
+
return issuesOf(
|
|
85
|
+
columns.map((column) => labelled.flatMap((row) => labelledCells(row.slice(0, 1), row.slice(column, column + 1), words))),
|
|
86
|
+
words,
|
|
87
|
+
);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* One table, read both ways. A table of transactions with a running balance (日付, お預入れ, お引出し, 残高) names none of the
|
|
92
|
+
* four totals in its header or its first column, so it gives no scope; running-balance-mismatch reads it row by row.
|
|
93
|
+
*/
|
|
94
|
+
export const tableClosingMismatches = (header: readonly NetCell[], rows: readonly (readonly NetCell[])[], words: BalanceWords): NetIssue[] => {
|
|
95
|
+
const issues = [...byColumns(header, rows, words), ...byRows(rows, words)];
|
|
96
|
+
return issues.filter((issue, index) => issues.findIndex((other) => other.offset === issue.offset) === index);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/** The labelled lines of one section (前月末残高:412,350円). */
|
|
100
|
+
export const sectionClosingMismatch = (lines: readonly LabelledLine[], words: BalanceWords): NetIssue | undefined =>
|
|
101
|
+
closingMismatch(
|
|
102
|
+
lines.flatMap((line) => labelledCells([{ start: 0, text: line.label }], [line.value], words)),
|
|
103
|
+
words,
|
|
104
|
+
);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { cellsOf, tablesOf, type Cell } from "../facts/table-facts.ts";
|
|
2
|
+
import { withoutEdgeMarks } from "../facts/trim-marks.ts";
|
|
3
|
+
import type { PairedIssue, OrderDate } from "./labelled-date-order.ts";
|
|
4
|
+
import { labelPairsOf, type LabelPair, type OrderLabel } from "./labelled-order.ts";
|
|
5
|
+
import { linesOf, type Line } from "./lines.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Two dates of one table row that must come in order: a table whose header names an earlier-date column and a
|
|
9
|
+
* later-date column of one pair (| ご利用日 | 獲得ポイント | 有効期限 |, | Date | Points | Expires |). Each row is compared
|
|
10
|
+
* with itself only: a column is never paired with another table's. A header naming either side twice is not read, nor is
|
|
11
|
+
* a cell without exactly one full date, nor a row with a passed word (期限切れ, expired). A group with context words is
|
|
12
|
+
* read only when another header column contains one: a Date and Expiration date of a claims log are not a points table. Pure.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const FULL_DATE = /^\d{4}-\d{2}-\d{2}$/u;
|
|
16
|
+
|
|
17
|
+
const keyOf = (text: string): string => withoutEdgeMarks(text).normalize("NFKC").toLowerCase().replace(/\s+/gu, " ");
|
|
18
|
+
|
|
19
|
+
type Column = { readonly index: number; readonly label: string };
|
|
20
|
+
|
|
21
|
+
/** The one header column that is one of the words, and the word; undefined when none or more than one is. */
|
|
22
|
+
const columnNamed = (header: readonly Cell[], words: readonly string[]): Column | undefined => {
|
|
23
|
+
const named = header.flatMap((cell, index) => {
|
|
24
|
+
const label = words.find((word) => keyOf(word) === keyOf(cell.text));
|
|
25
|
+
return label === undefined ? [] : [{ index, label }];
|
|
26
|
+
});
|
|
27
|
+
return named.length === 1 ? named[0] : undefined;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const oneDateIn = (cell: Cell | undefined, dates: readonly OrderDate[]): OrderDate | undefined => {
|
|
31
|
+
if (cell === undefined) return undefined;
|
|
32
|
+
const within = dates.filter((date) => date.offset >= cell.start && (date.end ?? date.offset) <= cell.end && FULL_DATE.test(date.value));
|
|
33
|
+
return within.length === 1 ? within[0] : undefined;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type Table = { readonly header: Line; readonly rows: readonly Line[] };
|
|
37
|
+
|
|
38
|
+
/** A group's words without a position name what the table is about: another header column must contain one (獲得ポイント). */
|
|
39
|
+
type GroupPair = LabelPair & { readonly context: readonly string[] };
|
|
40
|
+
|
|
41
|
+
const groupPairsOf = (labels: readonly OrderLabel[]): GroupPair[] =>
|
|
42
|
+
[...new Set(labels.flatMap((label) => (label.group === undefined ? [] : [label.group])))].flatMap((group) => {
|
|
43
|
+
const ofGroup = labels.filter((label) => label.group === group);
|
|
44
|
+
const context = ofGroup.flatMap((label) => (label.position === undefined ? [keyOf(label.pattern)] : []));
|
|
45
|
+
return labelPairsOf(ofGroup).map((pair) => ({ ...pair, context }));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const aboutContext = (header: readonly Cell[], context: readonly string[]): boolean =>
|
|
49
|
+
context.length === 0 || header.some((cell) => context.some((word) => keyOf(cell.text).includes(word)));
|
|
50
|
+
|
|
51
|
+
const rowOutOfOrder = (row: Line, earlier: Column, later: Column, dates: readonly OrderDate[]): PairedIssue[] => {
|
|
52
|
+
const cells = cellsOf(row);
|
|
53
|
+
const from = oneDateIn(cells[earlier.index], dates);
|
|
54
|
+
const to = oneDateIn(cells[later.index], dates);
|
|
55
|
+
if (from === undefined || to === undefined || to.value >= from.value) return [];
|
|
56
|
+
const values = { later: to.value, earlier: from.value, later_label: later.label, earlier_label: earlier.label };
|
|
57
|
+
return [{ offset: Math.max(from.offset, to.offset), values, period: false }];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const rowsOutOfOrder = (table: Table, pair: GroupPair, dates: readonly OrderDate[], passed: readonly string[]): PairedIssue[] => {
|
|
61
|
+
const header = cellsOf(table.header);
|
|
62
|
+
const earlier = columnNamed(header, pair.earlier);
|
|
63
|
+
const later = columnNamed(header, pair.later);
|
|
64
|
+
if (earlier === undefined || later === undefined || !aboutContext(header, pair.context)) return [];
|
|
65
|
+
const reported = (row: Line): boolean => passed.some((word) => row.text.toLowerCase().includes(word.toLowerCase()));
|
|
66
|
+
return table.rows.flatMap((row) => (reported(row) ? [] : rowOutOfOrder(row, earlier, later, dates)));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** Every row of a table whose later-column date is before its earlier-column date, for each pair the lexicon names. */
|
|
70
|
+
export const columnDatesOutOfOrder = (source: string, dates: readonly OrderDate[], labels: readonly OrderLabel[], passed: readonly string[]): PairedIssue[] => {
|
|
71
|
+
const tables = tablesOf(linesOf(source));
|
|
72
|
+
return groupPairsOf(labels).flatMap((pair) => tables.flatMap((table) => rowsOutOfOrder(table, pair, dates, passed)));
|
|
73
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Amount } from "./total.ts";
|
|
2
|
+
import type { TimeLength } from "../derived/time-lengths.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 時間と分を続けて書いた長さ(9時間30分、7 hours 30 minutes、7時間半)を、一つの時間の量(9.5時間)として足す。
|
|
6
|
+
* 木は 9時間 と 30分 を別の量に読むので、そのままでは 30分 が落ちた和を合計と比べてしまう。Pure.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const MINUTES_PER_HOUR = 60;
|
|
10
|
+
const HUNDREDTHS = 100;
|
|
11
|
+
|
|
12
|
+
/** 足さない長さの単位に付ける印。どの量とも同じ単位にならないので、その長さがある列の和は取らない。 */
|
|
13
|
+
const UNSUMMABLE = "?";
|
|
14
|
+
|
|
15
|
+
/** 時間の百分の一で割り切れる長さか(15分、30分、45分)。20分は割り切れず、丸めの差が書き誤りに見える。 */
|
|
16
|
+
const exactInHundredths = (minutes: number): boolean => Number.isInteger((minutes * HUNDREDTHS) / MINUTES_PER_HOUR);
|
|
17
|
+
|
|
18
|
+
const unsummable = (length: TimeLength, unit: string): Amount => ({
|
|
19
|
+
offset: length.start,
|
|
20
|
+
end: length.end,
|
|
21
|
+
value: length.minutes / MINUTES_PER_HOUR,
|
|
22
|
+
unit: `${unit}${UNSUMMABLE}${String(length.start)}`,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 長さ一つを足す量に直す。時間の量の後ろに分か半を続けた長さは時間の量に、分が 60 以上か百分の一で割り切れなければ足さない量に、
|
|
27
|
+
* 木が量と読まなかった長さ(8 h)も足さない量にする。時間だけの長さ(8時間、木が数だけを量と読む 8 hours も)と、分から始まる長さ(90分)は、木の量のまま(undefined)。
|
|
28
|
+
*/
|
|
29
|
+
const compoundOf = (length: TimeLength, amounts: readonly Amount[], hourUnits: ReadonlySet<string>): Amount | undefined => {
|
|
30
|
+
const first = amounts.find((amount) => amount.offset === length.start);
|
|
31
|
+
if (first === undefined) return unsummable(length, "");
|
|
32
|
+
if (!hourUnits.has(first.unit)) return undefined;
|
|
33
|
+
const extraMinutes = length.minutes - first.value * MINUTES_PER_HOUR;
|
|
34
|
+
if (extraMinutes === 0) return undefined;
|
|
35
|
+
const readable = extraMinutes > 0 && extraMinutes < MINUTES_PER_HOUR && exactInHundredths(length.minutes);
|
|
36
|
+
if (!readable) return unsummable(length, first.unit);
|
|
37
|
+
return { offset: length.start, end: length.end, value: length.minutes / MINUTES_PER_HOUR, unit: first.unit };
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** amounts の中の、時間と分を続けて書いた長さを、一つの量に置き換える。hourUnits は時間の単位(時間、hours)。 */
|
|
41
|
+
export const withCompoundHours = (amounts: readonly Amount[], lengths: readonly TimeLength[], hourUnits: readonly string[]): Amount[] => {
|
|
42
|
+
const units = new Set(hourUnits);
|
|
43
|
+
const compounds = lengths.flatMap((length) => {
|
|
44
|
+
const compound = compoundOf(length, amounts, units);
|
|
45
|
+
return compound === undefined ? [] : [compound];
|
|
46
|
+
});
|
|
47
|
+
const covered = (amount: Amount): boolean => compounds.some((compound) => amount.offset >= compound.offset && amount.offset < compound.end);
|
|
48
|
+
return [...amounts.filter((amount) => !covered(amount)), ...compounds].toSorted((left, right) => left.offset - right.offset);
|
|
49
|
+
};
|