chaffjs 0.34.0 → 0.35.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/capitals-passage.d.ts +3 -0
- package/dist/capitals-passage.d.ts.map +1 -0
- package/dist/capitals-passage.js +26 -0
- package/dist/capitals-passage.js.map +1 -0
- package/dist/coined-hyphen-name.d.ts +13 -0
- package/dist/coined-hyphen-name.d.ts.map +1 -0
- package/dist/coined-hyphen-name.js +21 -0
- package/dist/coined-hyphen-name.js.map +1 -0
- package/dist/company-names.d.ts +6 -1
- package/dist/company-names.d.ts.map +1 -1
- package/dist/company-names.js +22 -3
- package/dist/company-names.js.map +1 -1
- package/dist/detectors/acronym-context.d.ts +1 -1
- package/dist/detectors/acronym-context.d.ts.map +1 -1
- package/dist/detectors/acronym-context.js +4 -4
- package/dist/detectors/acronym-context.js.map +1 -1
- package/dist/detectors/acronym-definition.d.ts +13 -0
- package/dist/detectors/acronym-definition.d.ts.map +1 -0
- package/dist/detectors/acronym-definition.js +90 -0
- package/dist/detectors/acronym-definition.js.map +1 -0
- package/dist/detectors/acronym-lone.d.ts +13 -0
- package/dist/detectors/acronym-lone.d.ts.map +1 -0
- package/dist/detectors/acronym-lone.js +22 -0
- package/dist/detectors/acronym-lone.js.map +1 -0
- package/dist/detectors/acronym-name.d.ts +55 -0
- package/dist/detectors/acronym-name.d.ts.map +1 -0
- package/dist/detectors/acronym-name.js +75 -0
- package/dist/detectors/acronym-name.js.map +1 -0
- package/dist/detectors/capitalised-term.d.ts +14 -2
- package/dist/detectors/capitalised-term.d.ts.map +1 -1
- package/dist/detectors/capitalised-term.js +115 -4
- package/dist/detectors/capitalised-term.js.map +1 -1
- package/dist/detectors/caps-caption.d.ts +11 -0
- package/dist/detectors/caps-caption.d.ts.map +1 -0
- package/dist/detectors/caps-caption.js +51 -0
- package/dist/detectors/caps-caption.js.map +1 -0
- package/dist/detectors/char-shape.d.ts.map +1 -1
- package/dist/detectors/char-shape.js +47 -18
- package/dist/detectors/char-shape.js.map +1 -1
- package/dist/detectors/clause-shape.d.ts +1 -1
- package/dist/detectors/clause-shape.d.ts.map +1 -1
- package/dist/detectors/clause-shape.js +9 -4
- package/dist/detectors/clause-shape.js.map +1 -1
- package/dist/detectors/concrete-evidence.d.ts +13 -1
- package/dist/detectors/concrete-evidence.d.ts.map +1 -1
- package/dist/detectors/concrete-evidence.js +59 -0
- package/dist/detectors/concrete-evidence.js.map +1 -1
- package/dist/detectors/contraction-minority.d.ts +11 -0
- package/dist/detectors/contraction-minority.d.ts.map +1 -0
- package/dist/detectors/contraction-minority.js +10 -0
- package/dist/detectors/contraction-minority.js.map +1 -0
- package/dist/detectors/counter-edge.d.ts +5 -0
- package/dist/detectors/counter-edge.d.ts.map +1 -1
- package/dist/detectors/counter-edge.js +23 -0
- package/dist/detectors/counter-edge.js.map +1 -1
- package/dist/detectors/date-any-year.d.ts +6 -3
- package/dist/detectors/date-any-year.d.ts.map +1 -1
- package/dist/detectors/date-any-year.js +47 -10
- package/dist/detectors/date-any-year.js.map +1 -1
- package/dist/detectors/date-heading-year.d.ts +18 -0
- package/dist/detectors/date-heading-year.d.ts.map +1 -0
- package/dist/detectors/date-heading-year.js +38 -0
- package/dist/detectors/date-heading-year.js.map +1 -0
- package/dist/detectors/date-year.d.ts +12 -2
- package/dist/detectors/date-year.d.ts.map +1 -1
- package/dist/detectors/date-year.js +31 -6
- package/dist/detectors/date-year.js.map +1 -1
- package/dist/detectors/defined-term-form.d.ts.map +1 -1
- package/dist/detectors/defined-term-form.js +26 -5
- package/dist/detectors/defined-term-form.js.map +1 -1
- package/dist/detectors/due-date.d.ts.map +1 -1
- package/dist/detectors/due-date.js +6 -0
- package/dist/detectors/due-date.js.map +1 -1
- package/dist/detectors/en-shape.d.ts.map +1 -1
- package/dist/detectors/en-shape.js +5 -1
- package/dist/detectors/en-shape.js.map +1 -1
- package/dist/detectors/fact-consistency.d.ts.map +1 -1
- package/dist/detectors/fact-consistency.js +3 -2
- package/dist/detectors/fact-consistency.js.map +1 -1
- package/dist/detectors/gram-passages.d.ts +11 -0
- package/dist/detectors/gram-passages.d.ts.map +1 -0
- package/dist/detectors/gram-passages.js +26 -0
- package/dist/detectors/gram-passages.js.map +1 -0
- package/dist/detectors/heading-end-mark.d.ts +8 -3
- package/dist/detectors/heading-end-mark.d.ts.map +1 -1
- package/dist/detectors/heading-end-mark.js +18 -8
- package/dist/detectors/heading-end-mark.js.map +1 -1
- package/dist/detectors/heading-names.d.ts +7 -0
- package/dist/detectors/heading-names.d.ts.map +1 -0
- package/dist/detectors/heading-names.js +24 -0
- package/dist/detectors/heading-names.js.map +1 -0
- package/dist/detectors/heading-numbering.d.ts.map +1 -1
- package/dist/detectors/heading-numbering.js +7 -2
- package/dist/detectors/heading-numbering.js.map +1 -1
- package/dist/detectors/inch-mark.d.ts +10 -0
- package/dist/detectors/inch-mark.d.ts.map +1 -0
- package/dist/detectors/inch-mark.js +48 -0
- package/dist/detectors/inch-mark.js.map +1 -0
- package/dist/detectors/lexicon.d.ts +0 -1
- package/dist/detectors/lexicon.d.ts.map +1 -1
- package/dist/detectors/lexicon.js +29 -23
- package/dist/detectors/lexicon.js.map +1 -1
- package/dist/detectors/mark-shape.d.ts +6 -3
- package/dist/detectors/mark-shape.d.ts.map +1 -1
- package/dist/detectors/mark-shape.js +12 -6
- package/dist/detectors/mark-shape.js.map +1 -1
- package/dist/detectors/name-variant-apart.d.ts +27 -0
- package/dist/detectors/name-variant-apart.d.ts.map +1 -0
- package/dist/detectors/name-variant-apart.js +51 -0
- package/dist/detectors/name-variant-apart.js.map +1 -0
- package/dist/detectors/name-variant.d.ts.map +1 -1
- package/dist/detectors/name-variant.js +18 -11
- package/dist/detectors/name-variant.js.map +1 -1
- package/dist/detectors/numeral-word.d.ts +15 -0
- package/dist/detectors/numeral-word.d.ts.map +1 -0
- package/dist/detectors/numeral-word.js +26 -0
- package/dist/detectors/numeral-word.js.map +1 -0
- package/dist/detectors/organisation-run.d.ts +14 -0
- package/dist/detectors/organisation-run.d.ts.map +1 -0
- package/dist/detectors/organisation-run.js +73 -0
- package/dist/detectors/organisation-run.js.map +1 -0
- package/dist/detectors/orthographic-variant.d.ts.map +1 -1
- package/dist/detectors/orthographic-variant.js +13 -5
- package/dist/detectors/orthographic-variant.js.map +1 -1
- package/dist/detectors/outline-label.d.ts +14 -0
- package/dist/detectors/outline-label.d.ts.map +1 -0
- package/dist/detectors/outline-label.js +32 -0
- package/dist/detectors/outline-label.js.map +1 -0
- package/dist/detectors/page-marker.d.ts +6 -0
- package/dist/detectors/page-marker.d.ts.map +1 -0
- package/dist/detectors/page-marker.js +19 -0
- package/dist/detectors/page-marker.js.map +1 -0
- package/dist/detectors/parallel-definition.d.ts +16 -0
- package/dist/detectors/parallel-definition.d.ts.map +1 -0
- package/dist/detectors/parallel-definition.js +51 -0
- package/dist/detectors/parallel-definition.js.map +1 -0
- package/dist/detectors/reference-text.d.ts.map +1 -1
- package/dist/detectors/reference-text.js +1 -0
- package/dist/detectors/reference-text.js.map +1 -1
- package/dist/detectors/registry/unfilled-placeholder.d.ts.map +1 -1
- package/dist/detectors/registry/unfilled-placeholder.js +2 -2
- package/dist/detectors/registry/unfilled-placeholder.js.map +1 -1
- package/dist/detectors/registry/vague-density.js +1 -1
- package/dist/detectors/registry/vague-density.js.map +1 -1
- package/dist/detectors/request-owner.d.ts +6 -2
- package/dist/detectors/request-owner.d.ts.map +1 -1
- package/dist/detectors/request-owner.js +57 -7
- package/dist/detectors/request-owner.js.map +1 -1
- package/dist/detectors/requirement-smell.d.ts.map +1 -1
- package/dist/detectors/requirement-smell.js +10 -2
- package/dist/detectors/requirement-smell.js.map +1 -1
- package/dist/detectors/sentence-length.d.ts.map +1 -1
- package/dist/detectors/sentence-length.js +24 -16
- package/dist/detectors/sentence-length.js.map +1 -1
- package/dist/detectors/sentence-rhythm.d.ts.map +1 -1
- package/dist/detectors/sentence-rhythm.js +6 -3
- package/dist/detectors/sentence-rhythm.js.map +1 -1
- package/dist/detectors/series-label.d.ts +2 -1
- package/dist/detectors/series-label.d.ts.map +1 -1
- package/dist/detectors/series-label.js +10 -4
- package/dist/detectors/series-label.js.map +1 -1
- package/dist/detectors/signals.d.ts +4 -0
- package/dist/detectors/signals.d.ts.map +1 -1
- package/dist/detectors/signals.js +95 -36
- package/dist/detectors/signals.js.map +1 -1
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +8 -7
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/template-sections.d.ts +14 -0
- package/dist/detectors/template-sections.d.ts.map +1 -0
- package/dist/detectors/template-sections.js +25 -0
- package/dist/detectors/template-sections.js.map +1 -0
- package/dist/detectors/titled-run.d.ts +22 -0
- package/dist/detectors/titled-run.d.ts.map +1 -0
- package/dist/detectors/titled-run.js +34 -0
- package/dist/detectors/titled-run.js.map +1 -0
- package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
- package/dist/detectors/unbalanced-bracket.js +4 -0
- package/dist/detectors/unbalanced-bracket.js.map +1 -1
- package/dist/detectors/undefined-term.d.ts.map +1 -1
- package/dist/detectors/undefined-term.js +8 -0
- package/dist/detectors/undefined-term.js.map +1 -1
- package/dist/detectors/unfilled-placeholder.d.ts +4 -0
- package/dist/detectors/unfilled-placeholder.d.ts.map +1 -0
- package/dist/detectors/unfilled-placeholder.js +9 -0
- package/dist/detectors/unfilled-placeholder.js.map +1 -0
- package/dist/detectors/vague-density.d.ts +5 -0
- package/dist/detectors/vague-density.d.ts.map +1 -0
- package/dist/detectors/vague-density.js +52 -0
- package/dist/detectors/vague-density.js.map +1 -0
- package/dist/facts/fact-scope.d.ts +10 -1
- package/dist/facts/fact-scope.d.ts.map +1 -1
- package/dist/facts/fact-scope.js +34 -3
- package/dist/facts/fact-scope.js.map +1 -1
- package/dist/facts/table-facts.d.ts +12 -2
- package/dist/facts/table-facts.d.ts.map +1 -1
- package/dist/facts/table-facts.js +22 -4
- package/dist/facts/table-facts.js.map +1 -1
- package/dist/grade-api.d.ts +9 -2
- package/dist/grade-api.d.ts.map +1 -1
- package/dist/grade-api.js +31 -15
- package/dist/grade-api.js.map +1 -1
- package/dist/heading-numbering.d.ts +5 -2
- package/dist/heading-numbering.d.ts.map +1 -1
- package/dist/heading-numbering.js +27 -6
- package/dist/heading-numbering.js.map +1 -1
- package/dist/name-end-letter.d.ts +5 -0
- package/dist/name-end-letter.d.ts.map +1 -1
- package/dist/name-end-letter.js +8 -0
- package/dist/name-end-letter.js.map +1 -1
- package/dist/name-given-before.d.ts +15 -0
- package/dist/name-given-before.d.ts.map +1 -0
- package/dist/name-given-before.js +30 -0
- package/dist/name-given-before.js.map +1 -0
- package/dist/name-separator.d.ts +2 -2
- package/dist/name-separator.d.ts.map +1 -1
- package/dist/name-separator.js +56 -5
- package/dist/name-separator.js.map +1 -1
- package/dist/name-variants.d.ts +3 -1
- package/dist/name-variants.d.ts.map +1 -1
- package/dist/name-variants.js +8 -7
- package/dist/name-variants.js.map +1 -1
- package/dist/name-word-order.d.ts +9 -5
- package/dist/name-word-order.d.ts.map +1 -1
- package/dist/name-word-order.js +47 -15
- package/dist/name-word-order.js.map +1 -1
- package/dist/nominal-stem.d.ts +13 -0
- package/dist/nominal-stem.d.ts.map +1 -0
- package/dist/nominal-stem.js +32 -0
- package/dist/nominal-stem.js.map +1 -0
- package/dist/sentence-load.d.ts +2 -1
- package/dist/sentence-load.d.ts.map +1 -1
- package/dist/sentence-load.js +6 -2
- package/dist/sentence-load.js.map +1 -1
- package/dist/structure/cited-document-section.d.ts +7 -0
- package/dist/structure/cited-document-section.d.ts.map +1 -0
- package/dist/structure/cited-document-section.js +33 -0
- package/dist/structure/cited-document-section.js.map +1 -0
- package/dist/structure/html-text-blocks.d.ts +8 -0
- package/dist/structure/html-text-blocks.d.ts.map +1 -0
- package/dist/structure/html-text-blocks.js +47 -0
- package/dist/structure/html-text-blocks.js.map +1 -0
- package/dist/structure/issues.d.ts +1 -1
- package/dist/structure/issues.d.ts.map +1 -1
- package/dist/structure/issues.js +19 -4
- package/dist/structure/issues.js.map +1 -1
- package/dist/structure/labelled-date-order.d.ts +4 -1
- package/dist/structure/labelled-date-order.d.ts.map +1 -1
- package/dist/structure/labelled-date-order.js +2 -2
- package/dist/structure/labelled-date-order.js.map +1 -1
- package/dist/structure/labelled-order.d.ts +3 -0
- package/dist/structure/labelled-order.d.ts.map +1 -1
- package/dist/structure/labelled-order.js +8 -3
- package/dist/structure/labelled-order.js.map +1 -1
- package/dist/structure/list-numbering.d.ts +20 -4
- package/dist/structure/list-numbering.d.ts.map +1 -1
- package/dist/structure/list-numbering.js +65 -9
- package/dist/structure/list-numbering.js.map +1 -1
- package/dist/structure/listed-paragraph.d.ts +16 -0
- package/dist/structure/listed-paragraph.d.ts.map +1 -0
- package/dist/structure/listed-paragraph.js +37 -0
- package/dist/structure/listed-paragraph.js.map +1 -0
- package/dist/structure/numbering.d.ts +3 -2
- package/dist/structure/numbering.d.ts.map +1 -1
- package/dist/structure/numbering.js +31 -6
- package/dist/structure/numbering.js.map +1 -1
- package/dist/structure/reference-text.d.ts +9 -1
- package/dist/structure/reference-text.d.ts.map +1 -1
- package/dist/structure/reference-text.js +21 -3
- package/dist/structure/reference-text.js.map +1 -1
- package/dist/structure/section-names.d.ts +12 -0
- package/dist/structure/section-names.d.ts.map +1 -0
- package/dist/structure/section-names.js +26 -0
- package/dist/structure/section-names.js.map +1 -0
- package/dist/structure/versioned-label.d.ts +16 -0
- package/dist/structure/versioned-label.d.ts.map +1 -0
- package/dist/structure/versioned-label.js +48 -0
- package/dist/structure/versioned-label.js.map +1 -0
- package/dist/structure/written-headings.d.ts +31 -0
- package/dist/structure/written-headings.d.ts.map +1 -0
- package/dist/structure/written-headings.js +119 -0
- package/dist/structure/written-headings.js.map +1 -0
- package/dist/structure/written-resolve.d.ts +12 -0
- package/dist/structure/written-resolve.d.ts.map +1 -0
- package/dist/structure/written-resolve.js +49 -0
- package/dist/structure/written-resolve.js.map +1 -0
- package/package.json +3 -3
- package/rules/all-caps-shouting.yaml +2 -2
- package/rules/concrete-evidence-density.yaml +2 -2
- package/rules/contraction-consistency.yaml +13 -13
- package/rules/dangling-reference.yaml +2 -2
- package/rules/date-without-year.yaml +2 -2
- package/rules/defined-name-repeated.yaml +2 -2
- package/rules/fact-conflict.yaml +2 -2
- package/rules/heading-end-punctuation-mix.yaml +2 -2
- package/rules/heading-numbering-mix.yaml +2 -2
- package/rules/latin-spacing.yaml +2 -2
- package/rules/max-kanji-continuous.yaml +5 -3
- package/rules/max-sentence-length.yaml +3 -2
- package/rules/name-variant.yaml +2 -2
- package/rules/ngram-repetition.yaml +2 -2
- package/rules/numbering-gap.yaml +2 -2
- package/rules/orthographic-variant.yaml +2 -2
- package/rules/reference-title-mismatch.yaml +2 -2
- package/rules/repeated-sentence-ending.yaml +3 -2
- package/rules/request-without-deadline.yaml +2 -2
- package/rules/requirement-smell.yaml +2 -2
- package/rules/sentence-rhythm.yaml +2 -2
- package/rules/title-case-consistency.yaml +2 -2
- package/rules/unbalanced-bracket.yaml +2 -2
- package/rules/undefined-acronym.yaml +11 -2
- package/rules/undefined-term.yaml +2 -2
- package/rules/unfilled-placeholder.yaml +2 -2
- package/rules/vague-word-density.yaml +2 -2
- package/src/capitals-passage.ts +31 -0
- package/src/coined-hyphen-name.ts +27 -0
- package/src/company-names.ts +24 -3
- package/src/detectors/acronym-context.ts +5 -6
- package/src/detectors/acronym-definition.ts +123 -0
- package/src/detectors/acronym-lone.ts +26 -0
- package/src/detectors/acronym-name.ts +117 -0
- package/src/detectors/capitalised-term.ts +154 -4
- package/src/detectors/caps-caption.ts +61 -0
- package/src/detectors/char-shape.ts +74 -22
- package/src/detectors/clause-shape.ts +14 -4
- package/src/detectors/concrete-evidence.ts +77 -1
- package/src/detectors/contraction-minority.ts +11 -0
- package/src/detectors/counter-edge.ts +23 -0
- package/src/detectors/date-any-year.ts +56 -10
- package/src/detectors/date-heading-year.ts +55 -0
- package/src/detectors/date-year.ts +54 -9
- package/src/detectors/defined-term-form.ts +26 -5
- package/src/detectors/due-date.ts +10 -1
- package/src/detectors/en-shape.ts +5 -1
- package/src/detectors/fact-consistency.ts +3 -2
- package/src/detectors/gram-passages.ts +36 -0
- package/src/detectors/heading-end-mark.ts +23 -10
- package/src/detectors/heading-names.ts +31 -0
- package/src/detectors/heading-numbering.ts +7 -2
- package/src/detectors/inch-mark.ts +49 -0
- package/src/detectors/lexicon.ts +32 -21
- package/src/detectors/mark-shape.ts +12 -6
- package/src/detectors/name-variant-apart.ts +63 -0
- package/src/detectors/name-variant.ts +30 -12
- package/src/detectors/numeral-word.ts +33 -0
- package/src/detectors/organisation-run.ts +86 -0
- package/src/detectors/orthographic-variant.ts +22 -6
- package/src/detectors/outline-label.ts +48 -0
- package/src/detectors/page-marker.ts +26 -0
- package/src/detectors/parallel-definition.ts +64 -0
- package/src/detectors/reference-text.ts +1 -0
- package/src/detectors/registry/unfilled-placeholder.ts +2 -2
- package/src/detectors/registry/vague-density.ts +1 -1
- package/src/detectors/request-owner.ts +71 -8
- package/src/detectors/requirement-smell.ts +15 -2
- package/src/detectors/sentence-length.ts +14 -6
- package/src/detectors/sentence-rhythm.ts +8 -4
- package/src/detectors/series-label.ts +13 -4
- package/src/detectors/signals.ts +94 -26
- package/src/detectors/structure-tree.ts +10 -8
- package/src/detectors/template-sections.ts +37 -0
- package/src/detectors/titled-run.ts +43 -0
- package/src/detectors/unbalanced-bracket.ts +3 -0
- package/src/detectors/undefined-term.ts +8 -0
- package/src/detectors/unfilled-placeholder.ts +10 -0
- package/src/detectors/vague-density.ts +68 -0
- package/src/facts/fact-scope.ts +53 -4
- package/src/facts/table-facts.ts +43 -6
- package/src/grade-api.ts +38 -16
- package/src/heading-numbering.ts +35 -8
- package/src/name-end-letter.ts +9 -0
- package/src/name-given-before.ts +40 -0
- package/src/name-separator.ts +66 -5
- package/src/name-variants.ts +21 -11
- package/src/name-word-order.ts +62 -17
- package/src/nominal-stem.ts +36 -0
- package/src/sentence-load.ts +7 -2
- package/src/structure/cited-document-section.ts +42 -0
- package/src/structure/html-text-blocks.ts +45 -0
- package/src/structure/issues.ts +19 -4
- package/src/structure/labelled-date-order.ts +5 -2
- package/src/structure/labelled-order.ts +12 -3
- package/src/structure/list-numbering.ts +100 -11
- package/src/structure/listed-paragraph.ts +45 -0
- package/src/structure/numbering.ts +48 -19
- package/src/structure/reference-text.ts +25 -3
- package/src/structure/section-names.ts +32 -0
- package/src/structure/versioned-label.ts +52 -0
- package/src/structure/written-headings.ts +137 -0
- package/src/structure/written-resolve.ts +57 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// 平文の契約の見出し。Markdown の見出しを使わない契約(.txt)は、行の頭や文の切れ目に「9. Indemnification.」
|
|
2
|
+
// 「Section 2.3 Appraisal Shares.」と番号と題を書く。木は本文の番号と見分けられないのでこれを番地にしないが、
|
|
3
|
+
// 参照の行き先としては読める。目次の行(「Section 2.3 Appraisal Shares 4」)は題が点で閉じないので見出しにしない。
|
|
4
|
+
|
|
5
|
+
/** 書かれた見出し。address は参照の target と同じ形(「6.1」)。start は見出しの位置。 */
|
|
6
|
+
export type WrittenHeading = { readonly address: string; readonly start: number };
|
|
7
|
+
|
|
8
|
+
/** 参照の位置と行き先。木の reference の節点から取る。 */
|
|
9
|
+
export type ReferenceSpan = { readonly start: number; readonly end: number; readonly target: string };
|
|
10
|
+
|
|
11
|
+
/** 題の語の数の上限。見出しの題は短い。 */
|
|
12
|
+
const MAX_TITLE_WORDS = 15;
|
|
13
|
+
/** 題の語: 文字で始まり、文字・アポストロフィ・アンパサンド・ハイフンが続き、読点やセミコロンで終わってもよい。数字は入らない。 */
|
|
14
|
+
const TITLE_WORD = /^\p{L}[\p{L}’'&-]*[,;]?$/u;
|
|
15
|
+
const CAPITAL = /^\p{Lu}/u;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Title Case の題か(「Effect on Capital Stock of the Company and Merger Sub」)。最初の語が大文字で始まり、語の半分より多くが
|
|
19
|
+
* 大文字で始まり、数字を含まない。文(「The Company shall comply」)は小文字の語が多いので当たらない。Pure.
|
|
20
|
+
*/
|
|
21
|
+
export const isTitle = (title: string): boolean => {
|
|
22
|
+
const words = title.trim().split(/\s+/u);
|
|
23
|
+
const [first] = words;
|
|
24
|
+
if (first === undefined || first === "" || words.length > MAX_TITLE_WORDS || !words.every((word) => TITLE_WORD.test(word))) return false;
|
|
25
|
+
return CAPITAL.test(first) && words.filter((word) => CAPITAL.test(word)).length * 2 > words.length;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** 点で閉じた題(「Appraisal Shares. As used」の「Appraisal Shares」)。点の後ろは空白か行末。無ければ undefined。 */
|
|
29
|
+
const MAX_TITLE_LENGTH = 120;
|
|
30
|
+
const titleClosedByDot = (text: string): string | undefined => {
|
|
31
|
+
const dot = text.slice(0, MAX_TITLE_LENGTH).search(/\.(?:\s|$)/u);
|
|
32
|
+
return dot <= 0 ? undefined : text.slice(0, dot);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** 前の語が番号(「Section 8.07. Section 16 Matters」の 8.07.)なら、後ろはその見出しの題で、見出しではない。 */
|
|
36
|
+
const NUMBER_BEFORE = /\d[.:]?$/u;
|
|
37
|
+
const SENTENCE_END = /[.;:]$/u;
|
|
38
|
+
const isSpace = (char: string | undefined): boolean => char === " " || char === "\t";
|
|
39
|
+
|
|
40
|
+
/** 見出しが始まれる位置: 行の頭、文の終わり(. ; :)の後ろの空白、2 つ以上の空白の後ろ。前が番号なら始まらない。 */
|
|
41
|
+
const startsHeading = (source: string, at: number): boolean => {
|
|
42
|
+
const before = source.slice(Math.max(source.lastIndexOf("\n", at - 1) + 1, at - MAX_TITLE_LENGTH), at);
|
|
43
|
+
let spaces = 0;
|
|
44
|
+
while (isSpace(before[before.length - 1 - spaces])) spaces += 1;
|
|
45
|
+
if (spaces === before.length) return true;
|
|
46
|
+
const word =
|
|
47
|
+
before
|
|
48
|
+
.slice(0, before.length - spaces)
|
|
49
|
+
.split(/[ \t]/u)
|
|
50
|
+
.at(-1) ?? "";
|
|
51
|
+
if (NUMBER_BEFORE.test(word)) return false;
|
|
52
|
+
return spaces >= 2 || (spaces >= 1 && SENTENCE_END.test(word));
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/** 参照のすぐ後ろが題か(「Section 4.12. Compliance with Laws.」「Section 1.1 Closing. The Parties」)。 */
|
|
56
|
+
const NUMBER_CLOSE = /^\.?[ \t]+/u;
|
|
57
|
+
/** 番号と題のあいだの空白の長さの上限(データセットの契約は十数個の空白を置く)。 */
|
|
58
|
+
const MAX_NUMBER_CLOSE = 24;
|
|
59
|
+
const titledAfter = (source: string, end: number): boolean => {
|
|
60
|
+
const rest = source.slice(end, end + MAX_TITLE_LENGTH + MAX_NUMBER_CLOSE);
|
|
61
|
+
const close = NUMBER_CLOSE.exec(rest)?.[0];
|
|
62
|
+
const title = close === undefined ? undefined : titleClosedByDot(rest.slice(close.length));
|
|
63
|
+
return title !== undefined && isTitle(title);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/** 参照の形で書かれた見出し(「… Effect. Section 4.12. Compliance with Laws.」)。 */
|
|
67
|
+
const headingsAtReferences = (references: readonly ReferenceSpan[], source: string): WrittenHeading[] =>
|
|
68
|
+
references
|
|
69
|
+
.filter((reference) => startsHeading(source, reference.start) && titledAfter(source, reference.end))
|
|
70
|
+
.map((reference) => ({ address: reference.target, start: reference.start }));
|
|
71
|
+
|
|
72
|
+
/** 行の頭の番号(「9. Indemnification.」「4 Intellectual Property. 4.1 Each」「6.1 eGain warrants」「2 Quality and Food Safety」)。 */
|
|
73
|
+
const LINE_NUMBER = /^[ \t]{0,3}(?<number>\d{1,3}(?:\.\d{1,3}){0,5})\.?[ \t]+(?<rest>\S.*)$/u;
|
|
74
|
+
/** 語のどこかに大文字があるか(「eGain」も名前)。 */
|
|
75
|
+
const HAS_CAPITAL = /\p{Lu}/u;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 行の頭の番号が見出しか。題が点で閉じ、同じ行に本文が続けば見出し(「9. Indemnification. Each party …」)。題だけの行
|
|
79
|
+
* (「1. Introduction」)は箇条書きと見分けられないので読まない。点を含む番号(6.1)は、最初の語に大文字があり、題より長い
|
|
80
|
+
* 段落が続けば段落の番号(「6.1 eGain warrants …」)。本文の折り返しの「2.5 percent」は小文字、目次の「3.17 Reserves 33」は短いので当たらない。
|
|
81
|
+
*/
|
|
82
|
+
const isLineHeading = (number: string, rest: string): boolean => {
|
|
83
|
+
const title = titleClosedByDot(rest);
|
|
84
|
+
if (title !== undefined && rest.slice(title.length + 1).trim() !== "" && isTitle(title)) return true;
|
|
85
|
+
const words = rest.split(/\s+/u);
|
|
86
|
+
return number.includes(".") && words.length > MAX_TITLE_WORDS && HAS_CAPITAL.test(words[0] ?? "");
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const headingsAtLineStarts = (source: string): WrittenHeading[] => {
|
|
90
|
+
const found: WrittenHeading[] = [];
|
|
91
|
+
let start = 0;
|
|
92
|
+
source.split("\n").forEach((line) => {
|
|
93
|
+
const groups = LINE_NUMBER.exec(line)?.groups;
|
|
94
|
+
const number = groups?.["number"];
|
|
95
|
+
if (number !== undefined && isLineHeading(number, groups?.["rest"] ?? "")) found.push({ address: number, start });
|
|
96
|
+
start += line.length + 1;
|
|
97
|
+
});
|
|
98
|
+
return found;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/** 文書に平文で書かれた見出しを、文書の順に。Pure. */
|
|
102
|
+
export const writtenHeadings = (references: readonly ReferenceSpan[], source: string): WrittenHeading[] =>
|
|
103
|
+
[...headingsAtReferences(references, source), ...headingsAtLineStarts(source)].toSorted((left, right) => left.start - right.start);
|
|
104
|
+
|
|
105
|
+
/** 括弧の小見出し(「(i)」「(b)」「(3)」)。参照の一部(「Section 2.02(b)」「(a)(i)」)は、前が文字・数字・括弧なので読まない。 */
|
|
106
|
+
const SUBDIVISION_LABEL = /(?<![\p{L}\p{N})\]])\((?<label>[a-zA-Z]{1,4}|\d{1,3})\)/gu;
|
|
107
|
+
|
|
108
|
+
/** 本文に書かれた括弧の小見出しの札。Pure. */
|
|
109
|
+
export const writtenSubdivisions = (body: string): ReadonlySet<string> =>
|
|
110
|
+
new Set([...body.matchAll(SUBDIVISION_LABEL)].flatMap((match) => (match.groups?.["label"] === undefined ? [] : [match.groups["label"]])));
|
|
111
|
+
|
|
112
|
+
/** 参照の札(「Section 2.1(a)(i)」の a と i)。 */
|
|
113
|
+
const LABEL_IN_REFERENCE = /\((?<label>[a-zA-Z]{1,4}|\d{1,3})\)/gu;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 参照の番地「2.1.a.i」を、親「2.1」と、参照が括弧で書いた札「a」「i」に分ける。札を括弧で書いていない参照(Section 2.1)や、
|
|
117
|
+
* 番地の末尾が書いた札と合わなければ undefined。Pure.
|
|
118
|
+
*/
|
|
119
|
+
export const parentAndLabels = (target: string, written: string): { readonly parent: string; readonly labels: readonly string[] } | undefined => {
|
|
120
|
+
const labels = [...written.matchAll(LABEL_IN_REFERENCE)].flatMap((match) => (match.groups?.["label"] === undefined ? [] : [match.groups["label"]]));
|
|
121
|
+
const parts = target.split(".");
|
|
122
|
+
const cut = parts.length - labels.length;
|
|
123
|
+
if (labels.length === 0 || cut <= 0 || parts.slice(cut).join(".") !== labels.join(".")) return undefined;
|
|
124
|
+
return { parent: parts.slice(0, cut).join("."), labels };
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/** 書かれた見出しごとの範囲(次の書かれた見出しまで)。同じ番地が二度あれば、どちらの範囲もその番地のもの。Pure. */
|
|
128
|
+
export const headingRegions = (headings: readonly WrittenHeading[], length: number): ReadonlyMap<string, readonly (readonly [number, number])[]> => {
|
|
129
|
+
const regions = new Map<string, (readonly [number, number])[]>();
|
|
130
|
+
headings.forEach((heading, index) => {
|
|
131
|
+
const end = headings[index + 1]?.start ?? length;
|
|
132
|
+
const found = regions.get(heading.address) ?? [];
|
|
133
|
+
found.push([heading.start, end]);
|
|
134
|
+
regions.set(heading.address, found);
|
|
135
|
+
});
|
|
136
|
+
return regions;
|
|
137
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { StructureNode } from "../plugin.ts";
|
|
2
|
+
import { headingRegions, parentAndLabels, writtenHeadings, writtenSubdivisions, type WrittenHeading } from "./written-headings.ts";
|
|
3
|
+
|
|
4
|
+
// 木が番地にしない平文の見出しと、本文の中に書いた括弧の小見出し(「6.1 … that (i) the Software …」)を、参照の行き先として引く。
|
|
5
|
+
|
|
6
|
+
type Region = readonly [number, number];
|
|
7
|
+
|
|
8
|
+
/** addresses: 平文で書かれた見出しの番地。subdivision: 参照の札が、親の範囲の本文に書かれているか。 */
|
|
9
|
+
export type WrittenReading = { readonly addresses: readonly string[]; readonly subdivision: (reference: StructureNode) => boolean };
|
|
10
|
+
|
|
11
|
+
const targetOf = (node: StructureNode): string => String(node.attrs["target"] ?? "");
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 括弧の小見出しを読む範囲。木の条は、項や号を一つも読まなかったときだけ、その条の始まりから次の平文の見出しまで。
|
|
15
|
+
* 項や号を読んでいれば、無い札は本当に無い。
|
|
16
|
+
*/
|
|
17
|
+
const treeRegions = (nodes: readonly StructureNode[], headings: readonly WrittenHeading[]): Map<string, Region[]> => {
|
|
18
|
+
const regions = new Map<string, Region[]>();
|
|
19
|
+
// 条も見出しも文書の順なので、次の見出しは前へ進めるだけで見つかる。
|
|
20
|
+
let next = 0;
|
|
21
|
+
nodes
|
|
22
|
+
.filter((node) => node.kind === "article" && !node.children.some((child) => child.kind === "item"))
|
|
23
|
+
.toSorted((left, right) => left.span.start - right.span.start)
|
|
24
|
+
.forEach((node) => {
|
|
25
|
+
while ((headings[next]?.start ?? Infinity) <= node.span.start) next += 1;
|
|
26
|
+
const end = Math.min(headings[next]?.start ?? node.span.end, node.span.end);
|
|
27
|
+
const found = regions.get(node.address) ?? [];
|
|
28
|
+
found.push([node.span.start, end]);
|
|
29
|
+
regions.set(node.address, found);
|
|
30
|
+
});
|
|
31
|
+
return regions;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 平文の見出しの番地と、参照(Section 6.1(i))の親(6.1)が木の条か平文の見出しとしてあり、その範囲の本文に札「(i)」が
|
|
36
|
+
* 書かれているかを引く関数。範囲ごとの札は、要るときに一度だけ読む。Pure.
|
|
37
|
+
*/
|
|
38
|
+
export const writtenReading = (nodes: readonly StructureNode[], source: string): WrittenReading => {
|
|
39
|
+
const references = nodes.filter((node) => node.kind === "reference").map((node) => ({ start: node.span.start, end: node.span.end, target: targetOf(node) }));
|
|
40
|
+
const headings = writtenHeadings(references, source);
|
|
41
|
+
const written = headingRegions(headings, source.length);
|
|
42
|
+
const tree = treeRegions(nodes, headings);
|
|
43
|
+
const labels = new Map<string, ReadonlySet<string>>();
|
|
44
|
+
const labelsIn = ([start, end]: Region): ReadonlySet<string> => {
|
|
45
|
+
const key = `${String(start)}:${String(end)}`;
|
|
46
|
+
const found = labels.get(key) ?? writtenSubdivisions(source.slice(start, end));
|
|
47
|
+
labels.set(key, found);
|
|
48
|
+
return found;
|
|
49
|
+
};
|
|
50
|
+
const regionsOf = (address: string): Region[] => [...(tree.get(address) ?? []), ...(written.get(address) ?? [])];
|
|
51
|
+
const subdivision = (reference: StructureNode): boolean => {
|
|
52
|
+
const wanted = parentAndLabels(targetOf(reference), String(reference.attrs["label"] ?? ""));
|
|
53
|
+
if (wanted === undefined) return false;
|
|
54
|
+
return regionsOf(wanted.parent).some((region) => wanted.labels.every((label) => labelsIn(region).has(label)));
|
|
55
|
+
};
|
|
56
|
+
return { addresses: headings.map((heading) => heading.address), subdivision };
|
|
57
|
+
};
|