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,71 @@
1
+ import type { Detector, Finding, Lexicon, LexiconEntry, Token } from "../plugin.ts";
2
+
3
+ // A helper verb or formal noun written in kanji where a style writes it in kana (見て下さい → 見てください). The word
4
+ // list says which words and how each is told apart from its main use (資料を下さい, 本を置く, 事が起きる); this file
5
+ // reads that off the tagger's marks. Pure: the tokens and the word list come in.
6
+
7
+ export type KanaSpelling = { readonly written: string; readonly preferred: string; readonly offset: number };
8
+
9
+ const TE_FORM = new Set(["て", "で"]);
10
+
11
+ const followsTeForm = (previous: Token | undefined): boolean => previous?.pos === "SCONJ" && TE_FORM.has(previous.surface);
12
+
13
+ const isBound = (token: Token): boolean => token.features?.["Bound"] === "Yes";
14
+
15
+ const isFormalNoun = (token: Token): boolean => token.features?.["NounType"] === "Dependent";
16
+
17
+ const TOPIC = "は";
18
+ const CASE_NI = "に";
19
+
20
+ /** 〜時は and 〜時には: a condition. 〜時から, 〜時に (a point in time) are not. */
21
+ const beforeTopic = (tokens: readonly Token[], index: number): boolean =>
22
+ tokens[index + 1]?.surface === TOPIC || (tokens[index + 1]?.surface === CASE_NI && tokens[index + 2]?.surface === TOPIC);
23
+
24
+ /** Whether the word at index is used as the list's group says: a helper after て, a formal noun, a condition (〜時は, 〜時には). */
25
+ const usedAsFunctionWord = (group: string | undefined, tokens: readonly Token[], index: number): boolean => {
26
+ const token = tokens[index];
27
+ if (token === undefined) return false;
28
+ if (group === "auxiliary") return isBound(token) || followsTeForm(tokens[index - 1]);
29
+ if (group === "after-te") return followsTeForm(tokens[index - 1]);
30
+ if (group === "formal-noun") return isFormalNoun(token);
31
+ if (group === "conditional") return isFormalNoun(token) && beforeTopic(tokens, index);
32
+ return false;
33
+ };
34
+
35
+ const KANJI = /^\p{Script=Han}+/u;
36
+
37
+ /** The written word with its kanji stem in kana: 下さい with 下さる → くださる gives ください. Undefined when the entry or the word does not fit. */
38
+ export const inKana = (written: string, entry: LexiconEntry): string | undefined => {
39
+ const stem = KANJI.exec(entry.pattern)?.[0];
40
+ const rewrite = entry.rewrite;
41
+ if (stem === undefined || rewrite === undefined || !written.startsWith(stem)) return undefined;
42
+ const okurigana = entry.pattern.slice(stem.length);
43
+ if (!rewrite.endsWith(okurigana)) return undefined;
44
+ return `${rewrite.slice(0, rewrite.length - okurigana.length)}${written.slice(stem.length)}`;
45
+ };
46
+
47
+ const entryFor = (token: Token, lexicon: Lexicon): LexiconEntry | undefined =>
48
+ lexicon.find((entry) => entry.pattern === token.lemma && token.surface.startsWith(entry.pattern.charAt(0)));
49
+
50
+ /** Each word in the tokens that the word list writes in kana, used as its group says. */
51
+ export const kanaSpellingsIn = (tokens: readonly Token[], lexicon: Lexicon): KanaSpelling[] =>
52
+ tokens.flatMap((token, index) => {
53
+ const entry = entryFor(token, lexicon);
54
+ if (entry === undefined || !usedAsFunctionWord(entry.group, tokens, index)) return [];
55
+ const preferred = inKana(token.surface, entry);
56
+ return preferred === undefined ? [] : [{ written: token.surface, preferred, offset: token.span.start }];
57
+ });
58
+
59
+ export const kanaFunctionWord: Detector = (doc, options): Finding[] => {
60
+ const lexicon = options.lexicon ?? [];
61
+ const found = doc.sentences.flatMap((sentence) => kanaSpellingsIn(sentence.tokens ?? [], lexicon).map((spelling) => ({ sentence, spelling })));
62
+ if (found.length < options.limit) return [];
63
+ return found.map(({ sentence, spelling }) => ({
64
+ rule: "",
65
+ severity: "info",
66
+ line: 0,
67
+ column: 0,
68
+ quote: sentence.text.trim(),
69
+ values: { matched: spelling.written, preferred: spelling.preferred, offset: spelling.offset },
70
+ }));
71
+ };
@@ -0,0 +1,33 @@
1
+ // line-amount-mismatch: the reading half. The column names come from the language's lexicons (quantity-column,
2
+ // unit-price-column, line-amount-column), the units from rate-unit and per-unit-mark; the tables are read from the prose with its tables put back, so code is not.
3
+ import type { Detector, Finding, ProseDocument } from "../plugin.ts";
4
+ import { lineAmountMismatches, type LineAmountWords } from "../structure/line-amount.ts";
5
+ import type { UnitWord } from "../structure/line-amount-unit.ts";
6
+ import { proseAndTablesOf } from "../table-text.ts";
7
+ import { quoteAt } from "./structure-tree.ts";
8
+
9
+ const patternsOf = (doc: ProseDocument, lexicon: string): string[] => (doc.lexicons[lexicon] ?? []).map((entry) => entry.pattern);
10
+
11
+ const unitWordsOf = (doc: ProseDocument, ...lexicons: string[]): UnitWord[] =>
12
+ lexicons.flatMap((lexicon) =>
13
+ (doc.lexicons[lexicon] ?? []).flatMap((entry) => (entry.group === undefined ? [] : [{ pattern: entry.pattern, unit: entry.group }])),
14
+ );
15
+
16
+ const wordsOf = (doc: ProseDocument): LineAmountWords => ({
17
+ quantity: patternsOf(doc, "quantity-column"),
18
+ unitPrice: patternsOf(doc, "unit-price-column"),
19
+ amount: patternsOf(doc, "line-amount-column"),
20
+ units: unitWordsOf(doc, "rate-unit"),
21
+ perUnitMarks: unitWordsOf(doc, "per-unit-mark"),
22
+ headerUnits: unitWordsOf(doc, "quantity-column", "unit-price-column"),
23
+ });
24
+
25
+ export const lineAmount: Detector = (doc): Finding[] =>
26
+ lineAmountMismatches(proseAndTablesOf(doc), wordsOf(doc)).map((issue) => ({
27
+ rule: "line-amount-mismatch",
28
+ severity: "error",
29
+ line: 0,
30
+ column: 0,
31
+ quote: quoteAt(doc.source, issue.offset),
32
+ values: { ...issue.values, offset: issue.offset },
33
+ }));
@@ -0,0 +1,30 @@
1
+ // Whether a sentence names where its content lives: a link, a web address, or a file in code. Pure.
2
+ import { bareUrls } from "../bare-url.ts";
3
+ import type { Span } from "../plugin.ts";
4
+
5
+ /** A code span: a run of backticks, then the same run closing it, neither run touching another backtick. */
6
+ const CODE_SPAN = /(?<!`)(`+)(?!`)(.+?)(?<!`)\1(?!`)/gsu;
7
+
8
+ /** A link to a place on the same page (`[text](#id)`): the reader is already on that page. */
9
+ const IN_PAGE_LINK = /\]\(\s*<?#[^)]*\)$/u;
10
+
11
+ /** A page a reader opens, as a file name: README.md, guide.html, spec.pdf. A source file (main.go) names code, not a page. */
12
+ const PAGE_FILE = /\.(?:md|markdown|mdx|txt|rst|adoc|html?|pdf)$/iu;
13
+
14
+ const SEPARATOR = /[/\\]/u;
15
+ const LETTER = /\p{L}/u;
16
+
17
+ /** Code that is a path (docs/api.md, ./config, src\index) or a page file, not an identifier or an expression. */
18
+ const isLocationCode = (code: string): boolean => {
19
+ const written = code.trim();
20
+ if (written.length === 0 || /\s/u.test(written) || !LETTER.test(written)) return false;
21
+ return SEPARATOR.test(written) || PAGE_FILE.test(written);
22
+ };
23
+
24
+ /** The sentence as written names a web address or, in code, a path or a page file. */
25
+ export const namesLocation = (written: string): boolean =>
26
+ bareUrls(written).length > 0 || [...written.matchAll(CODE_SPAN)].some((match) => isLocationCode(match[2] ?? ""));
27
+
28
+ /** One of the links written in the sentence's span leads off the page. */
29
+ export const holdsLink = (source: string, sentence: Span, links: readonly Span[]): boolean =>
30
+ links.some((link) => link.start < sentence.end && link.end > sentence.start && !IN_PAGE_LINK.test(source.slice(link.start, link.end)));
@@ -147,7 +147,24 @@ const reportFrom = (hits: readonly Hit[], limit: number): Finding[] => (hits.len
147
147
  /** A spaced hyphen or a double hyphen between words, standing for a dash ("late - very late", "late--very late"). */
148
148
  const HYPHEN_DASH = /(?<=[\p{L},;)]) -{1,2} (?=[\p{L}(])|(?<=\p{L})--(?=\p{L})/gu;
149
149
 
150
- export const hyphenDash: Detector = (doc, options): Finding[] => reportFrom(hitsOf(ownSentences(doc), HYPHEN_DASH), options.limit);
150
+ /** A dash set as a character (an em dash, an en dash). */
151
+ const TRUE_DASH = /[—–]/u;
152
+ const DOUBLE_HYPHEN = "--";
153
+
154
+ /**
155
+ * Whether the hit is a double hyphen in a document that sets no dash as a character: there "--" is how the document types its
156
+ * dash (plain-text standards, typewriter text, Markdown that a typographer turns into a dash), not a hyphen standing in for one.
157
+ */
158
+ const isTypedDash = (hit: Hit, setsDashes: boolean): boolean => !setsDashes && hit.matched === DOUBLE_HYPHEN;
159
+
160
+ export const hyphenDash: Detector = (doc, options): Finding[] => {
161
+ const sentences = ownSentences(doc);
162
+ const setsDashes = sentences.some((sentence) => TRUE_DASH.test(sentence.text));
163
+ return reportFrom(
164
+ hitsOf(sentences, HYPHEN_DASH).filter((hit) => !isTypedDash(hit, setsDashes)),
165
+ options.limit,
166
+ );
167
+ };
151
168
 
152
169
  /** Every way of writing an abbreviation with some of its periods dropped but not all (e.g. → e.g, eg.). */
153
170
  export const partialForms = (abbreviation: string): string[] => {
@@ -0,0 +1,25 @@
1
+ // nado-closed-list: 等, など or etc. on a list a limit closes (自転車等に限ります, only A, B, etc.), read sentence by sentence
2
+ // (nado-closed-list.ts). The tokens are moved to the sentence's own offsets before they are read.
3
+ import { closedListWordsOf, openWordsOnClosedLists } from "../nado-closed-list.ts";
4
+ import type { Detector, Finding, Sentence, Token } from "../plugin.ts";
5
+
6
+ const sentenceTokens = (sentence: Sentence): Token[] =>
7
+ (sentence.tokens ?? []).map((token) => ({
8
+ ...token,
9
+ span: { start: token.span.start - sentence.span.start, end: token.span.end - sentence.span.start },
10
+ }));
11
+
12
+ export const nadoClosedList: Detector = (doc, options): Finding[] => {
13
+ const words = closedListWordsOf(options.lexicon ?? []);
14
+ if (words.open.length === 0) return [];
15
+ return doc.sentences.flatMap((sentence) =>
16
+ openWordsOnClosedLists(sentence.text, sentenceTokens(sentence), words).map((hit) => ({
17
+ rule: "",
18
+ severity: "info",
19
+ line: 0,
20
+ column: 0,
21
+ quote: sentence.text.trim(),
22
+ values: { open: hit.open, limit: hit.limit, offset: sentence.span.start + hit.offset },
23
+ })),
24
+ );
25
+ };
@@ -1,25 +1,118 @@
1
1
  import type { Detector, Finding, ProseDocument } from "../plugin.ts";
2
- import { mentionsIn, nameVariants, suffixedNamesIn, type VariantChars } from "../name-variants.ts";
2
+ import { cuedNamesIn, mentionsIn, nameVariants, suffixedNamesIn, type NameMention, type VariantChars } from "../name-variants.ts";
3
+ import { nameCueAt, type NameCues } from "../name-cue.ts";
3
4
  import { quoteAt } from "./structure-tree.ts";
5
+ import { companyMentionsIn, companyVariants, type CompanyForm, type IsProper } from "../company-names.ts";
6
+ import { placeMentionsIn, placeVariants, type PlaceReader, type PlaceWord } from "../place-names.ts";
7
+ import type { Token } from "../plugin.ts";
4
8
 
5
- // 人の名前と読ませる敬称(様、さん)は語彙表 person-suffix、字体の違う同じ字(斎・斉・齋)は name-variant-char が組(group)ごとに言う。
9
+ // 人の名前と読ませる敬称(様、さん)は語彙表 person-suffix、人を指す前置き(担当の)は person-lead、名前のすぐ後ろに来る語
10
+ // (です、まで)は name-particle、字体の違う同じ字(斎・斉・齋)は name-variant-char が組(group)ごとに言う。
6
11
 
7
12
  const variantCharsOf = (doc: ProseDocument): VariantChars =>
8
13
  new Map((doc.lexicons["name-variant-char"] ?? []).flatMap((entry): [string, string][] => (entry.group === undefined ? [] : [[entry.pattern, entry.group]])));
9
14
 
15
+ const patternsOf = (doc: ProseDocument, id: string): string[] => (doc.lexicons[id] ?? []).map((entry) => entry.pattern);
16
+
17
+ /** 会社の形の語(株式会社、Inc)は語彙表 company-form が、同じ形の組(group)と名前のどちら側に立つか(position)とともに言う。 */
18
+ const companyFormsOf = (doc: ProseDocument): CompanyForm[] =>
19
+ (doc.lexicons["company-form"] ?? []).map((entry) => ({ pattern: entry.pattern, group: entry.group ?? entry.pattern, position: entry.position }));
20
+
21
+ /** source の上の範囲に、品詞解析が固有名詞と読んだ語が掛かるか。 */
22
+ const properOf = (doc: ProseDocument): IsProper => {
23
+ const spans = doc.sentences.flatMap((sentence) => (sentence.tokens ?? []).filter((token) => token.pos === "PROPN").map((token) => token.span));
24
+ return (start, end) => spans.some((span) => span.start < end && start < span.end);
25
+ };
26
+
27
+ /** 場所の名前の終わりに立つ語(口、駅、Street、St.)は語彙表 place-word が、同じ語の別の書き方の組(group)とともに言う。 */
28
+ const placeWordsOf = (doc: ProseDocument): PlaceWord[] =>
29
+ (doc.lexicons["place-word"] ?? []).map((entry) => ({ pattern: entry.pattern, group: entry.group ?? entry.pattern }));
30
+
31
+ /** 名前の頭に立たない語の品詞(The、at、and)。 */
32
+ const FUNCTION_POS: ReadonlySet<string> = new Set(["DET", "ADP", "PRON", "CCONJ", "SCONJ", "AUX", "PART"]);
33
+
34
+ const tokensOf = (doc: ProseDocument): Token[] => doc.sentences.flatMap((sentence) => sentence.tokens ?? []);
35
+
36
+ /** 場所の名前の語の数の上限。名前の読みを探す範囲。 */
37
+ const MAX_PLACE_TOKENS = 20;
38
+
39
+ /** 範囲をちょうど覆う語の読みをつないだもの。記号の語は読まない。覆えないか、読めない語があれば無い。 */
40
+ const readingIn = (tokens: readonly Token[], startAt: ReadonlyMap<number, number>, start: number, end: number): string | undefined => {
41
+ const first = startAt.get(start);
42
+ if (first === undefined) return undefined;
43
+ const window = tokens.slice(first, first + MAX_PLACE_TOKENS);
44
+ const covering = window.slice(0, window.findIndex((token) => token.span.end >= end) + 1);
45
+ if (covering.at(-1)?.span.end !== end) return undefined;
46
+ const readings = covering.filter((token) => token.pos !== "PUNCT").map((token) => token.reading);
47
+ return readings.every((reading) => reading !== undefined && reading !== "") ? readings.join("") : undefined;
48
+ };
49
+
50
+ const placeReaderOf = (doc: ProseDocument): PlaceReader => {
51
+ const tokens = tokensOf(doc);
52
+ const startAt = new Map(tokens.map((token, index) => [token.span.start, index]));
53
+ const functionStarts = new Set(tokens.filter((token) => FUNCTION_POS.has(token.pos)).map((token) => token.span.start));
54
+ return {
55
+ properWords: (start, end) => {
56
+ const first = startAt.get(start);
57
+ const window = first === undefined ? [] : tokens.slice(first, first + MAX_PLACE_TOKENS);
58
+ return window.filter((token) => token.pos === "PROPN" && token.span.start < end).map((token) => token.span);
59
+ },
60
+ joiners: new Set(patternsOf(doc, "place-name-joiner")),
61
+ isFunctionWord: (start) => functionStarts.has(start),
62
+ readingOf: (start, end) => readingIn(tokens, startAt, start, end),
63
+ };
64
+ };
65
+
66
+ type Reported = { readonly offset: number; readonly name: string; readonly usual: string; readonly kind: string };
67
+
68
+ const overlapsAny = (reported: readonly Reported[], offset: number, length: number): boolean =>
69
+ reported.some((other) => other.offset < offset + length && offset < other.offset + other.name.length);
70
+
71
+ /** 会社の名前の書き分け。名前の見方がすでに指した所と重なるものは除く。 */
72
+ const companyFindings = (doc: ProseDocument, prose: string, reported: readonly Reported[]): Reported[] =>
73
+ companyVariants(companyMentionsIn(prose, companyFormsOf(doc), properOf(doc)))
74
+ .filter(({ mention }) => !overlapsAny(reported, mention.offset, mention.surface.length))
75
+ .map(({ mention, usual, kind }) => ({ offset: mention.offset, name: mention.surface, usual, kind: kind === "spelling" ? kind : `company-${kind}` }));
76
+
77
+ /** 場所の名前の書き分け。人や会社の名前の見方がすでに指した所と重なるものは除く。 */
78
+ const placeFindings = (doc: ProseDocument, prose: string, reported: readonly Reported[]): Reported[] =>
79
+ placeVariants(placeMentionsIn(prose, placeWordsOf(doc), placeReaderOf(doc)))
80
+ .filter(({ mention }) => !overlapsAny(reported, mention.offset, mention.surface.length))
81
+ .map(({ mention, usual, kind }) => ({ offset: mention.offset, name: mention.surface, usual, kind }));
82
+
83
+ /** 人・製品・会社の名前の現れ。解析器が固有名詞と読む語、敬称の付く名前、前後の語で名前と読める漢字。 */
84
+ const nameMentionsOf = (doc: ProseDocument, prose: string, chars: VariantChars): NameMention[] => {
85
+ const cues: NameCues = { leads: patternsOf(doc, "person-lead"), suffixes: patternsOf(doc, "person-suffix"), particles: patternsOf(doc, "name-particle") };
86
+ const tagged = doc.sentences.flatMap((sentence) => mentionsIn(sentence.tokens ?? [], doc.source, cues.suffixes));
87
+ const taggedOrSuffixed = [...tagged, ...suffixedNamesIn(prose, cues.suffixes, chars, tagged)];
88
+ return [...taggedOrSuffixed, ...cuedNamesIn(prose, cues, chars, taggedOrSuffixed)]
89
+ .map((mention): NameMention => {
90
+ const cue = mention.cue ?? nameCueAt(prose, mention.offset, mention.surface, cues);
91
+ return cue === undefined ? mention : { ...mention, cue };
92
+ })
93
+ .toSorted((left, right) => left.offset - right.offset);
94
+ };
95
+
10
96
  /** 同じ名前を、文書の中で少しだけ違う形に書いた所(GitHub と Github、山田太郎 と 山田太朗)。少ないほうを指す。 */
11
97
  export const nameVariant: Detector = (doc): Finding[] => {
12
- const suffixes = (doc.lexicons["person-suffix"] ?? []).map((entry) => entry.pattern);
98
+ const prose = doc.prose ?? doc.source;
13
99
  const chars = variantCharsOf(doc);
14
- const tagged = doc.sentences.flatMap((sentence) => mentionsIn(sentence.tokens ?? [], doc.source, suffixes));
15
- const mentions = [...tagged, ...suffixedNamesIn(doc.prose ?? doc.source, suffixes, chars, tagged)].toSorted((left, right) => left.offset - right.offset);
16
- return nameVariants(mentions, chars).map(({ mention, usual, kind }) => ({
17
- rule: "",
18
- severity: "warning",
19
- line: 0,
20
- column: 0,
21
- quote: quoteAt(doc.source, mention.offset),
22
- values: { name: mention.surface, usual, offset: mention.offset },
23
- variant: kind,
100
+ const names = nameVariants(nameMentionsOf(doc, prose, chars), chars).map(({ mention, usual, kind }): Reported => ({
101
+ offset: mention.offset,
102
+ name: mention.surface,
103
+ usual,
104
+ kind,
24
105
  }));
106
+ const namesAndCompanies = [...names, ...companyFindings(doc, prose, names)];
107
+ return [...namesAndCompanies, ...placeFindings(doc, prose, namesAndCompanies)]
108
+ .toSorted((left, right) => left.offset - right.offset)
109
+ .map(({ offset, name, usual, kind }) => ({
110
+ rule: "",
111
+ severity: "warning",
112
+ line: 0,
113
+ column: 0,
114
+ quote: quoteAt(doc.source, offset),
115
+ values: { name, usual, offset },
116
+ variant: kind,
117
+ }));
25
118
  };
@@ -1,5 +1,6 @@
1
1
  import type { Detector, Finding, Lexicon, Sentence, Token } from "../plugin.ts";
2
2
  import { densityFindings } from "./ai-phrasing.ts";
3
+ import { entryEndsAt } from "./lexicon-match.ts";
3
4
 
4
5
  /**
5
6
  * The word kinds an article can stand before. A conjunction, a preposition or a verb after "a" is the letter a ("option A
@@ -127,30 +128,76 @@ const ADJECTIVE = "ADJ";
127
128
 
128
129
  type Intensified = { readonly sentence: Sentence; readonly matched: string; readonly offset: number };
129
130
 
130
- type IntensifierWords = { readonly intensifiers: ReadonlySet<string>; readonly exceptions: ReadonlySet<string> };
131
+ type IntensifierWords = {
132
+ readonly intensifiers: Lexicon;
133
+ readonly exceptions: ReadonlySet<string>;
134
+ /** Words after a noun that make it an adjective (便利な, 静かだ). Japanese only: its adjectival nouns are tagged as nouns. */
135
+ readonly copulas: ReadonlySet<string>;
136
+ };
137
+
138
+ /** An adjective, or a noun the lexicon's copula, an auxiliary (not the particle で), makes one: 便利 in 便利な. */
139
+ const isAdjectiveAt = (tokens: readonly Token[], at: number, copulas: ReadonlySet<string>): boolean => {
140
+ const token = tokens[at];
141
+ if (token?.pos === ADJECTIVE) return true;
142
+ const after = tokens[at + 1];
143
+ return token?.pos === "NOUN" && after?.pos === "AUX" && copulas.has(after.surface);
144
+ };
145
+
146
+ const isBlank = (token: Token): boolean => token.surface.trim() === "";
147
+
148
+ /** For each token, the index of the last non-blank token before it, or -1: one pass, so a long sentence is not rescanned per token. */
149
+ const previousWords = (tokens: readonly Token[]): number[] =>
150
+ tokens.reduce<{ readonly before: number[]; readonly last: number }>(
151
+ ({ before, last }, token, index) => {
152
+ before.push(last);
153
+ return { before, last: isBlank(token) ? last : index };
154
+ },
155
+ { before: [], last: -1 },
156
+ ).before;
157
+
158
+ /** The intensifier that ends at `end` (past a line break: 非常に / 危険), as the index of its first token. */
159
+ const intensifierStart = (tokens: readonly Token[], end: number, intensifiers: Lexicon): number | undefined => {
160
+ const entry = intensifiers.find((candidate) => entryEndsAt(tokens, candidate, end));
161
+ return entry === undefined ? undefined : end - (entry.tokens?.length ?? 1);
162
+ };
163
+
164
+ /** The intensifier and the adjective as words: "very important" in a spaced language, 非常に危険 in one measured in characters. */
165
+ const matchedText = (tokens: readonly Token[], start: number, at: number, spaced: boolean): string =>
166
+ tokens
167
+ .slice(start, at + 1)
168
+ .filter((token) => !isBlank(token))
169
+ .map((token) => token.surface)
170
+ .join(spaced ? " " : "");
131
171
 
132
172
  /** The lexicon's intensifier right before an adjective ("very important"), not before an excepted word ("the very first"). */
133
- const intensifiedIn = (source: string, sentence: Sentence, words: IntensifierWords): Intensified[] => {
173
+ const intensifiedIn = (source: string, sentence: Sentence, words: IntensifierWords, spaced: boolean): Intensified[] => {
134
174
  const tokens = sentence.tokens ?? [];
135
- return tokens.flatMap((token, at) => {
136
- const next = tokens[at + 1];
137
- if (next === undefined || !words.intensifiers.has(token.surface.toLowerCase()) || next.pos !== ADJECTIVE) return [];
138
- if (!adjacent(source, token, next)) return [];
139
- return words.exceptions.has(next.surface.toLowerCase()) ? [] : [{ sentence, matched: `${token.surface} ${next.surface}`, offset: token.span.start }];
175
+ const before = previousWords(tokens);
176
+ return tokens.flatMap((next, at) => {
177
+ const lastAt = before[at] ?? -1;
178
+ const start = intensifierStart(tokens, lastAt + 1, words.intensifiers);
179
+ const first = start === undefined ? undefined : tokens[start];
180
+ const last = tokens[lastAt];
181
+ if (start === undefined || first === undefined || last === undefined || !isAdjectiveAt(tokens, at, words.copulas)) return [];
182
+ if (!adjacent(source, last, next) || words.exceptions.has(next.surface.toLowerCase())) return [];
183
+ return [{ sentence, matched: matchedText(tokens, start, at, spaced), offset: first.span.start }];
140
184
  });
141
185
  };
142
186
 
143
187
  const EXCEPTIONS = "very-exception";
188
+ const COPULAS = "very-copula";
144
189
 
145
190
  /** "very" + adjective, dense for the document's length: each one leans on "very" instead of a stronger word. */
146
191
  export const intensifiedAdjective: Detector = (doc, options): Finding[] => {
147
192
  const words = {
148
- intensifiers: new Set((options.lexicon ?? []).map((entry) => entry.pattern)),
193
+ intensifiers: options.lexicon ?? [],
149
194
  exceptions: new Set((doc.lexicons[EXCEPTIONS] ?? []).map((entry) => entry.pattern)),
195
+ copulas: new Set((doc.lexicons[COPULAS] ?? []).map((entry) => entry.pattern)),
150
196
  };
197
+ const spaced = doc.lengthUnit !== "char";
151
198
  return densityFindings(
152
199
  doc,
153
- doc.sentences.flatMap((sentence) => intensifiedIn(doc.source, sentence, words)),
200
+ doc.sentences.flatMap((sentence) => intensifiedIn(doc.source, sentence, words, spaced)),
154
201
  options.limit,
155
202
  );
156
203
  };
@@ -0,0 +1,43 @@
1
+ // number-word-figure-mismatch: a number in words and its figure in brackets disagree (structure/number-word-figure.ts).
2
+ // The number words are the lexicon number-word; the marks around the figure are currency-notation's and the unit words of
3
+ // number-word; the words of scale inside the bracket ($5 million) are amount-multiplier's.
4
+ import type { Detector, Finding, ProseDocument } from "../plugin.ts";
5
+ import { wordFigureSlips, type NumberVocabulary, type NumberWord, type NumberWordKind } from "../structure/number-word-figure.ts";
6
+ import { proseAndTablesOf } from "../table-text.ts";
7
+ import { quoteAround } from "./quote-around.ts";
8
+
9
+ const KINDS: readonly NumberWordKind[] = ["digit", "place", "scale", "joiner", "lead", "unit"];
10
+
11
+ const numberWordsOf = (doc: ProseDocument): NumberWord[] =>
12
+ (doc.lexicons["number-word"] ?? []).flatMap((entry) => {
13
+ const kind = KINDS.find((candidate) => candidate === entry.group);
14
+ return kind === undefined ? [] : [{ word: entry.pattern, kind, value: entry.weight ?? 0 }];
15
+ });
16
+
17
+ export const vocabularyOf = (doc: ProseDocument): NumberVocabulary => {
18
+ const words = numberWordsOf(doc);
19
+ const currencies = doc.lexicons["currency-notation"] ?? [];
20
+ const units = words.filter((word) => word.kind === "unit").map((word) => word.word);
21
+ return {
22
+ words,
23
+ marksBefore: currencies.filter((entry) => entry.position === "before").map((entry) => entry.pattern),
24
+ marksAfter: [...currencies.filter((entry) => entry.position === "after").map((entry) => entry.pattern), ...units],
25
+ multipliers: (doc.lexicons["amount-multiplier"] ?? []).flatMap((entry) =>
26
+ entry.weight === undefined ? [] : [{ word: entry.pattern, value: entry.weight }],
27
+ ),
28
+ };
29
+ };
30
+
31
+ const NUMBER_FORMAT = new Intl.NumberFormat("en-US", { maximumFractionDigits: 2 });
32
+
33
+ export const numberWordFigure: Detector = (doc): Finding[] => {
34
+ const text = proseAndTablesOf(doc);
35
+ return wordFigureSlips(text, vocabularyOf(doc)).map((slip) => ({
36
+ rule: "number-word-figure-mismatch",
37
+ severity: "warning",
38
+ line: 0,
39
+ column: 0,
40
+ quote: quoteAround(text, slip.offset, slip.end),
41
+ values: { written: slip.written, words: NUMBER_FORMAT.format(slip.words), figure: NUMBER_FORMAT.format(slip.figure), offset: slip.offset },
42
+ }));
43
+ };
@@ -0,0 +1,192 @@
1
+ // A duty that happens at a point in time (pay, deliver, return, notify; 支払う, 提出する, 通知する) written with no time at
2
+ // all, in a contract that gives most of its other duties a limit: by when must it be done? The drafter decides whether
3
+ // duties carry limits, so only the minority in one document is pointed at, as vague-deadline does. A sentence holding
4
+ // a vague limit (promptly) is vague-deadline's; one stating an amount (pays a fee of $9,000) sets a price, and its
5
+ // timing is another clause's. The words come from the language package's word lists: timed-duty (the act),
6
+ // duty-marker (shall, will), duty-ending (う, するものとする: what may follow a Japanese act at the sentence end),
7
+ // stated-deadline (by the, までに) with concrete-deadline and vague-deadline, deadline-permission and currency-notation. Pure.
8
+ import { quoteAt } from "./structure-tree.ts";
9
+ import { escapeRegExp } from "../orthography.ts";
10
+ import { grantsRight, statesConcrete, vagueIn } from "./vague-deadline.ts";
11
+ import type { Detector, Finding, LexiconEntry, ProseDocument } from "../plugin.ts";
12
+
13
+ export type UntimedDuty = { readonly offset: number; readonly act: string };
14
+
15
+ /** sameLine: the sentence goes on the line of the one before it (no line break between them). */
16
+ type Text = { readonly start: number; readonly text: string; readonly sameLine?: boolean };
17
+
18
+ /** What the word lists give the decision. */
19
+ export type DutyWords = {
20
+ readonly acts: readonly string[];
21
+ readonly markers: readonly string[];
22
+ /** Words that, between the marker and the act, make the duty one not to act (will not submit). */
23
+ readonly negations: readonly string[];
24
+ readonly endings: readonly string[];
25
+ /** Phrases or frames that give a sentence a limit: concrete-deadline and stated-deadline. */
26
+ readonly limits: readonly string[];
27
+ /** Words that, where they stand, are no limit though a limit's words are in them (解除の日までの委託料: までの). */
28
+ readonly notLimits: readonly string[];
29
+ readonly vague: readonly string[];
30
+ /** Words that send the reader to other terms for how the act is done (according to the terms in the Order Form). */
31
+ readonly deferrals: readonly string[];
32
+ readonly permissions: readonly LexiconEntry[];
33
+ readonly currencies: readonly LexiconEntry[];
34
+ };
35
+
36
+ const LATIN = /\p{Script=Latin}/u;
37
+ const LETTER = /\p{L}/u;
38
+ const DIGIT = /\p{Nd}/u;
39
+ const SENTENCE_MARKS = new Set(["。", ".", ".", "!", "?", "!", "?", ";", ":"]);
40
+ /** How many words an aside between the duty marker and the act may hold: "shall, at its option, return". */
41
+ const MARKER_REACH_WORDS = 4;
42
+ /** How far before an amount's trailing mark its number may end (88万円, 1,000 円). */
43
+ const AMOUNT_REACH = 3;
44
+
45
+ const withoutEnding = (text: string): string => {
46
+ const chars = [...text.trimEnd()];
47
+ const last = chars.findLastIndex((char) => !SENTENCE_MARKS.has(char) && char.trim() !== "");
48
+ return chars.slice(0, last + 1).join("");
49
+ };
50
+
51
+ const latinWords = (lower: string): { readonly word: string; readonly at: number }[] =>
52
+ [...lower.matchAll(/[\p{L}']+/gu)].map((match) => ({ word: match[0], at: match.index }));
53
+
54
+ /** The act a Latin-script duty binds: an act word within reach after a duty marker (shall return, will notify). */
55
+ const latinActAt = (lower: string, words: DutyWords): { readonly act: string; readonly at: number } | undefined => {
56
+ const tokens = latinWords(lower);
57
+ const markerWords = words.markers.map((marker) => marker.toLowerCase().split(/\s+/u));
58
+ const markerEnds = tokens.flatMap((_, index) =>
59
+ markerWords.filter((parts) => parts.every((part, offset) => tokens[index + offset]?.word === part)).map((parts) => index + parts.length),
60
+ );
61
+ const acts = new Set(words.acts.map((act) => act.toLowerCase()));
62
+ const negations = new Set(words.negations.map((word) => word.toLowerCase()));
63
+ return markerEnds
64
+ .flatMap((end) => {
65
+ const reach = tokens.slice(end, end + MARKER_REACH_WORDS);
66
+ const act = reach.findIndex((token) => acts.has(token.word));
67
+ const found = reach[act];
68
+ const marker = tokens[end - 1];
69
+ if (found === undefined || marker === undefined || reach.slice(0, act).some((token) => negations.has(token.word))) return [];
70
+ // The act is the verb right after the marker, or after an aside set off by a comma ("shall, at its option, return");
71
+ // a later act word is an object ("shall send each invoice").
72
+ const aside = lower
73
+ .slice(marker.at + marker.word.length, found.at)
74
+ .trimStart()
75
+ .startsWith(",");
76
+ return act === 0 || aside ? [found] : [];
77
+ })
78
+ .map((token) => ({ act: token.word, at: token.at }))[0];
79
+ };
80
+
81
+ /** The act a duty written as the sentence's last predicate binds (支払う, 通知するものとする, 通知します). */
82
+ const endingActAt = (text: string, words: DutyWords): { readonly act: string; readonly at: number } | undefined => {
83
+ const ending = withoutEnding(text);
84
+ const act = words.acts.find((stem) => stem !== "" && words.endings.some((tail) => ending.endsWith(`${stem}${tail}`)));
85
+ if (act === undefined) return undefined;
86
+ return { act, at: ending.lastIndexOf(act) };
87
+ };
88
+
89
+ const actIn = (text: string, words: DutyWords): { readonly act: string; readonly at: number } | undefined =>
90
+ words.acts.some((act) => LATIN.test(act)) ? latinActAt(text.toLowerCase(), words) : endingActAt(text, words);
91
+
92
+ /** An amount (¥1,000, 1,000円, $9,000) in the sentence: it sets what is paid, and when is another clause's. */
93
+ export const statesAmount = (text: string, currencies: readonly LexiconEntry[]): boolean =>
94
+ currencies
95
+ .filter((entry) => entry.pattern !== "")
96
+ .some((entry) => {
97
+ const parts = text.split(entry.pattern);
98
+ return parts.slice(1).some((after, index) => {
99
+ const before = parts[index] ?? "";
100
+ return entry.position === "before" ? DIGIT.test(after.trimStart().charAt(0)) : DIGIT.test(before.trimEnd().slice(-AMOUNT_REACH));
101
+ });
102
+ });
103
+
104
+ const isWordStart = (text: string, at: number): boolean => !LETTER.test(text.charAt(at - 1));
105
+
106
+ /** The sentence with the words that are no limit blanked out, so that a limit's words inside them are not read. */
107
+ const withoutNotLimits = (text: Text, notLimits: readonly string[]): Text => ({
108
+ start: text.start,
109
+ text: notLimits.filter((word) => word !== "").reduce((masked, word) => masked.replaceAll(word, " ".repeat(word.length)), text.text),
110
+ });
111
+
112
+ const FRAME = "…";
113
+
114
+ /** A phrase in the sentence; a Latin one only as whole words (by the, not by their). */
115
+ const phraseIn = (text: string, phrase: string): boolean => {
116
+ const lower = text.toLowerCase();
117
+ const wanted = phrase.toLowerCase().trim();
118
+ if (wanted === "") return false;
119
+ if (!LATIN.test(wanted)) return lower.includes(wanted);
120
+ return [...lower.matchAll(new RegExp(escapeRegExp(wanted), "gu"))].some(
121
+ (match) => !LETTER.test(lower.charAt(match.index - 1)) && !LETTER.test(lower.charAt(match.index + wanted.length)),
122
+ );
123
+ };
124
+
125
+ /** A limit in the sentence: a frame (within … days) or a phrase (by the, までに), outside the words that are no limit. */
126
+ const statesLimit = (text: Text, words: DutyWords): boolean => {
127
+ const masked = withoutNotLimits(text, words.notLimits);
128
+ const frames = words.limits.filter((limit) => limit.includes(FRAME));
129
+ return statesConcrete(masked, frames) || words.limits.some((limit) => !limit.includes(FRAME) && phraseIn(masked.text, limit));
130
+ };
131
+
132
+ const limited = (text: Text, words: DutyWords): boolean => statesLimit(text, words) || vagueIn(text, words.vague).length > 0;
133
+
134
+ /** For each sentence, the index after the last sentence on its line: the time of a duty often follows it (Fees are due within 30 days). */
135
+ const lineEnds = (texts: readonly Text[]): number[] => {
136
+ const ends: number[] = [];
137
+ texts.reduceRight((after, _text, index) => {
138
+ const end = texts[index + 1]?.sameLine === true ? after : index + 1;
139
+ ends[index] = end;
140
+ return end;
141
+ }, texts.length);
142
+ return ends;
143
+ };
144
+
145
+ /**
146
+ * Each duty to act at a point in time whose sentence, and the rest of whose line, states no limit, holds no vague one, grants no right and states
147
+ * no amount, when more sentences of the document state a limit than hold such a duty: these duties are then the
148
+ * document's minority.
149
+ */
150
+ export const untimedDuties = (texts: readonly Text[], words: DutyWords): UntimedDuty[] => {
151
+ const ends = lineEnds(texts);
152
+ const found = texts.flatMap((text, index) => {
153
+ const line = texts.slice(index, ends[index]);
154
+ if (line.some((later) => limited(later, words) || words.deferrals.some((deferral) => phraseIn(later.text, deferral)))) return [];
155
+ if (grantsRight(text, words.permissions) || statesAmount(text.text, words.currencies)) return [];
156
+ const act = actIn(text.text, words);
157
+ if (act === undefined || (LATIN.test(act.act) && !isWordStart(text.text, act.at))) return [];
158
+ return [{ offset: text.start + act.at, act: text.text.slice(act.at, act.at + act.act.length) }];
159
+ });
160
+ const limitedSentences = texts.filter((text) => statesLimit(text, words)).length;
161
+ return limitedSentences > found.length ? found : [];
162
+ };
163
+
164
+ const patternsOf = (doc: ProseDocument, lexicon: string): string[] => (doc.lexicons[lexicon] ?? []).map((entry) => entry.pattern);
165
+
166
+ export const obligationWithoutDeadline: Detector = (doc): Finding[] =>
167
+ untimedDuties(
168
+ doc.sentences.map((sentence, index) => ({
169
+ start: sentence.span.start,
170
+ text: sentence.text,
171
+ sameLine: index > 0 && !doc.source.slice(doc.sentences[index - 1]?.span.end ?? 0, sentence.span.start).includes("\n"),
172
+ })),
173
+ {
174
+ acts: patternsOf(doc, "timed-duty"),
175
+ markers: patternsOf(doc, "duty-marker"),
176
+ negations: patternsOf(doc, "duty-negation"),
177
+ endings: patternsOf(doc, "duty-ending"),
178
+ limits: [...patternsOf(doc, "concrete-deadline"), ...patternsOf(doc, "stated-deadline")],
179
+ notLimits: patternsOf(doc, "stated-deadline-not"),
180
+ vague: patternsOf(doc, "vague-deadline"),
181
+ deferrals: patternsOf(doc, "duty-terms-elsewhere"),
182
+ permissions: doc.lexicons["deadline-permission"] ?? [],
183
+ currencies: doc.lexicons["currency-notation"] ?? [],
184
+ },
185
+ ).map((duty) => ({
186
+ rule: "obligation-without-deadline",
187
+ severity: "info",
188
+ line: 0,
189
+ column: 0,
190
+ quote: quoteAt(doc.source, duty.offset),
191
+ values: { word: duty.act, offset: duty.offset },
192
+ }));