chaffjs 0.28.0 → 0.29.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 (895) hide show
  1. package/dist/ai-score/of-document.d.ts.map +1 -1
  2. package/dist/ai-score/of-document.js +23 -14
  3. package/dist/ai-score/of-document.js.map +1 -1
  4. package/dist/ai-score/render.d.ts.map +1 -1
  5. package/dist/ai-score/render.js +13 -4
  6. package/dist/ai-score/render.js.map +1 -1
  7. package/dist/ai-score/score.d.ts +16 -1
  8. package/dist/ai-score/score.d.ts.map +1 -1
  9. package/dist/ai-score/score.js +15 -3
  10. package/dist/ai-score/score.js.map +1 -1
  11. package/dist/ai-score/signals.d.ts +2 -4
  12. package/dist/ai-score/signals.d.ts.map +1 -1
  13. package/dist/ai-score/signals.js +11 -2
  14. package/dist/ai-score/signals.js.map +1 -1
  15. package/dist/ai-score/text.d.ts +2 -0
  16. package/dist/ai-score/text.d.ts.map +1 -1
  17. package/dist/ai-score/text.js +4 -2
  18. package/dist/ai-score/text.js.map +1 -1
  19. package/dist/announced-count.d.ts +2 -0
  20. package/dist/announced-count.d.ts.map +1 -1
  21. package/dist/announced-count.js +14 -7
  22. package/dist/announced-count.js.map +1 -1
  23. package/dist/check-source.d.ts +3 -1
  24. package/dist/check-source.d.ts.map +1 -1
  25. package/dist/check-source.js +3 -1
  26. package/dist/check-source.js.map +1 -1
  27. package/dist/cli-text.d.ts.map +1 -1
  28. package/dist/cli-text.js +38 -16
  29. package/dist/cli-text.js.map +1 -1
  30. package/dist/cli.d.ts.map +1 -1
  31. package/dist/cli.js +2 -1
  32. package/dist/cli.js.map +1 -1
  33. package/dist/commands/cite-claims.d.ts +36 -0
  34. package/dist/commands/cite-claims.d.ts.map +1 -0
  35. package/dist/commands/cite-claims.js +81 -0
  36. package/dist/commands/cite-claims.js.map +1 -0
  37. package/dist/commands/cite-page.d.ts +14 -0
  38. package/dist/commands/cite-page.d.ts.map +1 -0
  39. package/dist/commands/cite-page.js +47 -0
  40. package/dist/commands/cite-page.js.map +1 -0
  41. package/dist/commands/cite-scaffold.d.ts +16 -0
  42. package/dist/commands/cite-scaffold.d.ts.map +1 -0
  43. package/dist/commands/cite-scaffold.js +21 -0
  44. package/dist/commands/cite-scaffold.js.map +1 -0
  45. package/dist/commands/cite.d.ts +3 -12
  46. package/dist/commands/cite.d.ts.map +1 -1
  47. package/dist/commands/cite.js +110 -51
  48. package/dist/commands/cite.js.map +1 -1
  49. package/dist/company-names.d.ts +34 -0
  50. package/dist/company-names.d.ts.map +1 -0
  51. package/dist/company-names.js +158 -0
  52. package/dist/company-names.js.map +1 -0
  53. package/dist/default-values.d.ts +17 -0
  54. package/dist/default-values.d.ts.map +1 -0
  55. package/dist/default-values.js +134 -0
  56. package/dist/default-values.js.map +1 -0
  57. package/dist/deprecated-use.d.ts +17 -0
  58. package/dist/deprecated-use.d.ts.map +1 -0
  59. package/dist/deprecated-use.js +95 -0
  60. package/dist/deprecated-use.js.map +1 -0
  61. package/dist/derived/stays.d.ts +43 -0
  62. package/dist/derived/stays.d.ts.map +1 -0
  63. package/dist/derived/stays.js +105 -0
  64. package/dist/derived/stays.js.map +1 -0
  65. package/dist/detectors/acronym-context.d.ts +2 -2
  66. package/dist/detectors/acronym-context.d.ts.map +1 -1
  67. package/dist/detectors/acronym-context.js +6 -0
  68. package/dist/detectors/acronym-context.js.map +1 -1
  69. package/dist/detectors/address-word.d.ts +3 -0
  70. package/dist/detectors/address-word.d.ts.map +1 -0
  71. package/dist/detectors/address-word.js +7 -0
  72. package/dist/detectors/address-word.js.map +1 -0
  73. package/dist/detectors/agreement-slip.d.ts.map +1 -1
  74. package/dist/detectors/agreement-slip.js +4 -1
  75. package/dist/detectors/agreement-slip.js.map +1 -1
  76. package/dist/detectors/ai-phrasing.d.ts +0 -4
  77. package/dist/detectors/ai-phrasing.d.ts.map +1 -1
  78. package/dist/detectors/ai-phrasing.js +5 -1
  79. package/dist/detectors/ai-phrasing.js.map +1 -1
  80. package/dist/detectors/amount-range.d.ts +3 -0
  81. package/dist/detectors/amount-range.d.ts.map +1 -0
  82. package/dist/detectors/amount-range.js +38 -0
  83. package/dist/detectors/amount-range.js.map +1 -0
  84. package/dist/detectors/amount-scale.d.ts +6 -1
  85. package/dist/detectors/amount-scale.d.ts.map +1 -1
  86. package/dist/detectors/amount-scale.js +33 -9
  87. package/dist/detectors/amount-scale.js.map +1 -1
  88. package/dist/detectors/announced-count.d.ts +1 -1
  89. package/dist/detectors/announced-count.d.ts.map +1 -1
  90. package/dist/detectors/announced-count.js +18 -3
  91. package/dist/detectors/announced-count.js.map +1 -1
  92. package/dist/detectors/bare-comparative.d.ts.map +1 -1
  93. package/dist/detectors/bare-comparative.js +4 -1
  94. package/dist/detectors/bare-comparative.js.map +1 -1
  95. package/dist/detectors/block-quotation.d.ts +13 -0
  96. package/dist/detectors/block-quotation.d.ts.map +1 -0
  97. package/dist/detectors/block-quotation.js +86 -0
  98. package/dist/detectors/block-quotation.js.map +1 -0
  99. package/dist/detectors/bracket-label.d.ts +10 -0
  100. package/dist/detectors/bracket-label.d.ts.map +1 -0
  101. package/dist/detectors/bracket-label.js +51 -0
  102. package/dist/detectors/bracket-label.js.map +1 -0
  103. package/dist/detectors/citation-entry.d.ts +5 -0
  104. package/dist/detectors/citation-entry.d.ts.map +1 -1
  105. package/dist/detectors/citation-entry.js +19 -5
  106. package/dist/detectors/citation-entry.js.map +1 -1
  107. package/dist/detectors/code-before.d.ts +6 -0
  108. package/dist/detectors/code-before.d.ts.map +1 -0
  109. package/dist/detectors/code-before.js +15 -0
  110. package/dist/detectors/code-before.js.map +1 -0
  111. package/dist/detectors/connective-hierarchy.d.ts +11 -1
  112. package/dist/detectors/connective-hierarchy.d.ts.map +1 -1
  113. package/dist/detectors/connective-hierarchy.js +26 -6
  114. package/dist/detectors/connective-hierarchy.js.map +1 -1
  115. package/dist/detectors/currency-notation.d.ts.map +1 -1
  116. package/dist/detectors/currency-notation.js +2 -1
  117. package/dist/detectors/currency-notation.js.map +1 -1
  118. package/dist/detectors/date-outside-period.d.ts +4 -0
  119. package/dist/detectors/date-outside-period.d.ts.map +1 -0
  120. package/dist/detectors/date-outside-period.js +34 -0
  121. package/dist/detectors/date-outside-period.js.map +1 -0
  122. package/dist/detectors/default-values.d.ts +3 -0
  123. package/dist/detectors/default-values.d.ts.map +1 -0
  124. package/dist/detectors/default-values.js +14 -0
  125. package/dist/detectors/default-values.js.map +1 -0
  126. package/dist/detectors/defined-term-form.d.ts +6 -2
  127. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  128. package/dist/detectors/defined-term-form.js +72 -12
  129. package/dist/detectors/defined-term-form.js.map +1 -1
  130. package/dist/detectors/definition-use.d.ts.map +1 -1
  131. package/dist/detectors/definition-use.js +8 -1
  132. package/dist/detectors/definition-use.js.map +1 -1
  133. package/dist/detectors/deprecated-use.d.ts +3 -0
  134. package/dist/detectors/deprecated-use.d.ts.map +1 -0
  135. package/dist/detectors/deprecated-use.js +14 -0
  136. package/dist/detectors/deprecated-use.js.map +1 -0
  137. package/dist/detectors/derived-numbers.d.ts +1 -1
  138. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  139. package/dist/detectors/derived-numbers.js +70 -15
  140. package/dist/detectors/derived-numbers.js.map +1 -1
  141. package/dist/detectors/document-shape.d.ts +1 -0
  142. package/dist/detectors/document-shape.d.ts.map +1 -1
  143. package/dist/detectors/document-shape.js +4 -1
  144. package/dist/detectors/document-shape.js.map +1 -1
  145. package/dist/detectors/due-date.d.ts +3 -0
  146. package/dist/detectors/due-date.d.ts.map +1 -0
  147. package/dist/detectors/due-date.js +38 -0
  148. package/dist/detectors/due-date.js.map +1 -0
  149. package/dist/detectors/en-shape.d.ts.map +1 -1
  150. package/dist/detectors/en-shape.js +17 -9
  151. package/dist/detectors/en-shape.js.map +1 -1
  152. package/dist/detectors/fact-consistency.d.ts.map +1 -1
  153. package/dist/detectors/fact-consistency.js +76 -2
  154. package/dist/detectors/fact-consistency.js.map +1 -1
  155. package/dist/detectors/heading-echo.d.ts.map +1 -1
  156. package/dist/detectors/heading-echo.js +10 -1
  157. package/dist/detectors/heading-echo.js.map +1 -1
  158. package/dist/detectors/kana-function-word.d.ts +12 -0
  159. package/dist/detectors/kana-function-word.d.ts.map +1 -0
  160. package/dist/detectors/kana-function-word.js +59 -0
  161. package/dist/detectors/kana-function-word.js.map +1 -0
  162. package/dist/detectors/line-amount.d.ts +3 -0
  163. package/dist/detectors/line-amount.d.ts.map +1 -0
  164. package/dist/detectors/line-amount.js +22 -0
  165. package/dist/detectors/line-amount.js.map +1 -0
  166. package/dist/detectors/location-pointer.d.ts +6 -0
  167. package/dist/detectors/location-pointer.d.ts.map +1 -0
  168. package/dist/detectors/location-pointer.js +22 -0
  169. package/dist/detectors/location-pointer.js.map +1 -0
  170. package/dist/detectors/mark-shape.d.ts.map +1 -1
  171. package/dist/detectors/mark-shape.js +13 -1
  172. package/dist/detectors/mark-shape.js.map +1 -1
  173. package/dist/detectors/nado-closed-list.d.ts +3 -0
  174. package/dist/detectors/nado-closed-list.d.ts.map +1 -0
  175. package/dist/detectors/nado-closed-list.js +21 -0
  176. package/dist/detectors/nado-closed-list.js.map +1 -0
  177. package/dist/detectors/name-variant.d.ts.map +1 -1
  178. package/dist/detectors/name-variant.js +82 -8
  179. package/dist/detectors/name-variant.js.map +1 -1
  180. package/dist/detectors/next-word.d.ts.map +1 -1
  181. package/dist/detectors/next-word.js +41 -8
  182. package/dist/detectors/next-word.js.map +1 -1
  183. package/dist/detectors/number-word-figure.d.ts +5 -0
  184. package/dist/detectors/number-word-figure.d.ts.map +1 -0
  185. package/dist/detectors/number-word-figure.js +32 -0
  186. package/dist/detectors/number-word-figure.js.map +1 -0
  187. package/dist/detectors/obligation-without-deadline.d.ts +39 -0
  188. package/dist/detectors/obligation-without-deadline.d.ts.map +1 -0
  189. package/dist/detectors/obligation-without-deadline.js +148 -0
  190. package/dist/detectors/obligation-without-deadline.js.map +1 -0
  191. package/dist/detectors/open-end-names.d.ts +23 -0
  192. package/dist/detectors/open-end-names.d.ts.map +1 -0
  193. package/dist/detectors/open-end-names.js +95 -0
  194. package/dist/detectors/open-end-names.js.map +1 -0
  195. package/dist/detectors/ordinal-run-gaps.d.ts +8 -0
  196. package/dist/detectors/ordinal-run-gaps.d.ts.map +1 -0
  197. package/dist/detectors/ordinal-run-gaps.js +80 -0
  198. package/dist/detectors/ordinal-run-gaps.js.map +1 -0
  199. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  200. package/dist/detectors/orthographic-variant.js +26 -9
  201. package/dist/detectors/orthographic-variant.js.map +1 -1
  202. package/dist/detectors/orthography.d.ts.map +1 -1
  203. package/dist/detectors/orthography.js +5 -0
  204. package/dist/detectors/orthography.js.map +1 -1
  205. package/dist/detectors/parameter-table.d.ts +3 -0
  206. package/dist/detectors/parameter-table.d.ts.map +1 -0
  207. package/dist/detectors/parameter-table.js +16 -0
  208. package/dist/detectors/parameter-table.js.map +1 -0
  209. package/dist/detectors/phone-number-variant.d.ts +3 -0
  210. package/dist/detectors/phone-number-variant.d.ts.map +1 -0
  211. package/dist/detectors/phone-number-variant.js +18 -0
  212. package/dist/detectors/phone-number-variant.js.map +1 -0
  213. package/dist/detectors/prerequisite-order.d.ts +3 -0
  214. package/dist/detectors/prerequisite-order.d.ts.map +1 -0
  215. package/dist/detectors/prerequisite-order.js +30 -0
  216. package/dist/detectors/prerequisite-order.js.map +1 -0
  217. package/dist/detectors/quote-unnamed-speaker.d.ts +3 -0
  218. package/dist/detectors/quote-unnamed-speaker.d.ts.map +1 -0
  219. package/dist/detectors/quote-unnamed-speaker.js +18 -0
  220. package/dist/detectors/quote-unnamed-speaker.js.map +1 -0
  221. package/dist/detectors/quote-without-source.d.ts +12 -2
  222. package/dist/detectors/quote-without-source.d.ts.map +1 -1
  223. package/dist/detectors/quote-without-source.js +45 -11
  224. package/dist/detectors/quote-without-source.js.map +1 -1
  225. package/dist/detectors/registry/amount-range.d.ts +3 -0
  226. package/dist/detectors/registry/amount-range.d.ts.map +1 -0
  227. package/dist/detectors/registry/amount-range.js +3 -0
  228. package/dist/detectors/registry/amount-range.js.map +1 -0
  229. package/dist/detectors/registry/arrival-before-departure.d.ts +3 -0
  230. package/dist/detectors/registry/arrival-before-departure.d.ts.map +1 -0
  231. package/dist/detectors/registry/arrival-before-departure.js +3 -0
  232. package/dist/detectors/registry/arrival-before-departure.js.map +1 -0
  233. package/dist/detectors/registry/date-outside-period.d.ts +3 -0
  234. package/dist/detectors/registry/date-outside-period.d.ts.map +1 -0
  235. package/dist/detectors/registry/date-outside-period.js +3 -0
  236. package/dist/detectors/registry/date-outside-period.js.map +1 -0
  237. package/dist/detectors/registry/default-values.d.ts +3 -0
  238. package/dist/detectors/registry/default-values.d.ts.map +1 -0
  239. package/dist/detectors/registry/default-values.js +3 -0
  240. package/dist/detectors/registry/default-values.js.map +1 -0
  241. package/dist/detectors/registry/deprecated-use.d.ts +3 -0
  242. package/dist/detectors/registry/deprecated-use.d.ts.map +1 -0
  243. package/dist/detectors/registry/deprecated-use.js +3 -0
  244. package/dist/detectors/registry/deprecated-use.js.map +1 -0
  245. package/dist/detectors/registry/due-date.d.ts +3 -0
  246. package/dist/detectors/registry/due-date.d.ts.map +1 -0
  247. package/dist/detectors/registry/due-date.js +3 -0
  248. package/dist/detectors/registry/due-date.js.map +1 -0
  249. package/dist/detectors/registry/kana-function-word.d.ts +3 -0
  250. package/dist/detectors/registry/kana-function-word.d.ts.map +1 -0
  251. package/dist/detectors/registry/kana-function-word.js +3 -0
  252. package/dist/detectors/registry/kana-function-word.js.map +1 -0
  253. package/dist/detectors/registry/line-amount.d.ts +3 -0
  254. package/dist/detectors/registry/line-amount.d.ts.map +1 -0
  255. package/dist/detectors/registry/line-amount.js +3 -0
  256. package/dist/detectors/registry/line-amount.js.map +1 -0
  257. package/dist/detectors/registry/nado-closed-list.d.ts +3 -0
  258. package/dist/detectors/registry/nado-closed-list.d.ts.map +1 -0
  259. package/dist/detectors/registry/nado-closed-list.js +3 -0
  260. package/dist/detectors/registry/nado-closed-list.js.map +1 -0
  261. package/dist/detectors/registry/number-word-figure.d.ts +3 -0
  262. package/dist/detectors/registry/number-word-figure.d.ts.map +1 -0
  263. package/dist/detectors/registry/number-word-figure.js +3 -0
  264. package/dist/detectors/registry/number-word-figure.js.map +1 -0
  265. package/dist/detectors/registry/obligation-without-deadline.d.ts +3 -0
  266. package/dist/detectors/registry/obligation-without-deadline.d.ts.map +1 -0
  267. package/dist/detectors/registry/obligation-without-deadline.js +3 -0
  268. package/dist/detectors/registry/obligation-without-deadline.js.map +1 -0
  269. package/dist/detectors/registry/parameter-table.d.ts +3 -0
  270. package/dist/detectors/registry/parameter-table.d.ts.map +1 -0
  271. package/dist/detectors/registry/parameter-table.js +3 -0
  272. package/dist/detectors/registry/parameter-table.js.map +1 -0
  273. package/dist/detectors/registry/phone-number-variant.d.ts +3 -0
  274. package/dist/detectors/registry/phone-number-variant.d.ts.map +1 -0
  275. package/dist/detectors/registry/phone-number-variant.js +3 -0
  276. package/dist/detectors/registry/phone-number-variant.js.map +1 -0
  277. package/dist/detectors/registry/prerequisite-order.d.ts +3 -0
  278. package/dist/detectors/registry/prerequisite-order.d.ts.map +1 -0
  279. package/dist/detectors/registry/prerequisite-order.js +3 -0
  280. package/dist/detectors/registry/prerequisite-order.js.map +1 -0
  281. package/dist/detectors/registry/quote-unnamed-speaker.d.ts +3 -0
  282. package/dist/detectors/registry/quote-unnamed-speaker.d.ts.map +1 -0
  283. package/dist/detectors/registry/quote-unnamed-speaker.js +3 -0
  284. package/dist/detectors/registry/quote-unnamed-speaker.js.map +1 -0
  285. package/dist/detectors/registry/tax-amount.d.ts +3 -0
  286. package/dist/detectors/registry/tax-amount.d.ts.map +1 -0
  287. package/dist/detectors/registry/tax-amount.js +3 -0
  288. package/dist/detectors/registry/tax-amount.js.map +1 -0
  289. package/dist/detectors/registry/time-order.d.ts +3 -0
  290. package/dist/detectors/registry/time-order.d.ts.map +1 -0
  291. package/dist/detectors/registry/time-order.js +3 -0
  292. package/dist/detectors/registry/time-order.js.map +1 -0
  293. package/dist/detectors/registry/ui-label.d.ts +3 -0
  294. package/dist/detectors/registry/ui-label.d.ts.map +1 -0
  295. package/dist/detectors/registry/ui-label.js +3 -0
  296. package/dist/detectors/registry/ui-label.js.map +1 -0
  297. package/dist/detectors/registry/undefined-call.d.ts +3 -0
  298. package/dist/detectors/registry/undefined-call.d.ts.map +1 -0
  299. package/dist/detectors/registry/undefined-call.js +3 -0
  300. package/dist/detectors/registry/undefined-call.js.map +1 -0
  301. package/dist/detectors/registry/undefined-term.d.ts +3 -0
  302. package/dist/detectors/registry/undefined-term.d.ts.map +1 -0
  303. package/dist/detectors/registry/undefined-term.js +3 -0
  304. package/dist/detectors/registry/undefined-term.js.map +1 -0
  305. package/dist/detectors/registry/version-order.d.ts +3 -0
  306. package/dist/detectors/registry/version-order.d.ts.map +1 -0
  307. package/dist/detectors/registry/version-order.js +3 -0
  308. package/dist/detectors/registry/version-order.js.map +1 -0
  309. package/dist/detectors/registry/warning-action.d.ts +3 -0
  310. package/dist/detectors/registry/warning-action.d.ts.map +1 -0
  311. package/dist/detectors/registry/warning-action.js +3 -0
  312. package/dist/detectors/registry/warning-action.js.map +1 -0
  313. package/dist/detectors/requirement-smell.d.ts.map +1 -1
  314. package/dist/detectors/requirement-smell.js +25 -8
  315. package/dist/detectors/requirement-smell.js.map +1 -1
  316. package/dist/detectors/structure-tree.d.ts +12 -4
  317. package/dist/detectors/structure-tree.d.ts.map +1 -1
  318. package/dist/detectors/structure-tree.js +31 -14
  319. package/dist/detectors/structure-tree.js.map +1 -1
  320. package/dist/detectors/superlative-scope.d.ts.map +1 -1
  321. package/dist/detectors/superlative-scope.js +11 -1
  322. package/dist/detectors/superlative-scope.js.map +1 -1
  323. package/dist/detectors/tax-amount.d.ts +3 -0
  324. package/dist/detectors/tax-amount.d.ts.map +1 -0
  325. package/dist/detectors/tax-amount.js +19 -0
  326. package/dist/detectors/tax-amount.js.map +1 -0
  327. package/dist/detectors/technical-docs.d.ts.map +1 -1
  328. package/dist/detectors/technical-docs.js +5 -1
  329. package/dist/detectors/technical-docs.js.map +1 -1
  330. package/dist/detectors/term-extension.d.ts +14 -0
  331. package/dist/detectors/term-extension.d.ts.map +1 -0
  332. package/dist/detectors/term-extension.js +67 -0
  333. package/dist/detectors/term-extension.js.map +1 -0
  334. package/dist/detectors/time-order.d.ts +4 -0
  335. package/dist/detectors/time-order.d.ts.map +1 -0
  336. package/dist/detectors/time-order.js +32 -0
  337. package/dist/detectors/time-order.js.map +1 -0
  338. package/dist/detectors/ui-label.d.ts +3 -0
  339. package/dist/detectors/ui-label.d.ts.map +1 -0
  340. package/dist/detectors/ui-label.js +16 -0
  341. package/dist/detectors/ui-label.js.map +1 -0
  342. package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
  343. package/dist/detectors/unbalanced-bracket.js +8 -13
  344. package/dist/detectors/unbalanced-bracket.js.map +1 -1
  345. package/dist/detectors/undefined-call.d.ts +3 -0
  346. package/dist/detectors/undefined-call.d.ts.map +1 -0
  347. package/dist/detectors/undefined-call.js +18 -0
  348. package/dist/detectors/undefined-call.js.map +1 -0
  349. package/dist/detectors/undefined-term.d.ts +22 -0
  350. package/dist/detectors/undefined-term.d.ts.map +1 -0
  351. package/dist/detectors/undefined-term.js +85 -0
  352. package/dist/detectors/undefined-term.js.map +1 -0
  353. package/dist/detectors/unknown-word.d.ts +1 -1
  354. package/dist/detectors/unknown-word.js +3 -3
  355. package/dist/detectors/unknown-word.js.map +1 -1
  356. package/dist/detectors/vague-deadline.d.ts +4 -0
  357. package/dist/detectors/vague-deadline.d.ts.map +1 -1
  358. package/dist/detectors/vague-deadline.js +3 -3
  359. package/dist/detectors/vague-deadline.js.map +1 -1
  360. package/dist/detectors/version-mismatch.d.ts.map +1 -1
  361. package/dist/detectors/version-mismatch.js +18 -1
  362. package/dist/detectors/version-mismatch.js.map +1 -1
  363. package/dist/detectors/version-order.d.ts +3 -0
  364. package/dist/detectors/version-order.d.ts.map +1 -0
  365. package/dist/detectors/version-order.js +43 -0
  366. package/dist/detectors/version-order.js.map +1 -0
  367. package/dist/detectors/warning-action.d.ts +3 -0
  368. package/dist/detectors/warning-action.d.ts.map +1 -0
  369. package/dist/detectors/warning-action.js +48 -0
  370. package/dist/detectors/warning-action.js.map +1 -0
  371. package/dist/facts/condition-pairs.d.ts +51 -0
  372. package/dist/facts/condition-pairs.d.ts.map +1 -0
  373. package/dist/facts/condition-pairs.js +203 -0
  374. package/dist/facts/condition-pairs.js.map +1 -0
  375. package/dist/facts/event-dates.d.ts +26 -0
  376. package/dist/facts/event-dates.d.ts.map +1 -0
  377. package/dist/facts/event-dates.js +38 -0
  378. package/dist/facts/event-dates.js.map +1 -0
  379. package/dist/facts/fact-scope.d.ts +2 -0
  380. package/dist/facts/fact-scope.d.ts.map +1 -1
  381. package/dist/facts/fact-scope.js +5 -0
  382. package/dist/facts/fact-scope.js.map +1 -1
  383. package/dist/facts/labelled-facts.d.ts +2 -0
  384. package/dist/facts/labelled-facts.d.ts.map +1 -1
  385. package/dist/facts/labelled-facts.js +9 -1
  386. package/dist/facts/labelled-facts.js.map +1 -1
  387. package/dist/facts/table-facts.d.ts +16 -0
  388. package/dist/facts/table-facts.d.ts.map +1 -1
  389. package/dist/facts/table-facts.js +2 -2
  390. package/dist/facts/table-facts.js.map +1 -1
  391. package/dist/grade/ai-score.d.ts +1 -1
  392. package/dist/grade/ai-score.d.ts.map +1 -1
  393. package/dist/grade/text.js +2 -2
  394. package/dist/grade/text.js.map +1 -1
  395. package/dist/heading-numbering.js +2 -2
  396. package/dist/heading-numbering.js.map +1 -1
  397. package/dist/html/fetch-page.d.ts +20 -0
  398. package/dist/html/fetch-page.d.ts.map +1 -0
  399. package/dist/html/fetch-page.js +51 -0
  400. package/dist/html/fetch-page.js.map +1 -0
  401. package/dist/html/fetched-text.d.ts +5 -0
  402. package/dist/html/fetched-text.d.ts.map +1 -0
  403. package/dist/html/fetched-text.js +25 -0
  404. package/dist/html/fetched-text.js.map +1 -0
  405. package/dist/html/html-content-block.d.ts +6 -0
  406. package/dist/html/html-content-block.d.ts.map +1 -0
  407. package/dist/html/html-content-block.js +86 -0
  408. package/dist/html/html-content-block.js.map +1 -0
  409. package/dist/html/html-elements.d.ts +41 -0
  410. package/dist/html/html-elements.d.ts.map +1 -0
  411. package/dist/html/html-elements.js +91 -0
  412. package/dist/html/html-elements.js.map +1 -0
  413. package/dist/html/html-footnote-marks.d.ts +2 -0
  414. package/dist/html/html-footnote-marks.d.ts.map +1 -0
  415. package/dist/html/html-footnote-marks.js +15 -0
  416. package/dist/html/html-footnote-marks.js.map +1 -0
  417. package/dist/html/html-heading-links.d.ts +6 -0
  418. package/dist/html/html-heading-links.d.ts.map +1 -0
  419. package/dist/html/html-heading-links.js +71 -0
  420. package/dist/html/html-heading-links.js.map +1 -0
  421. package/dist/html/html-lost-tags.d.ts +3 -0
  422. package/dist/html/html-lost-tags.d.ts.map +1 -0
  423. package/dist/html/html-lost-tags.js +11 -0
  424. package/dist/html/html-lost-tags.js.map +1 -0
  425. package/dist/html/html-markdown.d.ts +2 -0
  426. package/dist/html/html-markdown.d.ts.map +1 -0
  427. package/dist/html/html-markdown.js +347 -0
  428. package/dist/html/html-markdown.js.map +1 -0
  429. package/dist/html/html-preformatted.d.ts +17 -0
  430. package/dist/html/html-preformatted.d.ts.map +1 -0
  431. package/dist/html/html-preformatted.js +82 -0
  432. package/dist/html/html-preformatted.js.map +1 -0
  433. package/dist/html/html-reader-only.d.ts +6 -0
  434. package/dist/html/html-reader-only.d.ts.map +1 -0
  435. package/dist/html/html-reader-only.js +63 -0
  436. package/dist/html/html-reader-only.js.map +1 -0
  437. package/dist/html/html-run-in-headings.d.ts +2 -0
  438. package/dist/html/html-run-in-headings.d.ts.map +1 -0
  439. package/dist/html/html-run-in-headings.js +36 -0
  440. package/dist/html/html-run-in-headings.js.map +1 -0
  441. package/dist/html/html-tables.d.ts +3 -0
  442. package/dist/html/html-tables.d.ts.map +1 -0
  443. package/dist/html/html-tables.js +58 -0
  444. package/dist/html/html-tables.js.map +1 -0
  445. package/dist/html/html-widgets.d.ts +3 -0
  446. package/dist/html/html-widgets.d.ts.map +1 -0
  447. package/dist/html/html-widgets.js +71 -0
  448. package/dist/html/html-widgets.js.map +1 -0
  449. package/dist/html/markup-text.d.ts +5 -0
  450. package/dist/html/markup-text.d.ts.map +1 -0
  451. package/dist/html/markup-text.js +32 -0
  452. package/dist/html/markup-text.js.map +1 -0
  453. package/dist/html/page-document.d.ts +9 -0
  454. package/dist/html/page-document.d.ts.map +1 -0
  455. package/dist/html/page-document.js +19 -0
  456. package/dist/html/page-document.js.map +1 -0
  457. package/dist/inline-count.d.ts +19 -0
  458. package/dist/inline-count.d.ts.map +1 -0
  459. package/dist/inline-count.js +109 -0
  460. package/dist/inline-count.js.map +1 -0
  461. package/dist/kana-spelling.d.ts +5 -0
  462. package/dist/kana-spelling.d.ts.map +1 -1
  463. package/dist/kana-spelling.js +5 -0
  464. package/dist/kana-spelling.js.map +1 -1
  465. package/dist/location-part.d.ts +13 -0
  466. package/dist/location-part.d.ts.map +1 -0
  467. package/dist/location-part.js +24 -0
  468. package/dist/location-part.js.map +1 -0
  469. package/dist/nado-closed-list.d.ts +20 -0
  470. package/dist/nado-closed-list.d.ts.map +1 -0
  471. package/dist/nado-closed-list.js +72 -0
  472. package/dist/nado-closed-list.js.map +1 -0
  473. package/dist/name-cue.d.ts +17 -0
  474. package/dist/name-cue.d.ts.map +1 -0
  475. package/dist/name-cue.js +29 -0
  476. package/dist/name-cue.js.map +1 -0
  477. package/dist/name-variants.d.ts +23 -1
  478. package/dist/name-variants.d.ts.map +1 -1
  479. package/dist/name-variants.js +39 -8
  480. package/dist/name-variants.js.map +1 -1
  481. package/dist/paragraph-runs.d.ts +6 -1
  482. package/dist/paragraph-runs.d.ts.map +1 -1
  483. package/dist/paragraph-runs.js +9 -2
  484. package/dist/paragraph-runs.js.map +1 -1
  485. package/dist/parameter-table.d.ts +19 -0
  486. package/dist/parameter-table.d.ts.map +1 -0
  487. package/dist/parameter-table.js +191 -0
  488. package/dist/parameter-table.js.map +1 -0
  489. package/dist/phone-numbers.d.ts +23 -0
  490. package/dist/phone-numbers.d.ts.map +1 -0
  491. package/dist/phone-numbers.js +83 -0
  492. package/dist/phone-numbers.js.map +1 -0
  493. package/dist/place-names.d.ts +55 -0
  494. package/dist/place-names.d.ts.map +1 -0
  495. package/dist/place-names.js +196 -0
  496. package/dist/place-names.js.map +1 -0
  497. package/dist/plugin.d.ts +4 -0
  498. package/dist/plugin.d.ts.map +1 -1
  499. package/dist/prerequisite-order.d.ts +16 -0
  500. package/dist/prerequisite-order.d.ts.map +1 -0
  501. package/dist/prerequisite-order.js +29 -0
  502. package/dist/prerequisite-order.js.map +1 -0
  503. package/dist/profile/parse.d.ts.map +1 -1
  504. package/dist/profile/parse.js +10 -1
  505. package/dist/profile/parse.js.map +1 -1
  506. package/dist/reasons.d.ts +2 -0
  507. package/dist/reasons.d.ts.map +1 -1
  508. package/dist/reasons.js +2 -0
  509. package/dist/reasons.js.map +1 -1
  510. package/dist/render/rules-json.d.ts.map +1 -1
  511. package/dist/render/rules-json.js +4 -0
  512. package/dist/render/rules-json.js.map +1 -1
  513. package/dist/render/rules-table.d.ts.map +1 -1
  514. package/dist/render/rules-table.js +6 -2
  515. package/dist/render/rules-table.js.map +1 -1
  516. package/dist/rule-genres.d.ts +5 -2
  517. package/dist/rule-genres.d.ts.map +1 -1
  518. package/dist/rule-genres.js +2 -0
  519. package/dist/rule-genres.js.map +1 -1
  520. package/dist/rule-load.d.ts.map +1 -1
  521. package/dist/rule-load.js +2 -1
  522. package/dist/rule-load.js.map +1 -1
  523. package/dist/run.d.ts.map +1 -1
  524. package/dist/run.js +5 -1
  525. package/dist/run.js.map +1 -1
  526. package/dist/spelling.d.ts +2 -0
  527. package/dist/spelling.d.ts.map +1 -1
  528. package/dist/spelling.js +6 -0
  529. package/dist/spelling.js.map +1 -1
  530. package/dist/structure/action-due.d.ts +21 -0
  531. package/dist/structure/action-due.d.ts.map +1 -0
  532. package/dist/structure/action-due.js +126 -0
  533. package/dist/structure/action-due.js.map +1 -0
  534. package/dist/structure/amount-range.d.ts +30 -0
  535. package/dist/structure/amount-range.d.ts.map +1 -0
  536. package/dist/structure/amount-range.js +153 -0
  537. package/dist/structure/amount-range.js.map +1 -0
  538. package/dist/structure/amount-scale.d.ts +6 -0
  539. package/dist/structure/amount-scale.d.ts.map +1 -1
  540. package/dist/structure/amount-scale.js +13 -0
  541. package/dist/structure/amount-scale.js.map +1 -1
  542. package/dist/structure/cite.d.ts +5 -2
  543. package/dist/structure/cite.d.ts.map +1 -1
  544. package/dist/structure/cite.js +20 -1
  545. package/dist/structure/cite.js.map +1 -1
  546. package/dist/structure/counted-amounts.d.ts +12 -0
  547. package/dist/structure/counted-amounts.d.ts.map +1 -0
  548. package/dist/structure/counted-amounts.js +30 -0
  549. package/dist/structure/counted-amounts.js.map +1 -0
  550. package/dist/structure/date-order.d.ts +24 -3
  551. package/dist/structure/date-order.d.ts.map +1 -1
  552. package/dist/structure/date-order.js +49 -17
  553. package/dist/structure/date-order.js.map +1 -1
  554. package/dist/structure/date-outside-period.d.ts +27 -0
  555. package/dist/structure/date-outside-period.d.ts.map +1 -0
  556. package/dist/structure/date-outside-period.js +86 -0
  557. package/dist/structure/date-outside-period.js.map +1 -0
  558. package/dist/structure/definition-use.d.ts +5 -2
  559. package/dist/structure/definition-use.d.ts.map +1 -1
  560. package/dist/structure/definition-use.js +11 -3
  561. package/dist/structure/definition-use.js.map +1 -1
  562. package/dist/structure/due-date.d.ts +19 -0
  563. package/dist/structure/due-date.d.ts.map +1 -0
  564. package/dist/structure/due-date.js +30 -0
  565. package/dist/structure/due-date.js.map +1 -0
  566. package/dist/structure/heading-runs.d.ts +9 -0
  567. package/dist/structure/heading-runs.d.ts.map +1 -0
  568. package/dist/structure/heading-runs.js +23 -0
  569. package/dist/structure/heading-runs.js.map +1 -0
  570. package/dist/structure/install-pin.d.ts +46 -0
  571. package/dist/structure/install-pin.d.ts.map +1 -0
  572. package/dist/structure/install-pin.js +85 -0
  573. package/dist/structure/install-pin.js.map +1 -0
  574. package/dist/structure/leg-times.d.ts +34 -0
  575. package/dist/structure/leg-times.d.ts.map +1 -0
  576. package/dist/structure/leg-times.js +135 -0
  577. package/dist/structure/leg-times.js.map +1 -0
  578. package/dist/structure/line-amount-unit.d.ts +24 -0
  579. package/dist/structure/line-amount-unit.d.ts.map +1 -0
  580. package/dist/structure/line-amount-unit.js +24 -0
  581. package/dist/structure/line-amount-unit.js.map +1 -0
  582. package/dist/structure/line-amount.d.ts +40 -0
  583. package/dist/structure/line-amount.d.ts.map +1 -0
  584. package/dist/structure/line-amount.js +118 -0
  585. package/dist/structure/line-amount.js.map +1 -0
  586. package/dist/structure/number-word-figure.d.ts +37 -0
  587. package/dist/structure/number-word-figure.d.ts.map +1 -0
  588. package/dist/structure/number-word-figure.js +151 -0
  589. package/dist/structure/number-word-figure.js.map +1 -0
  590. package/dist/structure/numbering.d.ts +1 -0
  591. package/dist/structure/numbering.d.ts.map +1 -1
  592. package/dist/structure/numbering.js +3 -0
  593. package/dist/structure/numbering.js.map +1 -1
  594. package/dist/structure/ordinal-runs.d.ts +45 -0
  595. package/dist/structure/ordinal-runs.d.ts.map +1 -0
  596. package/dist/structure/ordinal-runs.js +78 -0
  597. package/dist/structure/ordinal-runs.js.map +1 -0
  598. package/dist/structure/percent-sum-prose.d.ts +1 -1
  599. package/dist/structure/percent-sum-prose.d.ts.map +1 -1
  600. package/dist/structure/percent-sum-prose.js +45 -3
  601. package/dist/structure/percent-sum-prose.js.map +1 -1
  602. package/dist/structure/percent-sum.d.ts +8 -0
  603. package/dist/structure/percent-sum.d.ts.map +1 -1
  604. package/dist/structure/percent-sum.js +8 -1
  605. package/dist/structure/percent-sum.js.map +1 -1
  606. package/dist/structure/release-list.d.ts +9 -0
  607. package/dist/structure/release-list.d.ts.map +1 -0
  608. package/dist/structure/release-list.js +46 -0
  609. package/dist/structure/release-list.js.map +1 -0
  610. package/dist/structure/share-column.d.ts +7 -0
  611. package/dist/structure/share-column.d.ts.map +1 -0
  612. package/dist/structure/share-column.js +22 -0
  613. package/dist/structure/share-column.js.map +1 -0
  614. package/dist/structure/stated-period.d.ts +31 -0
  615. package/dist/structure/stated-period.d.ts.map +1 -0
  616. package/dist/structure/stated-period.js +127 -0
  617. package/dist/structure/stated-period.js.map +1 -0
  618. package/dist/structure/tax.d.ts +25 -0
  619. package/dist/structure/tax.d.ts.map +1 -0
  620. package/dist/structure/tax.js +86 -0
  621. package/dist/structure/tax.js.map +1 -0
  622. package/dist/structure/time-marks.d.ts +58 -0
  623. package/dist/structure/time-marks.d.ts.map +1 -0
  624. package/dist/structure/time-marks.js +74 -0
  625. package/dist/structure/time-marks.js.map +1 -0
  626. package/dist/structure/time-order.d.ts +21 -0
  627. package/dist/structure/time-order.d.ts.map +1 -0
  628. package/dist/structure/time-order.js +108 -0
  629. package/dist/structure/time-order.js.map +1 -0
  630. package/dist/structure/title-lines.d.ts +8 -0
  631. package/dist/structure/title-lines.d.ts.map +1 -0
  632. package/dist/structure/title-lines.js +27 -0
  633. package/dist/structure/title-lines.js.map +1 -0
  634. package/dist/structure/total.d.ts.map +1 -1
  635. package/dist/structure/total.js +3 -1
  636. package/dist/structure/total.js.map +1 -1
  637. package/dist/structure/version-mismatch.d.ts +1 -5
  638. package/dist/structure/version-mismatch.d.ts.map +1 -1
  639. package/dist/structure/version-mismatch.js +65 -12
  640. package/dist/structure/version-mismatch.js.map +1 -1
  641. package/dist/structure/version-order.d.ts +23 -0
  642. package/dist/structure/version-order.d.ts.map +1 -0
  643. package/dist/structure/version-order.js +67 -0
  644. package/dist/structure/version-order.js.map +1 -0
  645. package/dist/table-text.d.ts +9 -0
  646. package/dist/table-text.d.ts.map +1 -0
  647. package/dist/table-text.js +36 -0
  648. package/dist/table-text.js.map +1 -0
  649. package/dist/ui-labels.d.ts +16 -0
  650. package/dist/ui-labels.d.ts.map +1 -0
  651. package/dist/ui-labels.js +42 -0
  652. package/dist/ui-labels.js.map +1 -0
  653. package/dist/undefined-call.d.ts +13 -0
  654. package/dist/undefined-call.d.ts.map +1 -0
  655. package/dist/undefined-call.js +55 -0
  656. package/dist/undefined-call.js.map +1 -0
  657. package/dist/unnamed-speaker.d.ts +23 -0
  658. package/dist/unnamed-speaker.d.ts.map +1 -0
  659. package/dist/unnamed-speaker.js +176 -0
  660. package/dist/unnamed-speaker.js.map +1 -0
  661. package/dist/warning-action.d.ts +22 -0
  662. package/dist/warning-action.d.ts.map +1 -0
  663. package/dist/warning-action.js +58 -0
  664. package/dist/warning-action.js.map +1 -0
  665. package/genres.yaml +2 -0
  666. package/package.json +4 -3
  667. package/profiles/statute.yaml +8 -0
  668. package/rules/agreement-slip.yaml +2 -2
  669. package/rules/amount-range-reversed.yaml +52 -0
  670. package/rules/amount-scale-consistency.yaml +4 -4
  671. package/rules/announced-count-mismatch.yaml +9 -4
  672. package/rules/arrival-before-departure.yaml +48 -0
  673. package/rules/connective-hierarchy.yaml +3 -3
  674. package/rules/currency-notation-consistency.yaml +2 -2
  675. package/rules/date-order.yaml +9 -4
  676. package/rules/date-outside-period.yaml +64 -0
  677. package/rules/default-value-mismatch.yaml +79 -0
  678. package/rules/defined-term-form.yaml +9 -7
  679. package/rules/deprecated-option-used.yaml +78 -0
  680. package/rules/doubled-nado.yaml +28 -12
  681. package/rules/due-before-issue.yaml +68 -0
  682. package/rules/duplicate-definition.yaml +2 -2
  683. package/rules/duration-mismatch.yaml +12 -4
  684. package/rules/heading-echo.yaml +2 -2
  685. package/rules/hyphen-as-dash.yaml +2 -2
  686. package/rules/kana-function-word.yaml +58 -0
  687. package/rules/latin-spacing.yaml +6 -5
  688. package/rules/line-amount-mismatch.yaml +58 -0
  689. package/rules/nado-closed-list.yaml +77 -0
  690. package/rules/name-variant.yaml +14 -2
  691. package/rules/number-word-figure-mismatch.yaml +76 -0
  692. package/rules/numbering-gap.yaml +2 -2
  693. package/rules/obligation-without-deadline.yaml +95 -0
  694. package/rules/one-sentence-paragraph-run.yaml +2 -3
  695. package/rules/parameter-table-mismatch.yaml +90 -0
  696. package/rules/percent-sum-mismatch.yaml +2 -2
  697. package/rules/phone-number-variant.yaml +68 -0
  698. package/rules/prerequisite-after-step.yaml +78 -0
  699. package/rules/quote-unnamed-speaker.yaml +67 -0
  700. package/rules/quote-without-source.yaml +6 -6
  701. package/rules/requirement-smell.yaml +3 -3
  702. package/rules/sentence-initial-conjunction-run.yaml +13 -7
  703. package/rules/summary-fact-mismatch.yaml +4 -4
  704. package/rules/tax-mismatch.yaml +71 -0
  705. package/rules/time-order.yaml +65 -0
  706. package/rules/title-length.yaml +2 -2
  707. package/rules/ui-label-variant.yaml +70 -0
  708. package/rules/unbalanced-bracket.yaml +4 -4
  709. package/rules/uncomparable-graded.yaml +29 -10
  710. package/rules/undefined-function-call.yaml +77 -0
  711. package/rules/undefined-term.yaml +72 -0
  712. package/rules/unknown-word.yaml +2 -2
  713. package/rules/unqualified-superlative.yaml +2 -2
  714. package/rules/use-before-definition.yaml +2 -2
  715. package/rules/version-mismatch.yaml +12 -4
  716. package/rules/version-order.yaml +85 -0
  717. package/rules/very-adjective.yaml +31 -13
  718. package/rules/warning-without-action.yaml +64 -0
  719. package/rules/wordy-phrase.yaml +27 -9
  720. package/src/ai-score/of-document.ts +19 -9
  721. package/src/ai-score/render.ts +24 -4
  722. package/src/ai-score/score.ts +24 -3
  723. package/src/ai-score/signals.ts +12 -2
  724. package/src/ai-score/text.ts +7 -2
  725. package/src/announced-count.ts +19 -12
  726. package/src/check-source.ts +11 -2
  727. package/src/cli-text.ts +38 -16
  728. package/src/cli.ts +2 -1
  729. package/src/commands/cite-claims.ts +103 -0
  730. package/src/commands/cite-page.ts +61 -0
  731. package/src/commands/cite-scaffold.ts +27 -0
  732. package/src/commands/cite.ts +127 -58
  733. package/src/company-names.ts +202 -0
  734. package/src/default-values.ts +158 -0
  735. package/src/deprecated-use.ts +122 -0
  736. package/src/derived/stays.ts +145 -0
  737. package/src/detectors/acronym-context.ts +10 -2
  738. package/src/detectors/address-word.ts +9 -0
  739. package/src/detectors/agreement-slip.ts +7 -1
  740. package/src/detectors/ai-phrasing.ts +6 -1
  741. package/src/detectors/amount-range.ts +54 -0
  742. package/src/detectors/amount-scale.ts +50 -17
  743. package/src/detectors/announced-count.ts +29 -11
  744. package/src/detectors/bare-comparative.ts +7 -2
  745. package/src/detectors/block-quotation.ts +95 -0
  746. package/src/detectors/bracket-label.ts +58 -0
  747. package/src/detectors/citation-entry.ts +20 -5
  748. package/src/detectors/code-before.ts +14 -0
  749. package/src/detectors/connective-hierarchy.ts +39 -11
  750. package/src/detectors/currency-notation.ts +2 -1
  751. package/src/detectors/date-outside-period.ts +38 -0
  752. package/src/detectors/default-values.ts +17 -0
  753. package/src/detectors/defined-term-form.ts +84 -15
  754. package/src/detectors/definition-use.ts +10 -2
  755. package/src/detectors/deprecated-use.ts +17 -0
  756. package/src/detectors/derived-numbers.ts +106 -15
  757. package/src/detectors/document-shape.ts +6 -1
  758. package/src/detectors/due-date.ts +47 -0
  759. package/src/detectors/en-shape.ts +27 -11
  760. package/src/detectors/fact-consistency.ts +95 -3
  761. package/src/detectors/heading-echo.ts +11 -1
  762. package/src/detectors/kana-function-word.ts +71 -0
  763. package/src/detectors/line-amount.ts +33 -0
  764. package/src/detectors/location-pointer.ts +30 -0
  765. package/src/detectors/mark-shape.ts +18 -1
  766. package/src/detectors/nado-closed-list.ts +25 -0
  767. package/src/detectors/name-variant.ts +106 -13
  768. package/src/detectors/next-word.ts +56 -9
  769. package/src/detectors/number-word-figure.ts +43 -0
  770. package/src/detectors/obligation-without-deadline.ts +192 -0
  771. package/src/detectors/open-end-names.ts +140 -0
  772. package/src/detectors/ordinal-run-gaps.ts +101 -0
  773. package/src/detectors/orthographic-variant.ts +39 -14
  774. package/src/detectors/orthography.ts +6 -1
  775. package/src/detectors/parameter-table.ts +17 -0
  776. package/src/detectors/phone-number-variant.ts +18 -0
  777. package/src/detectors/prerequisite-order.ts +35 -0
  778. package/src/detectors/quote-unnamed-speaker.ts +19 -0
  779. package/src/detectors/quote-without-source.ts +57 -10
  780. package/src/detectors/registry/amount-range.ts +4 -0
  781. package/src/detectors/registry/arrival-before-departure.ts +4 -0
  782. package/src/detectors/registry/date-outside-period.ts +4 -0
  783. package/src/detectors/registry/default-values.ts +4 -0
  784. package/src/detectors/registry/deprecated-use.ts +4 -0
  785. package/src/detectors/registry/due-date.ts +4 -0
  786. package/src/detectors/registry/kana-function-word.ts +4 -0
  787. package/src/detectors/registry/line-amount.ts +4 -0
  788. package/src/detectors/registry/nado-closed-list.ts +4 -0
  789. package/src/detectors/registry/number-word-figure.ts +4 -0
  790. package/src/detectors/registry/obligation-without-deadline.ts +4 -0
  791. package/src/detectors/registry/parameter-table.ts +4 -0
  792. package/src/detectors/registry/phone-number-variant.ts +4 -0
  793. package/src/detectors/registry/prerequisite-order.ts +4 -0
  794. package/src/detectors/registry/quote-unnamed-speaker.ts +4 -0
  795. package/src/detectors/registry/tax-amount.ts +4 -0
  796. package/src/detectors/registry/time-order.ts +4 -0
  797. package/src/detectors/registry/ui-label.ts +4 -0
  798. package/src/detectors/registry/undefined-call.ts +4 -0
  799. package/src/detectors/registry/undefined-term.ts +4 -0
  800. package/src/detectors/registry/version-order.ts +4 -0
  801. package/src/detectors/registry/warning-action.ts +4 -0
  802. package/src/detectors/requirement-smell.ts +29 -9
  803. package/src/detectors/structure-tree.ts +43 -21
  804. package/src/detectors/superlative-scope.ts +13 -1
  805. package/src/detectors/tax-amount.ts +25 -0
  806. package/src/detectors/technical-docs.ts +7 -1
  807. package/src/detectors/term-extension.ts +67 -0
  808. package/src/detectors/time-order.ts +49 -0
  809. package/src/detectors/ui-label.ts +17 -0
  810. package/src/detectors/unbalanced-bracket.ts +7 -14
  811. package/src/detectors/undefined-call.ts +19 -0
  812. package/src/detectors/undefined-term.ts +103 -0
  813. package/src/detectors/unknown-word.ts +3 -3
  814. package/src/detectors/vague-deadline.ts +3 -3
  815. package/src/detectors/version-mismatch.ts +26 -5
  816. package/src/detectors/version-order.ts +50 -0
  817. package/src/detectors/warning-action.ts +49 -0
  818. package/src/facts/condition-pairs.ts +289 -0
  819. package/src/facts/event-dates.ts +63 -0
  820. package/src/facts/fact-scope.ts +6 -0
  821. package/src/facts/labelled-facts.ts +13 -1
  822. package/src/facts/table-facts.ts +3 -3
  823. package/src/grade/ai-score.ts +1 -1
  824. package/src/grade/text.ts +2 -2
  825. package/src/heading-numbering.ts +2 -2
  826. package/src/html/fetch-page.ts +64 -0
  827. package/src/html/fetched-text.ts +32 -0
  828. package/src/html/html-content-block.ts +107 -0
  829. package/src/html/html-elements.ts +127 -0
  830. package/src/html/html-footnote-marks.ts +20 -0
  831. package/src/html/html-heading-links.ts +93 -0
  832. package/src/html/html-lost-tags.ts +14 -0
  833. package/src/html/html-markdown.ts +481 -0
  834. package/src/html/html-preformatted.ts +110 -0
  835. package/src/html/html-reader-only.ts +82 -0
  836. package/src/html/html-run-in-headings.ts +43 -0
  837. package/src/html/html-tables.ts +76 -0
  838. package/src/html/html-widgets.ts +114 -0
  839. package/src/html/markup-text.ts +35 -0
  840. package/src/html/page-document.ts +22 -0
  841. package/src/inline-count.ts +146 -0
  842. package/src/kana-spelling.ts +7 -0
  843. package/src/location-part.ts +30 -0
  844. package/src/nado-closed-list.ts +106 -0
  845. package/src/name-cue.ts +35 -0
  846. package/src/name-variants.ts +57 -11
  847. package/src/paragraph-runs.ts +12 -2
  848. package/src/parameter-table.ts +208 -0
  849. package/src/phone-numbers.ts +98 -0
  850. package/src/place-names.ts +248 -0
  851. package/src/plugin.ts +4 -0
  852. package/src/prerequisite-order.ts +39 -0
  853. package/src/profile/parse.ts +10 -1
  854. package/src/reasons.ts +4 -0
  855. package/src/render/rules-json.ts +4 -0
  856. package/src/render/rules-table.ts +6 -3
  857. package/src/rule-genres.ts +5 -2
  858. package/src/rule-load.ts +3 -2
  859. package/src/run.ts +3 -1
  860. package/src/spelling.ts +8 -0
  861. package/src/structure/action-due.ts +179 -0
  862. package/src/structure/amount-range.ts +219 -0
  863. package/src/structure/amount-scale.ts +18 -0
  864. package/src/structure/cite.ts +21 -2
  865. package/src/structure/counted-amounts.ts +42 -0
  866. package/src/structure/date-order.ts +72 -22
  867. package/src/structure/date-outside-period.ts +127 -0
  868. package/src/structure/definition-use.ts +24 -3
  869. package/src/structure/due-date.ts +46 -0
  870. package/src/structure/heading-runs.ts +24 -0
  871. package/src/structure/install-pin.ts +115 -0
  872. package/src/structure/leg-times.ts +198 -0
  873. package/src/structure/line-amount-unit.ts +35 -0
  874. package/src/structure/line-amount.ts +162 -0
  875. package/src/structure/number-word-figure.ts +199 -0
  876. package/src/structure/numbering.ts +3 -0
  877. package/src/structure/ordinal-runs.ts +107 -0
  878. package/src/structure/percent-sum-prose.ts +46 -3
  879. package/src/structure/percent-sum.ts +16 -2
  880. package/src/structure/release-list.ts +69 -0
  881. package/src/structure/share-column.ts +25 -0
  882. package/src/structure/stated-period.ts +161 -0
  883. package/src/structure/tax.ts +114 -0
  884. package/src/structure/time-marks.ts +127 -0
  885. package/src/structure/time-order.ts +140 -0
  886. package/src/structure/title-lines.ts +33 -0
  887. package/src/structure/total.ts +5 -1
  888. package/src/structure/version-mismatch.ts +67 -13
  889. package/src/structure/version-order.ts +84 -0
  890. package/src/table-text.ts +39 -0
  891. package/src/ui-labels.ts +55 -0
  892. package/src/undefined-call.ts +65 -0
  893. package/src/unnamed-speaker.ts +224 -0
  894. package/src/warning-action.ts +73 -0
  895. package/styles/koyobun.yaml +7 -4
