chaffjs 0.28.0 → 0.30.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 (1024) 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/session-hours.d.ts +26 -0
  62. package/dist/derived/session-hours.d.ts.map +1 -0
  63. package/dist/derived/session-hours.js +29 -0
  64. package/dist/derived/session-hours.js.map +1 -0
  65. package/dist/derived/stays.d.ts +43 -0
  66. package/dist/derived/stays.d.ts.map +1 -0
  67. package/dist/derived/stays.js +105 -0
  68. package/dist/derived/stays.js.map +1 -0
  69. package/dist/derived/time-lengths.d.ts +37 -0
  70. package/dist/derived/time-lengths.d.ts.map +1 -0
  71. package/dist/derived/time-lengths.js +168 -0
  72. package/dist/derived/time-lengths.js.map +1 -0
  73. package/dist/derived/unit-counts.d.ts +7 -0
  74. package/dist/derived/unit-counts.d.ts.map +1 -0
  75. package/dist/derived/unit-counts.js +13 -0
  76. package/dist/derived/unit-counts.js.map +1 -0
  77. package/dist/derived/working-hours.d.ts +36 -0
  78. package/dist/derived/working-hours.d.ts.map +1 -0
  79. package/dist/derived/working-hours.js +55 -0
  80. package/dist/derived/working-hours.js.map +1 -0
  81. package/dist/detectors/acronym-context.d.ts +2 -2
  82. package/dist/detectors/acronym-context.d.ts.map +1 -1
  83. package/dist/detectors/acronym-context.js +6 -0
  84. package/dist/detectors/acronym-context.js.map +1 -1
  85. package/dist/detectors/acronym-expansion.d.ts +1 -1
  86. package/dist/detectors/acronym-expansion.d.ts.map +1 -1
  87. package/dist/detectors/acronym-expansion.js +46 -2
  88. package/dist/detectors/acronym-expansion.js.map +1 -1
  89. package/dist/detectors/address-word.d.ts +3 -0
  90. package/dist/detectors/address-word.d.ts.map +1 -0
  91. package/dist/detectors/address-word.js +7 -0
  92. package/dist/detectors/address-word.js.map +1 -0
  93. package/dist/detectors/agreement-slip.d.ts.map +1 -1
  94. package/dist/detectors/agreement-slip.js +4 -1
  95. package/dist/detectors/agreement-slip.js.map +1 -1
  96. package/dist/detectors/ai-phrasing.d.ts +0 -4
  97. package/dist/detectors/ai-phrasing.d.ts.map +1 -1
  98. package/dist/detectors/ai-phrasing.js +5 -1
  99. package/dist/detectors/ai-phrasing.js.map +1 -1
  100. package/dist/detectors/amount-range.d.ts +3 -0
  101. package/dist/detectors/amount-range.d.ts.map +1 -0
  102. package/dist/detectors/amount-range.js +38 -0
  103. package/dist/detectors/amount-range.js.map +1 -0
  104. package/dist/detectors/amount-scale.d.ts +6 -1
  105. package/dist/detectors/amount-scale.d.ts.map +1 -1
  106. package/dist/detectors/amount-scale.js +33 -9
  107. package/dist/detectors/amount-scale.js.map +1 -1
  108. package/dist/detectors/announced-count.d.ts +1 -1
  109. package/dist/detectors/announced-count.d.ts.map +1 -1
  110. package/dist/detectors/announced-count.js +18 -3
  111. package/dist/detectors/announced-count.js.map +1 -1
  112. package/dist/detectors/bare-comparative.d.ts.map +1 -1
  113. package/dist/detectors/bare-comparative.js +4 -1
  114. package/dist/detectors/bare-comparative.js.map +1 -1
  115. package/dist/detectors/block-quotation.d.ts +13 -0
  116. package/dist/detectors/block-quotation.d.ts.map +1 -0
  117. package/dist/detectors/block-quotation.js +86 -0
  118. package/dist/detectors/block-quotation.js.map +1 -0
  119. package/dist/detectors/bracket-label.d.ts +10 -0
  120. package/dist/detectors/bracket-label.d.ts.map +1 -0
  121. package/dist/detectors/bracket-label.js +51 -0
  122. package/dist/detectors/bracket-label.js.map +1 -0
  123. package/dist/detectors/capitalised-term.d.ts +44 -0
  124. package/dist/detectors/capitalised-term.d.ts.map +1 -0
  125. package/dist/detectors/capitalised-term.js +101 -0
  126. package/dist/detectors/capitalised-term.js.map +1 -0
  127. package/dist/detectors/citation-entry.d.ts +5 -0
  128. package/dist/detectors/citation-entry.d.ts.map +1 -1
  129. package/dist/detectors/citation-entry.js +19 -5
  130. package/dist/detectors/citation-entry.js.map +1 -1
  131. package/dist/detectors/code-before.d.ts +6 -0
  132. package/dist/detectors/code-before.d.ts.map +1 -0
  133. package/dist/detectors/code-before.js +15 -0
  134. package/dist/detectors/code-before.js.map +1 -0
  135. package/dist/detectors/connective-hierarchy.d.ts +11 -1
  136. package/dist/detectors/connective-hierarchy.d.ts.map +1 -1
  137. package/dist/detectors/connective-hierarchy.js +26 -6
  138. package/dist/detectors/connective-hierarchy.js.map +1 -1
  139. package/dist/detectors/currency-notation.d.ts.map +1 -1
  140. package/dist/detectors/currency-notation.js +2 -1
  141. package/dist/detectors/currency-notation.js.map +1 -1
  142. package/dist/detectors/date-outside-period.d.ts +4 -0
  143. package/dist/detectors/date-outside-period.d.ts.map +1 -0
  144. package/dist/detectors/date-outside-period.js +37 -0
  145. package/dist/detectors/date-outside-period.js.map +1 -0
  146. package/dist/detectors/default-values.d.ts +3 -0
  147. package/dist/detectors/default-values.d.ts.map +1 -0
  148. package/dist/detectors/default-values.js +14 -0
  149. package/dist/detectors/default-values.js.map +1 -0
  150. package/dist/detectors/defined-term-form.d.ts +6 -2
  151. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  152. package/dist/detectors/defined-term-form.js +72 -12
  153. package/dist/detectors/defined-term-form.js.map +1 -1
  154. package/dist/detectors/definition-use.d.ts.map +1 -1
  155. package/dist/detectors/definition-use.js +8 -1
  156. package/dist/detectors/definition-use.js.map +1 -1
  157. package/dist/detectors/deprecated-use.d.ts +3 -0
  158. package/dist/detectors/deprecated-use.d.ts.map +1 -0
  159. package/dist/detectors/deprecated-use.js +14 -0
  160. package/dist/detectors/deprecated-use.js.map +1 -0
  161. package/dist/detectors/derived-numbers.d.ts +3 -1
  162. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  163. package/dist/detectors/derived-numbers.js +119 -10
  164. package/dist/detectors/derived-numbers.js.map +1 -1
  165. package/dist/detectors/document-shape.d.ts +1 -0
  166. package/dist/detectors/document-shape.d.ts.map +1 -1
  167. package/dist/detectors/document-shape.js +4 -1
  168. package/dist/detectors/document-shape.js.map +1 -1
  169. package/dist/detectors/due-date.d.ts +3 -0
  170. package/dist/detectors/due-date.d.ts.map +1 -0
  171. package/dist/detectors/due-date.js +38 -0
  172. package/dist/detectors/due-date.js.map +1 -0
  173. package/dist/detectors/en-shape.d.ts.map +1 -1
  174. package/dist/detectors/en-shape.js +17 -9
  175. package/dist/detectors/en-shape.js.map +1 -1
  176. package/dist/detectors/fact-consistency.d.ts.map +1 -1
  177. package/dist/detectors/fact-consistency.js +76 -2
  178. package/dist/detectors/fact-consistency.js.map +1 -1
  179. package/dist/detectors/heading-echo.d.ts.map +1 -1
  180. package/dist/detectors/heading-echo.js +10 -1
  181. package/dist/detectors/heading-echo.js.map +1 -1
  182. package/dist/detectors/kana-function-word.d.ts +12 -0
  183. package/dist/detectors/kana-function-word.d.ts.map +1 -0
  184. package/dist/detectors/kana-function-word.js +59 -0
  185. package/dist/detectors/kana-function-word.js.map +1 -0
  186. package/dist/detectors/line-amount.d.ts +3 -0
  187. package/dist/detectors/line-amount.d.ts.map +1 -0
  188. package/dist/detectors/line-amount.js +22 -0
  189. package/dist/detectors/line-amount.js.map +1 -0
  190. package/dist/detectors/location-pointer.d.ts +6 -0
  191. package/dist/detectors/location-pointer.d.ts.map +1 -0
  192. package/dist/detectors/location-pointer.js +22 -0
  193. package/dist/detectors/location-pointer.js.map +1 -0
  194. package/dist/detectors/mark-shape.d.ts.map +1 -1
  195. package/dist/detectors/mark-shape.js +13 -1
  196. package/dist/detectors/mark-shape.js.map +1 -1
  197. package/dist/detectors/nado-closed-list.d.ts +3 -0
  198. package/dist/detectors/nado-closed-list.d.ts.map +1 -0
  199. package/dist/detectors/nado-closed-list.js +21 -0
  200. package/dist/detectors/nado-closed-list.js.map +1 -0
  201. package/dist/detectors/name-variant.d.ts.map +1 -1
  202. package/dist/detectors/name-variant.js +129 -8
  203. package/dist/detectors/name-variant.js.map +1 -1
  204. package/dist/detectors/next-word.d.ts.map +1 -1
  205. package/dist/detectors/next-word.js +41 -8
  206. package/dist/detectors/next-word.js.map +1 -1
  207. package/dist/detectors/number-word-figure.d.ts +5 -0
  208. package/dist/detectors/number-word-figure.d.ts.map +1 -0
  209. package/dist/detectors/number-word-figure.js +32 -0
  210. package/dist/detectors/number-word-figure.js.map +1 -0
  211. package/dist/detectors/obligation-without-deadline.d.ts +39 -0
  212. package/dist/detectors/obligation-without-deadline.d.ts.map +1 -0
  213. package/dist/detectors/obligation-without-deadline.js +148 -0
  214. package/dist/detectors/obligation-without-deadline.js.map +1 -0
  215. package/dist/detectors/open-end-names.d.ts +23 -0
  216. package/dist/detectors/open-end-names.d.ts.map +1 -0
  217. package/dist/detectors/open-end-names.js +95 -0
  218. package/dist/detectors/open-end-names.js.map +1 -0
  219. package/dist/detectors/ordinal-run-gaps.d.ts +8 -0
  220. package/dist/detectors/ordinal-run-gaps.d.ts.map +1 -0
  221. package/dist/detectors/ordinal-run-gaps.js +80 -0
  222. package/dist/detectors/ordinal-run-gaps.js.map +1 -0
  223. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  224. package/dist/detectors/orthographic-variant.js +26 -9
  225. package/dist/detectors/orthographic-variant.js.map +1 -1
  226. package/dist/detectors/orthography.d.ts.map +1 -1
  227. package/dist/detectors/orthography.js +5 -0
  228. package/dist/detectors/orthography.js.map +1 -1
  229. package/dist/detectors/parameter-table.d.ts +3 -0
  230. package/dist/detectors/parameter-table.d.ts.map +1 -0
  231. package/dist/detectors/parameter-table.js +16 -0
  232. package/dist/detectors/parameter-table.js.map +1 -0
  233. package/dist/detectors/party-order.d.ts +3 -0
  234. package/dist/detectors/party-order.d.ts.map +1 -0
  235. package/dist/detectors/party-order.js +46 -0
  236. package/dist/detectors/party-order.js.map +1 -0
  237. package/dist/detectors/phone-number-variant.d.ts +3 -0
  238. package/dist/detectors/phone-number-variant.d.ts.map +1 -0
  239. package/dist/detectors/phone-number-variant.js +18 -0
  240. package/dist/detectors/phone-number-variant.js.map +1 -0
  241. package/dist/detectors/prerequisite-order.d.ts +3 -0
  242. package/dist/detectors/prerequisite-order.d.ts.map +1 -0
  243. package/dist/detectors/prerequisite-order.js +30 -0
  244. package/dist/detectors/prerequisite-order.js.map +1 -0
  245. package/dist/detectors/quote-unnamed-speaker.d.ts +3 -0
  246. package/dist/detectors/quote-unnamed-speaker.d.ts.map +1 -0
  247. package/dist/detectors/quote-unnamed-speaker.js +18 -0
  248. package/dist/detectors/quote-unnamed-speaker.js.map +1 -0
  249. package/dist/detectors/quote-without-source.d.ts +12 -2
  250. package/dist/detectors/quote-without-source.d.ts.map +1 -1
  251. package/dist/detectors/quote-without-source.js +45 -11
  252. package/dist/detectors/quote-without-source.js.map +1 -1
  253. package/dist/detectors/registry/amount-range.d.ts +3 -0
  254. package/dist/detectors/registry/amount-range.d.ts.map +1 -0
  255. package/dist/detectors/registry/amount-range.js +3 -0
  256. package/dist/detectors/registry/amount-range.js.map +1 -0
  257. package/dist/detectors/registry/arrival-before-departure.d.ts +3 -0
  258. package/dist/detectors/registry/arrival-before-departure.d.ts.map +1 -0
  259. package/dist/detectors/registry/arrival-before-departure.js +3 -0
  260. package/dist/detectors/registry/arrival-before-departure.js.map +1 -0
  261. package/dist/detectors/registry/connection-time-short.d.ts +3 -0
  262. package/dist/detectors/registry/connection-time-short.d.ts.map +1 -0
  263. package/dist/detectors/registry/connection-time-short.js +3 -0
  264. package/dist/detectors/registry/connection-time-short.js.map +1 -0
  265. package/dist/detectors/registry/date-outside-period.d.ts +3 -0
  266. package/dist/detectors/registry/date-outside-period.d.ts.map +1 -0
  267. package/dist/detectors/registry/date-outside-period.js +3 -0
  268. package/dist/detectors/registry/date-outside-period.js.map +1 -0
  269. package/dist/detectors/registry/default-values.d.ts +3 -0
  270. package/dist/detectors/registry/default-values.d.ts.map +1 -0
  271. package/dist/detectors/registry/default-values.js +3 -0
  272. package/dist/detectors/registry/default-values.js.map +1 -0
  273. package/dist/detectors/registry/deprecated-use.d.ts +3 -0
  274. package/dist/detectors/registry/deprecated-use.d.ts.map +1 -0
  275. package/dist/detectors/registry/deprecated-use.js +3 -0
  276. package/dist/detectors/registry/deprecated-use.js.map +1 -0
  277. package/dist/detectors/registry/due-date.d.ts +3 -0
  278. package/dist/detectors/registry/due-date.d.ts.map +1 -0
  279. package/dist/detectors/registry/due-date.js +3 -0
  280. package/dist/detectors/registry/due-date.js.map +1 -0
  281. package/dist/detectors/registry/duration-product-mismatch.d.ts +3 -0
  282. package/dist/detectors/registry/duration-product-mismatch.d.ts.map +1 -0
  283. package/dist/detectors/registry/duration-product-mismatch.js +3 -0
  284. package/dist/detectors/registry/duration-product-mismatch.js.map +1 -0
  285. package/dist/detectors/registry/kana-function-word.d.ts +3 -0
  286. package/dist/detectors/registry/kana-function-word.d.ts.map +1 -0
  287. package/dist/detectors/registry/kana-function-word.js +3 -0
  288. package/dist/detectors/registry/kana-function-word.js.map +1 -0
  289. package/dist/detectors/registry/line-amount.d.ts +3 -0
  290. package/dist/detectors/registry/line-amount.d.ts.map +1 -0
  291. package/dist/detectors/registry/line-amount.js +3 -0
  292. package/dist/detectors/registry/line-amount.js.map +1 -0
  293. package/dist/detectors/registry/nado-closed-list.d.ts +3 -0
  294. package/dist/detectors/registry/nado-closed-list.d.ts.map +1 -0
  295. package/dist/detectors/registry/nado-closed-list.js +3 -0
  296. package/dist/detectors/registry/nado-closed-list.js.map +1 -0
  297. package/dist/detectors/registry/number-word-figure.d.ts +3 -0
  298. package/dist/detectors/registry/number-word-figure.d.ts.map +1 -0
  299. package/dist/detectors/registry/number-word-figure.js +3 -0
  300. package/dist/detectors/registry/number-word-figure.js.map +1 -0
  301. package/dist/detectors/registry/obligation-without-deadline.d.ts +3 -0
  302. package/dist/detectors/registry/obligation-without-deadline.d.ts.map +1 -0
  303. package/dist/detectors/registry/obligation-without-deadline.js +3 -0
  304. package/dist/detectors/registry/obligation-without-deadline.js.map +1 -0
  305. package/dist/detectors/registry/parameter-table.d.ts +3 -0
  306. package/dist/detectors/registry/parameter-table.d.ts.map +1 -0
  307. package/dist/detectors/registry/parameter-table.js +3 -0
  308. package/dist/detectors/registry/parameter-table.js.map +1 -0
  309. package/dist/detectors/registry/party-order.d.ts +3 -0
  310. package/dist/detectors/registry/party-order.d.ts.map +1 -0
  311. package/dist/detectors/registry/party-order.js +3 -0
  312. package/dist/detectors/registry/party-order.js.map +1 -0
  313. package/dist/detectors/registry/phone-number-variant.d.ts +3 -0
  314. package/dist/detectors/registry/phone-number-variant.d.ts.map +1 -0
  315. package/dist/detectors/registry/phone-number-variant.js +3 -0
  316. package/dist/detectors/registry/phone-number-variant.js.map +1 -0
  317. package/dist/detectors/registry/prerequisite-order.d.ts +3 -0
  318. package/dist/detectors/registry/prerequisite-order.d.ts.map +1 -0
  319. package/dist/detectors/registry/prerequisite-order.js +3 -0
  320. package/dist/detectors/registry/prerequisite-order.js.map +1 -0
  321. package/dist/detectors/registry/quote-unnamed-speaker.d.ts +3 -0
  322. package/dist/detectors/registry/quote-unnamed-speaker.d.ts.map +1 -0
  323. package/dist/detectors/registry/quote-unnamed-speaker.js +3 -0
  324. package/dist/detectors/registry/quote-unnamed-speaker.js.map +1 -0
  325. package/dist/detectors/registry/requirement-lists.d.ts +3 -0
  326. package/dist/detectors/registry/requirement-lists.d.ts.map +1 -0
  327. package/dist/detectors/registry/requirement-lists.js +3 -0
  328. package/dist/detectors/registry/requirement-lists.js.map +1 -0
  329. package/dist/detectors/registry/return-type.d.ts +3 -0
  330. package/dist/detectors/registry/return-type.d.ts.map +1 -0
  331. package/dist/detectors/registry/return-type.js +3 -0
  332. package/dist/detectors/registry/return-type.js.map +1 -0
  333. package/dist/detectors/registry/tax-amount.d.ts +3 -0
  334. package/dist/detectors/registry/tax-amount.d.ts.map +1 -0
  335. package/dist/detectors/registry/tax-amount.js +3 -0
  336. package/dist/detectors/registry/tax-amount.js.map +1 -0
  337. package/dist/detectors/registry/time-order.d.ts +3 -0
  338. package/dist/detectors/registry/time-order.d.ts.map +1 -0
  339. package/dist/detectors/registry/time-order.js +3 -0
  340. package/dist/detectors/registry/time-order.js.map +1 -0
  341. package/dist/detectors/registry/ui-label.d.ts +3 -0
  342. package/dist/detectors/registry/ui-label.d.ts.map +1 -0
  343. package/dist/detectors/registry/ui-label.js +3 -0
  344. package/dist/detectors/registry/ui-label.js.map +1 -0
  345. package/dist/detectors/registry/undefined-call.d.ts +3 -0
  346. package/dist/detectors/registry/undefined-call.d.ts.map +1 -0
  347. package/dist/detectors/registry/undefined-call.js +3 -0
  348. package/dist/detectors/registry/undefined-call.js.map +1 -0
  349. package/dist/detectors/registry/undefined-term.d.ts +3 -0
  350. package/dist/detectors/registry/undefined-term.d.ts.map +1 -0
  351. package/dist/detectors/registry/undefined-term.js +3 -0
  352. package/dist/detectors/registry/undefined-term.js.map +1 -0
  353. package/dist/detectors/registry/version-order.d.ts +3 -0
  354. package/dist/detectors/registry/version-order.d.ts.map +1 -0
  355. package/dist/detectors/registry/version-order.js +3 -0
  356. package/dist/detectors/registry/version-order.js.map +1 -0
  357. package/dist/detectors/registry/warning-action.d.ts +3 -0
  358. package/dist/detectors/registry/warning-action.d.ts.map +1 -0
  359. package/dist/detectors/registry/warning-action.js +3 -0
  360. package/dist/detectors/registry/warning-action.js.map +1 -0
  361. package/dist/detectors/requirement-lists.d.ts +3 -0
  362. package/dist/detectors/requirement-lists.d.ts.map +1 -0
  363. package/dist/detectors/requirement-lists.js +46 -0
  364. package/dist/detectors/requirement-lists.js.map +1 -0
  365. package/dist/detectors/requirement-smell.d.ts.map +1 -1
  366. package/dist/detectors/requirement-smell.js +25 -8
  367. package/dist/detectors/requirement-smell.js.map +1 -1
  368. package/dist/detectors/return-type.d.ts +3 -0
  369. package/dist/detectors/return-type.d.ts.map +1 -0
  370. package/dist/detectors/return-type.js +24 -0
  371. package/dist/detectors/return-type.js.map +1 -0
  372. package/dist/detectors/structure-tree.d.ts +12 -4
  373. package/dist/detectors/structure-tree.d.ts.map +1 -1
  374. package/dist/detectors/structure-tree.js +40 -15
  375. package/dist/detectors/structure-tree.js.map +1 -1
  376. package/dist/detectors/superlative-scope.d.ts.map +1 -1
  377. package/dist/detectors/superlative-scope.js +11 -1
  378. package/dist/detectors/superlative-scope.js.map +1 -1
  379. package/dist/detectors/tax-amount.d.ts +3 -0
  380. package/dist/detectors/tax-amount.d.ts.map +1 -0
  381. package/dist/detectors/tax-amount.js +19 -0
  382. package/dist/detectors/tax-amount.js.map +1 -0
  383. package/dist/detectors/technical-docs.d.ts.map +1 -1
  384. package/dist/detectors/technical-docs.js +5 -1
  385. package/dist/detectors/technical-docs.js.map +1 -1
  386. package/dist/detectors/term-extension.d.ts +14 -0
  387. package/dist/detectors/term-extension.d.ts.map +1 -0
  388. package/dist/detectors/term-extension.js +67 -0
  389. package/dist/detectors/term-extension.js.map +1 -0
  390. package/dist/detectors/time-order.d.ts +5 -0
  391. package/dist/detectors/time-order.d.ts.map +1 -0
  392. package/dist/detectors/time-order.js +58 -0
  393. package/dist/detectors/time-order.js.map +1 -0
  394. package/dist/detectors/ui-label.d.ts +3 -0
  395. package/dist/detectors/ui-label.d.ts.map +1 -0
  396. package/dist/detectors/ui-label.js +16 -0
  397. package/dist/detectors/ui-label.js.map +1 -0
  398. package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
  399. package/dist/detectors/unbalanced-bracket.js +8 -13
  400. package/dist/detectors/unbalanced-bracket.js.map +1 -1
  401. package/dist/detectors/undefined-call.d.ts +3 -0
  402. package/dist/detectors/undefined-call.d.ts.map +1 -0
  403. package/dist/detectors/undefined-call.js +18 -0
  404. package/dist/detectors/undefined-call.js.map +1 -0
  405. package/dist/detectors/undefined-term.d.ts +22 -0
  406. package/dist/detectors/undefined-term.d.ts.map +1 -0
  407. package/dist/detectors/undefined-term.js +101 -0
  408. package/dist/detectors/undefined-term.js.map +1 -0
  409. package/dist/detectors/unknown-word.d.ts +1 -1
  410. package/dist/detectors/unknown-word.js +3 -3
  411. package/dist/detectors/unknown-word.js.map +1 -1
  412. package/dist/detectors/vague-deadline.d.ts +4 -0
  413. package/dist/detectors/vague-deadline.d.ts.map +1 -1
  414. package/dist/detectors/vague-deadline.js +3 -3
  415. package/dist/detectors/vague-deadline.js.map +1 -1
  416. package/dist/detectors/version-mismatch.d.ts.map +1 -1
  417. package/dist/detectors/version-mismatch.js +18 -1
  418. package/dist/detectors/version-mismatch.js.map +1 -1
  419. package/dist/detectors/version-order.d.ts +3 -0
  420. package/dist/detectors/version-order.d.ts.map +1 -0
  421. package/dist/detectors/version-order.js +43 -0
  422. package/dist/detectors/version-order.js.map +1 -0
  423. package/dist/detectors/warning-action.d.ts +3 -0
  424. package/dist/detectors/warning-action.d.ts.map +1 -0
  425. package/dist/detectors/warning-action.js +48 -0
  426. package/dist/detectors/warning-action.js.map +1 -0
  427. package/dist/document.d.ts.map +1 -1
  428. package/dist/document.js +4 -1
  429. package/dist/document.js.map +1 -1
  430. package/dist/facts/condition-pairs.d.ts +51 -0
  431. package/dist/facts/condition-pairs.d.ts.map +1 -0
  432. package/dist/facts/condition-pairs.js +203 -0
  433. package/dist/facts/condition-pairs.js.map +1 -0
  434. package/dist/facts/event-dates.d.ts +26 -0
  435. package/dist/facts/event-dates.d.ts.map +1 -0
  436. package/dist/facts/event-dates.js +38 -0
  437. package/dist/facts/event-dates.js.map +1 -0
  438. package/dist/facts/fact-scope.d.ts +2 -0
  439. package/dist/facts/fact-scope.d.ts.map +1 -1
  440. package/dist/facts/fact-scope.js +5 -0
  441. package/dist/facts/fact-scope.js.map +1 -1
  442. package/dist/facts/labelled-facts.d.ts +2 -0
  443. package/dist/facts/labelled-facts.d.ts.map +1 -1
  444. package/dist/facts/labelled-facts.js +9 -1
  445. package/dist/facts/labelled-facts.js.map +1 -1
  446. package/dist/facts/table-facts.d.ts +18 -0
  447. package/dist/facts/table-facts.d.ts.map +1 -1
  448. package/dist/facts/table-facts.js +4 -2
  449. package/dist/facts/table-facts.js.map +1 -1
  450. package/dist/grade/ai-score.d.ts +1 -1
  451. package/dist/grade/ai-score.d.ts.map +1 -1
  452. package/dist/grade/text.js +2 -2
  453. package/dist/grade/text.js.map +1 -1
  454. package/dist/heading-numbering.js +2 -2
  455. package/dist/heading-numbering.js.map +1 -1
  456. package/dist/html/fetch-page.d.ts +20 -0
  457. package/dist/html/fetch-page.d.ts.map +1 -0
  458. package/dist/html/fetch-page.js +51 -0
  459. package/dist/html/fetch-page.js.map +1 -0
  460. package/dist/html/fetched-text.d.ts +5 -0
  461. package/dist/html/fetched-text.d.ts.map +1 -0
  462. package/dist/html/fetched-text.js +25 -0
  463. package/dist/html/fetched-text.js.map +1 -0
  464. package/dist/html/html-content-block.d.ts +6 -0
  465. package/dist/html/html-content-block.d.ts.map +1 -0
  466. package/dist/html/html-content-block.js +86 -0
  467. package/dist/html/html-content-block.js.map +1 -0
  468. package/dist/html/html-elements.d.ts +41 -0
  469. package/dist/html/html-elements.d.ts.map +1 -0
  470. package/dist/html/html-elements.js +91 -0
  471. package/dist/html/html-elements.js.map +1 -0
  472. package/dist/html/html-footnote-marks.d.ts +2 -0
  473. package/dist/html/html-footnote-marks.d.ts.map +1 -0
  474. package/dist/html/html-footnote-marks.js +15 -0
  475. package/dist/html/html-footnote-marks.js.map +1 -0
  476. package/dist/html/html-heading-links.d.ts +6 -0
  477. package/dist/html/html-heading-links.d.ts.map +1 -0
  478. package/dist/html/html-heading-links.js +71 -0
  479. package/dist/html/html-heading-links.js.map +1 -0
  480. package/dist/html/html-lost-tags.d.ts +3 -0
  481. package/dist/html/html-lost-tags.d.ts.map +1 -0
  482. package/dist/html/html-lost-tags.js +11 -0
  483. package/dist/html/html-lost-tags.js.map +1 -0
  484. package/dist/html/html-markdown.d.ts +2 -0
  485. package/dist/html/html-markdown.d.ts.map +1 -0
  486. package/dist/html/html-markdown.js +347 -0
  487. package/dist/html/html-markdown.js.map +1 -0
  488. package/dist/html/html-preformatted.d.ts +17 -0
  489. package/dist/html/html-preformatted.d.ts.map +1 -0
  490. package/dist/html/html-preformatted.js +82 -0
  491. package/dist/html/html-preformatted.js.map +1 -0
  492. package/dist/html/html-reader-only.d.ts +6 -0
  493. package/dist/html/html-reader-only.d.ts.map +1 -0
  494. package/dist/html/html-reader-only.js +63 -0
  495. package/dist/html/html-reader-only.js.map +1 -0
  496. package/dist/html/html-run-in-headings.d.ts +2 -0
  497. package/dist/html/html-run-in-headings.d.ts.map +1 -0
  498. package/dist/html/html-run-in-headings.js +36 -0
  499. package/dist/html/html-run-in-headings.js.map +1 -0
  500. package/dist/html/html-tables.d.ts +3 -0
  501. package/dist/html/html-tables.d.ts.map +1 -0
  502. package/dist/html/html-tables.js +58 -0
  503. package/dist/html/html-tables.js.map +1 -0
  504. package/dist/html/html-widgets.d.ts +3 -0
  505. package/dist/html/html-widgets.d.ts.map +1 -0
  506. package/dist/html/html-widgets.js +71 -0
  507. package/dist/html/html-widgets.js.map +1 -0
  508. package/dist/html/markup-text.d.ts +5 -0
  509. package/dist/html/markup-text.d.ts.map +1 -0
  510. package/dist/html/markup-text.js +32 -0
  511. package/dist/html/markup-text.js.map +1 -0
  512. package/dist/html/page-document.d.ts +9 -0
  513. package/dist/html/page-document.d.ts.map +1 -0
  514. package/dist/html/page-document.js +19 -0
  515. package/dist/html/page-document.js.map +1 -0
  516. package/dist/inline-count.d.ts +19 -0
  517. package/dist/inline-count.d.ts.map +1 -0
  518. package/dist/inline-count.js +109 -0
  519. package/dist/inline-count.js.map +1 -0
  520. package/dist/kana-spelling.d.ts +5 -0
  521. package/dist/kana-spelling.d.ts.map +1 -1
  522. package/dist/kana-spelling.js +5 -0
  523. package/dist/kana-spelling.js.map +1 -1
  524. package/dist/location-part.d.ts +13 -0
  525. package/dist/location-part.d.ts.map +1 -0
  526. package/dist/location-part.js +24 -0
  527. package/dist/location-part.js.map +1 -0
  528. package/dist/nado-closed-list.d.ts +20 -0
  529. package/dist/nado-closed-list.d.ts.map +1 -0
  530. package/dist/nado-closed-list.js +72 -0
  531. package/dist/nado-closed-list.js.map +1 -0
  532. package/dist/name-cue.d.ts +17 -0
  533. package/dist/name-cue.d.ts.map +1 -0
  534. package/dist/name-cue.js +29 -0
  535. package/dist/name-cue.js.map +1 -0
  536. package/dist/name-variants.d.ts +29 -2
  537. package/dist/name-variants.d.ts.map +1 -1
  538. package/dist/name-variants.js +107 -8
  539. package/dist/name-variants.js.map +1 -1
  540. package/dist/name-word-order.d.ts +49 -0
  541. package/dist/name-word-order.d.ts.map +1 -0
  542. package/dist/name-word-order.js +114 -0
  543. package/dist/name-word-order.js.map +1 -0
  544. package/dist/paragraph-runs.d.ts +6 -1
  545. package/dist/paragraph-runs.d.ts.map +1 -1
  546. package/dist/paragraph-runs.js +9 -2
  547. package/dist/paragraph-runs.js.map +1 -1
  548. package/dist/parameter-table.d.ts +19 -0
  549. package/dist/parameter-table.d.ts.map +1 -0
  550. package/dist/parameter-table.js +191 -0
  551. package/dist/parameter-table.js.map +1 -0
  552. package/dist/phone-numbers.d.ts +23 -0
  553. package/dist/phone-numbers.d.ts.map +1 -0
  554. package/dist/phone-numbers.js +83 -0
  555. package/dist/phone-numbers.js.map +1 -0
  556. package/dist/place-names.d.ts +55 -0
  557. package/dist/place-names.d.ts.map +1 -0
  558. package/dist/place-names.js +196 -0
  559. package/dist/place-names.js.map +1 -0
  560. package/dist/plugin.d.ts +11 -0
  561. package/dist/plugin.d.ts.map +1 -1
  562. package/dist/prerequisite-order.d.ts +16 -0
  563. package/dist/prerequisite-order.d.ts.map +1 -0
  564. package/dist/prerequisite-order.js +29 -0
  565. package/dist/prerequisite-order.js.map +1 -0
  566. package/dist/profile/parse.d.ts.map +1 -1
  567. package/dist/profile/parse.js +10 -1
  568. package/dist/profile/parse.js.map +1 -1
  569. package/dist/reasons.d.ts +2 -0
  570. package/dist/reasons.d.ts.map +1 -1
  571. package/dist/reasons.js +2 -0
  572. package/dist/reasons.js.map +1 -1
  573. package/dist/render/rules-json.d.ts.map +1 -1
  574. package/dist/render/rules-json.js +4 -0
  575. package/dist/render/rules-json.js.map +1 -1
  576. package/dist/render/rules-table.d.ts.map +1 -1
  577. package/dist/render/rules-table.js +6 -2
  578. package/dist/render/rules-table.js.map +1 -1
  579. package/dist/return-type.d.ts +33 -0
  580. package/dist/return-type.d.ts.map +1 -0
  581. package/dist/return-type.js +302 -0
  582. package/dist/return-type.js.map +1 -0
  583. package/dist/rule-genres.d.ts +5 -2
  584. package/dist/rule-genres.d.ts.map +1 -1
  585. package/dist/rule-genres.js +2 -0
  586. package/dist/rule-genres.js.map +1 -1
  587. package/dist/rule-load.d.ts.map +1 -1
  588. package/dist/rule-load.js +2 -1
  589. package/dist/rule-load.js.map +1 -1
  590. package/dist/run.d.ts.map +1 -1
  591. package/dist/run.js +5 -1
  592. package/dist/run.js.map +1 -1
  593. package/dist/spelling.d.ts +2 -0
  594. package/dist/spelling.d.ts.map +1 -1
  595. package/dist/spelling.js +6 -0
  596. package/dist/spelling.js.map +1 -1
  597. package/dist/structure/action-due.d.ts +21 -0
  598. package/dist/structure/action-due.d.ts.map +1 -0
  599. package/dist/structure/action-due.js +126 -0
  600. package/dist/structure/action-due.js.map +1 -0
  601. package/dist/structure/amount-range.d.ts +30 -0
  602. package/dist/structure/amount-range.d.ts.map +1 -0
  603. package/dist/structure/amount-range.js +153 -0
  604. package/dist/structure/amount-range.js.map +1 -0
  605. package/dist/structure/amount-scale.d.ts +6 -0
  606. package/dist/structure/amount-scale.d.ts.map +1 -1
  607. package/dist/structure/amount-scale.js +13 -0
  608. package/dist/structure/amount-scale.js.map +1 -1
  609. package/dist/structure/cite.d.ts +5 -2
  610. package/dist/structure/cite.d.ts.map +1 -1
  611. package/dist/structure/cite.js +20 -1
  612. package/dist/structure/cite.js.map +1 -1
  613. package/dist/structure/connection-times.d.ts +56 -0
  614. package/dist/structure/connection-times.d.ts.map +1 -0
  615. package/dist/structure/connection-times.js +165 -0
  616. package/dist/structure/connection-times.js.map +1 -0
  617. package/dist/structure/counted-amounts.d.ts +12 -0
  618. package/dist/structure/counted-amounts.d.ts.map +1 -0
  619. package/dist/structure/counted-amounts.js +30 -0
  620. package/dist/structure/counted-amounts.js.map +1 -0
  621. package/dist/structure/date-order-tie.d.ts +13 -0
  622. package/dist/structure/date-order-tie.d.ts.map +1 -0
  623. package/dist/structure/date-order-tie.js +61 -0
  624. package/dist/structure/date-order-tie.js.map +1 -0
  625. package/dist/structure/date-order.d.ts +24 -3
  626. package/dist/structure/date-order.d.ts.map +1 -1
  627. package/dist/structure/date-order.js +66 -17
  628. package/dist/structure/date-order.js.map +1 -1
  629. package/dist/structure/date-outside-period.d.ts +33 -0
  630. package/dist/structure/date-outside-period.d.ts.map +1 -0
  631. package/dist/structure/date-outside-period.js +132 -0
  632. package/dist/structure/date-outside-period.js.map +1 -0
  633. package/dist/structure/date-range.d.ts +5 -2
  634. package/dist/structure/date-range.d.ts.map +1 -1
  635. package/dist/structure/date-range.js +37 -9
  636. package/dist/structure/date-range.js.map +1 -1
  637. package/dist/structure/definition-use.d.ts +5 -2
  638. package/dist/structure/definition-use.d.ts.map +1 -1
  639. package/dist/structure/definition-use.js +11 -3
  640. package/dist/structure/definition-use.js.map +1 -1
  641. package/dist/structure/due-date.d.ts +19 -0
  642. package/dist/structure/due-date.d.ts.map +1 -0
  643. package/dist/structure/due-date.js +30 -0
  644. package/dist/structure/due-date.js.map +1 -0
  645. package/dist/structure/heading-runs.d.ts +9 -0
  646. package/dist/structure/heading-runs.d.ts.map +1 -0
  647. package/dist/structure/heading-runs.js +23 -0
  648. package/dist/structure/heading-runs.js.map +1 -0
  649. package/dist/structure/install-pin.d.ts +46 -0
  650. package/dist/structure/install-pin.d.ts.map +1 -0
  651. package/dist/structure/install-pin.js +85 -0
  652. package/dist/structure/install-pin.js.map +1 -0
  653. package/dist/structure/leg-times.d.ts +36 -0
  654. package/dist/structure/leg-times.d.ts.map +1 -0
  655. package/dist/structure/leg-times.js +148 -0
  656. package/dist/structure/leg-times.js.map +1 -0
  657. package/dist/structure/line-amount-unit.d.ts +24 -0
  658. package/dist/structure/line-amount-unit.d.ts.map +1 -0
  659. package/dist/structure/line-amount-unit.js +24 -0
  660. package/dist/structure/line-amount-unit.js.map +1 -0
  661. package/dist/structure/line-amount.d.ts +40 -0
  662. package/dist/structure/line-amount.d.ts.map +1 -0
  663. package/dist/structure/line-amount.js +118 -0
  664. package/dist/structure/line-amount.js.map +1 -0
  665. package/dist/structure/number-word-figure.d.ts +37 -0
  666. package/dist/structure/number-word-figure.d.ts.map +1 -0
  667. package/dist/structure/number-word-figure.js +151 -0
  668. package/dist/structure/number-word-figure.js.map +1 -0
  669. package/dist/structure/numbering.d.ts +1 -0
  670. package/dist/structure/numbering.d.ts.map +1 -1
  671. package/dist/structure/numbering.js +3 -0
  672. package/dist/structure/numbering.js.map +1 -1
  673. package/dist/structure/ordinal-runs.d.ts +45 -0
  674. package/dist/structure/ordinal-runs.d.ts.map +1 -0
  675. package/dist/structure/ordinal-runs.js +78 -0
  676. package/dist/structure/ordinal-runs.js.map +1 -0
  677. package/dist/structure/party-order.d.ts +33 -0
  678. package/dist/structure/party-order.d.ts.map +1 -0
  679. package/dist/structure/party-order.js +79 -0
  680. package/dist/structure/party-order.js.map +1 -0
  681. package/dist/structure/percent-sum-prose.d.ts +1 -1
  682. package/dist/structure/percent-sum-prose.d.ts.map +1 -1
  683. package/dist/structure/percent-sum-prose.js +45 -3
  684. package/dist/structure/percent-sum-prose.js.map +1 -1
  685. package/dist/structure/percent-sum.d.ts +8 -0
  686. package/dist/structure/percent-sum.d.ts.map +1 -1
  687. package/dist/structure/percent-sum.js +8 -1
  688. package/dist/structure/percent-sum.js.map +1 -1
  689. package/dist/structure/release-list.d.ts +9 -0
  690. package/dist/structure/release-list.d.ts.map +1 -0
  691. package/dist/structure/release-list.js +46 -0
  692. package/dist/structure/release-list.js.map +1 -0
  693. package/dist/structure/requirement-lists.d.ts +37 -0
  694. package/dist/structure/requirement-lists.d.ts.map +1 -0
  695. package/dist/structure/requirement-lists.js +89 -0
  696. package/dist/structure/requirement-lists.js.map +1 -0
  697. package/dist/structure/share-column.d.ts +7 -0
  698. package/dist/structure/share-column.d.ts.map +1 -0
  699. package/dist/structure/share-column.js +22 -0
  700. package/dist/structure/share-column.js.map +1 -0
  701. package/dist/structure/stated-period.d.ts +31 -0
  702. package/dist/structure/stated-period.d.ts.map +1 -0
  703. package/dist/structure/stated-period.js +127 -0
  704. package/dist/structure/stated-period.js.map +1 -0
  705. package/dist/structure/tax.d.ts +25 -0
  706. package/dist/structure/tax.d.ts.map +1 -0
  707. package/dist/structure/tax.js +86 -0
  708. package/dist/structure/tax.js.map +1 -0
  709. package/dist/structure/time-marks.d.ts +58 -0
  710. package/dist/structure/time-marks.d.ts.map +1 -0
  711. package/dist/structure/time-marks.js +74 -0
  712. package/dist/structure/time-marks.js.map +1 -0
  713. package/dist/structure/time-order.d.ts +42 -0
  714. package/dist/structure/time-order.d.ts.map +1 -0
  715. package/dist/structure/time-order.js +107 -0
  716. package/dist/structure/time-order.js.map +1 -0
  717. package/dist/structure/title-lines.d.ts +8 -0
  718. package/dist/structure/title-lines.d.ts.map +1 -0
  719. package/dist/structure/title-lines.js +27 -0
  720. package/dist/structure/title-lines.js.map +1 -0
  721. package/dist/structure/total.d.ts.map +1 -1
  722. package/dist/structure/total.js +3 -1
  723. package/dist/structure/total.js.map +1 -1
  724. package/dist/structure/version-mismatch.d.ts +1 -5
  725. package/dist/structure/version-mismatch.d.ts.map +1 -1
  726. package/dist/structure/version-mismatch.js +65 -12
  727. package/dist/structure/version-mismatch.js.map +1 -1
  728. package/dist/structure/version-order.d.ts +25 -0
  729. package/dist/structure/version-order.d.ts.map +1 -0
  730. package/dist/structure/version-order.js +77 -0
  731. package/dist/structure/version-order.js.map +1 -0
  732. package/dist/surname-near.d.ts +6 -0
  733. package/dist/surname-near.d.ts.map +1 -0
  734. package/dist/surname-near.js +31 -0
  735. package/dist/surname-near.js.map +1 -0
  736. package/dist/table-cells.d.ts +13 -0
  737. package/dist/table-cells.d.ts.map +1 -0
  738. package/dist/table-cells.js +36 -0
  739. package/dist/table-cells.js.map +1 -0
  740. package/dist/table-names.d.ts +42 -0
  741. package/dist/table-names.d.ts.map +1 -0
  742. package/dist/table-names.js +94 -0
  743. package/dist/table-names.js.map +1 -0
  744. package/dist/table-text.d.ts +9 -0
  745. package/dist/table-text.d.ts.map +1 -0
  746. package/dist/table-text.js +36 -0
  747. package/dist/table-text.js.map +1 -0
  748. package/dist/ui-labels.d.ts +16 -0
  749. package/dist/ui-labels.d.ts.map +1 -0
  750. package/dist/ui-labels.js +42 -0
  751. package/dist/ui-labels.js.map +1 -0
  752. package/dist/undefined-call.d.ts +13 -0
  753. package/dist/undefined-call.d.ts.map +1 -0
  754. package/dist/undefined-call.js +55 -0
  755. package/dist/undefined-call.js.map +1 -0
  756. package/dist/unnamed-speaker.d.ts +23 -0
  757. package/dist/unnamed-speaker.d.ts.map +1 -0
  758. package/dist/unnamed-speaker.js +176 -0
  759. package/dist/unnamed-speaker.js.map +1 -0
  760. package/dist/warning-action.d.ts +22 -0
  761. package/dist/warning-action.d.ts.map +1 -0
  762. package/dist/warning-action.js +58 -0
  763. package/dist/warning-action.js.map +1 -0
  764. package/genres.yaml +2 -0
  765. package/package.json +4 -3
  766. package/profiles/statute.yaml +8 -0
  767. package/rules/agreement-slip.yaml +2 -2
  768. package/rules/amount-range-reversed.yaml +52 -0
  769. package/rules/amount-scale-consistency.yaml +4 -4
  770. package/rules/announced-count-mismatch.yaml +9 -4
  771. package/rules/arrival-before-departure.yaml +48 -0
  772. package/rules/connection-time-short.yaml +52 -0
  773. package/rules/connective-hierarchy.yaml +3 -3
  774. package/rules/currency-notation-consistency.yaml +2 -2
  775. package/rules/date-order.yaml +9 -4
  776. package/rules/date-outside-period.yaml +64 -0
  777. package/rules/default-value-mismatch.yaml +79 -0
  778. package/rules/defined-term-form.yaml +9 -7
  779. package/rules/deprecated-option-used.yaml +78 -0
  780. package/rules/doubled-nado.yaml +28 -12
  781. package/rules/due-before-issue.yaml +68 -0
  782. package/rules/duplicate-definition.yaml +2 -2
  783. package/rules/duration-mismatch.yaml +15 -4
  784. package/rules/duration-product-mismatch.yaml +73 -0
  785. package/rules/heading-echo.yaml +2 -2
  786. package/rules/hyphen-as-dash.yaml +2 -2
  787. package/rules/kana-function-word.yaml +58 -0
  788. package/rules/latin-spacing.yaml +6 -5
  789. package/rules/line-amount-mismatch.yaml +58 -0
  790. package/rules/nado-closed-list.yaml +77 -0
  791. package/rules/name-variant.yaml +20 -2
  792. package/rules/number-word-figure-mismatch.yaml +76 -0
  793. package/rules/numbering-gap.yaml +2 -2
  794. package/rules/obligation-without-deadline.yaml +95 -0
  795. package/rules/one-sentence-paragraph-run.yaml +2 -3
  796. package/rules/parameter-table-mismatch.yaml +90 -0
  797. package/rules/party-order.yaml +84 -0
  798. package/rules/percent-sum-mismatch.yaml +2 -2
  799. package/rules/phone-number-variant.yaml +68 -0
  800. package/rules/prerequisite-after-step.yaml +78 -0
  801. package/rules/quote-unnamed-speaker.yaml +67 -0
  802. package/rules/quote-without-source.yaml +6 -6
  803. package/rules/required-listed-as-preferred.yaml +102 -0
  804. package/rules/requirement-smell.yaml +3 -3
  805. package/rules/return-type-mismatch.yaml +79 -0
  806. package/rules/sentence-initial-conjunction-run.yaml +13 -7
  807. package/rules/summary-fact-mismatch.yaml +4 -4
  808. package/rules/tax-mismatch.yaml +71 -0
  809. package/rules/time-order.yaml +65 -0
  810. package/rules/title-length.yaml +2 -2
  811. package/rules/ui-label-variant.yaml +70 -0
  812. package/rules/unbalanced-bracket.yaml +4 -4
  813. package/rules/uncomparable-graded.yaml +29 -10
  814. package/rules/undefined-function-call.yaml +77 -0
  815. package/rules/undefined-term.yaml +86 -0
  816. package/rules/unknown-word.yaml +2 -2
  817. package/rules/unqualified-superlative.yaml +2 -2
  818. package/rules/use-before-definition.yaml +2 -2
  819. package/rules/version-mismatch.yaml +12 -4
  820. package/rules/version-order.yaml +85 -0
  821. package/rules/very-adjective.yaml +31 -13
  822. package/rules/warning-without-action.yaml +64 -0
  823. package/rules/wordy-phrase.yaml +27 -9
  824. package/src/ai-score/of-document.ts +19 -9
  825. package/src/ai-score/render.ts +24 -4
  826. package/src/ai-score/score.ts +24 -3
  827. package/src/ai-score/signals.ts +12 -2
  828. package/src/ai-score/text.ts +7 -2
  829. package/src/announced-count.ts +19 -12
  830. package/src/check-source.ts +11 -2
  831. package/src/cli-text.ts +38 -16
  832. package/src/cli.ts +2 -1
  833. package/src/commands/cite-claims.ts +103 -0
  834. package/src/commands/cite-page.ts +61 -0
  835. package/src/commands/cite-scaffold.ts +27 -0
  836. package/src/commands/cite.ts +127 -58
  837. package/src/company-names.ts +202 -0
  838. package/src/default-values.ts +158 -0
  839. package/src/deprecated-use.ts +122 -0
  840. package/src/derived/session-hours.ts +62 -0
  841. package/src/derived/stays.ts +145 -0
  842. package/src/derived/time-lengths.ts +226 -0
  843. package/src/derived/unit-counts.ts +18 -0
  844. package/src/derived/working-hours.ts +97 -0
  845. package/src/detectors/acronym-context.ts +10 -2
  846. package/src/detectors/acronym-expansion.ts +57 -2
  847. package/src/detectors/address-word.ts +9 -0
  848. package/src/detectors/agreement-slip.ts +7 -1
  849. package/src/detectors/ai-phrasing.ts +6 -1
  850. package/src/detectors/amount-range.ts +54 -0
  851. package/src/detectors/amount-scale.ts +50 -17
  852. package/src/detectors/announced-count.ts +29 -11
  853. package/src/detectors/bare-comparative.ts +7 -2
  854. package/src/detectors/block-quotation.ts +95 -0
  855. package/src/detectors/bracket-label.ts +58 -0
  856. package/src/detectors/capitalised-term.ts +147 -0
  857. package/src/detectors/citation-entry.ts +20 -5
  858. package/src/detectors/code-before.ts +14 -0
  859. package/src/detectors/connective-hierarchy.ts +39 -11
  860. package/src/detectors/currency-notation.ts +2 -1
  861. package/src/detectors/date-outside-period.ts +41 -0
  862. package/src/detectors/default-values.ts +17 -0
  863. package/src/detectors/defined-term-form.ts +84 -15
  864. package/src/detectors/definition-use.ts +10 -2
  865. package/src/detectors/deprecated-use.ts +17 -0
  866. package/src/detectors/derived-numbers.ts +174 -10
  867. package/src/detectors/document-shape.ts +6 -1
  868. package/src/detectors/due-date.ts +47 -0
  869. package/src/detectors/en-shape.ts +27 -11
  870. package/src/detectors/fact-consistency.ts +95 -3
  871. package/src/detectors/heading-echo.ts +11 -1
  872. package/src/detectors/kana-function-word.ts +71 -0
  873. package/src/detectors/line-amount.ts +33 -0
  874. package/src/detectors/location-pointer.ts +30 -0
  875. package/src/detectors/mark-shape.ts +18 -1
  876. package/src/detectors/nado-closed-list.ts +25 -0
  877. package/src/detectors/name-variant.ts +164 -13
  878. package/src/detectors/next-word.ts +56 -9
  879. package/src/detectors/number-word-figure.ts +43 -0
  880. package/src/detectors/obligation-without-deadline.ts +192 -0
  881. package/src/detectors/open-end-names.ts +140 -0
  882. package/src/detectors/ordinal-run-gaps.ts +101 -0
  883. package/src/detectors/orthographic-variant.ts +39 -14
  884. package/src/detectors/orthography.ts +6 -1
  885. package/src/detectors/parameter-table.ts +17 -0
  886. package/src/detectors/party-order.ts +50 -0
  887. package/src/detectors/phone-number-variant.ts +18 -0
  888. package/src/detectors/prerequisite-order.ts +35 -0
  889. package/src/detectors/quote-unnamed-speaker.ts +19 -0
  890. package/src/detectors/quote-without-source.ts +57 -10
  891. package/src/detectors/registry/amount-range.ts +4 -0
  892. package/src/detectors/registry/arrival-before-departure.ts +4 -0
  893. package/src/detectors/registry/connection-time-short.ts +4 -0
  894. package/src/detectors/registry/date-outside-period.ts +4 -0
  895. package/src/detectors/registry/default-values.ts +4 -0
  896. package/src/detectors/registry/deprecated-use.ts +4 -0
  897. package/src/detectors/registry/due-date.ts +4 -0
  898. package/src/detectors/registry/duration-product-mismatch.ts +4 -0
  899. package/src/detectors/registry/kana-function-word.ts +4 -0
  900. package/src/detectors/registry/line-amount.ts +4 -0
  901. package/src/detectors/registry/nado-closed-list.ts +4 -0
  902. package/src/detectors/registry/number-word-figure.ts +4 -0
  903. package/src/detectors/registry/obligation-without-deadline.ts +4 -0
  904. package/src/detectors/registry/parameter-table.ts +4 -0
  905. package/src/detectors/registry/party-order.ts +4 -0
  906. package/src/detectors/registry/phone-number-variant.ts +4 -0
  907. package/src/detectors/registry/prerequisite-order.ts +4 -0
  908. package/src/detectors/registry/quote-unnamed-speaker.ts +4 -0
  909. package/src/detectors/registry/requirement-lists.ts +4 -0
  910. package/src/detectors/registry/return-type.ts +4 -0
  911. package/src/detectors/registry/tax-amount.ts +4 -0
  912. package/src/detectors/registry/time-order.ts +4 -0
  913. package/src/detectors/registry/ui-label.ts +4 -0
  914. package/src/detectors/registry/undefined-call.ts +4 -0
  915. package/src/detectors/registry/undefined-term.ts +4 -0
  916. package/src/detectors/registry/version-order.ts +4 -0
  917. package/src/detectors/registry/warning-action.ts +4 -0
  918. package/src/detectors/requirement-lists.ts +65 -0
  919. package/src/detectors/requirement-smell.ts +29 -9
  920. package/src/detectors/return-type.ts +30 -0
  921. package/src/detectors/structure-tree.ts +55 -22
  922. package/src/detectors/superlative-scope.ts +13 -1
  923. package/src/detectors/tax-amount.ts +25 -0
  924. package/src/detectors/technical-docs.ts +7 -1
  925. package/src/detectors/term-extension.ts +67 -0
  926. package/src/detectors/time-order.ts +84 -0
  927. package/src/detectors/ui-label.ts +17 -0
  928. package/src/detectors/unbalanced-bracket.ts +7 -14
  929. package/src/detectors/undefined-call.ts +19 -0
  930. package/src/detectors/undefined-term.ts +120 -0
  931. package/src/detectors/unknown-word.ts +3 -3
  932. package/src/detectors/vague-deadline.ts +3 -3
  933. package/src/detectors/version-mismatch.ts +26 -5
  934. package/src/detectors/version-order.ts +50 -0
  935. package/src/detectors/warning-action.ts +49 -0
  936. package/src/document.ts +4 -1
  937. package/src/facts/condition-pairs.ts +289 -0
  938. package/src/facts/event-dates.ts +63 -0
  939. package/src/facts/fact-scope.ts +6 -0
  940. package/src/facts/labelled-facts.ts +13 -1
  941. package/src/facts/table-facts.ts +6 -3
  942. package/src/grade/ai-score.ts +1 -1
  943. package/src/grade/text.ts +2 -2
  944. package/src/heading-numbering.ts +2 -2
  945. package/src/html/fetch-page.ts +64 -0
  946. package/src/html/fetched-text.ts +32 -0
  947. package/src/html/html-content-block.ts +107 -0
  948. package/src/html/html-elements.ts +127 -0
  949. package/src/html/html-footnote-marks.ts +20 -0
  950. package/src/html/html-heading-links.ts +93 -0
  951. package/src/html/html-lost-tags.ts +14 -0
  952. package/src/html/html-markdown.ts +481 -0
  953. package/src/html/html-preformatted.ts +110 -0
  954. package/src/html/html-reader-only.ts +82 -0
  955. package/src/html/html-run-in-headings.ts +43 -0
  956. package/src/html/html-tables.ts +76 -0
  957. package/src/html/html-widgets.ts +114 -0
  958. package/src/html/markup-text.ts +35 -0
  959. package/src/html/page-document.ts +22 -0
  960. package/src/inline-count.ts +146 -0
  961. package/src/kana-spelling.ts +7 -0
  962. package/src/location-part.ts +30 -0
  963. package/src/nado-closed-list.ts +106 -0
  964. package/src/name-cue.ts +35 -0
  965. package/src/name-variants.ts +133 -12
  966. package/src/name-word-order.ts +149 -0
  967. package/src/paragraph-runs.ts +12 -2
  968. package/src/parameter-table.ts +208 -0
  969. package/src/phone-numbers.ts +98 -0
  970. package/src/place-names.ts +248 -0
  971. package/src/plugin.ts +9 -0
  972. package/src/prerequisite-order.ts +39 -0
  973. package/src/profile/parse.ts +10 -1
  974. package/src/reasons.ts +4 -0
  975. package/src/render/rules-json.ts +4 -0
  976. package/src/render/rules-table.ts +6 -3
  977. package/src/return-type.ts +361 -0
  978. package/src/rule-genres.ts +5 -2
  979. package/src/rule-load.ts +3 -2
  980. package/src/run.ts +3 -1
  981. package/src/spelling.ts +8 -0
  982. package/src/structure/action-due.ts +179 -0
  983. package/src/structure/amount-range.ts +219 -0
  984. package/src/structure/amount-scale.ts +18 -0
  985. package/src/structure/cite.ts +21 -2
  986. package/src/structure/connection-times.ts +226 -0
  987. package/src/structure/counted-amounts.ts +42 -0
  988. package/src/structure/date-order-tie.ts +86 -0
  989. package/src/structure/date-order.ts +100 -23
  990. package/src/structure/date-outside-period.ts +192 -0
  991. package/src/structure/date-range.ts +45 -9
  992. package/src/structure/definition-use.ts +24 -3
  993. package/src/structure/due-date.ts +46 -0
  994. package/src/structure/heading-runs.ts +24 -0
  995. package/src/structure/install-pin.ts +115 -0
  996. package/src/structure/leg-times.ts +213 -0
  997. package/src/structure/line-amount-unit.ts +35 -0
  998. package/src/structure/line-amount.ts +162 -0
  999. package/src/structure/number-word-figure.ts +199 -0
  1000. package/src/structure/numbering.ts +3 -0
  1001. package/src/structure/ordinal-runs.ts +107 -0
  1002. package/src/structure/party-order.ts +115 -0
  1003. package/src/structure/percent-sum-prose.ts +46 -3
  1004. package/src/structure/percent-sum.ts +16 -2
  1005. package/src/structure/release-list.ts +69 -0
  1006. package/src/structure/requirement-lists.ts +145 -0
  1007. package/src/structure/share-column.ts +25 -0
  1008. package/src/structure/stated-period.ts +161 -0
  1009. package/src/structure/tax.ts +114 -0
  1010. package/src/structure/time-marks.ts +127 -0
  1011. package/src/structure/time-order.ts +141 -0
  1012. package/src/structure/title-lines.ts +33 -0
  1013. package/src/structure/total.ts +5 -1
  1014. package/src/structure/version-mismatch.ts +67 -13
  1015. package/src/structure/version-order.ts +94 -0
  1016. package/src/surname-near.ts +31 -0
  1017. package/src/table-cells.ts +41 -0
  1018. package/src/table-names.ts +113 -0
  1019. package/src/table-text.ts +39 -0
  1020. package/src/ui-labels.ts +55 -0
  1021. package/src/undefined-call.ts +65 -0
  1022. package/src/unnamed-speaker.ts +224 -0
  1023. package/src/warning-action.ts +73 -0
  1024. package/styles/koyobun.yaml +7 -4
