chaffjs 0.35.0 → 0.37.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.
Files changed (823) hide show
  1. package/README.ja.md +12 -0
  2. package/README.md +15 -0
  3. package/dist/announced-count.d.ts +2 -0
  4. package/dist/announced-count.d.ts.map +1 -1
  5. package/dist/announced-count.js +29 -7
  6. package/dist/announced-count.js.map +1 -1
  7. package/dist/chronology-rows.d.ts +9 -0
  8. package/dist/chronology-rows.d.ts.map +1 -0
  9. package/dist/chronology-rows.js +79 -0
  10. package/dist/chronology-rows.js.map +1 -0
  11. package/dist/company-name-run.d.ts +8 -0
  12. package/dist/company-name-run.d.ts.map +1 -0
  13. package/dist/company-name-run.js +30 -0
  14. package/dist/company-name-run.js.map +1 -0
  15. package/dist/compound-head.d.ts +7 -0
  16. package/dist/compound-head.d.ts.map +1 -0
  17. package/dist/compound-head.js +19 -0
  18. package/dist/compound-head.js.map +1 -0
  19. package/dist/date-format.d.ts +8 -3
  20. package/dist/date-format.d.ts.map +1 -1
  21. package/dist/date-format.js +36 -3
  22. package/dist/date-format.js.map +1 -1
  23. package/dist/derived/count-per-period.d.ts +23 -0
  24. package/dist/derived/count-per-period.d.ts.map +1 -0
  25. package/dist/derived/count-per-period.js +14 -0
  26. package/dist/derived/count-per-period.js.map +1 -0
  27. package/dist/detectors/acronym-context.d.ts +4 -0
  28. package/dist/detectors/acronym-context.d.ts.map +1 -1
  29. package/dist/detectors/acronym-context.js +29 -1
  30. package/dist/detectors/acronym-context.js.map +1 -1
  31. package/dist/detectors/acronym-expansion.d.ts +5 -1
  32. package/dist/detectors/acronym-expansion.d.ts.map +1 -1
  33. package/dist/detectors/acronym-expansion.js +42 -3
  34. package/dist/detectors/acronym-expansion.js.map +1 -1
  35. package/dist/detectors/acronym-known.d.ts +19 -0
  36. package/dist/detectors/acronym-known.d.ts.map +1 -0
  37. package/dist/detectors/acronym-known.js +32 -0
  38. package/dist/detectors/acronym-known.js.map +1 -0
  39. package/dist/detectors/acronym-link.d.ts +19 -0
  40. package/dist/detectors/acronym-link.d.ts.map +1 -0
  41. package/dist/detectors/acronym-link.js +65 -0
  42. package/dist/detectors/acronym-link.js.map +1 -0
  43. package/dist/detectors/acronym-mention.d.ts +5 -0
  44. package/dist/detectors/acronym-mention.d.ts.map +1 -0
  45. package/dist/detectors/acronym-mention.js +34 -0
  46. package/dist/detectors/acronym-mention.js.map +1 -0
  47. package/dist/detectors/acronym-name.d.ts +8 -1
  48. package/dist/detectors/acronym-name.d.ts.map +1 -1
  49. package/dist/detectors/acronym-name.js +25 -6
  50. package/dist/detectors/acronym-name.js.map +1 -1
  51. package/dist/detectors/addressee-edge.d.ts +13 -0
  52. package/dist/detectors/addressee-edge.d.ts.map +1 -0
  53. package/dist/detectors/addressee-edge.js +13 -0
  54. package/dist/detectors/addressee-edge.js.map +1 -0
  55. package/dist/detectors/addressee-title-edge.d.ts +21 -0
  56. package/dist/detectors/addressee-title-edge.d.ts.map +1 -0
  57. package/dist/detectors/addressee-title-edge.js +22 -0
  58. package/dist/detectors/addressee-title-edge.js.map +1 -0
  59. package/dist/detectors/announced-count.d.ts.map +1 -1
  60. package/dist/detectors/announced-count.js +1 -0
  61. package/dist/detectors/announced-count.js.map +1 -1
  62. package/dist/detectors/bare-comparative.d.ts +4 -0
  63. package/dist/detectors/bare-comparative.d.ts.map +1 -1
  64. package/dist/detectors/bare-comparative.js +28 -3
  65. package/dist/detectors/bare-comparative.js.map +1 -1
  66. package/dist/detectors/blank-structure.d.ts +7 -1
  67. package/dist/detectors/blank-structure.d.ts.map +1 -1
  68. package/dist/detectors/blank-structure.js +13 -8
  69. package/dist/detectors/blank-structure.js.map +1 -1
  70. package/dist/detectors/bracket-specified.d.ts +6 -0
  71. package/dist/detectors/bracket-specified.d.ts.map +1 -0
  72. package/dist/detectors/bracket-specified.js +23 -0
  73. package/dist/detectors/bracket-specified.js.map +1 -0
  74. package/dist/detectors/broken-link.d.ts +6 -0
  75. package/dist/detectors/broken-link.d.ts.map +1 -1
  76. package/dist/detectors/broken-link.js +23 -2
  77. package/dist/detectors/broken-link.js.map +1 -1
  78. package/dist/detectors/capitalised-term.d.ts +4 -0
  79. package/dist/detectors/capitalised-term.d.ts.map +1 -1
  80. package/dist/detectors/capitalised-term.js +18 -1
  81. package/dist/detectors/capitalised-term.js.map +1 -1
  82. package/dist/detectors/caps-caption.d.ts +17 -6
  83. package/dist/detectors/caps-caption.d.ts.map +1 -1
  84. package/dist/detectors/caps-caption.js +65 -0
  85. package/dist/detectors/caps-caption.js.map +1 -1
  86. package/dist/detectors/caps-phrase.d.ts +6 -0
  87. package/dist/detectors/caps-phrase.d.ts.map +1 -0
  88. package/dist/detectors/caps-phrase.js +16 -0
  89. package/dist/detectors/caps-phrase.js.map +1 -0
  90. package/dist/detectors/char-shape.d.ts +1 -0
  91. package/dist/detectors/char-shape.d.ts.map +1 -1
  92. package/dist/detectors/char-shape.js +56 -20
  93. package/dist/detectors/char-shape.js.map +1 -1
  94. package/dist/detectors/citation-sentence.d.ts +8 -0
  95. package/dist/detectors/citation-sentence.d.ts.map +1 -0
  96. package/dist/detectors/citation-sentence.js +40 -0
  97. package/dist/detectors/citation-sentence.js.map +1 -0
  98. package/dist/detectors/cited-title.d.ts +3 -2
  99. package/dist/detectors/cited-title.d.ts.map +1 -1
  100. package/dist/detectors/cited-title.js +14 -3
  101. package/dist/detectors/cited-title.js.map +1 -1
  102. package/dist/detectors/contraction-mention.d.ts +3 -0
  103. package/dist/detectors/contraction-mention.d.ts.map +1 -0
  104. package/dist/detectors/contraction-mention.js +22 -0
  105. package/dist/detectors/contraction-mention.js.map +1 -0
  106. package/dist/detectors/counter-edge.d.ts +2 -1
  107. package/dist/detectors/counter-edge.d.ts.map +1 -1
  108. package/dist/detectors/counter-edge.js +17 -2
  109. package/dist/detectors/counter-edge.js.map +1 -1
  110. package/dist/detectors/dash-break.d.ts +7 -0
  111. package/dist/detectors/dash-break.d.ts.map +1 -0
  112. package/dist/detectors/dash-break.js +30 -0
  113. package/dist/detectors/dash-break.js.map +1 -0
  114. package/dist/detectors/date-any-year.d.ts +7 -3
  115. package/dist/detectors/date-any-year.d.ts.map +1 -1
  116. package/dist/detectors/date-any-year.js +30 -8
  117. package/dist/detectors/date-any-year.js.map +1 -1
  118. package/dist/detectors/date-format.d.ts.map +1 -1
  119. package/dist/detectors/date-format.js +2 -1
  120. package/dist/detectors/date-format.js.map +1 -1
  121. package/dist/detectors/date-year.d.ts +9 -3
  122. package/dist/detectors/date-year.d.ts.map +1 -1
  123. package/dist/detectors/date-year.js +45 -9
  124. package/dist/detectors/date-year.js.map +1 -1
  125. package/dist/detectors/deadline-unit.d.ts +20 -0
  126. package/dist/detectors/deadline-unit.d.ts.map +1 -0
  127. package/dist/detectors/deadline-unit.js +19 -0
  128. package/dist/detectors/deadline-unit.js.map +1 -0
  129. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  130. package/dist/detectors/defined-term-form.js +33 -7
  131. package/dist/detectors/defined-term-form.js.map +1 -1
  132. package/dist/detectors/definition-use.d.ts.map +1 -1
  133. package/dist/detectors/definition-use.js +14 -6
  134. package/dist/detectors/definition-use.js.map +1 -1
  135. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  136. package/dist/detectors/derived-numbers.js +17 -4
  137. package/dist/detectors/derived-numbers.js.map +1 -1
  138. package/dist/detectors/document-shape.d.ts +5 -0
  139. package/dist/detectors/document-shape.d.ts.map +1 -1
  140. package/dist/detectors/document-shape.js +15 -1
  141. package/dist/detectors/document-shape.js.map +1 -1
  142. package/dist/detectors/doubled-across-aside.d.ts +9 -0
  143. package/dist/detectors/doubled-across-aside.d.ts.map +1 -0
  144. package/dist/detectors/doubled-across-aside.js +27 -0
  145. package/dist/detectors/doubled-across-aside.js.map +1 -0
  146. package/dist/detectors/doubled-punctuation.d.ts +3 -3
  147. package/dist/detectors/doubled-punctuation.d.ts.map +1 -1
  148. package/dist/detectors/doubled-punctuation.js +23 -4
  149. package/dist/detectors/doubled-punctuation.js.map +1 -1
  150. package/dist/detectors/doubled-word.d.ts.map +1 -1
  151. package/dist/detectors/doubled-word.js +2 -1
  152. package/dist/detectors/doubled-word.js.map +1 -1
  153. package/dist/detectors/duplicate-heading.d.ts +1 -0
  154. package/dist/detectors/duplicate-heading.d.ts.map +1 -1
  155. package/dist/detectors/duplicate-heading.js +25 -3
  156. package/dist/detectors/duplicate-heading.js.map +1 -1
  157. package/dist/detectors/ellipsis.d.ts.map +1 -1
  158. package/dist/detectors/ellipsis.js +13 -1
  159. package/dist/detectors/ellipsis.js.map +1 -1
  160. package/dist/detectors/email-letter.d.ts +40 -3
  161. package/dist/detectors/email-letter.d.ts.map +1 -1
  162. package/dist/detectors/email-letter.js +110 -17
  163. package/dist/detectors/email-letter.js.map +1 -1
  164. package/dist/detectors/field-label.d.ts +7 -0
  165. package/dist/detectors/field-label.d.ts.map +1 -0
  166. package/dist/detectors/field-label.js +23 -0
  167. package/dist/detectors/field-label.js.map +1 -0
  168. package/dist/detectors/footnote-mismatch.d.ts +6 -1
  169. package/dist/detectors/footnote-mismatch.d.ts.map +1 -1
  170. package/dist/detectors/footnote-mismatch.js +28 -7
  171. package/dist/detectors/footnote-mismatch.js.map +1 -1
  172. package/dist/detectors/fullwidth-alnum.d.ts.map +1 -1
  173. package/dist/detectors/fullwidth-alnum.js +7 -1
  174. package/dist/detectors/fullwidth-alnum.js.map +1 -1
  175. package/dist/detectors/graded-step.d.ts +20 -0
  176. package/dist/detectors/graded-step.d.ts.map +1 -0
  177. package/dist/detectors/graded-step.js +33 -0
  178. package/dist/detectors/graded-step.js.map +1 -0
  179. package/dist/detectors/gram-openers.d.ts +9 -0
  180. package/dist/detectors/gram-openers.d.ts.map +1 -0
  181. package/dist/detectors/gram-openers.js +40 -0
  182. package/dist/detectors/gram-openers.js.map +1 -0
  183. package/dist/detectors/gram-place.d.ts +3 -1
  184. package/dist/detectors/gram-place.d.ts.map +1 -1
  185. package/dist/detectors/gram-place.js +8 -0
  186. package/dist/detectors/gram-place.js.map +1 -1
  187. package/dist/detectors/gram-predicate.d.ts.map +1 -1
  188. package/dist/detectors/gram-predicate.js +37 -3
  189. package/dist/detectors/gram-predicate.js.map +1 -1
  190. package/dist/detectors/heading-echo.d.ts.map +1 -1
  191. package/dist/detectors/heading-echo.js +28 -2
  192. package/dist/detectors/heading-echo.js.map +1 -1
  193. package/dist/detectors/heading-record-rhythm.d.ts +9 -0
  194. package/dist/detectors/heading-record-rhythm.d.ts.map +1 -0
  195. package/dist/detectors/heading-record-rhythm.js +57 -0
  196. package/dist/detectors/heading-record-rhythm.js.map +1 -0
  197. package/dist/detectors/ime-residue.d.ts +1 -1
  198. package/dist/detectors/ime-residue.d.ts.map +1 -1
  199. package/dist/detectors/ime-residue.js +4 -3
  200. package/dist/detectors/ime-residue.js.map +1 -1
  201. package/dist/detectors/kanji-compound-slip.d.ts +3 -0
  202. package/dist/detectors/kanji-compound-slip.d.ts.map +1 -0
  203. package/dist/detectors/kanji-compound-slip.js +50 -0
  204. package/dist/detectors/kanji-compound-slip.js.map +1 -0
  205. package/dist/detectors/kutoten-consistency.d.ts +10 -2
  206. package/dist/detectors/kutoten-consistency.d.ts.map +1 -1
  207. package/dist/detectors/kutoten-consistency.js +83 -12
  208. package/dist/detectors/kutoten-consistency.js.map +1 -1
  209. package/dist/detectors/lexicon.d.ts.map +1 -1
  210. package/dist/detectors/lexicon.js +13 -4
  211. package/dist/detectors/lexicon.js.map +1 -1
  212. package/dist/detectors/link-shape.d.ts.map +1 -1
  213. package/dist/detectors/link-shape.js +9 -3
  214. package/dist/detectors/link-shape.js.map +1 -1
  215. package/dist/detectors/list-item-ending.d.ts +18 -0
  216. package/dist/detectors/list-item-ending.d.ts.map +1 -0
  217. package/dist/detectors/list-item-ending.js +35 -0
  218. package/dist/detectors/list-item-ending.js.map +1 -0
  219. package/dist/detectors/list-parallel.d.ts +18 -5
  220. package/dist/detectors/list-parallel.d.ts.map +1 -1
  221. package/dist/detectors/list-parallel.js +116 -36
  222. package/dist/detectors/list-parallel.js.map +1 -1
  223. package/dist/detectors/list-sentence.d.ts +4 -0
  224. package/dist/detectors/list-sentence.d.ts.map +1 -1
  225. package/dist/detectors/list-sentence.js +1 -1
  226. package/dist/detectors/list-sentence.js.map +1 -1
  227. package/dist/detectors/mark-shape.d.ts +13 -4
  228. package/dist/detectors/mark-shape.d.ts.map +1 -1
  229. package/dist/detectors/mark-shape.js +73 -10
  230. package/dist/detectors/mark-shape.js.map +1 -1
  231. package/dist/detectors/mentioned-phrase.d.ts +9 -0
  232. package/dist/detectors/mentioned-phrase.d.ts.map +1 -0
  233. package/dist/detectors/mentioned-phrase.js +25 -0
  234. package/dist/detectors/mentioned-phrase.js.map +1 -0
  235. package/dist/detectors/middle-dot.d.ts +2 -2
  236. package/dist/detectors/middle-dot.d.ts.map +1 -1
  237. package/dist/detectors/middle-dot.js +4 -2
  238. package/dist/detectors/middle-dot.js.map +1 -1
  239. package/dist/detectors/modal-conflict.d.ts.map +1 -1
  240. package/dist/detectors/modal-conflict.js +5 -2
  241. package/dist/detectors/modal-conflict.js.map +1 -1
  242. package/dist/detectors/name-variant.d.ts.map +1 -1
  243. package/dist/detectors/name-variant.js +6 -0
  244. package/dist/detectors/name-variant.js.map +1 -1
  245. package/dist/detectors/notice-paragraph.d.ts +9 -0
  246. package/dist/detectors/notice-paragraph.d.ts.map +1 -0
  247. package/dist/detectors/notice-paragraph.js +21 -0
  248. package/dist/detectors/notice-paragraph.js.map +1 -0
  249. package/dist/detectors/number-style.d.ts.map +1 -1
  250. package/dist/detectors/number-style.js +15 -2
  251. package/dist/detectors/number-style.js.map +1 -1
  252. package/dist/detectors/number-unit.d.ts.map +1 -1
  253. package/dist/detectors/number-unit.js +24 -1
  254. package/dist/detectors/number-unit.js.map +1 -1
  255. package/dist/detectors/numeral-opener.d.ts +6 -0
  256. package/dist/detectors/numeral-opener.d.ts.map +1 -1
  257. package/dist/detectors/numeral-opener.js +24 -1
  258. package/dist/detectors/numeral-opener.js.map +1 -1
  259. package/dist/detectors/obligation-without-deadline.d.ts +5 -1
  260. package/dist/detectors/obligation-without-deadline.d.ts.map +1 -1
  261. package/dist/detectors/obligation-without-deadline.js +44 -23
  262. package/dist/detectors/obligation-without-deadline.js.map +1 -1
  263. package/dist/detectors/open-end-class.d.ts +16 -0
  264. package/dist/detectors/open-end-class.d.ts.map +1 -0
  265. package/dist/detectors/open-end-class.js +65 -0
  266. package/dist/detectors/open-end-class.js.map +1 -0
  267. package/dist/detectors/open-end-condition.d.ts +7 -0
  268. package/dist/detectors/open-end-condition.d.ts.map +1 -0
  269. package/dist/detectors/open-end-condition.js +35 -0
  270. package/dist/detectors/open-end-condition.js.map +1 -0
  271. package/dist/detectors/open-end-names.d.ts +9 -3
  272. package/dist/detectors/open-end-names.d.ts.map +1 -1
  273. package/dist/detectors/open-end-names.js +5 -2
  274. package/dist/detectors/open-end-names.js.map +1 -1
  275. package/dist/detectors/open-end-question.d.ts +15 -0
  276. package/dist/detectors/open-end-question.d.ts.map +1 -0
  277. package/dist/detectors/open-end-question.js +37 -0
  278. package/dist/detectors/open-end-question.js.map +1 -0
  279. package/dist/detectors/open-end-scope.d.ts +16 -0
  280. package/dist/detectors/open-end-scope.d.ts.map +1 -0
  281. package/dist/detectors/open-end-scope.js +47 -0
  282. package/dist/detectors/open-end-scope.js.map +1 -0
  283. package/dist/detectors/opening-date.d.ts +10 -0
  284. package/dist/detectors/opening-date.d.ts.map +1 -0
  285. package/dist/detectors/opening-date.js +33 -0
  286. package/dist/detectors/opening-date.js.map +1 -0
  287. package/dist/detectors/ordinary-phrase.d.ts +20 -0
  288. package/dist/detectors/ordinary-phrase.d.ts.map +1 -0
  289. package/dist/detectors/ordinary-phrase.js +54 -0
  290. package/dist/detectors/ordinary-phrase.js.map +1 -0
  291. package/dist/detectors/organisation-run.d.ts +5 -7
  292. package/dist/detectors/organisation-run.d.ts.map +1 -1
  293. package/dist/detectors/organisation-run.js +10 -0
  294. package/dist/detectors/organisation-run.js.map +1 -1
  295. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  296. package/dist/detectors/orthographic-variant.js +85 -20
  297. package/dist/detectors/orthographic-variant.js.map +1 -1
  298. package/dist/detectors/orthography.d.ts.map +1 -1
  299. package/dist/detectors/orthography.js +9 -2
  300. package/dist/detectors/orthography.js.map +1 -1
  301. package/dist/detectors/oxford-comma.d.ts.map +1 -1
  302. package/dist/detectors/oxford-comma.js +70 -3
  303. package/dist/detectors/oxford-comma.js.map +1 -1
  304. package/dist/detectors/person-consistency.d.ts +2 -1
  305. package/dist/detectors/person-consistency.d.ts.map +1 -1
  306. package/dist/detectors/person-consistency.js +5 -3
  307. package/dist/detectors/person-consistency.js.map +1 -1
  308. package/dist/detectors/phrase-match.d.ts +2 -0
  309. package/dist/detectors/phrase-match.d.ts.map +1 -1
  310. package/dist/detectors/phrase-match.js +11 -4
  311. package/dist/detectors/phrase-match.js.map +1 -1
  312. package/dist/detectors/placeholder-text.d.ts.map +1 -1
  313. package/dist/detectors/placeholder-text.js +18 -3
  314. package/dist/detectors/placeholder-text.js.map +1 -1
  315. package/dist/detectors/placeholder.d.ts +3 -1
  316. package/dist/detectors/placeholder.d.ts.map +1 -1
  317. package/dist/detectors/placeholder.js +8 -3
  318. package/dist/detectors/placeholder.js.map +1 -1
  319. package/dist/detectors/postcode-end.d.ts +3 -0
  320. package/dist/detectors/postcode-end.d.ts.map +1 -0
  321. package/dist/detectors/postcode-end.js +15 -0
  322. package/dist/detectors/postcode-end.js.map +1 -0
  323. package/dist/detectors/prose-total-words.d.ts +5 -0
  324. package/dist/detectors/prose-total-words.d.ts.map +1 -0
  325. package/dist/detectors/prose-total-words.js +14 -0
  326. package/dist/detectors/prose-total-words.js.map +1 -0
  327. package/dist/detectors/range-notation.d.ts +2 -2
  328. package/dist/detectors/range-notation.d.ts.map +1 -1
  329. package/dist/detectors/range-notation.js +18 -7
  330. package/dist/detectors/range-notation.js.map +1 -1
  331. package/dist/detectors/registry/kanji-compound-slip.d.ts +3 -0
  332. package/dist/detectors/registry/kanji-compound-slip.d.ts.map +1 -0
  333. package/dist/detectors/registry/kanji-compound-slip.js +3 -0
  334. package/dist/detectors/registry/kanji-compound-slip.js.map +1 -0
  335. package/dist/detectors/registry/phrase-in-use.d.ts +3 -0
  336. package/dist/detectors/registry/phrase-in-use.d.ts.map +1 -0
  337. package/dist/detectors/registry/phrase-in-use.js +3 -0
  338. package/dist/detectors/registry/phrase-in-use.js.map +1 -0
  339. package/dist/detectors/requirement-smell.d.ts.map +1 -1
  340. package/dist/detectors/requirement-smell.js +35 -7
  341. package/dist/detectors/requirement-smell.js.map +1 -1
  342. package/dist/detectors/scaled-figure-unit.d.ts +28 -0
  343. package/dist/detectors/scaled-figure-unit.d.ts.map +1 -0
  344. package/dist/detectors/scaled-figure-unit.js +78 -0
  345. package/dist/detectors/scaled-figure-unit.js.map +1 -0
  346. package/dist/detectors/sentence-counts.d.ts +12 -2
  347. package/dist/detectors/sentence-counts.d.ts.map +1 -1
  348. package/dist/detectors/sentence-counts.js +52 -11
  349. package/dist/detectors/sentence-counts.js.map +1 -1
  350. package/dist/detectors/sentence-ending.d.ts +2 -0
  351. package/dist/detectors/sentence-ending.d.ts.map +1 -1
  352. package/dist/detectors/sentence-ending.js +10 -3
  353. package/dist/detectors/sentence-ending.js.map +1 -1
  354. package/dist/detectors/sentence-length.d.ts.map +1 -1
  355. package/dist/detectors/sentence-length.js +13 -4
  356. package/dist/detectors/sentence-length.js.map +1 -1
  357. package/dist/detectors/sentence-load.d.ts +4 -1
  358. package/dist/detectors/sentence-load.d.ts.map +1 -1
  359. package/dist/detectors/sentence-load.js +9 -2
  360. package/dist/detectors/sentence-load.js.map +1 -1
  361. package/dist/detectors/signals.d.ts.map +1 -1
  362. package/dist/detectors/signals.js +44 -52
  363. package/dist/detectors/signals.js.map +1 -1
  364. package/dist/detectors/structure-tree.d.ts.map +1 -1
  365. package/dist/detectors/structure-tree.js +14 -13
  366. package/dist/detectors/structure-tree.js.map +1 -1
  367. package/dist/detectors/structure.d.ts.map +1 -1
  368. package/dist/detectors/structure.js +2 -1
  369. package/dist/detectors/structure.js.map +1 -1
  370. package/dist/detectors/subject-name-line.d.ts +8 -0
  371. package/dist/detectors/subject-name-line.d.ts.map +1 -0
  372. package/dist/detectors/subject-name-line.js +53 -0
  373. package/dist/detectors/subject-name-line.js.map +1 -0
  374. package/dist/detectors/superlative-name.d.ts +5 -0
  375. package/dist/detectors/superlative-name.d.ts.map +1 -1
  376. package/dist/detectors/superlative-name.js +9 -0
  377. package/dist/detectors/superlative-name.js.map +1 -1
  378. package/dist/detectors/table-header.d.ts.map +1 -1
  379. package/dist/detectors/table-header.js +13 -1
  380. package/dist/detectors/table-header.js.map +1 -1
  381. package/dist/detectors/technical-docs.d.ts.map +1 -1
  382. package/dist/detectors/technical-docs.js +4 -1
  383. package/dist/detectors/technical-docs.js.map +1 -1
  384. package/dist/detectors/term-mention-sentence.d.ts +4 -0
  385. package/dist/detectors/term-mention-sentence.d.ts.map +1 -0
  386. package/dist/detectors/term-mention-sentence.js +28 -0
  387. package/dist/detectors/term-mention-sentence.js.map +1 -0
  388. package/dist/detectors/titled-run.d.ts +2 -1
  389. package/dist/detectors/titled-run.d.ts.map +1 -1
  390. package/dist/detectors/titled-run.js +9 -4
  391. package/dist/detectors/titled-run.js.map +1 -1
  392. package/dist/detectors/token-shape.d.ts.map +1 -1
  393. package/dist/detectors/token-shape.js +15 -5
  394. package/dist/detectors/token-shape.js.map +1 -1
  395. package/dist/detectors/undefined-term.d.ts.map +1 -1
  396. package/dist/detectors/undefined-term.js +5 -0
  397. package/dist/detectors/undefined-term.js.map +1 -1
  398. package/dist/detectors/unknown-word.d.ts +4 -1
  399. package/dist/detectors/unknown-word.d.ts.map +1 -1
  400. package/dist/detectors/unknown-word.js +1 -1
  401. package/dist/detectors/unknown-word.js.map +1 -1
  402. package/dist/detectors/vague-density.d.ts +5 -2
  403. package/dist/detectors/vague-density.d.ts.map +1 -1
  404. package/dist/detectors/vague-density.js +17 -4
  405. package/dist/detectors/vague-density.js.map +1 -1
  406. package/dist/document-paragraphs.d.ts +4 -0
  407. package/dist/document-paragraphs.d.ts.map +1 -0
  408. package/dist/document-paragraphs.js +24 -0
  409. package/dist/document-paragraphs.js.map +1 -0
  410. package/dist/document.d.ts.map +1 -1
  411. package/dist/document.js +2 -19
  412. package/dist/document.js.map +1 -1
  413. package/dist/figure-references.d.ts +3 -0
  414. package/dist/figure-references.d.ts.map +1 -1
  415. package/dist/figure-references.js +6 -2
  416. package/dist/figure-references.js.map +1 -1
  417. package/dist/format-template.d.ts +3 -0
  418. package/dist/format-template.d.ts.map +1 -0
  419. package/dist/format-template.js +13 -0
  420. package/dist/format-template.js.map +1 -0
  421. package/dist/formula-brackets.d.ts +7 -0
  422. package/dist/formula-brackets.d.ts.map +1 -0
  423. package/dist/formula-brackets.js +29 -0
  424. package/dist/formula-brackets.js.map +1 -0
  425. package/dist/html/html-markdown.d.ts.map +1 -1
  426. package/dist/html/html-markdown.js +2 -1
  427. package/dist/html/html-markdown.js.map +1 -1
  428. package/dist/html/html-site-chrome.d.ts +5 -0
  429. package/dist/html/html-site-chrome.d.ts.map +1 -0
  430. package/dist/html/html-site-chrome.js +56 -0
  431. package/dist/html/html-site-chrome.js.map +1 -0
  432. package/dist/joined-view.d.ts.map +1 -1
  433. package/dist/joined-view.js +1 -0
  434. package/dist/joined-view.js.map +1 -1
  435. package/dist/kanji-compound-slip.d.ts +32 -0
  436. package/dist/kanji-compound-slip.d.ts.map +1 -0
  437. package/dist/kanji-compound-slip.js +63 -0
  438. package/dist/kanji-compound-slip.js.map +1 -0
  439. package/dist/latin-company-form.d.ts +6 -0
  440. package/dist/latin-company-form.d.ts.map +1 -0
  441. package/dist/latin-company-form.js +32 -0
  442. package/dist/latin-company-form.js.map +1 -0
  443. package/dist/latin-word-boundary.d.ts +20 -0
  444. package/dist/latin-word-boundary.d.ts.map +1 -0
  445. package/dist/latin-word-boundary.js +57 -0
  446. package/dist/latin-word-boundary.js.map +1 -0
  447. package/dist/leading-label.d.ts +4 -0
  448. package/dist/leading-label.d.ts.map +1 -0
  449. package/dist/leading-label.js +14 -0
  450. package/dist/leading-label.js.map +1 -0
  451. package/dist/lexicon-genres.d.ts +2 -0
  452. package/dist/lexicon-genres.d.ts.map +1 -1
  453. package/dist/lexicon-genres.js +1 -1
  454. package/dist/lexicon-genres.js.map +1 -1
  455. package/dist/link-shape.d.ts +6 -0
  456. package/dist/link-shape.d.ts.map +1 -1
  457. package/dist/link-shape.js +27 -0
  458. package/dist/link-shape.js.map +1 -1
  459. package/dist/link-title.d.ts +4 -0
  460. package/dist/link-title.d.ts.map +1 -0
  461. package/dist/link-title.js +33 -0
  462. package/dist/link-title.js.map +1 -0
  463. package/dist/list-item-paragraphs.d.ts +15 -0
  464. package/dist/list-item-paragraphs.d.ts.map +1 -0
  465. package/dist/list-item-paragraphs.js +19 -0
  466. package/dist/list-item-paragraphs.js.map +1 -0
  467. package/dist/literal-quote.d.ts +12 -0
  468. package/dist/literal-quote.d.ts.map +1 -0
  469. package/dist/literal-quote.js +43 -0
  470. package/dist/literal-quote.js.map +1 -0
  471. package/dist/nado-closed-list.d.ts.map +1 -1
  472. package/dist/nado-closed-list.js +39 -5
  473. package/dist/nado-closed-list.js.map +1 -1
  474. package/dist/name-misspelt-usual.d.ts +5 -0
  475. package/dist/name-misspelt-usual.d.ts.map +1 -0
  476. package/dist/name-misspelt-usual.js +19 -0
  477. package/dist/name-misspelt-usual.js.map +1 -0
  478. package/dist/name-separator.d.ts.map +1 -1
  479. package/dist/name-separator.js +25 -2
  480. package/dist/name-separator.js.map +1 -1
  481. package/dist/nominal-stem.d.ts +14 -1
  482. package/dist/nominal-stem.d.ts.map +1 -1
  483. package/dist/nominal-stem.js +42 -4
  484. package/dist/nominal-stem.js.map +1 -1
  485. package/dist/notice-header.d.ts +19 -0
  486. package/dist/notice-header.d.ts.map +1 -0
  487. package/dist/notice-header.js +31 -0
  488. package/dist/notice-header.js.map +1 -0
  489. package/dist/person-forms.d.ts +8 -0
  490. package/dist/person-forms.d.ts.map +1 -1
  491. package/dist/person-forms.js +12 -0
  492. package/dist/person-forms.js.map +1 -1
  493. package/dist/plugin.d.ts +5 -0
  494. package/dist/plugin.d.ts.map +1 -1
  495. package/dist/preamble-paragraphs.d.ts +3 -2
  496. package/dist/preamble-paragraphs.d.ts.map +1 -1
  497. package/dist/preamble-paragraphs.js +8 -2
  498. package/dist/preamble-paragraphs.js.map +1 -1
  499. package/dist/sentence-load.d.ts +2 -1
  500. package/dist/sentence-load.d.ts.map +1 -1
  501. package/dist/sentence-load.js +11 -3
  502. package/dist/sentence-load.js.map +1 -1
  503. package/dist/spacing-code.d.ts +1 -0
  504. package/dist/spacing-code.d.ts.map +1 -1
  505. package/dist/spacing-code.js +4 -1
  506. package/dist/spacing-code.js.map +1 -1
  507. package/dist/split-noun.d.ts +10 -0
  508. package/dist/split-noun.d.ts.map +1 -0
  509. package/dist/split-noun.js +50 -0
  510. package/dist/split-noun.js.map +1 -0
  511. package/dist/structure/attached-parts.d.ts +12 -0
  512. package/dist/structure/attached-parts.d.ts.map +1 -0
  513. package/dist/structure/attached-parts.js +44 -0
  514. package/dist/structure/attached-parts.js.map +1 -0
  515. package/dist/structure/build.d.ts.map +1 -1
  516. package/dist/structure/build.js +7 -4
  517. package/dist/structure/build.js.map +1 -1
  518. package/dist/structure/contents-lines.d.ts +7 -0
  519. package/dist/structure/contents-lines.d.ts.map +1 -0
  520. package/dist/structure/contents-lines.js +51 -0
  521. package/dist/structure/contents-lines.js.map +1 -0
  522. package/dist/structure/defining-names.d.ts +37 -0
  523. package/dist/structure/defining-names.d.ts.map +1 -0
  524. package/dist/structure/defining-names.js +122 -0
  525. package/dist/structure/defining-names.js.map +1 -0
  526. package/dist/structure/definition-use.d.ts +8 -4
  527. package/dist/structure/definition-use.d.ts.map +1 -1
  528. package/dist/structure/definition-use.js +123 -38
  529. package/dist/structure/definition-use.js.map +1 -1
  530. package/dist/structure/gerund-phrase.d.ts +8 -0
  531. package/dist/structure/gerund-phrase.d.ts.map +1 -0
  532. package/dist/structure/gerund-phrase.js +30 -0
  533. package/dist/structure/gerund-phrase.js.map +1 -0
  534. package/dist/structure/issues.d.ts +4 -1
  535. package/dist/structure/issues.d.ts.map +1 -1
  536. package/dist/structure/issues.js +5 -2
  537. package/dist/structure/issues.js.map +1 -1
  538. package/dist/structure/list-lead-in.d.ts +19 -0
  539. package/dist/structure/list-lead-in.d.ts.map +1 -0
  540. package/dist/structure/list-lead-in.js +85 -0
  541. package/dist/structure/list-lead-in.js.map +1 -0
  542. package/dist/structure/modal-conflict.d.ts +7 -2
  543. package/dist/structure/modal-conflict.d.ts.map +1 -1
  544. package/dist/structure/modal-conflict.js +36 -7
  545. package/dist/structure/modal-conflict.js.map +1 -1
  546. package/dist/structure/negated-act.d.ts +17 -0
  547. package/dist/structure/negated-act.d.ts.map +1 -0
  548. package/dist/structure/negated-act.js +32 -0
  549. package/dist/structure/negated-act.js.map +1 -0
  550. package/dist/structure/numbering.d.ts +3 -1
  551. package/dist/structure/numbering.d.ts.map +1 -1
  552. package/dist/structure/numbering.js +20 -8
  553. package/dist/structure/numbering.js.map +1 -1
  554. package/dist/structure/prose-total.d.ts +4 -0
  555. package/dist/structure/prose-total.d.ts.map +1 -1
  556. package/dist/structure/prose-total.js +16 -6
  557. package/dist/structure/prose-total.js.map +1 -1
  558. package/dist/structure/repeated-number.d.ts +24 -0
  559. package/dist/structure/repeated-number.d.ts.map +1 -0
  560. package/dist/structure/repeated-number.js +89 -0
  561. package/dist/structure/repeated-number.js.map +1 -0
  562. package/dist/structure/rounded-amount.d.ts +8 -0
  563. package/dist/structure/rounded-amount.d.ts.map +1 -0
  564. package/dist/structure/rounded-amount.js +48 -0
  565. package/dist/structure/rounded-amount.js.map +1 -0
  566. package/dist/structure/side-step.d.ts +8 -0
  567. package/dist/structure/side-step.d.ts.map +1 -0
  568. package/dist/structure/side-step.js +21 -0
  569. package/dist/structure/side-step.js.map +1 -0
  570. package/dist/structure/spanned-label-blank.d.ts +8 -0
  571. package/dist/structure/spanned-label-blank.d.ts.map +1 -0
  572. package/dist/structure/spanned-label-blank.js +37 -0
  573. package/dist/structure/spanned-label-blank.js.map +1 -0
  574. package/dist/structure/universal.d.ts +10 -4
  575. package/dist/structure/universal.d.ts.map +1 -1
  576. package/dist/structure/universal.js +26 -7
  577. package/dist/structure/universal.js.map +1 -1
  578. package/dist/structure/unspaced-heading.d.ts +10 -0
  579. package/dist/structure/unspaced-heading.d.ts.map +1 -0
  580. package/dist/structure/unspaced-heading.js +24 -0
  581. package/dist/structure/unspaced-heading.js.map +1 -0
  582. package/dist/structure/written-list-path.d.ts +10 -0
  583. package/dist/structure/written-list-path.d.ts.map +1 -0
  584. package/dist/structure/written-list-path.js +37 -0
  585. package/dist/structure/written-list-path.js.map +1 -0
  586. package/dist/structure/written-resolve.d.ts +1 -1
  587. package/dist/structure/written-resolve.d.ts.map +1 -1
  588. package/dist/structure/written-resolve.js +15 -9
  589. package/dist/structure/written-resolve.js.map +1 -1
  590. package/dist/title-line.d.ts +23 -0
  591. package/dist/title-line.d.ts.map +1 -0
  592. package/dist/title-line.js +28 -0
  593. package/dist/title-line.js.map +1 -0
  594. package/dist/topic-clause.d.ts +7 -0
  595. package/dist/topic-clause.d.ts.map +1 -0
  596. package/dist/topic-clause.js +87 -0
  597. package/dist/topic-clause.js.map +1 -0
  598. package/dist/uncounted-particles.d.ts +18 -0
  599. package/dist/uncounted-particles.d.ts.map +1 -0
  600. package/dist/uncounted-particles.js +47 -0
  601. package/dist/uncounted-particles.js.map +1 -0
  602. package/package.json +3 -3
  603. package/rules/adversative-ga-repeat.yaml +1 -0
  604. package/rules/all-caps-shouting.yaml +2 -2
  605. package/rules/announced-count-mismatch.yaml +2 -2
  606. package/rules/bare-url-mix.yaml +2 -2
  607. package/rules/bracket-nesting.yaml +2 -2
  608. package/rules/bracket-width-consistency.yaml +2 -2
  609. package/rules/broken-link.yaml +2 -2
  610. package/rules/cliche.yaml +4 -3
  611. package/rules/code-fence-language-mix.yaml +2 -2
  612. package/rules/comparative-without-baseline.yaml +2 -2
  613. package/rules/concrete-evidence-density.yaml +1 -0
  614. package/rules/contraction-consistency.yaml +2 -2
  615. package/rules/dangling-figure-reference.yaml +2 -2
  616. package/rules/date-without-year.yaml +10 -2
  617. package/rules/defined-term-form.yaml +2 -2
  618. package/rules/doubled-punctuation.yaml +4 -4
  619. package/rules/doubled-word.yaml +2 -2
  620. package/rules/duplicate-definition.yaml +2 -2
  621. package/rules/duplicate-heading.yaml +2 -2
  622. package/rules/duration-mismatch.yaml +2 -2
  623. package/rules/email-greeting-closing.yaml +2 -2
  624. package/rules/email-subject-length.yaml +2 -2
  625. package/rules/empty-table-cell.yaml +2 -2
  626. package/rules/footnote-mismatch.yaml +2 -2
  627. package/rules/fullwidth-alnum-consistency.yaml +2 -2
  628. package/rules/heading-echo.yaml +2 -2
  629. package/rules/ime-residue.yaml +2 -2
  630. package/rules/kanji-compound-slip.yaml +67 -0
  631. package/rules/kutoten-consistency.yaml +4 -4
  632. package/rules/latin-spacing.yaml +2 -2
  633. package/rules/list-item-form-mix.yaml +2 -2
  634. package/rules/max-kanji-continuous.yaml +6 -4
  635. package/rules/max-sentence-length.yaml +2 -2
  636. package/rules/modal-conflict.yaml +1 -0
  637. package/rules/nado-closed-list.yaml +2 -2
  638. package/rules/ngram-repetition.yaml +2 -2
  639. package/rules/no-doubled-joshi.yaml +2 -2
  640. package/rules/no-mixed-desumasu.yaml +3 -3
  641. package/rules/no-nakaguro-parallel.yaml +2 -0
  642. package/rules/number-without-unit.yaml +9 -4
  643. package/rules/numbering-gap.yaml +7 -2
  644. package/rules/numeral-sentence-start.yaml +2 -2
  645. package/rules/obligation-without-deadline.yaml +2 -2
  646. package/rules/orthographic-variant.yaml +2 -2
  647. package/rules/oxford-comma-consistency.yaml +3 -3
  648. package/rules/preamble-length.yaml +3 -2
  649. package/rules/range-notation-consistency.yaml +2 -2
  650. package/rules/requirement-smell.yaml +3 -3
  651. package/rules/table-header-variant.yaml +2 -2
  652. package/rules/teki-overuse.yaml +3 -2
  653. package/rules/title-length.yaml +2 -2
  654. package/rules/topic-predicate-distance.yaml +2 -2
  655. package/rules/total-mismatch.yaml +2 -2
  656. package/rules/translationese-density.yaml +2 -2
  657. package/rules/undefined-acronym.yaml +5 -2
  658. package/rules/undefined-term.yaml +2 -2
  659. package/rules/unfilled-placeholder.yaml +4 -4
  660. package/rules/unqualified-superlative.yaml +1 -1
  661. package/rules/unused-definition.yaml +2 -2
  662. package/rules/use-before-definition.yaml +2 -2
  663. package/rules/vague-word-density.yaml +2 -2
  664. package/skills/chaff/SKILL.md +7 -1
  665. package/src/announced-count.ts +35 -8
  666. package/src/chronology-rows.ts +86 -0
  667. package/src/company-name-run.ts +37 -0
  668. package/src/compound-head.ts +25 -0
  669. package/src/date-format.ts +43 -4
  670. package/src/derived/count-per-period.ts +28 -0
  671. package/src/detectors/acronym-context.ts +30 -1
  672. package/src/detectors/acronym-expansion.ts +54 -6
  673. package/src/detectors/acronym-known.ts +40 -0
  674. package/src/detectors/acronym-link.ts +75 -0
  675. package/src/detectors/acronym-mention.ts +44 -0
  676. package/src/detectors/acronym-name.ts +29 -6
  677. package/src/detectors/addressee-edge.ts +16 -0
  678. package/src/detectors/addressee-title-edge.ts +39 -0
  679. package/src/detectors/announced-count.ts +1 -0
  680. package/src/detectors/bare-comparative.ts +44 -3
  681. package/src/detectors/blank-structure.ts +21 -10
  682. package/src/detectors/bracket-specified.ts +25 -0
  683. package/src/detectors/broken-link.ts +26 -2
  684. package/src/detectors/capitalised-term.ts +26 -2
  685. package/src/detectors/caps-caption.ts +76 -0
  686. package/src/detectors/caps-phrase.ts +17 -0
  687. package/src/detectors/char-shape.ts +73 -14
  688. package/src/detectors/citation-sentence.ts +44 -0
  689. package/src/detectors/cited-title.ts +15 -3
  690. package/src/detectors/contraction-mention.ts +24 -0
  691. package/src/detectors/counter-edge.ts +17 -2
  692. package/src/detectors/dash-break.ts +45 -0
  693. package/src/detectors/date-any-year.ts +34 -9
  694. package/src/detectors/date-format.ts +2 -1
  695. package/src/detectors/date-year.ts +64 -16
  696. package/src/detectors/deadline-unit.ts +40 -0
  697. package/src/detectors/defined-term-form.ts +32 -12
  698. package/src/detectors/definition-use.ts +17 -9
  699. package/src/detectors/derived-numbers.ts +19 -4
  700. package/src/detectors/document-shape.ts +20 -1
  701. package/src/detectors/doubled-across-aside.ts +36 -0
  702. package/src/detectors/doubled-punctuation.ts +28 -7
  703. package/src/detectors/doubled-word.ts +2 -1
  704. package/src/detectors/duplicate-heading.ts +26 -3
  705. package/src/detectors/ellipsis.ts +16 -1
  706. package/src/detectors/email-letter.ts +142 -23
  707. package/src/detectors/field-label.ts +25 -0
  708. package/src/detectors/footnote-mismatch.ts +39 -7
  709. package/src/detectors/fullwidth-alnum.ts +9 -1
  710. package/src/detectors/graded-step.ts +52 -0
  711. package/src/detectors/gram-openers.ts +50 -0
  712. package/src/detectors/gram-place.ts +10 -1
  713. package/src/detectors/gram-predicate.ts +43 -3
  714. package/src/detectors/heading-echo.ts +31 -3
  715. package/src/detectors/heading-record-rhythm.ts +57 -0
  716. package/src/detectors/ime-residue.ts +4 -3
  717. package/src/detectors/kanji-compound-slip.ts +61 -0
  718. package/src/detectors/kutoten-consistency.ts +102 -14
  719. package/src/detectors/lexicon.ts +18 -5
  720. package/src/detectors/link-shape.ts +10 -3
  721. package/src/detectors/list-item-ending.ts +51 -0
  722. package/src/detectors/list-parallel.ts +158 -33
  723. package/src/detectors/list-sentence.ts +5 -1
  724. package/src/detectors/mark-shape.ts +89 -10
  725. package/src/detectors/mentioned-phrase.ts +38 -0
  726. package/src/detectors/middle-dot.ts +7 -2
  727. package/src/detectors/modal-conflict.ts +5 -2
  728. package/src/detectors/name-variant.ts +6 -0
  729. package/src/detectors/notice-paragraph.ts +33 -0
  730. package/src/detectors/number-style.ts +14 -2
  731. package/src/detectors/number-unit.ts +28 -1
  732. package/src/detectors/numeral-opener.ts +27 -1
  733. package/src/detectors/obligation-without-deadline.ts +29 -4
  734. package/src/detectors/open-end-class.ts +78 -0
  735. package/src/detectors/open-end-condition.ts +40 -0
  736. package/src/detectors/open-end-names.ts +9 -3
  737. package/src/detectors/open-end-question.ts +50 -0
  738. package/src/detectors/open-end-scope.ts +62 -0
  739. package/src/detectors/opening-date.ts +47 -0
  740. package/src/detectors/ordinary-phrase.ts +62 -0
  741. package/src/detectors/organisation-run.ts +18 -2
  742. package/src/detectors/orthographic-variant.ts +124 -25
  743. package/src/detectors/orthography.ts +15 -2
  744. package/src/detectors/oxford-comma.ts +74 -3
  745. package/src/detectors/person-consistency.ts +5 -3
  746. package/src/detectors/phrase-match.ts +16 -5
  747. package/src/detectors/placeholder-text.ts +18 -3
  748. package/src/detectors/placeholder.ts +10 -3
  749. package/src/detectors/postcode-end.ts +16 -0
  750. package/src/detectors/prose-total-words.ts +18 -0
  751. package/src/detectors/range-notation.ts +26 -6
  752. package/src/detectors/registry/kanji-compound-slip.ts +4 -0
  753. package/src/detectors/registry/phrase-in-use.ts +4 -0
  754. package/src/detectors/requirement-smell.ts +45 -8
  755. package/src/detectors/scaled-figure-unit.ts +103 -0
  756. package/src/detectors/sentence-counts.ts +64 -12
  757. package/src/detectors/sentence-ending.ts +12 -3
  758. package/src/detectors/sentence-length.ts +17 -4
  759. package/src/detectors/sentence-load.ts +9 -2
  760. package/src/detectors/signals.ts +50 -53
  761. package/src/detectors/structure-tree.ts +14 -14
  762. package/src/detectors/structure.ts +2 -1
  763. package/src/detectors/subject-name-line.ts +66 -0
  764. package/src/detectors/superlative-name.ts +10 -0
  765. package/src/detectors/table-header.ts +15 -1
  766. package/src/detectors/technical-docs.ts +5 -1
  767. package/src/detectors/term-mention-sentence.ts +31 -0
  768. package/src/detectors/titled-run.ts +9 -4
  769. package/src/detectors/token-shape.ts +16 -5
  770. package/src/detectors/undefined-term.ts +8 -0
  771. package/src/detectors/unknown-word.ts +1 -1
  772. package/src/detectors/vague-density.ts +20 -4
  773. package/src/document-paragraphs.ts +27 -0
  774. package/src/document.ts +3 -23
  775. package/src/figure-references.ts +7 -2
  776. package/src/format-template.ts +15 -0
  777. package/src/formula-brackets.ts +36 -0
  778. package/src/html/html-markdown.ts +2 -1
  779. package/src/html/html-site-chrome.ts +104 -0
  780. package/src/joined-view.ts +1 -0
  781. package/src/kanji-compound-slip.ts +98 -0
  782. package/src/latin-company-form.ts +38 -0
  783. package/src/latin-word-boundary.ts +64 -0
  784. package/src/leading-label.ts +15 -0
  785. package/src/lexicon-genres.ts +1 -1
  786. package/src/link-shape.ts +31 -0
  787. package/src/link-title.ts +38 -0
  788. package/src/list-item-paragraphs.ts +22 -0
  789. package/src/literal-quote.ts +55 -0
  790. package/src/nado-closed-list.ts +48 -5
  791. package/src/name-misspelt-usual.ts +25 -0
  792. package/src/name-separator.ts +27 -2
  793. package/src/nominal-stem.ts +62 -5
  794. package/src/notice-header.ts +57 -0
  795. package/src/person-forms.ts +15 -0
  796. package/src/plugin.ts +5 -0
  797. package/src/preamble-paragraphs.ts +13 -3
  798. package/src/sentence-load.ts +14 -3
  799. package/src/spacing-code.ts +5 -1
  800. package/src/split-noun.ts +63 -0
  801. package/src/structure/attached-parts.ts +47 -0
  802. package/src/structure/build.ts +7 -4
  803. package/src/structure/contents-lines.ts +63 -0
  804. package/src/structure/defining-names.ts +155 -0
  805. package/src/structure/definition-use.ts +149 -32
  806. package/src/structure/gerund-phrase.ts +31 -0
  807. package/src/structure/issues.ts +7 -3
  808. package/src/structure/list-lead-in.ts +94 -0
  809. package/src/structure/modal-conflict.ts +42 -7
  810. package/src/structure/negated-act.ts +49 -0
  811. package/src/structure/numbering.ts +24 -9
  812. package/src/structure/prose-total.ts +20 -6
  813. package/src/structure/repeated-number.ts +110 -0
  814. package/src/structure/rounded-amount.ts +55 -0
  815. package/src/structure/side-step.ts +21 -0
  816. package/src/structure/spanned-label-blank.ts +39 -0
  817. package/src/structure/universal.ts +33 -9
  818. package/src/structure/unspaced-heading.ts +27 -0
  819. package/src/structure/written-list-path.ts +46 -0
  820. package/src/structure/written-resolve.ts +16 -9
  821. package/src/title-line.ts +53 -0
  822. package/src/topic-clause.ts +109 -0
  823. package/src/uncounted-particles.ts +72 -0
