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
@@ -0,0 +1,97 @@
1
+ import type { Span } from "../plugin.ts";
2
+ import { dayShiftOf, SECONDS_PER_DAY, withoutDayShiftBefore, type Mark, type TimeSpan, type TimeWords } from "../structure/time-marks.ts";
3
+ import { labelOf, mentionsIn, readScopes, within, type TimeLength } from "./time-lengths.ts";
4
+
5
+ /**
6
+ * Working hours: the stated total (実働8時間, 8 hours a day) against the end minus the start minus the break
7
+ * (9:00〜17:30、休憩1時間 is 7.5 hours). Read in one line, or in a list whose items say it together, holding exactly one
8
+ * range of two times, one break with its length and one total, and no other length. A range across midnight is read
9
+ * only when the end carries a next-day mark (22:00〜翌7:00). Pure.
10
+ */
11
+ export type WorkingHoursWords = {
12
+ /** What stands alone between the two times of a range (〜, to, から). */
13
+ readonly joiners: readonly string[];
14
+ readonly dayShifts: readonly Mark[];
15
+ readonly breaks: readonly Mark[];
16
+ readonly totals: readonly Mark[];
17
+ readonly approximate: readonly Mark[];
18
+ };
19
+
20
+ export type WorkingHoursMismatch = {
21
+ readonly start: Span;
22
+ readonly end: Span;
23
+ readonly break: Span;
24
+ readonly total: Span;
25
+ /** The total the times and the break give, in minutes. */
26
+ readonly expected: number;
27
+ };
28
+
29
+ type ClockRange = Span & { readonly from: Span; readonly to: Span; readonly minutes: number | undefined };
30
+
31
+ const SECONDS_PER_MINUTE = 60;
32
+
33
+ const keyOf = (text: string): string => text.normalize("NFKC").trim().toLowerCase().replace(/\s+/gu, " ");
34
+
35
+ const timeWordsOf = (words: WorkingHoursWords): TimeWords => ({ legs: [], columns: [], dayShifts: words.dayShifts, zones: [] });
36
+
37
+ /** The minutes from one time to the other, the end a day later when it carries a next-day mark. */
38
+ const minutesOf = (text: string, from: TimeSpan, to: TimeSpan, words: TimeWords): number | undefined => {
39
+ const shift = dayShiftOf(text.slice(from.end, to.start), text, to.end, words);
40
+ const seconds = to.seconds + Math.max(0, shift) * SECONDS_PER_DAY - from.seconds;
41
+ return seconds > 0 ? seconds / SECONDS_PER_MINUTE : undefined;
42
+ };
43
+
44
+ /** Two times written one after the other with only a joiner between them (9:00〜17:30, 9 a.m. to 5:30 p.m.). */
45
+ export const clockRanges = (text: string, times: readonly TimeSpan[], words: WorkingHoursWords): ClockRange[] => {
46
+ const joiners = new Set(words.joiners.map(keyOf));
47
+ const timeWords = timeWordsOf(words);
48
+ return times.flatMap((from, index): ClockRange[] => {
49
+ const to = times[index + 1];
50
+ if (to === undefined || !joiners.has(keyOf(withoutDayShiftBefore(text.slice(from.end, to.start), timeWords)))) return [];
51
+ return [{ start: from.start, end: to.end, from, to, minutes: minutesOf(text, from, to, timeWords) }];
52
+ });
53
+ };
54
+
55
+ const isApproximate = (text: string, length: Span, words: WorkingHoursWords): boolean => labelOf(text, length, words.approximate) !== undefined;
56
+
57
+ type Labeled = { readonly length: TimeLength; readonly label: Span };
58
+
59
+ const labeled = (text: string, lengths: readonly TimeLength[], marks: readonly Mark[]): Labeled[] =>
60
+ lengths.flatMap((length) => {
61
+ const label = labelOf(text, length, marks);
62
+ return label === undefined ? [] : [{ length, label }];
63
+ });
64
+
65
+ /** The one statement in scope, or undefined when the scope does not hold exactly one. */
66
+ const statementIn = (text: string, scope: Span, ranges: readonly ClockRange[], lengths: readonly TimeLength[], words: WorkingHoursWords) => {
67
+ const inRanges = ranges.filter((range) => within(range, scope));
68
+ const inLengths = lengths.filter((length) => within(length, scope));
69
+ const breaks = labeled(text, inLengths, words.breaks);
70
+ const totals = labeled(text, inLengths, words.totals);
71
+ const [range, breakLength, total] = [inRanges[0], breaks[0], totals[0]];
72
+ if (inRanges.length !== 1 || breaks.length !== 1 || totals.length !== 1 || inLengths.length !== 2) return undefined;
73
+ if (range?.minutes === undefined || breakLength === undefined || total === undefined || breakLength.length === total.length) return undefined;
74
+ const label = breakLength.label;
75
+ const unexplained = mentionsIn(text, scope, words.breaks).some((mention) => mention.end <= label.start || mention.start >= label.end);
76
+ if (unexplained || isApproximate(text, breakLength.length, words) || isApproximate(text, total.length, words)) return undefined;
77
+ return { range: { ...range, minutes: range.minutes }, breakLength: breakLength.length, total: total.length };
78
+ };
79
+
80
+ /** Working hours whose stated total is not the end minus the start minus the break. */
81
+ export const workingHoursMismatches = (
82
+ text: string,
83
+ source: string,
84
+ sentences: readonly Span[],
85
+ times: readonly TimeSpan[],
86
+ lengths: readonly TimeLength[],
87
+ words: WorkingHoursWords,
88
+ ): WorkingHoursMismatch[] => {
89
+ const ranges = clockRanges(text, times, words);
90
+ return readScopes(text, source, { sentences, times }, (scope) => statementIn(text, scope, ranges, lengths, words)).flatMap(
91
+ ({ range, breakLength, total }) => {
92
+ const expected = range.minutes - breakLength.minutes;
93
+ if (expected <= 0 || expected === total.minutes) return [];
94
+ return [{ start: range.from, end: range.to, break: breakLength, total, expected }];
95
+ },
96
+ );
97
+ };
@@ -9,8 +9,8 @@ import { seriesLabelSpans } from "./series-label.ts";
9
9
 