@@ -0,0 +1,127 @@
1
+ import { escapeRegExp } from "../orthography.ts";
2
+ import type { StructureIssue } from "./issues.ts";
3
+ import { TABLE_ROW } from "./runs.ts";
4
+ import { statedPeriod, type DateMention, type Period, type PeriodWords } from "./stated-period.ts";
5
+
6
+ /**
7
+ * 書いた期間の外の日付。期間の語で始まる一行(旅行期間:…)が期間を書き、その後ろ、同じ節の中の箇条書きの項目、表の行、見出しの日付を比べる。
8
+ * 地の文の日付は、年の無いもの(2月12日(金)の午前は…)だけを比べる。年のある日付は、過去の回や別の年の出来事を挙げることが多い。
9
+ * 期間の前後に置く予定(前泊、follow-up)、締め切りや予約の日、過去の回を言う語(period-aside)が、その行、文、節の見出しにあれば比べない。
10
+ * 年の無い期間(12月28日〜1月4日)は年をまたいで読む。
11
+ */
12
+ export type HeadingSpan = { readonly start: number; readonly end: number; readonly depth: number };
13
+ type Span = { readonly start: number; readonly end: number };
14
+
15
+ export type OutsideWords = PeriodWords & { readonly asides: readonly string[] };
16
+
17
+ const LIST_ITEM = /^[ \t]{0,12}(?:[-*+]|\d{1,3}[.)])[ \t]/u;
18
+ const DAY_VALUE = /^(?:\d{4}-)?\d{2}-\d{2}$/u;
19
+
20
+ const hasYear = (value: string): boolean => value.length === "2026-01-01".length;
21
+ const monthDay = (value: string): string => value.slice(-"01-01".length);
22
+
23
+ /** 期間の中か。両方に年があれば年月日で、どちらかに年が無ければ月日で比べ、終わりが始まりより前の月日は年をまたぐ期間と読む。 */
24
+ export const insidePeriod = (value: string, period: Pick<Period, "start" | "end">): boolean => {
25
+ if (hasYear(value) && hasYear(period.start)) return value >= period.start && value <= period.end;
26
+ const [from, to, day] = [monthDay(period.start), monthDay(period.end), monthDay(value)];
27
+ return from <= to ? day >= from && day <= to : day >= from || day <= to;
28
+ };
29
+
30
+ const linesOf = (source: string): Span[] =>
31
+ source.split("\n").reduce<Span[]>((lines, text) => {
32
+ const start = (lines.at(-1)?.end ?? -1) + 1;
33
+ return [...lines, { start, end: start + text.length }];
34
+ }, []);
35
+
36
+ const containing = <Item extends Span>(spans: readonly Item[], offset: number): Item | undefined =>
37
+ spans.find((span) => span.start <= offset && offset <= span.end);
38
+
39
+ /** 英字の語は語の切れ目で、ほかは含むかで照らす。 */
40
+ export const mentions = (text: string, words: readonly string[]): boolean => {
41
+ const lower = text.toLowerCase();
42
+ return words.some((word) => {
43
+ const target = word.toLowerCase();
44
+ if (!/[a-z]/u.test(target)) return lower.includes(target);
45
+ return new RegExp(`(?<![a-z])${escapeRegExp(target)}(?![a-z])`, "u").test(lower);
46
+ });
47
+ };
48
+
49
+ type Stated = Period & { readonly scopeStart: number; readonly scopeEnd: number };
50
+
51
+ /**
52
+ * 期間の及ぶ範囲の始まり: 期間の行の後ろ。期間の行が箇条書きの項目なら、その箇条書きの後ろ。
53
+ * 「- Conference: May 3–5」「- Workshop: May 7」は催しを並べた一覧で、並んだ項目は期間の中の予定ではない。
54
+ */
55
+ const scopeStart = (source: string, lines: readonly Span[], line: Span): number => {
56
+ const isListLine = (span: Span): boolean => LIST_ITEM.test(source.slice(span.start, span.end));
57
+ if (!isListLine(line)) return line.end;
58
+ const after = lines.filter((span) => span.start > line.start);
59
+ const listEnd = after.findIndex((span) => !isListLine(span));
60
+ return (listEnd === -1 ? (after.at(-1) ?? line) : (after[listEnd - 1] ?? line)).end;
61
+ };
62
+
63
+ /** 期間の行が属する節の深さ。行が見出しならその深さ、そうでなければ前の見出しの深さ(見出しの前なら 0)。 */
64
+ const depthAt = (line: Span, headings: readonly HeadingSpan[]): number =>
65
+ (containing(headings, line.start) ?? headings.filter((heading) => heading.start < line.start).at(-1))?.depth ?? 0;
66
+
67
+ /** 期間の及ぶ範囲の終わり: 同じか浅い深さの次の見出しか、次の期間の行。 */
68
+ const scopeEnd = (line: Span, next: number, headings: readonly HeadingSpan[], length: number): number => {
69
+ const depth = depthAt(line, headings);
70
+ const closing = headings.find((heading) => heading.start > line.end && heading.depth <= depth)?.start ?? length;
71
+ return Math.min(closing, next);
72
+ };
73
+
74
+ const statedPeriods = (
75
+ source: string,
76
+ lines: readonly Span[],
77
+ dates: readonly DateMention[],
78
+ headings: readonly HeadingSpan[],
79
+ words: OutsideWords,
80
+ ): Stated[] => {
81
+ const found = lines.flatMap((line) => {
82
+ const period = statedPeriod(source.slice(line.start, line.end), line.start, dates, words);
83
+ return period === undefined ? [] : [{ period, line }];
84
+ });
85
+ return found.map(({ period, line }, index) => ({
86
+ ...period,
87
+ scopeStart: scopeStart(source, lines, line),
88
+ scopeEnd: scopeEnd(line, found[index + 1]?.line.start ?? source.length, headings, source.length),
89
+ }));
90
+ };
91
+
92
+ const isItem = (text: string, line: Span, headings: readonly HeadingSpan[]): boolean =>
93
+ LIST_ITEM.test(text) || TABLE_ROW.test(text) || containing(headings, line.start) !== undefined;
94
+
95
+ type Context = { readonly source: string; readonly lines: readonly Span[]; readonly headings: readonly HeadingSpan[]; readonly sentences: readonly Span[] };
96
+
97
+ /** 日付を囲む行(項目)か文(地の文)と、その節の見出し。期間の外に置く語を探す所。 */
98
+ const surroundings = (date: DateMention, line: Span, item: boolean, context: Context): string[] => {
99
+ const unit = item ? line : (containing(context.sentences, date.offset) ?? line);
100
+ const heading = context.headings.filter((candidate) => candidate.start <= date.offset).at(-1);
101
+ return [context.source.slice(unit.start, unit.end), heading === undefined ? "" : context.source.slice(heading.start, heading.end)];
102
+ };
103
+
104
+ const outsideOne = (date: DateMention, period: Stated, context: Context, asides: readonly string[]): boolean => {
105
+ if (!DAY_VALUE.test(date.value) || insidePeriod(date.value, period)) return false;
106
+ const line = containing(context.lines, date.offset);
107
+ if (line === undefined) return false;
108
+ const item = isItem(context.source.slice(line.start, line.end), line, context.headings);
109
+ if (!item && hasYear(date.value)) return false;
110
+ return !surroundings(date, line, item, context).some((text) => mentions(text, asides));
111
+ };
112
+
113
+ export const datesOutsidePeriod = (
114
+ source: string,
115
+ dates: readonly DateMention[],
116
+ headings: readonly HeadingSpan[],
117
+ sentences: readonly Span[],
118
+ words: OutsideWords,
119
+ ): StructureIssue[] => {
120
+ const lines = linesOf(source);
121
+ const context: Context = { source, lines, headings, sentences };
122
+ return statedPeriods(source, lines, dates, headings, words).flatMap((period) =>
123
+ dates
124
+ .filter((date) => date.offset > period.scopeStart && date.offset < period.scopeEnd && outsideOne(date, period, context, words.asides))
125
+ .map((date) => ({ offset: date.offset, values: { date: source.slice(date.offset, date.end), period: period.written } })),
126
+ );
127
+ };
@@ -135,6 +135,19 @@ const LABEL_SLACK = 3;
135
135
  const isLabel = (body: BodyText | undefined, term: string): boolean =>