@@ -1,7 +1,17 @@
1
1
  import type { LengthUnit, Localized } from "../plugin.ts";
2
2
  import { localized } from "../render/text.ts";
3
3
  import type { StructureText } from "../outline/structure-text.ts";
4
- import { HIGH_SIGNS, MEDIUM_SIGNS, shownSignsOf, type AiScore, type NotScored, type SignalPlace, type StructurePlace } from "./score.ts";
4
+ import {
5
+ HIGH_SIGNS,
6
+ MEDIUM_SIGNS,
7
+ shownSignsOf,
8
+ TOGETHER_SIGNALS,
9
+ type AiScore,
10
+ type NotScored,
11
+ type SignalPlace,
12
+ type StructurePlace,
13
+ type Together,
14
+ } from "./score.ts";
5
15
  import type { AiScoreText } from "./text.ts";
6
16
 
7
17
  /** What a rendering needs besides the score: the texts, the rules' names, and the genre group's name, in one language. */
@@ -46,7 +56,15 @@ const signalLine = (signal: SignalPlace, view: ScoreView): string => {
46
56
  const namesLine = (names: readonly string[], line: (names: string) => string, view: ScoreView): string[] =>
47
57
  names.length === 0 ? [] : [` ${line(names.join(view.text.listSeparator))}`];
48
58
 
49
- const signalLines = (signals: readonly SignalPlace[], view: ScoreView): string[] => {
59
+ const COMPOSITE = "ai-generated-composite";
60
+
61
+ const togetherLines = (together: Together, view: ScoreView): string[] => {
62
+ if (!together.counted) return [];
63
+ const names = together.fired.map((rule) => nameOf(rule, view)).join(view.text.listSeparator);
64
+ return [` ${view.text.together(nameOf(COMPOSITE, view), names, together.fired.length, TOGETHER_SIGNALS)}`];
65
+ };
66
+
67
+ const signalLines = (signals: readonly SignalPlace[], together: Together, view: ScoreView): string[] => {
50
68
  const compared = signals.filter((signal) => signal.human !== undefined);
51
69
  const shown = compared.filter((signal) => signal.count > 0);
52
70
  const quiet = compared.length - shown.length;
@@ -55,6 +73,7 @@ const signalLines = (signals: readonly SignalPlace[], view: ScoreView): string[]
55
73
  return [
56
74
  view.text.signalsHeading,
57
75
  ...shown.map((signal) => ` ${signalLine(signal, view)}`),
76
+ ...togetherLines(together, view),
58
77
  ...(quiet > 0 ? [` ${view.text.quiet(quiet)}`] : []),
59
78
  ...namesLine(unshared, view.text.noHumanShare, view),
60
79
  ...namesLine(notRun, view.text.notRun, view),
@@ -85,7 +104,7 @@ export const renderAiScoreFriendly = (path: string, score: AiScore, view: ScoreV
85
104
  ` ${view.text.signs(score.signs, score.compared, MEDIUM_SIGNS, HIGH_SIGNS)}`,
86
105
  ` ${view.text.disclaimer}`,
87
106
  "",
88
- ...signalLines(score.signals, view),
107
+ ...signalLines(score.signals, score.together, view),
89
108
  "",
90
109
  ...structureBlock(score, view),
91
110
  ];
@@ -104,7 +123,7 @@ export const aiScoreJson = (score: AiScore): Readonly<Record<string, unknown>> =
104
123
  group: score.group,
105
124
  signs: score.signs,
106
125
  compared: score.compared,
107
- thresholds: { medium: MEDIUM_SIGNS, high: HIGH_SIGNS },
126
+ thresholds: { medium: MEDIUM_SIGNS, high: HIGH_SIGNS, together: TOGETHER_SIGNALS },
108
127
  signals: score.signals.map((signal) => ({
109
128
  rule: signal.rule,
110
129
  count: signal.count,
@@ -121,4 +140,5 @@ export const aiScoreJson = (score: AiScore): Readonly<Record<string, unknown>> =
121
140
  beyond: place.beyond,
122
141
  sameAs: place.sameAs ?? null,
123
142
  })) ?? null,
143
+ together: { fired: score.together.fired, counted: score.together.counted },
124
144
  });
@@ -27,6 +27,12 @@ export const MIN_BASELINE_DOCUMENTS = Math.ceil(1 / RARE_SHARE);
27
27
  export const MEDIUM_SIGNS = 3;
28
28
  export const HIGH_SIGNS = 5;
29
29
 
30
+ /**
31
+ * In the composite's own signals: ai-generated-composite's strict level, held to it by test_ai_score.ts. That many of
32
+ * them firing in one document is one more sign: `yarn ai-score:corpus --all` shows how many human documents reach it.
33
+ */
34
+ export const TOGETHER_SIGNALS = 2;
35
+
30
36
  export type AiLevel = "low" | "medium" | "high";
31
37
 
32
38
  /** One AI-shape rule's run on the document: how many findings it made, or why it did not run. */
@@ -43,6 +49,9 @@ export type SignalPlace = SignalRun & {
43
49
  /** One structure measure against human articles. sameAs: the rule that reads the same shape, when that rule already counts it. */
44
50
  export type StructurePlace = Placement & { readonly sameAs: string | undefined };
45
51
 
52
+ /** The composite's signals that fired in the document, and whether enough fired together to count as one more sign. */
53
+ export type Together = { readonly fired: readonly string[]; readonly counted: boolean };
54
+
46
55
  export type NotScored =
47
56
  | { readonly reason: "too-short"; readonly length: number; readonly minimum: number; readonly unit: LengthUnit }
48
57
  | { readonly reason: "no-baseline"; readonly compared: number; readonly needed: number };
@@ -59,6 +68,7 @@ export type AiScore = {
59
68
  readonly signals: readonly SignalPlace[];
60
69
  /** The structure measures against human articles, or undefined where they are not compared for the genre. */
61
70
  readonly structure: readonly StructurePlace[] | undefined;
71
+ readonly together: Together;
62
72
  };
63
73
 
64
74
  /** What the score is computed from. structure: undefined where the structure baseline does not apply to the genre. */
@@ -70,6 +80,8 @@ export type ScoreInput = {
70
80
  readonly signals: readonly SignalRun[];
71
81
  readonly shares: HumanShares;
72
82
  readonly structure: StructureScore | undefined;
83
+ /** The ids of ai-generated-composite's signals that fired, at the levels the human shares were measured at. */
84
+ readonly compositeFired: readonly string[];
73
85
  };
74
86
 
75
87
  export const levelOf = (signs: number): AiLevel => {
@@ -106,16 +118,25 @@ export const aiScoreOf = (input: ScoreInput): AiScore => {
106
118
  const signals = input.signals.map((run) => placeSignal(run, input.shares, input.group));
107
119
  const placements = input.structure?.placements.map((placement) => placeStructure(placement, signals));
108
120
  const measures = placements ?? [];
109
- const signs = signals.filter((signal) => signal.unusual).length + measures.filter((place) => place.beyond && place.sameAs === undefined).length;
121
+ const together = { fired: input.compositeFired, counted: input.compositeFired.length >= TOGETHER_SIGNALS };
122
+ const signs =
123
+ signals.filter((signal) => signal.unusual).length +
124
+ measures.filter((place) => place.beyond && place.sameAs === undefined).length +
125
+ (together.counted ? 1 : 0);
110
126
  const compared =
111
127
  signals.filter((signal) => signal.human !== undefined).length +
112
128
  measures.filter((place) => place.pastShare !== undefined && !comparedTwice(place, signals)).length;
113
129
  const notScored = notScoredOf(input, compared);
114
- return { group: input.group, level: notScored === undefined ? levelOf(signs) : undefined, notScored, signs, compared, signals, structure: placements };
130
+ const level = notScored === undefined ? levelOf(signs) : undefined;
131
+ return { group: input.group, level, notScored, signs, compared, signals, structure: placements, together };
115
132
  };
116
133
 
117
- /** The signs that counted, for one line: rule ids, and structure measures as structure:<id>. */
134
+ /** How the together sign shows in one line: the composite's id at the level whose count it uses. */
135
+ export const TOGETHER_SIGN = "ai-generated-composite:strict";
136
+
137
+ /** The signs that counted, for one line: rule ids, structure measures as structure:<id>, and TOGETHER_SIGN. */
118
138
  export const shownSignsOf = (score: AiScore): string[] => [
119
139
  ...score.signals.filter((signal) => signal.unusual).map((signal) => signal.rule),
120
140
  ...(score.structure ?? []).filter((place) => place.beyond && place.sameAs === undefined).map((place) => `structure:${place.feature.id}`),
141
+ ...(score.together.counted ? [TOGETHER_SIGN] : []),
121
142
  ];
@@ -28,12 +28,22 @@ export const SAME_SHAPE: Readonly<Partial<Record<FeatureId, string>>> = {
28
28
  "three-item-lists": "rule-of-three",
29
29
  };
30
30
 
31
+ /** The signals ai-generated-composite reads: the together sign counts how many of them fired. */
32
+ export const compositeSignalIds = (rules: readonly RuleDefinition[]): readonly string[] => rules.find((rule) => rule.id === COMPOSITE)?.from ?? [];
33
+
31
34
  /** The composite's levels: the score's level boundaries are held to them (test_ai_score.ts). */
32
35
  export const compositeLevels = (rules: readonly RuleDefinition[]): LevelTable => rules.find((rule) => rule.id === COMPOSITE)?.levels ?? {};
33
36
 
34
37
  /**
35
38
  * The level each rule runs at when measured on human documents (`yarn rules:measure`): the genre's level, and normal
36
- * where the genre turns the rule off, so a share exists for every genre group the rule can run in.
39
+ * where the genre turns the rule off, so a share exists for every genre group the rule can run in. A rule that runs only
40
+ * with a style (opt_in) stays off: how often it fires on documents that never chose the style says nothing about it.
37
41
  */
42
+ const measuredLevel = (rule: RuleDefinition, preset: Readonly<Record<string, Level>>): Level => {
43
+ if (rule.opt_in === true) return "off";
44
+ const level = preset[rule.id];
45
+ return level === undefined || level === "off" ? "normal" : level;
46
+ };
47
+
38
48
  export const measuredLevelsOf = (rules: readonly RuleDefinition[], preset: Readonly<Record<string, Level>>): Record<string, Level> =>
39
- Object.fromEntries(rules.map((rule) => [rule.id, preset[rule.id] === undefined || preset[rule.id] === "off" ? "normal" : (preset[rule.id] ?? "normal")]));
49
+ Object.fromEntries(rules.map((rule) => [rule.id, measuredLevel(rule, preset)]));
@@ -18,6 +18,8 @@ export type AiScoreText = {
18
18
  readonly fired: (name: string, count: number, fired: number, documents: number, group: string) => string;
19
19
  /** A signal that fired but is common in human documents of the group, so it does not count. */
20
20
  readonly common: (name: string, count: number, fired: number, documents: number) => string;
21
+ /** The composite's signals that fired together, enough at its strict level to count as one more sign. */
22
+ readonly together: (name: string, names: string, count: number, limit: number) => string;
21
23
  readonly quiet: (count: number) => string;
22
24
  /** The structure measures within what human articles show. */
23
25
  readonly usual: (count: number) => string;
@@ -59,6 +61,7 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
59
61
  `✗ ${name}: ${String(count)} 件 人が書いた文書(${group})${String(documents)} 本のうち ${String(fired)} 本`,
60
62
  common: (name, count, fired, documents) =>
61
63
  `· ${name}: ${String(count)} 件 人の文書でも出る(${String(documents)} 本のうち ${String(fired)} 本)ので数えません`,
64
+ together: (name, names, count, limit) => `✗ ${name}: ${String(count)} 種(${names})。厳しめの段階の ${String(limit)} 種から、目印 1 個に数えます`,
62
65
  quiet: (count) => `· ほかの ${String(count)} 項目は出ていません`,
63
66
  usual: (count) => `· ほかの ${String(count)} 項目は人の記事でふつうの値です`,
64
67
  noHumanShare: (names) => `比べていない(人の文書の基準が無い): ${names}`,
@@ -67,7 +70,7 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
67
70
  sameAs: (name) => `「${name}」と同じ形なので 1 つに数えます`,
68
71
  summary: (headline, signs, path) => `${headline}: 目印 ${String(signs)} 個 ※ 書いたのが AI かどうかの判定ではありません。内訳: chaff ai-score ${path}`,
69
72
  summaryNotScored: (reason) => `AI らしさ: 測っていません(${reason})`,
70
- usage: "使い方: chaff ai-score <file>... [--genre <ジャンル>] [--format text|json] [--compact]",
73
+ usage: "使い方: chaff ai-score <file>... [--genre <ジャンル>] [--language ja|en|…] [--format text|json] [--json] [--compact]",
71
74
  unknownFormat: (format) => `--format は text か json です(${format} は知りません)`,
72
75
  listSeparator: "、",
73
76
  aside: (main, inner) => `${main}(${inner})`,
@@ -86,6 +89,8 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
86
89
  `✗ ${name}: ${String(count)} in ${String(fired)} of ${String(documents)} human-written documents (${group})`,
87
90
  common: (name, count, fired, documents) =>
88
91
  `· ${name}: ${String(count)} common in human documents too (${String(fired)} of ${String(documents)}), not counted`,
92
+ together: (name, names, count, limit) =>
93
+ `✗ ${name}: ${String(count)} of its signals (${names}); from ${String(limit)}, its strict level, that is one more sign`,
89
94
  quiet: (count) => `· the other ${String(count)} did not show`,
90
95
  usual: (count) => `· the other ${String(count)} are usual for human articles`,
91
96
  noHumanShare: (names) => `not compared (no human baseline): ${names}`,
@@ -95,7 +100,7 @@ export const AI_SCORE_TEXT: Texts<AiScoreText> = {
95
100
  summary: (headline, signs, path) =>
96
101
  `${headline}: ${String(signs)} ${signs === 1 ? "sign" : "signs"}. Not a verdict on whether AI wrote it. Breakdown: chaff ai-score ${path}`,
97
102
  summaryNotScored: (reason) => `AI-likeness: not scored (${reason})`,
98
- usage: "usage: chaff ai-score <file>... [--genre <genre>] [--format text|json] [--compact]",
103
+ usage: "usage: chaff ai-score <file>... [--genre <genre>] [--language ja|en|…] [--format text|json] [--json] [--compact]",
99
104
  unknownFormat: (format) => `--format is text or json (not ${format})`,
100
105
  listSeparator: ", ",
101
106
  aside: (main, inner) => `${main} (${inner})`,
@@ -44,7 +44,7 @@ const lastSentenceStart = (text: string): number => {
44
44
  return ends.at(-1) ?? 0;
45
45
  };
46
46
 
47
- const alternation = (words: readonly string[]): string =>
47
+ export const alternation = (words: readonly string[]): string =>
48
48
  words
49
49
  .toSorted((a, b) => b.length - a.length)
50
50
  .map(escapeRegExp)
@@ -52,16 +52,18 @@ const alternation = (words: readonly string[]): string =>
52
52
 
53
53
  /**
54
54
  * 数と、それが数えるもの。数の前が数字・英字・数の字なら数の途中(十三、23、eleven の中)。
55
- * 英語は数と数える語の間に語を二つまで置ける(three key steps)。数える語が無くても、文がコロンで終わる直前の数(the following two:)は数に読む。
55
+ * 英語は数と数える語の間に語を二つまで置ける(three key steps)。数える語が無くても、文がコロンで終わる直前の数(the following two:)と、
56
+ * その後ろに語が一つだけある数(the following three documents:)は数に読む。どちらも先を指す語のすぐ後ろでだけ予告になる(pointsAhead)。
56
57
  */
57
58
  const phrasePattern = (words: CountWords): RegExp => {
58
59
  const numberChars = escapeRegExp([...new Set(words.numbers.join(""))].join(""));
59
60
  const numbers = words.numbers.length === 0 ? "\\p{Nd}+" : `\\p{Nd}+|${alternation(words.numbers)}`;
60
61
  const counted = `[ \\t\\u00a0]?(?:\\p{Ll}[\\p{Ll}-]*[ \\t]){0,2}(${alternation(words.counters)})(?![A-Za-z])`;
61
- return new RegExp(`(?<![\\p{N}A-Za-z${numberChars}])(${numbers})(?:${counted}|(?=[ \\t]?[::][ \\t]*$))`, "giu");
62
+ const uncounted = String.raw`(?:[ \t]\p{Ll}[\p{Ll}-]*)?(?=[ \t]?[::][ \t]*$)`;
63
+ return new RegExp(`(?<![\\p{N}A-Za-z${numberChars}])(${numbers})(?:${counted}|${uncounted})`, "giu");
62
64
  };
63
65
 
64
- const valueOf = (written: string, numbers: readonly string[]): number => {
66
+ export const valueOf = (written: string, numbers: readonly string[]): number => {
65
67
  const digits = Number(written.normalize("NFKC"));
66
68
  if (!Number.isNaN(digits)) return digits;
67
69
  return numbers.findIndex((number) => number.toLowerCase() === written.toLowerCase()) + 1;
@@ -111,15 +113,20 @@ const pointsAhead = (sentence: string, phrase: Phrase, anchors: readonly string[
111
113
  return COLON_END.test(sentence.trimEnd()) && !number.test(sentence.slice(phrase.end));
112
114
  };
113
115
 
114
- /** 最後の一文の予告。数がちょうど一つで、目安や順番でなく、先を指しているときだけ。 */
116
+ /**
117
+ * 最後の一文の予告。数がちょうど一つで、目安や順番でなく、先を指しているときだけ。数える語の無い数に語が続くもの
118
+ * (2 weeks:)は、先を指す語のすぐ後ろでなければ数に数えない(within 2 weeks: は期限で、予告の数を消さない)。
119
+ */
115
120
  const announcedIn = (sentence: string, words: CountWords, patterns: Patterns): Phrase | undefined => {
116
- const phrases = [...sentence.matchAll(patterns.phrase)].map((match) => ({
117
- start: match.index,
118
- numberEnd: match.index + (match[1] ?? "").length,
119
- end: match.index + match[0].length,
120
- announced: valueOf(match[1] ?? "", words.numbers),
121
- counted: match[2] !== undefined,
122
- }));
121
+ const phrases = [...sentence.matchAll(patterns.phrase)]
122
+ .map((match) => ({
123
+ start: match.index,
124
+ numberEnd: match.index + (match[1] ?? "").length,
125
+ end: match.index + match[0].length,
126
+ announced: valueOf(match[1] ?? "", words.numbers),
127
+ counted: match[2] !== undefined,
128
+ }))
129
+ .filter((phrase) => phrase.counted || phrase.end === phrase.numberEnd || pointsAhead(sentence, phrase, words.anchors, patterns.number));
123
130
  const only = phrases.length === 1 ? phrases[0] : undefined;
124
131
  if (only === undefined || only.announced < 1 || isHedged(sentence, only, words)) return undefined;
125
132
  return pointsAhead(sentence, only, words.anchors, patterns.number) ? only : undefined;
@@ -6,7 +6,7 @@ import { limitsFor } from "./config/style.ts";
6
6
  import { rulesOf } from "./custom/load.ts";
7
7
  import { guessLanguage } from "./detect.ts";
8
8
  import { buildDocument, teamRules } from "./document.ts";
9
- import type { CrossDetector, ProseDocument, RuleDefinition } from "./plugin.ts";
9
+ import type { AdapterNeeds, CrossDetector, ProseDocument, RuleDefinition } from "./plugin.ts";
10
10
  import { profileFor } from "./profile/for-file.ts";
11
11
  import { resolveGenre, type ResolvedGenre } from "./resolve-genre.ts";
12
12
  import { neededBy, runRulesWith, type RunContext, type RunResult } from "./run.ts";
@@ -33,13 +33,22 @@ export type SourceCheck = {
33
33
  readonly applied: Applied;
34
34
  };
35
35
 
36
+ /** What the language adapter is asked to prepare for these rules under this chaff.yaml: what the running rules read, nothing more. */
37
+ export const adapterNeedsOf = (
38
+ rules: readonly RuleDefinition[],
39
+ config: Pick<Config, "rules">,
40
+ experimental: boolean,
41
+ genre: string,
42
+ language: string,
43
+ ): AdapterNeeds => neededBy(rules, config.rules, experimental, genre, language);
44
+
36
45
  /** Lints one text as `chaff <file>` does. The file need not exist: `chaff grade` checks a model's output from memory. */
37
46
  export const checkSource = async (path: string, source: string, config: Config, choice: CheckChoice): Promise<SourceCheck> => {
38
47
  const language = choice.language ?? documentLanguage(path, source, config);
39
48
  const adapter = await loadAdapter(language);
40
49
  const genre = resolveGenre(path, source, config, choice.genre);
41
50
  const rules = rulesOf(language, config);
42
- await adapter.prepare?.(neededBy(rules, config.rules, choice.experimental, genre.genre, language));
51
+ await adapter.prepare?.(adapterNeedsOf(rules, config, choice.experimental, genre.genre, language));
43
52
  const doc = buildDocument(path, source, adapter, teamRules(config, language), profileFor(config, path, source, language, genre.genre));
44
53
  const context: RunContext = {
45
54
  settings: config.rules,
package/src/cli-text.ts CHANGED
@@ -34,17 +34,26 @@ const USAGE_JA = `chaff — 文章の読みにくいところを見つけます
34
34
  chaff init --plugin <名前> YAML だけのルールの束(chaff-plugin-<名前>/)を作る
35
35
  chaff plugin-test [フォルダ] プラグインの各ルールを、そのルールの例にかけて確かめる
36
36
  chaff --version chaffjs と言語パッケージの版
37
- chaff eval <dir> 手元の文書で閾値を測り直す
37
+ chaff eval <dir> [--rule <rule>] 手元の文書で閾値を測り直す(--rule でそのルールだけ)
38
38
  chaff explain <rule> そのルールの意図と根拠を読む
39
39
  chaff genres ジャンル(文書の種類)の一覧と、それぞれ何向けか
40
40
  chaff tree <file> [--format sexp|json] 文書を番地の付いた木にする(条・項・定義・参照)
41
- chaff cite <原文> <引用.json> 回答の引用(番地と引用文)が原文にあるかを確かめる
42
- chaff compare <前> <後> 書き換えで事実(数・日付・URL・コード・名前・引用…)が落ちても足されてもいないかを確かめる
43
- chaff facts <file> compare が照合する事実を、書き直す前の控えとして一覧にする
44
- chaff outline <file> [<後>] 見出しの構成と形(見出しの数・節の平均の長さ・箇条書きの割合・太字)を測る。2 つなら前と後を並べる
45
- chaff ai-score <file>... [--format json] AI らしさの簡易判定(低・中・高)。生成文に多い目印を、同じジャンルの人の文書と比べる(書いたのが AI かは判定しない)
46
- chaff grade <items.jsonl> [--out <results.jsonl>] [--baseline <前の results.jsonl>] [--compact] [--json]
41
+ chaff cite <原文> <引用.json> [--format text|json] 回答の引用(番地と引用文)が原文にあるかを確かめる
42
+ chaff cite --scaffold <file> 出典の無い引用を、出典を書き込む引用.json のひな形にする
43
+ chaff cite --url <URL> <引用.json> 引用が Web のページにあるかを確かめる(取得したページは HTML から Markdown にして読む)
44
+ chaff compare <前> <後> [--json|--compact] 書き換えで事実(数・日付・URL・コード・名前・引用…)が落ちても足されてもいないかを確かめる
45
+ --allow-dropped <種類> と --allow-added <種類> は、その種類の欠落・追加を許す(カンマで並べる。種類は number date time url code name quote heading reference footnote)
46
+ --distinct は、何回述べたかではなく、述べているかだけを比べる
47
+ chaff facts <file> [--json|--compact] compare が照合する事実を、書き直す前の控えとして一覧にする
48
+ chaff outline <file> [<後>] [--json|--compact] 見出しの構成と形(見出しの数・節の平均の長さ・箇条書きの割合・太字)を測る。2 つなら前と後を並べる
49
+ chaff ai-score <file>... [--format text|json] [--json] [--compact]
50
+ AI らしさの簡易判定(低・中・高)。生成文に多い目印を、同じジャンルの人の文書と比べる(書いたのが AI かは判定しない)
51
+ --json は --format json と同じ。--compact はファイルごとに 1 行
52
+ chaff grade <items.jsonl> [--out <results.jsonl>] [--baseline <前の results.jsonl>] [--allow-stamp-mismatch]
53
+ [--variant-key <欄>] [--format text|json|markdown] [--json] [--compact]
47
54
  AI の出力を JSONL でまとめて採点する(指摘の率・事実・引用・合否。何も送らない)
55
+ --allow-stamp-mismatch はルールか設定が前の回と違っても比べる(そのことを先に出す)
56
+ --variant-key は variant の欄の代わりにその欄で出力を分けて並べる。--json は --format json と同じ。markdown は PR のコメント向け
48
57
  chaff fix-plan <file> [--depth light|structure|register] [--json]
49
58
  指摘をルールごとにまとめ、直す方向と確かめのコマンドを、書き直す人や AI 向けの計画にする(何も送らない)
50
59
  chaff rules ルールの一覧を、グループごとに表で出す(いまの段階つき)
@@ -53,7 +62,8 @@ const USAGE_JA = `chaff — 文章の読みにくいところを見つけます
53
62
  chaff suppressions <dir> stet で黙らせている指摘を数える
54
63
  chaff relax|strict|off <rule> [--why "理由"]
55
64
  chaff enable <rule> [--why "理由"] 試験中のルールを 1 つだけ動かす(chaff.yaml の rules に <rule>: normal と書く)
56
- chaff skill [--global] Claude Code の skill を入れる(.claude/skills/chaff/、--global で ~/.claude/)
65
+ chaff skill [--global] [--force] Claude Code の skill を入れる(.claude/skills/chaff/、--global で ~/.claude/)
66
+ 手で直したらしい skill は置き換えない。--force で置き換える
57
67
  chaff feedback <file> --rule <rule> [--line N] | --missed --line N
58
68
  誤った指摘・見逃しの報告の下書きを作る(何も送らない。--with-config で chaff.yaml 全体も載せる)
59
69
 
@@ -66,6 +76,7 @@ const USAGE_JA = `chaff — 文章の読みにくいところを見つけます
66
76
  --dry-run test で、何を AI に送るかだけを見る(API を呼びません)
67
77
  --sarif <path> 指摘を SARIF で書き出す(GitHub の PR の行に出すため)
68
78
  --include <glob> フォルダを見るとき、Markdown のほかにこのファイルも検査する(--include "*.yaml"。chaff.yaml の include と同じ)
79
+ --language <ja|en> tree・cite・compare・facts・outline・ai-score で、文書の言語を決める(chaff.yaml と中身からの推定より優先)
69
80
 
70
81
  この箇所だけ黙らせる: <!-- stet: rule-id — 理由 -->
71
82
 
@@ -82,17 +93,26 @@ const USAGE_EN = `chaff — finds what makes writing hard to read. It never rewr
82
93
  chaff init --plugin <name> create a YAML rule pack, chaff-plugin-<name>/
83
94
  chaff plugin-test [folder] run each rule of a plugin on the rule's own example
84
95
  chaff --version the version of chaffjs and its language packages
85
- chaff eval <dir> re-measure the limits on your own documents
96
+ chaff eval <dir> [--rule <rule>] re-measure the limits on your own documents (--rule: that rule only)
86
97
  chaff explain <rule> read what a rule is for and why
87
98
  chaff genres list the genres (kinds of document) and what each is for
88
99
  chaff tree <file> [--format sexp|json] the document as a tree of addresses (sections, clauses, definitions, references)
89
- chaff cite <source> <quotes.json> check that quoted passages (address and text) are in the source
90
- chaff compare <before> <after> check that a rewrite dropped no fact and added none (numbers, dates, URLs, code, names, quotations…)
91
- chaff facts <file> list the facts compare checks, as an inventory to keep before a rewrite
92
- chaff outline <file> [<after>] measure the outline and its shape (headings, average section length, text in lists, bold); two files side by side
93
- chaff ai-score <file>... [--format json] quick AI-likeness score (low, medium, high): signs common in generated text against human documents of the genre (not a verdict on who wrote it)
94
- chaff grade <items.jsonl> [--out <results.jsonl>] [--baseline <earlier results.jsonl>] [--compact] [--json]
100
+ chaff cite <source> <quotes.json> [--format text|json] check that quoted passages (address and text) are in the source
101
+ chaff cite --scaffold <file> a quotes.json to fill in with sources, from the quotations that give none
102
+ chaff cite --url <URL> <quotes.json> check quotations against a web page (fetched, HTML read as Markdown)
103
+ chaff compare <before> <after> [--json|--compact] check that a rewrite dropped no fact and added none (numbers, dates, URLs, code, names, quotations…)
104
+ --allow-dropped <kinds> and --allow-added <kinds> allow those kinds to go or come (comma-separated: number date time url code name quote heading reference footnote)
105
+ --distinct compares only whether a fact is stated, not how many times
106
+ chaff facts <file> [--json|--compact] list the facts compare checks, as an inventory to keep before a rewrite
107
+ chaff outline <file> [<after>] [--json|--compact] measure the outline and its shape (headings, average section length, text in lists, bold); two files side by side
108
+ chaff ai-score <file>... [--format text|json] [--json] [--compact]
109
+ quick AI-likeness score (low, medium, high): signs common in generated text against human documents of the genre (not a verdict on who wrote it)
110
+ --json is --format json; --compact prints one line per file
111
+ chaff grade <items.jsonl> [--out <results.jsonl>] [--baseline <earlier results.jsonl>] [--allow-stamp-mismatch]
112
+ [--variant-key <field>] [--format text|json|markdown] [--json] [--compact]
95
113
  grade a JSONL file of model outputs (finding rates, facts, quotations, pass or fail; sends nothing)
114
+ --allow-stamp-mismatch compares with the baseline even when its rules or settings differ, saying so first
115
+ --variant-key splits the outputs by that field instead of variant; --json is --format json; markdown is for a PR comment
96
116
  chaff fix-plan <file> [--depth light|structure|register] [--json]
97
117
  a plan for whoever rewrites the file, a person or an AI: findings by rule, how to rewrite each, the checks to run after (sends nothing)
98
118
  chaff rules the rules as a table, by group, with the level each runs at now
@@ -101,7 +121,8 @@ const USAGE_EN = `chaff — finds what makes writing hard to read. It never rewr
101
121
  chaff suppressions <dir> count the findings silenced with stet
102
122
  chaff relax|strict|off <rule> [--why "reason"]
103
123
  chaff enable <rule> [--why "reason"] turn on one experimental rule alone (writes <rule>: normal under rules in chaff.yaml)
104
- chaff skill [--global] install the Claude Code skill (.claude/skills/chaff/; --global for ~/.claude/)
124
+ chaff skill [--global] [--force] install the Claude Code skill (.claude/skills/chaff/; --global for ~/.claude/)
125
+ a skill that looks edited by hand is kept; --force replaces it
105
126
  chaff feedback <file> --rule <rule> [--line N] | --missed --line N
106
127
  draft a report of a wrong or missed finding (sends nothing; --with-config adds all of chaff.yaml)
107
128
 
@@ -114,6 +135,7 @@ const USAGE_EN = `chaff — finds what makes writing hard to read. It never rewr
114
135
  --dry-run with test, show what would be sent to the AI (no API call)
115
136
  --sarif <path> write the findings as SARIF (for comments on a GitHub PR)
116
137
  --include <glob> in a folder, check these files besides Markdown (--include "*.yaml"; as include in chaff.yaml)
138
+ --language <ja|en> with tree, cite, compare, facts, outline and ai-score, the document's language (wins over chaff.yaml and the guess from the text)
117
139
 
118
140
  Silence one spot: <!-- stet: rule-id — reason -->
119
141
 
package/src/cli.ts CHANGED
@@ -50,6 +50,7 @@ import { notRunAmong } from "./not-run.ts";
50
50
  import { settingProblems } from "./setting-problems.ts";
51
51
  import { withExtensions } from "./extension/load.ts";
52
52
  import { offOnlyAsExperimental } from "./experimental-alone.ts";
53
+ import { levelFor } from "./run.ts";
53
54
  import { DEFAULT_GENRE } from "./init-choice.ts";
54
55
  import { stoppingOnYamlFileError } from "./config/yaml-file.ts";
55
56
 
@@ -236,7 +237,7 @@ const explain = (config: Config, ruleId: string | undefined, genreFlag: string |
236
237
  return 1;
237
238
  }
238
239
  const preset = genre === undefined ? {} : presetLevels(genre);
239
- const current = config.rules[rule.id] ?? preset[rule.id] ?? (rule.status === "experimental" && !config.experimental ? "off" : "normal");
240
+ const current = levelFor(rule, config.rules, config.experimental, preset);
240
241
  const alone = offOnlyAsExperimental(rule, config, genre ?? DEFAULT_GENRE, preset, language);
241
242
  console.log(renderExplain(rule, current, language, genre, { ...settingSourcesOf(config, rule.id, language), offOnlyAsExperimental: alone }));
242
243
  return 0;
@@ -0,0 +1,103 @@
1
+ // The claims file `chaff cite` reads: [{ source?, address?, quote }]. Pure: the shape is checked and every problem named,
2
+ // so a half-filled file (a scaffold with a source left empty) stops with a reason instead of passing.
3
+ import { isAnywhere, type Citation } from "../structure/cite.ts";
4
+ import type { Texts, UiLanguage } from "../ui.ts";
5
+
6
+ /** A citation and, when the claims file names it, the source it quotes: a file path, relative to the claims file. */
7
+ export type Claim = Citation & { readonly source?: string };
8
+
9
+ export type ParsedCitations = { readonly citations: readonly Claim[] } | { readonly error: string };
10
+
11
+ type RawClaim = { readonly source?: string; readonly address?: string; readonly quote: string };
12
+
13
+ const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null && !Array.isArray(value);
14
+
15
+ const isOptionalString = (value: unknown): boolean => value === undefined || typeof value === "string";
16
+
17
+ const isRawClaim = (value: unknown): value is RawClaim =>
18
+ isRecord(value) && isOptionalString(value["address"]) && isOptionalString(value["source"]) && typeof value["quote"] === "string";
19
+
20
+ const claimOf = (raw: RawClaim): Claim => ({
21
+ ...(raw.source === undefined ? {} : { source: raw.source }),
22
+ address: raw.address ?? "",
23
+ quote: raw.quote,
24
+ });
25
+
26
+ /** Neither an address nor a quote: saying ✓ would pass an entry nobody filled in. */
27
+ const isEmpty = (claim: Claim): boolean => isAnywhere(claim) && claim.quote.trim() === "";
28
+
29
+ /** The source a claim names, or undefined when it names none (missing, empty or blank). */
30
+ export const sourceOf = (claim: Claim): string | undefined => {
31
+ const source = claim.source?.trim() ?? "";
32
+ return source === "" ? undefined : source;
33
+ };
34
+
35
+ type ClaimsText = {
36
+ readonly notJson: (why: string) => string;
37
+ readonly notArray: string;
38
+ readonly badEntry: (n: number) => string;
39
+ readonly emptyEntry: (n: number) => string;
40
+ readonly noSource: (n: number) => string;
41
+ readonly twoSources: (n: number) => string;
42
+ };
43
+
44
+ export const CLAIMS_TEXT: Texts<ClaimsText> = {
45
+ ja: {
46
+ notJson: (why) => `JSON として読めません: ${why}`,
47
+ notArray: '引用は配列で渡してください: [{ "address": "3.2", "quote": "…" }]',
48
+ badEntry: (n) => `${String(n)} 件目に quote(文字列)が無いか、address か source が文字列ではありません`,
49
+ emptyEntry: (n) => `${String(n)} 件目は address も quote も空で、確かめることがありません`,
50
+ noSource: (n) => `${String(n)} 件目に source がありません。原文を引数で渡さないときは、どの引用にも source(原文のファイル)を書いてください`,
51
+ twoSources: (n) => `${String(n)} 件目が source を書いていますが、原文も引数で渡されています。どちらか一方にしてください`,
52
+ },
53
+ en: {
54
+ notJson: (why) => `Not valid JSON: ${why}`,
55
+ notArray: 'Give the quotations as an array: [{ "address": "3.2", "quote": "…" }]',
56
+ badEntry: (n) => `Entry ${String(n)} needs quote (a string), and its address and source, if it has them, must be strings`,
57
+ emptyEntry: (n) => `Entry ${String(n)} has neither an address nor a quote, so there is nothing to check`,
58
+ noSource: (n) => `Entry ${String(n)} has no source. Without a source on the command line, every quotation needs one (the source's file)`,
59
+ twoSources: (n) => `Entry ${String(n)} names a source, and a source was also given on the command line. Give one or the other`,
60
+ },
61
+ };
62
+
63
+ const parseJson = (text: string, ui: UiLanguage): { readonly value: unknown } | { readonly error: string } => {
64
+ try {
65
+ return { value: JSON.parse(text) };
66
+ } catch (err) {
67
+ return { error: CLAIMS_TEXT[ui].notJson(err instanceof Error ? err.message : String(err)) };
68
+ }
69
+ };
70
+
71
+ /** 引用の一覧。[{ source?, address?, quote }] の配列だけを受け取る。address を省けば原文のどこか。形が違えば理由を返す。 */
72
+ export const parseCitations = (text: string, ui: UiLanguage = "ja"): ParsedCitations => {
73
+ const parsed = parseJson(text, ui);
74
+ if ("error" in parsed) return parsed;
75
+ if (!Array.isArray(parsed.value)) return { error: CLAIMS_TEXT[ui].notArray };
76
+ const entries: readonly unknown[] = parsed.value;
77
+ const bad = entries.findIndex((entry) => !isRawClaim(entry));
78
+ if (bad !== -1) return { error: CLAIMS_TEXT[ui].badEntry(bad + 1) };
79
+ const citations = entries.filter(isRawClaim).map(claimOf);
80
+ const empty = citations.findIndex(isEmpty);
81
+ if (empty !== -1) return { error: CLAIMS_TEXT[ui].emptyEntry(empty + 1) };
82
+ return { citations };
83
+ };
84
+
85
+ /**
86
+ * Where each claim's source comes from. With a source on the command line, no claim may name its own; without one,
87
+ * every claim must. undefined when the claims agree with how cite was called, otherwise the reason.
88
+ */
89
+ export const sourceProblem = (claims: readonly Claim[], sourceGiven: boolean, ui: UiLanguage): string | undefined => {
90
+ const at = claims.findIndex((claim) => (sourceOf(claim) === undefined) !== sourceGiven);
91
+ if (at === -1) return undefined;
92
+ return sourceGiven ? CLAIMS_TEXT[ui].twoSources(at + 1) : CLAIMS_TEXT[ui].noSource(at + 1);
93
+ };
94
+
95
+ /** The claims of each source, in the order the sources first appear. Every claim names its source (sourceProblem passed). */
96
+ export const bySource = (claims: readonly Claim[]): { readonly source: string; readonly claims: readonly Claim[] }[] => {
97
+ const groups = new Map<string, Claim[]>();
98
+ claims.forEach((claim) => {
99
+ const source = sourceOf(claim) ?? "";
100
+ groups.set(source, [...(groups.get(source) ?? []), claim]);
101
+ });
102
+ return [...groups].map(([source, own]) => ({ source, claims: own }));
103
+ };
@@ -0,0 +1,61 @@
1
+ import { fetchPage, type Fetcher } from "../html/fetch-page.ts";
2
+ import { pageDocument } from "../html/page-document.ts";
3
+ import { resolveGenre } from "../resolve-genre.ts";
4
+ import { treeFromSource, treeLanguage, type SourceTree, type TreeContext } from "./tree.ts";
5
+ import type { Texts } from "../ui.ts";
6
+
7
+ /** A source on the web: read once, then checked like a file. The network is reached only through fetchPage. */
8
+ export type CiteContext = TreeContext & {
9
+ /** What fetches a page. Tests pass a stand-in; the command line never does. */
10
+ readonly fetcher?: Fetcher;
11
+ };
12
+
13
+ /** Long enough for a slow page, short enough that a dead host does not hold up a run of checks. */
14
+ const PAGE_TIMEOUT_MS = 30_000;
15
+
16
+ /** Far beyond any article or statute page; a log or a dump served as text is refused instead of read whole. */
17
+ const MAX_PAGE_BYTES = 20 * 1024 * 1024;
18
+
19
+ const WEB = /^https?:\/\//iu;
20
+
21
+ export const isWebSource = (source: string): boolean => WEB.test(source);
22
+
23
+ const TEXT: Texts<{
24
+ readonly unfetched: (why: string) => string;
25
+ readonly unsupported: (url: string, type: string) => string;
26
+ readonly noStructure: (url: string, language: string) => string;
27
+ }> = {
28
+ ja: {
29
+ unfetched: (why) => `ページを取得できませんでした: ${why}`,
30
+ unsupported: (url, type) => `${url}: ${type} は文字の文書として読めません(HTML、Markdown、テキストのページを渡してください)`,
31
+ noStructure: (url, language) => `${url}: 言語 ${language} のパッケージは文書の構造を読めません(structure がありません)`,
32
+ },
33
+ en: {
34
+ unfetched: (why) => `Could not fetch the page: ${why}`,
35
+ unsupported: (url, type) => `${url}: ${type} cannot be read as a text document (give an HTML, Markdown or plain-text page)`,
36
+ noStructure: (url, language) => `${url}: the ${language} package cannot read a document's structure (it has no structure)`,
37
+ },
38
+ };
39
+
40
+ /**
41
+ * A web page as a tree, read as `chaff tree` reads a file: HTML becomes Markdown first, so its headings are addresses.
42
+ * Once fetched, the same page gives the same tree. undefined, after saying why, when it cannot be fetched or read.
43
+ */
44
+ export const readPageTree = async (url: string, argv: readonly string[], context: CiteContext): Promise<SourceTree | undefined> => {
45
+ const text = TEXT[context.ui ?? "ja"];
46
+ const fetched = await fetchPage(url, { timeout_ms: PAGE_TIMEOUT_MS, max_bytes: MAX_PAGE_BYTES }, context.fetcher).catch((err: unknown) => {
47
+ console.error(text.unfetched(err instanceof Error ? err.message : String(err)));
48
+ return undefined;
49
+ });
50
+ if (fetched === undefined) return undefined;
51
+ const page = pageDocument(fetched.contentType, fetched.text);
52
+ if ("unsupported" in page) {
53
+ console.error(text.unsupported(url, page.unsupported));
54
+ return undefined;
55
+ }
56
+ const language = treeLanguage(page.path, page.text, argv, context);
57
+ const genre = resolveGenre(page.path, page.text, context.config, context.flag(argv, "--genre")).genre;
58
+ const tree = await treeFromSource(page.path, page.text, language, genre, context.config);
59
+ if (tree === undefined) console.error(text.noStructure(url, language));
60
+ return tree === undefined ? undefined : { source: page.text, tree };
61
+ };
@@ -0,0 +1,27 @@
1
+ import { documentQuotesWithoutSource } from "../detectors/quote-without-source.ts";
2
+ import type { ProseDocument } from "../plugin.ts";
3
+ import { readDocument } from "./read-document.ts";
4
+ import type { TreeContext } from "./tree.ts";
5
+
6
+ /** One entry of the claims file the writer fills in: the source the words come from, and where in it (empty: anywhere). */
7
+ export type ScaffoldClaim = { readonly source: string; readonly address: string; readonly quote: string };
8
+
9
+ /**
10
+ * The quotations quote-without-source finds in a document, as cite's claims with the source and address left for the
11
+ * writer. The rule's genre and level do not apply: asking for a scaffold is asking for every such quotation.
12
+ */
13
+ export const scaffoldClaims = (doc: ProseDocument): ScaffoldClaim[] =>
14
+ documentQuotesWithoutSource(doc).map((found) => ({ source: "", address: "", quote: found.quote }));
15
+
16
+ /** Prints the claims file for one document. The writer fills in each source and runs `chaff cite <claims.json>`. */
17
+ export const runScaffold = async (targets: readonly string[], argv: readonly string[], context: TreeContext, usage: string): Promise<number> => {
18
+ const [path] = targets;
19
+ if (path === undefined || targets.length !== 1) {
20
+ console.error(usage);
21
+ return 1;
22
+ }
23
+ const read = await readDocument(path, argv, context, false);
24
+ if (read === undefined) return 1;
25
+ console.log(JSON.stringify(scaffoldClaims(read.doc), null, 2));
26
+ return 0;
27
+ };