chaffjs 0.31.0 → 0.33.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 +124 -255
- package/dist/cli-text.js +2 -2
- 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/cross-run.d.ts.map +1 -1
- package/dist/cross-run.js +1 -0
- package/dist/cross-run.js.map +1 -1
- 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/agreement-slip.d.ts.map +1 -1
- package/dist/detectors/agreement-slip.js +4 -0
- package/dist/detectors/agreement-slip.js.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/formula-amount.d.ts +3 -0
- package/dist/detectors/formula-amount.d.ts.map +1 -0
- package/dist/detectors/formula-amount.js +41 -0
- package/dist/detectors/formula-amount.js.map +1 -0
- 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 +68 -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 +37 -11
- 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/formula-amount.d.ts +3 -0
- package/dist/detectors/registry/formula-amount.d.ts.map +1 -0
- package/dist/detectors/registry/formula-amount.js +3 -0
- package/dist/detectors/registry/formula-amount.js.map +1 -0
- 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 +1 -1
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +46 -12
- 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/eval.js +3 -3
- package/dist/eval.js.map +1 -1
- 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/fix-plan/text.js +2 -2
- package/dist/fix-plan/text.js.map +1 -1
- package/dist/lexicon-genres.d.ts +7 -0
- package/dist/lexicon-genres.d.ts.map +1 -0
- package/dist/lexicon-genres.js +8 -0
- package/dist/lexicon-genres.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 +8 -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/profile/parse.d.ts.map +1 -1
- package/dist/profile/parse.js +5 -0
- package/dist/profile/parse.js.map +1 -1
- 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/run.d.ts.map +1 -1
- package/dist/run.js +1 -0
- package/dist/run.js.map +1 -1
- 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 +5 -3
- package/dist/structure/date-range.d.ts.map +1 -1
- package/dist/structure/date-range.js +7 -9
- 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/formula-amount.d.ts +38 -0
- package/dist/structure/formula-amount.d.ts.map +1 -0
- package/dist/structure/formula-amount.js +187 -0
- package/dist/structure/formula-amount.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-fee.d.ts +52 -0
- package/dist/structure/installment-fee.d.ts.map +1 -0
- package/dist/structure/installment-fee.js +110 -0
- package/dist/structure/installment-fee.js.map +1 -0
- package/dist/structure/installment-total.d.ts +117 -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/start-end-range.d.ts +30 -0
- package/dist/structure/start-end-range.d.ts.map +1 -0
- package/dist/structure/start-end-range.js +79 -0
- package/dist/structure/start-end-range.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 +5 -4
- package/profiles/property-sale.yaml +21 -0
- 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 +4 -4
- 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/formula-amount-mismatch.yaml +67 -0
- 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 +63 -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 +5 -5
- 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/cli-text.ts +2 -2
- 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/cross-run.ts +1 -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/agreement-slip.ts +3 -0
- 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/formula-amount.ts +59 -0
- 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 +94 -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 +43 -11
- 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/formula-amount.ts +4 -0
- 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 +62 -12
- 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/eval.ts +3 -3
- 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/fix-plan/text.ts +2 -2
- package/src/lexicon-genres.ts +11 -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 +8 -0
- package/src/product-names.ts +98 -0
- package/src/profile/parse.ts +8 -0
- package/src/reference-numbers.ts +55 -0
- package/src/run.ts +1 -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 +9 -11
- 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/formula-amount.ts +236 -0
- package/src/structure/generic-role.ts +8 -0
- package/src/structure/gpa.ts +218 -0
- package/src/structure/installment-fee.ts +201 -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/start-end-range.ts +120 -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,139 @@
|
|
|
1
|
+
import { cellsOf, tablesOf, type Cell } from "../facts/table-facts.ts";
|
|
2
|
+
import { withoutEdgeMarks } from "../facts/trim-marks.ts";
|
|
3
|
+
import { linesOf, type Line } from "./lines.ts";
|
|
4
|
+
import { withoutTrailingNote, type MeterEntry, type MeterGroup, type MeterKind, type MeterUnitWord } from "./meter-usage.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 検針票の名前の付いた値を、まとまりごとに集める。まとまりは見出しから次の見出しまで。値は三つの書き方から読む。
|
|
8
|
+
* 「今回指示数:12,640」の行、行の見出しが名前の表(| 今回指示数 | 12,640 |)、列の見出しが名前の表
|
|
9
|
+
* (| 今回指示数 | 前回指示数 | ご使用量 |)。列の見出しが名前の表で本体が二行以上なら、行ごとに別のメーターとして一つの
|
|
10
|
+
* まとまりにする。名前は語彙表 meter-reading-label から、列の見出しの単位は meter-unit から来る。Pure.
|
|
11
|
+
*/
|
|
12
|
+
export type MeterLabel = { readonly pattern: string; readonly kind: MeterKind };
|
|
13
|
+
|
|
14
|
+
export type MeterReadWords = { readonly labels: readonly MeterLabel[]; readonly units: readonly MeterUnitWord[] };
|
|
15
|
+
|
|
16
|
+
const LIST_MARK = /^[-*+]\s/u;
|
|
17
|
+
const DIGIT = /\d/u;
|
|
18
|
+
|
|
19
|
+
const keyOf = (text: string): string => withoutEdgeMarks(text).normalize("NFKC").toLowerCase().replace(/\s+/gu, " ").trim();
|
|
20
|
+
|
|
21
|
+
const kindOf = (label: string, words: MeterReadWords): MeterKind | undefined => {
|
|
22
|
+
const key = withoutTrailingNote(keyOf(label));
|
|
23
|
+
return words.labels.find((word) => keyOf(word.pattern) === key)?.kind;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** The unit a column heading names: the heading itself ("kWh") or its bracket ("指示数(kWh)"). */
|
|
27
|
+
const headerUnitOf = (heading: string, words: MeterReadWords): string | undefined => {
|
|
28
|
+
const key = keyOf(heading);
|
|
29
|
+
const bracket = withoutTrailingNote(key);
|
|
30
|
+
const named = bracket === key ? key : key.slice(bracket.length).trim().slice(1, -1).trim();
|
|
31
|
+
return words.units.find((unit) => keyOf(unit.pattern) === named)?.unit;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** "- 今回指示数:12,640" → the label and the value with where the value starts in the line; undefined without a colon. */
|
|
35
|
+
const labelAndValue = (text: string): { label: string; value: string; at: number } | undefined => {
|
|
36
|
+
const colon = [text.indexOf(":"), text.indexOf(":")].filter((index) => index > 0).reduce((first, index) => Math.min(first, index), Infinity);
|
|
37
|
+
if (colon === Infinity) return undefined;
|
|
38
|
+
const label = text.slice(0, colon).trim().replace(LIST_MARK, "");
|
|
39
|
+
const rest = text.slice(colon + 1);
|
|
40
|
+
const value = rest.trim();
|
|
41
|
+
return value === "" ? undefined : { label, value, at: colon + 1 + rest.indexOf(value) };
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const valueStart = (cell: Cell): number => cell.start + (cell.text.length - cell.text.trimStart().length);
|
|
45
|
+
|
|
46
|
+
const entryOf = (kind: MeterKind, cell: Cell, headerUnit: string | undefined): MeterEntry => ({
|
|
47
|
+
kind,
|
|
48
|
+
value: cell.text.trim(),
|
|
49
|
+
offset: valueStart(cell),
|
|
50
|
+
...(headerUnit === undefined ? {} : { headerUnit }),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/** | 今回指示数 | 12,640 |: the row's one cell with a figure in it is the value. */
|
|
54
|
+
const rowEntry = (row: Line, headings: readonly string[], words: MeterReadWords): MeterEntry[] => {
|
|
55
|
+
const [label, ...rest] = cellsOf(row);
|
|
56
|
+
const kind = label === undefined ? undefined : kindOf(label.text, words);
|
|
57
|
+
if (kind === undefined) return [];
|
|
58
|
+
const withFigure = rest.flatMap((cell, index) => (DIGIT.test(cell.text) ? [{ cell, heading: headings[index + 1] ?? "" }] : []));
|
|
59
|
+
const [only, ...more] = withFigure;
|
|
60
|
+
if (only === undefined || more.length > 0) return [];
|
|
61
|
+
return [entryOf(kind, only.cell, headerUnitOf(only.heading, words))];
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/** | 今回指示数 | 前回指示数 | ご使用量 | over one row of values: each named column gives the value under it. */
|
|
65
|
+
const columnEntries = (row: Line, headings: readonly string[], words: MeterReadWords): MeterEntry[] =>
|
|
66
|
+
cellsOf(row).flatMap((cell, index) => {
|
|
67
|
+
const kind = kindOf(headings[index] ?? "", words);
|
|
68
|
+
return kind === undefined ? [] : [entryOf(kind, cell, headerUnitOf(headings[index] ?? "", words))];
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
/** alone: a row of a table with one meter per row, a group by itself; only its own text says what happened to its meter. */
|
|
72
|
+
type Placed = { readonly line: number; readonly entries: readonly MeterEntry[]; readonly alone: boolean; readonly text: string };
|
|
73
|
+
|
|
74
|
+
const MIN_NAMED_COLUMNS = 2;
|
|
75
|
+
|
|
76
|
+
const tableEntries = (table: { header: Line; rows: Line[] }, words: MeterReadWords): Placed[] => {
|
|
77
|
+
const headings = cellsOf(table.header).map((cell) => cell.text);
|
|
78
|
+
const named = headings.filter((heading) => kindOf(heading, words) !== undefined).length;
|
|
79
|
+
if (named >= MIN_NAMED_COLUMNS) {
|
|
80
|
+
const alone = table.rows.length > 1;
|
|
81
|
+
return table.rows.map((row) => ({ line: row.number, entries: columnEntries(row, headings, words), alone, text: row.text }));
|
|
82
|
+
}
|
|
83
|
+
return table.rows.map((row) => ({ line: row.number, entries: rowEntry(row, headings, words), alone: false, text: row.text }));
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const lineEntry = (line: Line, words: MeterReadWords): Placed[] => {
|
|
87
|
+
if (line.text.includes("|")) return [];
|
|
88
|
+
const parts = labelAndValue(line.text);
|
|
89
|
+
const kind = parts === undefined ? undefined : kindOf(parts.label, words);
|
|
90
|
+
if (parts === undefined || kind === undefined) return [];
|
|
91
|
+
return [{ line: line.number, entries: [{ kind, value: parts.value, offset: line.start + parts.at }], alone: false, text: line.text }];
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/** Each line's section: how many headings start at or before it. Index 0 is unused (lines count from 1). */
|
|
95
|
+
const sectionsOf = (lines: readonly Line[], headingLines: readonly number[]): number[] => {
|
|
96
|
+
const headings = new Set(headingLines);
|
|
97
|
+
const sections = [0];
|
|
98
|
+
lines.forEach((line) => sections.push((sections.at(-1) ?? 0) + (headings.has(line.number) ? 1 : 0)));
|
|
99
|
+
return sections;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The groups of a document. text is the prose with its tables (headings blanked, offsets kept); headingLines are the line
|
|
104
|
+
* numbers of its headings, which split it into sections.
|
|
105
|
+
*/
|
|
106
|
+
export const meterGroups = (text: string, headingLines: readonly number[], words: MeterReadWords): MeterGroup[] => {
|
|
107
|
+
const lines = linesOf(text);
|
|
108
|
+
const tables = tablesOf(lines);
|
|
109
|
+
const inTable = new Set(tables.flatMap((table) => [table.header.number, ...table.rows.map((row) => row.number)]));
|
|
110
|
+
const placed = [
|
|
111
|
+
...tables.flatMap((table) => tableEntries(table, words)),
|
|
112
|
+
...lines.filter((line) => !inTable.has(line.number)).flatMap((line) => lineEntry(line, words)),
|
|
113
|
+
].filter((entry) => entry.entries.length > 0);
|
|
114
|
+
if (placed.length === 0) return [];
|
|
115
|
+
const sections = sectionsOf(lines, headingLines);
|
|
116
|
+
const sectionOf = (line: number): number => sections[line] ?? 0;
|
|
117
|
+
const sectionLines = groupedBy(lines, (line) => sectionOf(line.number));
|
|
118
|
+
const alone = placed.filter((entry) => entry.alone).map((entry) => ({ entries: entry.entries, text: entry.text }));
|
|
119
|
+
const bySection = groupedBy(
|
|
120
|
+
placed.filter((entry) => !entry.alone).toSorted((left, right) => left.line - right.line),
|
|
121
|
+
(entry) => sectionOf(entry.line),
|
|
122
|
+
);
|
|
123
|
+
const shared = [...bySection].map(([section, entries]) => ({
|
|
124
|
+
entries: entries.flatMap((entry) => entry.entries),
|
|
125
|
+
text: (sectionLines.get(section) ?? []).map((line) => line.text).join("\n"),
|
|
126
|
+
}));
|
|
127
|
+
return [...shared, ...alone];
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const groupedBy = <T>(items: readonly T[], keyOf: (item: T) => number): Map<number, T[]> => {
|
|
131
|
+
const groups = new Map<number, T[]>();
|
|
132
|
+
items.forEach((item) => {
|
|
133
|
+
const key = keyOf(item);
|
|
134
|
+
const group = groups.get(key);
|
|
135
|
+
if (group === undefined) groups.set(key, [item]);
|
|
136
|
+
else group.push(item);
|
|
137
|
+
});
|
|
138
|
+
return groups;
|
|
139
|
+
};
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { escapeRegExp } from "../orthography.ts";
|
|
2
|
+
import type { StructureIssue } from "./issues.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 検針票で、今回の指示数 − 前回の指示数(乗率があれば × 乗率)が、書いた使用量と合わない所。読む側(meter-usage-read.ts)が
|
|
6
|
+
* 一つのまとまり(見出しから見出しまで、または表の一行)ごとに、語彙表 meter-reading-label の名前の付いた値を集めて渡す。
|
|
7
|
+
* 今回・前回・使用量が一つずつそろい、どれも単位が読めて食い違わないときだけ比べる。今回が前回より小さいのは、メーターが
|
|
8
|
+
* 一巡したと書いてあるとき(同じ節で打ち消していないとき)だけ、前回の桁数の上限を足して読む。乗率が書いてあって読めないとき、メーターを取り替えたと書いて
|
|
9
|
+
* あるときは比べない。使用量は書いた桁までの丸め(切り捨て・四捨五入・切り上げ)を認める。Pure.
|
|
10
|
+
*/
|
|
11
|
+
export type MeterKind = "current" | "previous" | "usage" | "multiplier";
|
|
12
|
+
|
|
13
|
+
export type MeterEntry = {
|
|
14
|
+
readonly kind: MeterKind;
|
|
15
|
+
/** The value as written after its label, or the cell's text. */
|
|
16
|
+
readonly value: string;
|
|
17
|
+
/** Where the value starts in the document. */
|
|
18
|
+
readonly offset: number;
|
|
19
|
+
/** The unit a table heading gives its column ("kWh"), when it gives one. */
|
|
20
|
+
readonly headerUnit?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/** One bill's readings: the named values of a section or a table row, and the section's text (for a stated rollover). */
|
|
24
|
+
export type MeterGroup = { readonly entries: readonly MeterEntry[]; readonly text: string };
|
|
25
|
+
|
|
26
|
+
export type MeterUnitWord = { readonly pattern: string; readonly unit: string };
|
|
27
|
+
|
|
28
|
+
export type MeterWords = {
|
|
29
|
+
/** Unit words and the unit they name (meter-unit): "m³" and "立方メートル" are both m3. */
|
|
30
|
+
readonly units: readonly MeterUnitWord[];
|
|
31
|
+
/** Words saying the meter went past its last figure (meter-event, group rollover). */
|
|
32
|
+
readonly rollover: readonly string[];
|
|
33
|
+
/** Words after a rollover word, in its clause, that deny it (「一巡していません」): meter-event, group rollover-negation-after. */
|
|
34
|
+
readonly rolloverNegationAfter: readonly string[];
|
|
35
|
+
/** Words before a rollover word, in its clause, that deny it ("has not rolled over"): group rollover-negation-before. */
|
|
36
|
+
readonly rolloverNegationBefore: readonly string[];
|
|
37
|
+
/** Words saying the meter was replaced (meter-event, group replaced): the two readings are of different meters. */
|
|
38
|
+
readonly replaced: readonly string[];
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/** A number as written: its value in units of its last digit, and how many decimals it has. */
|
|
42
|
+
type Reading = {
|
|
43
|
+
readonly scaled: bigint;
|
|
44
|
+
readonly decimals: number;
|
|
45
|
+
readonly digits: number;
|
|
46
|
+
readonly unit: string;
|
|
47
|
+
readonly grouped: boolean;
|
|
48
|
+
readonly written: string;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const LEADING_NUMBER = /^(\d{1,3}(?:,\d{3})+|\d+)(?:\.(\d+))?(?![\d,])/u;
|
|
52
|
+
const MULTIPLIER = /^[×x*]?\s*(\d+(?:\.\d+)?)\s*(?:倍|times)?$/u;
|
|
53
|
+
const TEN = 10n;
|
|
54
|
+
|
|
55
|
+
const normal = (text: string): string => text.normalize("NFKC").replace(/[*_`]/gu, "").trim();
|
|
56
|
+
|
|
57
|
+
/** "36m3 (2か月分)" → "36m3": the bracket a value or a name ends with is a note. Brackets are ASCII once NFKC-normalised. */
|
|
58
|
+
export const withoutTrailingNote = (text: string): string => {
|
|
59
|
+
const open = text.lastIndexOf("(");
|
|
60
|
+
return text.endsWith(")") && open >= 0 ? text.slice(0, open).trimEnd() : text;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const unitOf = (word: string, words: MeterWords): string | undefined => {
|
|
64
|
+
const wanted = word.toLowerCase();
|
|
65
|
+
if (wanted === "") return "";
|
|
66
|
+
return words.units.find((unit) => unit.pattern.normalize("NFKC").toLowerCase() === wanted)?.unit;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** "12,640", "350kWh", "36m³(2か月分)". Undefined when the value is not one number, or its word is not a meter unit. */
|
|
70
|
+
export const readingOf = (entry: MeterEntry, words: MeterWords): Reading | undefined => {
|
|
71
|
+
const written = normal(entry.value);
|
|
72
|
+
const number = withoutTrailingNote(written);
|
|
73
|
+
const match = LEADING_NUMBER.exec(number);
|
|
74
|
+
if (match === null) return undefined;
|
|
75
|
+
const [matched, whole = "", fraction = ""] = match;
|
|
76
|
+
const own = unitOf(number.slice(matched.length).trim(), words);
|
|
77
|
+
if (own === undefined) return undefined;
|
|
78
|
+
const digits = whole.replaceAll(",", "");
|
|
79
|
+
return {
|
|
80
|
+
scaled: BigInt(`${digits}${fraction}`),
|
|
81
|
+
decimals: fraction.length,
|
|
82
|
+
digits: digits.length,
|
|
83
|
+
unit: own === "" ? (entry.headerUnit ?? "") : own,
|
|
84
|
+
grouped: whole.includes(","),
|
|
85
|
+
written,
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/** The multiplier as a scaled number ("×10" → 10, "1.5" → 15 with one decimal); undefined when it cannot be read. */
|
|
90
|
+
export const multiplierOf = (value: string): { readonly scaled: bigint; readonly decimals: number } | undefined => {
|
|
91
|
+
const match = MULTIPLIER.exec(normal(value).toLowerCase());
|
|
92
|
+
if (match === null) return undefined;
|
|
93
|
+
const [whole = "", fraction = ""] = (match[1] ?? "").split(".");
|
|
94
|
+
return { scaled: BigInt(`${whole}${fraction}`), decimals: fraction.length };
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const rescaled = (scaled: bigint, from: number, to: number): bigint => scaled * TEN ** BigInt(to - from);
|
|
98
|
+
|
|
99
|
+
const ofKind = (entries: readonly MeterEntry[], kind: MeterKind): MeterEntry[] => entries.filter((entry) => entry.kind === kind);
|
|
100
|
+
|
|
101
|
+
const folded = (text: string): string => text.normalize("NFKC").toLowerCase().replaceAll("\u2019", "'");
|
|
102
|
+
|
|
103
|
+
const mentions = (text: string, phrases: readonly string[]): boolean => {
|
|
104
|
+
const lowered = folded(text);
|
|
105
|
+
return phrases.some((phrase) => lowered.includes(folded(phrase)));
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** A negation across one of these is about something else: 「一巡しましたが、交換はしていません」. */
|
|
109
|
+
const CLAUSE_END = /[、。,.;:!?\n]/u;
|
|
110
|
+
const LATIN_LETTER = /\p{Script=Latin}/u;
|
|
111
|
+
|
|
112
|
+
const startsOf = (text: string, phrase: string): number[] =>
|
|
113
|
+
phrase === "" ? [] : [...text.matchAll(new RegExp(escapeRegExp(phrase), "gu"))].map((match) => match.index);
|
|
114
|
+
|
|
115
|
+
/** A Latin edge of the phrase must not run on into a letter: "not" is not in "notice", "never" not in "whenever". */
|
|
116
|
+
const isWordAt = (text: string, phrase: string, start: number): boolean => {
|
|
117
|
+
const joins = (edge: string, neighbour: string): boolean => LATIN_LETTER.test(edge) && LATIN_LETTER.test(neighbour);
|
|
118
|
+
return !joins(phrase.at(0) ?? "", text[start - 1] ?? "") && !joins(phrase.at(-1) ?? "", text[start + phrase.length] ?? "");
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/** "has not yet rolled over"; in "was not replaced and rolled over" the "not" is about something else. */
|
|
122
|
+
const MAX_WORDS_AFTER_NEGATION = 1;
|
|
123
|
+
|
|
124
|
+
type Reach = (text: string, end: number) => boolean;
|
|
125
|
+
|
|
126
|
+
const anywhere: Reach = () => true;
|
|
127
|
+
|
|
128
|
+
const nextToEnd: Reach = (text, end) =>
|
|
129
|
+
text
|
|
130
|
+
.slice(end)
|
|
131
|
+
.split(/\s+/u)
|
|
132
|
+
.filter((word) => word !== "").length <= MAX_WORDS_AFTER_NEGATION;
|
|
133
|
+
|
|
134
|
+
const hasWord = (text: string, phrases: readonly string[], reaches: Reach): boolean =>
|
|
135
|
+
phrases.some((phrase) => {
|
|
136
|
+
const wanted = folded(phrase);
|
|
137
|
+
return startsOf(text, wanted).some((start) => isWordAt(text, wanted, start) && reaches(text, start + wanted.length));
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
/** The rollover word at start is denied by a negation in its own clause: after it, or (in English) just before it. */
|
|
141
|
+
const isDenied = (text: string, start: number, length: number, words: MeterWords): boolean => {
|
|
142
|
+
const before = text.slice(0, start).split(CLAUSE_END).at(-1) ?? "";
|
|
143
|
+
const after = text.slice(start + length).split(CLAUSE_END)[0] ?? "";
|
|
144
|
+
return hasWord(after, words.rolloverNegationAfter, anywhere) || hasWord(before, words.rolloverNegationBefore, nextToEnd);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/** Some rollover word is written and not denied in its clause. */
|
|
148
|
+
export const statesRollover = (text: string, words: MeterWords): boolean => {
|
|
149
|
+
const lowered = folded(text);
|
|
150
|
+
return words.rollover.some((phrase) => {
|
|
151
|
+
const wanted = folded(phrase);
|
|
152
|
+
return startsOf(lowered, wanted).some((start) => !isDenied(lowered, start, wanted.length, words));
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/** The units of the three agree: each is unstated or the same one. */
|
|
157
|
+
const unitsAgree = (readings: readonly Reading[]): boolean => new Set(readings.map((reading) => reading.unit).filter((unit) => unit !== "")).size <= 1;
|
|
158
|
+
|
|
159
|
+
/** current − previous at the readings' common scale; a stated rollover adds the previous reading's next power of ten. */
|
|
160
|
+
const difference = (current: Reading, previous: Reading, scale: number, group: MeterGroup, words: MeterWords): bigint | undefined => {
|
|
161
|
+
const plain = rescaled(current.scaled, current.decimals, scale) - rescaled(previous.scaled, previous.decimals, scale);
|
|
162
|
+
if (plain >= 0n) return plain;
|
|
163
|
+
if (!statesRollover(group.text, words)) return undefined;
|
|
164
|
+
return plain + rescaled(TEN ** BigInt(previous.digits), 0, scale);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/** Usage is written to its last digit, so any value within one step of it, either side, is a rounding of it. */
|
|
168
|
+
const withinRounding = (expected: bigint, usage: Reading, scale: number): boolean => {
|
|
169
|
+
const gap = expected - rescaled(usage.scaled, usage.decimals, scale);
|
|
170
|
+
const step = TEN ** BigInt(scale - usage.decimals);
|
|
171
|
+
return gap < step && gap > -step;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const shown = (scaled: bigint, decimals: number, grouped: boolean): string => {
|
|
175
|
+
const text = scaled.toString().padStart(decimals + 1, "0");
|
|
176
|
+
const whole = text.slice(0, text.length - decimals);
|
|
177
|
+
const groupedWhole = grouped ? BigInt(whole).toLocaleString("en-US") : whole;
|
|
178
|
+
return decimals === 0 ? groupedWhole : `${groupedWhole}.${text.slice(text.length - decimals)}`;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
type Parts = { readonly current: MeterEntry; readonly previous: MeterEntry; readonly usage: MeterEntry; readonly multiplier: MeterEntry | undefined };
|
|
182
|
+
|
|
183
|
+
/** One of each of the three, and at most one multiplier; two meters in one place are not told apart. */
|
|
184
|
+
const partsOf = (group: MeterGroup): Parts | undefined => {
|
|
185
|
+
const [current, ...moreCurrent] = ofKind(group.entries, "current");
|
|
186
|
+
const [previous, ...morePrevious] = ofKind(group.entries, "previous");
|
|
187
|
+
const [usage, ...moreUsage] = ofKind(group.entries, "usage");
|
|
188
|
+
const [multiplier, ...moreMultiplier] = ofKind(group.entries, "multiplier");
|
|
189
|
+
if (current === undefined || previous === undefined || usage === undefined) return undefined;
|
|
190
|
+
if (moreCurrent.length + morePrevious.length + moreUsage.length + moreMultiplier.length > 0) return undefined;
|
|
191
|
+
return { current, previous, usage, multiplier };
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const groupIssue = (group: MeterGroup, words: MeterWords): StructureIssue[] => {
|
|
195
|
+
const parts = partsOf(group);
|
|
196
|
+
if (parts === undefined || mentions(group.text, words.replaced)) return [];
|
|
197
|
+
const current = readingOf(parts.current, words);
|
|
198
|
+
const previous = readingOf(parts.previous, words);
|
|
199
|
+
const usage = readingOf(parts.usage, words);
|
|
200
|
+
const factor = parts.multiplier === undefined ? { scaled: 1n, decimals: 0 } : multiplierOf(parts.multiplier.value);
|
|
201
|
+
if (current === undefined || previous === undefined || usage === undefined || factor === undefined) return [];
|
|
202
|
+
if (!unitsAgree([current, previous, usage])) return [];
|
|
203
|
+
const readScale = Math.max(current.decimals, previous.decimals);
|
|
204
|
+
const diff = difference(current, previous, readScale, group, words);
|
|
205
|
+
if (diff === undefined) return [];
|
|
206
|
+
const scale = Math.max(readScale + factor.decimals, usage.decimals);
|
|
207
|
+
const expected = rescaled(diff * factor.scaled, readScale + factor.decimals, scale);
|
|
208
|
+
if (withinRounding(expected, usage, scale)) return [];
|
|
209
|
+
const times = parts.multiplier === undefined ? "" : ` × ${shown(factor.scaled, factor.decimals, false)}`;
|
|
210
|
+
return [
|
|
211
|
+
{
|
|
212
|
+
offset: parts.current.offset,
|
|
213
|
+
values: {
|
|
214
|
+
current: current.written,
|
|
215
|
+
previous: previous.written,
|
|
216
|
+
times,
|
|
217
|
+
expected: shown(expected, scale, current.grouped || usage.grouped),
|
|
218
|
+
usage: usage.written,
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
];
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export const meterUsageMismatches = (groups: readonly MeterGroup[], words: MeterWords): StructureIssue[] => groups.flatMap((group) => groupIssue(group, words));
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* net-amount-mismatch: the deciding half. A net amount (差引支給額, Net pay) or a taxable amount (課税対象額, Taxable income)
|
|
3
|
+
* against the gross amount (総支給額, Gross pay) minus the total of deductions (控除合計, Total deductions) written in the same
|
|
4
|
+
* table or the same section, or minus the parts of the deductions added up (手付金, 融資金). Which words name them is data
|
|
5
|
+
* (lexicon net-amount-label, grouped gross / deduction / deduction-part / net / taxable); nothing here knows a word of payroll or tax. Pure.
|
|
6
|
+
*/
|
|
7
|
+
import { keyOf, labelKey, noteOf, readNumber } from "./ratio.ts";
|
|
8
|
+
import { withoutPeriod, type TotalQualifier } from "./total-line.ts";
|
|
9
|
+
|
|
10
|
+
export const NET_ROLES = ["gross", "deduction", "deduction-part", "net", "taxable"] as const;
|
|
11
|
+
export type NetRole = (typeof NET_ROLES)[number];
|
|
12
|
+
|
|
13
|
+
/** A period word; group names its term, so "Fall" and "for the fall" are one term. */
|
|
14
|
+
export type NetPeriod = TotalQualifier & { readonly group?: string | undefined };
|
|
15
|
+
|
|
16
|
+
export type NetWords = {
|
|
17
|
+
readonly labels: Readonly<Record<NetRole, readonly string[]>>;
|
|
18
|
+
/** Words of the term an amount is for (net-amount-period: 前期分の, Fall, for the fall), cut off a label before it is read. */
|
|
19
|
+
readonly periods: readonly NetPeriod[];
|
|
20
|
+
/** Names read only with a period on them (Charges, as Fall charges): alone, the word is too common to name a role. */
|
|
21
|
+
readonly periodLabels?: Readonly<Partial<Record<NetRole, readonly string[]>>> | undefined;
|
|
22
|
+
/** Words of magnitude (千, million): an amount written in them is rounded. */
|
|
23
|
+
readonly magnitudes: readonly string[];
|
|
24
|
+
readonly percentUnits: readonly string[];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/** An amount as written in a cell or after a label: the text around its number is its unit. */
|
|
28
|
+
export type NetAmount = {
|
|
29
|
+
readonly start: number;
|
|
30
|
+
readonly value: number;
|
|
31
|
+
readonly decimals: number;
|
|
32
|
+
readonly prefix: string;
|
|
33
|
+
readonly suffix: string;
|
|
34
|
+
/** What the amount is compared on: the marks around the number and the note of its label (Net pay (USD)). */
|
|
35
|
+
readonly unit: string;
|
|
36
|
+
/** The amount as written, and whether its number groups thousands with commas. */
|
|
37
|
+
readonly written: string;
|
|
38
|
+
readonly grouped: boolean;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/** label is the role's word, its note aside: amounts of one label are one value, and parts of different labels add up. */
|
|
42
|
+
export type LabelledAmount = NetAmount & { readonly role: NetRole; readonly period?: string | undefined; readonly label?: string };
|
|
43
|
+
|
|
44
|
+
export type NetIssue = { readonly offset: number; readonly values: Readonly<Record<string, string>> };
|
|
45
|
+
|
|
46
|
+
const DECIMAL_BASE = 10;
|
|
47
|
+
const HALF = 0.5;
|
|
48
|
+
|
|
49
|
+
const roleOfKey = (key: string, words: NetWords, afterPeriod = false): NetRole | undefined =>
|
|
50
|
+
NET_ROLES.find((role) => [...words.labels[role], ...(afterPeriod ? (words.periodLabels?.[role] ?? []) : [])].some((pattern) => keyOf(pattern) === key));
|
|
51
|
+
|
|
52
|
+
/** A label read: the role it names and, when a period was cut off it, which term that period is. */
|
|
53
|
+
export type LabelRead = { readonly role: NetRole; readonly period?: string };
|
|
54
|
+
|
|
55
|
+
const withPeriodCut = (key: string, period: NetPeriod, words: NetWords): LabelRead[] => {
|
|
56
|
+
const rest = withoutPeriod(key, { ...period, pattern: keyOf(period.pattern) });
|
|
57
|
+
const role = rest === undefined || rest === "" ? undefined : roleOfKey(rest, words, true);
|
|
58
|
+
return role === undefined ? [] : [{ role, period: period.group ?? keyOf(period.pattern) }];
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/** The role a label names: the word alone or with a period on its side (前期分の納入額), its note in brackets aside. */
|
|
62
|
+
export const readLabel = (label: string, words: NetWords): LabelRead | undefined => {
|
|
63
|
+
const key = labelKey(label);
|
|
64
|
+
const role = roleOfKey(key, words);
|
|
65
|
+
return role === undefined ? words.periods.flatMap((period) => withPeriodCut(key, period, words))[0] : { role };
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const roleOf = (label: string, words: NetWords): NetRole | undefined => readLabel(label, words)?.role;
|
|
69
|
+
|
|
70
|
+
/** A note that may name a unit: no digit in it (手付金(契約時100万円支払済) describes), and a magnitude or a currency code. */
|
|
71
|
+
const CURRENCY_CODE = /^[((]\s*[A-Z]{3}\s*[))]$/u;
|
|
72
|
+
const DIGIT_IN_NOTE = /\d/u;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The part of a label's note that is a unit. An amount without marks takes its unit from the note (総支給額(千円)). An
|
|
76
|
+
* amount with its own mark keeps only a note naming a magnitude or a currency (Gross pay ($ million), Net pay (USD)); any
|
|
77
|
+
* other note says what the amount is (手付金(契約時にお支払い済み), Loan proceeds (from the buyer's lender)) and is not its unit.
|
|
78
|
+
*/
|
|
79
|
+
const unitNote = (marks: string, labelNote: string, words: Pick<NetWords, "magnitudes">): string => {
|
|
80
|
+
const note = keyOf(labelNote);
|
|
81
|
+
if (marks === "") return note;
|
|
82
|
+
const raw = labelNote.normalize("NFKC").trim();
|
|
83
|
+
const namesUnit = CURRENCY_CODE.test(raw) || words.magnitudes.some((word) => note.includes(keyOf(word)));
|
|
84
|
+
return namesUnit && !DIGIT_IN_NOTE.test(raw) ? note : "";
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/** One plain number with its marks ("256,287円", "$4,301.01"); a percentage, a signed or a bracketed value is not an amount. */
|
|
88
|
+
export const amountOf = (text: string, start: number, labelNote: string, words: Pick<NetWords, "percentUnits" | "magnitudes">): NetAmount | undefined => {
|
|
89
|
+
const cell = readNumber(text);
|
|
90
|
+
if (cell === undefined || words.percentUnits.some((unit) => keyOf(unit) === keyOf(cell.suffix))) return undefined;
|
|
91
|
+
const [prefix, suffix] = [keyOf(cell.prefix), keyOf(cell.suffix)];
|
|
92
|
+
const unit = `${prefix}|${suffix}|${unitNote(prefix + suffix, labelNote, words)}`;
|
|
93
|
+
return { start, value: cell.value, decimals: cell.decimals, prefix, suffix, unit, written: text.trim(), grouped: text.normalize("NFKC").includes(",") };
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/** The one value of a role: all its amounts the same value in the same unit; undefined when there is none or they differ. */
|
|
97
|
+
const onlyAmount = (amounts: readonly LabelledAmount[], role: NetRole): LabelledAmount | undefined => {
|
|
98
|
+
const mine = amounts.filter((amount) => amount.role === role);
|
|
99
|
+
const [first] = mine;
|
|
100
|
+
if (first === undefined) return undefined;
|
|
101
|
+
return mine.every((amount) => amount.value === first.value && amount.unit === first.unit) ? (mine.at(-1) ?? first) : undefined;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/** The parts of the deductions added up: one value per label (手付金 and 融資金), all in one unit; undefined otherwise. */
|
|
105
|
+
const partsTotal = (amounts: readonly LabelledAmount[]): LabelledAmount | undefined => {
|
|
106
|
+
const parts = amounts.filter((amount) => amount.role === "deduction-part");
|
|
107
|
+
const labels = [...new Set(parts.map((amount) => amount.label ?? ""))];
|
|
108
|
+
const perLabel = labels.map((label) =>
|
|
109
|
+
onlyAmount(
|
|
110
|
+
parts.filter((amount) => (amount.label ?? "") === label),
|
|
111
|
+
"deduction-part",
|
|
112
|
+
),
|
|
113
|
+
);
|
|
114
|
+
const values = perLabel.filter((amount): amount is LabelledAmount => amount !== undefined);
|
|
115
|
+
const [first] = values;
|
|
116
|
+
if (first === undefined || values.length !== perLabel.length || values.some((value) => value.unit !== first.unit)) return undefined;
|
|
117
|
+
const value = values.reduce((total, part) => total + part.value, 0);
|
|
118
|
+
return { ...first, value, decimals: Math.max(...values.map((part) => part.decimals)) };
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* What is taken off the gross: the total of deductions when the scope names one (控除合計), so parts written beside it are
|
|
123
|
+
* not counted twice; otherwise the parts added up (売買代金 − 手付金 − 融資金 = 残代金).
|
|
124
|
+
*/
|
|
125
|
+
const deductionOf = (amounts: readonly LabelledAmount[]): LabelledAmount | undefined =>
|
|
126
|
+
amounts.some((amount) => amount.role === "deduction") ? onlyAmount(amounts, "deduction") : partsTotal(amounts);
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* The amount gross minus deductions is compared with: the net, or the taxable amount when the scope names no net. A scope
|
|
130
|
+
* that names both is a payslip whose deductions are what is paid out, not what tax is figured on, so its taxable amount
|
|
131
|
+
* is not compared.
|
|
132
|
+
*/
|
|
133
|
+
const resultOf = (amounts: readonly LabelledAmount[], netNamed: boolean): LabelledAmount | undefined => onlyAmount(amounts, netNamed ? "net" : "taxable");
|
|
134
|
+
|
|
135
|
+
/** A mark of currency and no word of magnitude: the amount is exact. Anything else may be rounded to its last digit. */
|
|
136
|
+
export const isExact = (amount: NetAmount, words: Pick<NetWords, "magnitudes">): boolean =>
|
|
137
|
+
amount.prefix + amount.suffix !== "" && !words.magnitudes.some((word) => `${amount.prefix} ${amount.suffix}`.includes(keyOf(word)));
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* How far the written net may be from gross minus deductions. Exact amounts must agree to their last digit. Rounded ones
|
|
141
|
+
* (千円, $ million, a bare number whose unit is in a heading) may be off by one step of the coarsest last digit: each of
|
|
142
|
+
* the three is rounded on its own, and a difference of one step is what rounding down or to nearest can leave.
|
|
143
|
+
*/
|
|
144
|
+
export const allowedGap = (amounts: readonly NetAmount[], words: NetWords): number => {
|
|
145
|
+
const finest = Math.max(...amounts.map((amount) => amount.decimals));
|
|
146
|
+
const coarsest = Math.min(...amounts.map((amount) => amount.decimals));
|
|
147
|
+
return amounts.every((amount) => isExact(amount, words)) ? HALF * DECIMAL_BASE ** -finest : DECIMAL_BASE ** -coarsest + HALF * DECIMAL_BASE ** -finest;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const DIGIT = /\p{Nd}/u;
|
|
151
|
+
const FULL_WIDTH_DIGIT = /[0-9]/u;
|
|
152
|
+
/** The distance from an ASCII digit, comma or point to its full-width form (0 → 0, , → ,). */
|
|
153
|
+
const FULL_WIDTH_OFFSET = 0xfee0;
|
|
154
|
+
|
|
155
|
+
const toFullWidth = (number: string): string => [...number].map((char) => String.fromCodePoint((char.codePointAt(0) ?? 0) + FULL_WIDTH_OFFSET)).join("");
|
|
156
|
+
|
|
157
|
+
/** The expected net, written the way the net is: the marks around its number, its digits, its decimals, its grouping. */
|
|
158
|
+
export const shown = (value: number, like: NetAmount, decimals: number): string => {
|
|
159
|
+
const ascii = value.toLocaleString("en-US", { minimumFractionDigits: decimals, maximumFractionDigits: decimals, useGrouping: like.grouped });
|
|
160
|
+
const number = FULL_WIDTH_DIGIT.test(like.written) ? toFullWidth(ascii) : ascii;
|
|
161
|
+
const digits = [...like.written].flatMap((char, index) => (DIGIT.test(char) ? [index] : []));
|
|
162
|
+
const [first = 0, last = like.written.length - 1] = [digits[0], digits.at(-1)];
|
|
163
|
+
return `${like.written.slice(0, first)}${number}${like.written.slice(last + 1)}`;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* One scope (a table column, a table row, a section's labelled lines): gross, deductions and net (or taxable) each found,
|
|
168
|
+
* each with one value, all in one unit. The net is reported when it is not gross minus deductions beyond rounding.
|
|
169
|
+
* netNamed is whether the scope has a net label, even one whose value is not a plain amount (a net written as —).
|
|
170
|
+
*/
|
|
171
|
+
export const netMismatch = (
|
|
172
|
+
amounts: readonly LabelledAmount[],
|
|
173
|
+
words: NetWords,
|
|
174
|
+
netNamed = amounts.some((amount) => amount.role === "net"),
|
|
175
|
+
): NetIssue | undefined => {
|
|
176
|
+
const [gross, deduction, net] = [onlyAmount(amounts, "gross"), deductionOf(amounts), resultOf(amounts, netNamed)];
|
|
177
|
+
if (gross === undefined || deduction === undefined || net === undefined) return undefined;
|
|
178
|
+
if (new Set([gross, deduction, net].flatMap((amount) => amount.period ?? [])).size > 1) return undefined;
|
|
179
|
+
if (gross.unit !== deduction.unit || gross.unit !== net.unit) return undefined;
|
|
180
|
+
const expected = gross.value - deduction.value;
|
|
181
|
+
if (!Number.isSafeInteger(Math.round(gross.value * DECIMAL_BASE ** gross.decimals))) return undefined;
|
|
182
|
+
if (expected < 0 || Math.abs(expected - net.value) <= allowedGap([gross, deduction, net], words)) return undefined;
|
|
183
|
+
const decimals = Math.max(gross.decimals, deduction.decimals, net.decimals);
|
|
184
|
+
return { offset: net.start, values: { written: net.written, expected: shown(expected, net, decimals) } };
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/** A table line read as its cells, each without its edge marks, by where it starts. */
|
|
188
|
+
export type NetCell = { readonly start: number; readonly text: string };
|
|
189
|
+
|
|
190
|
+
const namesNet = (labels: readonly NetCell[], words: NetWords): boolean => labels.some((label) => roleOf(label.text, words) === "net");
|
|
191
|
+
const labelCellsOf = (lines: readonly LabelledLine[]): NetCell[] => lines.map((line) => ({ start: 0, text: line.label }));
|
|
192
|
+
|
|
193
|
+
const labelledCells = (labels: readonly NetCell[], values: readonly NetCell[], words: NetWords): LabelledAmount[] =>
|
|
194
|
+
labels.flatMap((label, column) => {
|
|
195
|
+
const read = readLabel(label.text, words);
|
|
196
|
+
const value = values[column];
|
|
197
|
+
const amount = read === undefined || value === undefined ? undefined : amountOf(value.text, value.start, noteOf(label.text), words);
|
|
198
|
+
return read === undefined || amount === undefined ? [] : [{ ...amount, ...read, label: labelKey(label.text) }];
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
/** A table whose header names the three columns: each body row of the same width is one scope. */
|
|
202
|
+
const byColumns = (header: readonly NetCell[], rows: readonly (readonly NetCell[])[], words: NetWords): NetIssue[] =>
|
|
203
|
+
rows.flatMap((row) => {
|
|
204
|
+
if (row.length !== header.length) return [];
|
|
205
|
+
const issue = netMismatch(labelledCells(header, row, words), words, namesNet(header, words));
|
|
206
|
+
return issue === undefined ? [] : [issue];
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
/** A table whose rows are labelled in their first cell: each column after the labels is one scope. */
|
|
210
|
+
const byRows = (rows: readonly (readonly NetCell[])[], words: NetWords): NetIssue[] => {
|
|
211
|
+
const labelled = rows.filter((row) => row[0] !== undefined && roleOf(row[0].text, words) !== undefined);
|
|
212
|
+
const width = labelled[0]?.length ?? 0;
|
|
213
|
+
if (labelled.length === 0 || labelled.some((row) => row.length !== width)) return [];
|
|
214
|
+
return Array.from({ length: width - 1 }, (_, index) => index + 1).flatMap((column) => {
|
|
215
|
+
const amounts = labelled.flatMap((row) => labelledCells([row[0] ?? { start: 0, text: "" }], [row[column] ?? { start: 0, text: "" }], words));
|
|
216
|
+
const issue = netMismatch(
|
|
217
|
+
amounts,
|
|
218
|
+
words,
|
|
219
|
+
namesNet(
|
|
220
|
+
labelled.flatMap((row) => row.slice(0, 1)),
|
|
221
|
+
words,
|
|
222
|
+
),
|
|
223
|
+
);
|
|
224
|
+
return issue === undefined ? [] : [issue];
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/** One table, read both ways: its header naming the columns, and its first column naming the rows. */
|
|
229
|
+
export const tableNetMismatches = (header: readonly NetCell[], rows: readonly (readonly NetCell[])[], words: NetWords): NetIssue[] => {
|
|
230
|
+
const issues = [...byColumns(header, rows, words), ...byRows(rows, words)];
|
|
231
|
+
return issues.filter((issue, index) => issues.findIndex((other) => other.offset === issue.offset) === index);
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/** A line that is a label and its amount (総支給額:117,380円, - Net pay: $1,396.41). */
|
|
235
|
+
export type LabelledLine = { readonly label: string; readonly value: NetCell };
|
|
236
|
+
|
|
237
|
+
/** The labelled lines of one section: each label that names a role, with its amount. */
|
|
238
|
+
export const sectionNetMismatch = (lines: readonly LabelledLine[], words: NetWords): NetIssue | undefined =>
|
|
239
|
+
netMismatch(
|
|
240
|
+
lines.flatMap((line) => labelledCells([{ start: 0, text: line.label }], [line.value], words)),
|
|
241
|
+
words,
|
|
242
|
+
namesNet(labelCellsOf(lines), words),
|
|
243
|
+
);
|