chaffjs 0.27.1 → 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 (923) hide show
  1. package/README.md +2 -1
  2. package/dist/ai-score/of-document.d.ts.map +1 -1
  3. package/dist/ai-score/of-document.js +23 -14
  4. package/dist/ai-score/of-document.js.map +1 -1
  5. package/dist/ai-score/render.d.ts.map +1 -1
  6. package/dist/ai-score/render.js +13 -4
  7. package/dist/ai-score/render.js.map +1 -1
  8. package/dist/ai-score/score.d.ts +16 -1
  9. package/dist/ai-score/score.d.ts.map +1 -1
  10. package/dist/ai-score/score.js +15 -3
  11. package/dist/ai-score/score.js.map +1 -1
  12. package/dist/ai-score/signals.d.ts +2 -4
  13. package/dist/ai-score/signals.d.ts.map +1 -1
  14. package/dist/ai-score/signals.js +11 -2
  15. package/dist/ai-score/signals.js.map +1 -1
  16. package/dist/ai-score/text.d.ts +2 -0
  17. package/dist/ai-score/text.d.ts.map +1 -1
  18. package/dist/ai-score/text.js +4 -2
  19. package/dist/ai-score/text.js.map +1 -1
  20. package/dist/announced-count.d.ts +2 -0
  21. package/dist/announced-count.d.ts.map +1 -1
  22. package/dist/announced-count.js +14 -7
  23. package/dist/announced-count.js.map +1 -1
  24. package/dist/check-source.d.ts +3 -1
  25. package/dist/check-source.d.ts.map +1 -1
  26. package/dist/check-source.js +3 -1
  27. package/dist/check-source.js.map +1 -1
  28. package/dist/cli-text.d.ts.map +1 -1
  29. package/dist/cli-text.js +42 -18
  30. package/dist/cli-text.js.map +1 -1
  31. package/dist/cli.d.ts.map +1 -1
  32. package/dist/cli.js +2 -1
  33. package/dist/cli.js.map +1 -1
  34. package/dist/commands/cite-claims.d.ts +36 -0
  35. package/dist/commands/cite-claims.d.ts.map +1 -0
  36. package/dist/commands/cite-claims.js +81 -0
  37. package/dist/commands/cite-claims.js.map +1 -0
  38. package/dist/commands/cite-page.d.ts +14 -0
  39. package/dist/commands/cite-page.d.ts.map +1 -0
  40. package/dist/commands/cite-page.js +47 -0
  41. package/dist/commands/cite-page.js.map +1 -0
  42. package/dist/commands/cite-scaffold.d.ts +16 -0
  43. package/dist/commands/cite-scaffold.d.ts.map +1 -0
  44. package/dist/commands/cite-scaffold.js +21 -0
  45. package/dist/commands/cite-scaffold.js.map +1 -0
  46. package/dist/commands/cite.d.ts +3 -12
  47. package/dist/commands/cite.d.ts.map +1 -1
  48. package/dist/commands/cite.js +110 -51
  49. package/dist/commands/cite.js.map +1 -1
  50. package/dist/company-names.d.ts +34 -0
  51. package/dist/company-names.d.ts.map +1 -0
  52. package/dist/company-names.js +158 -0
  53. package/dist/company-names.js.map +1 -0
  54. package/dist/default-values.d.ts +17 -0
  55. package/dist/default-values.d.ts.map +1 -0
  56. package/dist/default-values.js +134 -0
  57. package/dist/default-values.js.map +1 -0
  58. package/dist/deprecated-use.d.ts +17 -0
  59. package/dist/deprecated-use.d.ts.map +1 -0
  60. package/dist/deprecated-use.js +95 -0
  61. package/dist/deprecated-use.js.map +1 -0
  62. package/dist/derived/number-word-counts.d.ts +10 -0
  63. package/dist/derived/number-word-counts.d.ts.map +1 -0
  64. package/dist/derived/number-word-counts.js +21 -0
  65. package/dist/derived/number-word-counts.js.map +1 -0
  66. package/dist/derived/stays.d.ts +43 -0
  67. package/dist/derived/stays.d.ts.map +1 -0
  68. package/dist/derived/stays.js +105 -0
  69. package/dist/derived/stays.js.map +1 -0
  70. package/dist/detectors/acronym-context.d.ts +2 -2
  71. package/dist/detectors/acronym-context.d.ts.map +1 -1
  72. package/dist/detectors/acronym-context.js +6 -0
  73. package/dist/detectors/acronym-context.js.map +1 -1
  74. package/dist/detectors/address-word.d.ts +3 -0
  75. package/dist/detectors/address-word.d.ts.map +1 -0
  76. package/dist/detectors/address-word.js +7 -0
  77. package/dist/detectors/address-word.js.map +1 -0
  78. package/dist/detectors/agreement-slip.d.ts.map +1 -1
  79. package/dist/detectors/agreement-slip.js +4 -1
  80. package/dist/detectors/agreement-slip.js.map +1 -1
  81. package/dist/detectors/ai-phrasing.d.ts +0 -4
  82. package/dist/detectors/ai-phrasing.d.ts.map +1 -1
  83. package/dist/detectors/ai-phrasing.js +5 -1
  84. package/dist/detectors/ai-phrasing.js.map +1 -1
  85. package/dist/detectors/amount-range.d.ts +3 -0
  86. package/dist/detectors/amount-range.d.ts.map +1 -0
  87. package/dist/detectors/amount-range.js +38 -0
  88. package/dist/detectors/amount-range.js.map +1 -0
  89. package/dist/detectors/amount-scale.d.ts +8 -0
  90. package/dist/detectors/amount-scale.d.ts.map +1 -0
  91. package/dist/detectors/amount-scale.js +74 -0
  92. package/dist/detectors/amount-scale.js.map +1 -0
  93. package/dist/detectors/announced-count.d.ts +1 -1
  94. package/dist/detectors/announced-count.d.ts.map +1 -1
  95. package/dist/detectors/announced-count.js +18 -3
  96. package/dist/detectors/announced-count.js.map +1 -1
  97. package/dist/detectors/bare-comparative.d.ts.map +1 -1
  98. package/dist/detectors/bare-comparative.js +4 -1
  99. package/dist/detectors/bare-comparative.js.map +1 -1
  100. package/dist/detectors/block-quotation.d.ts +13 -0
  101. package/dist/detectors/block-quotation.d.ts.map +1 -0
  102. package/dist/detectors/block-quotation.js +86 -0
  103. package/dist/detectors/block-quotation.js.map +1 -0
  104. package/dist/detectors/bracket-label.d.ts +10 -0
  105. package/dist/detectors/bracket-label.d.ts.map +1 -0
  106. package/dist/detectors/bracket-label.js +51 -0
  107. package/dist/detectors/bracket-label.js.map +1 -0
  108. package/dist/detectors/change-rate.d.ts.map +1 -1
  109. package/dist/detectors/change-rate.js +12 -1
  110. package/dist/detectors/change-rate.js.map +1 -1
  111. package/dist/detectors/citation-entry.d.ts +5 -0
  112. package/dist/detectors/citation-entry.d.ts.map +1 -1
  113. package/dist/detectors/citation-entry.js +19 -5
  114. package/dist/detectors/citation-entry.js.map +1 -1
  115. package/dist/detectors/code-before.d.ts +6 -0
  116. package/dist/detectors/code-before.d.ts.map +1 -0
  117. package/dist/detectors/code-before.js +15 -0
  118. package/dist/detectors/code-before.js.map +1 -0
  119. package/dist/detectors/connective-hierarchy.d.ts +11 -1
  120. package/dist/detectors/connective-hierarchy.d.ts.map +1 -1
  121. package/dist/detectors/connective-hierarchy.js +26 -6
  122. package/dist/detectors/connective-hierarchy.js.map +1 -1
  123. package/dist/detectors/currency-notation.d.ts +3 -1
  124. package/dist/detectors/currency-notation.d.ts.map +1 -1
  125. package/dist/detectors/currency-notation.js +4 -3
  126. package/dist/detectors/currency-notation.js.map +1 -1
  127. package/dist/detectors/date-outside-period.d.ts +4 -0
  128. package/dist/detectors/date-outside-period.d.ts.map +1 -0
  129. package/dist/detectors/date-outside-period.js +34 -0
  130. package/dist/detectors/date-outside-period.js.map +1 -0
  131. package/dist/detectors/default-values.d.ts +3 -0
  132. package/dist/detectors/default-values.d.ts.map +1 -0
  133. package/dist/detectors/default-values.js +14 -0
  134. package/dist/detectors/default-values.js.map +1 -0
  135. package/dist/detectors/defined-term-form.d.ts +6 -2
  136. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  137. package/dist/detectors/defined-term-form.js +72 -12
  138. package/dist/detectors/defined-term-form.js.map +1 -1
  139. package/dist/detectors/definition-use.d.ts.map +1 -1
  140. package/dist/detectors/definition-use.js +8 -1
  141. package/dist/detectors/definition-use.js.map +1 -1
  142. package/dist/detectors/deprecated-use.d.ts +3 -0
  143. package/dist/detectors/deprecated-use.d.ts.map +1 -0
  144. package/dist/detectors/deprecated-use.js +14 -0
  145. package/dist/detectors/deprecated-use.js.map +1 -0
  146. package/dist/detectors/derived-numbers.d.ts +1 -1
  147. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  148. package/dist/detectors/derived-numbers.js +79 -16
  149. package/dist/detectors/derived-numbers.js.map +1 -1
  150. package/dist/detectors/document-shape.d.ts +1 -0
  151. package/dist/detectors/document-shape.d.ts.map +1 -1
  152. package/dist/detectors/document-shape.js +4 -1
  153. package/dist/detectors/document-shape.js.map +1 -1
  154. package/dist/detectors/due-date.d.ts +3 -0
  155. package/dist/detectors/due-date.d.ts.map +1 -0
  156. package/dist/detectors/due-date.js +38 -0
  157. package/dist/detectors/due-date.js.map +1 -0
  158. package/dist/detectors/en-shape.d.ts.map +1 -1
  159. package/dist/detectors/en-shape.js +17 -9
  160. package/dist/detectors/en-shape.js.map +1 -1
  161. package/dist/detectors/fact-consistency.d.ts.map +1 -1
  162. package/dist/detectors/fact-consistency.js +89 -2
  163. package/dist/detectors/fact-consistency.js.map +1 -1
  164. package/dist/detectors/heading-echo.d.ts.map +1 -1
  165. package/dist/detectors/heading-echo.js +10 -1
  166. package/dist/detectors/heading-echo.js.map +1 -1
  167. package/dist/detectors/kana-function-word.d.ts +12 -0
  168. package/dist/detectors/kana-function-word.d.ts.map +1 -0
  169. package/dist/detectors/kana-function-word.js +59 -0
  170. package/dist/detectors/kana-function-word.js.map +1 -0
  171. package/dist/detectors/line-amount.d.ts +3 -0
  172. package/dist/detectors/line-amount.d.ts.map +1 -0
  173. package/dist/detectors/line-amount.js +22 -0
  174. package/dist/detectors/line-amount.js.map +1 -0
  175. package/dist/detectors/location-pointer.d.ts +6 -0
  176. package/dist/detectors/location-pointer.d.ts.map +1 -0
  177. package/dist/detectors/location-pointer.js +22 -0
  178. package/dist/detectors/location-pointer.js.map +1 -0
  179. package/dist/detectors/mark-shape.d.ts.map +1 -1
  180. package/dist/detectors/mark-shape.js +13 -1
  181. package/dist/detectors/mark-shape.js.map +1 -1
  182. package/dist/detectors/nado-closed-list.d.ts +3 -0
  183. package/dist/detectors/nado-closed-list.d.ts.map +1 -0
  184. package/dist/detectors/nado-closed-list.js +21 -0
  185. package/dist/detectors/nado-closed-list.js.map +1 -0
  186. package/dist/detectors/name-variant.d.ts.map +1 -1
  187. package/dist/detectors/name-variant.js +92 -10
  188. package/dist/detectors/name-variant.js.map +1 -1
  189. package/dist/detectors/next-word.d.ts.map +1 -1
  190. package/dist/detectors/next-word.js +41 -8
  191. package/dist/detectors/next-word.js.map +1 -1
  192. package/dist/detectors/number-word-figure.d.ts +5 -0
  193. package/dist/detectors/number-word-figure.d.ts.map +1 -0
  194. package/dist/detectors/number-word-figure.js +32 -0
  195. package/dist/detectors/number-word-figure.js.map +1 -0
  196. package/dist/detectors/obligation-without-deadline.d.ts +39 -0
  197. package/dist/detectors/obligation-without-deadline.d.ts.map +1 -0
  198. package/dist/detectors/obligation-without-deadline.js +148 -0
  199. package/dist/detectors/obligation-without-deadline.js.map +1 -0
  200. package/dist/detectors/open-end-names.d.ts +23 -0
  201. package/dist/detectors/open-end-names.d.ts.map +1 -0
  202. package/dist/detectors/open-end-names.js +95 -0
  203. package/dist/detectors/open-end-names.js.map +1 -0
  204. package/dist/detectors/ordinal-run-gaps.d.ts +8 -0
  205. package/dist/detectors/ordinal-run-gaps.d.ts.map +1 -0
  206. package/dist/detectors/ordinal-run-gaps.js +80 -0
  207. package/dist/detectors/ordinal-run-gaps.js.map +1 -0
  208. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  209. package/dist/detectors/orthographic-variant.js +26 -9
  210. package/dist/detectors/orthographic-variant.js.map +1 -1
  211. package/dist/detectors/orthography.d.ts.map +1 -1
  212. package/dist/detectors/orthography.js +5 -0
  213. package/dist/detectors/orthography.js.map +1 -1
  214. package/dist/detectors/parameter-table.d.ts +3 -0
  215. package/dist/detectors/parameter-table.d.ts.map +1 -0
  216. package/dist/detectors/parameter-table.js +16 -0
  217. package/dist/detectors/parameter-table.js.map +1 -0
  218. package/dist/detectors/phone-number-variant.d.ts +3 -0
  219. package/dist/detectors/phone-number-variant.d.ts.map +1 -0
  220. package/dist/detectors/phone-number-variant.js +18 -0
  221. package/dist/detectors/phone-number-variant.js.map +1 -0
  222. package/dist/detectors/prerequisite-order.d.ts +3 -0
  223. package/dist/detectors/prerequisite-order.d.ts.map +1 -0
  224. package/dist/detectors/prerequisite-order.js +30 -0
  225. package/dist/detectors/prerequisite-order.js.map +1 -0
  226. package/dist/detectors/quote-unnamed-speaker.d.ts +3 -0
  227. package/dist/detectors/quote-unnamed-speaker.d.ts.map +1 -0
  228. package/dist/detectors/quote-unnamed-speaker.js +18 -0
  229. package/dist/detectors/quote-unnamed-speaker.js.map +1 -0
  230. package/dist/detectors/quote-without-source.d.ts +12 -2
  231. package/dist/detectors/quote-without-source.d.ts.map +1 -1
  232. package/dist/detectors/quote-without-source.js +45 -11
  233. package/dist/detectors/quote-without-source.js.map +1 -1
  234. package/dist/detectors/registry/amount-range.d.ts +3 -0
  235. package/dist/detectors/registry/amount-range.d.ts.map +1 -0
  236. package/dist/detectors/registry/amount-range.js +3 -0
  237. package/dist/detectors/registry/amount-range.js.map +1 -0
  238. package/dist/detectors/registry/amount-scale.d.ts +3 -0
  239. package/dist/detectors/registry/amount-scale.d.ts.map +1 -0
  240. package/dist/detectors/registry/amount-scale.js +3 -0
  241. package/dist/detectors/registry/amount-scale.js.map +1 -0
  242. package/dist/detectors/registry/arrival-before-departure.d.ts +3 -0
  243. package/dist/detectors/registry/arrival-before-departure.d.ts.map +1 -0
  244. package/dist/detectors/registry/arrival-before-departure.js +3 -0
  245. package/dist/detectors/registry/arrival-before-departure.js.map +1 -0
  246. package/dist/detectors/registry/date-outside-period.d.ts +3 -0
  247. package/dist/detectors/registry/date-outside-period.d.ts.map +1 -0
  248. package/dist/detectors/registry/date-outside-period.js +3 -0
  249. package/dist/detectors/registry/date-outside-period.js.map +1 -0
  250. package/dist/detectors/registry/default-values.d.ts +3 -0
  251. package/dist/detectors/registry/default-values.d.ts.map +1 -0
  252. package/dist/detectors/registry/default-values.js +3 -0
  253. package/dist/detectors/registry/default-values.js.map +1 -0
  254. package/dist/detectors/registry/deprecated-use.d.ts +3 -0
  255. package/dist/detectors/registry/deprecated-use.d.ts.map +1 -0
  256. package/dist/detectors/registry/deprecated-use.js +3 -0
  257. package/dist/detectors/registry/deprecated-use.js.map +1 -0
  258. package/dist/detectors/registry/due-date.d.ts +3 -0
  259. package/dist/detectors/registry/due-date.d.ts.map +1 -0
  260. package/dist/detectors/registry/due-date.js +3 -0
  261. package/dist/detectors/registry/due-date.js.map +1 -0
  262. package/dist/detectors/registry/kana-function-word.d.ts +3 -0
  263. package/dist/detectors/registry/kana-function-word.d.ts.map +1 -0
  264. package/dist/detectors/registry/kana-function-word.js +3 -0
  265. package/dist/detectors/registry/kana-function-word.js.map +1 -0
  266. package/dist/detectors/registry/line-amount.d.ts +3 -0
  267. package/dist/detectors/registry/line-amount.d.ts.map +1 -0
  268. package/dist/detectors/registry/line-amount.js +3 -0
  269. package/dist/detectors/registry/line-amount.js.map +1 -0
  270. package/dist/detectors/registry/nado-closed-list.d.ts +3 -0
  271. package/dist/detectors/registry/nado-closed-list.d.ts.map +1 -0
  272. package/dist/detectors/registry/nado-closed-list.js +3 -0
  273. package/dist/detectors/registry/nado-closed-list.js.map +1 -0
  274. package/dist/detectors/registry/number-word-figure.d.ts +3 -0
  275. package/dist/detectors/registry/number-word-figure.d.ts.map +1 -0
  276. package/dist/detectors/registry/number-word-figure.js +3 -0
  277. package/dist/detectors/registry/number-word-figure.js.map +1 -0
  278. package/dist/detectors/registry/obligation-without-deadline.d.ts +3 -0
  279. package/dist/detectors/registry/obligation-without-deadline.d.ts.map +1 -0
  280. package/dist/detectors/registry/obligation-without-deadline.js +3 -0
  281. package/dist/detectors/registry/obligation-without-deadline.js.map +1 -0
  282. package/dist/detectors/registry/parameter-table.d.ts +3 -0
  283. package/dist/detectors/registry/parameter-table.d.ts.map +1 -0
  284. package/dist/detectors/registry/parameter-table.js +3 -0
  285. package/dist/detectors/registry/parameter-table.js.map +1 -0
  286. package/dist/detectors/registry/phone-number-variant.d.ts +3 -0
  287. package/dist/detectors/registry/phone-number-variant.d.ts.map +1 -0
  288. package/dist/detectors/registry/phone-number-variant.js +3 -0
  289. package/dist/detectors/registry/phone-number-variant.js.map +1 -0
  290. package/dist/detectors/registry/prerequisite-order.d.ts +3 -0
  291. package/dist/detectors/registry/prerequisite-order.d.ts.map +1 -0
  292. package/dist/detectors/registry/prerequisite-order.js +3 -0
  293. package/dist/detectors/registry/prerequisite-order.js.map +1 -0
  294. package/dist/detectors/registry/quote-unnamed-speaker.d.ts +3 -0
  295. package/dist/detectors/registry/quote-unnamed-speaker.d.ts.map +1 -0
  296. package/dist/detectors/registry/quote-unnamed-speaker.js +3 -0
  297. package/dist/detectors/registry/quote-unnamed-speaker.js.map +1 -0
  298. package/dist/detectors/registry/tax-amount.d.ts +3 -0
  299. package/dist/detectors/registry/tax-amount.d.ts.map +1 -0
  300. package/dist/detectors/registry/tax-amount.js +3 -0
  301. package/dist/detectors/registry/tax-amount.js.map +1 -0
  302. package/dist/detectors/registry/time-order.d.ts +3 -0
  303. package/dist/detectors/registry/time-order.d.ts.map +1 -0
  304. package/dist/detectors/registry/time-order.js +3 -0
  305. package/dist/detectors/registry/time-order.js.map +1 -0
  306. package/dist/detectors/registry/ui-label.d.ts +3 -0
  307. package/dist/detectors/registry/ui-label.d.ts.map +1 -0
  308. package/dist/detectors/registry/ui-label.js +3 -0
  309. package/dist/detectors/registry/ui-label.js.map +1 -0
  310. package/dist/detectors/registry/undefined-call.d.ts +3 -0
  311. package/dist/detectors/registry/undefined-call.d.ts.map +1 -0
  312. package/dist/detectors/registry/undefined-call.js +3 -0
  313. package/dist/detectors/registry/undefined-call.js.map +1 -0
  314. package/dist/detectors/registry/undefined-term.d.ts +3 -0
  315. package/dist/detectors/registry/undefined-term.d.ts.map +1 -0
  316. package/dist/detectors/registry/undefined-term.js +3 -0
  317. package/dist/detectors/registry/undefined-term.js.map +1 -0
  318. package/dist/detectors/registry/version-order.d.ts +3 -0
  319. package/dist/detectors/registry/version-order.d.ts.map +1 -0
  320. package/dist/detectors/registry/version-order.js +3 -0
  321. package/dist/detectors/registry/version-order.js.map +1 -0
  322. package/dist/detectors/registry/warning-action.d.ts +3 -0
  323. package/dist/detectors/registry/warning-action.d.ts.map +1 -0
  324. package/dist/detectors/registry/warning-action.js +3 -0
  325. package/dist/detectors/registry/warning-action.js.map +1 -0
  326. package/dist/detectors/requirement-smell.d.ts.map +1 -1
  327. package/dist/detectors/requirement-smell.js +25 -8
  328. package/dist/detectors/requirement-smell.js.map +1 -1
  329. package/dist/detectors/structure-tree.d.ts +12 -4
  330. package/dist/detectors/structure-tree.d.ts.map +1 -1
  331. package/dist/detectors/structure-tree.js +31 -14
  332. package/dist/detectors/structure-tree.js.map +1 -1
  333. package/dist/detectors/superlative-scope.d.ts.map +1 -1
  334. package/dist/detectors/superlative-scope.js +11 -1
  335. package/dist/detectors/superlative-scope.js.map +1 -1
  336. package/dist/detectors/tax-amount.d.ts +3 -0
  337. package/dist/detectors/tax-amount.d.ts.map +1 -0
  338. package/dist/detectors/tax-amount.js +19 -0
  339. package/dist/detectors/tax-amount.js.map +1 -0
  340. package/dist/detectors/technical-docs.d.ts.map +1 -1
  341. package/dist/detectors/technical-docs.js +5 -1
  342. package/dist/detectors/technical-docs.js.map +1 -1
  343. package/dist/detectors/term-extension.d.ts +14 -0
  344. package/dist/detectors/term-extension.d.ts.map +1 -0
  345. package/dist/detectors/term-extension.js +67 -0
  346. package/dist/detectors/term-extension.js.map +1 -0
  347. package/dist/detectors/time-order.d.ts +4 -0
  348. package/dist/detectors/time-order.d.ts.map +1 -0
  349. package/dist/detectors/time-order.js +32 -0
  350. package/dist/detectors/time-order.js.map +1 -0
  351. package/dist/detectors/ui-label.d.ts +3 -0
  352. package/dist/detectors/ui-label.d.ts.map +1 -0
  353. package/dist/detectors/ui-label.js +16 -0
  354. package/dist/detectors/ui-label.js.map +1 -0
  355. package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
  356. package/dist/detectors/unbalanced-bracket.js +8 -13
  357. package/dist/detectors/unbalanced-bracket.js.map +1 -1
  358. package/dist/detectors/undefined-call.d.ts +3 -0
  359. package/dist/detectors/undefined-call.d.ts.map +1 -0
  360. package/dist/detectors/undefined-call.js +18 -0
  361. package/dist/detectors/undefined-call.js.map +1 -0
  362. package/dist/detectors/undefined-term.d.ts +22 -0
  363. package/dist/detectors/undefined-term.d.ts.map +1 -0
  364. package/dist/detectors/undefined-term.js +85 -0
  365. package/dist/detectors/undefined-term.js.map +1 -0
  366. package/dist/detectors/unknown-word.d.ts +1 -1
  367. package/dist/detectors/unknown-word.js +3 -3
  368. package/dist/detectors/unknown-word.js.map +1 -1
  369. package/dist/detectors/vague-deadline.d.ts +4 -0
  370. package/dist/detectors/vague-deadline.d.ts.map +1 -1
  371. package/dist/detectors/vague-deadline.js +3 -3
  372. package/dist/detectors/vague-deadline.js.map +1 -1
  373. package/dist/detectors/version-mismatch.d.ts.map +1 -1
  374. package/dist/detectors/version-mismatch.js +18 -1
  375. package/dist/detectors/version-mismatch.js.map +1 -1
  376. package/dist/detectors/version-order.d.ts +3 -0
  377. package/dist/detectors/version-order.d.ts.map +1 -0
  378. package/dist/detectors/version-order.js +43 -0
  379. package/dist/detectors/version-order.js.map +1 -0
  380. package/dist/detectors/warning-action.d.ts +3 -0
  381. package/dist/detectors/warning-action.d.ts.map +1 -0
  382. package/dist/detectors/warning-action.js +48 -0
  383. package/dist/detectors/warning-action.js.map +1 -0
  384. package/dist/facts/condition-pairs.d.ts +51 -0
  385. package/dist/facts/condition-pairs.d.ts.map +1 -0
  386. package/dist/facts/condition-pairs.js +203 -0
  387. package/dist/facts/condition-pairs.js.map +1 -0
  388. package/dist/facts/counted-facts.d.ts +16 -0
  389. package/dist/facts/counted-facts.d.ts.map +1 -0
  390. package/dist/facts/counted-facts.js +45 -0
  391. package/dist/facts/counted-facts.js.map +1 -0
  392. package/dist/facts/event-dates.d.ts +26 -0
  393. package/dist/facts/event-dates.d.ts.map +1 -0
  394. package/dist/facts/event-dates.js +38 -0
  395. package/dist/facts/event-dates.js.map +1 -0
  396. package/dist/facts/fact-scope.d.ts +2 -0
  397. package/dist/facts/fact-scope.d.ts.map +1 -1
  398. package/dist/facts/fact-scope.js +5 -0
  399. package/dist/facts/fact-scope.js.map +1 -1
  400. package/dist/facts/labelled-facts.d.ts +2 -0
  401. package/dist/facts/labelled-facts.d.ts.map +1 -1
  402. package/dist/facts/labelled-facts.js +9 -1
  403. package/dist/facts/labelled-facts.js.map +1 -1
  404. package/dist/facts/table-facts.d.ts +16 -0
  405. package/dist/facts/table-facts.d.ts.map +1 -1
  406. package/dist/facts/table-facts.js +2 -2
  407. package/dist/facts/table-facts.js.map +1 -1
  408. package/dist/grade/ai-score.d.ts +1 -1
  409. package/dist/grade/ai-score.d.ts.map +1 -1
  410. package/dist/grade/text.js +2 -2
  411. package/dist/grade/text.js.map +1 -1
  412. package/dist/heading-numbering.js +2 -2
  413. package/dist/heading-numbering.js.map +1 -1
  414. package/dist/html/fetch-page.d.ts +20 -0
  415. package/dist/html/fetch-page.d.ts.map +1 -0
  416. package/dist/html/fetch-page.js +51 -0
  417. package/dist/html/fetch-page.js.map +1 -0
  418. package/dist/html/fetched-text.d.ts +5 -0
  419. package/dist/html/fetched-text.d.ts.map +1 -0
  420. package/dist/html/fetched-text.js +25 -0
  421. package/dist/html/fetched-text.js.map +1 -0
  422. package/dist/html/html-content-block.d.ts +6 -0
  423. package/dist/html/html-content-block.d.ts.map +1 -0
  424. package/dist/html/html-content-block.js +86 -0
  425. package/dist/html/html-content-block.js.map +1 -0
  426. package/dist/html/html-elements.d.ts +41 -0
  427. package/dist/html/html-elements.d.ts.map +1 -0
  428. package/dist/html/html-elements.js +91 -0
  429. package/dist/html/html-elements.js.map +1 -0
  430. package/dist/html/html-footnote-marks.d.ts +2 -0
  431. package/dist/html/html-footnote-marks.d.ts.map +1 -0
  432. package/dist/html/html-footnote-marks.js +15 -0
  433. package/dist/html/html-footnote-marks.js.map +1 -0
  434. package/dist/html/html-heading-links.d.ts +6 -0
  435. package/dist/html/html-heading-links.d.ts.map +1 -0
  436. package/dist/html/html-heading-links.js +71 -0
  437. package/dist/html/html-heading-links.js.map +1 -0
  438. package/dist/html/html-lost-tags.d.ts +3 -0
  439. package/dist/html/html-lost-tags.d.ts.map +1 -0
  440. package/dist/html/html-lost-tags.js +11 -0
  441. package/dist/html/html-lost-tags.js.map +1 -0
  442. package/dist/html/html-markdown.d.ts +2 -0
  443. package/dist/html/html-markdown.d.ts.map +1 -0
  444. package/dist/html/html-markdown.js +347 -0
  445. package/dist/html/html-markdown.js.map +1 -0
  446. package/dist/html/html-preformatted.d.ts +17 -0
  447. package/dist/html/html-preformatted.d.ts.map +1 -0
  448. package/dist/html/html-preformatted.js +82 -0
  449. package/dist/html/html-preformatted.js.map +1 -0
  450. package/dist/html/html-reader-only.d.ts +6 -0
  451. package/dist/html/html-reader-only.d.ts.map +1 -0
  452. package/dist/html/html-reader-only.js +63 -0
  453. package/dist/html/html-reader-only.js.map +1 -0
  454. package/dist/html/html-run-in-headings.d.ts +2 -0
  455. package/dist/html/html-run-in-headings.d.ts.map +1 -0
  456. package/dist/html/html-run-in-headings.js +36 -0
  457. package/dist/html/html-run-in-headings.js.map +1 -0
  458. package/dist/html/html-tables.d.ts +3 -0
  459. package/dist/html/html-tables.d.ts.map +1 -0
  460. package/dist/html/html-tables.js +58 -0
  461. package/dist/html/html-tables.js.map +1 -0
  462. package/dist/html/html-widgets.d.ts +3 -0
  463. package/dist/html/html-widgets.d.ts.map +1 -0
  464. package/dist/html/html-widgets.js +71 -0
  465. package/dist/html/html-widgets.js.map +1 -0
  466. package/dist/html/markup-text.d.ts +5 -0
  467. package/dist/html/markup-text.d.ts.map +1 -0
  468. package/dist/html/markup-text.js +32 -0
  469. package/dist/html/markup-text.js.map +1 -0
  470. package/dist/html/page-document.d.ts +9 -0
  471. package/dist/html/page-document.d.ts.map +1 -0
  472. package/dist/html/page-document.js +19 -0
  473. package/dist/html/page-document.js.map +1 -0
  474. package/dist/inline-count.d.ts +19 -0
  475. package/dist/inline-count.d.ts.map +1 -0
  476. package/dist/inline-count.js +109 -0
  477. package/dist/inline-count.js.map +1 -0
  478. package/dist/kana-spelling.d.ts +5 -0
  479. package/dist/kana-spelling.d.ts.map +1 -1
  480. package/dist/kana-spelling.js +5 -0
  481. package/dist/kana-spelling.js.map +1 -1
  482. package/dist/location-part.d.ts +13 -0
  483. package/dist/location-part.d.ts.map +1 -0
  484. package/dist/location-part.js +24 -0
  485. package/dist/location-part.js.map +1 -0
  486. package/dist/nado-closed-list.d.ts +20 -0
  487. package/dist/nado-closed-list.d.ts.map +1 -0
  488. package/dist/nado-closed-list.js +72 -0
  489. package/dist/nado-closed-list.js.map +1 -0
  490. package/dist/name-cue.d.ts +17 -0
  491. package/dist/name-cue.d.ts.map +1 -0
  492. package/dist/name-cue.js +29 -0
  493. package/dist/name-cue.js.map +1 -0
  494. package/dist/name-variants.d.ts +41 -5
  495. package/dist/name-variants.d.ts.map +1 -1
  496. package/dist/name-variants.js +93 -8
  497. package/dist/name-variants.js.map +1 -1
  498. package/dist/paragraph-runs.d.ts +6 -1
  499. package/dist/paragraph-runs.d.ts.map +1 -1
  500. package/dist/paragraph-runs.js +9 -2
  501. package/dist/paragraph-runs.js.map +1 -1
  502. package/dist/parameter-table.d.ts +19 -0
  503. package/dist/parameter-table.d.ts.map +1 -0
  504. package/dist/parameter-table.js +191 -0
  505. package/dist/parameter-table.js.map +1 -0
  506. package/dist/phone-numbers.d.ts +23 -0
  507. package/dist/phone-numbers.d.ts.map +1 -0
  508. package/dist/phone-numbers.js +83 -0
  509. package/dist/phone-numbers.js.map +1 -0
  510. package/dist/place-names.d.ts +55 -0
  511. package/dist/place-names.d.ts.map +1 -0
  512. package/dist/place-names.js +196 -0
  513. package/dist/place-names.js.map +1 -0
  514. package/dist/plugin.d.ts +4 -0
  515. package/dist/plugin.d.ts.map +1 -1
  516. package/dist/prerequisite-order.d.ts +16 -0
  517. package/dist/prerequisite-order.d.ts.map +1 -0
  518. package/dist/prerequisite-order.js +29 -0
  519. package/dist/prerequisite-order.js.map +1 -0
  520. package/dist/profile/parse.d.ts.map +1 -1
  521. package/dist/profile/parse.js +10 -1
  522. package/dist/profile/parse.js.map +1 -1
  523. package/dist/reasons.d.ts +2 -0
  524. package/dist/reasons.d.ts.map +1 -1
  525. package/dist/reasons.js +2 -0
  526. package/dist/reasons.js.map +1 -1
  527. package/dist/render/rules-json.d.ts.map +1 -1
  528. package/dist/render/rules-json.js +4 -0
  529. package/dist/render/rules-json.js.map +1 -1
  530. package/dist/render/rules-table.d.ts.map +1 -1
  531. package/dist/render/rules-table.js +6 -2
  532. package/dist/render/rules-table.js.map +1 -1
  533. package/dist/rule-genres.d.ts +5 -2
  534. package/dist/rule-genres.d.ts.map +1 -1
  535. package/dist/rule-genres.js +2 -0
  536. package/dist/rule-genres.js.map +1 -1
  537. package/dist/rule-load.d.ts.map +1 -1
  538. package/dist/rule-load.js +2 -1
  539. package/dist/rule-load.js.map +1 -1
  540. package/dist/run.d.ts.map +1 -1
  541. package/dist/run.js +5 -1
  542. package/dist/run.js.map +1 -1
  543. package/dist/spelling.d.ts +2 -0
  544. package/dist/spelling.d.ts.map +1 -1
  545. package/dist/spelling.js +6 -0
  546. package/dist/spelling.js.map +1 -1
  547. package/dist/structure/action-due.d.ts +21 -0
  548. package/dist/structure/action-due.d.ts.map +1 -0
  549. package/dist/structure/action-due.js +126 -0
  550. package/dist/structure/action-due.js.map +1 -0
  551. package/dist/structure/amount-range.d.ts +30 -0
  552. package/dist/structure/amount-range.d.ts.map +1 -0
  553. package/dist/structure/amount-range.js +153 -0
  554. package/dist/structure/amount-range.js.map +1 -0
  555. package/dist/structure/amount-scale.d.ts +35 -0
  556. package/dist/structure/amount-scale.d.ts.map +1 -0
  557. package/dist/structure/amount-scale.js +83 -0
  558. package/dist/structure/amount-scale.js.map +1 -0
  559. package/dist/structure/cite.d.ts +5 -2
  560. package/dist/structure/cite.d.ts.map +1 -1
  561. package/dist/structure/cite.js +20 -1
  562. package/dist/structure/cite.js.map +1 -1
  563. package/dist/structure/counted-amounts.d.ts +12 -0
  564. package/dist/structure/counted-amounts.d.ts.map +1 -0
  565. package/dist/structure/counted-amounts.js +30 -0
  566. package/dist/structure/counted-amounts.js.map +1 -0
  567. package/dist/structure/date-order.d.ts +24 -3
  568. package/dist/structure/date-order.d.ts.map +1 -1
  569. package/dist/structure/date-order.js +49 -17
  570. package/dist/structure/date-order.js.map +1 -1
  571. package/dist/structure/date-outside-period.d.ts +27 -0
  572. package/dist/structure/date-outside-period.d.ts.map +1 -0
  573. package/dist/structure/date-outside-period.js +86 -0
  574. package/dist/structure/date-outside-period.js.map +1 -0
  575. package/dist/structure/definition-use.d.ts +5 -2
  576. package/dist/structure/definition-use.d.ts.map +1 -1
  577. package/dist/structure/definition-use.js +11 -3
  578. package/dist/structure/definition-use.js.map +1 -1
  579. package/dist/structure/due-date.d.ts +19 -0
  580. package/dist/structure/due-date.d.ts.map +1 -0
  581. package/dist/structure/due-date.js +30 -0
  582. package/dist/structure/due-date.js.map +1 -0
  583. package/dist/structure/heading-runs.d.ts +9 -0
  584. package/dist/structure/heading-runs.d.ts.map +1 -0
  585. package/dist/structure/heading-runs.js +23 -0
  586. package/dist/structure/heading-runs.js.map +1 -0
  587. package/dist/structure/install-pin.d.ts +46 -0
  588. package/dist/structure/install-pin.d.ts.map +1 -0
  589. package/dist/structure/install-pin.js +85 -0
  590. package/dist/structure/install-pin.js.map +1 -0
  591. package/dist/structure/leg-times.d.ts +34 -0
  592. package/dist/structure/leg-times.d.ts.map +1 -0
  593. package/dist/structure/leg-times.js +135 -0
  594. package/dist/structure/leg-times.js.map +1 -0
  595. package/dist/structure/line-amount-unit.d.ts +24 -0
  596. package/dist/structure/line-amount-unit.d.ts.map +1 -0
  597. package/dist/structure/line-amount-unit.js +24 -0
  598. package/dist/structure/line-amount-unit.js.map +1 -0
  599. package/dist/structure/line-amount.d.ts +40 -0
  600. package/dist/structure/line-amount.d.ts.map +1 -0
  601. package/dist/structure/line-amount.js +118 -0
  602. package/dist/structure/line-amount.js.map +1 -0
  603. package/dist/structure/number-word-figure.d.ts +37 -0
  604. package/dist/structure/number-word-figure.d.ts.map +1 -0
  605. package/dist/structure/number-word-figure.js +151 -0
  606. package/dist/structure/number-word-figure.js.map +1 -0
  607. package/dist/structure/numbering.d.ts +1 -0
  608. package/dist/structure/numbering.d.ts.map +1 -1
  609. package/dist/structure/numbering.js +3 -0
  610. package/dist/structure/numbering.js.map +1 -1
  611. package/dist/structure/ordinal-runs.d.ts +45 -0
  612. package/dist/structure/ordinal-runs.d.ts.map +1 -0
  613. package/dist/structure/ordinal-runs.js +78 -0
  614. package/dist/structure/ordinal-runs.js.map +1 -0
  615. package/dist/structure/percent-sum-prose.d.ts +1 -1
  616. package/dist/structure/percent-sum-prose.d.ts.map +1 -1
  617. package/dist/structure/percent-sum-prose.js +45 -3
  618. package/dist/structure/percent-sum-prose.js.map +1 -1
  619. package/dist/structure/percent-sum.d.ts +8 -0
  620. package/dist/structure/percent-sum.d.ts.map +1 -1
  621. package/dist/structure/percent-sum.js +8 -1
  622. package/dist/structure/percent-sum.js.map +1 -1
  623. package/dist/structure/release-list.d.ts +9 -0
  624. package/dist/structure/release-list.d.ts.map +1 -0
  625. package/dist/structure/release-list.js +46 -0
  626. package/dist/structure/release-list.js.map +1 -0
  627. package/dist/structure/share-column.d.ts +7 -0
  628. package/dist/structure/share-column.d.ts.map +1 -0
  629. package/dist/structure/share-column.js +22 -0
  630. package/dist/structure/share-column.js.map +1 -0
  631. package/dist/structure/stated-period.d.ts +31 -0
  632. package/dist/structure/stated-period.d.ts.map +1 -0
  633. package/dist/structure/stated-period.js +127 -0
  634. package/dist/structure/stated-period.js.map +1 -0
  635. package/dist/structure/subject-change.d.ts +8 -0
  636. package/dist/structure/subject-change.d.ts.map +1 -0
  637. package/dist/structure/subject-change.js +31 -0
  638. package/dist/structure/subject-change.js.map +1 -0
  639. package/dist/structure/tax.d.ts +25 -0
  640. package/dist/structure/tax.d.ts.map +1 -0
  641. package/dist/structure/tax.js +86 -0
  642. package/dist/structure/tax.js.map +1 -0
  643. package/dist/structure/time-marks.d.ts +58 -0
  644. package/dist/structure/time-marks.d.ts.map +1 -0
  645. package/dist/structure/time-marks.js +74 -0
  646. package/dist/structure/time-marks.js.map +1 -0
  647. package/dist/structure/time-order.d.ts +21 -0
  648. package/dist/structure/time-order.d.ts.map +1 -0
  649. package/dist/structure/time-order.js +108 -0
  650. package/dist/structure/time-order.js.map +1 -0
  651. package/dist/structure/title-lines.d.ts +8 -0
  652. package/dist/structure/title-lines.d.ts.map +1 -0
  653. package/dist/structure/title-lines.js +27 -0
  654. package/dist/structure/title-lines.js.map +1 -0
  655. package/dist/structure/total.d.ts.map +1 -1
  656. package/dist/structure/total.js +3 -1
  657. package/dist/structure/total.js.map +1 -1
  658. package/dist/structure/version-mismatch.d.ts +1 -5
  659. package/dist/structure/version-mismatch.d.ts.map +1 -1
  660. package/dist/structure/version-mismatch.js +65 -12
  661. package/dist/structure/version-mismatch.js.map +1 -1
  662. package/dist/structure/version-order.d.ts +23 -0
  663. package/dist/structure/version-order.d.ts.map +1 -0
  664. package/dist/structure/version-order.js +67 -0
  665. package/dist/structure/version-order.js.map +1 -0
  666. package/dist/table-text.d.ts +9 -0
  667. package/dist/table-text.d.ts.map +1 -0
  668. package/dist/table-text.js +36 -0
  669. package/dist/table-text.js.map +1 -0
  670. package/dist/ui-labels.d.ts +16 -0
  671. package/dist/ui-labels.d.ts.map +1 -0
  672. package/dist/ui-labels.js +42 -0
  673. package/dist/ui-labels.js.map +1 -0
  674. package/dist/undefined-call.d.ts +13 -0
  675. package/dist/undefined-call.d.ts.map +1 -0
  676. package/dist/undefined-call.js +55 -0
  677. package/dist/undefined-call.js.map +1 -0
  678. package/dist/unnamed-speaker.d.ts +23 -0
  679. package/dist/unnamed-speaker.d.ts.map +1 -0
  680. package/dist/unnamed-speaker.js +176 -0
  681. package/dist/unnamed-speaker.js.map +1 -0
  682. package/dist/warning-action.d.ts +22 -0
  683. package/dist/warning-action.d.ts.map +1 -0
  684. package/dist/warning-action.js +58 -0
  685. package/dist/warning-action.js.map +1 -0
  686. package/genres.yaml +2 -0
  687. package/package.json +4 -3
  688. package/profiles/statute.yaml +8 -0
  689. package/rules/agreement-slip.yaml +2 -2
  690. package/rules/amount-range-reversed.yaml +52 -0
  691. package/rules/amount-scale-consistency.yaml +74 -0
  692. package/rules/announced-count-mismatch.yaml +9 -4
  693. package/rules/arrival-before-departure.yaml +48 -0
  694. package/rules/change-rate-mismatch.yaml +5 -4
  695. package/rules/connective-hierarchy.yaml +3 -3
  696. package/rules/currency-notation-consistency.yaml +2 -2
  697. package/rules/date-order.yaml +9 -4
  698. package/rules/date-outside-period.yaml +64 -0
  699. package/rules/default-value-mismatch.yaml +79 -0
  700. package/rules/defined-term-form.yaml +9 -7
  701. package/rules/deprecated-option-used.yaml +78 -0
  702. package/rules/doubled-nado.yaml +28 -12
  703. package/rules/due-before-issue.yaml +68 -0
  704. package/rules/duplicate-definition.yaml +2 -2
  705. package/rules/duration-mismatch.yaml +12 -4
  706. package/rules/elapsed-years-mismatch.yaml +2 -2
  707. package/rules/heading-echo.yaml +2 -2
  708. package/rules/hyphen-as-dash.yaml +2 -2
  709. package/rules/kana-function-word.yaml +58 -0
  710. package/rules/latin-spacing.yaml +6 -5
  711. package/rules/line-amount-mismatch.yaml +58 -0
  712. package/rules/nado-closed-list.yaml +77 -0
  713. package/rules/name-variant.yaml +17 -2
  714. package/rules/number-word-figure-mismatch.yaml +76 -0
  715. package/rules/numbering-gap.yaml +2 -2
  716. package/rules/obligation-without-deadline.yaml +95 -0
  717. package/rules/one-sentence-paragraph-run.yaml +2 -3
  718. package/rules/parameter-table-mismatch.yaml +90 -0
  719. package/rules/percent-sum-mismatch.yaml +2 -2
  720. package/rules/phone-number-variant.yaml +68 -0
  721. package/rules/prerequisite-after-step.yaml +78 -0
  722. package/rules/quote-unnamed-speaker.yaml +67 -0
  723. package/rules/quote-without-source.yaml +6 -6
  724. package/rules/requirement-smell.yaml +3 -3
  725. package/rules/sentence-initial-conjunction-run.yaml +13 -7
  726. package/rules/summary-fact-mismatch.yaml +4 -4
  727. package/rules/tax-mismatch.yaml +71 -0
  728. package/rules/time-order.yaml +65 -0
  729. package/rules/title-length.yaml +2 -2
  730. package/rules/ui-label-variant.yaml +70 -0
  731. package/rules/unbalanced-bracket.yaml +4 -4
  732. package/rules/uncomparable-graded.yaml +29 -10
  733. package/rules/undefined-function-call.yaml +77 -0
  734. package/rules/undefined-term.yaml +72 -0
  735. package/rules/unknown-word.yaml +2 -2
  736. package/rules/unqualified-superlative.yaml +2 -2
  737. package/rules/use-before-definition.yaml +2 -2
  738. package/rules/version-mismatch.yaml +12 -4
  739. package/rules/version-order.yaml +85 -0
  740. package/rules/very-adjective.yaml +31 -13
  741. package/rules/warning-without-action.yaml +64 -0
  742. package/rules/wordy-phrase.yaml +27 -9
  743. package/src/ai-score/of-document.ts +19 -9
  744. package/src/ai-score/render.ts +24 -4
  745. package/src/ai-score/score.ts +24 -3
  746. package/src/ai-score/signals.ts +12 -2
  747. package/src/ai-score/text.ts +7 -2
  748. package/src/announced-count.ts +19 -12
  749. package/src/check-source.ts +11 -2
  750. package/src/cli-text.ts +42 -18
  751. package/src/cli.ts +2 -1
  752. package/src/commands/cite-claims.ts +103 -0
  753. package/src/commands/cite-page.ts +61 -0
  754. package/src/commands/cite-scaffold.ts +27 -0
  755. package/src/commands/cite.ts +127 -58
  756. package/src/company-names.ts +202 -0
  757. package/src/default-values.ts +158 -0
  758. package/src/deprecated-use.ts +122 -0
  759. package/src/derived/number-word-counts.ts +28 -0
  760. package/src/derived/stays.ts +145 -0
  761. package/src/detectors/acronym-context.ts +10 -2
  762. package/src/detectors/address-word.ts +9 -0
  763. package/src/detectors/agreement-slip.ts +7 -1
  764. package/src/detectors/ai-phrasing.ts +6 -1
  765. package/src/detectors/amount-range.ts +54 -0
  766. package/src/detectors/amount-scale.ts +96 -0
  767. package/src/detectors/announced-count.ts +29 -11
  768. package/src/detectors/bare-comparative.ts +7 -2
  769. package/src/detectors/block-quotation.ts +95 -0
  770. package/src/detectors/bracket-label.ts +58 -0
  771. package/src/detectors/change-rate.ts +15 -2
  772. package/src/detectors/citation-entry.ts +20 -5
  773. package/src/detectors/code-before.ts +14 -0
  774. package/src/detectors/connective-hierarchy.ts +39 -11
  775. package/src/detectors/currency-notation.ts +4 -3
  776. package/src/detectors/date-outside-period.ts +38 -0
  777. package/src/detectors/default-values.ts +17 -0
  778. package/src/detectors/defined-term-form.ts +84 -15
  779. package/src/detectors/definition-use.ts +10 -2
  780. package/src/detectors/deprecated-use.ts +17 -0
  781. package/src/detectors/derived-numbers.ts +115 -17
  782. package/src/detectors/document-shape.ts +6 -1
  783. package/src/detectors/due-date.ts +47 -0
  784. package/src/detectors/en-shape.ts +27 -11
  785. package/src/detectors/fact-consistency.ts +110 -2
  786. package/src/detectors/heading-echo.ts +11 -1
  787. package/src/detectors/kana-function-word.ts +71 -0
  788. package/src/detectors/line-amount.ts +33 -0
  789. package/src/detectors/location-pointer.ts +30 -0
  790. package/src/detectors/mark-shape.ts +18 -1
  791. package/src/detectors/nado-closed-list.ts +25 -0
  792. package/src/detectors/name-variant.ts +114 -11
  793. package/src/detectors/next-word.ts +56 -9
  794. package/src/detectors/number-word-figure.ts +43 -0
  795. package/src/detectors/obligation-without-deadline.ts +192 -0
  796. package/src/detectors/open-end-names.ts +140 -0
  797. package/src/detectors/ordinal-run-gaps.ts +101 -0
  798. package/src/detectors/orthographic-variant.ts +39 -14
  799. package/src/detectors/orthography.ts +6 -1
  800. package/src/detectors/parameter-table.ts +17 -0
  801. package/src/detectors/phone-number-variant.ts +18 -0
  802. package/src/detectors/prerequisite-order.ts +35 -0
  803. package/src/detectors/quote-unnamed-speaker.ts +19 -0
  804. package/src/detectors/quote-without-source.ts +57 -10
  805. package/src/detectors/registry/amount-range.ts +4 -0
  806. package/src/detectors/registry/amount-scale.ts +4 -0
  807. package/src/detectors/registry/arrival-before-departure.ts +4 -0
  808. package/src/detectors/registry/date-outside-period.ts +4 -0
  809. package/src/detectors/registry/default-values.ts +4 -0
  810. package/src/detectors/registry/deprecated-use.ts +4 -0
  811. package/src/detectors/registry/due-date.ts +4 -0
  812. package/src/detectors/registry/kana-function-word.ts +4 -0
  813. package/src/detectors/registry/line-amount.ts +4 -0
  814. package/src/detectors/registry/nado-closed-list.ts +4 -0
  815. package/src/detectors/registry/number-word-figure.ts +4 -0
  816. package/src/detectors/registry/obligation-without-deadline.ts +4 -0
  817. package/src/detectors/registry/parameter-table.ts +4 -0
  818. package/src/detectors/registry/phone-number-variant.ts +4 -0
  819. package/src/detectors/registry/prerequisite-order.ts +4 -0
  820. package/src/detectors/registry/quote-unnamed-speaker.ts +4 -0
  821. package/src/detectors/registry/tax-amount.ts +4 -0
  822. package/src/detectors/registry/time-order.ts +4 -0
  823. package/src/detectors/registry/ui-label.ts +4 -0
  824. package/src/detectors/registry/undefined-call.ts +4 -0
  825. package/src/detectors/registry/undefined-term.ts +4 -0
  826. package/src/detectors/registry/version-order.ts +4 -0
  827. package/src/detectors/registry/warning-action.ts +4 -0
  828. package/src/detectors/requirement-smell.ts +29 -9
  829. package/src/detectors/structure-tree.ts +43 -21
  830. package/src/detectors/superlative-scope.ts +13 -1
  831. package/src/detectors/tax-amount.ts +25 -0
  832. package/src/detectors/technical-docs.ts +7 -1
  833. package/src/detectors/term-extension.ts +67 -0
  834. package/src/detectors/time-order.ts +49 -0
  835. package/src/detectors/ui-label.ts +17 -0
  836. package/src/detectors/unbalanced-bracket.ts +7 -14
  837. package/src/detectors/undefined-call.ts +19 -0
  838. package/src/detectors/undefined-term.ts +103 -0
  839. package/src/detectors/unknown-word.ts +3 -3
  840. package/src/detectors/vague-deadline.ts +3 -3
  841. package/src/detectors/version-mismatch.ts +26 -5
  842. package/src/detectors/version-order.ts +50 -0
  843. package/src/detectors/warning-action.ts +49 -0
  844. package/src/facts/condition-pairs.ts +289 -0
  845. package/src/facts/counted-facts.ts +59 -0
  846. package/src/facts/event-dates.ts +63 -0
  847. package/src/facts/fact-scope.ts +6 -0
  848. package/src/facts/labelled-facts.ts +13 -1
  849. package/src/facts/table-facts.ts +3 -3
  850. package/src/grade/ai-score.ts +1 -1
  851. package/src/grade/text.ts +2 -2
  852. package/src/heading-numbering.ts +2 -2
  853. package/src/html/fetch-page.ts +64 -0
  854. package/src/html/fetched-text.ts +32 -0
  855. package/src/html/html-content-block.ts +107 -0
  856. package/src/html/html-elements.ts +127 -0
  857. package/src/html/html-footnote-marks.ts +20 -0
  858. package/src/html/html-heading-links.ts +93 -0
  859. package/src/html/html-lost-tags.ts +14 -0
  860. package/src/html/html-markdown.ts +481 -0
  861. package/src/html/html-preformatted.ts +110 -0
  862. package/src/html/html-reader-only.ts +82 -0
  863. package/src/html/html-run-in-headings.ts +43 -0
  864. package/src/html/html-tables.ts +76 -0
  865. package/src/html/html-widgets.ts +114 -0
  866. package/src/html/markup-text.ts +35 -0
  867. package/src/html/page-document.ts +22 -0
  868. package/src/inline-count.ts +146 -0
  869. package/src/kana-spelling.ts +7 -0
  870. package/src/location-part.ts +30 -0
  871. package/src/nado-closed-list.ts +106 -0
  872. package/src/name-cue.ts +35 -0
  873. package/src/name-variants.ts +152 -11
  874. package/src/paragraph-runs.ts +12 -2
  875. package/src/parameter-table.ts +208 -0
  876. package/src/phone-numbers.ts +98 -0
  877. package/src/place-names.ts +248 -0
  878. package/src/plugin.ts +4 -0
  879. package/src/prerequisite-order.ts +39 -0
  880. package/src/profile/parse.ts +10 -1
  881. package/src/reasons.ts +4 -0
  882. package/src/render/rules-json.ts +4 -0
  883. package/src/render/rules-table.ts +6 -3
  884. package/src/rule-genres.ts +5 -2
  885. package/src/rule-load.ts +3 -2
  886. package/src/run.ts +3 -1
  887. package/src/spelling.ts +8 -0
  888. package/src/structure/action-due.ts +179 -0
  889. package/src/structure/amount-range.ts +219 -0
  890. package/src/structure/amount-scale.ts +115 -0
  891. package/src/structure/cite.ts +21 -2
  892. package/src/structure/counted-amounts.ts +42 -0
  893. package/src/structure/date-order.ts +72 -22
  894. package/src/structure/date-outside-period.ts +127 -0
  895. package/src/structure/definition-use.ts +24 -3
  896. package/src/structure/due-date.ts +46 -0
  897. package/src/structure/heading-runs.ts +24 -0
  898. package/src/structure/install-pin.ts +115 -0
  899. package/src/structure/leg-times.ts +198 -0
  900. package/src/structure/line-amount-unit.ts +35 -0
  901. package/src/structure/line-amount.ts +162 -0
  902. package/src/structure/number-word-figure.ts +199 -0
  903. package/src/structure/numbering.ts +3 -0
  904. package/src/structure/ordinal-runs.ts +107 -0
  905. package/src/structure/percent-sum-prose.ts +46 -3
  906. package/src/structure/percent-sum.ts +16 -2
  907. package/src/structure/release-list.ts +69 -0
  908. package/src/structure/share-column.ts +25 -0
  909. package/src/structure/stated-period.ts +161 -0
  910. package/src/structure/subject-change.ts +35 -0
  911. package/src/structure/tax.ts +114 -0
  912. package/src/structure/time-marks.ts +127 -0
  913. package/src/structure/time-order.ts +140 -0
  914. package/src/structure/title-lines.ts +33 -0
  915. package/src/structure/total.ts +5 -1
  916. package/src/structure/version-mismatch.ts +67 -13
  917. package/src/structure/version-order.ts +84 -0
  918. package/src/table-text.ts +39 -0
  919. package/src/ui-labels.ts +55 -0
  920. package/src/undefined-call.ts +65 -0
  921. package/src/unnamed-speaker.ts +224 -0
  922. package/src/warning-action.ts +73 -0
  923. package/styles/koyobun.yaml +7 -4