@@ -9,6 +9,7 @@ import { lineNumberAt, linesOf, type Line } from "./lines.ts";
9
9
  import { universalNumber } from "./universal.ts";
10
10
  import { unnumberedUnit, type OpenUnit } from "./unnumbered.ts";
11
11
  import { readsOnHeading } from "./heading-leaves.ts";
12
+ import { unspacedHeadings } from "./unspaced-heading.ts";
12
13
  import { onLine, wrappedLine, type WrappedLine } from "./wrapped-tail.ts";
13
14
  import { foldPostOrder } from "../tree-walk.ts";
14
15
 
@@ -260,10 +261,11 @@ const headingsByLine = (lines: readonly Line[], headings: readonly Heading[]): M
260
261
  * 見出しの行から見出しの言葉を取る。コードを覆った後の行から取るので、見出しの中のコードも読まない。
261
262
  * ATX(行頭が #)なら印と閉じの # を外す。setext(下線で書く見出し)の末尾の # は言葉なので残す。
262
263
  */
263
- const headingLineText = (text: string): string => {
264
+ const headingLineText = (text: string, atx: boolean): string => {
264
265
  const line = text.trim();
265
266
  if (!line.startsWith("#")) return headingText(line);
266
- return atxHeadingText(line.replace(/^#{1,6}(?=[ \t]|$)/u, "").trim());
267
+ // A heading that ends on its own line is ATX, and its hashes go even with no space after them (unspaced-heading.ts).
268
+ return atxHeadingText(line.replace(atx ? /^#{1,6}/u : /^#{1,6}(?=[ \t]|$)/u, "").trim());
267
269
  };
268
270
 
269
271
  const captionPatterns = new WeakMap<DocumentProfile, RegExp | undefined>();
@@ -319,7 +321,7 @@ const withCaption = (state: State, line: Line, numbered: NumberedLine | undefine
319
321
  type Around = { readonly next: string | undefined; readonly previous: string | undefined; readonly inTable: boolean };
320
322
 
321
323
  const readLine = (state: State, patterns: StructurePatterns, line: Line, heading: Heading | undefined, around: Around): void => {
322
- const text = heading === undefined ? line.text : headingLineText(line.text);
324
+ const text = heading === undefined ? line.text : headingLineText(line.text, heading.end <= line.start + line.text.length);
323
325
  const openNumbers = state.stack.flatMap((frame) => (frame.numbered === undefined ? [] : [frame.numbered]));
324
326
  const context = { open: openNumbers, isHeading: heading !== undefined };
325
327
  const found = around.inTable ? undefined : (numberedLine(state, patterns, text, context) ?? codeTitledNumber(state, patterns, text, heading, context));
@@ -361,7 +363,8 @@ export const buildTree = (input: StructureInput, patterns: StructurePatterns): S
361
363
  // コードは同じ長さの空白で覆ってから読む。コードブロックの行は空になって飛ばされ、
362
364
  // 文中の `第99条` は参照として拾われない。位置は元の文書のまま。
363
365
  const lines = linesOf(maskSpans(input.source, outline.opaque));
364
- const headings = headingsByLine(lines, outline.headings);
366
+ const marked = headingsByLine(lines, outline.headings);
367
+ const headings = input.markdown ? new Map([...marked, ...unspacedHeadings(lines, marked, patterns)]) : marked;
365
368
  const attrs = { path: input.path, language: input.language, ...(input.profile === undefined ? {} : { profile: input.profile.id }) };
366
369
  const doc = draftOf("doc", "", { text: "", start: 0, number: 1 }, attrs);
367
370
  doc.end = input.source.length;
@@ -0,0 +1,63 @@
1
+ import type { MarkupHeading } from "../plugin.ts";
2
+ import { lineNumberAt, type Line } from "./lines.ts";
3
+
4
+ // 目次・索引の行と、番号に題だけを続けた行。どれも本文の文ではなく、文書の案内。純関数: 行と Markdown の見出しを受け取る。
5
+
6
+ /** 項目の終わり(ページ番号、条の番地 2.04(c))の後ろに、次の項目の大文字が続く所。 */
7
+ const ENTRY_BREAK = /(?<![\p{L}\p{N}$.,])\d+(?:\.\d+)*(?:\([\p{L}\p{N}]{1,4}\))*\s+(?=\p{Lu})/gu;
8
+ /** 一行に詰めた目次・索引と読むのに要る、項目の切れ目の数(Closing 2 Section 1.2 The Merger 2 ARTICLE II)。 */
9
+ const MIN_ENTRY_BREAKS = 3;
10
+ /** 目次・索引の行の言葉は、ほとんどが大文字で始まる。短くない語のうち小文字で始まる語がこの割合以上なら文。 */
11
+ const MAX_LOWERCASE_SHARE = 1 / 3;
12
+ /** これより短い語(of、and、the、番地の (c)、iii)は、題の中でも小文字で書く。 */
13
+ const MIN_CAPITALISED_LENGTH = 4;
14
+ const WORD = /\p{L}[\p{L}'’-]*/gu;
15
+ const LOWERCASE_START = /^\p{Ll}/u;
16
+
17
+ /** 短くない語のうち、小文字で始まる語の割合。 */
18
+ const lowercaseShare = (text: string): number => {
19
+ const words = (text.match(WORD) ?? []).filter((word) => word.length >= MIN_CAPITALISED_LENGTH);
20
+ return words.length === 0 ? 1 : words.filter((word) => LOWERCASE_START.test(word)).length / words.length;
21
+ };
22
+
23
+ /** 項目と番号を一行に詰めた目次・索引(Section 1.1 Closing 2 Section 1.2 The Merger 2、Company RSU 2.04(b) Company SEC Documents 4.07(a))。 */
24
+ const isPackedContents = (text: string): boolean => [...text.matchAll(ENTRY_BREAK)].length >= MIN_ENTRY_BREAKS && lowercaseShare(text) < MAX_LOWERCASE_SHARE;
25
+
26
+ /** 番号に題を続けただけの行(1 Supply of Ingredients)。題の語は大文字で始まり、文の終わりの印を持たない。 */
27
+ const NUMBERED_TITLE = /^\s*\d+(?:\.\d+)*\.?\s+\p{Lu}[^.。:;,!?]*$/u;
28
+ /** 題と読む語の数の上限。 */
29
+ const MAX_TITLE_WORDS = 8;
30
+
31
+ const NOT_LATIN_LETTER = /[^\P{L}\p{Script=Latin}]/u;
32
+
33
+ /** 英語の題の言葉か: 語が多すぎず、短くない語がどれも大文字で始まる(Supply of Ingredients、Extension; Waiver)。 */
34
+ export const isTitleWords = (text: string): boolean => {
35
+ const words = text.match(WORD) ?? [];
36
+ return (
37
+ words.length > 0 &&
38
+ !NOT_LATIN_LETTER.test(text) &&
39
+ words.length <= MAX_TITLE_WORDS &&
40
+ words.every((word) => word.length < MIN_CAPITALISED_LENGTH || !LOWERCASE_START.test(word))
41
+ );
42
+ };
43
+
44
+ const isNumberedTitle = (text: string): boolean => NUMBERED_TITLE.test(text) && isTitleWords(text);
45
+
46
+ /** 目次の見出し(語彙表 toc-heading)の下、次の見出しまでの行の番号。 */
47
+ const linesUnderContentsHeading = (lines: readonly Line[], headings: readonly MarkupHeading[], tocWords: readonly string[]): number[] => {
48
+ const names = new Set(tocWords.map((word) => word.toLowerCase()));
49
+ return headings.flatMap((heading, index) => {
50
+ if (!names.has(heading.text.trim().toLowerCase())) return [];
51
+ const from = lineNumberAt(lines, heading.start) ?? 0;
52
+ const next = headings[index + 1];
53
+ const to = next === undefined ? lines.length + 1 : (lineNumberAt(lines, next.start) ?? lines.length + 1);
54
+ return lines.filter((line) => line.number > from && line.number < to).map((line) => line.number);
55
+ });
56
+ };
57
+
58
+ /** 目次・索引の行と、番号に題だけを続けた行の番号(1 始まり)。 */
59
+ export const contentsLineNumbers = (lines: readonly Line[], headings: readonly MarkupHeading[], tocWords: readonly string[]): ReadonlySet<number> =>
60
+ new Set([
61
+ ...linesUnderContentsHeading(lines, headings, tocWords),
62
+ ...lines.filter((line) => isPackedContents(line.text) || isNumberedTitle(line.text)).map((line) => line.number),
63
+ ]);
@@ -0,0 +1,155 @@
1
+ import { escapeRegExp } from "../orthography.ts";
2
+
3
+ // 定義の括弧の前に書いた名前と、それを定義より前で写した所。純関数: 文(本文の一続き)と、その中の位置だけを見る。
4
+
5
+ /** 一つの文。start は文書の中の位置。 */
6
+ type Sentence = { readonly start: number; readonly text: string };
7
+
8
+ const OPENING_BRACKET = /[\s((]/u;
9
+
10
+ /** 定義の括弧を開けた字((、空白)を後ろから外した、括弧の前の名前。 */
11
+ export const nameBefore = (text: string): string => {
12
+ let end = text.length;
13
+ while (end > 0 && OPENING_BRACKET.test(text.charAt(end - 1))) end -= 1;
14
+ return text.slice(0, end);
15
+ };
16
+
17
+ /** 二つの文字列が後ろから何字重なるか。 */
18
+ export const sharedTail = (left: string, right: string): number => {
19
+ let shared = 0;
20
+ while (shared < left.length && shared < right.length && left.at(-1 - shared) === right.at(-1 - shared)) shared += 1;
21
+ return shared;
22
+ };
23
+
24
+ /** 漢字・仮名の名前の頭を決める字。名前はこの字の後ろから括弧の前まで(、株式会社ジェイアール東日本企画(以下「会社」))。 */
25
+ const NAME_BOUNDARY = /[\s、。,.,.;;::()()「」『』【】[][\]]/u;
26
+ const LATIN_NAME_END = /[\p{Script=Latin}\p{N}.]$/u;
27
+ const CAPITALISED = /^[\p{Lu}\p{N}&]/u;
28
+ /** 大文字の語のあいだにだけ入る、短い小文字の語(Board of Directors の of)。 */
29
+ const CONNECTOR = /^\p{Ll}{1,3}$/u;
30
+ const TOKEN = /\S+/gu;
31
+
32
+ /** 英語の名前: 括弧の前から遡った、大文字で始まる語の並び(Youth Sports Management, LLC、Board of Directors)。 */
33
+ const latinNameIn = (text: string): string => {
34
+ const tokens = [...text.matchAll(TOKEN)];
35
+ const kept = (index: number): boolean => {
36
+ const word = tokens[index]?.[0] ?? "";
37
+ const previous = tokens[index - 1]?.[0] ?? "";
38
+ return CAPITALISED.test(word) || (CONNECTOR.test(word) && CAPITALISED.test(previous) && !previous.endsWith(","));
39
+ };
40
+ const stop = tokens.findLastIndex((_, index) => !kept(index));
41
+ const first = tokens[stop + 1];
42
+ return first === undefined ? "" : text.slice(first.index);
43
+ };
44
+
45
+ /** 括弧の前の長い名前。英字で終われば大文字の語の並び、そうでなければ句読点・括弧の後ろから。 */
46
+ export const longNameIn = (text: string): string => {
47
+ if (LATIN_NAME_END.test(text)) return latinNameIn(text);
48
+ const chars = [...text];
49
+ return chars.slice(chars.findLastIndex((char) => NAME_BOUNDARY.test(char)) + 1).join("");
50
+ };
51
+
52
+ /** 定義の括弧の前の名前(name)、その前の文(before)、括弧の中の語より前(head: (this “Agreement”) の (this 。引用符は空白にする)。 */
53
+ export type DefiningName = { readonly name: string; readonly before: string; readonly head: string };
54
+
55
+ const LETTER_OR_SPACE = /[\p{L}\p{N}\s]/u;
56
+
57
+ /** 終わりの引用符と強調の印(“、「、***)を空白にしたもの。 */
58
+ const withoutOpeningQuote = (text: string): string => {
59
+ const chars = [...text];
60
+ return `${chars.slice(0, chars.findLastIndex((char) => LETTER_OR_SPACE.test(char)) + 1).join("")} `;
61
+ };
62
+ const ROUND_OPEN = new Set(["(", "("]);
63
+ const ROUND_CLOSE = new Set([")", ")"]);
64
+
65
+ /** text の終わりで開いたままの丸括弧の位置(…法律(令和6年法律第69号。以下「…」の()。無ければ undefined。 */
66
+ const openBracketAt = (text: string): number | undefined => {
67
+ const open: number[] = [];
68
+ text.split("").forEach((char, index) => {
69
+ if (ROUND_OPEN.has(char)) open.push(index);
70
+ else if (ROUND_CLOSE.has(char)) open.pop();
71
+ });
72
+ return open.at(-1);
73
+ };
74
+
75
+ /** 文の中の定義の範囲 [spanStart, spanEnd) から、定義の前の名前を取る。定義が括弧の中の注記の後ろにあれば、その括弧の前の名前。位置は文書の中の位置。 */
76
+ export const definingNameOf = (sentence: Sentence, spanStart: number, spanEnd: number, term: string): DefiningName => {
77
+ const beforeSpan = sentence.text.slice(0, spanStart - sentence.start);
78
+ const prefix = nameBefore(beforeSpan.slice(0, openBracketAt(beforeSpan) ?? beforeSpan.length));
79
+ const name = longNameIn(prefix);
80
+ const span = sentence.text.slice(spanStart - sentence.start, spanEnd - sentence.start);
81
+ const termAt = span.indexOf(term);
82
+ return { name, before: prefix.slice(0, prefix.length - name.length), head: termAt === -1 ? "" : withoutOpeningQuote(span.slice(0, termAt)) };
83
+ };
84
+
85
+ /** 長い名前の写しと読むのに、語のほかに名前と重ならなければならない字の数(手引き の前の「の」と「成」)。 */
86
+ export const MIN_ECHO = 2;
87
+ const LATIN_WORD_CHAR = /[\p{Script=Latin}\p{N}]/u;
88
+
89
+ /** 名前の from の位置が英語の語の途中なら、次の語の頭へ進める。limit を越えれば undefined。 */
90
+ const wordStartFrom = (name: string, from: number, limit: number): number | undefined => {
91
+ if (from === 0 || !LATIN_WORD_CHAR.test(name.charAt(from - 1)) || !LATIN_WORD_CHAR.test(name.charAt(from))) return from;
92
+ const space = name.slice(from).search(/\s/u);
93
+ return space === -1 || from + space + 1 > limit ? undefined : from + space + 1;
94
+ };
95
+
96
+ const indexesOf = (text: string, part: string): number[] => [...text.matchAll(new RegExp(escapeRegExp(part), "gu"))].map((match) => match.index);
97
+
98
+ /**
99
+ * 文の at にある語が、定義の名前 name(語を含む、語より長い名前)の写しの中にあるか(Board of Directors (the "Board") より前の
100
+ * Board of Directors、株式会社エムケイシステム(以下「会社」)より前の株式会社エムケイシステム)。写しは名前の終わりまで同じで、
101
+ * 頭は名前の語の切れ目から。
102
+ */
103
+ export const echoesName = (sentence: Sentence, at: number, term: string, name: string): boolean =>
104
+ name !== term &&
105
+ indexesOf(name, term).some((index) => {
106
+ if (!sentence.text.startsWith(name.slice(index + term.length), at + term.length)) return false;
107
+ const shared = Math.min(index, sharedTail(name.slice(0, index), sentence.text.slice(0, at)));
108
+ const start = wordStartFrom(name, index - shared, index);
109
+ return start !== undefined && name.length - start - term.length >= MIN_ECHO;
110
+ });
111
+
112
+ const LATIN_LETTER = /\p{Script=Latin}/u;
113
+
114
+ const SCRIPTS = [/\p{Script=Han}/u, /\p{Script=Hiragana}/u, /\p{Script=Katakana}/u];
115
+
116
+ /** 二つの字が同じ字の種類(漢字、平仮名、片仮名)か。基本規程の「本」は、前の「基」と一続きの語の一部。 */
117
+ const sameScript = (left: string, right: string): boolean => SCRIPTS.some((script) => script.test(left) && script.test(right));
118
+
119
+ /** 漢字・仮名の頭が、前の語に続かずに text の終わりにあるか(この規則、本規程。基本規程の本、そこの規則のこの は当たらない)。 */
120
+ const endsWithWordPrefix = (text: string, prefix: string): boolean =>
121
+ text.endsWith(prefix) && !sameScript(text.charAt(text.length - prefix.length - 1), prefix.charAt(0));
122
+
123
+ /** text の終わりが、文書自身を指す頭(この、本、this)か。英語の頭は語として(this の後ろに空白)、大文字小文字を問わない。 */
124
+ const endsWithSelfPrefix = (text: string, prefixes: readonly string[]): boolean =>
125
+ prefixes.some((prefix) =>
126
+ LATIN_LETTER.test(prefix) ? new RegExp(String.raw`(?<![\p{L}\p{N}])${escapeRegExp(prefix)}\s+$`, "iu").test(text) : endsWithWordPrefix(text, prefix),
127
+ );
128
+
129
+ /** 定義が文書自身の名前か(この就業規則(以下「規則」)、本規程(以下「規程」)、This Agreement … (this "Agreement"))。 */
130
+ export const namesItself = (defining: DefiningName, prefixes: readonly string[]): boolean =>
131
+ endsWithSelfPrefix(defining.head, prefixes) ||
132
+ endsWithSelfPrefix(defining.before, prefixes) ||
133
+ prefixes.some((prefix) => !LATIN_LETTER.test(prefix) && defining.name.startsWith(prefix));
134
+
135
+ /** 文の at の語の前が、文書自身を指す頭か(この規則、this Agreement)。 */
136
+ export const followsSelfPrefix = (sentence: Sentence, at: number, prefixes: readonly string[]): boolean =>
137
+ endsWithSelfPrefix(sentence.text.slice(0, at), prefixes);
138
+
139
+ /** 前の語を見るのに遡る字の数。 */
140
+ const LOOK_BEHIND_CHARS = 80;
141
+ /** 語の前が、文の頭ではない大文字の語か(Navistar Financial Corporation の Corporation)。The Company の The は文の頭なので当たらない。 */
142
+ const AFTER_CAPITALISED_WORD = /\p{L}[ \u00a0]\p{Lu}[\p{L}\p{N}&'’-]*[ \u00a0]$/u;
143
+
144
+ /** 英語の語が、前の大文字の語から続く長い名前の終わりにあるか。 */
145
+ export const endsLatinName = (sentence: Sentence, at: number, term: string): boolean =>
146
+ LATIN_LETTER.test(term.charAt(0)) && AFTER_CAPITALISED_WORD.test(sentence.text.slice(Math.max(0, at - LOOK_BEHIND_CHARS), at));
147
+
148
+ /** 語のすぐ後ろの括弧とその中身(こども性暴力防止法(…に関する法律)の(…に関する法律))。 */
149
+ const GLOSS_AFTER = /^\s*[((]([^))]*)[))]/u;
150
+
151
+ /** 文の at の語が、すぐ後ろの括弧に定義の長い名前を書き添えているか。語の意味はその場で分かる。 */
152
+ export const glossedWithName = (sentence: Sentence, at: number, term: string, name: string): boolean => {
153
+ const gloss = GLOSS_AFTER.exec(sentence.text.slice(at + term.length))?.[1];
154
+ return gloss !== undefined && name.length >= term.length + MIN_ECHO && gloss.trim().endsWith(name);
155
+ };
@@ -1,6 +1,20 @@
1
1
  import type { Span, StructureNode } from "../plugin.ts";
2
2
  import { escapeRegExp } from "../orthography.ts";
3
3
  import { inDocumentOrder } from "./issues.ts";
4
+ import { isTitleWords } from "./contents-lines.ts";
5
+ import { verbFormsOf } from "./gerund-phrase.ts";
6
+ import {
7
+ definingNameOf,
8
+ echoesName,
9
+ endsLatinName,
10
+ followsSelfPrefix,
11
+ glossedWithName,
12
+ MIN_ECHO,
13
+ nameBefore,
14
+ namesItself,
15
+ sharedTail,
16
+ type DefiningName,
17
+ } from "./defining-names.ts";
4
18
 
5
19
  // 定義した語が本文で使われているか、定義より前に使われていないか。どちらも木の定義と、本文の文の字面だけで決まる。
6
20
 
@@ -96,13 +110,23 @@ const groupsOf = (terms: readonly DefinedTerm[]): TermGroup[] => {
96
110
  return [...groups.values()];
97
111
  };
98
112
 
99
- /** 定義したのに、定義の外で一度も使っていない語。同じ語の定義が二つあれば、最初の一つだけを言う(二つ目は duplicate-definition)。 */
100
- export const unusedDefinitions = (terms: readonly DefinedTerm[], texts: readonly BodyText[], mentioned: Mentioned = NEVER_MENTIONED): DefinedTerm[] => {
113
+ /** 語か、動名詞で始まる句の動詞の形(Exercising your options の exercise your options)が、定義の外に一度でも現れるか。 */
114
+ const isUsed = (group: TermGroup, texts: readonly BodyText[], determiners: ReadonlySet<string>): boolean =>
115
+ [group.first.term, ...verbFormsOf(group.first.term, determiners)].some((form) => usesOf(form, texts, group.spans).length > 0);
116
+
117
+ /**
118
+ * 定義したのに、定義の外で一度も使っていない語。同じ語の定義が二つあれば、最初の一つだけを言う(二つ目は duplicate-definition)。
119
+ * determiners: 動名詞の後ろに来て、それが目的語を取る動詞だと分かる語(英語の a, the, your)。
120
+ */
121
+ export const unusedDefinitions = (
122
+ terms: readonly DefinedTerm[],
123
+ texts: readonly BodyText[],
124
+ mentioned: Mentioned = NEVER_MENTIONED,
125
+ determiners: ReadonlySet<string> = new Set(),
126
+ ): DefinedTerm[] => {
101
127
  const groups = groupsOf(terms);
102
128
  const examples = quotesExamples(groups, texts, mentioned);
103
- return groups
104
- .filter((group) => !(examples && group.first.bare === true) && usesOf(group.first.term, texts, group.spans).length === 0)
105
- .map((group) => group.first);
129
+ return groups.filter((group) => !(examples && group.first.bare === true) && !isUsed(group, texts, determiners)).map((group) => group.first);
106
130
  };
107
131
 
108
132
  /**
@@ -131,9 +155,42 @@ const LETTER = /\p{L}/gu;
131
155
  /** 札の文が語のほかに持ってよい字の数("The Agreement." の The)。 */
132
156
  const LABEL_SLACK = 3;
133
157
 
134
- /** 語だけの札の文(**12.2.** Taxes.、1. The Agreement.)。条の頭に語を掲げただけで、使用ではない。 */
158
+ /**
159
+ * 札の終わりに添えた条の番地の注((第7条関係)、(Section 4))。同じ形の括弧の一組で、入れ子が無く、中身は番号を含む 20 字まで。
160
+ * 長い括弧、番号の無い括弧((if any))、文の途中の括弧は、文の一部として読む。
161
+ */
162
+ const SECTION_NOTE = /(?:([^()()]{0,20})|\([^()()]{0,20}\))[.。.]?\s*$/u;
163
+ const NUMBER = /[\p{N}〇一二三四五六七八九十]/u;
164
+
165
+ const withoutSectionNote = (text: string): string => {
166
+ const note = SECTION_NOTE.exec(text);
167
+ return note === null || !NUMBER.test(note[0]) ? text : text.slice(0, note.index);
168
+ };
169
+
170
+ /**
171
+ * 語だけの札の文(**12.2.** Taxes.、1. The Agreement.、(1)文化芸術推進基本計画(第7条関係))。条や節の頭に語を掲げただけで、
172
+ * 使用ではない。終わりに添えた条の番地の注は札の字に数えない。
173
+ */
135
174
  const isLabel = (body: BodyText | undefined, term: string): boolean =>
136
- body !== undefined && (body.text.replaceAll(term, "").match(LETTER) ?? []).length <= LABEL_SLACK;
175
+ body !== undefined && (withoutSectionNote(body.text.trimEnd()).replaceAll(term, "").match(LETTER) ?? []).length <= LABEL_SLACK;
176
+
177
+ /** 番地の後ろの、条の題の始まり(Section 1.1 Closing. の Closing)。 */
178
+ const AFTER_ADDRESS = /\d\.?\s+(?=\p{Lu})/gu;
179
+ /** 文の終わりまでが、文の終わりの印を一つしか持たない(題の終わりの点)。 */
180
+ const CAPTION_TO_END = /^[^.!?。]*[.。]?$/u;
181
+
182
+ /**
183
+ * 条の題の中か。番地の後ろに題を置いて文がその題で終わる所(Section 1.1 Closing.)か、文が題だけのもの(Section 6.06. の後ろの
184
+ * Financing Covenant.、Company Stockholder Meeting; Company Proxy Statement.)。
185
+ */
186
+ const insideCaption = (body: BodyText | undefined, offset: number): boolean => {
187
+ if (body === undefined) return false;
188
+ const at = offset - body.start;
189
+ const starts = [...body.text.matchAll(AFTER_ADDRESS)].filter((start) => start.index + start[0].length <= at);
190
+ const last = starts.at(-1);
191
+ const caption = last === undefined ? body.text : body.text.slice(last.index + last[0].length);
192
+ return CAPTION_TO_END.test(caption.trimEnd()) && isTitleWords(caption);
193
+ };
137
194
 
138
195
  /** 文書の位置が、題・見出し・条の見出しの行にあるか。見出しは節の中身に名前を付けるだけで、語を使った所ではない。 */
139
196
  export type IsTitle = (offset: number) => boolean;
@@ -169,24 +226,6 @@ const insideKatakanaName = (texts: readonly BodyText[], term: string, offset: nu
169
226
  return (KATAKANA.test(term.charAt(0)) && joinedBefore) || (KATAKANA.test(term.at(-1) ?? "") && joinedAfter);
170
227
  };
171
228
 
172
- /** 長い名前の写しと読むのに、語の前で定義の名前と重ならなければならない字の数(手引き の前の「の」と「成」)。 */
173
- const MIN_ECHO = 2;
174
- const OPENING_BRACKET = /[\s((]/u;
175
-
176
- /** 定義の括弧を開けた字((、空白)を後ろから外した、括弧の前の名前。 */
177
- const nameBefore = (text: string): string => {
178
- let end = text.length;
179
- while (end > 0 && OPENING_BRACKET.test(text.charAt(end - 1))) end -= 1;
180
- return text.slice(0, end);
181
- };
182
-
183
- /** 二つの文字列が後ろから何字重なるか。 */
184
- const sharedTail = (left: string, right: string): number => {
185
- let shared = 0;
186
- while (shared < left.length && shared < right.length && left.at(-1 - shared) === right.at(-1 - shared)) shared += 1;
187
- return shared;
188
- };
189
-
190
229
  /**
191
230
  * 定義の括弧の前に書いた長い名前(…ガイドライン作成の手引き(以下、「手引き」という。))を、定義より前でそのまま書いた所。
192
231
  * 名前が語で終わり、語の前の字も名前と同じなら、それは長い名前で、定義した短い名前の使用ではない。
@@ -229,10 +268,81 @@ const CAPITAL_OR_NON_LATIN = /\p{Lu}|[^\p{Script=Latin}\p{N}\s\p{P}]/u;
229
268
  */
230
269
  const isDistinctive = (term: string): boolean => CAPITAL_OR_NON_LATIN.test(term) && !SINGLE_KANJI.test(term);
231
270
 
271
+ /** 文の途中の定義ごとの、括弧の前の名前。 */
272
+ const definingNames = (terms: readonly DefinedTerm[], texts: readonly BodyText[]): Map<DefinedTerm, DefiningName> =>
273
+ new Map(
274
+ terms.flatMap((term): [DefinedTerm, DefiningName][] => {
275
+ const sentence = term.inline ? sentenceAt(texts, term.span.start) : undefined;
276
+ return sentence === undefined ? [] : [[term, definingNameOf(sentence, term.span.start, term.span.end, term.term)]];
277
+ }),
278
+ );
279
+
280
+ /**
281
+ * 語を含む、もっと長い名前の中の現れか。別の語の定義の中((the "Certificate of Merger") の Certificate)、もっと長い定義した語
282
+ * (NFLN Agreement の NFLN)、定義の括弧の前の名前の写し(Board of Directors)、大文字の語に続く英語の名前の終わり。
283
+ */
284
+ type InsideLongerName = (term: string, offset: number) => boolean;
285
+
286
+ /** 位置がどれかの範囲の中か。範囲を頭の順に並べ、二分探索で引く(定義が何千あっても、現れ一つに対数)。 */
287
+ const insideAnyOf = (spans: readonly Span[]): ((offset: number) => boolean) => {
288
+ const sorted = spans.toSorted((left, right) => left.start - right.start);
289
+ const furthestEnd: number[] = [];
290
+ sorted.forEach((span, index) => furthestEnd.push(Math.max(furthestEnd[index - 1] ?? 0, span.end)));
291
+ return (offset) => {
292
+ let low = 0;
293
+ let high = sorted.length - 1;
294
+ while (low <= high) {
295
+ const middle = (low + high) >> 1;
296
+ if ((sorted[middle]?.start ?? 0) <= offset) low = middle + 1;
297
+ else high = middle - 1;
298
+ }
299
+ if (high < 0 || (furthestEnd[high] ?? 0) <= offset) return false;
300
+ return offset < (sorted[high]?.end ?? 0) || inside(offset, sorted.slice(0, high));
301
+ };
302
+ };
303
+
304
+ const insideLongerNameIn = (texts: readonly BodyText[], terms: readonly DefinedTerm[], names: ReadonlyMap<DefinedTerm, DefiningName>): InsideLongerName => {
305
+ const insideDefinition = insideAnyOf(terms.map((term) => term.span));
306
+ const longNames = [...new Set([...[...names.values()].map((defining) => defining.name), ...terms.map((term) => term.term)])];
307
+ const holding = new Map<string, readonly string[]>();
308
+ const namesHolding = (term: string): readonly string[] => {
309
+ const known = holding.get(term);
310
+ if (known !== undefined) return known;
311
+ const found = longNames.filter((name) => name !== term && name.includes(term));
312
+ holding.set(term, found);
313
+ return found;
314
+ };
315
+ return (term, offset) => {
316
+ if (insideDefinition(offset)) return true;
317
+ const sentence = sentenceAt(texts, offset);
318
+ if (sentence === undefined) return false;
319
+ const at = offset - sentence.start;
320
+ return endsLatinName(sentence, at, term) || namesHolding(term).some((name) => echoesName(sentence, at, term, name));
321
+ };
322
+ };
323
+
324
+ /**
325
+ * 前で書いても読み手が分かる所。文書自身の名前と定義した語(この就業規則(以下「規則」))を同じ頭を付けて書いた所(この規則は、…)と、
326
+ * すぐ後ろの括弧に定義の長い名前を書き添えた所(こども性暴力防止法(…に関する法律))。
327
+ */
328
+ const explainedInPlace = (
329
+ texts: readonly BodyText[],
330
+ term: string,
331
+ defining: DefiningName | undefined,
332
+ prefixes: readonly string[],
333
+ offset: number,
334
+ ): boolean => {
335
+ const sentence = sentenceAt(texts, offset);
336
+ if (defining === undefined || sentence === undefined) return false;
337
+ const at = offset - sentence.start;
338
+ return (namesItself(defining, prefixes) && followsSelfPrefix(sentence, at, prefixes)) || glossedWithName(sentence, at, term, defining.name);
339
+ };
340
+
232
341
  /**
233
342
  * 文の途中で括弧に入れて定義した語((the "Seller")、以下「甲」という)を、その定義の文より前で使っている所。最初の一つだけ。
234
343
  * 定義の文の中の現れ(株式会社GovTech東京(以下「GovTech東京」という。))は、定義する名前そのものなので数えない。札の文も、
235
- * isTitle が言う題・見出しの行も、漢字で終わる語にさらに漢字が続く長い語の一部も、定義の括弧の前の長い名前を写した所も数えない。
344
+ * isTitle が言う題・見出し・目次の行も、漢字で終わる語にさらに漢字が続く長い語の一部も、定義の括弧の前の長い名前を写した所も、
345
+ * 語を含むもっと長い名前の中も数えない。文書自身の名前を定義した語は、selfPrefixes(この、本、this)を付けて前で書いても数えない。
236
346
  * 定義の条("Seller" means、「甲」とは)は条の並びの頭にも終わりにも置く書き方があるので、前で使っても言わない。
237
347
  * 定義の語の無い括弧の引用(("The key point is"))は例の引用と同じ形なので、その語を引用符で挙げただけの現れ
238
348
  * (Its sentences open with "The key point is")は使用ではない。定義の語のある定義((the "Seller")、以下「買主」という)は、
@@ -243,21 +353,28 @@ export const usesBeforeDefinition = (
243
353
  texts: readonly BodyText[],
244
354
  mentioned: Mentioned = NEVER_MENTIONED,
245
355
  isTitle: IsTitle = NEVER_TITLE,
246
- ): TermUse[] =>
247
- groupsOf(terms)
356
+ selfPrefixes: readonly string[] = [],
357
+ ): TermUse[] => {
358
+ const inline = terms.filter((term) => term.inline);
359
+ const names = definingNames(terms, texts);
360
+ const insideLongerName = insideLongerNameIn(texts, terms, names);
361
+ return groupsOf(terms)
248
362
  .filter((group) => group.first.inline && isDistinctive(group.first.term))
249
363
  .flatMap(({ first: defined, spans }) => {
250
- const inline = terms.filter((term) => term.inline);
251
364
  const defining = sentenceAt(texts, defined.span.start)?.start ?? defined.span.start;
252
- const uses = usesOf(defined.term, texts, spans, "exact", defined.bare === true ? mentioned : NEVER_MENTIONED);
365
+ const uses = usesOf(defined.term, texts, spans, "exact", defined.bare === true ? mentioned : NEVER_MENTIONED).filter((offset) => offset < defining);
253
366
  const first = uses.find(
254
367
  (offset) =>
255
368
  !isLabel(sentenceAt(texts, offset), defined.term) &&
369
+ !insideCaption(sentenceAt(texts, offset), offset) &&
256
370
  !isTitle(offset) &&
257
371
  !continuesInHan(texts, defined.term, offset) &&
258
372
  !insideKatakanaName(texts, defined.term, offset) &&
259
373
  !echoesLongName(texts, defined, offset) &&
260
- !insideDefiningName(texts, inline, defined, offset),
374
+ !insideDefiningName(texts, inline, defined, offset) &&
375
+ !insideLongerName(defined.term, offset) &&
376
+ !explainedInPlace(texts, defined.term, names.get(defined), selfPrefixes, offset),
261
377
  );
262
- return first !== undefined && first < defining ? [{ term: defined, offset: first }] : [];
378
+ return first === undefined ? [] : [{ term: defined, offset: first }];
263
379
  });
380
+ };
@@ -0,0 +1,31 @@
1
+ // A defined phrase led by an English gerund and its object ("Exercising your options" means ...) names an act, and the
2
+ // document then writes the act as a verb: exercise your options, exercised their options. Pure.
3
+
4
+ const GERUND = /^(\p{Script=Latin}{2,})ing$/u;
5
+ /** A consonant written twice before -ing (running, setting): the verb has it once. */
6
+ const DOUBLED = /(\p{Script=Latin})\1$/u;
7
+
8
+ /** The verb forms a stem takes (file, files, filed, filing for "Filing"; exercise for "Exercising"). */
9
+ const formsOf = (stem: string): string[] => {
10
+ const single = DOUBLED.test(stem) ? [stem.slice(0, -1)] : [];
11
+ return [...new Set([stem, `${stem}e`, `${stem}es`, `${stem}s`, `${stem}ed`, `${stem}ing`, ...single, ...single.map((verb) => `${verb}s`)])];
12
+ };
13
+
14
+ const capitalised = (word: string): boolean => word.charAt(0) !== word.charAt(0).toLowerCase();
15
+
16
+ /**
17
+ * The same phrase with its leading gerund written as the other forms of its verb ("exercise your options",
18
+ * "exercised your options" for "Exercising your options"). Only when a determiner follows the gerund (a, the, your):
19
+ * then it takes an object and is a verb. "Building materials" and "Pricing information" name things, and "Licensing"
20
+ * alone may be a noun. Empty when the phrase does not take that shape.
21
+ */
22
+ export const verbFormsOf = (term: string, determiners: ReadonlySet<string>): string[] => {
23
+ const [first, second, ...rest] = term.split(" ");
24
+ if (first === undefined || second === undefined || !determiners.has(second.toLowerCase())) return [];
25
+ const stem = GERUND.exec(first.toLowerCase())?.[1];
26
+ if (stem === undefined) return [];
27
+ return formsOf(stem)
28
+ .map((form) => (capitalised(first) ? `${form.charAt(0).toUpperCase()}${form.slice(1)}` : form))
29
+ .map((form) => [form, second, ...rest].join(" "))
30
+ .filter((form) => form !== term);
31
+ };
@@ -1,5 +1,6 @@
1
1
  import type { StructureNode } from "../plugin.ts";
2
2
  import { writtenReading } from "./written-resolve.ts";
3
+ import { partAt } from "./attached-parts.ts";
3
4
  import { namedTargets, pointsToNamedSection } from "./section-names.ts";
4
5
  import { listedTags } from "./listed-tags.ts";
5
6
  import { namesAbsentUnit } from "./unit-word.ts";
@@ -9,7 +10,8 @@ import { referencesInCitedDocuments } from "./cited-document-section.ts";
9
10
  // 木だけで決まる誤り。参照先が無い、番号が飛ぶ・重なる、同じ語を二度定義する。
10
11
  // 意味の食い違いは判定しない。書いてあることから機械で決まるものだけを出す。
11
12
 
12
- export type StructureIssue = { readonly offset: number; readonly values: Readonly<Record<string, string | number>> };
13
+ /** variant は、rule の messages から文を選ぶ鍵。無ければ message。 */
14
+ export type StructureIssue = { readonly offset: number; readonly values: Readonly<Record<string, string | number>>; readonly variant?: string };
13
15
 
14
16
  const NUMBERED: ReadonlySet<string> = new Set(["chapter", "article", "item"]);
15
17
 
@@ -195,13 +197,15 @@ const definitionsInOrder = (tree: StructureNode): Definition[] => {
195
197
  /**
196
198
  * 同じ語の二度目以降の定義。どちらが正しいかは決めず、両方の場所を示す。
197
199
  * 範囲を限った定義(この条において「X」とは)は、同じ条の中でだけ比べる。別の条で定義し直すのは正しい書き方。
200
+ * 添付した文書(partStarts から始まる Exhibit A など)は別の文書なので、その中の定義はその中でだけ比べる。
198
201
  */
199
- export const duplicateDefinitions = (tree: StructureNode): StructureIssue[] => {
202
+ export const duplicateDefinitions = (tree: StructureNode, partStarts: readonly number[] = []): StructureIssue[] => {
200
203
  const first = new Map<string, StructureNode>();
201
204
  return definitionsInOrder(tree).flatMap(({ node, article }) => {
202
205
  const term = textOf(node, "term");
203
206
  const within = node.attrs["within"] === undefined ? article : textOf(node, "within");
204
- const key = node.attrs["scope"] === "local" ? `${within}\u0000${term}` : term;
207
+ const scoped = node.attrs["scope"] === "local" ? `${within}\u0000${term}` : term;
208
+ const key = `${partAt(partStarts, node.span.start)}\u0000${scoped}`;
205
209
  const earlier = first.get(key);
206
210
  if (earlier === undefined) {
207
211
  first.set(key, node);