10
10
  /**
11
11
  * 大文字の語が略語ではなく、決まった書き方の一部として読める所(3:30 PM、1pm ET、USD 1,000、Kansas City, MO 64108)。
12
- * どれも閉じた集合で、しかも隣の数字があるときだけ認める。PM(project manager)、CT、CA(certificate authority)は
13
- * 数字の隣でなければ略語のまま数える。語は言語パッケージの語彙表から読み、書き方の組み立てだけをここに置く。
12
+ * どれも閉じた集合で、しかも隣の数字(州は地名でもよい)があるときだけ認める。PM(project manager)、CT、CA(certificate authority)は
13
+ * その隣でなければ略語のまま数える。語は言語パッケージの語彙表から読み、書き方の組み立てだけをここに置く。
14
14
  */
15
15
 
16
16
  type Span = { readonly start: number; readonly end: number };
@@ -75,6 +75,13 @@ const titledName = (titles: string): readonly RegExp[] => [
75
75
  new RegExp(String.raw`(?<![\p{L}\p{N}_])${titles}\s+${SURNAME_IN_CAPITALS}${GIVEN_NAME_AFTER}`, "gu"),
76
76
  ];
77
77
 
78
+ /**
79
+ * 郵便番号の無い所在地(Chicago, IL、Charleston, SC and…、Washington, DC: Association…)。頭が大文字の地名と読点の後ろで、
80
+ * 文や行の終わり・区切り・小文字の語が続くときだけ州と読む。数字や大文字の語が続くもの(Berkeley, CA 947、Sales, PA Team)は外さない。
81
+ */
82
+ const placeAndState = (states: string): RegExp =>
83
+ new RegExp(String.raw`(?<=\p{Lu}\p{Ll}[\p{L}'’.-]*,\s+)${states}(?=[ \t]*(?:\r?\n|$)|[,.;:)\]!?]|\s+\p{Ll})`, "gu");
84
+
78
85
  // 強調の記号は空白に置き換えてある(**3:30** PM)ので、部品の間の空白は数を問わない。