@@ -9,8 +9,8 @@ import { seriesLabelSpans } from "./series-label.ts";
9
9
 
10
10
  /**
11
11
  * 大文字の語が略語ではなく、決まった書き方の一部として読める所(3:30 PM、1pm ET、USD 1,000、Kansas City, MO 64108)。
12
- * どれも閉じた集合で、しかも隣の数字があるときだけ認める。PM(project manager)、CT、CA(certificate authority)は
13
- * 数字の隣でなければ略語のまま数える。語は言語パッケージの語彙表から読み、書き方の組み立てだけをここに置く。
12
+ * どれも閉じた集合で、しかも隣の数字(州は地名でもよい)があるときだけ認める。PM(project manager)、CT、CA(certificate authority)は
13
+ * その隣でなければ略語のまま数える。語は言語パッケージの語彙表から読み、書き方の組み立てだけをここに置く。
14
14
  */
15
15
 
16
16
  type Span = { readonly start: number; readonly end: number };
@@ -75,6 +75,13 @@ const titledName = (titles: string): readonly RegExp[] => [
75
75
  new RegExp(String.raw`(?<![\p{L}\p{N}_])${titles}\s+${SURNAME_IN_CAPITALS}${GIVEN_NAME_AFTER}`, "gu"),
76
76
  ];
