chaffjs 0.33.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/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 +4 -2
- 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/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/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.map +1 -1
- package/dist/detectors/formula-amount.js +2 -12
- package/dist/detectors/formula-amount.js.map +1 -1
- 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 +2 -12
- 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/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/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.map +1 -1
- package/dist/detectors/structure-tree.js +3 -0
- 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/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/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/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/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 +3 -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/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/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/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/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 +3 -3
- package/profiles/listing.yaml +1 -1
- package/rules/closing-balance-mismatch.yaml +3 -3
- package/rules/due-before-issue.yaml +9 -5
- package/rules/fact-conflict.yaml +2 -2
- package/rules/heading-echo.yaml +2 -2
- 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/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 +4 -2
- 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/custom/no-rewrite.ts +2 -0
- package/src/custom/parse.ts +18 -2
- package/src/detectors/age-words.ts +12 -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 +2 -18
- package/src/detectors/heading-claim.ts +76 -0
- package/src/detectors/heading-echo.ts +32 -1
- package/src/detectors/installment-total-mismatch.ts +3 -18
- 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/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/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 +3 -0
- 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/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/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/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/profile/cue-lines.ts +14 -0
- package/src/profile/parse.ts +3 -2
- package/src/reference-numbers.ts +1 -1
- 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/definition-use.ts +24 -1
- package/src/structure/document-context.ts +46 -0
- package/src/structure/fenced-lines.ts +28 -0
- 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/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
package/src/structure/total.ts
CHANGED
|
@@ -53,15 +53,54 @@ export const leadingText = (text: string): string =>
|
|
|
53
53
|
.replace(/^[*_]+/u, "")
|
|
54
54
|
.trimStart();
|
|
55
55
|
|
|
56
|
+
/** 表の行の頭に並ぶ空の升(| | 合計 |)。最初の区切りは残す。 */
|
|
57
|
+
const LEADING_BLANK_CELLS = /^([ \t]*\|)(?:[ \t]*\|)+/u;
|
|
58
|
+
|
|
59
|
+
/** 表の行から頭の空の升を除いたもの。合計の語を最初の空でない升に書いた行を、最初の升に書いた行と同じに読むため。 */
|
|
60
|
+
export const withoutLeadingBlankCells = (row: string): string => row.replace(LEADING_BLANK_CELLS, "$1");
|
|
61
|
+
|
|
56
62
|
/**
|
|
57
|
-
* 合計の語のすぐ後ろ。行や列の終わり、区切り(:
|
|
63
|
+
* 合計の語のすぐ後ろ。行や列の終わり、区切り(: |)、金額。括弧の注記は endsLabel が飛ばす。
|
|
58
64
|
* 「計画」や「Total conversion: 25%」のように語が続くものは合計の行ではない。
|
|
59
65
|
*/
|
|
60
|
-
const AFTER_LABEL = /^[*_]*[ \t\u3000]*(?:$|[
|
|
66
|
+
const AFTER_LABEL = /^[*_]*[ \t\u3000]*(?:$|[::|]|[-−▲△$€£¥¥\p{N}])/u;
|
|
67
|
+
|
|
68
|
+
/** 見出しのすぐ後ろの括弧の注記(合計(税込)、Total (incl. tax))の開き。 */
|
|
69
|
+
const NOTE_OPEN = /^[*_]*[ \t\u3000]*[((]/u;
|
|
70
|
+
const OPENERS = new Set(["(", "("]);
|
|
71
|
+
const CLOSERS = new Set([")", ")"]);
|
|
72
|
+
|
|
73
|
+
type NoteScan = { readonly depth: number; readonly end: number | undefined; readonly stopped: boolean };
|
|
74
|
+
|
|
75
|
+
/** 開きの括弧(start)に対応する閉じの次の位置。中の括弧は何段でもよい。升の区切り(\| でない |)までに閉じなければ undefined。 */
|
|
76
|
+
const noteEnd = (text: string, start: number): number | undefined =>
|
|
77
|
+
text
|
|
78
|
+
.slice(start)
|
|
79
|
+
.split("")
|
|
80
|
+
.reduce<NoteScan>(
|
|
81
|
+
(scan, char, offset) => {
|
|
82
|
+
if (scan.end !== undefined || scan.stopped) return scan;
|
|
83
|
+
if (char === "|" && text[start + offset - 1] !== "\\") return { ...scan, stopped: true };
|
|
84
|
+
const depth = scan.depth + (OPENERS.has(char) ? 1 : 0) - (CLOSERS.has(char) ? 1 : 0);
|
|
85
|
+
return { depth, end: depth === 0 ? start + offset + 1 : undefined, stopped: false };
|
|
86
|
+
},
|
|
87
|
+
{ depth: 0, end: undefined, stopped: false },
|
|
88
|
+
).end;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 見出しの語の後ろが見出しの終わりか。括弧の注記は飛ばして、その後ろを同じに読む。注記の後ろに語が続けば(Tax (10%) workshop、
|
|
92
|
+
* 合計(第1期)設計)、注記の付いた項目の名前。升の中で閉じない括弧は、そこからを注記とみなす。
|
|
93
|
+
*/
|
|
94
|
+
const endsLabel = (rest: string): boolean => {
|
|
95
|
+
const open = NOTE_OPEN.exec(rest);
|
|
96
|
+
if (open === null) return AFTER_LABEL.test(rest);
|
|
97
|
+
const end = noteEnd(rest, open[0].length - 1);
|
|
98
|
+
return end === undefined || endsLabel(rest.slice(end));
|
|
99
|
+
};
|
|
61
100
|
|
|
62
101
|
export const isTotalLabel = (text: string, labels: readonly string[]): boolean => {
|
|
63
102
|
const lead = leadingText(text).toLowerCase();
|
|
64
|
-
return labels.some((label) => lead.startsWith(label.toLowerCase()) &&
|
|
103
|
+
return labels.some((label) => lead.startsWith(label.toLowerCase()) && endsLabel(lead.slice(label.length)));
|
|
65
104
|
};
|
|
66
105
|
|
|
67
106
|
const centsOf = (source: string, line: Line, amount: Amount): number | undefined => {
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// The one code a product document is about (a recall's or a warranty's model): named in its title, or labelled on a line
|
|
2
|
+
// of its own or in a table (型番:NH-805, | Model | MW-4120S |), and written once elsewhere with two neighbours swapped
|
|
3
|
+
// (NH-850). Only when the document names no other code in those places: a catalog naming two is about two items. Pure.
|
|
4
|
+
import type { LexiconEntry, Span } from "./plugin.ts";
|
|
5
|
+
import { labelBefore, swapsNeighbours, withoutUrls } from "./phone-numbers.ts";
|
|
6
|
+
import { charactersOf, LABEL_TO_NUMBER, REFERENCE_SHAPE, type ReferenceNumber, type ReferenceVariant } from "./reference-numbers.ts";
|
|
7
|
+
import { isCodeWith } from "./unlabelled-references.ts";
|
|
8
|
+
|
|
9
|
+
/** Digits enough for a model's code (FT-38); the two letters a short code must hold keep out form names (A-12, B-21). */
|
|
10
|
+
export const MIN_SUBJECT_DIGITS = 2;
|
|
11
|
+
const MIN_SUBJECT_LETTERS = 2;
|
|
12
|
+
const LETTER = /[A-Z]/gu;
|
|
13
|
+
const FIRST_PART = /^[^-‐−-]*/u;
|
|
14
|
+
const TITLE_GROUP = "title";
|
|
15
|
+
|
|
16
|
+
/** A short code: two letters or more before its hyphen, and two digits or more (FT-38, KR-M230; not A-12B). */
|
|
17
|
+
export const isSubjectCode = (written: string): boolean =>
|
|
18
|
+
isCodeWith(MIN_SUBJECT_DIGITS)(written) && (charactersOf(FIRST_PART.exec(written)?.[0] ?? "").match(LETTER)?.length ?? 0) >= MIN_SUBJECT_LETTERS;
|
|
19
|
+
|
|
20
|
+
/** What the document gives: its prose (tables masked), its title as written (the prose masks it), its labels, the groups that name an item, the codes its tables label, and every code in a table. */
|
|
21
|
+
export type SubjectCodeInput = {
|
|
22
|
+
readonly prose: string;
|
|
23
|
+
readonly title: { readonly start: number; readonly text: string } | undefined;
|
|
24
|
+
readonly labels: readonly LexiconEntry[];
|
|
25
|
+
readonly listed: ReadonlySet<string>;
|
|
26
|
+
readonly tabled: readonly ReferenceNumber[];
|
|
27
|
+
readonly known: ReadonlySet<string>;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type CodeWriting = ReferenceNumber & { readonly anchor: boolean; readonly group: string | undefined };
|
|
31
|
+
|
|
32
|
+
const lineAround = (text: string, offset: number): Span => {
|
|
33
|
+
const start = text.lastIndexOf("\n", offset - 1) + 1;
|
|
34
|
+
const end = text.indexOf("\n", offset);
|
|
35
|
+
return { start, end: end === -1 ? text.length : end };
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** Whether a code's line holds a label of the given labels, the separators and the code, and nothing else (型番:NH-805). */
|
|
39
|
+
const isFieldLine = (text: string, offset: number, written: string, between: string, labels: readonly LexiconEntry[]): boolean => {
|
|
40
|
+
const line = lineAround(text, offset);
|
|
41
|
+
const head = text
|
|
42
|
+
.slice(line.start, offset - between.length)
|
|
43
|
+
.trim()
|
|
44
|
+
.toLowerCase();
|
|
45
|
+
const rest = text.slice(offset + written.length, line.end).trim();
|
|
46
|
+
return rest === "" && labels.some((label) => label.pattern.toLowerCase() === head);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const shortCodes = (text: string): RegExpExecArray[] => [...text.matchAll(REFERENCE_SHAPE)].filter((match) => isSubjectCode(match[0]));
|
|
50
|
+
|
|
51
|
+
/** Every short code of the title, each an anchor. */
|
|
52
|
+
const titleWritings = (title: SubjectCodeInput["title"]): CodeWriting[] =>
|
|
53
|
+
title === undefined
|
|
54
|
+
? []
|
|
55
|
+
: shortCodes(title.text).map((match) => ({
|
|
56
|
+
offset: title.start + match.index,
|
|
57
|
+
written: match[0],
|
|
58
|
+
characters: charactersOf(match[0]),
|
|
59
|
+
label: TITLE_GROUP,
|
|
60
|
+
anchor: true,
|
|
61
|
+
group: undefined,
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
/** Every short code of the prose, as an anchor when a field line of a listed kind labels it. */
|
|
65
|
+
const proseWritings = (text: string, input: SubjectCodeInput): CodeWriting[] =>
|
|
66
|
+
shortCodes(text).map((match) => {
|
|
67
|
+
const written = match[0];
|
|
68
|
+
const offset = match.index;
|
|
69
|
+
const label = labelBefore(text, offset, input.labels);
|
|
70
|
+
const group = label !== undefined && LABEL_TO_NUMBER.test(label.between) ? label.group : undefined;
|
|
71
|
+
const onField = group !== undefined && input.listed.has(group) && isFieldLine(text, offset, written, label?.between ?? "", input.labels);
|
|
72
|
+
return { offset, written, characters: charactersOf(written), label: group ?? TITLE_GROUP, anchor: onField, group };
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
/** The title's codes and the prose's, one writing per place. */
|
|
76
|
+
const writingsOf = (text: string, input: SubjectCodeInput): CodeWriting[] => {
|
|
77
|
+
const inTitle = titleWritings(input.title);
|
|
78
|
+
return [...inTitle, ...proseWritings(text, input).filter((writing) => !inTitle.some((title) => title.offset === writing.offset))];
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/** The writings of the document's one code with two neighbours swapped, each written once, of a listed kind or unlabelled, on a line that does not name the code itself. */
|
|
82
|
+
export const subjectCodeVariants = (input: SubjectCodeInput): ReferenceVariant[] => {
|
|
83
|
+
const text = withoutUrls(input.prose);
|
|
84
|
+
const writings = writingsOf(text, input);
|
|
85
|
+
const anchors = [
|
|
86
|
+
...writings.filter((writing) => writing.anchor),
|
|
87
|
+
...input.tabled.filter((code) => input.listed.has(code.label) && isSubjectCode(code.written)),
|
|
88
|
+
];
|
|
89
|
+
const subject = anchors[0];
|
|
90
|
+
if (subject === undefined || anchors.some((anchor) => anchor.characters !== subject.characters)) return [];
|
|
91
|
+
const timesWritten = (characters: string): number => writings.filter((writing) => writing.characters === characters).length;
|
|
92
|
+
return writings.flatMap((writing) => {
|
|
93
|
+
const line = lineAround(text, writing.offset);
|
|
94
|
+
const slip =
|
|
95
|
+
!writing.anchor &&
|
|
96
|
+
(writing.group === undefined || input.listed.has(writing.group)) &&
|
|
97
|
+
!input.known.has(writing.characters) &&
|
|
98
|
+
timesWritten(writing.characters) === 1 &&
|
|
99
|
+
swapsNeighbours(subject.characters, writing.characters) &&
|
|
100
|
+
!writings.some((other) => other.characters === subject.characters && other.offset >= line.start && other.offset < line.end);
|
|
101
|
+
if (!slip) return [];
|
|
102
|
+
const { offset, written, characters } = writing;
|
|
103
|
+
return [{ number: { offset, written, characters, label: subject.label }, other: subject }];
|
|
104
|
+
});
|
|
105
|
+
};
|
|
@@ -8,16 +8,22 @@ import { withoutEdgeMarks } from "./facts/trim-marks.ts";
|
|
|
8
8
|
import { charactersOf, MAX_CHARACTERS, MIN_DIGITS, REFERENCE_SHAPE, type ReferenceNumber, type ReferenceVariant } from "./reference-numbers.ts";
|
|
9
9
|
|
|
10
10
|
const SEPARATOR = /[-‐−-]/u;
|
|
11
|
+
|
|
12
|
+
type CodeShape = (written: string) => boolean;
|
|
11
13
|
const LATIN_LETTER = /[A-Z]/u;
|
|
12
14
|
const DIGIT = /\d/gu;
|
|
13
15
|
|
|
14
|
-
/** A code: letters, a hyphen and
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
/** A code: letters, a hyphen and the given digits or more (GP-0512). A plain number (48215, 2026-118) is never one. */
|
|
17
|
+
export const isCodeWith =
|
|
18
|
+
(minDigits: number) =>
|
|
19
|
+
(written: string): boolean => {
|
|
20
|
+
const characters = charactersOf(written);
|
|
21
|
+
return (
|
|
22
|
+
SEPARATOR.test(written) && LATIN_LETTER.test(characters) && (characters.match(DIGIT)?.length ?? 0) >= minDigits && characters.length <= MAX_CHARACTERS
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const isCode = isCodeWith(MIN_DIGITS);
|
|
21
27
|
|
|
22
28
|
const keyOf = (text: string): string => withoutEdgeMarks(text).normalize("NFKC").toLowerCase();
|
|
23
29
|
|
|
@@ -29,10 +35,10 @@ const labelOfCell = (cell: Cell | undefined, labels: readonly LexiconEntry[]): s
|
|
|
29
35
|
};
|
|
30
36
|
|
|
31
37
|
/** A cell holding one code and nothing else, as a reference number of the group. */
|
|
32
|
-
const codeOfCell = (cell: Cell | undefined, group: string): ReferenceNumber[] => {
|
|
38
|
+
const codeOfCell = (cell: Cell | undefined, group: string, isCodeShape: CodeShape): ReferenceNumber[] => {
|
|
33
39
|
if (cell === undefined) return [];
|
|
34
40
|
const written = withoutEdgeMarks(cell.text);
|
|
35
|
-
if (!
|
|
41
|
+
if (!isCodeShape(written) || [...written.matchAll(REFERENCE_SHAPE)].length !== 1) return [];
|
|
36
42
|
return [{ offset: cell.start + cell.text.indexOf(written), written, characters: charactersOf(written), label: group }];
|
|
37
43
|
};
|
|
38
44
|
|
|
@@ -40,28 +46,30 @@ const codeOfCell = (cell: Cell | undefined, group: string): ReferenceNumber[] =>
|
|
|
40
46
|
* The codes a table labels: in a row whose first cell is a label (| 品番 | GP-0512 |), and in a column whose heading is
|
|
41
47
|
* one (| 品番 | 品名 | over | GP-0512 | …). Pass the text with its tables (proseAndTablesOf).
|
|
42
48
|
*/
|
|
43
|
-
export const tableLabelledCodes = (text: string, labels: readonly LexiconEntry[]): ReferenceNumber[] =>
|
|
49
|
+
export const tableLabelledCodes = (text: string, labels: readonly LexiconEntry[], isCodeShape: CodeShape = isCode): ReferenceNumber[] =>
|
|
44
50
|
tablesOf(linesOf(text)).flatMap((table) => {
|
|
45
51
|
const headings = cellsOf(table.header).map((cell) => labelOfCell(cell, labels));
|
|
46
52
|
return table.rows.flatMap((row) => {
|
|
47
53
|
const cells = cellsOf(row);
|
|
48
54
|
const rowGroup = labelOfCell(cells[0], labels);
|
|
49
|
-
const byRow = rowGroup === undefined ? [] : codeOfCell(cells[1], rowGroup);
|
|
55
|
+
const byRow = rowGroup === undefined ? [] : codeOfCell(cells[1], rowGroup, isCodeShape);
|
|
50
56
|
const byColumn = cells.flatMap((cell, index) => {
|
|
51
57
|
const group = headings[index];
|
|
52
|
-
return group === undefined ? [] : codeOfCell(cell, group);
|
|
58
|
+
return group === undefined ? [] : codeOfCell(cell, group, isCodeShape);
|
|
53
59
|
});
|
|
54
60
|
return [...byRow, ...byColumn];
|
|
55
61
|
});
|
|
56
62
|
});
|
|
57
63
|
|
|
58
64
|
/** The letters and digits of every code a cell holds. */
|
|
59
|
-
const codesInCell = (cell: Cell): string[] =>
|
|
60
|
-
[...cell.text.matchAll(REFERENCE_SHAPE)].filter((match) =>
|
|
65
|
+
const codesInCell = (cell: Cell, isCodeShape: CodeShape): string[] =>
|
|
66
|
+
[...cell.text.matchAll(REFERENCE_SHAPE)].filter((match) => isCodeShape(match[0])).map((match) => charactersOf(match[0]));
|
|
61
67
|
|
|
62
68
|
/** Every code written anywhere in a table, its heading row too, labelled or not: a code a table lists is an item of its own, never a slip. */
|
|
63
|
-
export const tableCodes = (text: string): Set<string> =>
|
|
64
|
-
new Set(
|
|
69
|
+
export const tableCodes = (text: string, isCodeShape: CodeShape = isCode): Set<string> =>
|
|
70
|
+
new Set(
|
|
71
|
+
tablesOf(linesOf(text)).flatMap((table) => [table.header, ...table.rows].flatMap((row) => cellsOf(row).flatMap((cell) => codesInCell(cell, isCodeShape)))),
|
|
72
|
+
);
|
|
65
73
|
|
|
66
74
|
/**
|
|
67
75
|
* Every code of the prose written with no label that is one labelled code with two neighbours swapped. Only when exactly
|