79
86
  const patternsOf = (words: NotationWords): readonly RegExp[] => [
80
87
  new RegExp(String.raw`${CLOCK_12}\s*${oneOf(words.meridiem)}`, "gu"),
@@ -82,6 +89,7 @@ const patternsOf = (words: NotationWords): readonly RegExp[] => [
82
89
  new RegExp(String.raw`${oneOf(words.currencies)}\s*[$€£¥]?${AMOUNT}`, "gu"),
83
90
  new RegExp(String.raw`(?<![\w.,])${AMOUNT}\s*${oneOf(words.currencies)}`, "gu"),
84
91
  new RegExp(String.raw`,\s+${oneOf(words.usStates)}\s+\d{5}(?:-\d{4})?(?!\d)`, "gu"),
92
+ placeAndState(oneOf(words.usStates)),
85
93
  new RegExp(oneOf(words.emphasis), "gu"),
86
94
  ...numberedPatterns(words),
87
95
  new RegExp(String.raw`(?<![\p{L}\p{N}_])${oneOf(words.honorifics)}\s+${SURNAME_IN_CAPITALS}`, "gu"),
@@ -292,10 +292,65 @@ const proseLines = (lines: readonly string[]): string[] => {
292
292
  return withoutFences(lines.map((line, index) => (index < skipped || INDENTED.test(line) ? "" : line)));
293
293
  };
294
294
 
295
- /** 用語集の見出し語として、すぐ後ろに名前を書いた略語。 */
295
+ /**
296
+ * 同じ書き方の見出し語が、名前で確かめられてこれだけある文書は、その書き方の用語集。用語集では、見出し語の後ろの段落はどれも定義なので、
297
+ * 名前の文字が揃わない項目(ADVIS: In hydrologic terms, a program…、AMVER: Automated Mutual Assistance Vessel Rescue System)も
298
+ * 説明済みと読む。書き方ごとに数えるので、名前を添えた箇条書きが並ぶ文書でも、略語だけの行(PDF、### MATLAB)は定義の見出しと読まない。
299
+ */
300
+ const GLOSSARY_ENTRIES = 5;
301
+
302
+ /**
303
+ * 見出し語の行。略語 1 つか、/ で並べた略語(AMVER/SEAS)。前に 1 文字の語(A AMS)を置いてもよい。空白で並べた大文字の語
304
+ * (SEE ALSO、XYZ QRS)は見出しや略語の並びで、見出し語ではない。
305
+ */
306
+ const HEADWORD_WORD = String.raw`[A-Z][A-Z&-]*[A-Z]`;
307
+ const HEADWORD_LINE = new RegExp(String.raw`^(?:#{1,6}\s+)?(?:[A-Z]\s)?(?<words>${HEADWORD_WORD}(?:/${HEADWORD_WORD})*)\s*(?<colon>[::])?(?:\s+#+)?$`, "u");
308
+ const HEADING_LINE = /^#{1,6}\s/u;
309
+
310
+ /** 定義の段落。小文字の語を含み(次の見出し語ではなく)、見出しでもない行。 */
311
+ const isDefinitionLine = (line: string): boolean => /\p{Ll}/u.test(line) && !HEADING_LINE.test(line);
312
+
313
+ /** 用語集の、見出し語だけの行と、その次の空でない行が定義の段落のもの。 */
314
+ const glossaryLineTerms = (lines: readonly string[], index: number): string[] => {
315
+ const line = (lines[index] ?? "").trim();
316
+ const groups = HEADWORD_LINE.exec(line.replaceAll(STRONG, ""))?.groups;
317
+ if (groups?.["words"] === undefined || (groups["colon"] !== undefined && !MARKED_LINE.test(line))) return [];
318
+ const next = lines.slice(index + 1, index + 1 + NEXT_LINE_REACH).find((candidate) => candidate.trim() !== "");
319
+ return next !== undefined && isDefinitionLine(next.trim()) ? groups["words"].split("/") : [];
320
+ };
321
+
322
+ /** 用語集の、印を付けた見出し語と区切りの後ろの定義(**ADVIS**: In hydrologic terms…、- ADVIS — a program…)。 */
323
+ const glossaryLeadTerm = (line: string): string[] => {
324
+ const lead = TERM_LEAD.exec(line.trim());
325
+ const term = lead?.groups?.["strongTerm"] ?? lead?.groups?.["term"];
326
+ return term !== undefined && /\p{Ll}/u.test(lead?.groups?.["rest"] ?? "") ? [term] : [];
327
+ };
328
+
329
+ type EntryForm = {
330
+ readonly named: (lines: readonly string[], index: number) => string[];
331
+ readonly defined: (lines: readonly string[], index: number) => string[];
332
+ };
333
+
334
+ /** 見出し語の書き方。行だけの見出し語と、印を付けた見出し語の後ろの名前。表は隣のセルの名前だけで読む。 */
335
+ const ENTRY_FORMS: readonly EntryForm[] = [
336
+ { named: (lines, index) => (TABLE_ROW.test(lines[index] ?? "") ? [] : lineTerm(lines, index)), defined: glossaryLineTerms },
337
+ {
338
+ named: (lines, index) => (TABLE_ROW.test(lines[index] ?? "") ? [] : leadTerm(lines[index] ?? "")),
339
+ defined: (lines, index) => glossaryLeadTerm(lines[index] ?? ""),
340
+ },
341
+ { named: (lines, index) => (TABLE_ROW.test(lines[index] ?? "") ? tableTerms(lines[index] ?? "") : []), defined: () => [] },
342
+ ];
343
+
344
+ /** 一つの書き方で見出し語と読む略語。その書き方の用語集なら、名前でない定義を書いたものも。 */
345
+ const formTerms = (lines: readonly string[], form: EntryForm): string[] => {
346
+ const named = lines.flatMap((_, index) => form.named(lines, index));
347
+ return new Set(named).size < GLOSSARY_ENTRIES ? named : [...named, ...lines.flatMap((_, index) => form.defined(lines, index))];
348
+ };
349
+
350
+ /** 用語集の見出し語として、すぐ後ろに名前を書いた略語。用語集と読める書き方では、名前でなくても定義を書いた略語。 */
296
351
  export const termEntryAcronyms = (source: string): ReadonlySet<string> => {
297
352
  const lines = proseLines(source.split(/\r?\n/u));
298
- return new Set(lines.flatMap((line, index) => (TABLE_ROW.test(line) ? tableTerms(line) : [...lineTerm(lines, index), ...leadTerm(line)])));
353
+ return new Set(ENTRY_FORMS.flatMap((form) => formTerms(lines, form)));
299
354
  };
300
355
 
301
356
  export type ExpandedAt = (body: string, acronym: string, at: number) => boolean;
@@ -0,0 +1,9 @@
1
+ // Whether a word is part of an address or a file name rather than a word of the sentence. Pure.
2
+
3
+ /** A word joined to a dot, an at sign or a slash is part of an address or a file name (github.com, user@example), spelled as it must be. */
4
+ const ADDRESS_NEIGHBOUR = /[.@/\\_]/u;
5
+ const WORD_CHAR = /\w/u;
6
+
7
+ /** Whether text[start, end) is joined to an address mark before it, or to one followed by more of the address after it. */
8
+ export const isPartOfAddress = (text: string, start: number, end: number): boolean =>
9
+ ADDRESS_NEIGHBOUR.test(text.charAt(start - 1)) || (ADDRESS_NEIGHBOUR.test(text.charAt(end)) && WORD_CHAR.test(text.charAt(end + 1)));
@@ -116,9 +116,15 @@ const mayBeNoun = (token: Token): boolean => token.features?.["AlsoNoun"] === "Y
116
116
  const mayBeVerb = (determiner: Determiner, modifiers: readonly Token[], noun: Token, next: Token | undefined, finite: ReadonlySet<string>): boolean =>
117
117
  noun.features?.["AlsoVerb"] === "Yes" && !(next !== undefined && finite.has(lower(next))) && (standsAlone(determiner) || modifiers.some(mayBeNoun));
118
118
 
119
+ /** 冠詞は名詞句の頭に立つ。形容詞や数の後ろの a は、記号の名前(the eight 3-hourly a indices)。 */
120
+ const AFTER_MODIFIER = new Set(["ADJ", "NUM"]);
121
+
122
+ const isLetterName = (tokens: readonly Token[], at: number, determiner: Determiner): boolean =>
123
+ isArticle(determiner.head) && determiner.head.surface.length === 1 && AFTER_MODIFIER.has(tokens[at - 1]?.pos ?? "");
124
+
119
125
  const numberSlipAt = (source: string, tokens: readonly Token[], at: number, lists: AgreementLists): Slip | undefined => {
120
126
  const determiner = determinerAt(tokens, at, lists);
121
- if (determiner === undefined || isNamePart(tokens, at)) return undefined;
127
+ if (determiner === undefined || isNamePart(tokens, at) || isLetterName(tokens, at, determiner)) return undefined;
122
128
  const modifiers = modifiersAfter(tokens, at + determiner.length, lists.count);
123
129
  if (modifiers === undefined || !readsAsDeterminer(determiner, modifiers)) return undefined;
124
130
  const nounAt = at + determiner.length + modifiers.length;
@@ -5,6 +5,7 @@ import { entryIn, entryOpens } from "./lexicon-match.ts";
5
5
  import { contrastSentences, type ContrastWords } from "./contrast-frame.ts";
6
6
  import { placeholderSpans } from "./placeholder-text.ts";
7
7
  import { colonLeadIns } from "./list-lead-in.ts";
8
+ import { followsInlineCode } from "./code-before.ts";
8
9
 
9
10
  // 生成文に多い形。語はどれも言語パッケージの語彙表が持ち、ここは形だけを知る。
10
11
 
@@ -68,8 +69,12 @@ export const openerDensity: Detector = (doc, options): Finding[] => densityFindi
68
69
  * 予告の文頭(重要なのは、Here's the thing)の数。limit は指摘に要る数。
69
70
  * 密度ではなく数で見る。人の記事も長さによらず 1 つ 2 つは書き、生成文は短い記事にも重ねる。
70
71
  */
72
+ /** Where the sentence's first word starts: its span may begin with the blanks that masked code left. */
73
+ const firstWordAt = (sentence: Sentence): number => sentence.span.start + sentence.text.length - sentence.text.trimStart().length;
74
+
71
75
  export const openerPile: Detector = (doc, options): Finding[] => {
72
- const hits = openerHits(doc, options.lexicon ?? []);
76
+ // A sentence that opens with inline code (`explain` でも) opens with the code, not with the word after it.
77
+ const hits = openerHits(doc, options.lexicon ?? []).filter((hit) => !followsInlineCode(doc.source, doc.prose, firstWordAt(hit.sentence)));
73
78
  return hits.length === 0 || hits.length < options.limit ? [] : hits.map((hit) => findingOf(hit, { count: hits.length, limit: options.limit }));
74
79
  };
75
80
 
@@ -0,0 +1,54 @@
1
+ // amount-range-reversed: a range of amounts whose upper end is below its lower end (structure/amount-range.ts). The amounts
2
+ // are currency-notation's, read with amount-multiplier's words of scale and amount-short-scale's (k); the words of a range
3
+ // are range-connector, range-opener, range-closer and amount-range-word; amount-change-word and amount-bound-label say
4
+ // what makes a pair a change of price and what labels a bound.
5
+ import type { Detector, Finding, ProseDocument } from "../plugin.ts";
6
+ import { reversedAmountRanges, type AmountRangeWords, type RangeAmount } from "../structure/amount-range.ts";
7
+ import type { ScaleWord } from "../structure/amount-scale.ts";
8
+ import { scaledAmountOf, scaleWordsOf } from "./amount-scale.ts";
9
+ import { AMOUNT, amountsIn, formsOf } from "./currency-notation.ts";
10
+ import { proseAndTablesOf } from "../table-text.ts";
11
+ import { quoteAround } from "./quote-around.ts";
12
+
13
+ const patternsOf = (doc: ProseDocument, lexicon: string, group?: string): string[] =>
14
+ (doc.lexicons[lexicon] ?? []).filter((entry) => group === undefined || entry.group === group).map((entry) => entry.pattern);
15
+
16
+ const shortScalesOf = (doc: ProseDocument): ScaleWord[] =>
17
+ (doc.lexicons["amount-short-scale"] ?? []).flatMap((entry) => (entry.weight === undefined ? [] : [{ word: entry.pattern, value: entry.weight }]));
18
+
19
+ const wordsOf = (doc: ProseDocument, scales: readonly ScaleWord[]): AmountRangeWords => ({
20
+ connectors: [...patternsOf(doc, "range-connector"), ...patternsOf(doc, "amount-range-word")],
21
+ openers: patternsOf(doc, "range-opener"),
22
+ closers: patternsOf(doc, "range-closer"),
23
+ changes: patternsOf(doc, "amount-change-word"),
24
+ lowers: patternsOf(doc, "amount-bound-label", "lower"),
25
+ uppers: patternsOf(doc, "amount-bound-label", "upper"),
26
+ links: patternsOf(doc, "amount-bound-label", "link"),
27
+ scales,
28
+ number: AMOUNT,
29
+ });
30
+
31
+ const rangeAmountsOf = (text: string, doc: ProseDocument, scales: readonly ScaleWord[]): RangeAmount[] =>
32
+ amountsIn(
33
+ text,
34
+ formsOf(doc),
35
+ scales.map((scale) => scale.word),
36
+ ).flatMap((amount) => {
37
+ const read = scaledAmountOf(text, amount, scales);
38
+ if (read === undefined) return [];
39
+ const position = amount.form.startsWith("before:") ? "before" : "after";
40
+ return [{ offset: read.offset, end: amount.offset + amount.written.length, currency: read.currency, value: read.value, scale: read.unit, position }];
41
+ });
42
+
43
+ export const amountRange: Detector = (doc): Finding[] => {
44
+ const text = proseAndTablesOf(doc);
45
+ const scales = [...scaleWordsOf(doc), ...shortScalesOf(doc)];
46
+ return reversedAmountRanges(text, rangeAmountsOf(text, doc, scales), wordsOf(doc, scales)).map((issue) => ({
47
+ rule: "amount-range-reversed",
48
+ severity: "warning",
49
+ line: 0,
50
+ column: 0,
51
+ quote: quoteAround(text, issue.offset),
52
+ values: { ...issue.values, offset: issue.offset },
53
+ }));
54
+ };
@@ -1,15 +1,19 @@
1
1
  // amount-scale-consistency: the reading half. The amounts are currency-notation's (the lexicon currency-notation says
2
2
  // how a currency is written); the words of scale and their values are the lexicon amount-multiplier (weight).
3
- import type { Detector, Finding, ProseDocument } from "../plugin.ts";
3
+ import type { Detector, Finding, Lexicon, ProseDocument } from "../plugin.ts";
4
4
  import { escapeRegExp } from "../orthography.ts";
5
- import { amountValue, scaleMixes, type ScaleWord, type ScaledAmount } from "../structure/amount-scale.ts";
5
+ import { amountValue, scaleMixes, withoutRoundTextFigures, type ScaleWord, type ScaledAmount } from "../structure/amount-scale.ts";
6
6
  import { AMOUNT, amountsIn, formsOf, type WrittenAmount } from "./currency-notation.ts";
7
7
  import { quoteAround } from "./quote-around.ts";
8
+ import { proseAndTablesOf } from "../table-text.ts";
8
9
 
9
10
  /** How far back a larger part of one amount may start (1億2,000万円 is read from 2,000万円). */
10
11
  const LEADING_REACH = 40;
11
12
 
12
- const scaleWordsOf = (doc: ProseDocument): ScaleWord[] =>
13
+ /** How far from an amount a marker of an estimate is looked for. */
14
+ const MARKER_REACH = 12;
15
+
16
+ export const scaleWordsOf = (doc: ProseDocument): ScaleWord[] =>
13
17
  (doc.lexicons["amount-multiplier"] ?? []).flatMap((entry) => (entry.weight === undefined ? [] : [{ word: entry.pattern, value: entry.weight }]));
14
18
 
15
19
  /** The larger parts written right before an amount the currency notation read from its last part (1億 before 2,000万円). */
@@ -34,25 +38,54 @@ const unitOf = (number: string, words: readonly ScaleWord[]): number | undefined
34
38
  return values.length === 0 ? undefined : Math.max(...values);
35
39
  };
36
40
 
41
+ /** One written amount read as a value, with the larger parts written before it (1億 before 2,000万円). */
42
+ export const scaledAmountOf = (text: string, amount: WrittenAmount, words: readonly ScaleWord[]): ScaledAmount | undefined => {
43
+ const leading = amount.form.startsWith("after:") ? leadingParts(text, amount.offset, words) : "";
44
+ const written = `${leading}${amount.written}`;
45
+ const number = `${leading}${numberPart(amount)}`;
46
+ const value = amountValue(number, words);
47
+ if (value === undefined) return undefined;
48
+ return { offset: amount.offset - leading.length, written, currency: amount.currency, value, unit: unitOf(number, words) };
49
+ };
50
+
37
51
  const scaledAmountsOf = (text: string, amounts: readonly WrittenAmount[], words: readonly ScaleWord[]): ScaledAmount[] =>
38
- amounts.flatMap((amount) => {
39
- const leading = amount.form.startsWith("after:") ? leadingParts(text, amount.offset, words) : "";
40
- const written = `${leading}${amount.written}`;
41
- const number = `${leading}${numberPart(amount)}`;
42
- const value = amountValue(number, words);
43
- if (value === undefined) return [];
44
- return [{ offset: amount.offset - leading.length, written, currency: amount.currency, value, unit: unitOf(number, words) }];
45
- });
52
+ amounts.flatMap((amount) => scaledAmountOf(text, amount, words) ?? []);
53
+
54
+ /** Whether a marker of an estimate (約, 程度, about) stands right before or after the amount. */
55
+ const isApproximate = (text: string, amount: ScaledAmount, markers: Lexicon): boolean => {
56
+ const before = text
57
+ .slice(Math.max(0, amount.offset - MARKER_REACH), amount.offset)
58
+ .trimEnd()
59
+ .toLowerCase();
60
+ const after = text
61
+ .slice(amount.offset + amount.written.length, amount.offset + amount.written.length + MARKER_REACH)
62
+ .trimStart()
63
+ .toLowerCase();
64
+ return markers.some((entry) => (entry.position === "after" ? after.startsWith(entry.pattern.toLowerCase()) : before.endsWith(entry.pattern.toLowerCase())));
65
+ };
66
+
67
+ /** Whether the amount is on a table row (the text has the tables read back in, and only tables start a line with |). */
68
+ const onTableRow = (text: string, amount: ScaledAmount): boolean =>
69
+ text
70
+ .slice(text.lastIndexOf("\n", amount.offset) + 1)
71
+ .trimStart()
72
+ .startsWith("|");
46
73
 
47
74
  export const amountScale: Detector = (doc): Finding[] => {
48
- const text = doc.prose ?? doc.source;
75
+ const text = proseAndTablesOf(doc);
49
76
  const words = scaleWordsOf(doc);
50
- const amounts = amountsIn(
77
+ const markers = doc.lexicons["approximate-marker"] ?? [];
78
+ const amounts = scaledAmountsOf(
51
79
  text,
52
- formsOf(doc),
53
- words.map((word) => word.word),
54
- );
55
- return scaleMixes(scaledAmountsOf(text, amounts, words)).map(({ odd, usual }) => ({
80
+ amountsIn(
81
+ text,
82
+ formsOf(doc),
83
+ words.map((word) => word.word),
84
+ ),
85
+ words,
86
+ ).filter((amount) => !isApproximate(text, amount, markers));
87
+ const mixes = withoutRoundTextFigures(scaleMixes(amounts), amounts, (amount) => onTableRow(text, amount));
88
+ return mixes.map(({ odd, usual }) => ({
56
89
  rule: "amount-scale-consistency",
57
90
  severity: "info",
58
91
  line: 0,
@@ -1,5 +1,6 @@
1
1
  import type { Detector, Finding, ProseDocument } from "../plugin.ts";
2
- import { announcedCountMismatches, type CountWords } from "../announced-count.ts";
2
+ import { announcedCountMismatches, type CountMismatch, type CountWords } from "../announced-count.ts";
3
+ import { inlineCountMismatches, type MemberWords } from "../inline-count.ts";
3
4
  import { quoteAt } from "./structure-tree.ts";
4
5
 
5
6
  const patternsOf = (doc: ProseDocument, id: string, position?: "before" | "after"): string[] =>
@@ -13,13 +14,30 @@ const countWordsOf = (doc: ProseDocument): CountWords => ({
13
14
  hedgesAfter: patternsOf(doc, "count-hedge", "after"),
14
15
  });
15
16
 
16
- /** 予告の数(以下の3点)と、すぐ下の箇条書きの項目の数が違う。 */
17
- export const announcedCount: Detector = (doc): Finding[] =>
18
- announcedCountMismatches(doc.source, doc.lists, countWordsOf(doc)).map((mismatch) => ({
19
- rule: "announced-count-mismatch",
20
- severity: "warning",
21
- line: 0,
22
- column: 0,
23
- quote: quoteAt(doc.source, mismatch.offset),
24
- values: { phrase: mismatch.phrase, announced: mismatch.announced, listed: mismatch.listed, offset: mismatch.offset },
25
- }));
17
+ const memberGroup = (doc: ProseDocument, group: string): string[] =>
18
+ (doc.lexicons["count-member"] ?? []).filter((entry) => entry.group === group).map((entry) => entry.pattern);
19
+
20
+ const memberWordsOf = (doc: ProseDocument): MemberWords => ({
21
+ separators: memberGroup(doc, "separator"),
22
+ joiners: memberGroup(doc, "joiner"),
23
+ open: memberGroup(doc, "open"),
24
+ });
25
+
26
+ const findingOf = (doc: ProseDocument, mismatch: CountMismatch, variant?: string): Finding => ({
27
+ rule: "announced-count-mismatch",
28
+ severity: "warning",
29
+ line: 0,
30
+ column: 0,
31
+ quote: quoteAt(doc.source, mismatch.offset),
32
+ values: { phrase: mismatch.phrase, announced: mismatch.announced, listed: mismatch.listed, offset: mismatch.offset },
33
+ ...(variant === undefined ? {} : { variant }),
34
+ });
35
+
36
+ /** 予告の数(以下の3点、出席者(6名))と、すぐ下の箇条書きか、後ろに一行で並べた名前の数が違う。 */
37
+ export const announcedCount: Detector = (doc): Finding[] => {
38
+ const words = countWordsOf(doc);
39
+ return [
40
+ ...announcedCountMismatches(doc.source, doc.lists, words).map((mismatch) => findingOf(doc, mismatch)),
41
+ ...inlineCountMismatches(doc.prose ?? doc.source, words, memberWordsOf(doc)).map((mismatch) => findingOf(doc, mismatch, "inline")),
42
+ ];
43
+ };
@@ -1,5 +1,6 @@
1
- import type { Detector, Finding, Lexicon, Sentence, Span, Token } from "../plugin.ts";
1
+ import type { Detector, Finding, Lexicon, ProseDocument, Sentence, Span, Token } from "../plugin.ts";
2
2
  import { quotedIn } from "../quoted-span.ts";
3
+ import { followsInlineCode } from "./code-before.ts";
3
4
 
4
5
  /**
5
6
  * 比べる相手の無い比較(より良い結果、さらに高速に、The new engine is faster.)。何より良いのか、何より速いのかが書かれていない。
@@ -132,6 +133,10 @@ export const listsOf = (lexicon: Lexicon): ComparativeLists => ({
132
133
  /** 鉤括弧の中の比較(「給与所得の確定申告がさらに簡単に!」ページ)は題や語を挙げたもので、書き手の比較ではない。 */
133
134
  const insideSpan = (found: BareComparative, span: Span): boolean => found.first.span.start >= span.start && found.last.span.end <= span.end;
134
135
 
136
+ /** より right after inline code (`relaxed` より長い) is the particle "than" after a word the masking hid, not the adverb. */
137
+ const isThanAfterCode = (doc: ProseDocument, found: BareComparative): boolean =>
138
+ found.first.surface === "より" && followsInlineCode(doc.source, doc.prose, found.first.span.start);
139
+
135
140
  export const bareComparative: Detector = (doc): Finding[] => {
136
141
  const lists = listsOf(doc.lexicons["comparative-baseline"] ?? []);
137
142
  return doc.sentences.flatMap((sentence, at) => {
@@ -139,7 +144,7 @@ export const bareComparative: Detector = (doc): Finding[] => {
139
144
  if (sentence.embeddedLanguage !== undefined || nearby.some((near) => namesBaseline(near, lists.baselines))) return [];
140
145
  const quoted = quotedIn(sentence);
141
146
  return bareComparativesIn(sentence.tokens ?? [], lists)
142
- .filter((found) => !quoted.some((span) => insideSpan(found, span)))
147
+ .filter((found) => !quoted.some((span) => insideSpan(found, span)) && !isThanAfterCode(doc, found))
143
148
  .map((found) => ({
144
149
  rule: "",
145
150
  severity: "info",
@@ -0,0 +1,95 @@
1
+ // A block quotation (`> …`) that a dash line gives to someone: `— Name` as the last line of its last paragraph, or as
2
+ // the paragraph right after it. A block quotation with no such line is not given to anyone, and a GitHub alert
3
+ // (`> [!NOTE]`) is the writer's own text. Only the quotation's own paragraphs are its words: code in it is not, and a
4
+ // quotation inside it is read on its own. Pure; reads the Markdown tree.
5
+ import { spanOf, type MarkdownNode } from "../markdown-node.ts";
6
+ import { lineStarts } from "../position.ts";
7
+
8
+ /** quote: the quotation's words without the `>` marks. passage: the quotation and its dash line as written, where a source would be. */
9
+ export type BlockQuotation = { readonly offset: number; readonly quote: string; readonly passage: string };
10
+
11
+ /**
12
+ * An em dash, a horizontal bar or an en dash, once or twice, then a name: not a lower-case word, which goes on a sentence
13
+ * (— and then it slipped). A single `-` opens a list item, and `--` opens an email signature.
14
+ */
15
+ const DASH_LINE = /^[—―–]{1,2}[\t\p{Zs}]*(?!\p{Ll})\p{L}/u;
16
+ /** Longer than this, a line opening with a dash is a sentence, not a name and a work. */
17
+ const MAX_ATTRIBUTION_CHARS = 120;
18
+ const QUOTE_MARKS = /^(?:[ \t]*>[ \t]?)+/u;
19
+ const ALERT = /^\[![A-Za-z]+\]/u;
20
+ /** Japanese and Chinese text runs on across a line break; anything else is separated by a space. */
21
+ const CJK = String.raw`[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}、。「」『』()!?:;]`;
22
+ const CJK_END = new RegExp(`${CJK}$`, "u");
23
+ const CJK_START = new RegExp(`^${CJK}`, "u");
24
+
25
+ type Line = { readonly offset: number; readonly text: string };
26
+
27
+ /**
28
+ * A line that ends like a sentence is the writer going on (――私はこの言葉を思い出す。, — Not yet. Give it ten minutes.),
29
+ * not a name and a work. A period after a lower-case word ends a sentence; one after an initial or "Inc." does not.
30
+ */
31
+ const SENTENCE_END = /(?:[。!?!?]|(?:^|[\s\p{P}])\p{Ll}+\.)$/u;
32
+
33
+ const isDashLine = (text: string): boolean => DASH_LINE.test(text) && [...text].length <= MAX_ATTRIBUTION_CHARS && !SENTENCE_END.test(text);
34
+
35
+ /** Each non-blank line of a node without its `>` marks, at the place in source where its words start. */
36
+ const linesOf = (source: string, node: MarkdownNode): Line[] => {
37
+ const span = spanOf(node);
38
+ if (span === undefined) return [];
39
+ const text = source.slice(span.start, span.end);
40
+ const starts = lineStarts(text);
41
+ return text.split("\n").flatMap((raw, index) => {
42
+ const marks = QUOTE_MARKS.exec(raw)?.[0].length ?? 0;
43
+ const words = raw.slice(marks);
44
+ const indent = words.length - words.trimStart().length;
45
+ return words.trim() === "" ? [] : [{ offset: span.start + (starts[index] ?? 0) + marks + indent, text: words.trim() }];
46
+ });
47
+ };
48
+
49
+ /** What goes between two lines: nothing where Japanese or Chinese runs on, a space otherwise. */
50
+ const separator = (before: string, after: string): string => (before === "" || CJK_END.test(before) || CJK_START.test(after) ? "" : " ");
51
+
52
+ /** Lines joined as the reader reads them. */
53
+ const joined = (lines: readonly Line[]): string => lines.map((line) => line.text).reduce((text, next) => `${text}${separator(text, next)}${next}`, "");
54
+
55
+ /** The dash line of a paragraph that is only that line. */
56
+ const dashParagraph = (source: string, node: MarkdownNode | undefined): string | undefined => {
57
+ const lines = node?.type === "paragraph" ? linesOf(source, node) : [];
58
+ const only = lines.length === 1 ? lines[0]?.text : undefined;
59
+ return only !== undefined && isDashLine(only) ? only : undefined;
60
+ };
61
+
62
+ const quotationOf = (source: string, quote: MarkdownNode, next: MarkdownNode | undefined): BlockQuotation | undefined => {
63
+ const children = quote.children ?? [];
64
+ const lines = children.filter((child) => child.type === "paragraph").flatMap((paragraph) => linesOf(source, paragraph));
65
+ const last = children.at(-1)?.type === "paragraph" ? lines.at(-1) : undefined;
66
+ if (ALERT.test(lines[0]?.text ?? "")) return undefined;
67
+ const inside = last !== undefined && isDashLine(last.text);
68
+ const attribution = inside ? last.text : dashParagraph(source, next);
69
+ const body = inside ? lines.slice(0, -1) : lines;
70
+ const first = body[0];
71
+ const span = spanOf(quote);
72
+ if (attribution === undefined || first === undefined || span === undefined) return undefined;
73
+ return { offset: first.offset, quote: joined(body), passage: `${source.slice(span.start, span.end)}\n${attribution}` };
74
+ };
75
+
76
+ /**
77
+ * Every block quotation given to someone by a dash line. One that is not given to anyone is read for a quotation inside
78
+ * it. Walks with its own stack: Markdown nests without limit.
79
+ */
80
+ export const blockQuotations = (root: MarkdownNode, source: string): BlockQuotation[] => {
81
+ const found: BlockQuotation[] = [];
82
+ const pending: MarkdownNode[] = [root];
83
+ for (let node = pending.pop(); node !== undefined; node = pending.pop()) {
84
+ const children = node.children ?? [];
85
+ const given = children.map((child, index) => (child.type === "blockquote" ? quotationOf(source, child, children[index + 1]) : undefined));
86
+ given.forEach((quotation) => {
87
+ if (quotation !== undefined) found.push(quotation);
88
+ });
89
+ children
90
+ .filter((_child, index) => given[index] === undefined)
91
+ .toReversed()
92
+ .forEach((child) => pending.push(child));
93
+ }
94
+ return found.toSorted((left, right) => left.offset - right.offset);
95
+ };
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 丸括弧の閉じを、開きを持たない印として読むかどうか。印に使うのは丸括弧だけなので、呼ぶ側が丸括弧の閉じに限る。
3
+ * text は節の文字列で、offset は閉じの位置。
4
+ */
5
+ import { escapeRegExp } from "../orthography.ts";
6
+
7
+ /** 行の頭か空白・句読点の後ろに書いた、三文字までの印(「1)」「a)」「事例)」「※)」)。顔文字の「:)」も同じ形。 */
8
+ const LABEL_TOKEN_BEFORE = /(?:^|[\s、。,;::])[^\s()()[\][]「」『』]{1,3}[ \t\u3000]?$/u;
9
+
10
+ /** 数の後ろの閉じ(「事例2)及び事例3)」)。 */
11
+ const NUMBER_BEFORE = /[\d0-9]$/u;
12
+
13
+ /** 句読点の後ろの、字の後ろに数を付けた印(「以下、事例5)」)。group 1 は数の前の字(「事例」)。 */
14
+ const NUMBERED_LABEL_BEFORE = /[、。,;::] ?([^\s\d0-9()()[\][]「」『』、。,;::]{1,3})[\d0-9]{1,3}$/u;
15
+
16
+ const ROUND_OPEN = new Set(["(", "("]);
17
+ const ROUND_CLOSE = new Set([")", ")"]);
18
+
19
+ const lineBefore = (text: string, offset: number): string => text.slice(text.lastIndexOf("\n", offset - 1) + 1, offset);
20
+
21
+ const isLabelToken = (text: string, offset: number): boolean => LABEL_TOKEN_BEFORE.test(lineBefore(text, offset));
22
+
23
+ /** 開いている丸括弧が無いときの閉じが、印の形をしているか。 */
24
+ export const isLabelClose = (text: string, offset: number): boolean => isLabelToken(text, offset) || NUMBER_BEFORE.test(lineBefore(text, offset));
25
+
26
+ const restOfLine = (text: string, offset: number): string => {
27
+ const end = text.indexOf("\n", offset);
28
+ return text.slice(offset + 1, end === -1 ? text.length : end);
29
+ };
30
+
31
+ /** offset の後ろ、同じ行のうちの、印の形でない閉じのうち、それより前に開いた丸括弧を閉じるものの数。間の丸括弧の組は数えない。 */
32
+ const outerClosesLaterOnLine = (text: string, offset: number): number => {
33
+ const depth = { inner: 0, outer: 0 };
34
+ restOfLine(text, offset)
35
+ .split("")
36
+ .forEach((mark, index) => {
37
+ if (ROUND_OPEN.has(mark)) depth.inner += 1;
38
+ if (!ROUND_CLOSE.has(mark)) return;
39
+ if (depth.inner > 0) depth.inner -= 1;
40
+ else if (!isLabelClose(text, offset + 1 + index)) depth.outer += 1;
41
+ });
42
+ return depth.outer;
43
+ };
44
+
45
+ /** 節のどこかの行の頭(箇条の印の後ろも含む)に、同じ字で始まる番号の印(「- 事例1)」)を書いているか。 */
46
+ const usedAsLineLabel = (text: string, stem: string): boolean =>
47
+ new RegExp(`^[ \\t\u3000]*(?:[-*+・][ \\t\u3000]*)?${escapeRegExp(stem)}[\\d0-9]{1,3}[))]`, "mu").test(text);
48
+
49
+ /**
50
+ * 開いた丸括弧の中の印(「(…以下、事例5)まで同じ。)」の「事例5)」)。三つがそろうときだけ印と読む: 句読点の後ろの、字に数を
51
+ * 付けた形であること。同じ字の番号の印を、節のどこかの行の頭で使っていること。同じ行の後ろの閉じだけで、いま開いている
52
+ * 丸括弧(openRound 個)をすべて閉じられること。どれかが欠ければ、この閉じで括弧を閉じる(「(項目 1)を確認した)」は
53
+ * 余分な閉じを指す)。
54
+ */
55
+ export const isLabelInAside = (text: string, offset: number, openRound: number): boolean => {
56
+ const stem = NUMBERED_LABEL_BEFORE.exec(lineBefore(text, offset))?.[1];
57
+ return stem !== undefined && usedAsLineLabel(text, stem) && outerClosesLaterOnLine(text, offset) >= openRound;
58
+ };