136
136
  body !== undefined && (body.text.replaceAll(term, "").match(LETTER) ?? []).length <= LABEL_SLACK;
137
137
 
138
+ /** 文書の位置が、題・見出し・条の見出しの行にあるか。見出しは節の中身に名前を付けるだけで、語を使った所ではない。 */
139
+ export type IsTitle = (offset: number) => boolean;
140
+
141
+ const NEVER_TITLE: IsTitle = () => false;
142
+
143
+ const HAN = /\p{Script=Han}/u;
144
+
145
+ /** 漢字で終わる語の後ろに漢字が続く現れは、もっと長い語の一部(監査委員会の監査委員、保険金請求権の保険金請求)。 */
146
+ const continuesInHan = (texts: readonly BodyText[], term: string, offset: number): boolean => {
147
+ const body = sentenceAt(texts, offset);
148
+ return body !== undefined && HAN.test(term.at(-1) ?? "") && HAN.test(body.text.charAt(offset - body.start + term.length));
149
+ };
150
+
138
151
  const CAPITAL_OR_NON_LATIN = /\p{Lu}|[^\p{Script=Latin}\p{N}\s\p{P}]/u;
139
152
 
140
153
  /**
@@ -145,18 +158,26 @@ const isDistinctive = (term: string): boolean => CAPITAL_OR_NON_LATIN.test(term)
145
158
 
146
159
  /**
147
160
  * 文の途中で括弧に入れて定義した語((the "Seller")、以下「甲」という)を、その定義の文より前で使っている所。最初の一つだけ。
148
- * 定義の文の中の現れ(株式会社GovTech東京(以下「GovTech東京」という。))は、定義する名前そのものなので数えない。札の文も数えない。
161
+ * 定義の文の中の現れ(株式会社GovTech東京(以下「GovTech東京」という。))は、定義する名前そのものなので数えない。札の文も、
162
+ * isTitle が言う題・見出しの行も、漢字で終わる語にさらに漢字が続く長い語の一部も数えない。
149
163
  * 定義の条("Seller" means、「甲」とは)は条の並びの頭にも終わりにも置く書き方があるので、前で使っても言わない。
150
164
  * 定義の語の無い括弧の引用(("The key point is"))は例の引用と同じ形なので、その語を引用符で挙げただけの現れ
151
165
  * (Its sentences open with "The key point is")は使用ではない。定義の語のある定義((the "Seller")、以下「買主」という)は、
152
166
  * 引用符に入れた現れ(The "Seller" ships)も使用。
153
167
  */
