chaffjs 0.32.0 → 0.34.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.md +7 -0
- package/dist/api.d.ts +7 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js.map +1 -1
- package/dist/cli-text.d.ts.map +1 -1
- package/dist/cli-text.js +6 -4
- package/dist/cli-text.js.map +1 -1
- package/dist/commands/grade.d.ts.map +1 -1
- package/dist/commands/grade.js +66 -21
- package/dist/commands/grade.js.map +1 -1
- package/dist/company-kana-spelling.d.ts +6 -1
- package/dist/company-kana-spelling.d.ts.map +1 -1
- package/dist/company-kana-spelling.js +19 -2
- package/dist/company-kana-spelling.js.map +1 -1
- package/dist/company-name-ending.d.ts +7 -0
- package/dist/company-name-ending.d.ts.map +1 -0
- package/dist/company-name-ending.js +44 -0
- package/dist/company-name-ending.js.map +1 -0
- package/dist/company-names.d.ts +11 -3
- package/dist/company-names.d.ts.map +1 -1
- package/dist/company-names.js +27 -14
- package/dist/company-names.js.map +1 -1
- 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/custom/no-rewrite.d.ts +3 -0
- package/dist/custom/no-rewrite.d.ts.map +1 -0
- package/dist/custom/no-rewrite.js +3 -0
- package/dist/custom/no-rewrite.js.map +1 -0
- package/dist/custom/parse.d.ts.map +1 -1
- package/dist/custom/parse.js +14 -2
- package/dist/custom/parse.js.map +1 -1
- package/dist/detectors/age-words.d.ts +5 -0
- package/dist/detectors/age-words.d.ts.map +1 -0
- package/dist/detectors/age-words.js +8 -0
- package/dist/detectors/age-words.js.map +1 -0
- 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-pay-mismatch.d.ts.map +1 -1
- package/dist/detectors/annual-pay-mismatch.js +2 -12
- package/dist/detectors/annual-pay-mismatch.js.map +1 -1
- package/dist/detectors/blank-structure.d.ts.map +1 -1
- package/dist/detectors/blank-structure.js +4 -3
- package/dist/detectors/blank-structure.js.map +1 -1
- package/dist/detectors/closing-balance-mismatch.d.ts.map +1 -1
- package/dist/detectors/closing-balance-mismatch.js +1 -0
- package/dist/detectors/closing-balance-mismatch.js.map +1 -1
- package/dist/detectors/code-fences.d.ts +5 -0
- package/dist/detectors/code-fences.d.ts.map +1 -1
- package/dist/detectors/code-fences.js +9 -0
- package/dist/detectors/code-fences.js.map +1 -1
- package/dist/detectors/condition-toki.d.ts +16 -0
- package/dist/detectors/condition-toki.d.ts.map +1 -0
- package/dist/detectors/condition-toki.js +42 -0
- package/dist/detectors/condition-toki.js.map +1 -0
- package/dist/detectors/conjugated-entry.d.ts +17 -0
- package/dist/detectors/conjugated-entry.d.ts.map +1 -0
- package/dist/detectors/conjugated-entry.js +50 -0
- package/dist/detectors/conjugated-entry.js.map +1 -0
- package/dist/detectors/content-morphemes.d.ts +2 -0
- package/dist/detectors/content-morphemes.d.ts.map +1 -1
- package/dist/detectors/content-morphemes.js +1 -1
- package/dist/detectors/content-morphemes.js.map +1 -1
- package/dist/detectors/cross-facts.d.ts.map +1 -1
- package/dist/detectors/cross-facts.js +2 -1
- package/dist/detectors/cross-facts.js.map +1 -1
- package/dist/detectors/custom.d.ts.map +1 -1
- package/dist/detectors/custom.js +8 -2
- package/dist/detectors/custom.js.map +1 -1
- package/dist/detectors/document-shape.d.ts.map +1 -1
- package/dist/detectors/document-shape.js +6 -0
- package/dist/detectors/document-shape.js.map +1 -1
- package/dist/detectors/due-date.d.ts.map +1 -1
- package/dist/detectors/due-date.js +12 -2
- package/dist/detectors/due-date.js.map +1 -1
- package/dist/detectors/fact-consistency.d.ts.map +1 -1
- package/dist/detectors/fact-consistency.js +12 -13
- package/dist/detectors/fact-consistency.js.map +1 -1
- package/dist/detectors/form-line.d.ts +9 -0
- package/dist/detectors/form-line.d.ts.map +1 -0
- package/dist/detectors/form-line.js +36 -0
- package/dist/detectors/form-line.js.map +1 -0
- 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 +31 -0
- package/dist/detectors/formula-amount.js.map +1 -0
- package/dist/detectors/heading-claim.d.ts +14 -0
- package/dist/detectors/heading-claim.d.ts.map +1 -0
- package/dist/detectors/heading-claim.js +49 -0
- package/dist/detectors/heading-claim.js.map +1 -0
- package/dist/detectors/heading-echo.d.ts.map +1 -1
- package/dist/detectors/heading-echo.js +29 -1
- package/dist/detectors/heading-echo.js.map +1 -1
- package/dist/detectors/installment-total-mismatch.d.ts.map +1 -1
- package/dist/detectors/installment-total-mismatch.js +28 -19
- package/dist/detectors/installment-total-mismatch.js.map +1 -1
- package/dist/detectors/list-parallel.d.ts +5 -2
- package/dist/detectors/list-parallel.d.ts.map +1 -1
- package/dist/detectors/list-parallel.js +45 -7
- package/dist/detectors/list-parallel.js.map +1 -1
- package/dist/detectors/name-variant.d.ts.map +1 -1
- package/dist/detectors/name-variant.js +34 -7
- package/dist/detectors/name-variant.js.map +1 -1
- package/dist/detectors/number-unit.d.ts +10 -0
- package/dist/detectors/number-unit.d.ts.map +1 -1
- package/dist/detectors/number-unit.js +28 -8
- package/dist/detectors/number-unit.js.map +1 -1
- package/dist/detectors/orthographic-variant.d.ts.map +1 -1
- package/dist/detectors/orthographic-variant.js +4 -3
- package/dist/detectors/orthographic-variant.js.map +1 -1
- package/dist/detectors/orthography.d.ts.map +1 -1
- package/dist/detectors/orthography.js +16 -7
- package/dist/detectors/orthography.js.map +1 -1
- package/dist/detectors/per-unit-words.d.ts +7 -0
- package/dist/detectors/per-unit-words.d.ts.map +1 -0
- package/dist/detectors/per-unit-words.js +17 -0
- package/dist/detectors/per-unit-words.js.map +1 -0
- package/dist/detectors/period-multiple-mismatch.d.ts.map +1 -1
- package/dist/detectors/period-multiple-mismatch.js +2 -12
- package/dist/detectors/period-multiple-mismatch.js.map +1 -1
- package/dist/detectors/reference-number-variant.d.ts.map +1 -1
- package/dist/detectors/reference-number-variant.js +21 -3
- package/dist/detectors/reference-number-variant.js.map +1 -1
- package/dist/detectors/registry/condition-toki.d.ts +3 -0
- package/dist/detectors/registry/condition-toki.d.ts.map +1 -0
- package/dist/detectors/registry/condition-toki.js +3 -0
- package/dist/detectors/registry/condition-toki.js.map +1 -0
- 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/rent-multiple-mismatch.d.ts.map +1 -1
- package/dist/detectors/rent-multiple-mismatch.js +2 -12
- package/dist/detectors/rent-multiple-mismatch.js.map +1 -1
- package/dist/detectors/row-sentence-amounts.d.ts.map +1 -1
- package/dist/detectors/row-sentence-amounts.js +5 -10
- package/dist/detectors/row-sentence-amounts.js.map +1 -1
- package/dist/detectors/stated-amounts.d.ts +4 -0
- package/dist/detectors/stated-amounts.d.ts.map +1 -0
- package/dist/detectors/stated-amounts.js +12 -0
- package/dist/detectors/stated-amounts.js.map +1 -0
- package/dist/detectors/step-time-sum.d.ts.map +1 -1
- package/dist/detectors/step-time-sum.js +2 -1
- package/dist/detectors/step-time-sum.js.map +1 -1
- 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 +7 -2
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/team.d.ts.map +1 -1
- package/dist/detectors/team.js +10 -6
- package/dist/detectors/team.js.map +1 -1
- package/dist/detectors/time-order.d.ts.map +1 -1
- package/dist/detectors/time-order.js +17 -13
- package/dist/detectors/time-order.js.map +1 -1
- package/dist/detectors/unknown-word.d.ts +4 -1
- package/dist/detectors/unknown-word.d.ts.map +1 -1
- package/dist/detectors/unknown-word.js +18 -2
- package/dist/detectors/unknown-word.js.map +1 -1
- package/dist/detectors/use-interval.d.ts +1 -0
- package/dist/detectors/use-interval.d.ts.map +1 -1
- package/dist/detectors/use-interval.js +15 -10
- package/dist/detectors/use-interval.js.map +1 -1
- package/dist/detectors/use-maximum.d.ts.map +1 -1
- package/dist/detectors/use-maximum.js +3 -1
- package/dist/detectors/use-maximum.js.map +1 -1
- package/dist/eval.js +3 -3
- package/dist/eval.js.map +1 -1
- package/dist/extension/document-view.d.ts +2 -2
- package/dist/extension/document-view.d.ts.map +1 -1
- package/dist/extension/document-view.js +17 -8
- package/dist/extension/document-view.js.map +1 -1
- package/dist/extension/entry-genres.d.ts +5 -0
- package/dist/extension/entry-genres.d.ts.map +1 -0
- package/dist/extension/entry-genres.js +13 -0
- package/dist/extension/entry-genres.js.map +1 -0
- package/dist/extension/module-detector.d.ts.map +1 -1
- package/dist/extension/module-detector.js +4 -4
- package/dist/extension/module-detector.js.map +1 -1
- package/dist/extension/plugin-parse.d.ts +1 -1
- package/dist/extension/plugin-parse.d.ts.map +1 -1
- package/dist/extension/plugin-parse.js +24 -7
- package/dist/extension/plugin-parse.js.map +1 -1
- package/dist/extension/problem-text.d.ts.map +1 -1
- package/dist/extension/problem-text.js +2 -0
- package/dist/extension/problem-text.js.map +1 -1
- package/dist/facts/age-values.d.ts.map +1 -1
- package/dist/facts/age-values.js +20 -2
- package/dist/facts/age-values.js.map +1 -1
- package/dist/facts/column-units.d.ts +31 -0
- package/dist/facts/column-units.d.ts.map +1 -0
- package/dist/facts/column-units.js +37 -0
- package/dist/facts/column-units.js.map +1 -0
- package/dist/facts/fact-values.d.ts +4 -0
- package/dist/facts/fact-values.d.ts.map +1 -1
- package/dist/facts/fact-values.js +3 -1
- package/dist/facts/fact-values.js.map +1 -1
- package/dist/facts/labelled-facts.d.ts +10 -0
- package/dist/facts/labelled-facts.d.ts.map +1 -1
- package/dist/facts/labelled-facts.js +6 -1
- package/dist/facts/labelled-facts.js.map +1 -1
- package/dist/facts/per-unit.d.ts +36 -0
- package/dist/facts/per-unit.d.ts.map +1 -0
- package/dist/facts/per-unit.js +56 -0
- package/dist/facts/per-unit.js.map +1 -0
- package/dist/facts/row-sentence-amounts.d.ts +3 -12
- package/dist/facts/row-sentence-amounts.d.ts.map +1 -1
- package/dist/facts/row-sentence-amounts.js +1 -15
- package/dist/facts/row-sentence-amounts.js.map +1 -1
- package/dist/facts/table-facts.d.ts +1 -1
- package/dist/facts/table-facts.d.ts.map +1 -1
- package/dist/facts/table-facts.js +13 -9
- package/dist/facts/table-facts.js.map +1 -1
- package/dist/facts/term-values.d.ts +13 -1
- package/dist/facts/term-values.d.ts.map +1 -1
- package/dist/facts/term-values.js +71 -12
- package/dist/facts/term-values.js.map +1 -1
- package/dist/fix-plan/text.js +2 -2
- package/dist/fix-plan/text.js.map +1 -1
- package/dist/grade/baseline.d.ts +4 -2
- package/dist/grade/baseline.d.ts.map +1 -1
- package/dist/grade/baseline.js +13 -11
- package/dist/grade/baseline.js.map +1 -1
- package/dist/grade/expect-read.d.ts +16 -0
- package/dist/grade/expect-read.d.ts.map +1 -0
- package/dist/grade/expect-read.js +52 -0
- package/dist/grade/expect-read.js.map +1 -0
- package/dist/grade/expect.d.ts +50 -0
- package/dist/grade/expect.d.ts.map +1 -0
- package/dist/grade/expect.js +53 -0
- package/dist/grade/expect.js.map +1 -0
- package/dist/grade/grade-item.d.ts +1 -1
- package/dist/grade/grade-item.d.ts.map +1 -1
- package/dist/grade/grade-item.js +13 -3
- package/dist/grade/grade-item.js.map +1 -1
- package/dist/grade/item.d.ts +9 -1
- package/dist/grade/item.d.ts.map +1 -1
- package/dist/grade/item.js +32 -7
- package/dist/grade/item.js.map +1 -1
- package/dist/grade/result.d.ts +5 -0
- package/dist/grade/result.d.ts.map +1 -1
- package/dist/grade/results-read.d.ts.map +1 -1
- package/dist/grade/results-read.js +4 -2
- package/dist/grade/results-read.js.map +1 -1
- package/dist/grade/rubric-file.d.ts +23 -0
- package/dist/grade/rubric-file.d.ts.map +1 -0
- package/dist/grade/rubric-file.js +35 -0
- package/dist/grade/rubric-file.js.map +1 -0
- package/dist/grade/rubric.d.ts +2 -0
- package/dist/grade/rubric.d.ts.map +1 -1
- package/dist/grade/rubric.js +75 -47
- package/dist/grade/rubric.js.map +1 -1
- package/dist/grade/setup.d.ts +2 -1
- package/dist/grade/setup.d.ts.map +1 -1
- package/dist/grade/setup.js +2 -2
- package/dist/grade/setup.js.map +1 -1
- package/dist/grade/stamp.d.ts +2 -0
- package/dist/grade/stamp.d.ts.map +1 -1
- package/dist/grade/stamp.js +8 -2
- package/dist/grade/stamp.js.map +1 -1
- package/dist/grade/task-rubric.d.ts +16 -0
- package/dist/grade/task-rubric.d.ts.map +1 -0
- package/dist/grade/task-rubric.js +34 -0
- package/dist/grade/task-rubric.js.map +1 -0
- package/dist/grade/text.d.ts +5 -1
- package/dist/grade/text.d.ts.map +1 -1
- package/dist/grade/text.js +16 -4
- package/dist/grade/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 +5 -0
- package/dist/name-char-reading.d.ts.map +1 -1
- package/dist/name-char-reading.js +15 -0
- package/dist/name-char-reading.js.map +1 -1
- package/dist/name-end-letter.d.ts +19 -0
- package/dist/name-end-letter.d.ts.map +1 -0
- package/dist/name-end-letter.js +37 -0
- package/dist/name-end-letter.js.map +1 -0
- package/dist/name-neighbours.d.ts.map +1 -1
- package/dist/name-neighbours.js +2 -1
- package/dist/name-neighbours.js.map +1 -1
- package/dist/name-separator.d.ts +6 -0
- package/dist/name-separator.d.ts.map +1 -1
- package/dist/name-separator.js +29 -0
- package/dist/name-separator.js.map +1 -1
- package/dist/name-variants.d.ts +6 -3
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +37 -10
- package/dist/name-variants.js.map +1 -1
- package/dist/number-name.d.ts.map +1 -1
- package/dist/number-name.js +11 -2
- package/dist/number-name.js.map +1 -1
- package/dist/plugin.d.ts +6 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/profile/cue-lines.d.ts +6 -0
- package/dist/profile/cue-lines.d.ts.map +1 -0
- package/dist/profile/cue-lines.js +13 -0
- package/dist/profile/cue-lines.js.map +1 -0
- package/dist/profile/parse.d.ts +1 -1
- package/dist/profile/parse.d.ts.map +1 -1
- package/dist/profile/parse.js +8 -2
- package/dist/profile/parse.js.map +1 -1
- package/dist/reference-numbers.d.ts +2 -0
- package/dist/reference-numbers.d.ts.map +1 -1
- package/dist/reference-numbers.js +1 -1
- package/dist/reference-numbers.js.map +1 -1
- 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.map +1 -1
- package/dist/spaced-person-name.js +26 -1
- package/dist/spaced-person-name.js.map +1 -1
- package/dist/spacing-code.d.ts.map +1 -1
- package/dist/spacing-code.js +10 -1
- package/dist/spacing-code.js.map +1 -1
- package/dist/spacing-minority.d.ts +7 -0
- package/dist/spacing-minority.d.ts.map +1 -1
- package/dist/spacing-minority.js +14 -0
- package/dist/spacing-minority.js.map +1 -1
- package/dist/structure/closing-balance.d.ts +9 -0
- package/dist/structure/closing-balance.d.ts.map +1 -1
- package/dist/structure/closing-balance.js +34 -7
- package/dist/structure/closing-balance.js.map +1 -1
- package/dist/structure/date-range.d.ts +3 -2
- package/dist/structure/date-range.d.ts.map +1 -1
- package/dist/structure/date-range.js +4 -4
- package/dist/structure/date-range.js.map +1 -1
- package/dist/structure/definition-use.d.ts.map +1 -1
- package/dist/structure/definition-use.js +20 -1
- package/dist/structure/definition-use.js.map +1 -1
- package/dist/structure/document-context.d.ts +2 -0
- package/dist/structure/document-context.d.ts.map +1 -0
- package/dist/structure/document-context.js +42 -0
- package/dist/structure/document-context.js.map +1 -0
- package/dist/structure/fenced-lines.d.ts +7 -0
- package/dist/structure/fenced-lines.d.ts.map +1 -0
- package/dist/structure/fenced-lines.js +27 -0
- package/dist/structure/fenced-lines.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/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 +7 -0
- package/dist/structure/installment-total.d.ts.map +1 -1
- package/dist/structure/installment-total.js +6 -6
- package/dist/structure/installment-total.js.map +1 -1
- package/dist/structure/labelled-date-order.d.ts +31 -9
- package/dist/structure/labelled-date-order.d.ts.map +1 -1
- package/dist/structure/labelled-date-order.js +60 -15
- package/dist/structure/labelled-date-order.js.map +1 -1
- package/dist/structure/labelled-order.d.ts +7 -1
- package/dist/structure/labelled-order.d.ts.map +1 -1
- package/dist/structure/labelled-order.js +10 -3
- package/dist/structure/labelled-order.js.map +1 -1
- package/dist/structure/line-amount-label.d.ts.map +1 -1
- package/dist/structure/line-amount-label.js +2 -1
- package/dist/structure/line-amount-label.js.map +1 -1
- package/dist/structure/line-amount.d.ts +0 -5
- package/dist/structure/line-amount.d.ts.map +1 -1
- package/dist/structure/line-amount.js +1 -10
- package/dist/structure/line-amount.js.map +1 -1
- package/dist/structure/prose-total.d.ts +8 -0
- package/dist/structure/prose-total.d.ts.map +1 -1
- package/dist/structure/prose-total.js +70 -2
- package/dist/structure/prose-total.js.map +1 -1
- package/dist/structure/runs.d.ts.map +1 -1
- package/dist/structure/runs.js +9 -1
- package/dist/structure/runs.js.map +1 -1
- package/dist/structure/signed-date-line.d.ts +15 -0
- package/dist/structure/signed-date-line.d.ts.map +1 -0
- package/dist/structure/signed-date-line.js +68 -0
- package/dist/structure/signed-date-line.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/tax.d.ts.map +1 -1
- package/dist/structure/tax.js +5 -3
- package/dist/structure/tax.js.map +1 -1
- package/dist/structure/total-line.d.ts.map +1 -1
- package/dist/structure/total-line.js +10 -6
- package/dist/structure/total-line.js.map +1 -1
- package/dist/structure/total.d.ts +2 -0
- package/dist/structure/total.d.ts.map +1 -1
- package/dist/structure/total.js +34 -3
- package/dist/structure/total.js.map +1 -1
- package/dist/subject-codes.d.ts +21 -0
- package/dist/subject-codes.d.ts.map +1 -0
- package/dist/subject-codes.js +79 -0
- package/dist/subject-codes.js.map +1 -0
- package/dist/unlabelled-references.d.ts +6 -2
- package/dist/unlabelled-references.d.ts.map +1 -1
- package/dist/unlabelled-references.js +11 -10
- package/dist/unlabelled-references.js.map +1 -1
- package/genres.yaml +17 -0
- package/package.json +4 -4
- package/profiles/listing.yaml +1 -1
- package/profiles/property-sale.yaml +21 -0
- package/rules/closing-balance-mismatch.yaml +3 -3
- package/rules/date-range-reversed.yaml +4 -4
- package/rules/due-before-issue.yaml +9 -5
- package/rules/fact-conflict.yaml +2 -2
- package/rules/formula-amount-mismatch.yaml +67 -0
- package/rules/heading-echo.yaml +2 -2
- package/rules/installment-total-mismatch.yaml +9 -4
- package/rules/internal-jargon.yaml +2 -2
- package/rules/latin-spacing.yaml +4 -4
- package/rules/list-item-form-mix.yaml +1 -1
- package/rules/name-variant.yaml +5 -2
- package/rules/no-lead.yaml +2 -2
- package/rules/number-without-unit.yaml +2 -2
- package/rules/orthographic-variant.yaml +3 -3
- package/rules/reference-number-variant.yaml +3 -3
- package/rules/toki-as-condition.yaml +71 -0
- package/rules/total-mismatch.yaml +4 -4
- package/rules/unknown-word.yaml +2 -2
- package/rules/use-before-definition.yaml +2 -2
- package/src/api.ts +11 -2
- package/src/cli-text.ts +6 -4
- package/src/commands/grade.ts +75 -23
- package/src/company-kana-spelling.ts +22 -2
- package/src/company-name-ending.ts +50 -0
- package/src/company-names.ts +52 -17
- package/src/cross-run.ts +1 -0
- package/src/custom/no-rewrite.ts +2 -0
- package/src/custom/parse.ts +18 -2
- package/src/detectors/age-words.ts +12 -0
- package/src/detectors/agreement-slip.ts +3 -0
- package/src/detectors/annual-pay-mismatch.ts +3 -18
- package/src/detectors/blank-structure.ts +4 -3
- package/src/detectors/closing-balance-mismatch.ts +1 -0
- package/src/detectors/code-fences.ts +10 -0
- package/src/detectors/condition-toki.ts +60 -0
- package/src/detectors/conjugated-entry.ts +53 -0
- package/src/detectors/content-morphemes.ts +2 -1
- package/src/detectors/cross-facts.ts +2 -1
- package/src/detectors/custom.ts +9 -2
- package/src/detectors/document-shape.ts +8 -0
- package/src/detectors/due-date.ts +17 -7
- package/src/detectors/fact-consistency.ts +13 -17
- package/src/detectors/form-line.ts +47 -0
- package/src/detectors/formula-amount.ts +43 -0
- package/src/detectors/heading-claim.ts +76 -0
- package/src/detectors/heading-echo.ts +32 -1
- package/src/detectors/installment-total-mismatch.ts +35 -24
- package/src/detectors/list-parallel.ts +46 -7
- package/src/detectors/name-variant.ts +45 -8
- package/src/detectors/number-unit.ts +35 -9
- package/src/detectors/orthographic-variant.ts +5 -3
- package/src/detectors/orthography.ts +17 -8
- package/src/detectors/per-unit-words.ts +24 -0
- package/src/detectors/period-multiple-mismatch.ts +2 -18
- package/src/detectors/reference-number-variant.ts +27 -5
- package/src/detectors/registry/condition-toki.ts +4 -0
- package/src/detectors/registry/formula-amount.ts +4 -0
- package/src/detectors/rent-multiple-mismatch.ts +2 -18
- package/src/detectors/row-sentence-amounts.ts +5 -20
- package/src/detectors/stated-amounts.ts +20 -0
- package/src/detectors/step-time-sum.ts +2 -1
- package/src/detectors/structure-tree.ts +7 -2
- package/src/detectors/team.ts +13 -7
- package/src/detectors/time-order.ts +6 -3
- package/src/detectors/unknown-word.ts +20 -2
- package/src/detectors/use-interval.ts +8 -4
- package/src/detectors/use-maximum.ts +3 -1
- package/src/eval.ts +3 -3
- package/src/extension/document-view.ts +18 -9
- package/src/extension/entry-genres.ts +15 -0
- package/src/extension/module-detector.ts +9 -4
- package/src/extension/plugin-parse.ts +29 -7
- package/src/extension/problem-text.ts +4 -0
- package/src/facts/age-values.ts +24 -2
- package/src/facts/column-units.ts +67 -0
- package/src/facts/fact-values.ts +11 -1
- package/src/facts/labelled-facts.ts +16 -2
- package/src/facts/per-unit.ts +105 -0
- package/src/facts/row-sentence-amounts.ts +4 -26
- package/src/facts/table-facts.ts +7 -4
- package/src/facts/term-values.ts +94 -13
- package/src/fix-plan/text.ts +2 -2
- package/src/grade/baseline.ts +20 -12
- package/src/grade/expect-read.ts +65 -0
- package/src/grade/expect.ts +74 -0
- package/src/grade/grade-item.ts +14 -3
- package/src/grade/item.ts +48 -8
- package/src/grade/result.ts +5 -0
- package/src/grade/results-read.ts +7 -2
- package/src/grade/rubric-file.ts +46 -0
- package/src/grade/rubric.ts +77 -47
- package/src/grade/setup.ts +3 -3
- package/src/grade/stamp.ts +10 -2
- package/src/grade/task-rubric.ts +39 -0
- package/src/grade/text.ts +27 -5
- package/src/lexicon-genres.ts +11 -0
- package/src/name-char-reading.ts +16 -0
- package/src/name-end-letter.ts +52 -0
- package/src/name-neighbours.ts +2 -1
- package/src/name-separator.ts +32 -0
- package/src/name-variants.ts +54 -13
- package/src/number-name.ts +12 -3
- package/src/plugin.ts +6 -0
- package/src/profile/cue-lines.ts +14 -0
- package/src/profile/parse.ts +11 -2
- package/src/reference-numbers.ts +1 -1
- package/src/run.ts +1 -0
- package/src/spaced-person-name.ts +27 -2
- package/src/spacing-code.ts +13 -2
- package/src/spacing-minority.ts +17 -0
- package/src/structure/closing-balance.ts +46 -8
- package/src/structure/date-range.ts +4 -3
- package/src/structure/definition-use.ts +24 -1
- package/src/structure/document-context.ts +46 -0
- package/src/structure/fenced-lines.ts +28 -0
- package/src/structure/formula-amount.ts +236 -0
- package/src/structure/installment-fee.ts +201 -0
- package/src/structure/installment-total.ts +6 -6
- package/src/structure/labelled-date-order.ts +105 -21
- package/src/structure/labelled-order.ts +21 -10
- package/src/structure/line-amount-label.ts +2 -1
- package/src/structure/line-amount.ts +1 -11
- package/src/structure/prose-total.ts +81 -2
- package/src/structure/runs.ts +10 -1
- package/src/structure/signed-date-line.ts +78 -0
- package/src/structure/start-end-range.ts +120 -0
- package/src/structure/tax.ts +6 -3
- package/src/structure/total-line.ts +12 -6
- package/src/structure/total.ts +42 -3
- package/src/subject-codes.ts +105 -0
- package/src/unlabelled-references.ts +24 -16
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { linesOf } from "./lines.js";
|
|
2
|
+
import { withoutEdgeMarks } from "../facts/trim-marks.js";
|
|
3
|
+
import { leadingText } from "./total.js";
|
|
4
|
+
/**
|
|
5
|
+
* Whether a document says what kind of document it is with one of the words: its title contains one (会議室ご利用御見積書,
|
|
6
|
+
* Meeting Room Quote), or a field's label is one (見積番号:MR-0733, Quote number: Q-1). The title is the first line with
|
|
7
|
+
* text after any front matter, and the first heading; a table row is neither. A label only starting with a word does not
|
|
8
|
+
* count (Withholding tax: on an invoice), nor does a word in a sentence. Width and case are ignored. Pure.
|
|
9
|
+
*/
|
|
10
|
+
const LABEL_SEPARATOR = /[::|]/u;
|
|
11
|
+
const HEADING = /^[ \t]*#+[ \t]*/u;
|
|
12
|
+
const TABLE_ROW = /^[ \t]*\|/u;
|
|
13
|
+
const FRONT_MATTER_FENCE = /^---[ \t]*$/u;
|
|
14
|
+
const keyOf = (text) => text.normalize("NFKC").toLowerCase().replace(/\s+/gu, " ").trim();
|
|
15
|
+
/** The lines after a front matter block (--- … --- at the very top); all of them when there is none. */
|
|
16
|
+
const afterFrontMatter = (lines) => {
|
|
17
|
+
if (!FRONT_MATTER_FENCE.test(lines[0] ?? ""))
|
|
18
|
+
return lines;
|
|
19
|
+
const close = lines.findIndex((line, index) => index > 0 && FRONT_MATTER_FENCE.test(line));
|
|
20
|
+
return close === -1 ? lines : lines.slice(close + 1);
|
|
21
|
+
};
|
|
22
|
+
const titlesOf = (lines) => {
|
|
23
|
+
const first = lines.find((line) => line.trim().length > 0 && !TABLE_ROW.test(line));
|
|
24
|
+
const heading = lines.find((line) => HEADING.test(line));
|
|
25
|
+
return [first, heading].flatMap((line) => (line === undefined ? [] : [keyOf(line.replace(HEADING, ""))]));
|
|
26
|
+
};
|
|
27
|
+
const labelOf = (line) => {
|
|
28
|
+
const lead = leadingText(line);
|
|
29
|
+
const separator = LABEL_SEPARATOR.exec(lead);
|
|
30
|
+
return separator === null ? undefined : keyOf(withoutEdgeMarks(lead.slice(0, separator.index)));
|
|
31
|
+
};
|
|
32
|
+
export const namesDocumentKind = (source, words) => {
|
|
33
|
+
const keys = words.map(keyOf);
|
|
34
|
+
const lines = afterFrontMatter(linesOf(source).map((line) => line.text));
|
|
35
|
+
if (titlesOf(lines).some((title) => keys.some((key) => title.includes(key))))
|
|
36
|
+
return true;
|
|
37
|
+
return lines.some((line) => {
|
|
38
|
+
const label = labelOf(line);
|
|
39
|
+
return label !== undefined && keys.includes(label);
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=document-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-context.js","sourceRoot":"","sources":["../../src/structure/document-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;GAKG;AAEH,MAAM,eAAe,GAAG,QAAQ,CAAC;AACjC,MAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAE1G,wGAAwG;AACxG,MAAM,gBAAgB,GAAG,CAAC,KAAwB,EAAqB,EAAE;IACvE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAwB,EAAY,EAAE;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5G,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAsB,EAAE;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,KAAwB,EAAW,EAAE;IACrF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1F,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The indexes of the lines of fenced code blocks (``` or ~~~), the fences included. A table or a list written in one is an
|
|
3
|
+
* example, not the document's own values. The blocks are the ones the Markdown parser reads (code-fences.ts): a fence in
|
|
4
|
+
* a list item is one, a line indented as code or a fence in a quotation is not, and an unclosed fence runs to the end.
|
|
5
|
+
*/
|
|
6
|
+
export declare const fencedLineIndexes: (texts: readonly string[]) => ReadonlySet<number>;
|
|
7
|
+
//# sourceMappingURL=fenced-lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fenced-lines.d.ts","sourceRoot":"","sources":["../../src/structure/fenced-lines.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,SAAS,MAAM,EAAE,KAAG,WAAW,CAAC,MAAM,CAa9E,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { codeFences } from "../detectors/code-fences.js";
|
|
2
|
+
const FENCE_MARK = /`{3}|~{3}/u;
|
|
3
|
+
const NONE = new Set();
|
|
4
|
+
/** The index of the line holding an offset of the joined lines. */
|
|
5
|
+
const lineIndexAt = (starts, offset) => starts.findLastIndex((start) => start <= offset);
|
|
6
|
+
/**
|
|
7
|
+
* The indexes of the lines of fenced code blocks (``` or ~~~), the fences included. A table or a list written in one is an
|
|
8
|
+
* example, not the document's own values. The blocks are the ones the Markdown parser reads (code-fences.ts): a fence in
|
|
9
|
+
* a list item is one, a line indented as code or a fence in a quotation is not, and an unclosed fence runs to the end.
|
|
10
|
+
*/
|
|
11
|
+
export const fencedLineIndexes = (texts) => {
|
|
12
|
+
if (!texts.some((text) => FENCE_MARK.test(text)))
|
|
13
|
+
return NONE;
|
|
14
|
+
const starts = [];
|
|
15
|
+
texts.reduce((start, text) => {
|
|
16
|
+
starts.push(start);
|
|
17
|
+
return start + text.length + 1;
|
|
18
|
+
}, 0);
|
|
19
|
+
const fenced = new Set();
|
|
20
|
+
codeFences(texts.join("\n")).forEach((fence) => {
|
|
21
|
+
const last = lineIndexAt(starts, Math.max(fence.start, fence.end - 1));
|
|
22
|
+
for (let index = lineIndexAt(starts, fence.start); index <= last; index += 1)
|
|
23
|
+
fenced.add(index);
|
|
24
|
+
});
|
|
25
|
+
return fenced;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=fenced-lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fenced-lines.js","sourceRoot":"","sources":["../../src/structure/fenced-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,MAAM,IAAI,GAAwB,IAAI,GAAG,EAAE,CAAC;AAE5C,mEAAmE;AACnE,MAAM,WAAW,GAAG,CAAC,MAAyB,EAAE,MAAc,EAAU,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;AAE5H;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAwB,EAAuB,EAAE;IACjF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,IAAI,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { StructureIssue } from "./issues.ts";
|
|
2
|
+
import { type Interval, type StatedAmount } from "./stated-multiple.ts";
|
|
3
|
+
import { type TaxPriceWord } from "./tax-price.ts";
|
|
4
|
+
/**
|
|
5
|
+
* formula-amount-mismatch: a row whose label writes the formula of its amount (仲介手数料(売買代金の3%+60,000円、消費税込み)
|
|
6
|
+
* | 1,650,000円, "Commission (5% of the sale price) | $16,200.00") is worked out from the amount the document labels with that
|
|
7
|
+
* name (売買代金 | 48,000,000円) and compared with the row's amount. A label that says the tax is included adds the rate
|
|
8
|
+
* the label states, else the one rate the document states beside a tax word, else the profile's rate. The words come from the
|
|
9
|
+
* lexicons. Pure.
|
|
10
|
+
*/
|
|
11
|
+
export type FormulaWords = {
|
|
12
|
+
/** Words between a name and its rate (売買代金の3%). */
|
|
13
|
+
readonly nameRate: readonly string[];
|
|
14
|
+
/** Words between a rate and its name (3% of the sale price). */
|
|
15
|
+
readonly rateName: readonly string[];
|
|
16
|
+
/** Words before a fixed amount added to the rate's part (+60,000円, plus $500). */
|
|
17
|
+
readonly plus: readonly string[];
|
|
18
|
+
/** The marks of a percent (%, %, percent). */
|
|
19
|
+
readonly percent: readonly string[];
|
|
20
|
+
/** The words of a price with tax and of a tax rate (税込み, 消費税), as tax-mismatch reads them. */
|
|
21
|
+
readonly tax: readonly TaxPriceWord[];
|
|
22
|
+
/** The names of a tax (消費税, VAT) and the words that say it is included (込み, included): 消費税8%込み, VAT included. */
|
|
23
|
+
readonly taxNames: readonly string[];
|
|
24
|
+
readonly includedWords: readonly string[];
|
|
25
|
+
/** Words that say a tax is left out although a word of inclusion stands in them (not included, 含まない). */
|
|
26
|
+
readonly notIncluded: readonly string[];
|
|
27
|
+
};
|
|
28
|
+
export type FormulaText = {
|
|
29
|
+
readonly text: string;
|
|
30
|
+
readonly amounts: readonly StatedAmount[];
|
|
31
|
+
/** The tax rate a label's tax-included word means when neither the label nor the document states one (the profile's). */
|
|
32
|
+
readonly defaultTaxRate: number | undefined;
|
|
33
|
+
};
|
|
34
|
+
/** Whether the written amount is the formula's, rounded down, to nearest or up, before tax or after it, to the unit or the cent. */
|
|
35
|
+
export declare const formulaMatches: (written: number, before: Interval, tax: number) => boolean;
|
|
36
|
+
/** Every row whose label writes its formula and whose amount is not what the formula gives on the named amount. */
|
|
37
|
+
export declare const formulaAmountMismatches: (input: FormulaText, words: FormulaWords) => StructureIssue[];
|
|
38
|
+
//# sourceMappingURL=formula-amount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-amount.d.ts","sourceRoot":"","sources":["../../src/structure/formula-amount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAA2B,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInE;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,8FAA8F;IAC9F,QAAQ,CAAC,GAAG,EAAE,SAAS,YAAY,EAAE,CAAC;IACtC,iHAAiH;IACjH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,yGAAyG;IACzG,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,yHAAyH;IACzH,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C,CAAC;AAiJF,oIAAoI;AACpI,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,EAAE,QAAQ,QAAQ,EAAE,KAAK,MAAM,KAAG,OAM/E,CAAC;AAoCF,mHAAmH;AACnH,eAAO,MAAM,uBAAuB,GAAI,OAAO,WAAW,EAAE,OAAO,YAAY,KAAG,cAAc,EAQ/F,CAAC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { linesOf } from "./lines.js";
|
|
2
|
+
import { alternation, intervalOf } from "./stated-multiple.js";
|
|
3
|
+
import { statedTaxRates } from "./tax-price.js";
|
|
4
|
+
import { roundedMatches } from "./tax.js";
|
|
5
|
+
import { escapeRegExp } from "../orthography.js";
|
|
6
|
+
const CENTS = 100;
|
|
7
|
+
const HUNDRED = 100;
|
|
8
|
+
const NAME_MAX = 40;
|
|
9
|
+
const AFTER_AMOUNT = /^[\s||]*$/u;
|
|
10
|
+
const SEPARATOR = /[||::]\s*$/u;
|
|
11
|
+
const NAME_EDGE = "()()、,,;;||::「」『』";
|
|
12
|
+
const LAST_EDGE = new RegExp(`[${escapeRegExp(NAME_EDGE)}][^${escapeRegExp(NAME_EDGE)}]*$`, "u");
|
|
13
|
+
const LIST_MARK = /^(?:[-*+・]|\d+[.)])\s+/u;
|
|
14
|
+
const DIGITS = /[0-90-9]/u;
|
|
15
|
+
const NUMBER = /\d[\d,]*(?:\.\d+)?/u;
|
|
16
|
+
/** Four digits or more with no comma: the row groups none, so the expected amount is not grouped either. */
|
|
17
|
+
const UNGROUPED = /\d{4}/u;
|
|
18
|
+
const numberOf = (written) => Number(written.normalize("NFKC"));
|
|
19
|
+
const percentPattern = (words) => {
|
|
20
|
+
const marks = alternation(words.percent);
|
|
21
|
+
return marks === undefined ? undefined : new RegExp(`(?<![0-90-9.,.,])([0-90-9]+(?:[..][0-90-9]+)?)\\s?(?:${marks})`, "giu");
|
|
22
|
+
};
|
|
23
|
+
const amountsWithin = (amounts, start, end) => amounts.filter((amount) => amount.offset >= start && amount.end <= end);
|
|
24
|
+
/** The line's last amount, with only a separator before it and nothing after it, and the text before that separator. */
|
|
25
|
+
const rowOf = (text, line, amounts) => {
|
|
26
|
+
const end = line.start + line.text.length;
|
|
27
|
+
const amount = amountsWithin(amounts, line.start, end).at(-1);
|
|
28
|
+
if (amount === undefined || amount.scale !== undefined || !AFTER_AMOUNT.test(text.slice(amount.end, end)))
|
|
29
|
+
return undefined;
|
|
30
|
+
const before = text.slice(line.start, amount.offset);
|
|
31
|
+
const separator = SEPARATOR.exec(before);
|
|
32
|
+
return separator === null ? undefined : { line, label: before.slice(0, separator.index), amount };
|
|
33
|
+
};
|
|
34
|
+
const isName = (name) => name !== "" && name.length <= NAME_MAX && !DIGITS.test(name);
|
|
35
|
+
/** 売買代金の3%: the name runs back from the word to the nearest bracket, comma or cell edge. */
|
|
36
|
+
const nameBefore = (label, rateStart, words) => {
|
|
37
|
+
const head = label.slice(0, rateStart).trimEnd();
|
|
38
|
+
const word = words.nameRate.find((each) => head.toLowerCase().endsWith(each.toLowerCase()));
|
|
39
|
+
if (word === undefined)
|
|
40
|
+
return undefined;
|
|
41
|
+
const upTo = head.slice(0, head.length - word.length);
|
|
42
|
+
const edge = LAST_EDGE.exec(upTo);
|
|
43
|
+
const from = edge === null ? 0 : edge.index + 1;
|
|
44
|
+
const raw = upTo.slice(from).replace(LIST_MARK, "");
|
|
45
|
+
const name = raw.trim();
|
|
46
|
+
return isName(name) ? { start: upTo.length - raw.trimStart().length, end: rateStart, name } : undefined;
|
|
47
|
+
};
|
|
48
|
+
/** 3% of the sale price: the name runs on from the word to a bracket, a comma, a plus word or a tax phrase (incl. tax). */
|
|
49
|
+
const nameAfter = (label, rateEnd, words) => {
|
|
50
|
+
const joiner = alternation(words.rateName);
|
|
51
|
+
const word = joiner === undefined ? null : new RegExp(`^\\s*(?:${joiner})\\s+`, "iu").exec(label.slice(rateEnd));
|
|
52
|
+
if (word === null)
|
|
53
|
+
return undefined;
|
|
54
|
+
const from = rateEnd + word[0].length;
|
|
55
|
+
const taxPhrases = words.tax.filter((each) => each.role !== "rate").map((each) => each.pattern);
|
|
56
|
+
const stops = [`[${escapeRegExp(NAME_EDGE)}]`, alternation([...words.plus, ...taxPhrases]) ?? "(?!)"];
|
|
57
|
+
const stop = new RegExp(stops.join("|"), "iu").exec(label.slice(from));
|
|
58
|
+
const name = label.slice(from, stop === null ? label.length : from + stop.index).trim();
|
|
59
|
+
return isName(name) ? { start: from, end: from + name.length, name } : undefined;
|
|
60
|
+
};
|
|
61
|
+
/** The one rate in the label that names what it is of; two such rates are not read. */
|
|
62
|
+
const formulaIn = (label, words) => {
|
|
63
|
+
const pattern = percentPattern(words);
|
|
64
|
+
if (pattern === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
const found = [...label.matchAll(pattern)].flatMap((match) => {
|
|
67
|
+
const rateEnd = match.index + match[0].length;
|
|
68
|
+
const named = nameBefore(label, match.index, words) ?? nameAfter(label, rateEnd, words);
|
|
69
|
+
if (named === undefined)
|
|
70
|
+
return [];
|
|
71
|
+
return [{ start: Math.min(named.start, match.index), end: Math.max(named.end, rateEnd), rate: numberOf(match[1] ?? ""), name: named.name }];
|
|
72
|
+
});
|
|
73
|
+
const others = [...label.matchAll(pattern)].length - found.length;
|
|
74
|
+
return found.length === 1 && others <= statedTaxRates([label], words.tax).length ? found[0] : undefined;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* The amount right after a plus word after the formula (+60,000円), or none. Undefined when the label holds any other
|
|
78
|
+
* amount, or a plus word with no amount after it: the formula is then not all written in the label.
|
|
79
|
+
*/
|
|
80
|
+
const fixedOf = (text, row, formula, amounts, words) => {
|
|
81
|
+
const inLabel = amountsWithin(amounts, row.line.start, row.line.start + row.label.length);
|
|
82
|
+
const plus = alternation(words.plus);
|
|
83
|
+
const after = row.line.start + formula.end;
|
|
84
|
+
const gap = plus === undefined ? null : new RegExp(`^\\s*(?:${plus})\\s*`, "iu").exec(text.slice(after, row.line.start + row.label.length));
|
|
85
|
+
const fixed = gap === null ? undefined : inLabel.find((amount) => amount.offset === after + gap[0].length);
|
|
86
|
+
if (gap !== null && fixed === undefined)
|
|
87
|
+
return undefined;
|
|
88
|
+
const parts = fixed === undefined ? [] : [fixed];
|
|
89
|
+
return inLabel.length === parts.length ? parts : undefined;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* A word of a price with tax (税込み, incl. tax), or a tax's name with a word of inclusion (消費税8%込み, VAT included); not
|
|
93
|
+
* when the label also says the tax is left out (税別, excl. tax, tax not included).
|
|
94
|
+
*/
|
|
95
|
+
const isTaxIncluded = (label, words) => {
|
|
96
|
+
const lower = label.normalize("NFKC").toLowerCase();
|
|
97
|
+
const holds = (word) => lower.includes(word.normalize("NFKC").toLowerCase());
|
|
98
|
+
const roleHeld = (role) => words.tax.some((word) => word.role === role && holds(word.pattern));
|
|
99
|
+
if (roleHeld("excluded") || words.notIncluded.some(holds))
|
|
100
|
+
return false;
|
|
101
|
+
return roleHeld("included") || (words.taxNames.some(holds) && words.includedWords.some(holds));
|
|
102
|
+
};
|
|
103
|
+
/** 0 without a tax-included word; else the label's one rate, the document's one rate, or the profile's. Undefined when unknown. */
|
|
104
|
+
const taxRateOf = (row, others, text, words) => {
|
|
105
|
+
if (!isTaxIncluded(row.label, words))
|
|
106
|
+
return 0;
|
|
107
|
+
const inLabel = statedTaxRates([row.label], words.tax);
|
|
108
|
+
if (inLabel.length > 0)
|
|
109
|
+
return inLabel.length === 1 ? inLabel[0] : undefined;
|
|
110
|
+
const stated = statedTaxRates(others, words.tax);
|
|
111
|
+
if (stated.length > 0)
|
|
112
|
+
return stated.length === 1 ? stated[0] : undefined;
|
|
113
|
+
return text.defaultTaxRate;
|
|
114
|
+
};
|
|
115
|
+
/** The amount the document labels with the name (売買代金 | 48,000,000円, Sale price: $324,000), when every such label agrees. */
|
|
116
|
+
const baseOf = (text, lines, row, name, amounts) => {
|
|
117
|
+
const label = new RegExp(`^[ \\t]*(?:[-*+][ \\t]+)?(?:[||][ \\t]*)?(?:\\*\\*)?${escapeRegExp(name)}(?:\\*\\*)?[ \\t]*[||::][ \\t]*`, "iu");
|
|
118
|
+
const found = lines.flatMap((line) => {
|
|
119
|
+
const match = line === row.line ? null : label.exec(line.text);
|
|
120
|
+
const amount = match === null ? undefined : amounts.find((each) => each.offset === line.start + match[0].length);
|
|
121
|
+
return amount === undefined || amount.currency !== row.amount.currency ? [] : [amount];
|
|
122
|
+
});
|
|
123
|
+
const [first] = found;
|
|
124
|
+
return found.every((amount) => amount.value === first?.value && amount.scale === first.scale) ? first : undefined;
|
|
125
|
+
};
|
|
126
|
+
/** Before tax: rate × base + fixed. The base is the interval its written digits allow; a formula's fixed part is exact (+6万円 is 60,000). */
|
|
127
|
+
const beforeTax = (text, terms) => {
|
|
128
|
+
const base = intervalOf(terms.base, text.slice(terms.base.offset, terms.base.end));
|
|
129
|
+
const fixed = terms.fixed?.value ?? 0;
|
|
130
|
+
return { low: (base.low * terms.formula.rate) / HUNDRED + fixed, high: (base.high * terms.formula.rate) / HUNDRED + fixed };
|
|
131
|
+
};
|
|
132
|
+
const ROUNDINGS = [(value) => value, Math.floor, Math.round, Math.ceil];
|
|
133
|
+
/** Whether the written amount is the formula's, rounded down, to nearest or up, before tax or after it, to the unit or the cent. */
|
|
134
|
+
export const formulaMatches = (written, before, tax) => {
|
|
135
|
+
const withTax = (value) => (value * (HUNDRED + tax)) / HUNDRED;
|
|
136
|
+
// A base written with a word of scale (4,800万円) is a range; any amount in it, rounded to the unit, is right.
|
|
137
|
+
if (before.low < before.high && written >= Math.floor(withTax(before.low)) && written <= Math.ceil(withTax(before.high)))
|
|
138
|
+
return true;
|
|
139
|
+
const candidates = [before.low, before.high].flatMap((value) => ROUNDINGS.map((round) => withTax(round(value))));
|
|
140
|
+
return candidates.some((candidate) => roundedMatches(Math.round(written * CENTS), candidate * CENTS));
|
|
141
|
+
};
|
|
142
|
+
/** The expected amount as the row writes it: its unit, its grouping and its decimals. */
|
|
143
|
+
const shownLike = (written, value) => {
|
|
144
|
+
const decimals = NUMBER.exec(written.normalize("NFKC"))?.[0].split(".")[1]?.length ?? 0;
|
|
145
|
+
const grouped = written.includes(",") || !UNGROUPED.test(written.normalize("NFKC"));
|
|
146
|
+
const number = value.toLocaleString("en-US", { minimumFractionDigits: decimals, maximumFractionDigits: decimals, useGrouping: grouped });
|
|
147
|
+
return written.normalize("NFKC").replace(NUMBER, number);
|
|
148
|
+
};
|
|
149
|
+
const issueOf = (text, row, terms) => {
|
|
150
|
+
const before = beforeTax(text, terms);
|
|
151
|
+
if (formulaMatches(row.amount.value, before, terms.tax))
|
|
152
|
+
return [];
|
|
153
|
+
const expected = (((before.low + before.high) / 2) * (HUNDRED + terms.tax)) / HUNDRED;
|
|
154
|
+
const values = {
|
|
155
|
+
written: text.slice(row.amount.offset, row.amount.end),
|
|
156
|
+
expected: shownLike(text.slice(row.amount.offset, row.amount.end), Math.round(expected)),
|
|
157
|
+
formula: text.slice(row.line.start + terms.formula.start, terms.fixed?.end ?? row.line.start + terms.formula.end),
|
|
158
|
+
name: terms.formula.name,
|
|
159
|
+
base: text.slice(terms.base.offset, terms.base.end),
|
|
160
|
+
};
|
|
161
|
+
return [{ offset: row.amount.offset, values }];
|
|
162
|
+
};
|
|
163
|
+
const termsOf = (input, lines, row, words) => {
|
|
164
|
+
const formula = formulaIn(row.label, words);
|
|
165
|
+
if (formula === undefined)
|
|
166
|
+
return undefined;
|
|
167
|
+
const fixedList = fixedOf(input.text, row, formula, input.amounts, words);
|
|
168
|
+
const [fixed] = fixedList ?? [];
|
|
169
|
+
if (fixedList === undefined || (fixed !== undefined && fixed.currency !== row.amount.currency))
|
|
170
|
+
return undefined;
|
|
171
|
+
const base = baseOf(input.text, lines, row, formula.name, input.amounts);
|
|
172
|
+
const others = lines.filter((line) => line !== row.line).map((line) => line.text);
|
|
173
|
+
const tax = taxRateOf(row, others, input, words);
|
|
174
|
+
return base === undefined || tax === undefined ? undefined : { formula, base, fixed, tax };
|
|
175
|
+
};
|
|
176
|
+
/** Every row whose label writes its formula and whose amount is not what the formula gives on the named amount. */
|
|
177
|
+
export const formulaAmountMismatches = (input, words) => {
|
|
178
|
+
if (words.percent.length === 0 || words.nameRate.length + words.rateName.length === 0)
|
|
179
|
+
return [];
|
|
180
|
+
const lines = linesOf(input.text);
|
|
181
|
+
return lines.flatMap((line) => {
|
|
182
|
+
const row = rowOf(input.text, line, input.amounts);
|
|
183
|
+
const terms = row === undefined ? undefined : termsOf(input, lines, row, words);
|
|
184
|
+
return row === undefined || terms === undefined ? [] : issueOf(input.text, row, terms);
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=formula-amount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-amount.js","sourceRoot":"","sources":["../../src/structure/formula-amount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAa,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAoC,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAqB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA6CjD,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,mBAAmB,CAAC;AACtC,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjG,MAAM,SAAS,GAAG,yBAAyB,CAAC;AAC5C,MAAM,MAAM,GAAG,WAAW,CAAC;AAC3B,MAAM,MAAM,GAAG,qBAAqB,CAAC;AACrC,4GAA4G;AAC5G,MAAM,SAAS,GAAG,QAAQ,CAAC;AAE3B,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhF,MAAM,cAAc,GAAG,CAAC,KAAmB,EAAsB,EAAE;IACjE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,wDAAwD,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/H,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAgC,EAAE,KAAa,EAAE,GAAW,EAAkB,EAAE,CACrG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAE1E,wHAAwH;AACxH,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,IAAU,EAAE,OAAgC,EAAmB,EAAE;IAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5H,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AACpG,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEvG,4FAA4F;AAC5F,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,SAAiB,EAAE,KAAmB,EAAqB,EAAE;IAC9F,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5F,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACxB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1G,CAAC,CAAC;AAEF,2HAA2H;AAC3H,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,KAAmB,EAAqB,EAAE;IAC3F,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,MAAM,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACjH,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChG,MAAM,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACxF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC,CAAC;AAEF,uFAAuF;AACvF,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,KAAmB,EAAuB,EAAE;IAC5E,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACxF,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACnC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9I,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAClE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,IAAI,cAAc,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1G,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,GAAQ,EAAE,OAAgB,EAAE,OAAgC,EAAE,KAAmB,EAA8B,EAAE;IAC9I,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5I,MAAM,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3G,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,KAAmB,EAAW,EAAE;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,CAAC,IAA0B,EAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9H,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACjG,CAAC,CAAC;AAEF,mIAAmI;AACnI,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAE,MAAyB,EAAE,IAAiB,EAAE,KAAmB,EAAsB,EAAE;IACpH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,OAAO,IAAI,CAAC,cAAc,CAAC;AAC7B,CAAC,CAAC;AAEF,6HAA6H;AAC7H,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAsB,EAAE,GAAQ,EAAE,IAAY,EAAE,OAAgC,EAA4B,EAAE;IAC1I,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,uDAAuD,YAAY,CAAC,IAAI,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC;IAC3I,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjH,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACtB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACpH,CAAC,CAAC;AAEF,4IAA4I;AAC5I,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAY,EAAY,EAAE;IACzD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;AAC9H,CAAC,CAAC;AAEF,MAAM,SAAS,GAA2C,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhH,oIAAoI;AACpI,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,MAAgB,EAAE,GAAW,EAAW,EAAE;IACxF,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;IAC/E,6GAA6G;IAC7G,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACtI,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,yFAAyF;AACzF,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IACzI,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,GAAQ,EAAE,KAAY,EAAoB,EAAE;IACzE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;IACtF,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QACtD,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACjH,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;QACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;KACpD,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,KAAkB,EAAE,KAAsB,EAAE,GAAQ,EAAE,KAAmB,EAAqB,EAAE;IAC/G,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,EAAE,CAAC;IAChC,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACjH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,IAAI,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC7F,CAAC,CAAC;AAEF,mHAAmH;AACnH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAkB,EAAE,KAAmB,EAAoB,EAAE;IACnG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAChF,OAAO,GAAG,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { StructureIssue } from "./issues.ts";
|
|
2
|
+
import { type InstallmentAmount, type InstallmentWords } from "./installment-total.ts";
|
|
3
|
+
/**
|
|
4
|
+
* installment-total-mismatch, the fee form: numbered instalments listed one per row or item (第1回:32,000円, | 1st
|
|
5
|
+
* payment | £150 |, Final payment: $60) that do not add up to the fee stated in the same section (旅行代金は、1人あたり
|
|
6
|
+
* 62,000円; "The trip costs £300 per student"). Compared only when the section states one fee, every instalment of the
|
|
7
|
+
* series is read (numbered 1, 2, … with no gap or repeat, each with one plain amount), the section names a payment
|
|
8
|
+
* (積立金, instalments), and every amount is in the fee's currency. A deposit counts only as an item of the series; one
|
|
9
|
+
* named anywhere else stops the comparison. An instalment as large as the fee says the fee is per payment (a monthly
|
|
10
|
+
* fee), not split, and is not compared. Words come from the lexicons. Pure.
|
|
11
|
+
*/
|
|
12
|
+
type Span = {
|
|
13
|
+
readonly start: number;
|
|
14
|
+
readonly end: number;
|
|
15
|
+
};
|
|
16
|
+
export type InstallmentSeriesWords = {
|
|
17
|
+
/** Item labels with {n} for the instalment's number (第{n}回, {n} payment, Instalment {n}). */
|
|
18
|
+
readonly numbered: readonly string[];
|
|
19
|
+
/** Item labels of the last instalment, numbered after the others (最終回, Final payment). */
|
|
20
|
+
readonly finals: readonly string[];
|
|
21
|
+
/** Numbers written as words that {n} may be (first, 一) and their values. */
|
|
22
|
+
readonly ordinals: readonly {
|
|
23
|
+
readonly word: string;
|
|
24
|
+
readonly value: number;
|
|
25
|
+
}[];
|
|
26
|
+
/** Letters after a number that make it an ordinal (1st). */
|
|
27
|
+
readonly ordinalSuffixes: readonly string[];
|
|
28
|
+
/** Words that say the section is about paying (積立金, instalment); one must stand in the section. */
|
|
29
|
+
readonly payments: readonly string[];
|
|
30
|
+
/** A deposit (申込金, deposit): an item of the series, or a reason not to compare. */
|
|
31
|
+
readonly deposits: readonly string[];
|
|
32
|
+
/** Words that state the fee (旅行代金, costs). */
|
|
33
|
+
readonly fees: readonly string[];
|
|
34
|
+
/** Words that may stand between a fee word and its amount (1人あたり, per student). */
|
|
35
|
+
readonly feeLinks: readonly string[];
|
|
36
|
+
};
|
|
37
|
+
/** One read item of a series: its number (undefined for a deposit, Infinity for a final one) and its amount. */
|
|
38
|
+
type Item = {
|
|
39
|
+
readonly line: Span;
|
|
40
|
+
readonly number: number | undefined;
|
|
41
|
+
readonly amount: InstallmentAmount | undefined;
|
|
42
|
+
};
|
|
43
|
+
/** Whether the numbered items run 1, 2, …, k (a final one only last), each read; deposits may stand anywhere. */
|
|
44
|
+
export declare const isWholeSeries: (items: readonly Item[]) => boolean;
|
|
45
|
+
/** The sections of the text: from one heading to the next; the whole text when there are none. */
|
|
46
|
+
export declare const sectionsOf: (text: string, headingStarts: readonly number[]) => Span[];
|
|
47
|
+
/** Every fee the section states: a fee word, then only separators, links and per-person words before an amount. */
|
|
48
|
+
export declare const feesIn: (text: string, section: Span, amounts: readonly InstallmentAmount[], words: InstallmentWords, series: InstallmentSeriesWords) => InstallmentAmount[];
|
|
49
|
+
/** Every section whose numbered instalments do not add up to its stated fee; reported at the first instalment. */
|
|
50
|
+
export declare const installmentFeeMismatches: (text: string, amounts: readonly InstallmentAmount[], headingStarts: readonly number[], words: InstallmentWords, series: InstallmentSeriesWords) => StructureIssue[];
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=installment-fee.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installment-fee.d.ts","sourceRoot":"","sources":["../../src/structure/installment-fee.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAaL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAEtB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;GAQG;AAEH,KAAK,IAAI,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAAG;IACnC,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChF,4DAA4D;IAC5D,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,gHAAgH;AAChH,KAAK,IAAI,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAA;CAAE,CAAC;AAkEzH,iHAAiH;AACjH,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,IAAI,EAAE,KAAG,OAOtD,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,eAAe,SAAS,MAAM,EAAE,KAAG,IAAI,EAG/E,CAAC;AAEF,mHAAmH;AACnH,eAAO,MAAM,MAAM,GACjB,MAAM,MAAM,EACZ,SAAS,IAAI,EACb,SAAS,SAAS,iBAAiB,EAAE,EACrC,OAAO,gBAAgB,EACvB,QAAQ,sBAAsB,KAC7B,iBAAiB,EASnB,CAAC;AAoCF,kHAAkH;AAClH,eAAO,MAAM,wBAAwB,GACnC,MAAM,MAAM,EACZ,SAAS,SAAS,iBAAiB,EAAE,EACrC,eAAe,SAAS,MAAM,EAAE,EAChC,OAAO,gBAAgB,EACvB,QAAQ,sBAAsB,KAC7B,cAAc,EAOhB,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { escapeRegExp } from "../orthography.js";
|
|
2
|
+
import { alternation, describe, hasWord, intervalOf, isPlainGap, isRough, isTotalOf, lineBounds, occurrences, sentenceAround, sumOf, writtenLike, } from "./installment-total.js";
|
|
3
|
+
/** What may stand before an item label on its line: a table bar, a list mark, spaces. */
|
|
4
|
+
const ITEM_LEAD = /^[\s||\-*+・•]*$/u;
|
|
5
|
+
const DIGITS = "[0-90-9]+";
|
|
6
|
+
const FINAL = Number.POSITIVE_INFINITY;
|
|
7
|
+
const numberPattern = (series) => {
|
|
8
|
+
const suffix = alternation(series.ordinalSuffixes);
|
|
9
|
+
const words = alternation(series.ordinals.map((entry) => entry.word));
|
|
10
|
+
const digits = suffix === undefined ? DIGITS : `${DIGITS}(?:${suffix})?`;
|
|
11
|
+
return words === undefined ? digits : `${digits}|${words}`;
|
|
12
|
+
};
|
|
13
|
+
const numberOf = (written, series) => {
|
|
14
|
+
const digits = /^[0-90-9]+/u.exec(written)?.[0];
|
|
15
|
+
if (digits !== undefined)
|
|
16
|
+
return Number(digits.normalize("NFKC"));
|
|
17
|
+
return series.ordinals.find((entry) => entry.word.toLowerCase() === written.toLowerCase())?.value;
|
|
18
|
+
};
|
|
19
|
+
const labelRegExp = (label, number) => {
|
|
20
|
+
const [before = "", after = ""] = label.split("{n}").map(escapeRegExp);
|
|
21
|
+
const edgeStart = /^[A-Za-z]/u.test(label) ? "(?<![A-Za-z])" : "";
|
|
22
|
+
const edgeEnd = /[A-Za-z]$/u.test(label) ? "(?![A-Za-z])" : "";
|
|
23
|
+
return new RegExp(`${edgeStart}${before}(${number})${after}${edgeEnd}`, "giu");
|
|
24
|
+
};
|
|
25
|
+
const numberedLabels = (text, series) => series.numbered.flatMap((label) => [...text.matchAll(labelRegExp(label, numberPattern(series)))].map((match) => ({
|
|
26
|
+
start: match.index,
|
|
27
|
+
end: match.index + match[0].length,
|
|
28
|
+
number: numberOf(match[1] ?? "", series),
|
|
29
|
+
})));
|
|
30
|
+
const wordLabels = (text, words, number) => occurrences(text, words).map((span) => ({ ...span, number }));
|
|
31
|
+
const startsItem = (text, label) => ITEM_LEAD.test(text.slice(lineBounds(text, label.start).start, label.start));
|
|
32
|
+
/** The longest label at each place wins (Final payment over a bare payment), and only labels that open a row or an item. */
|
|
33
|
+
const itemLabels = (text, series) => {
|
|
34
|
+
const all = [...numberedLabels(text, series), ...wordLabels(text, series.finals, FINAL), ...wordLabels(text, series.deposits, undefined)];
|
|
35
|
+
const longest = all.filter((label) => !all.some((other) => other !== label && other.start <= label.start && other.end >= label.end && other.end - other.start > label.end - label.start));
|
|
36
|
+
return longest.filter((label) => startsItem(text, label)).toSorted((left, right) => left.start - right.start);
|
|
37
|
+
};
|
|
38
|
+
/** A label's amount: the one amount of its line, after a gap of separators, links and payment words; else unread. */
|
|
39
|
+
const itemOf = (text, label, amounts, words, series) => {
|
|
40
|
+
const line = lineBounds(text, label.start);
|
|
41
|
+
const onLine = amounts.filter((amount) => amount.offset >= label.end && amount.end <= line.end);
|
|
42
|
+
const [amount] = onLine;
|
|
43
|
+
const read = onLine.length === 1 &&
|
|
44
|
+
amount !== undefined &&
|
|
45
|
+
isPlainGap(text.slice(label.end, amount.offset), [...words.links, ...series.payments]) &&
|
|
46
|
+
!isRough(text, { start: amount.offset, end: amount.end }, words);
|
|
47
|
+
return { line, number: label.number, amount: read ? amount : undefined };
|
|
48
|
+
};
|
|
49
|
+
/** Whether the numbered items run 1, 2, …, k (a final one only last), each read; deposits may stand anywhere. */
|
|
50
|
+
export const isWholeSeries = (items) => {
|
|
51
|
+
const numbers = items.flatMap((item) => (item.number === undefined ? [] : [item.number]));
|
|
52
|
+
const finalAt = numbers.indexOf(FINAL);
|
|
53
|
+
const counted = numbers.filter((number) => number !== FINAL);
|
|
54
|
+
const inOrder = counted.every((number, index) => number === index + 1);
|
|
55
|
+
const finalLast = finalAt === -1 || finalAt === numbers.length - 1;
|
|
56
|
+
return items.length >= 2 && counted.length >= 1 && inOrder && finalLast && items.every((item) => item.amount !== undefined);
|
|
57
|
+
};
|
|
58
|
+
/** The sections of the text: from one heading to the next; the whole text when there are none. */
|
|
59
|
+
export const sectionsOf = (text, headingStarts) => {
|
|
60
|
+
const starts = [0, ...headingStarts.filter((start) => start > 0 && start < text.length).toSorted((left, right) => left - right)];
|
|
61
|
+
return starts.map((start, index) => ({ start, end: starts[index + 1] ?? text.length }));
|
|
62
|
+
};
|
|
63
|
+
/** Every fee the section states: a fee word, then only separators, links and per-person words before an amount. */
|
|
64
|
+
export const feesIn = (text, section, amounts, words, series) => {
|
|
65
|
+
const body = text.slice(section.start, section.end);
|
|
66
|
+
return occurrences(body, series.fees).flatMap((span) => {
|
|
67
|
+
const at = { start: section.start + span.start, end: section.start + span.end };
|
|
68
|
+
const sentence = sentenceAround(text, at);
|
|
69
|
+
const amount = amounts.find((candidate) => candidate.offset >= at.end && candidate.end <= sentence.end);
|
|
70
|
+
if (amount === undefined || !isPlainGap(text.slice(at.end, amount.offset), [...words.links, ...series.feeLinks]))
|
|
71
|
+
return [];
|
|
72
|
+
return [amount];
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const within = (span, section) => span.start >= section.start && span.end <= section.end;
|
|
76
|
+
const sameAmount = (left, right) => left.value === right.value && left.currency === right.currency;
|
|
77
|
+
const partOf = (text, amount) => ({ count: 1, amount, written: text.slice(amount.offset, amount.end) });
|
|
78
|
+
/** The comparison of one section: its series of instalments against its one fee; undefined when anything is not read. */
|
|
79
|
+
const sectionIssue = (text, section, items, amounts, words, series) => {
|
|
80
|
+
const own = items.filter((item) => within(item.line, section));
|
|
81
|
+
if (!isWholeSeries(own) || !hasWord(text.slice(section.start, section.end), series.payments))
|
|
82
|
+
return undefined;
|
|
83
|
+
const fees = feesIn(text, section, amounts, words, series).filter((fee) => !own.some((item) => within({ start: fee.offset, end: fee.end }, item.line)));
|
|
84
|
+
const [fee] = fees;
|
|
85
|
+
if (fee === undefined || !fees.every((other) => sameAmount(other, fee)) || isRough(text, { start: fee.offset, end: fee.end }, words))
|
|
86
|
+
return undefined;
|
|
87
|
+
const parts = own.flatMap((item) => (item.amount === undefined ? [] : [partOf(text, item.amount)]));
|
|
88
|
+
const [first] = parts;
|
|
89
|
+
if (first === undefined || parts.some((part) => part.amount.currency !== fee.currency || part.amount.value >= fee.value))
|
|
90
|
+
return undefined;
|
|
91
|
+
const written = text.slice(fee.offset, fee.end);
|
|
92
|
+
const sum = sumOf(parts);
|
|
93
|
+
const stated = fee.scale === undefined ? { low: fee.value, high: fee.value } : intervalOf(fee, written);
|
|
94
|
+
if (isTotalOf(stated, sum))
|
|
95
|
+
return undefined;
|
|
96
|
+
return { offset: first.amount.offset, values: { payments: describe(parts), sum: writtenLike((sum.low + sum.high) / 2, first), total: written } };
|
|
97
|
+
};
|
|
98
|
+
/** Whether a deposit is named outside the items of a series: then whether it is part of the fee cannot be read. */
|
|
99
|
+
const depositOutside = (text, items, series) => occurrences(text, series.deposits).some((span) => !items.some((item) => item.number === undefined && within(span, item.line)));
|
|
100
|
+
/** Every section whose numbered instalments do not add up to its stated fee; reported at the first instalment. */
|
|
101
|
+
export const installmentFeeMismatches = (text, amounts, headingStarts, words, series) => {
|
|
102
|
+
const items = itemLabels(text, series).map((label) => itemOf(text, label, amounts, words, series));
|
|
103
|
+
if (items.length < 2 || depositOutside(text, items, series))
|
|
104
|
+
return [];
|
|
105
|
+
return sectionsOf(text, headingStarts).flatMap((section) => {
|
|
106
|
+
const issue = sectionIssue(text, section, items, amounts, words, series);
|
|
107
|
+
return issue === undefined ? [] : [issue];
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=installment-fee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installment-fee.js","sourceRoot":"","sources":["../../src/structure/installment-fee.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,12 +79,18 @@ export type Part = {
|
|
|
79
79
|
readonly amount: InstallmentAmount;
|
|
80
80
|
readonly written: string;
|
|
81
81
|
};
|
|
82
|
+
/** One alternation of the words, longest first so 初回お支払額 wins over 初回. Undefined when there are none. */
|
|
83
|
+
export declare const alternation: (words: readonly string[]) => string | undefined;
|
|
84
|
+
export declare const occurrences: (text: string, words: readonly string[]) => Span[];
|
|
82
85
|
/** Whether only separators and these words stand in a gap on one line (「:」, "の", " of "). */
|
|
83
86
|
export declare const isPlainGap: (gap: string, words: readonly string[]) => boolean;
|
|
87
|
+
export declare const lineBounds: (text: string, offset: number) => Span;
|
|
84
88
|
/** The sentence around a span, within its line. */
|
|
85
89
|
export declare const sentenceAround: (text: string, span: Span) => Span;
|
|
86
90
|
/** The interval a payment's digits allow: half its last written digit either way (9.8万 is 97,500 to 98,500; $550.53 ± half a cent). */
|
|
87
91
|
export declare const intervalOf: (amount: InstallmentAmount, written: string) => Interval;
|
|
92
|
+
export declare const hasWord: (text: string, words: readonly string[]) => boolean;
|
|
93
|
+
export declare const isRough: (text: string, value: Span, words: InstallmentWords) => boolean;
|
|
88
94
|
type Label = Span & {
|
|
89
95
|
readonly kind: LabelKind;
|
|
90
96
|
};
|
|
@@ -104,6 +110,7 @@ export declare const sumOf: (parts: readonly Part[]) => Interval;
|
|
|
104
110
|
export declare const isTotalOf: (total: Interval, sum: Interval) => boolean;
|
|
105
111
|
/** The sum written as the regular payment is written ($26,649.44, 1,971,720円); the bare number when it has a word of scale. */
|
|
106
112
|
export declare const writtenLike: (value: number, part: Part) => string;
|
|
113
|
+
export declare const describe: (parts: readonly Part[]) => string;
|
|
107
114
|
/** Every plan whose payments do not add up to its stated total of payments; reported at the regular payment. */
|
|
108
115
|
export declare const installmentTotalMismatches: (text: string, amounts: readonly InstallmentAmount[], words: InstallmentWords) => StructureIssue[];
|
|
109
116
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installment-total.d.ts","sourceRoot":"","sources":["../../src/structure/installment-total.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"installment-total.d.ts","sourceRoot":"","sources":["../../src/structure/installment-total.ts"],"names":[],"mappings":"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"}
|