77
77
 
78
+ /**
79
+ * 郵便番号の無い所在地(Chicago, IL、Charleston, SC and…、Washington, DC: Association…)。頭が大文字の地名と読点の後ろで、
80
+ * 文や行の終わり・区切り・小文字の語が続くときだけ州と読む。数字や大文字の語が続くもの(Berkeley, CA 947、Sales, PA Team)は外さない。
81
+ */
82
+ const placeAndState = (states: string): RegExp =>
83
+ new RegExp(String.raw`(?<=\p{Lu}\p{Ll}[\p{L}'’.-]*,\s+)${states}(?=[ \t]*(?:\r?\n|$)|[,.;:)\]!?]|\s+\p{Ll})`, "gu");
84
+
78
85
  // 強調の記号は空白に置き換えてある(**3:30** PM)ので、部品の間の空白は数を問わない。
79
86
  const patternsOf = (words: NotationWords): readonly RegExp[] => [
80
87
  new RegExp(String.raw`${CLOCK_12}\s*${oneOf(words.meridiem)}`, "gu"),
@@ -82,6 +89,7 @@ const patternsOf = (words: NotationWords): readonly RegExp[] => [
82
89
  new RegExp(String.raw`${oneOf(words.currencies)}\s*[$€£¥]?${AMOUNT}`, "gu"),
83
90
  new RegExp(String.raw`(?<![\w.,])${AMOUNT}\s*${oneOf(words.currencies)}`, "gu"),
84
91
  new RegExp(String.raw`,\s+${oneOf(words.usStates)}\s+\d{5}(?:-\d{4})?(?!\d)`, "gu"),
92
+ placeAndState(oneOf(words.usStates)),
85
93
  new RegExp(oneOf(words.emphasis), "gu"),
86
94
  ...numberedPatterns(words),
87
95
  new RegExp(String.raw`(?<![\p{L}\p{N}_])${oneOf(words.honorifics)}\s+${SURNAME_IN_CAPITALS}`, "gu"),
@@ -0,0 +1,9 @@
1
+ // Whether a word is part of an address or a file name rather than a word of the sentence. Pure.
2
+
3
+ /** A word joined to a dot, an at sign or a slash is part of an address or a file name (github.com, user@example), spelled as it must be. */
4
+ const ADDRESS_NEIGHBOUR = /[.@/\\_]/u;
5
+ const WORD_CHAR = /\w/u;
6
+
7
+ /** Whether text[start, end) is joined to an address mark before it, or to one followed by more of the address after it. */
8
+ export const isPartOfAddress = (text: string, start: number, end: number): boolean =>
9
+ ADDRESS_NEIGHBOUR.test(text.charAt(start - 1)) || (ADDRESS_NEIGHBOUR.test(text.charAt(end)) && WORD_CHAR.test(text.charAt(end + 1)));
@@ -116,9 +116,15 @@ const mayBeNoun = (token: Token): boolean => token.features?.["AlsoNoun"] === "Y
116
116
  const mayBeVerb = (determiner: Determiner, modifiers: readonly Token[], noun: Token, next: Token | undefined, finite: ReadonlySet<string>): boolean =>
117
117
  noun.features?.["AlsoVerb"] === "Yes" && !(next !== undefined && finite.has(lower(next))) && (standsAlone(determiner) || modifiers.some(mayBeNoun));
118
118
 
119
+ /** 冠詞は名詞句の頭に立つ。形容詞や数の後ろの a は、記号の名前(the eight 3-hourly a indices)。 */
120
+ const AFTER_MODIFIER = new Set(["ADJ", "NUM"]);
121
+
122
+ const isLetterName = (tokens: readonly Token[], at: number, determiner: Determiner): boolean =>
123
+ isArticle(determiner.head) && determiner.head.surface.length === 1 && AFTER_MODIFIER.has(tokens[at - 1]?.pos ?? "");
124
+
119
125
  const numberSlipAt = (source: string, tokens: readonly Token[], at: number, lists: AgreementLists): Slip | undefined => {
120
126
  const determiner = determinerAt(tokens, at, lists);
121
- if (determiner === undefined || isNamePart(tokens, at)) return undefined;
127
+ if (determiner === undefined || isNamePart(tokens, at) || isLetterName(tokens, at, determiner)) return undefined;
122
128
  const modifiers = modifiersAfter(tokens, at + determiner.length, lists.count);
123
129
  if (modifiers === undefined || !readsAsDeterminer(determiner, modifiers)) return undefined;
124
130
  const nounAt = at + determiner.length + modifiers.length;
@@ -5,6 +5,7 @@ import { entryIn, entryOpens } from "./lexicon-match.ts";
5
5
  import { contrastSentences, type ContrastWords } from "./contrast-frame.ts";
6
6
  import { placeholderSpans } from "./placeholder-text.ts";
7
7
  import { colonLeadIns } from "./list-lead-in.ts";
8
+ import { followsInlineCode } from "./code-before.ts";
8
9
 
9
10
  // 生成文に多い形。語はどれも言語パッケージの語彙表が持ち、ここは形だけを知る。
10
11
 
@@ -68,8 +69,12 @@ export const openerDensity: Detector = (doc, options): Finding[] => densityFindi
68
69
  * 予告の文頭(重要なのは、Here's the thing)の数。limit は指摘に要る数。
69
70
  * 密度ではなく数で見る。人の記事も長さによらず 1 つ 2 つは書き、生成文は短い記事にも重ねる。
70
71
  */
72
+ /** Where the sentence's first word starts: its span may begin with the blanks that masked code left. */
73
+ const firstWordAt = (sentence: Sentence): number => sentence.span.start + sentence.text.length - sentence.text.trimStart().length;
74
+
71
75
  export const openerPile: Detector = (doc, options): Finding[] => {
72
- const hits = openerHits(doc, options.lexicon ?? []);
76
+ // A sentence that opens with inline code (`explain` でも) opens with the code, not with the word after it.
77
+ const hits = openerHits(doc, options.lexicon ?? []).filter((hit) => !followsInlineCode(doc.source, doc.prose, firstWordAt(hit.sentence)));
73
78
  return hits.length === 0 || hits.length < options.limit ? [] : hits.map((hit) => findingOf(hit, { count: hits.length, limit: options.limit }));
74
79
  };
75
80
 
@@ -0,0 +1,54 @@
1
+ // amount-range-reversed: a range of amounts whose upper end is below its lower end (structure/amount-range.ts). The amounts
2
+ // are currency-notation's, read with amount-multiplier's words of scale and amount-short-scale's (k); the words of a range
3
+ // are range-connector, range-opener, range-closer and amount-range-word; amount-change-word and amount-bound-label say
4
+ // what makes a pair a change of price and what labels a bound.
5
+ import type { Detector, Finding, ProseDocument } from "../plugin.ts";
6
+ import { reversedAmountRanges, type AmountRangeWords, type RangeAmount } from "../structure/amount-range.ts";
7
+ import type { ScaleWord } from "../structure/amount-scale.ts";
8
+ import { scaledAmountOf, scaleWordsOf } from "./amount-scale.ts";
9
+ import { AMOUNT, amountsIn, formsOf } from "./currency-notation.ts";
10
+ import { proseAndTablesOf } from "../table-text.ts";
11
+ import { quoteAround } from "./quote-around.ts";
12
+
13
+ const patternsOf = (doc: ProseDocument, lexicon: string, group?: string): string[] =>
14
+ (doc.lexicons[lexicon] ?? []).filter((entry) => group === undefined || entry.group === group).map((entry) => entry.pattern);
15
+
16
+ const shortScalesOf = (doc: ProseDocument): ScaleWord[] =>
17
+ (doc.lexicons["amount-short-scale"] ?? []).flatMap((entry) => (entry.weight === undefined ? [] : [{ word: entry.pattern, value: entry.weight }]));
18
+
19
+ const wordsOf = (doc: ProseDocument, scales: readonly ScaleWord[]): AmountRangeWords => ({
20
+ connectors: [...patternsOf(doc, "range-connector"), ...patternsOf(doc, "amount-range-word")],
21
+ openers: patternsOf(doc, "range-opener"),
22
+ closers: patternsOf(doc, "range-closer"),
23
+ changes: patternsOf(doc, "amount-change-word"),
24
+ lowers: patternsOf(doc, "amount-bound-label", "lower"),
25
+ uppers: patternsOf(doc, "amount-bound-label", "upper"),
26
+ links: patternsOf(doc, "amount-bound-label", "link"),
27
+ scales,
28
+ number: AMOUNT,
29
+ });
30
+
31
+ const rangeAmountsOf = (text: string, doc: ProseDocument, scales: readonly ScaleWord[]): RangeAmount[] =>
32
+ amountsIn(
33
+ text,
34
+ formsOf(doc),
35
+ scales.map((scale) => scale.word),
36
+ ).flatMap((amount) => {
37
+ const read = scaledAmountOf(text, amount, scales);
38
+ if (read === undefined) return [];
39
+ const position = amount.form.startsWith("before:") ? "before" : "after";
40
+ return [{ offset: read.offset, end: amount.offset + amount.written.length, currency: read.currency, value: read.value, scale: read.unit, position }];
41
+ });
42
+
43
+ export const amountRange: Detector = (doc): Finding[] => {
44
+ const text = proseAndTablesOf(doc);
45
+ const scales = [...scaleWordsOf(doc), ...shortScalesOf(doc)];
46
+ return reversedAmountRanges(text, rangeAmountsOf(text, doc, scales), wordsOf(doc, scales)).map((issue) => ({
47
+ rule: "amount-range-reversed",
48
+ severity: "warning",
49
+ line: 0,
50
+ column: 0,
51
+ quote: quoteAround(text, issue.offset),
52
+ values: { ...issue.values, offset: issue.offset },
53
+ }));
54
+ };
@@ -0,0 +1,96 @@
1
+ // amount-scale-consistency: the reading half. The amounts are currency-notation's (the lexicon currency-notation says
2
+ // how a currency is written); the words of scale and their values are the lexicon amount-multiplier (weight).
3
+ import type { Detector, Finding, Lexicon, ProseDocument } from "../plugin.ts";
4
+ import { escapeRegExp } from "../orthography.ts";
5
+ import { amountValue, scaleMixes, withoutRoundTextFigures, type ScaleWord, type ScaledAmount } from "../structure/amount-scale.ts";
6
+ import { AMOUNT, amountsIn, formsOf, type WrittenAmount } from "./currency-notation.ts";
7
+ import { quoteAround } from "./quote-around.ts";
8
+ import { proseAndTablesOf } from "../table-text.ts";
9
+
10
+ /** How far back a larger part of one amount may start (1億2,000万円 is read from 2,000万円). */
11
+ const LEADING_REACH = 40;
12
+
13
+ /** How far from an amount a marker of an estimate is looked for. */
14
+ const MARKER_REACH = 12;
15
+
16
+ export const scaleWordsOf = (doc: ProseDocument): ScaleWord[] =>
17
+ (doc.lexicons["amount-multiplier"] ?? []).flatMap((entry) => (entry.weight === undefined ? [] : [{ word: entry.pattern, value: entry.weight }]));
18
+
19
+ /** The larger parts written right before an amount the currency notation read from its last part (1億 before 2,000万円). */
20
+ const leadingParts = (text: string, offset: number, words: readonly ScaleWord[]): string => {
21
+ if (words.length === 0) return "";
22
+ const scales = words.map((word) => escapeRegExp(word.word)).join("|");
23
+ const before = text.slice(Math.max(0, offset - LEADING_REACH), offset);
24
+ return new RegExp(`(?<![0-90-9.,,])(?:${AMOUNT}(?:${scales}))+$`, "u").exec(before)?.[0] ?? "";
25
+ };
26
+
27
+ /** The written amount without its currency mark, which is on the side its form says. */
28
+ const numberPart = (amount: WrittenAmount): string => {
29
+ const [position = "", ...mark] = amount.form.split(":");
30
+ const pattern = mark.join(":");
31
+ return position === "before" ? amount.written.trimStart().slice(pattern.length) : amount.written.trimEnd().slice(0, -pattern.length);
32
+ };
33
+
34
+ /** The largest word of scale written in the number (万 in 1億2,000万 is smaller than 億), undefined when there is none. */
35
+ const unitOf = (number: string, words: readonly ScaleWord[]): number | undefined => {
36
+ const lower = number.toLowerCase();
37
+ const values = words.filter((word) => lower.includes(word.word.toLowerCase())).map((word) => word.value);
38
+ return values.length === 0 ? undefined : Math.max(...values);
39
+ };
40
+
41
+ /** One written amount read as a value, with the larger parts written before it (1億 before 2,000万円). */
42
+ export const scaledAmountOf = (text: string, amount: WrittenAmount, words: readonly ScaleWord[]): ScaledAmount | undefined => {
43
+ const leading = amount.form.startsWith("after:") ? leadingParts(text, amount.offset, words) : "";
44
+ const written = `${leading}${amount.written}`;
45
+ const number = `${leading}${numberPart(amount)}`;
46
+ const value = amountValue(number, words);
47
+ if (value === undefined) return undefined;
48
+ return { offset: amount.offset - leading.length, written, currency: amount.currency, value, unit: unitOf(number, words) };
49
+ };
50
+
51
+ const scaledAmountsOf = (text: string, amounts: readonly WrittenAmount[], words: readonly ScaleWord[]): ScaledAmount[] =>
52
+ amounts.flatMap((amount) => scaledAmountOf(text, amount, words) ?? []);
53
+
54
+ /** Whether a marker of an estimate (約, 程度, about) stands right before or after the amount. */
55
+ const isApproximate = (text: string, amount: ScaledAmount, markers: Lexicon): boolean => {
56
+ const before = text
57
+ .slice(Math.max(0, amount.offset - MARKER_REACH), amount.offset)
58
+ .trimEnd()
59
+ .toLowerCase();
60
+ const after = text
61
+ .slice(amount.offset + amount.written.length, amount.offset + amount.written.length + MARKER_REACH)
62
+ .trimStart()
63
+ .toLowerCase();
64
+ return markers.some((entry) => (entry.position === "after" ? after.startsWith(entry.pattern.toLowerCase()) : before.endsWith(entry.pattern.toLowerCase())));
65
+ };
66
+
67
+ /** Whether the amount is on a table row (the text has the tables read back in, and only tables start a line with |). */
68
+ const onTableRow = (text: string, amount: ScaledAmount): boolean =>
69
+ text
70
+ .slice(text.lastIndexOf("\n", amount.offset) + 1)
71
+ .trimStart()
72
+ .startsWith("|");
73
+
74
+ export const amountScale: Detector = (doc): Finding[] => {
75
+ const text = proseAndTablesOf(doc);
76
+ const words = scaleWordsOf(doc);
77
+ const markers = doc.lexicons["approximate-marker"] ?? [];
78
+ const amounts = scaledAmountsOf(
79
+ text,
80
+ amountsIn(
81
+ text,
82
+ formsOf(doc),
83
+ words.map((word) => word.word),
84
+ ),
85
+ words,
86
+ ).filter((amount) => !isApproximate(text, amount, markers));
87
+ const mixes = withoutRoundTextFigures(scaleMixes(amounts), amounts, (amount) => onTableRow(text, amount));
88
+ return mixes.map(({ odd, usual }) => ({
89
+ rule: "amount-scale-consistency",
90
+ severity: "info",
91
+ line: 0,
92
+ column: 0,
93
+ quote: quoteAround(text, odd.offset, odd.offset + odd.written.length),
94
+ values: { written: odd.written.trim(), usual: usual.written.trim(), offset: odd.offset },
95
+ }));
96
+ };
@@ -1,5 +1,6 @@
1
1
  import type { Detector, Finding, ProseDocument } from "../plugin.ts";
2
- import { announcedCountMismatches, type CountWords } from "../announced-count.ts";
2
+ import { announcedCountMismatches, type CountMismatch, type CountWords } from "../announced-count.ts";
3
+ import { inlineCountMismatches, type MemberWords } from "../inline-count.ts";
3
4
  import { quoteAt } from "./structure-tree.ts";
4
5
 
5
6
  const patternsOf = (doc: ProseDocument, id: string, position?: "before" | "after"): string[] =>
@@ -13,13 +14,30 @@ const countWordsOf = (doc: ProseDocument): CountWords => ({
13
14
  hedgesAfter: patternsOf(doc, "count-hedge", "after"),
14
15
  });
15
16
 
16
- /** 予告の数(以下の3点)と、すぐ下の箇条書きの項目の数が違う。 */
17
- export const announcedCount: Detector = (doc): Finding[] =>
18
- announcedCountMismatches(doc.source, doc.lists, countWordsOf(doc)).map((mismatch) => ({
19
- rule: "announced-count-mismatch",
20
- severity: "warning",
21
- line: 0,
22
- column: 0,
23
- quote: quoteAt(doc.source, mismatch.offset),
24
- values: { phrase: mismatch.phrase, announced: mismatch.announced, listed: mismatch.listed, offset: mismatch.offset },
25
- }));
17
+ const memberGroup = (doc: ProseDocument, group: string): string[] =>
18
+ (doc.lexicons["count-member"] ?? []).filter((entry) => entry.group === group).map((entry) => entry.pattern);
19
+
20
+ const memberWordsOf = (doc: ProseDocument): MemberWords => ({
21
+ separators: memberGroup(doc, "separator"),
22
+ joiners: memberGroup(doc, "joiner"),
23
+ open: memberGroup(doc, "open"),
24
+ });
25
+
26
+ const findingOf = (doc: ProseDocument, mismatch: CountMismatch, variant?: string): Finding => ({
27
+ rule: "announced-count-mismatch",
28
+ severity: "warning",
29
+ line: 0,
30
+ column: 0,
31
+ quote: quoteAt(doc.source, mismatch.offset),
32
+ values: { phrase: mismatch.phrase, announced: mismatch.announced, listed: mismatch.listed, offset: mismatch.offset },
33
+ ...(variant === undefined ? {} : { variant }),
34
+ });
35
+
36
+ /** 予告の数(以下の3点、出席者(6名))と、すぐ下の箇条書きか、後ろに一行で並べた名前の数が違う。 */
37
+ export const announcedCount: Detector = (doc): Finding[] => {
38
+ const words = countWordsOf(doc);
39
+ return [
40
+ ...announcedCountMismatches(doc.source, doc.lists, words).map((mismatch) => findingOf(doc, mismatch)),
41
+ ...inlineCountMismatches(doc.prose ?? doc.source, words, memberWordsOf(doc)).map((mismatch) => findingOf(doc, mismatch, "inline")),
42
+ ];
43
+ };
@@ -1,5 +1,6 @@
1
- import type { Detector, Finding, Lexicon, Sentence, Span, Token } from "../plugin.ts";
1
+ import type { Detector, Finding, Lexicon, ProseDocument, Sentence, Span, Token } from "../plugin.ts";
2
2
  import { quotedIn } from "../quoted-span.ts";
3
+ import { followsInlineCode } from "./code-before.ts";
3
4
 
4
5
  /**
5
6
  * 比べる相手の無い比較(より良い結果、さらに高速に、The new engine is faster.)。何より良いのか、何より速いのかが書かれていない。
@@ -132,6 +133,10 @@ export const listsOf = (lexicon: Lexicon): ComparativeLists => ({
132
133
  /** 鉤括弧の中の比較(「給与所得の確定申告がさらに簡単に!」ページ)は題や語を挙げたもので、書き手の比較ではない。 */
133
134
  const insideSpan = (found: BareComparative, span: Span): boolean => found.first.span.start >= span.start && found.last.span.end <= span.end;
134
135
 
136
+ /** より right after inline code (`relaxed` より長い) is the particle "than" after a word the masking hid, not the adverb. */
137
+ const isThanAfterCode = (doc: ProseDocument, found: BareComparative): boolean =>
138
+ found.first.surface === "より" && followsInlineCode(doc.source, doc.prose, found.first.span.start);
139
+
135
140
  export const bareComparative: Detector = (doc): Finding[] => {
136
141
  const lists = listsOf(doc.lexicons["comparative-baseline"] ?? []);
137
142
  return doc.sentences.flatMap((sentence, at) => {
@@ -139,7 +144,7 @@ export const bareComparative: Detector = (doc): Finding[] => {
139
144
  if (sentence.embeddedLanguage !== undefined || nearby.some((near) => namesBaseline(near, lists.baselines))) return [];
140
145
  const quoted = quotedIn(sentence);
141
146
  return bareComparativesIn(sentence.tokens ?? [], lists)
142
- .filter((found) => !quoted.some((span) => insideSpan(found, span)))
147
+ .filter((found) => !quoted.some((span) => insideSpan(found, span)) && !isThanAfterCode(doc, found))
143
148
  .map((found) => ({
144
149
  rule: "",
145
150
  severity: "info",
@@ -0,0 +1,95 @@
1
+ // A block quotation (`> …`) that a dash line gives to someone: `— Name` as the last line of its last paragraph, or as
2
+ // the paragraph right after it. A block quotation with no such line is not given to anyone, and a GitHub alert
3
+ // (`> [!NOTE]`) is the writer's own text. Only the quotation's own paragraphs are its words: code in it is not, and a
4
+ // quotation inside it is read on its own. Pure; reads the Markdown tree.
5
+ import { spanOf, type MarkdownNode } from "../markdown-node.ts";
6
+ import { lineStarts } from "../position.ts";
7
+
8
+ /** quote: the quotation's words without the `>` marks. passage: the quotation and its dash line as written, where a source would be. */
9
+ export type BlockQuotation = { readonly offset: number; readonly quote: string; readonly passage: string };
10
+
11
+ /**
12
+ * An em dash, a horizontal bar or an en dash, once or twice, then a name: not a lower-case word, which goes on a sentence
13
+ * (— and then it slipped). A single `-` opens a list item, and `--` opens an email signature.
14
+ */
15
+ const DASH_LINE = /^[—―–]{1,2}[\t\p{Zs}]*(?!\p{Ll})\p{L}/u;
16
+ /** Longer than this, a line opening with a dash is a sentence, not a name and a work. */
17
+ const MAX_ATTRIBUTION_CHARS = 120;
18
+ const QUOTE_MARKS = /^(?:[ \t]*>[ \t]?)+/u;
19
+ const ALERT = /^\[![A-Za-z]+\]/u;
20
+ /** Japanese and Chinese text runs on across a line break; anything else is separated by a space. */
21
+ const CJK = String.raw`[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}、。「」『』()!?:;]`;
22
+ const CJK_END = new RegExp(`${CJK}$`, "u");
23
+ const CJK_START = new RegExp(`^${CJK}`, "u");
24
+
25
+ type Line = { readonly offset: number; readonly text: string };
26
+
27
+ /**
28
+ * A line that ends like a sentence is the writer going on (――私はこの言葉を思い出す。, — Not yet. Give it ten minutes.),
29
+ * not a name and a work. A period after a lower-case word ends a sentence; one after an initial or "Inc." does not.
30
+ */
31
+ const SENTENCE_END = /(?:[。!?!?]|(?:^|[\s\p{P}])\p{Ll}+\.)$/u;
32
+
33
+ const isDashLine = (text: string): boolean => DASH_LINE.test(text) && [...text].length <= MAX_ATTRIBUTION_CHARS && !SENTENCE_END.test(text);
34
+
35
+ /** Each non-blank line of a node without its `>` marks, at the place in source where its words start. */
36
+ const linesOf = (source: string, node: MarkdownNode): Line[] => {
37
+ const span = spanOf(node);
38
+ if (span === undefined) return [];
39
+ const text = source.slice(span.start, span.end);
40
+ const starts = lineStarts(text);
41
+ return text.split("\n").flatMap((raw, index) => {
42
+ const marks = QUOTE_MARKS.exec(raw)?.[0].length ?? 0;
43
+ const words = raw.slice(marks);
44
+ const indent = words.length - words.trimStart().length;
45
+ return words.trim() === "" ? [] : [{ offset: span.start + (starts[index] ?? 0) + marks + indent, text: words.trim() }];
46
+ });
47
+ };
48
+
49
+ /** What goes between two lines: nothing where Japanese or Chinese runs on, a space otherwise. */
50
+ const separator = (before: string, after: string): string => (before === "" || CJK_END.test(before) || CJK_START.test(after) ? "" : " ");
51
+
52
+ /** Lines joined as the reader reads them. */
53
+ const joined = (lines: readonly Line[]): string => lines.map((line) => line.text).reduce((text, next) => `${text}${separator(text, next)}${next}`, "");
54
+
55
+ /** The dash line of a paragraph that is only that line. */
56
+ const dashParagraph = (source: string, node: MarkdownNode | undefined): string | undefined => {
57
+ const lines = node?.type === "paragraph" ? linesOf(source, node) : [];
58
+ const only = lines.length === 1 ? lines[0]?.text : undefined;
59
+ return only !== undefined && isDashLine(only) ? only : undefined;
60
+ };
61
+
62
+ const quotationOf = (source: string, quote: MarkdownNode, next: MarkdownNode | undefined): BlockQuotation | undefined => {
63
+ const children = quote.children ?? [];
64
+ const lines = children.filter((child) => child.type === "paragraph").flatMap((paragraph) => linesOf(source, paragraph));
65
+ const last = children.at(-1)?.type === "paragraph" ? lines.at(-1) : undefined;
66
+ if (ALERT.test(lines[0]?.text ?? "")) return undefined;
67
+ const inside = last !== undefined && isDashLine(last.text);
68
+ const attribution = inside ? last.text : dashParagraph(source, next);
69
+ const body = inside ? lines.slice(0, -1) : lines;
70
+ const first = body[0];
71
+ const span = spanOf(quote);
72
+ if (attribution === undefined || first === undefined || span === undefined) return undefined;
73
+ return { offset: first.offset, quote: joined(body), passage: `${source.slice(span.start, span.end)}\n${attribution}` };
74
+ };
75
+
76
+ /**
77
+ * Every block quotation given to someone by a dash line. One that is not given to anyone is read for a quotation inside
78
+ * it. Walks with its own stack: Markdown nests without limit.
79
+ */
80
+ export const blockQuotations = (root: MarkdownNode, source: string): BlockQuotation[] => {
81
+ const found: BlockQuotation[] = [];
82
+ const pending: MarkdownNode[] = [root];
83
+ for (let node = pending.pop(); node !== undefined; node = pending.pop()) {
84
+ const children = node.children ?? [];
85
+ const given = children.map((child, index) => (child.type === "blockquote" ? quotationOf(source, child, children[index + 1]) : undefined));
86
+ given.forEach((quotation) => {
87
+ if (quotation !== undefined) found.push(quotation);
88
+ });
89
+ children
90
+ .filter((_child, index) => given[index] === undefined)
91
+ .toReversed()
92
+ .forEach((child) => pending.push(child));
93
+ }
94
+ return found.toSorted((left, right) => left.offset - right.offset);
95
+ };
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 丸括弧の閉じを、開きを持たない印として読むかどうか。印に使うのは丸括弧だけなので、呼ぶ側が丸括弧の閉じに限る。
3
+ * text は節の文字列で、offset は閉じの位置。
4
+ */
5
+ import { escapeRegExp } from "../orthography.ts";
6
+
7
+ /** 行の頭か空白・句読点の後ろに書いた、三文字までの印(「1)」「a)」「事例)」「※)」)。顔文字の「:)」も同じ形。 */
8
+ const LABEL_TOKEN_BEFORE = /(?:^|[\s、。,;::])[^\s()()[\][]「」『』]{1,3}[ \t\u3000]?$/u;
9
+
10
+ /** 数の後ろの閉じ(「事例2)及び事例3)」)。 */
11
+ const NUMBER_BEFORE = /[\d0-9]$/u;
12
+
13
+ /** 句読点の後ろの、字の後ろに数を付けた印(「以下、事例5)」)。group 1 は数の前の字(「事例」)。 */
14
+ const NUMBERED_LABEL_BEFORE = /[、。,;::] ?([^\s\d0-9()()[\][]「」『』、。,;::]{1,3})[\d0-9]{1,3}$/u;
15
+
16
+ const ROUND_OPEN = new Set(["(", "("]);
17
+ const ROUND_CLOSE = new Set([")", ")"]);
18
+
19
+ const lineBefore = (text: string, offset: number): string => text.slice(text.lastIndexOf("\n", offset - 1) + 1, offset);
20
+
21
+ const isLabelToken = (text: string, offset: number): boolean => LABEL_TOKEN_BEFORE.test(lineBefore(text, offset));
22
+
23
+ /** 開いている丸括弧が無いときの閉じが、印の形をしているか。 */
24
+ export const isLabelClose = (text: string, offset: number): boolean => isLabelToken(text, offset) || NUMBER_BEFORE.test(lineBefore(text, offset));
25
+
26
+ const restOfLine = (text: string, offset: number): string => {
27
+ const end = text.indexOf("\n", offset);
28
+ return text.slice(offset + 1, end === -1 ? text.length : end);
29
+ };
30
+
31
+ /** offset の後ろ、同じ行のうちの、印の形でない閉じのうち、それより前に開いた丸括弧を閉じるものの数。間の丸括弧の組は数えない。 */
32
+ const outerClosesLaterOnLine = (text: string, offset: number): number => {
33
+ const depth = { inner: 0, outer: 0 };
34
+ restOfLine(text, offset)
35
+ .split("")
36
+ .forEach((mark, index) => {
37
+ if (ROUND_OPEN.has(mark)) depth.inner += 1;
38
+ if (!ROUND_CLOSE.has(mark)) return;
39
+ if (depth.inner > 0) depth.inner -= 1;
40
+ else if (!isLabelClose(text, offset + 1 + index)) depth.outer += 1;
41
+ });
42
+ return depth.outer;
43
+ };
44
+
45
+ /** 節のどこかの行の頭(箇条の印の後ろも含む)に、同じ字で始まる番号の印(「- 事例1)」)を書いているか。 */
46
+ const usedAsLineLabel = (text: string, stem: string): boolean =>
47
+ new RegExp(`^[ \\t\u3000]*(?:[-*+・][ \\t\u3000]*)?${escapeRegExp(stem)}[\\d0-9]{1,3}[))]`, "mu").test(text);
48
+
49
+ /**
50
+ * 開いた丸括弧の中の印(「(…以下、事例5)まで同じ。)」の「事例5)」)。三つがそろうときだけ印と読む: 句読点の後ろの、字に数を
51
+ * 付けた形であること。同じ字の番号の印を、節のどこかの行の頭で使っていること。同じ行の後ろの閉じだけで、いま開いている
52
+ * 丸括弧(openRound 個)をすべて閉じられること。どれかが欠ければ、この閉じで括弧を閉じる(「(項目 1)を確認した)」は
53
+ * 余分な閉じを指す)。
54
+ */
55
+ export const isLabelInAside = (text: string, offset: number, openRound: number): boolean => {
56
+ const stem = NUMBERED_LABEL_BEFORE.exec(lineBefore(text, offset))?.[1];
57
+ return stem !== undefined && usedAsLineLabel(text, stem) && outerClosesLaterOnLine(text, offset) >= openRound;
58
+ };
@@ -1,8 +1,9 @@
1
1
  // change-rate-mismatch: the reading half. Builds the figures, the rates and the words of structure/change-rate.ts from the
2
2
  // tree's quantities, the numbers counted with a word ("1,200 companies"), the calendar years, and the lexicons change-direction,
3
3
  // change-base, change-target, change-break, percent-unit and amount-multiplier.
4
- import type { Detector, Finding, LexiconEntry, ProseDocument, Span, StructureNode } from "../plugin.ts";
4
+ import type { Detector, Finding, LexiconEntry, ProseDocument, Span, StructureNode, Token } from "../plugin.ts";
5
5
  import { inDocumentOrder } from "../structure/issues.ts";
6
+ import { startsOtherSubject } from "../structure/subject-change.ts";
6
7
  import { changeRateMismatches, type BaseMark, type Break, type Direction, type Figure, type Period, type Rate } from "../structure/change-rate.ts";
7
8
  import { escapeRegExp } from "../orthography.ts";
8
9
  import { quoteAt } from "./structure-tree.ts";
@@ -99,12 +100,24 @@ const directionsOf = (doc: ProseDocument): Direction[] =>
99
100
  return sign === undefined ? [] : [{ start, end, sign }];
100
101
  });
101
102
 
103
+ /** The sentence's tokens, and the index of the token that starts at offset (-1 when none does). */
104
+ const tokenAt = (doc: ProseDocument, offset: number): { readonly tokens: readonly Token[]; readonly index: number } => {
105
+ const tokens = doc.sentences.find((sentence) => sentence.span.start <= offset && offset < sentence.span.end)?.tokens ?? [];
106
+ return { tokens, index: tokens.findIndex((token) => token.span.start === offset) };
107
+ };
108
+
109
+ /** A word that may join two values ("and") does not when another subject follows it ("and costs were"). */
110
+ const joinsTwoValues = (doc: ProseDocument, start: number): boolean => {
111
+ const { tokens, index } = tokenAt(doc, start);
112
+ return index < 0 || !startsOtherSubject(tokens, index);
113
+ };
114
+
102
115
  /** Lexicon change-break (「は」, "and"), less the phrases of change-break-not (「上がり」 holds が but starts no subject). */
103
116
  const breaksOf = (doc: ProseDocument): Break[] =>
104
117
  spansWithout(doc, doc.lexicons["change-break"] ?? [], "change-break-not").map(({ start, end, entry }) => ({
105
118
  start,
106
119
  end,
107
- beforeRateOnly: entry.group === "rate",
120
+ beforeRateOnly: entry.group === "rate" && joinsTwoValues(doc, start),
108
121
  }));
109
122
 
110
123
  /** A calendar year written alone or with a unit of calendar year (2025, 2025年, 2025年度), and not part of an amount ($2025). */
@@ -45,17 +45,32 @@ export const namesEntry = (entryKey: string, citedKey: string): boolean => {
45
45
  return !LATIN.test(citedKey) && [...surname].length >= MIN_PREFIX_SURNAME && entryKey.startsWith(citedKey);
46
46
  };
47
47
 
48
+ /**
49
+ * namesEntry, and also a one-character Japanese surname (森, 林) against the full name it heads (森達也) when no other entry
50
+ * of that year starts with it: the list then leaves no other work it could name, where 林 beside 林田太郎 and 林正 does.
51
+ */
52
+ export const namesEntryAmong =
53
+ (entryKeys: readonly string[]) =>
54
+ (entryKey: string, citedKey: string): boolean => {
55
+ if (namesEntry(entryKey, citedKey)) return true;
56
+ if (LATIN.test(citedKey) || !entryKey.startsWith(citedKey)) return false;
57
+ return entryKeys.filter((key) => key.startsWith(citedKey)).length === 1;
58
+ };
59
+
48
60
  const numberedSide = (entries: readonly ReferenceEntry[], marks: readonly CitationMark[]): Side => ({
49
61
  entries: entries.flatMap((entry) => (entry.number === undefined ? [] : [{ key: String(entry.number), start: entry.start }])),
50
62
  citations: marks.filter((mark) => NUMBERED_STYLES.has(mark.style)).map((mark) => ({ mark, keys: mark.numbers.map(String) })),
51
63
  names: (entryKey, citedKey) => entryKey === citedKey,
52
64
  });
53
65
 
54
- const authorYearSide = (entries: readonly ReferenceEntry[], marks: readonly CitationMark[]): Side => ({
55
- entries: entries.flatMap((entry) => (entry.authorYear === undefined ? [] : [{ key: keyOf(entry.authorYear), start: entry.start }])),
56
- citations: marks.filter((mark) => mark.style === "author-year").map((mark) => ({ mark, keys: mark.authorYears.map(keyOf) })),
57
- names: namesEntry,
58
- });
66
+ const authorYearSide = (entries: readonly ReferenceEntry[], marks: readonly CitationMark[]): Side => {
67
+ const keyed = entries.flatMap((entry) => (entry.authorYear === undefined ? [] : [{ key: keyOf(entry.authorYear), start: entry.start }]));
68
+ return {
69
+ entries: keyed,
70
+ citations: marks.filter((mark) => mark.style === "author-year").map((mark) => ({ mark, keys: mark.authorYears.map(keyOf) })),
71
+ names: namesEntryAmong(keyed.map((entry) => entry.key)),
72
+ };
73
+ };
59
74
 
60
75
  export const sideSlips = (side: Side): CitationSlip[] => {
61
76
  if (side.entries.length < MIN_ENTRIES || side.citations.length === 0) return [];
@@ -0,0 +1,14 @@
1
+ // Whether inline code stands right before a place in the text. Code is masked to blanks before the text is read, so a word
2
+ // after `explain` looks like the head of a sentence, and より after `relaxed` looks like the adverb. Pure.
3
+
4
+ /**
5
+ * Whether the last mark before offset on the same line, past spaces, closes inline code (`relaxed` より). prose is the
6
+ * source with code masked; a backtick it keeps (\` escaped, or one left unclosed) is text, not code.
7
+ */
8
+ export const followsInlineCode = (source: string, prose: string | undefined, offset: number): boolean => {
9
+ if (prose === undefined) return false;
10
+ const lineStart = source.lastIndexOf("\n", offset - 1) + 1;
11
+ const before = source.slice(lineStart, Math.max(lineStart, offset)).trimEnd();
12
+ const mark = lineStart + before.length - 1;
13
+ return before.endsWith("`") && prose.charAt(mark) !== "`";
14
+ };