154
- export const usesBeforeDefinition = (terms: readonly DefinedTerm[], texts: readonly BodyText[], mentioned: Mentioned = NEVER_MENTIONED): TermUse[] =>
168
+ export const usesBeforeDefinition = (
169
+ terms: readonly DefinedTerm[],
170
+ texts: readonly BodyText[],
171
+ mentioned: Mentioned = NEVER_MENTIONED,
172
+ isTitle: IsTitle = NEVER_TITLE,
173
+ ): TermUse[] =>
155
174
  groupsOf(terms)
156
175
  .filter((group) => group.first.inline && isDistinctive(group.first.term))
157
176
  .flatMap(({ first: defined, spans }) => {
158
177
  const defining = sentenceAt(texts, defined.span.start)?.start ?? defined.span.start;
159
178
  const uses = usesOf(defined.term, texts, spans, "exact", defined.bare === true ? mentioned : NEVER_MENTIONED);
160
- const first = uses.find((offset) => !isLabel(sentenceAt(texts, offset), defined.term));
179
+ const first = uses.find(
180
+ (offset) => !isLabel(sentenceAt(texts, offset), defined.term) && !isTitle(offset) && !continuesInHan(texts, defined.term, offset),
181
+ );
161
182
  return first !== undefined && first < defining ? [{ term: defined, offset: first }] : [];
162
183
  });
@@ -0,0 +1,46 @@
1
+ import type { StructureIssue } from "./issues.ts";
2
+ import { linesOf } from "./lines.ts";
3
+ import { isTotalLabel } from "./total.ts";
4
+
5
+ /**
6
+ * A due date before the issue date. A line (or a list item, or a table's first column) starting with an issue-date word
7
+ * (発行日, Issued) and one starting with a due-date word (お支払期限, Payment due), each with a full date on it: a due date
8
+ * earlier than the first issue date, and written near it (the header block of an invoice or a quote), is reported. A due
9
+ * line that says its deadline has passed (期限切れ, overdue) reports on a deadline rather than setting one. Pure.
10
+ */
11
+ export type DueWords = { readonly issue: readonly string[]; readonly due: readonly string[]; readonly passed: readonly string[] };
12
+
13
+ /** How many lines from the issue date a due date may be and still be read as the same document's deadline. */
14
+ const MAX_LINE_GAP = 8;
15
+
16
+ /** A date of the structure tree: where it starts and its value (2026-11-25). */
17
+ export type DatedPoint = { readonly offset: number; readonly value: string };
18
+
19
+ const FULL_DATE = /^\d{4}-\d{2}-\d{2}$/u;
20
+
21
+ type Labelled = { readonly kind: "issue" | "due"; readonly date: DatedPoint; readonly line: number };
22
+
23
+ const kindOf = (text: string, words: DueWords): Labelled["kind"] | undefined => {
24
+ if (isTotalLabel(text, words.issue)) return "issue";
25
+ return isTotalLabel(text, words.due) ? "due" : undefined;
26
+ };
27
+
28
+ const labelledDates = (source: string, dates: readonly DatedPoint[], words: DueWords): Labelled[] =>
29
+ linesOf(source).flatMap((line) => {
30
+ const passed = words.passed.some((word) => line.text.toLowerCase().includes(word.toLowerCase()));
31
+ const kind = passed ? undefined : kindOf(line.text, words);
32
+ const end = line.start + line.text.length;
33
+ const onLine = dates.filter((date) => date.offset >= line.start && date.offset <= end && FULL_DATE.test(date.value));
34
+ const [date] = onLine;
35
+ return kind === undefined || date === undefined || onLine.length > 1 ? [] : [{ kind, date, line: line.number }];
36
+ });
37
+
38
+ export const dueBeforeIssue = (source: string, dates: readonly DatedPoint[], words: DueWords): StructureIssue[] => {
39
+ if (words.issue.length === 0 || words.due.length === 0) return [];
40
+ const labelled = labelledDates(source, dates, words);
41
+ const issued = labelled.find((entry) => entry.kind === "issue");
42
+ if (issued === undefined) return [];
43
+ return labelled
44
+ .filter((entry) => entry.kind === "due" && entry.date.value < issued.date.value && Math.abs(entry.line - issued.line) < MAX_LINE_GAP)
45
+ .map((entry) => ({ offset: entry.date.offset, values: { due: entry.date.value, issued: issued.date.value } }));
46
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Headings at one depth under one parent heading, as a changelog's version or dated headings stand. A shallower heading
3
+ * closes the runs deeper than it; a deeper heading (### Added) ends none. A heading pointOf turns down still closes the
4
+ * deeper runs but joins no run and opens none, so "## Install" between two version headings does not split them.
5
+ */
6
+ export const siblingHeadingRunsOf = <Heading extends { readonly depth: number }, Point>(
7
+ headings: readonly Heading[],
8
+ pointOf: (heading: Heading) => Point | undefined,
9
+ ): Point[][] => {
10
+ const runs: Point[][] = [];
11
+ const open = new Map<number, Point[]>();
12
+ headings.forEach((heading) => {
13
+ [...open.keys()].filter((depth) => depth > heading.depth).forEach((depth) => open.delete(depth));
14
+ const point = pointOf(heading);
15
+ if (point === undefined) return;
16
+ const run = open.get(heading.depth) ?? [];
17
+ if (!open.has(heading.depth)) {
18
+ open.set(heading.depth, run);
19
+ runs.push(run);
20
+ }
21
+ run.push(point);
22
+ });
23
+ return runs;
24
+ };
@@ -0,0 +1,115 @@
1
+ // An install command that pins the document's own package (npm install wrapkit@3.1.0) to a version other than the one its
2
+ // release list says is current. Pure: reads the source, the releases the document lists, and the install command shapes.
3
+ import { escapeRegExp } from "../orthography.ts";
4
+
5
+ /** One release the document lists: a version heading with its section, or a list item that starts with a version. */
6
+ export type Release = { readonly version: string; readonly start: number; readonly end: number };
7
+
8
+ /** A package pinned to one exact version by an install command. */
9
+ export type Pin = { readonly offset: number; readonly name: string; readonly version: string };
10
+
11
+ /** Where the document names itself: its title, and the paragraph that opens it. */
12
+ export type OwnText = { readonly title: string; readonly opening: string };
13
+
14
+ export type PinIssue = {
15
+ readonly offset: number;
16
+ readonly variant: "newest" | "section";
17
+ readonly values: { readonly pinned: string; readonly release: string };
18
+ };
19
+
20
+ const NAME = "(@?[A-Za-z0-9][\\w.\\/-]*)";
21
+ /**
22
+ * Exactly one version: not a range (^3.0.0, >=3.0.0), not a prerelease or build (3.0.0-beta.1), not a tag (latest). A
23
+ * sentence's period may follow (install wrapkit@3.1.0.), a fourth part may not (3.1.0.1).
24
+ */
25
+ const EXACT_VERSION = "(\\d{1,4}\\.\\d{1,4}\\.\\d{1,4})(?![\\w+-]|\\.\\w)";
26
+ /** The rest of a command: on its line, up to a ; && | or a closing backtick. */
27
+ const COMMAND_REST = "[^\\n;&|`]*";
28
+
29
+ /** A lexicon shape ("npm install {name}@{version}") as the command and the pin it takes. */
30
+ export type InstallShape = { readonly command: RegExp; readonly pin: RegExp };
31
+
32
+ /** A shape read from the lexicon; undefined when it does not name a command, then both parts in that order. */
33
+ export const installShape = (shape: string): InstallShape | undefined => {
34
+ const [command = "", rest = ""] = shape.split("{name}");
35
+ const [separator, tail] = rest.split("{version}");
36
+ if (command.trim() === "" || separator === undefined || tail === undefined) return undefined;
37
+ const words = command.trim().split(/\s+/u).map(escapeRegExp).join("[ \\t]+");
38
+ const pin = escapeRegExp(separator).replaceAll(" ", "[ \\t]+");
39
+ return {
40
+ command: new RegExp(`(?<![\\w.-])${words}(?=[ \\t])${COMMAND_REST}`, "gu"),
41
+ pin: new RegExp(`(?<=[ \\t])${NAME}${pin}${EXACT_VERSION}`, "gu"),
42
+ };
43
+ };
44
+
45
+ const pinsAfter = (command: RegExpExecArray, shape: InstallShape): Pin[] =>
46
+ [...command[0].matchAll(shape.pin)].flatMap((match) => {
47
+ const [whole, name, version] = match;
48
+ if (name === undefined || version === undefined) return [];
49
+ return [{ offset: command.index + match.index + whole.length - version.length, name, version }];
50
+ });
51
+
52
+ /** Each pin an install command makes, read with the lexicon's command shapes. Flags and other packages may come first. */
53
+ export const pinsIn = (source: string, shapes: readonly string[]): Pin[] =>
54
+ shapes
55
+ .flatMap((text) => {
56
+ const shape = installShape(text);
57
+ return shape === undefined ? [] : [...source.matchAll(shape.command)].flatMap((command) => pinsAfter(command, shape));
58
+ })
59
+ .filter((pin, index, pins) => pins.findIndex((other) => other.offset === pin.offset) === index);
60
+
61
+ /** The whole name, scope included: a page about react does not own @types/react. */
62
+ const names = (text: string, name: string): boolean => new RegExp(`(?<![\\w@/.-])${escapeRegExp(name)}(?![\\w/-])`, "iu").test(text);
63
+
64
+ /**
65
+ * The pins of the document's own package: those its title names, or, when the title names none (a changelog titled
66
+ * "Changelog"), those its opening paragraph names. Another package pinned in the same document is a dependency.
67
+ */
68
+ const ownPins = (pins: readonly Pin[], own: OwnText): Pin[] => {
69
+ const titled = pins.filter((pin) => names(own.title, pin.name));
70
+ return titled.length > 0 ? titled : pins.filter((pin) => names(own.opening, pin.name));
71
+ };
72
+
73
+ const PARAGRAPH_BREAK = /\n[ \t]*\n/u;
74
+
75
+ /** The document's title, its first top-level heading, and the paragraph that opens the text after it. */
76
+ export const ownTextOf = (source: string, headings: readonly { readonly depth: number; readonly text: string; readonly end: number }[]): OwnText => {
77
+ const title = headings.find((heading) => heading.depth === 1);
78
+ const rest = source.slice(title?.end ?? 0).trimStart();
79
+ const opening = rest.startsWith("#") ? "" : (rest.split(PARAGRAPH_BREAK)[0] ?? "");
80
+ return { title: title?.text ?? "", opening };
81
+ };
82
+
83
+ const partsOf = (version: string): number[] => version.split(".").map(Number);
84
+
85
+ const isNewer = (left: string, right: string): boolean => {
86
+ const [a, b] = [partsOf(left), partsOf(right)];
87
+ const differing = a.findIndex((part, index) => part !== b[index]);
88
+ return differing !== -1 && (a[differing] ?? 0) > (b[differing] ?? 0);
89
+ };
90
+
91
+ /** The newest release by version order; a prerelease (4.0.0-beta.1) is not the one a reader is told to install. */
92
+ const newestOf = (releases: readonly Release[]): string | undefined =>
93
+ releases
94
+ .map((release) => release.version)
95
+ .filter((version) => !version.includes("-"))
96
+ .reduce<string | undefined>((newest, version) => (newest === undefined || isNewer(version, newest) ? version : newest), undefined);
97
+
98
+ /** The release whose section holds a position, innermost first: a pin under "## 3.2.0" belongs to 3.2.0. */
99
+ const sectionAt = (releases: readonly Release[], offset: number): Release | undefined =>
100
+ releases.filter((release) => release.start <= offset && offset < release.end).at(-1);
101
+
102
+ /**
103
+ * Each pin of the document's own package that differs from its release: the release whose section it is in, or else the
104
+ * newest the document lists. A document that lists no release says nothing to compare.
105
+ */
106
+ export const installPinMismatches = (pins: readonly Pin[], releases: readonly Release[], own: OwnText): PinIssue[] => {
107
+ const newest = newestOf(releases);
108
+ if (newest === undefined) return [];
109
+ return ownPins(pins, own).flatMap((pin) => {
110
+ const section = sectionAt(releases, pin.offset);
111
+ const release = section?.version ?? newest;
112
+ if (release === pin.version) return [];
113
+ return [{ offset: pin.offset, variant: section === undefined ? "newest" : "section", values: { pinned: pin.version, release } }];
114
+ });
115
+ };
@@ -0,0 +1,198 @@
1
+ import type { StructureIssue } from "./issues.ts";
2
+ import { TABLE_RULE } from "./runs.ts";
3
+ import {
4
+ crossesZones,
5
+ dayShiftOf,
6
+ markBefore,
7
+ markRightAfter,
8
+ wordOffsets,
9
+ zonesIn,
10
+ SECONDS_PER_DAY,
11
+ type DateSpan,
12
+ type Mark,
13
+ type TimeSpan,
14
+ type TimeWords,
15
+ } from "./time-marks.ts";
16
+
17
+ /**
18
+ * 一つの行(箇条書きの項目、表の行、文の一行)に書いた発と着の時刻。着が発より前なら、どちらかの書き間違い。
19
+ * 発・着は、時刻のすぐ後ろの印(「08:00発」)か、時刻の少し前の印(「departs Boston 7:30 AM」「dep 10:30」)、
20
+ * または表の列の見出し(出発、到着、Departs、Arrives。語彙表 leg-column)で読む。
21
+ * 着に翌日の印(翌、+1、next day)があれば一日足す。発と着の両方に日付があれば日付で比べ、片方だけなら比べない。
22
+ * 違う時間帯の印が二つある行と、「現地時間」のようにどこの時刻かを言わない印のある行は、時刻をそのまま比べられないので言わない。
23
+ */
24
+
25
+ /** 発か着の時刻。date はその時刻の前に書いた日付、shift は翌日(1)か前日(-1)の印、zone は時刻の後ろに書いた時間帯(無ければ空)。 */
26
+ type LegTime = {
27
+ readonly offset: number;
28
+ readonly end: number;
29
+ readonly written: string;
30
+ readonly seconds: number;
31
+ readonly shift: number;
32
+ readonly date: string | undefined;
33
+ readonly zone: string;
34
+ };
35
+
36
+ type Leg = LegTime & { readonly side: string };
37
+
38
+ const DEPARTURE = "departure";
39
+ const ARRIVAL = "arrival";
40
+
41
+ /** 「departs Washington Reagan 1:30 PM」のように、発着の語と時刻の間に挟んでよい字の数(地名)。 */
42
+ const LEG_WORD_GAP = 32;
43
+ /** 発着の語と時刻の間に来れば、その語は時刻にかからない(文や句の切れ目)。 */
44
+ const BREAK = /[。.;;!?!?]|\.\s/u;
45
+
46
+ type Inputs = { readonly source: string; readonly times: readonly TimeSpan[]; readonly dates: readonly DateSpan[]; readonly words: TimeWords };
47
+
48
+ const timesWithin = (times: readonly TimeSpan[], start: number, end: number): TimeSpan[] => times.filter((time) => time.start >= start && time.end <= end);
49
+
50
+ /** 時刻の日付と読む、時刻の前に書いた日付までの字の数(「Feb 8, 1:00 PM」「2月8日 13:00」)。 */
51
+ const DATE_WINDOW = 4;
52
+
53
+ /** 時刻の後ろで、その時刻の時間帯の印(17:00 JST)を探す字の数。 */
54
+ const ZONE_WINDOW = 12;
55
+
56
+ /** 時刻を、from から to までの原文(前の時刻の後ろから次の時刻の前まで、表なら升)の中で読む。 */
57
+ const legTimeOf = (time: TimeSpan, from: number, to: number, inputs: Inputs): LegTime => {
58
+ const head = inputs.source.slice(from, time.start);
59
+ const date = inputs.dates.filter((span) => span.start >= from && span.end <= time.start && time.start - span.end <= DATE_WINDOW).at(-1)?.value;
60
+ const shift = dayShiftOf(head, inputs.source, time.end, inputs.words);
61
+ const zone = zonesIn(inputs.source.slice(time.end, Math.min(to, time.end + ZONE_WINDOW)), inputs.words)[0]?.text ?? "";
62
+ return { offset: time.start, end: time.end, written: inputs.source.slice(time.start, time.end), seconds: time.seconds, shift, date, zone };
63
+ };
64
+
65
+ /** 時刻の前の語(departs、dep)。間に句の切れ目があれば、その語はこの時刻のものではない。 */
66
+ const sideBefore = (head: string, legs: readonly Mark[]): string | undefined => {
67
+ const mark = markBefore(head, legs, LEG_WORD_GAP);
68
+ if (mark === undefined) return undefined;
69
+ const at = Math.max(...wordOffsets(head, mark.pattern));
70
+ return BREAK.test(head.slice(at + mark.pattern.length)) ? undefined : mark.group;
71
+ };
72
+
73
+ /** 一行の中の発着の時刻を、書いた順に。前の時刻から後ろだけを、その時刻の前置きとして読む。 */
74
+ const legsInLine = (start: number, end: number, inputs: Inputs): Leg[] =>
75
+ timesWithin(inputs.times, start, end).flatMap((time, index, all) => {
76
+ const from = all[index - 1]?.end ?? start;
77
+ const to = all[index + 1]?.start ?? end;
78
+ const side = markRightAfter(inputs.source, time.end, inputs.words.legs)?.group ?? sideBefore(inputs.source.slice(from, time.start), inputs.words.legs);
79
+ return side === DEPARTURE || side === ARRIVAL ? [{ ...legTimeOf(time, from, to, inputs), side }] : [];
80
+ });
81
+
82
+ /** 発のあとに来た最初の着を、その発の組にする。間に文の切れ目があれば、着は別の文のもので組にしない。 */
83
+ const pairsOf = (source: string, legs: readonly Leg[]): [LegTime, LegTime][] =>
84
+ legs.reduce<{ pending: LegTime | undefined; pairs: [LegTime, LegTime][] }>(
85
+ (found, leg) => {
86
+ if (leg.side === DEPARTURE) return { ...found, pending: leg };
87
+ if (found.pending === undefined || BREAK.test(source.slice(found.pending.end, leg.offset))) return { ...found, pending: undefined };
88
+ return { pending: undefined, pairs: [...found.pairs, [found.pending, leg]] };
89
+ },
90
+ { pending: undefined, pairs: [] },
91
+ ).pairs;
92
+
93
+ /** 年月日、年月、月日は、同じ書き方どうしでしか比べない。 */
94
+ const sameShape = (left: string, right: string): boolean => left.length === right.length;
95
+
96
+ /**
97
+ * 着が発より前か。両方に日付があれば日付で、日付が同じなら時刻で比べる。片方だけに日付があれば、もう片方の日が分からない。
98
+ * 時間帯の印が発と着で違えば(片方だけに書いたときも)、時刻をそのまま比べられない。
99
+ */
100
+ export const arrivesFirst = (departure: LegTime, arrival: LegTime): boolean => {
101
+ if ((departure.date === undefined) !== (arrival.date === undefined) || departure.zone !== arrival.zone) return false;
102
+ if (departure.date !== undefined && arrival.date !== undefined) {
103
+ if (!sameShape(departure.date, arrival.date)) return false;
104
+ if (departure.date !== arrival.date) return arrival.date < departure.date;
105
+ }
106
+ return arrival.shift * SECONDS_PER_DAY + arrival.seconds < departure.shift * SECONDS_PER_DAY + departure.seconds;
107
+ };
108
+
109
+ const issueOf = ([departure, arrival]: [LegTime, LegTime]): StructureIssue => ({
110
+ offset: arrival.offset,
111
+ values: { arrival: arrival.written, departure: departure.written },
112
+ });
113
+
114
+ const linesOf = (source: string): { start: number; end: number }[] =>
115
+ source.split("\n").reduce<{ start: number; end: number }[]>((lines, text) => {
116
+ const start = (lines.at(-1)?.end ?? -1) + 1;
117
+ return [...lines, { start, end: start + text.length }];
118
+ }, []);
119
+
120
+ /** 行の中で発と着の印から読む組。 */
121
+ const inlinePairs = (inputs: Inputs, zonesOf: (start: number, end: number) => boolean): [LegTime, LegTime][] =>
122
+ linesOf(inputs.source).flatMap((line) => (zonesOf(line.start, line.end) ? [] : pairsOf(inputs.source, legsInLine(line.start, line.end, inputs))));
123
+
124
+ type Cell = { readonly start: number; readonly end: number };
125
+
126
+ /** 表の一行を、| で区切った升に分ける。先頭と末尾の | の外は升ではない。 */
127
+ export const cellsOf = (source: string, start: number, end: number): Cell[] => {
128
+ const text = source.slice(start, end);
129
+ const bars = [...text.matchAll(/(?<!\\)\|/gu)].map((match) => start + match.index);
130
+ const edges = [text.trimStart().startsWith("|") ? undefined : start - 1, ...bars, text.trimEnd().endsWith("|") ? undefined : end].filter(
131
+ (edge) => edge !== undefined,
132
+ );
133
+ return edges.slice(1).map((edge, index) => ({ start: (edges[index] ?? start) + 1, end: edge }));
134
+ };
135
+
136
+ /** 見出しの升の後ろの括弧書き(「出発(現地時間)」「Departs (JST)」)。列の名前はその前まで。 */
137
+ const NOTE_OPENER = /[(([[]/u;
138
+
139
+ const columnName = (heading: string): string => {
140
+ const note = heading.search(NOTE_OPENER);
141
+ return (note === -1 ? heading : heading.slice(0, note)).trim();
142
+ };
143
+
144
+ /** 見出しの升の名前が、発着の列の名前(語彙表 leg-column)と同じ最初の列。 */
145
+ const columnOf = (source: string, header: readonly Cell[], columns: readonly Mark[], side: string): number =>
146
+ header.findIndex((cell) => {
147
+ const name = columnName(source.slice(cell.start, cell.end));
148
+ return columns.some((mark) => mark.group === side && mark.pattern === name);
149
+ });
150
+
151
+ /** 升の中の最初の時刻を、発か着として読む。 */
152
+ const cellTime = (cell: Cell | undefined, inputs: Inputs): LegTime | undefined => {
153
+ if (cell === undefined) return undefined;
154
+ const time = timesWithin(inputs.times, cell.start, cell.end)[0];
155
+ return time === undefined ? undefined : legTimeOf(time, cell.start, cell.end, inputs);
156
+ };
157
+
158
+ type Table = { readonly header: Cell[]; readonly rows: { start: number; end: number }[] };
159
+
160
+ /** 見出しの行、区切りの行、| のある行が続くあいだを一つの表にする。 */
161
+ const tablesOf = (source: string): Table[] => {
162
+ const lines = linesOf(source);
163
+ return lines.flatMap((line, index) => {
164
+ const header = lines[index - 1];
165
+ if (header === undefined || !TABLE_RULE.test(source.slice(line.start, line.end))) return [];
166
+ const after = lines.slice(index + 1);
167
+ const stop = after.findIndex((row) => !source.slice(row.start, row.end).includes("|"));
168
+ return [{ header: cellsOf(source, header.start, header.end), rows: stop === -1 ? after : after.slice(0, stop) }];
169
+ });
170
+ };
171
+
172
+ /** 発の列と着の列を見出しから読む表の組。見出しに時間帯の印があれば、行と合わせて時間帯を見る。 */
173
+ const columnPairs = (inputs: Inputs, zonesOf: (start: number, end: number) => boolean): [LegTime, LegTime][] =>
174
+ tablesOf(inputs.source).flatMap((table) => {
175
+ const departs = columnOf(inputs.source, table.header, inputs.words.columns, DEPARTURE);
176
+ const arrives = columnOf(inputs.source, table.header, inputs.words.columns, ARRIVAL);
177
+ const headerLine = { start: table.header[0]?.start ?? 0, end: table.header.at(-1)?.end ?? 0 };
178
+ if (departs === -1 || arrives === -1) return [];
179
+ return table.rows.flatMap((row): [LegTime, LegTime][] => {
180
+ const cells = cellsOf(inputs.source, row.start, row.end);
181
+ const departure = cellTime(cells[departs], inputs);
182
+ const arrival = cellTime(cells[arrives], inputs);
183
+ const zoned = zonesOf(row.start, row.end) || zonesOf(headerLine.start, headerLine.end);
184
+ return departure === undefined || arrival === undefined || zoned ? [] : [[departure, arrival]];
185
+ });
186
+ });
187
+
188
+ /** 着が発より前の組。同じ着を表の列と行の中の印の両方から読んでも、一度だけ言う。 */
189
+ export const arrivalsBeforeDeparture = (source: string, times: readonly TimeSpan[], dates: readonly DateSpan[], words: TimeWords): StructureIssue[] => {
190
+ const inputs = { source, times, dates, words };
191
+ const zonesOf = (start: number, end: number): boolean => crossesZones(zonesIn(source.slice(start, end), words));
192
+ const issues = [...inlinePairs(inputs, zonesOf), ...columnPairs(inputs, zonesOf)]
193
+ .filter(([departure, arrival]) => arrivesFirst(departure, arrival))
194
+ .map(issueOf);
195
+ return issues
196
+ .filter((issue, index) => issues.findIndex((other) => other.offset === issue.offset) === index)
197
+ .toSorted((left, right) => left.offset - right.offset);
198
+ };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 明細の一行で、数量と単価が同じ単位を数えているか。単価が何かあたり($100/hour、月額、Rate の列)なら、数量はその単位で
3
+ * 書かれているか単位の無い数でなければ、掛けても金額にならない。語はすべて語彙表から来る。Pure.
4
+ */
5
+ export type UnitWord = { readonly pattern: string; readonly unit: string };
6
+
7
+ /** The marks of a price cell with its per-unit mark taken off, and the unit it named. */
8
+ export type PerUnitPrice = { readonly before: string; readonly after: string; readonly unit: string };
9
+
10
+ const longestFirst = (words: readonly UnitWord[]): UnitWord[] => words.toSorted((left, right) => right.pattern.length - left.pattern.length);
11
+
12
+ const lower = (text: string): string => text.normalize("NFKC").toLowerCase();
13
+
14
+ /** "$" "/hour" → "$" "" hour; "月額" "円" → "" "円" month. Undefined when neither mark says a unit. */
15
+ export const perUnitPrice = (before: string, after: string, marks: readonly UnitWord[]): PerUnitPrice | undefined => {
16
+ const sorted = longestFirst(marks);
17
+ const ending = sorted.find((mark) => lower(after).endsWith(lower(mark.pattern)));
18
+ if (ending !== undefined) return { before, after: after.slice(0, after.length - ending.pattern.length).trim(), unit: ending.unit };
19
+ const opening = sorted.find((mark) => lower(before).startsWith(lower(mark.pattern)));
20
+ return opening === undefined ? undefined : { before: before.slice(opening.pattern.length).trim(), after, unit: opening.unit };
21
+ };
22
+
23
+ /** The unit of a quantity's word ("days" → day), "" when the cell has no word after its number, undefined when the word is not a unit. */
24
+ export const quantityUnit = (word: string, units: readonly UnitWord[]): string | undefined => {
25
+ const wanted = lower(word).trim().replace(/\.$/u, "");
26
+ if (wanted === "") return "";
27
+ return units.find((unit) => lower(unit.pattern) === wanted)?.unit;
28
+ };
29
+
30
+ /**
31
+ * Whether quantity × price is meaningful. A price that is per no unit is per whatever the quantity counts. A price per a
32
+ * unit goes with a bare number (a count of that unit) or a quantity in that unit, and with nothing else.
33
+ */
34
+ export const unitsAgree = (quantity: string | undefined, pricePer: string | undefined): boolean =>
35
+ pricePer === undefined || quantity === "" || quantity === pricePer;