chaffjs 0.27.1 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (923) hide show
  1. package/README.md +2 -1
  2. package/dist/ai-score/of-document.d.ts.map +1 -1
  3. package/dist/ai-score/of-document.js +23 -14
  4. package/dist/ai-score/of-document.js.map +1 -1
  5. package/dist/ai-score/render.d.ts.map +1 -1
  6. package/dist/ai-score/render.js +13 -4
  7. package/dist/ai-score/render.js.map +1 -1
  8. package/dist/ai-score/score.d.ts +16 -1
  9. package/dist/ai-score/score.d.ts.map +1 -1
  10. package/dist/ai-score/score.js +15 -3
  11. package/dist/ai-score/score.js.map +1 -1
  12. package/dist/ai-score/signals.d.ts +2 -4
  13. package/dist/ai-score/signals.d.ts.map +1 -1
  14. package/dist/ai-score/signals.js +11 -2
  15. package/dist/ai-score/signals.js.map +1 -1
  16. package/dist/ai-score/text.d.ts +2 -0
  17. package/dist/ai-score/text.d.ts.map +1 -1
  18. package/dist/ai-score/text.js +4 -2
  19. package/dist/ai-score/text.js.map +1 -1
  20. package/dist/announced-count.d.ts +2 -0
  21. package/dist/announced-count.d.ts.map +1 -1
  22. package/dist/announced-count.js +14 -7
  23. package/dist/announced-count.js.map +1 -1
  24. package/dist/check-source.d.ts +3 -1
  25. package/dist/check-source.d.ts.map +1 -1
  26. package/dist/check-source.js +3 -1
  27. package/dist/check-source.js.map +1 -1
  28. package/dist/cli-text.d.ts.map +1 -1
  29. package/dist/cli-text.js +42 -18
  30. package/dist/cli-text.js.map +1 -1
  31. package/dist/cli.d.ts.map +1 -1
  32. package/dist/cli.js +2 -1
  33. package/dist/cli.js.map +1 -1
  34. package/dist/commands/cite-claims.d.ts +36 -0
  35. package/dist/commands/cite-claims.d.ts.map +1 -0
  36. package/dist/commands/cite-claims.js +81 -0
  37. package/dist/commands/cite-claims.js.map +1 -0
  38. package/dist/commands/cite-page.d.ts +14 -0
  39. package/dist/commands/cite-page.d.ts.map +1 -0
  40. package/dist/commands/cite-page.js +47 -0
  41. package/dist/commands/cite-page.js.map +1 -0
  42. package/dist/commands/cite-scaffold.d.ts +16 -0
  43. package/dist/commands/cite-scaffold.d.ts.map +1 -0
  44. package/dist/commands/cite-scaffold.js +21 -0
  45. package/dist/commands/cite-scaffold.js.map +1 -0
  46. package/dist/commands/cite.d.ts +3 -12
  47. package/dist/commands/cite.d.ts.map +1 -1
  48. package/dist/commands/cite.js +110 -51
  49. package/dist/commands/cite.js.map +1 -1
  50. package/dist/company-names.d.ts +34 -0
  51. package/dist/company-names.d.ts.map +1 -0
  52. package/dist/company-names.js +158 -0
  53. package/dist/company-names.js.map +1 -0
  54. package/dist/default-values.d.ts +17 -0
  55. package/dist/default-values.d.ts.map +1 -0
  56. package/dist/default-values.js +134 -0
  57. package/dist/default-values.js.map +1 -0
  58. package/dist/deprecated-use.d.ts +17 -0
  59. package/dist/deprecated-use.d.ts.map +1 -0
  60. package/dist/deprecated-use.js +95 -0
  61. package/dist/deprecated-use.js.map +1 -0
  62. package/dist/derived/number-word-counts.d.ts +10 -0
  63. package/dist/derived/number-word-counts.d.ts.map +1 -0
  64. package/dist/derived/number-word-counts.js +21 -0
  65. package/dist/derived/number-word-counts.js.map +1 -0
  66. package/dist/derived/stays.d.ts +43 -0
  67. package/dist/derived/stays.d.ts.map +1 -0
  68. package/dist/derived/stays.js +105 -0
  69. package/dist/derived/stays.js.map +1 -0
  70. package/dist/detectors/acronym-context.d.ts +2 -2
  71. package/dist/detectors/acronym-context.d.ts.map +1 -1
  72. package/dist/detectors/acronym-context.js +6 -0
  73. package/dist/detectors/acronym-context.js.map +1 -1
  74. package/dist/detectors/address-word.d.ts +3 -0
  75. package/dist/detectors/address-word.d.ts.map +1 -0
  76. package/dist/detectors/address-word.js +7 -0
  77. package/dist/detectors/address-word.js.map +1 -0
  78. package/dist/detectors/agreement-slip.d.ts.map +1 -1
  79. package/dist/detectors/agreement-slip.js +4 -1
  80. package/dist/detectors/agreement-slip.js.map +1 -1
  81. package/dist/detectors/ai-phrasing.d.ts +0 -4
  82. package/dist/detectors/ai-phrasing.d.ts.map +1 -1
  83. package/dist/detectors/ai-phrasing.js +5 -1
  84. package/dist/detectors/ai-phrasing.js.map +1 -1
  85. package/dist/detectors/amount-range.d.ts +3 -0
  86. package/dist/detectors/amount-range.d.ts.map +1 -0
  87. package/dist/detectors/amount-range.js +38 -0
  88. package/dist/detectors/amount-range.js.map +1 -0
  89. package/dist/detectors/amount-scale.d.ts +8 -0
  90. package/dist/detectors/amount-scale.d.ts.map +1 -0
  91. package/dist/detectors/amount-scale.js +74 -0
  92. package/dist/detectors/amount-scale.js.map +1 -0
  93. package/dist/detectors/announced-count.d.ts +1 -1
  94. package/dist/detectors/announced-count.d.ts.map +1 -1
  95. package/dist/detectors/announced-count.js +18 -3
  96. package/dist/detectors/announced-count.js.map +1 -1
  97. package/dist/detectors/bare-comparative.d.ts.map +1 -1
  98. package/dist/detectors/bare-comparative.js +4 -1
  99. package/dist/detectors/bare-comparative.js.map +1 -1
  100. package/dist/detectors/block-quotation.d.ts +13 -0
  101. package/dist/detectors/block-quotation.d.ts.map +1 -0
  102. package/dist/detectors/block-quotation.js +86 -0
  103. package/dist/detectors/block-quotation.js.map +1 -0
  104. package/dist/detectors/bracket-label.d.ts +10 -0
  105. package/dist/detectors/bracket-label.d.ts.map +1 -0
  106. package/dist/detectors/bracket-label.js +51 -0
  107. package/dist/detectors/bracket-label.js.map +1 -0
  108. package/dist/detectors/change-rate.d.ts.map +1 -1
  109. package/dist/detectors/change-rate.js +12 -1
  110. package/dist/detectors/change-rate.js.map +1 -1
  111. package/dist/detectors/citation-entry.d.ts +5 -0
  112. package/dist/detectors/citation-entry.d.ts.map +1 -1
  113. package/dist/detectors/citation-entry.js +19 -5
  114. package/dist/detectors/citation-entry.js.map +1 -1
  115. package/dist/detectors/code-before.d.ts +6 -0
  116. package/dist/detectors/code-before.d.ts.map +1 -0
  117. package/dist/detectors/code-before.js +15 -0
  118. package/dist/detectors/code-before.js.map +1 -0
  119. package/dist/detectors/connective-hierarchy.d.ts +11 -1
  120. package/dist/detectors/connective-hierarchy.d.ts.map +1 -1
  121. package/dist/detectors/connective-hierarchy.js +26 -6
  122. package/dist/detectors/connective-hierarchy.js.map +1 -1
  123. package/dist/detectors/currency-notation.d.ts +3 -1
  124. package/dist/detectors/currency-notation.d.ts.map +1 -1
  125. package/dist/detectors/currency-notation.js +4 -3
  126. package/dist/detectors/currency-notation.js.map +1 -1
  127. package/dist/detectors/date-outside-period.d.ts +4 -0
  128. package/dist/detectors/date-outside-period.d.ts.map +1 -0
  129. package/dist/detectors/date-outside-period.js +34 -0
  130. package/dist/detectors/date-outside-period.js.map +1 -0
  131. package/dist/detectors/default-values.d.ts +3 -0
  132. package/dist/detectors/default-values.d.ts.map +1 -0
  133. package/dist/detectors/default-values.js +14 -0
  134. package/dist/detectors/default-values.js.map +1 -0
  135. package/dist/detectors/defined-term-form.d.ts +6 -2
  136. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  137. package/dist/detectors/defined-term-form.js +72 -12
  138. package/dist/detectors/defined-term-form.js.map +1 -1
  139. package/dist/detectors/definition-use.d.ts.map +1 -1
  140. package/dist/detectors/definition-use.js +8 -1
  141. package/dist/detectors/definition-use.js.map +1 -1
  142. package/dist/detectors/deprecated-use.d.ts +3 -0
  143. package/dist/detectors/deprecated-use.d.ts.map +1 -0
  144. package/dist/detectors/deprecated-use.js +14 -0
  145. package/dist/detectors/deprecated-use.js.map +1 -0
  146. package/dist/detectors/derived-numbers.d.ts +1 -1
  147. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  148. package/dist/detectors/derived-numbers.js +79 -16
  149. package/dist/detectors/derived-numbers.js.map +1 -1
  150. package/dist/detectors/document-shape.d.ts +1 -0
  151. package/dist/detectors/document-shape.d.ts.map +1 -1
  152. package/dist/detectors/document-shape.js +4 -1
  153. package/dist/detectors/document-shape.js.map +1 -1
  154. package/dist/detectors/due-date.d.ts +3 -0
  155. package/dist/detectors/due-date.d.ts.map +1 -0
  156. package/dist/detectors/due-date.js +38 -0
  157. package/dist/detectors/due-date.js.map +1 -0
  158. package/dist/detectors/en-shape.d.ts.map +1 -1
  159. package/dist/detectors/en-shape.js +17 -9
  160. package/dist/detectors/en-shape.js.map +1 -1
  161. package/dist/detectors/fact-consistency.d.ts.map +1 -1
  162. package/dist/detectors/fact-consistency.js +89 -2
  163. package/dist/detectors/fact-consistency.js.map +1 -1
  164. package/dist/detectors/heading-echo.d.ts.map +1 -1
  165. package/dist/detectors/heading-echo.js +10 -1
  166. package/dist/detectors/heading-echo.js.map +1 -1
  167. package/dist/detectors/kana-function-word.d.ts +12 -0
  168. package/dist/detectors/kana-function-word.d.ts.map +1 -0
  169. package/dist/detectors/kana-function-word.js +59 -0
  170. package/dist/detectors/kana-function-word.js.map +1 -0
  171. package/dist/detectors/line-amount.d.ts +3 -0
  172. package/dist/detectors/line-amount.d.ts.map +1 -0
  173. package/dist/detectors/line-amount.js +22 -0
  174. package/dist/detectors/line-amount.js.map +1 -0
  175. package/dist/detectors/location-pointer.d.ts +6 -0
  176. package/dist/detectors/location-pointer.d.ts.map +1 -0
  177. package/dist/detectors/location-pointer.js +22 -0
  178. package/dist/detectors/location-pointer.js.map +1 -0
  179. package/dist/detectors/mark-shape.d.ts.map +1 -1
  180. package/dist/detectors/mark-shape.js +13 -1
  181. package/dist/detectors/mark-shape.js.map +1 -1
  182. package/dist/detectors/nado-closed-list.d.ts +3 -0
  183. package/dist/detectors/nado-closed-list.d.ts.map +1 -0
  184. package/dist/detectors/nado-closed-list.js +21 -0
  185. package/dist/detectors/nado-closed-list.js.map +1 -0
  186. package/dist/detectors/name-variant.d.ts.map +1 -1
  187. package/dist/detectors/name-variant.js +92 -10
  188. package/dist/detectors/name-variant.js.map +1 -1
  189. package/dist/detectors/next-word.d.ts.map +1 -1
  190. package/dist/detectors/next-word.js +41 -8
  191. package/dist/detectors/next-word.js.map +1 -1
  192. package/dist/detectors/number-word-figure.d.ts +5 -0
  193. package/dist/detectors/number-word-figure.d.ts.map +1 -0
  194. package/dist/detectors/number-word-figure.js +32 -0
  195. package/dist/detectors/number-word-figure.js.map +1 -0
  196. package/dist/detectors/obligation-without-deadline.d.ts +39 -0
  197. package/dist/detectors/obligation-without-deadline.d.ts.map +1 -0
  198. package/dist/detectors/obligation-without-deadline.js +148 -0
  199. package/dist/detectors/obligation-without-deadline.js.map +1 -0
  200. package/dist/detectors/open-end-names.d.ts +23 -0
  201. package/dist/detectors/open-end-names.d.ts.map +1 -0
  202. package/dist/detectors/open-end-names.js +95 -0
  203. package/dist/detectors/open-end-names.js.map +1 -0
  204. package/dist/detectors/ordinal-run-gaps.d.ts +8 -0
  205. package/dist/detectors/ordinal-run-gaps.d.ts.map +1 -0
  206. package/dist/detectors/ordinal-run-gaps.js +80 -0
  207. package/dist/detectors/ordinal-run-gaps.js.map +1 -0
  208. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  209. package/dist/detectors/orthographic-variant.js +26 -9
  210. package/dist/detectors/orthographic-variant.js.map +1 -1
  211. package/dist/detectors/orthography.d.ts.map +1 -1
  212. package/dist/detectors/orthography.js +5 -0
  213. package/dist/detectors/orthography.js.map +1 -1
  214. package/dist/detectors/parameter-table.d.ts +3 -0
  215. package/dist/detectors/parameter-table.d.ts.map +1 -0
  216. package/dist/detectors/parameter-table.js +16 -0
  217. package/dist/detectors/parameter-table.js.map +1 -0
  218. package/dist/detectors/phone-number-variant.d.ts +3 -0
  219. package/dist/detectors/phone-number-variant.d.ts.map +1 -0
  220. package/dist/detectors/phone-number-variant.js +18 -0
  221. package/dist/detectors/phone-number-variant.js.map +1 -0
  222. package/dist/detectors/prerequisite-order.d.ts +3 -0
  223. package/dist/detectors/prerequisite-order.d.ts.map +1 -0
  224. package/dist/detectors/prerequisite-order.js +30 -0
  225. package/dist/detectors/prerequisite-order.js.map +1 -0
  226. package/dist/detectors/quote-unnamed-speaker.d.ts +3 -0
  227. package/dist/detectors/quote-unnamed-speaker.d.ts.map +1 -0
  228. package/dist/detectors/quote-unnamed-speaker.js +18 -0
  229. package/dist/detectors/quote-unnamed-speaker.js.map +1 -0
  230. package/dist/detectors/quote-without-source.d.ts +12 -2
  231. package/dist/detectors/quote-without-source.d.ts.map +1 -1
  232. package/dist/detectors/quote-without-source.js +45 -11
  233. package/dist/detectors/quote-without-source.js.map +1 -1
  234. package/dist/detectors/registry/amount-range.d.ts +3 -0
  235. package/dist/detectors/registry/amount-range.d.ts.map +1 -0
  236. package/dist/detectors/registry/amount-range.js +3 -0
  237. package/dist/detectors/registry/amount-range.js.map +1 -0
  238. package/dist/detectors/registry/amount-scale.d.ts +3 -0
  239. package/dist/detectors/registry/amount-scale.d.ts.map +1 -0
  240. package/dist/detectors/registry/amount-scale.js +3 -0
  241. package/dist/detectors/registry/amount-scale.js.map +1 -0
  242. package/dist/detectors/registry/arrival-before-departure.d.ts +3 -0
  243. package/dist/detectors/registry/arrival-before-departure.d.ts.map +1 -0
  244. package/dist/detectors/registry/arrival-before-departure.js +3 -0
  245. package/dist/detectors/registry/arrival-before-departure.js.map +1 -0
  246. package/dist/detectors/registry/date-outside-period.d.ts +3 -0
  247. package/dist/detectors/registry/date-outside-period.d.ts.map +1 -0
  248. package/dist/detectors/registry/date-outside-period.js +3 -0
  249. package/dist/detectors/registry/date-outside-period.js.map +1 -0
  250. package/dist/detectors/registry/default-values.d.ts +3 -0
  251. package/dist/detectors/registry/default-values.d.ts.map +1 -0
  252. package/dist/detectors/registry/default-values.js +3 -0
  253. package/dist/detectors/registry/default-values.js.map +1 -0
  254. package/dist/detectors/registry/deprecated-use.d.ts +3 -0
  255. package/dist/detectors/registry/deprecated-use.d.ts.map +1 -0
  256. package/dist/detectors/registry/deprecated-use.js +3 -0
  257. package/dist/detectors/registry/deprecated-use.js.map +1 -0
  258. package/dist/detectors/registry/due-date.d.ts +3 -0
  259. package/dist/detectors/registry/due-date.d.ts.map +1 -0
  260. package/dist/detectors/registry/due-date.js +3 -0
  261. package/dist/detectors/registry/due-date.js.map +1 -0
  262. package/dist/detectors/registry/kana-function-word.d.ts +3 -0
  263. package/dist/detectors/registry/kana-function-word.d.ts.map +1 -0
  264. package/dist/detectors/registry/kana-function-word.js +3 -0
  265. package/dist/detectors/registry/kana-function-word.js.map +1 -0
  266. package/dist/detectors/registry/line-amount.d.ts +3 -0
  267. package/dist/detectors/registry/line-amount.d.ts.map +1 -0
  268. package/dist/detectors/registry/line-amount.js +3 -0
  269. package/dist/detectors/registry/line-amount.js.map +1 -0
  270. package/dist/detectors/registry/nado-closed-list.d.ts +3 -0
  271. package/dist/detectors/registry/nado-closed-list.d.ts.map +1 -0
  272. package/dist/detectors/registry/nado-closed-list.js +3 -0
  273. package/dist/detectors/registry/nado-closed-list.js.map +1 -0
  274. package/dist/detectors/registry/number-word-figure.d.ts +3 -0
  275. package/dist/detectors/registry/number-word-figure.d.ts.map +1 -0
  276. package/dist/detectors/registry/number-word-figure.js +3 -0
  277. package/dist/detectors/registry/number-word-figure.js.map +1 -0
  278. package/dist/detectors/registry/obligation-without-deadline.d.ts +3 -0
  279. package/dist/detectors/registry/obligation-without-deadline.d.ts.map +1 -0
  280. package/dist/detectors/registry/obligation-without-deadline.js +3 -0
  281. package/dist/detectors/registry/obligation-without-deadline.js.map +1 -0
  282. package/dist/detectors/registry/parameter-table.d.ts +3 -0
  283. package/dist/detectors/registry/parameter-table.d.ts.map +1 -0
  284. package/dist/detectors/registry/parameter-table.js +3 -0
  285. package/dist/detectors/registry/parameter-table.js.map +1 -0
  286. package/dist/detectors/registry/phone-number-variant.d.ts +3 -0
  287. package/dist/detectors/registry/phone-number-variant.d.ts.map +1 -0
  288. package/dist/detectors/registry/phone-number-variant.js +3 -0
  289. package/dist/detectors/registry/phone-number-variant.js.map +1 -0
  290. package/dist/detectors/registry/prerequisite-order.d.ts +3 -0
  291. package/dist/detectors/registry/prerequisite-order.d.ts.map +1 -0
  292. package/dist/detectors/registry/prerequisite-order.js +3 -0
  293. package/dist/detectors/registry/prerequisite-order.js.map +1 -0
  294. package/dist/detectors/registry/quote-unnamed-speaker.d.ts +3 -0
  295. package/dist/detectors/registry/quote-unnamed-speaker.d.ts.map +1 -0
  296. package/dist/detectors/registry/quote-unnamed-speaker.js +3 -0
  297. package/dist/detectors/registry/quote-unnamed-speaker.js.map +1 -0
  298. package/dist/detectors/registry/tax-amount.d.ts +3 -0
  299. package/dist/detectors/registry/tax-amount.d.ts.map +1 -0
  300. package/dist/detectors/registry/tax-amount.js +3 -0
  301. package/dist/detectors/registry/tax-amount.js.map +1 -0
  302. package/dist/detectors/registry/time-order.d.ts +3 -0
  303. package/dist/detectors/registry/time-order.d.ts.map +1 -0
  304. package/dist/detectors/registry/time-order.js +3 -0
  305. package/dist/detectors/registry/time-order.js.map +1 -0
  306. package/dist/detectors/registry/ui-label.d.ts +3 -0
  307. package/dist/detectors/registry/ui-label.d.ts.map +1 -0
  308. package/dist/detectors/registry/ui-label.js +3 -0
  309. package/dist/detectors/registry/ui-label.js.map +1 -0
  310. package/dist/detectors/registry/undefined-call.d.ts +3 -0
  311. package/dist/detectors/registry/undefined-call.d.ts.map +1 -0
  312. package/dist/detectors/registry/undefined-call.js +3 -0
  313. package/dist/detectors/registry/undefined-call.js.map +1 -0
  314. package/dist/detectors/registry/undefined-term.d.ts +3 -0
  315. package/dist/detectors/registry/undefined-term.d.ts.map +1 -0
  316. package/dist/detectors/registry/undefined-term.js +3 -0
  317. package/dist/detectors/registry/undefined-term.js.map +1 -0
  318. package/dist/detectors/registry/version-order.d.ts +3 -0
  319. package/dist/detectors/registry/version-order.d.ts.map +1 -0
  320. package/dist/detectors/registry/version-order.js +3 -0
  321. package/dist/detectors/registry/version-order.js.map +1 -0
  322. package/dist/detectors/registry/warning-action.d.ts +3 -0
  323. package/dist/detectors/registry/warning-action.d.ts.map +1 -0
  324. package/dist/detectors/registry/warning-action.js +3 -0
  325. package/dist/detectors/registry/warning-action.js.map +1 -0
  326. package/dist/detectors/requirement-smell.d.ts.map +1 -1
  327. package/dist/detectors/requirement-smell.js +25 -8
  328. package/dist/detectors/requirement-smell.js.map +1 -1
  329. package/dist/detectors/structure-tree.d.ts +12 -4
  330. package/dist/detectors/structure-tree.d.ts.map +1 -1
  331. package/dist/detectors/structure-tree.js +31 -14
  332. package/dist/detectors/structure-tree.js.map +1 -1
  333. package/dist/detectors/superlative-scope.d.ts.map +1 -1
  334. package/dist/detectors/superlative-scope.js +11 -1
  335. package/dist/detectors/superlative-scope.js.map +1 -1
  336. package/dist/detectors/tax-amount.d.ts +3 -0
  337. package/dist/detectors/tax-amount.d.ts.map +1 -0
  338. package/dist/detectors/tax-amount.js +19 -0
  339. package/dist/detectors/tax-amount.js.map +1 -0
  340. package/dist/detectors/technical-docs.d.ts.map +1 -1
  341. package/dist/detectors/technical-docs.js +5 -1
  342. package/dist/detectors/technical-docs.js.map +1 -1
  343. package/dist/detectors/term-extension.d.ts +14 -0
  344. package/dist/detectors/term-extension.d.ts.map +1 -0
  345. package/dist/detectors/term-extension.js +67 -0
  346. package/dist/detectors/term-extension.js.map +1 -0
  347. package/dist/detectors/time-order.d.ts +4 -0
  348. package/dist/detectors/time-order.d.ts.map +1 -0
  349. package/dist/detectors/time-order.js +32 -0
  350. package/dist/detectors/time-order.js.map +1 -0
  351. package/dist/detectors/ui-label.d.ts +3 -0
  352. package/dist/detectors/ui-label.d.ts.map +1 -0
  353. package/dist/detectors/ui-label.js +16 -0
  354. package/dist/detectors/ui-label.js.map +1 -0
  355. package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
  356. package/dist/detectors/unbalanced-bracket.js +8 -13
  357. package/dist/detectors/unbalanced-bracket.js.map +1 -1
  358. package/dist/detectors/undefined-call.d.ts +3 -0
  359. package/dist/detectors/undefined-call.d.ts.map +1 -0
  360. package/dist/detectors/undefined-call.js +18 -0
  361. package/dist/detectors/undefined-call.js.map +1 -0
  362. package/dist/detectors/undefined-term.d.ts +22 -0
  363. package/dist/detectors/undefined-term.d.ts.map +1 -0
  364. package/dist/detectors/undefined-term.js +85 -0
  365. package/dist/detectors/undefined-term.js.map +1 -0
  366. package/dist/detectors/unknown-word.d.ts +1 -1
  367. package/dist/detectors/unknown-word.js +3 -3
  368. package/dist/detectors/unknown-word.js.map +1 -1
  369. package/dist/detectors/vague-deadline.d.ts +4 -0
  370. package/dist/detectors/vague-deadline.d.ts.map +1 -1
  371. package/dist/detectors/vague-deadline.js +3 -3
  372. package/dist/detectors/vague-deadline.js.map +1 -1
  373. package/dist/detectors/version-mismatch.d.ts.map +1 -1
  374. package/dist/detectors/version-mismatch.js +18 -1
  375. package/dist/detectors/version-mismatch.js.map +1 -1
  376. package/dist/detectors/version-order.d.ts +3 -0
  377. package/dist/detectors/version-order.d.ts.map +1 -0
  378. package/dist/detectors/version-order.js +43 -0
  379. package/dist/detectors/version-order.js.map +1 -0
  380. package/dist/detectors/warning-action.d.ts +3 -0
  381. package/dist/detectors/warning-action.d.ts.map +1 -0
  382. package/dist/detectors/warning-action.js +48 -0
  383. package/dist/detectors/warning-action.js.map +1 -0
  384. package/dist/facts/condition-pairs.d.ts +51 -0
  385. package/dist/facts/condition-pairs.d.ts.map +1 -0
  386. package/dist/facts/condition-pairs.js +203 -0
  387. package/dist/facts/condition-pairs.js.map +1 -0
  388. package/dist/facts/counted-facts.d.ts +16 -0
  389. package/dist/facts/counted-facts.d.ts.map +1 -0
  390. package/dist/facts/counted-facts.js +45 -0
  391. package/dist/facts/counted-facts.js.map +1 -0
  392. package/dist/facts/event-dates.d.ts +26 -0
  393. package/dist/facts/event-dates.d.ts.map +1 -0
  394. package/dist/facts/event-dates.js +38 -0
  395. package/dist/facts/event-dates.js.map +1 -0
  396. package/dist/facts/fact-scope.d.ts +2 -0
  397. package/dist/facts/fact-scope.d.ts.map +1 -1
  398. package/dist/facts/fact-scope.js +5 -0
  399. package/dist/facts/fact-scope.js.map +1 -1
  400. package/dist/facts/labelled-facts.d.ts +2 -0
  401. package/dist/facts/labelled-facts.d.ts.map +1 -1
  402. package/dist/facts/labelled-facts.js +9 -1
  403. package/dist/facts/labelled-facts.js.map +1 -1
  404. package/dist/facts/table-facts.d.ts +16 -0
  405. package/dist/facts/table-facts.d.ts.map +1 -1
  406. package/dist/facts/table-facts.js +2 -2
  407. package/dist/facts/table-facts.js.map +1 -1
  408. package/dist/grade/ai-score.d.ts +1 -1
  409. package/dist/grade/ai-score.d.ts.map +1 -1
  410. package/dist/grade/text.js +2 -2
  411. package/dist/grade/text.js.map +1 -1
  412. package/dist/heading-numbering.js +2 -2
  413. package/dist/heading-numbering.js.map +1 -1
  414. package/dist/html/fetch-page.d.ts +20 -0
  415. package/dist/html/fetch-page.d.ts.map +1 -0
  416. package/dist/html/fetch-page.js +51 -0
  417. package/dist/html/fetch-page.js.map +1 -0
  418. package/dist/html/fetched-text.d.ts +5 -0
  419. package/dist/html/fetched-text.d.ts.map +1 -0
  420. package/dist/html/fetched-text.js +25 -0
  421. package/dist/html/fetched-text.js.map +1 -0
  422. package/dist/html/html-content-block.d.ts +6 -0
  423. package/dist/html/html-content-block.d.ts.map +1 -0
  424. package/dist/html/html-content-block.js +86 -0
  425. package/dist/html/html-content-block.js.map +1 -0
  426. package/dist/html/html-elements.d.ts +41 -0
  427. package/dist/html/html-elements.d.ts.map +1 -0
  428. package/dist/html/html-elements.js +91 -0
  429. package/dist/html/html-elements.js.map +1 -0
  430. package/dist/html/html-footnote-marks.d.ts +2 -0
  431. package/dist/html/html-footnote-marks.d.ts.map +1 -0
  432. package/dist/html/html-footnote-marks.js +15 -0
  433. package/dist/html/html-footnote-marks.js.map +1 -0
  434. package/dist/html/html-heading-links.d.ts +6 -0
  435. package/dist/html/html-heading-links.d.ts.map +1 -0
  436. package/dist/html/html-heading-links.js +71 -0
  437. package/dist/html/html-heading-links.js.map +1 -0
  438. package/dist/html/html-lost-tags.d.ts +3 -0
  439. package/dist/html/html-lost-tags.d.ts.map +1 -0
  440. package/dist/html/html-lost-tags.js +11 -0
  441. package/dist/html/html-lost-tags.js.map +1 -0
  442. package/dist/html/html-markdown.d.ts +2 -0
  443. package/dist/html/html-markdown.d.ts.map +1 -0
  444. package/dist/html/html-markdown.js +347 -0
  445. package/dist/html/html-markdown.js.map +1 -0
  446. package/dist/html/html-preformatted.d.ts +17 -0
  447. package/dist/html/html-preformatted.d.ts.map +1 -0
  448. package/dist/html/html-preformatted.js +82 -0
  449. package/dist/html/html-preformatted.js.map +1 -0
  450. package/dist/html/html-reader-only.d.ts +6 -0
  451. package/dist/html/html-reader-only.d.ts.map +1 -0
  452. package/dist/html/html-reader-only.js +63 -0
  453. package/dist/html/html-reader-only.js.map +1 -0
  454. package/dist/html/html-run-in-headings.d.ts +2 -0
  455. package/dist/html/html-run-in-headings.d.ts.map +1 -0
  456. package/dist/html/html-run-in-headings.js +36 -0
  457. package/dist/html/html-run-in-headings.js.map +1 -0
  458. package/dist/html/html-tables.d.ts +3 -0
  459. package/dist/html/html-tables.d.ts.map +1 -0
  460. package/dist/html/html-tables.js +58 -0
  461. package/dist/html/html-tables.js.map +1 -0
  462. package/dist/html/html-widgets.d.ts +3 -0
  463. package/dist/html/html-widgets.d.ts.map +1 -0
  464. package/dist/html/html-widgets.js +71 -0
  465. package/dist/html/html-widgets.js.map +1 -0
  466. package/dist/html/markup-text.d.ts +5 -0
  467. package/dist/html/markup-text.d.ts.map +1 -0
  468. package/dist/html/markup-text.js +32 -0
  469. package/dist/html/markup-text.js.map +1 -0
  470. package/dist/html/page-document.d.ts +9 -0
  471. package/dist/html/page-document.d.ts.map +1 -0
  472. package/dist/html/page-document.js +19 -0
  473. package/dist/html/page-document.js.map +1 -0
  474. package/dist/inline-count.d.ts +19 -0
  475. package/dist/inline-count.d.ts.map +1 -0
  476. package/dist/inline-count.js +109 -0
  477. package/dist/inline-count.js.map +1 -0
  478. package/dist/kana-spelling.d.ts +5 -0
  479. package/dist/kana-spelling.d.ts.map +1 -1
  480. package/dist/kana-spelling.js +5 -0
  481. package/dist/kana-spelling.js.map +1 -1
  482. package/dist/location-part.d.ts +13 -0
  483. package/dist/location-part.d.ts.map +1 -0
  484. package/dist/location-part.js +24 -0
  485. package/dist/location-part.js.map +1 -0
  486. package/dist/nado-closed-list.d.ts +20 -0
  487. package/dist/nado-closed-list.d.ts.map +1 -0
  488. package/dist/nado-closed-list.js +72 -0
  489. package/dist/nado-closed-list.js.map +1 -0
  490. package/dist/name-cue.d.ts +17 -0
  491. package/dist/name-cue.d.ts.map +1 -0
  492. package/dist/name-cue.js +29 -0
  493. package/dist/name-cue.js.map +1 -0
  494. package/dist/name-variants.d.ts +41 -5
  495. package/dist/name-variants.d.ts.map +1 -1
  496. package/dist/name-variants.js +93 -8
  497. package/dist/name-variants.js.map +1 -1
  498. package/dist/paragraph-runs.d.ts +6 -1
  499. package/dist/paragraph-runs.d.ts.map +1 -1
  500. package/dist/paragraph-runs.js +9 -2
  501. package/dist/paragraph-runs.js.map +1 -1
  502. package/dist/parameter-table.d.ts +19 -0
  503. package/dist/parameter-table.d.ts.map +1 -0
  504. package/dist/parameter-table.js +191 -0
  505. package/dist/parameter-table.js.map +1 -0
  506. package/dist/phone-numbers.d.ts +23 -0
  507. package/dist/phone-numbers.d.ts.map +1 -0
  508. package/dist/phone-numbers.js +83 -0
  509. package/dist/phone-numbers.js.map +1 -0
  510. package/dist/place-names.d.ts +55 -0
  511. package/dist/place-names.d.ts.map +1 -0
  512. package/dist/place-names.js +196 -0
  513. package/dist/place-names.js.map +1 -0
  514. package/dist/plugin.d.ts +4 -0
  515. package/dist/plugin.d.ts.map +1 -1
  516. package/dist/prerequisite-order.d.ts +16 -0
  517. package/dist/prerequisite-order.d.ts.map +1 -0
  518. package/dist/prerequisite-order.js +29 -0
  519. package/dist/prerequisite-order.js.map +1 -0
  520. package/dist/profile/parse.d.ts.map +1 -1
  521. package/dist/profile/parse.js +10 -1
  522. package/dist/profile/parse.js.map +1 -1
  523. package/dist/reasons.d.ts +2 -0
  524. package/dist/reasons.d.ts.map +1 -1
  525. package/dist/reasons.js +2 -0
  526. package/dist/reasons.js.map +1 -1
  527. package/dist/render/rules-json.d.ts.map +1 -1
  528. package/dist/render/rules-json.js +4 -0
  529. package/dist/render/rules-json.js.map +1 -1
  530. package/dist/render/rules-table.d.ts.map +1 -1
  531. package/dist/render/rules-table.js +6 -2
  532. package/dist/render/rules-table.js.map +1 -1
  533. package/dist/rule-genres.d.ts +5 -2
  534. package/dist/rule-genres.d.ts.map +1 -1
  535. package/dist/rule-genres.js +2 -0
  536. package/dist/rule-genres.js.map +1 -1
  537. package/dist/rule-load.d.ts.map +1 -1
  538. package/dist/rule-load.js +2 -1
  539. package/dist/rule-load.js.map +1 -1
  540. package/dist/run.d.ts.map +1 -1
  541. package/dist/run.js +5 -1
  542. package/dist/run.js.map +1 -1
  543. package/dist/spelling.d.ts +2 -0
  544. package/dist/spelling.d.ts.map +1 -1
  545. package/dist/spelling.js +6 -0
  546. package/dist/spelling.js.map +1 -1
  547. package/dist/structure/action-due.d.ts +21 -0
  548. package/dist/structure/action-due.d.ts.map +1 -0
  549. package/dist/structure/action-due.js +126 -0
  550. package/dist/structure/action-due.js.map +1 -0
  551. package/dist/structure/amount-range.d.ts +30 -0
  552. package/dist/structure/amount-range.d.ts.map +1 -0
  553. package/dist/structure/amount-range.js +153 -0
  554. package/dist/structure/amount-range.js.map +1 -0
  555. package/dist/structure/amount-scale.d.ts +35 -0
  556. package/dist/structure/amount-scale.d.ts.map +1 -0
  557. package/dist/structure/amount-scale.js +83 -0
  558. package/dist/structure/amount-scale.js.map +1 -0
  559. package/dist/structure/cite.d.ts +5 -2
  560. package/dist/structure/cite.d.ts.map +1 -1
  561. package/dist/structure/cite.js +20 -1
  562. package/dist/structure/cite.js.map +1 -1
  563. package/dist/structure/counted-amounts.d.ts +12 -0
  564. package/dist/structure/counted-amounts.d.ts.map +1 -0
  565. package/dist/structure/counted-amounts.js +30 -0
  566. package/dist/structure/counted-amounts.js.map +1 -0
  567. package/dist/structure/date-order.d.ts +24 -3
  568. package/dist/structure/date-order.d.ts.map +1 -1
  569. package/dist/structure/date-order.js +49 -17
  570. package/dist/structure/date-order.js.map +1 -1
  571. package/dist/structure/date-outside-period.d.ts +27 -0
  572. package/dist/structure/date-outside-period.d.ts.map +1 -0
  573. package/dist/structure/date-outside-period.js +86 -0
  574. package/dist/structure/date-outside-period.js.map +1 -0
  575. package/dist/structure/definition-use.d.ts +5 -2
  576. package/dist/structure/definition-use.d.ts.map +1 -1
  577. package/dist/structure/definition-use.js +11 -3
  578. package/dist/structure/definition-use.js.map +1 -1
  579. package/dist/structure/due-date.d.ts +19 -0
  580. package/dist/structure/due-date.d.ts.map +1 -0
  581. package/dist/structure/due-date.js +30 -0
  582. package/dist/structure/due-date.js.map +1 -0
  583. package/dist/structure/heading-runs.d.ts +9 -0
  584. package/dist/structure/heading-runs.d.ts.map +1 -0
  585. package/dist/structure/heading-runs.js +23 -0
  586. package/dist/structure/heading-runs.js.map +1 -0
  587. package/dist/structure/install-pin.d.ts +46 -0
  588. package/dist/structure/install-pin.d.ts.map +1 -0
  589. package/dist/structure/install-pin.js +85 -0
  590. package/dist/structure/install-pin.js.map +1 -0
  591. package/dist/structure/leg-times.d.ts +34 -0
  592. package/dist/structure/leg-times.d.ts.map +1 -0
  593. package/dist/structure/leg-times.js +135 -0
  594. package/dist/structure/leg-times.js.map +1 -0
  595. package/dist/structure/line-amount-unit.d.ts +24 -0
  596. package/dist/structure/line-amount-unit.d.ts.map +1 -0
  597. package/dist/structure/line-amount-unit.js +24 -0
  598. package/dist/structure/line-amount-unit.js.map +1 -0
  599. package/dist/structure/line-amount.d.ts +40 -0
  600. package/dist/structure/line-amount.d.ts.map +1 -0
  601. package/dist/structure/line-amount.js +118 -0
  602. package/dist/structure/line-amount.js.map +1 -0
  603. package/dist/structure/number-word-figure.d.ts +37 -0
  604. package/dist/structure/number-word-figure.d.ts.map +1 -0
  605. package/dist/structure/number-word-figure.js +151 -0
  606. package/dist/structure/number-word-figure.js.map +1 -0
  607. package/dist/structure/numbering.d.ts +1 -0
  608. package/dist/structure/numbering.d.ts.map +1 -1
  609. package/dist/structure/numbering.js +3 -0
  610. package/dist/structure/numbering.js.map +1 -1
  611. package/dist/structure/ordinal-runs.d.ts +45 -0
  612. package/dist/structure/ordinal-runs.d.ts.map +1 -0
  613. package/dist/structure/ordinal-runs.js +78 -0
  614. package/dist/structure/ordinal-runs.js.map +1 -0
  615. package/dist/structure/percent-sum-prose.d.ts +1 -1
  616. package/dist/structure/percent-sum-prose.d.ts.map +1 -1
  617. package/dist/structure/percent-sum-prose.js +45 -3
  618. package/dist/structure/percent-sum-prose.js.map +1 -1
  619. package/dist/structure/percent-sum.d.ts +8 -0
  620. package/dist/structure/percent-sum.d.ts.map +1 -1
  621. package/dist/structure/percent-sum.js +8 -1
  622. package/dist/structure/percent-sum.js.map +1 -1
  623. package/dist/structure/release-list.d.ts +9 -0
  624. package/dist/structure/release-list.d.ts.map +1 -0
  625. package/dist/structure/release-list.js +46 -0
  626. package/dist/structure/release-list.js.map +1 -0
  627. package/dist/structure/share-column.d.ts +7 -0
  628. package/dist/structure/share-column.d.ts.map +1 -0
  629. package/dist/structure/share-column.js +22 -0
  630. package/dist/structure/share-column.js.map +1 -0
  631. package/dist/structure/stated-period.d.ts +31 -0
  632. package/dist/structure/stated-period.d.ts.map +1 -0
  633. package/dist/structure/stated-period.js +127 -0
  634. package/dist/structure/stated-period.js.map +1 -0
  635. package/dist/structure/subject-change.d.ts +8 -0
  636. package/dist/structure/subject-change.d.ts.map +1 -0
  637. package/dist/structure/subject-change.js +31 -0
  638. package/dist/structure/subject-change.js.map +1 -0
  639. package/dist/structure/tax.d.ts +25 -0
  640. package/dist/structure/tax.d.ts.map +1 -0
  641. package/dist/structure/tax.js +86 -0
  642. package/dist/structure/tax.js.map +1 -0
  643. package/dist/structure/time-marks.d.ts +58 -0
  644. package/dist/structure/time-marks.d.ts.map +1 -0
  645. package/dist/structure/time-marks.js +74 -0
  646. package/dist/structure/time-marks.js.map +1 -0
  647. package/dist/structure/time-order.d.ts +21 -0
  648. package/dist/structure/time-order.d.ts.map +1 -0
  649. package/dist/structure/time-order.js +108 -0
  650. package/dist/structure/time-order.js.map +1 -0
  651. package/dist/structure/title-lines.d.ts +8 -0
  652. package/dist/structure/title-lines.d.ts.map +1 -0
  653. package/dist/structure/title-lines.js +27 -0
  654. package/dist/structure/title-lines.js.map +1 -0
  655. package/dist/structure/total.d.ts.map +1 -1
  656. package/dist/structure/total.js +3 -1
  657. package/dist/structure/total.js.map +1 -1
  658. package/dist/structure/version-mismatch.d.ts +1 -5
  659. package/dist/structure/version-mismatch.d.ts.map +1 -1
  660. package/dist/structure/version-mismatch.js +65 -12
  661. package/dist/structure/version-mismatch.js.map +1 -1
  662. package/dist/structure/version-order.d.ts +23 -0
  663. package/dist/structure/version-order.d.ts.map +1 -0
  664. package/dist/structure/version-order.js +67 -0
  665. package/dist/structure/version-order.js.map +1 -0
  666. package/dist/table-text.d.ts +9 -0
  667. package/dist/table-text.d.ts.map +1 -0
  668. package/dist/table-text.js +36 -0
  669. package/dist/table-text.js.map +1 -0
  670. package/dist/ui-labels.d.ts +16 -0
  671. package/dist/ui-labels.d.ts.map +1 -0
  672. package/dist/ui-labels.js +42 -0
  673. package/dist/ui-labels.js.map +1 -0
  674. package/dist/undefined-call.d.ts +13 -0
  675. package/dist/undefined-call.d.ts.map +1 -0
  676. package/dist/undefined-call.js +55 -0
  677. package/dist/undefined-call.js.map +1 -0
  678. package/dist/unnamed-speaker.d.ts +23 -0
  679. package/dist/unnamed-speaker.d.ts.map +1 -0
  680. package/dist/unnamed-speaker.js +176 -0
  681. package/dist/unnamed-speaker.js.map +1 -0
  682. package/dist/warning-action.d.ts +22 -0
  683. package/dist/warning-action.d.ts.map +1 -0
  684. package/dist/warning-action.js +58 -0
  685. package/dist/warning-action.js.map +1 -0
  686. package/genres.yaml +2 -0
  687. package/package.json +4 -3
  688. package/profiles/statute.yaml +8 -0
  689. package/rules/agreement-slip.yaml +2 -2
  690. package/rules/amount-range-reversed.yaml +52 -0
  691. package/rules/amount-scale-consistency.yaml +74 -0
  692. package/rules/announced-count-mismatch.yaml +9 -4
  693. package/rules/arrival-before-departure.yaml +48 -0
  694. package/rules/change-rate-mismatch.yaml +5 -4
  695. package/rules/connective-hierarchy.yaml +3 -3
  696. package/rules/currency-notation-consistency.yaml +2 -2
  697. package/rules/date-order.yaml +9 -4
  698. package/rules/date-outside-period.yaml +64 -0
  699. package/rules/default-value-mismatch.yaml +79 -0
  700. package/rules/defined-term-form.yaml +9 -7
  701. package/rules/deprecated-option-used.yaml +78 -0
  702. package/rules/doubled-nado.yaml +28 -12
  703. package/rules/due-before-issue.yaml +68 -0
  704. package/rules/duplicate-definition.yaml +2 -2
  705. package/rules/duration-mismatch.yaml +12 -4
  706. package/rules/elapsed-years-mismatch.yaml +2 -2
  707. package/rules/heading-echo.yaml +2 -2
  708. package/rules/hyphen-as-dash.yaml +2 -2
  709. package/rules/kana-function-word.yaml +58 -0
  710. package/rules/latin-spacing.yaml +6 -5
  711. package/rules/line-amount-mismatch.yaml +58 -0
  712. package/rules/nado-closed-list.yaml +77 -0
  713. package/rules/name-variant.yaml +17 -2
  714. package/rules/number-word-figure-mismatch.yaml +76 -0
  715. package/rules/numbering-gap.yaml +2 -2
  716. package/rules/obligation-without-deadline.yaml +95 -0
  717. package/rules/one-sentence-paragraph-run.yaml +2 -3
  718. package/rules/parameter-table-mismatch.yaml +90 -0
  719. package/rules/percent-sum-mismatch.yaml +2 -2
  720. package/rules/phone-number-variant.yaml +68 -0
  721. package/rules/prerequisite-after-step.yaml +78 -0
  722. package/rules/quote-unnamed-speaker.yaml +67 -0
  723. package/rules/quote-without-source.yaml +6 -6
  724. package/rules/requirement-smell.yaml +3 -3
  725. package/rules/sentence-initial-conjunction-run.yaml +13 -7
  726. package/rules/summary-fact-mismatch.yaml +4 -4
  727. package/rules/tax-mismatch.yaml +71 -0
  728. package/rules/time-order.yaml +65 -0
  729. package/rules/title-length.yaml +2 -2
  730. package/rules/ui-label-variant.yaml +70 -0
  731. package/rules/unbalanced-bracket.yaml +4 -4
  732. package/rules/uncomparable-graded.yaml +29 -10
  733. package/rules/undefined-function-call.yaml +77 -0
  734. package/rules/undefined-term.yaml +72 -0
  735. package/rules/unknown-word.yaml +2 -2
  736. package/rules/unqualified-superlative.yaml +2 -2
  737. package/rules/use-before-definition.yaml +2 -2
  738. package/rules/version-mismatch.yaml +12 -4
  739. package/rules/version-order.yaml +85 -0
  740. package/rules/very-adjective.yaml +31 -13
  741. package/rules/warning-without-action.yaml +64 -0
  742. package/rules/wordy-phrase.yaml +27 -9
  743. package/src/ai-score/of-document.ts +19 -9
  744. package/src/ai-score/render.ts +24 -4
  745. package/src/ai-score/score.ts +24 -3
  746. package/src/ai-score/signals.ts +12 -2
  747. package/src/ai-score/text.ts +7 -2
  748. package/src/announced-count.ts +19 -12
  749. package/src/check-source.ts +11 -2
  750. package/src/cli-text.ts +42 -18
  751. package/src/cli.ts +2 -1
  752. package/src/commands/cite-claims.ts +103 -0
  753. package/src/commands/cite-page.ts +61 -0
  754. package/src/commands/cite-scaffold.ts +27 -0
  755. package/src/commands/cite.ts +127 -58
  756. package/src/company-names.ts +202 -0
  757. package/src/default-values.ts +158 -0
  758. package/src/deprecated-use.ts +122 -0
  759. package/src/derived/number-word-counts.ts +28 -0
  760. package/src/derived/stays.ts +145 -0
  761. package/src/detectors/acronym-context.ts +10 -2
  762. package/src/detectors/address-word.ts +9 -0
  763. package/src/detectors/agreement-slip.ts +7 -1
  764. package/src/detectors/ai-phrasing.ts +6 -1
  765. package/src/detectors/amount-range.ts +54 -0
  766. package/src/detectors/amount-scale.ts +96 -0
  767. package/src/detectors/announced-count.ts +29 -11
  768. package/src/detectors/bare-comparative.ts +7 -2
  769. package/src/detectors/block-quotation.ts +95 -0
  770. package/src/detectors/bracket-label.ts +58 -0
  771. package/src/detectors/change-rate.ts +15 -2
  772. package/src/detectors/citation-entry.ts +20 -5
  773. package/src/detectors/code-before.ts +14 -0
  774. package/src/detectors/connective-hierarchy.ts +39 -11
  775. package/src/detectors/currency-notation.ts +4 -3
  776. package/src/detectors/date-outside-period.ts +38 -0
  777. package/src/detectors/default-values.ts +17 -0
  778. package/src/detectors/defined-term-form.ts +84 -15
  779. package/src/detectors/definition-use.ts +10 -2
  780. package/src/detectors/deprecated-use.ts +17 -0
  781. package/src/detectors/derived-numbers.ts +115 -17
  782. package/src/detectors/document-shape.ts +6 -1
  783. package/src/detectors/due-date.ts +47 -0
  784. package/src/detectors/en-shape.ts +27 -11
  785. package/src/detectors/fact-consistency.ts +110 -2
  786. package/src/detectors/heading-echo.ts +11 -1
  787. package/src/detectors/kana-function-word.ts +71 -0
  788. package/src/detectors/line-amount.ts +33 -0
  789. package/src/detectors/location-pointer.ts +30 -0
  790. package/src/detectors/mark-shape.ts +18 -1
  791. package/src/detectors/nado-closed-list.ts +25 -0
  792. package/src/detectors/name-variant.ts +114 -11
  793. package/src/detectors/next-word.ts +56 -9
  794. package/src/detectors/number-word-figure.ts +43 -0
  795. package/src/detectors/obligation-without-deadline.ts +192 -0
  796. package/src/detectors/open-end-names.ts +140 -0
  797. package/src/detectors/ordinal-run-gaps.ts +101 -0
  798. package/src/detectors/orthographic-variant.ts +39 -14
  799. package/src/detectors/orthography.ts +6 -1
  800. package/src/detectors/parameter-table.ts +17 -0
  801. package/src/detectors/phone-number-variant.ts +18 -0
  802. package/src/detectors/prerequisite-order.ts +35 -0
  803. package/src/detectors/quote-unnamed-speaker.ts +19 -0
  804. package/src/detectors/quote-without-source.ts +57 -10
  805. package/src/detectors/registry/amount-range.ts +4 -0
  806. package/src/detectors/registry/amount-scale.ts +4 -0
  807. package/src/detectors/registry/arrival-before-departure.ts +4 -0
  808. package/src/detectors/registry/date-outside-period.ts +4 -0
  809. package/src/detectors/registry/default-values.ts +4 -0
  810. package/src/detectors/registry/deprecated-use.ts +4 -0
  811. package/src/detectors/registry/due-date.ts +4 -0
  812. package/src/detectors/registry/kana-function-word.ts +4 -0
  813. package/src/detectors/registry/line-amount.ts +4 -0
  814. package/src/detectors/registry/nado-closed-list.ts +4 -0
  815. package/src/detectors/registry/number-word-figure.ts +4 -0
  816. package/src/detectors/registry/obligation-without-deadline.ts +4 -0
  817. package/src/detectors/registry/parameter-table.ts +4 -0
  818. package/src/detectors/registry/phone-number-variant.ts +4 -0
  819. package/src/detectors/registry/prerequisite-order.ts +4 -0
  820. package/src/detectors/registry/quote-unnamed-speaker.ts +4 -0
  821. package/src/detectors/registry/tax-amount.ts +4 -0
  822. package/src/detectors/registry/time-order.ts +4 -0
  823. package/src/detectors/registry/ui-label.ts +4 -0
  824. package/src/detectors/registry/undefined-call.ts +4 -0
  825. package/src/detectors/registry/undefined-term.ts +4 -0
  826. package/src/detectors/registry/version-order.ts +4 -0
  827. package/src/detectors/registry/warning-action.ts +4 -0
  828. package/src/detectors/requirement-smell.ts +29 -9
  829. package/src/detectors/structure-tree.ts +43 -21
  830. package/src/detectors/superlative-scope.ts +13 -1
  831. package/src/detectors/tax-amount.ts +25 -0
  832. package/src/detectors/technical-docs.ts +7 -1
  833. package/src/detectors/term-extension.ts +67 -0
  834. package/src/detectors/time-order.ts +49 -0
  835. package/src/detectors/ui-label.ts +17 -0
  836. package/src/detectors/unbalanced-bracket.ts +7 -14
  837. package/src/detectors/undefined-call.ts +19 -0
  838. package/src/detectors/undefined-term.ts +103 -0
  839. package/src/detectors/unknown-word.ts +3 -3
  840. package/src/detectors/vague-deadline.ts +3 -3
  841. package/src/detectors/version-mismatch.ts +26 -5
  842. package/src/detectors/version-order.ts +50 -0
  843. package/src/detectors/warning-action.ts +49 -0
  844. package/src/facts/condition-pairs.ts +289 -0
  845. package/src/facts/counted-facts.ts +59 -0
  846. package/src/facts/event-dates.ts +63 -0
  847. package/src/facts/fact-scope.ts +6 -0
  848. package/src/facts/labelled-facts.ts +13 -1
  849. package/src/facts/table-facts.ts +3 -3
  850. package/src/grade/ai-score.ts +1 -1
  851. package/src/grade/text.ts +2 -2
  852. package/src/heading-numbering.ts +2 -2
  853. package/src/html/fetch-page.ts +64 -0
  854. package/src/html/fetched-text.ts +32 -0
  855. package/src/html/html-content-block.ts +107 -0
  856. package/src/html/html-elements.ts +127 -0
  857. package/src/html/html-footnote-marks.ts +20 -0
  858. package/src/html/html-heading-links.ts +93 -0
  859. package/src/html/html-lost-tags.ts +14 -0
  860. package/src/html/html-markdown.ts +481 -0
  861. package/src/html/html-preformatted.ts +110 -0
  862. package/src/html/html-reader-only.ts +82 -0
  863. package/src/html/html-run-in-headings.ts +43 -0
  864. package/src/html/html-tables.ts +76 -0
  865. package/src/html/html-widgets.ts +114 -0
  866. package/src/html/markup-text.ts +35 -0
  867. package/src/html/page-document.ts +22 -0
  868. package/src/inline-count.ts +146 -0
  869. package/src/kana-spelling.ts +7 -0
  870. package/src/location-part.ts +30 -0
  871. package/src/nado-closed-list.ts +106 -0
  872. package/src/name-cue.ts +35 -0
  873. package/src/name-variants.ts +152 -11
  874. package/src/paragraph-runs.ts +12 -2
  875. package/src/parameter-table.ts +208 -0
  876. package/src/phone-numbers.ts +98 -0
  877. package/src/place-names.ts +248 -0
  878. package/src/plugin.ts +4 -0
  879. package/src/prerequisite-order.ts +39 -0
  880. package/src/profile/parse.ts +10 -1
  881. package/src/reasons.ts +4 -0
  882. package/src/render/rules-json.ts +4 -0
  883. package/src/render/rules-table.ts +6 -3
  884. package/src/rule-genres.ts +5 -2
  885. package/src/rule-load.ts +3 -2
  886. package/src/run.ts +3 -1
  887. package/src/spelling.ts +8 -0
  888. package/src/structure/action-due.ts +179 -0
  889. package/src/structure/amount-range.ts +219 -0
  890. package/src/structure/amount-scale.ts +115 -0
  891. package/src/structure/cite.ts +21 -2
  892. package/src/structure/counted-amounts.ts +42 -0
  893. package/src/structure/date-order.ts +72 -22
  894. package/src/structure/date-outside-period.ts +127 -0
  895. package/src/structure/definition-use.ts +24 -3
  896. package/src/structure/due-date.ts +46 -0
  897. package/src/structure/heading-runs.ts +24 -0
  898. package/src/structure/install-pin.ts +115 -0
  899. package/src/structure/leg-times.ts +198 -0
  900. package/src/structure/line-amount-unit.ts +35 -0
  901. package/src/structure/line-amount.ts +162 -0
  902. package/src/structure/number-word-figure.ts +199 -0
  903. package/src/structure/numbering.ts +3 -0
  904. package/src/structure/ordinal-runs.ts +107 -0
  905. package/src/structure/percent-sum-prose.ts +46 -3
  906. package/src/structure/percent-sum.ts +16 -2
  907. package/src/structure/release-list.ts +69 -0
  908. package/src/structure/share-column.ts +25 -0
  909. package/src/structure/stated-period.ts +161 -0
  910. package/src/structure/subject-change.ts +35 -0
  911. package/src/structure/tax.ts +114 -0
  912. package/src/structure/time-marks.ts +127 -0
  913. package/src/structure/time-order.ts +140 -0
  914. package/src/structure/title-lines.ts +33 -0
  915. package/src/structure/total.ts +5 -1
  916. package/src/structure/version-mismatch.ts +67 -13
  917. package/src/structure/version-order.ts +84 -0
  918. package/src/table-text.ts +39 -0
  919. package/src/ui-labels.ts +55 -0
  920. package/src/undefined-call.ts +65 -0
  921. package/src/unnamed-speaker.ts +224 -0
  922. package/src/warning-action.ts +73 -0
  923. package/styles/koyobun.yaml +7 -4
@@ -1,7 +1,8 @@
1
1
  import { lengthOf } from "../measure.ts";
2
2
  import { isClosed } from "../sentence-shape.ts";
3
3
  import { isTitleCase, minorityCase, pageTitleOf } from "./heading-case.ts";
4
- import type { Detector, Finding, ProseDocument, Section, Sentence, Token } from "../plugin.ts";
4
+ import type { Detector, Finding, Lexicon, ProseDocument, Section, Sentence, Token } from "../plugin.ts";
5
+ import { entryOpens } from "./lexicon-match.ts";
5
6
 
6
7
  const PER = 1000;
7
8
 
@@ -74,21 +75,36 @@ const firstWord = (sentence: Sentence): string =>
74
75
  .split(/\s+/u)[0]
75
76
  ?.replace(/[^A-Za-z]/gu, "") ?? "";
76
77
 
77
- /**
78
- * 接続詞で始まる文が続く。1 つなら効くが、続くと文が前の文の付け足しに見えて、
79
- * 何が主張なのかが分からなくなる。
80
- */
81
- export const conjunctionRun: Detector = (doc, options): Finding[] => {
82
- const heads = new Set((options.lexicon ?? []).map((entry) => entry.pattern.toLowerCase()));
83
- const runs = doc.sentences.filter(isClosed).reduce<Sentence[][]>(
78
+ /** A head written as one Latin word ("And") is read off the first word; any other (しかし) off the tokens, since Japanese has no spaces. */
79
+ const LATIN_WORD = /^[A-Za-z]+$/u;
80
+
81
+ type Heads = { readonly latin: ReadonlySet<string>; readonly other: Lexicon };
82
+
83
+ const headsOf = (lexicon: Lexicon): Heads => ({
84
+ latin: new Set(lexicon.filter((entry) => LATIN_WORD.test(entry.pattern)).map((entry) => entry.pattern.toLowerCase())),
85
+ other: lexicon.filter((entry) => !LATIN_WORD.test(entry.pattern)),
86
+ });
87
+
88
+ const opensWithHead = (sentence: Sentence, heads: Heads): boolean =>
89
+ heads.latin.has(firstWord(sentence).toLowerCase()) || (sentence.tokens !== undefined && heads.other.some((entry) => entryOpens(sentence, entry)));
90
+
91
+ const headRuns = (sentences: readonly Sentence[], heads: Heads): Sentence[][] =>
92
+ sentences.filter(isClosed).reduce<Sentence[][]>(
84
93
  (acc, sentence) => {
85
94
  const last = acc.at(-1) ?? [];
86
- if (!heads.has(firstWord(sentence).toLowerCase())) return [...acc.slice(0, -1), last, []];
95
+ if (!opensWithHead(sentence, heads)) return [...acc.slice(0, -1), last, []];
87
96
  return [...acc.slice(0, -1), [...last, sentence]];
88
97
  },
89
98
  [[]],
90
99
  );
91
- return runs
100
+
101
+ /**
102
+ * 接続詞で始まる文が続く。1 つなら効くが、続くと文が前の文の付け足しに見えて、
103
+ * 何が主張なのかが分からなくなる。
104
+ */
105
+ export const conjunctionRun: Detector = (doc, options): Finding[] => {
106
+ const joiner = doc.lengthUnit === "char" ? "" : " ";
107
+ return headRuns(doc.sentences, headsOf(options.lexicon ?? []))
92
108
  .filter((run) => run.length > options.limit)
93
109
  .flatMap((run) => {
94
110
  const first = run[0];
@@ -100,7 +116,7 @@ export const conjunctionRun: Detector = (doc, options): Finding[] => {
100
116
  severity: "info" as const,
101
117
  line: 0,
102
118
  column: 0,
103
- quote: run.map((sentence) => sentence.text.trim()).join(" "),
119
+ quote: run.map((sentence) => sentence.text.trim()).join(joiner),
104
120
  values: { count: run.length, limit: options.limit, offset: first.span.start },
105
121
  },
106
122
  ];
@@ -1,10 +1,13 @@
1
1
  import type { Detector, Finding, ProseDocument, StructureNode } from "../plugin.ts";
2
+ import { countedFacts, countedPhraseAt, type CountedPhrase } from "../facts/counted-facts.ts";
2
3
  import { nameSpans } from "../compare/proper-nouns.ts";
3
4
  import { factValues, type FactValue } from "../facts/fact-values.ts";
4
5
  import { labelledFacts, type AttributePhrase, type FactWords } from "../facts/labelled-facts.ts";
5
6
  import { tableFacts } from "../facts/table-facts.ts";
6
- import { scopedFacts, type ScopedFact } from "../facts/fact-scope.ts";
7
+ import { partsAt, scopedFacts, type ScopedFact } from "../facts/fact-scope.ts";
8
+ import { conditionPairConflicts, type ChangeSentence, type ChangeWords, type ConditionWord, type PairConflict, type WordAt } from "../facts/condition-pairs.ts";
7
9
  import { scopeConflicts, summaryConflicts, type FactConflict } from "../facts/fact-conflicts.ts";
10
+ import { eventDateConflicts, type EventDateConflict, type EventWord } from "../facts/event-dates.ts";
8
11
  import { quoteAt } from "./structure-tree.ts";
9
12
 
10
13
  const patternsOf = (doc: ProseDocument, id: string): string[] => (doc.lexicons[id] ?? []).map((entry) => entry.pattern);
@@ -14,6 +17,7 @@ export const factWordsOf = (doc: ProseDocument): FactWords => ({
14
17
  valueEnds: patternsOf(doc, "fact-value-end"),
15
18
  determiners: patternsOf(doc, "fact-label-drop"),
16
19
  vague: patternsOf(doc, "fact-label-vague"),
20
+ leads: patternsOf(doc, "fact-label-lead"),
17
21
  attributes: (doc.lexicons["fact-attribute"] ?? []).map((entry): AttributePhrase => ({ pattern: entry.pattern, position: entry.position ?? "before" })),
18
22
  });
19
23
 
@@ -50,5 +54,109 @@ const findingOf =
50
54
  /** 同じ節で、同じ名前に二通りの値(締切:10月5日 と 締切:10月7日)。 */
51
55
  export const factConflict: Detector = (doc): Finding[] => scopeConflicts(factsOf(doc)).map(findingOf("fact-conflict", doc));
52
56
 
57
+ const countedPhrasesOf = (doc: ProseDocument): CountedPhrase[] =>
58
+ doc.sentences.flatMap((sentence) => {
59
+ const tokens = sentence.tokens ?? [];
60
+ return tokens.flatMap((token, index) => (token.pos === "NUM" ? countedPhraseAt(tokens, index) : []));
61
+ });
62
+
63
+ /** The values named by what they count, scoped like the labelled ones. Only the summary is compared with them. */
64
+ const countedFactsOf = (doc: ProseDocument): ScopedFact[] => {
65
+ const tree = doc.structure;
66
+ if (tree === undefined) return [];
67
+ const values = factValues(tree, doc.source, nameSpans(doc));
68
+ return scopedFacts(countedFacts(doc.source, values, countedPhrasesOf(doc)), tree, doc.source, patternsOf(doc, "summary-heading"));
69
+ };
70
+
71
+ const wordsAt = (doc: ProseDocument, id: string): WordAt[] =>
72
+ (doc.lexicons[id] ?? []).map((entry): WordAt => ({ pattern: entry.pattern, position: entry.position ?? "before" }));
73
+
74
+ const conditionsOf = (doc: ProseDocument, id: string): ConditionWord[] =>
75
+ (doc.lexicons[id] ?? []).map((entry): ConditionWord => ({ pattern: entry.pattern, group: entry.group ?? entry.pattern }));
76
+
77
+ const changeWordsOf = (doc: ProseDocument): ChangeWords => ({
78
+ from: wordsAt(doc, "fact-change-from"),
79
+ to: wordsAt(doc, "fact-change-to"),
80
+ notChange: patternsOf(doc, "fact-change-not"),
81
+ subjectMarks: patternsOf(doc, "fact-change-subject-mark"),
82
+ joiners: wordsAt(doc, "fact-name-joiner"),
83
+ conditionsFrom: conditionsOf(doc, "fact-condition-from"),
84
+ conditionsTo: conditionsOf(doc, "fact-condition-to"),
85
+ });
86
+
87
+ const changeSentencesOf = (doc: ProseDocument, tree: StructureNode): ChangeSentence[] => {
88
+ const parts = partsAt(
89
+ doc.sentences.map((sentence) => sentence.span.start),
90
+ tree,
91
+ patternsOf(doc, "summary-heading"),
92
+ );
93
+ return doc.sentences.map((sentence, index) => ({
94
+ span: sentence.span,
95
+ text: sentence.text,
96
+ tokens: sentence.tokens ?? [],
97
+ summary: parts[index] !== "body",
98
+ }));
99
+ };
100
+
101
+ const ARROW = " → ";
102
+
103
+ const pairFinding =
104
+ (doc: ProseDocument) =>
105
+ ({ summary, body }: PairConflict): Finding => ({
106
+ rule: "summary-fact-mismatch",
107
+ severity: "warning",
108
+ line: 0,
109
+ column: 0,
110
+ quote: quoteAt(doc.source, summary.from.start),
111
+ values: {
112
+ label: summary.subject,
113
+ value: [shown(doc, summary.from), shown(doc, summary.to)].join(ARROW),
114
+ other: [shown(doc, body.from), shown(doc, body.to)].join(ARROW),
115
+ offset: summary.from.start,
116
+ },
117
+ });
118
+
119
+ /** 要約の「XからYに」が、本文が条件で分けて書いた同じ名前の二つの値と違う。 */
120
+ const conditionPairFindings = (doc: ProseDocument): Finding[] => {
121
+ const tree = doc.structure;
122
+ if (tree === undefined) return [];
123
+ const values = factValues(tree, doc.source, nameSpans(doc));
124
+ return conditionPairConflicts(doc.source, changeSentencesOf(doc, tree), values, changeWordsOf(doc)).map(pairFinding(doc));
125
+ };
126
+
127
+ const eventWordsOf = (doc: ProseDocument): EventWord[] =>
128
+ (doc.lexicons["fact-event"] ?? []).map((entry): EventWord => ({ pattern: entry.pattern, group: entry.group ?? entry.pattern }));
129
+
130
+ const eventDateFinding =
131
+ (doc: ProseDocument) =>
132
+ ({ label, value, other }: EventDateConflict): Finding => ({
133
+ rule: "summary-fact-mismatch",
134
+ severity: "warning",
135
+ line: 0,
136
+ column: 0,
137
+ quote: quoteAt(doc.source, value.start),
138
+ values: { label, value: shown(doc, value), other: shown(doc, other), offset: value.start },
139
+ });
140
+
141
+ /** 冒頭や要約の出来事の日付(11月9日から提供します)が、本文の同じ出来事の日付と違う。 */
142
+ const eventDateFindings = (doc: ProseDocument): Finding[] => {
143
+ const tree = doc.structure;
144
+ if (tree === undefined) return [];
145
+ const values = factValues(tree, doc.source, nameSpans(doc));
146
+ const dates = values.filter((value) => value.kind === "date");
147
+ const names = values.filter((value) => value.kind === "name");
148
+ const sentences = changeSentencesOf(doc, tree).map(({ span, text, summary }) => ({
149
+ ...span,
150
+ text,
151
+ summary,
152
+ names: names.filter((name) => span.start <= name.start && name.end <= span.end).map((name) => name.key),
153
+ }));
154
+ return eventDateConflicts(sentences, dates, eventWordsOf(doc)).map(eventDateFinding(doc));
155
+ };
156
+
53
157
  /** 冒頭や要約の値が、本文の同じ名前の値と違う。 */
54
- export const summaryFactMismatch: Detector = (doc): Finding[] => summaryConflicts(factsOf(doc)).map(findingOf("summary-fact-mismatch", doc));
158
+ export const summaryFactMismatch: Detector = (doc): Finding[] => [
159
+ ...summaryConflicts([...factsOf(doc), ...countedFactsOf(doc)]).map(findingOf("summary-fact-mismatch", doc)),
160
+ ...conditionPairFindings(doc),
161
+ ...eventDateFindings(doc),
162
+ ];
@@ -3,6 +3,7 @@ import { newContentMorphemes } from "./content-morphemes.ts";
3
3
  import { echoedHeadingUnits, trigrams } from "./heading-overlap.ts";
4
4
  import { titleTokens } from "../heading-label.ts";
5
5
  import { handsOver } from "./lead-in.ts";
6
+ import { holdsLink, namesLocation } from "./location-pointer.ts";
6
7
  import { withoutQuotedVariants } from "./quoted-variant.ts";
7
8
  import type { Detector, Finding, LengthUnit, ProseDocument, Section } from "../plugin.ts";
8
9
 
@@ -55,6 +56,15 @@ const leadsIn = (doc: ProseDocument, section: Section, phrases: readonly string[
55
56
  return first !== undefined && handsOver(first.text, doc.source.slice(first.span.end, section.span.end), phrases);
56
57
  };
57
58
 
59
+ /**
60
+ * 最初の文が、中身の置き場所(ページの外へのリンク・URL・コードで書いたファイルのパス)へ読者を渡している。
61
+ * 置き場所はコードやリンク先として本文から外れるので、残った文(The full reference is in .)は見出しの語だけに見える。
62
+ */
63
+ const pointsElsewhere = (doc: ProseDocument, section: Section): boolean => {
64
+ const first = section.firstSentence;
65
+ return first !== undefined && (holdsLink(doc.source, first.span, doc.links) || namesLocation(doc.source.slice(first.span.start, first.span.end)));
66
+ };
67
+
58
68
  /** 見出しとの重なりを測る文。用語集や表記の手引きは見出しの語の別の書き方を引用する(Not “datacentre”)ので、それは数えない。 */
59
69
  const echoedText = (section: Section): string => withoutQuotedVariants(section.firstSentence?.text ?? "", measuredHeading(section));
60
70
 
@@ -62,7 +72,7 @@ export const headingEcho: Detector = (doc, options): Finding[] => {
62
72
  const leadIns = (doc.lexicons["lead-in"] ?? []).map((entry) => entry.pattern);
63
73
  return doc.sections
64
74
  .filter((section) => section.heading.length > 0 && section.firstSentence !== undefined && addsLittle(section, doc.lengthUnit))
65
- .filter((section) => !leadsIn(doc, section, leadIns))
75
+ .filter((section) => !leadsIn(doc, section, leadIns) && !pointsElsewhere(doc, section))
66
76
  .map((section) => ({ section, overlap: Math.round(containment(trigrams(measuredHeading(section)), trigrams(echoedText(section))) * 100) }))
67
77
  .filter(({ overlap }) => overlap >= options.limit)
68
78
  .map(({ section, overlap }) => ({
@@ -0,0 +1,71 @@
1
+ import type { Detector, Finding, Lexicon, LexiconEntry, Token } from "../plugin.ts";
2
+
3
+ // A helper verb or formal noun written in kanji where a style writes it in kana (見て下さい → 見てください). The word
4
+ // list says which words and how each is told apart from its main use (資料を下さい, 本を置く, 事が起きる); this file
5
+ // reads that off the tagger's marks. Pure: the tokens and the word list come in.
6
+
7
+ export type KanaSpelling = { readonly written: string; readonly preferred: string; readonly offset: number };
8
+
9
+ const TE_FORM = new Set(["て", "で"]);
10
+
11
+ const followsTeForm = (previous: Token | undefined): boolean => previous?.pos === "SCONJ" && TE_FORM.has(previous.surface);
12
+
13
+ const isBound = (token: Token): boolean => token.features?.["Bound"] === "Yes";
14
+
15
+ const isFormalNoun = (token: Token): boolean => token.features?.["NounType"] === "Dependent";
16
+
17
+ const TOPIC = "は";
18
+ const CASE_NI = "に";
19
+
20
+ /** 〜時は and 〜時には: a condition. 〜時から, 〜時に (a point in time) are not. */
21
+ const beforeTopic = (tokens: readonly Token[], index: number): boolean =>
22
+ tokens[index + 1]?.surface === TOPIC || (tokens[index + 1]?.surface === CASE_NI && tokens[index + 2]?.surface === TOPIC);
23
+
24
+ /** Whether the word at index is used as the list's group says: a helper after て, a formal noun, a condition (〜時は, 〜時には). */
25
+ const usedAsFunctionWord = (group: string | undefined, tokens: readonly Token[], index: number): boolean => {
26
+ const token = tokens[index];
27
+ if (token === undefined) return false;
28
+ if (group === "auxiliary") return isBound(token) || followsTeForm(tokens[index - 1]);
29
+ if (group === "after-te") return followsTeForm(tokens[index - 1]);
30
+ if (group === "formal-noun") return isFormalNoun(token);
31
+ if (group === "conditional") return isFormalNoun(token) && beforeTopic(tokens, index);
32
+ return false;
33
+ };
34
+
35
+ const KANJI = /^\p{Script=Han}+/u;
36
+
37
+ /** The written word with its kanji stem in kana: 下さい with 下さる → くださる gives ください. Undefined when the entry or the word does not fit. */
38
+ export const inKana = (written: string, entry: LexiconEntry): string | undefined => {
39
+ const stem = KANJI.exec(entry.pattern)?.[0];
40
+ const rewrite = entry.rewrite;
41
+ if (stem === undefined || rewrite === undefined || !written.startsWith(stem)) return undefined;
42
+ const okurigana = entry.pattern.slice(stem.length);
43
+ if (!rewrite.endsWith(okurigana)) return undefined;
44
+ return `${rewrite.slice(0, rewrite.length - okurigana.length)}${written.slice(stem.length)}`;
45
+ };
46
+
47
+ const entryFor = (token: Token, lexicon: Lexicon): LexiconEntry | undefined =>
48
+ lexicon.find((entry) => entry.pattern === token.lemma && token.surface.startsWith(entry.pattern.charAt(0)));
49
+
50
+ /** Each word in the tokens that the word list writes in kana, used as its group says. */
51
+ export const kanaSpellingsIn = (tokens: readonly Token[], lexicon: Lexicon): KanaSpelling[] =>
52
+ tokens.flatMap((token, index) => {
53
+ const entry = entryFor(token, lexicon);
54
+ if (entry === undefined || !usedAsFunctionWord(entry.group, tokens, index)) return [];
55
+ const preferred = inKana(token.surface, entry);
56
+ return preferred === undefined ? [] : [{ written: token.surface, preferred, offset: token.span.start }];
57
+ });
58
+
59
+ export const kanaFunctionWord: Detector = (doc, options): Finding[] => {
60
+ const lexicon = options.lexicon ?? [];
61
+ const found = doc.sentences.flatMap((sentence) => kanaSpellingsIn(sentence.tokens ?? [], lexicon).map((spelling) => ({ sentence, spelling })));
62
+ if (found.length < options.limit) return [];
63
+ return found.map(({ sentence, spelling }) => ({
64
+ rule: "",
65
+ severity: "info",
66
+ line: 0,
67
+ column: 0,
68
+ quote: sentence.text.trim(),
69
+ values: { matched: spelling.written, preferred: spelling.preferred, offset: spelling.offset },
70
+ }));
71
+ };
@@ -0,0 +1,33 @@
1
+ // line-amount-mismatch: the reading half. The column names come from the language's lexicons (quantity-column,
2
+ // unit-price-column, line-amount-column), the units from rate-unit and per-unit-mark; the tables are read from the prose with its tables put back, so code is not.
3
+ import type { Detector, Finding, ProseDocument } from "../plugin.ts";
4
+ import { lineAmountMismatches, type LineAmountWords } from "../structure/line-amount.ts";
5
+ import type { UnitWord } from "../structure/line-amount-unit.ts";
6
+ import { proseAndTablesOf } from "../table-text.ts";
7
+ import { quoteAt } from "./structure-tree.ts";
8
+
9
+ const patternsOf = (doc: ProseDocument, lexicon: string): string[] => (doc.lexicons[lexicon] ?? []).map((entry) => entry.pattern);
10
+
11
+ const unitWordsOf = (doc: ProseDocument, ...lexicons: string[]): UnitWord[] =>
12
+ lexicons.flatMap((lexicon) =>
13
+ (doc.lexicons[lexicon] ?? []).flatMap((entry) => (entry.group === undefined ? [] : [{ pattern: entry.pattern, unit: entry.group }])),
14
+ );
15
+
16
+ const wordsOf = (doc: ProseDocument): LineAmountWords => ({
17
+ quantity: patternsOf(doc, "quantity-column"),
18
+ unitPrice: patternsOf(doc, "unit-price-column"),
19
+ amount: patternsOf(doc, "line-amount-column"),
20
+ units: unitWordsOf(doc, "rate-unit"),
21
+ perUnitMarks: unitWordsOf(doc, "per-unit-mark"),
22
+ headerUnits: unitWordsOf(doc, "quantity-column", "unit-price-column"),
23
+ });
24
+
25
+ export const lineAmount: Detector = (doc): Finding[] =>
26
+ lineAmountMismatches(proseAndTablesOf(doc), wordsOf(doc)).map((issue) => ({
27
+ rule: "line-amount-mismatch",
28
+ severity: "error",
29
+ line: 0,
30
+ column: 0,
31
+ quote: quoteAt(doc.source, issue.offset),
32
+ values: { ...issue.values, offset: issue.offset },
33
+ }));
@@ -0,0 +1,30 @@
1
+ // Whether a sentence names where its content lives: a link, a web address, or a file in code. Pure.
2
+ import { bareUrls } from "../bare-url.ts";
3
+ import type { Span } from "../plugin.ts";
4
+
5
+ /** A code span: a run of backticks, then the same run closing it, neither run touching another backtick. */
6
+ const CODE_SPAN = /(?<!`)(`+)(?!`)(.+?)(?<!`)\1(?!`)/gsu;
7
+
8
+ /** A link to a place on the same page (`[text](#id)`): the reader is already on that page. */
9
+ const IN_PAGE_LINK = /\]\(\s*<?#[^)]*\)$/u;
10
+
11
+ /** A page a reader opens, as a file name: README.md, guide.html, spec.pdf. A source file (main.go) names code, not a page. */
12
+ const PAGE_FILE = /\.(?:md|markdown|mdx|txt|rst|adoc|html?|pdf)$/iu;
13
+
14
+ const SEPARATOR = /[/\\]/u;
15
+ const LETTER = /\p{L}/u;
16
+
17
+ /** Code that is a path (docs/api.md, ./config, src\index) or a page file, not an identifier or an expression. */
18
+ const isLocationCode = (code: string): boolean => {
19
+ const written = code.trim();
20
+ if (written.length === 0 || /\s/u.test(written) || !LETTER.test(written)) return false;
21
+ return SEPARATOR.test(written) || PAGE_FILE.test(written);
22
+ };
23
+
24
+ /** The sentence as written names a web address or, in code, a path or a page file. */
25
+ export const namesLocation = (written: string): boolean =>
26
+ bareUrls(written).length > 0 || [...written.matchAll(CODE_SPAN)].some((match) => isLocationCode(match[2] ?? ""));
27
+
28
+ /** One of the links written in the sentence's span leads off the page. */
29
+ export const holdsLink = (source: string, sentence: Span, links: readonly Span[]): boolean =>
30
+ links.some((link) => link.start < sentence.end && link.end > sentence.start && !IN_PAGE_LINK.test(source.slice(link.start, link.end)));
@@ -147,7 +147,24 @@ const reportFrom = (hits: readonly Hit[], limit: number): Finding[] => (hits.len
147
147
  /** A spaced hyphen or a double hyphen between words, standing for a dash ("late - very late", "late--very late"). */
148
148
  const HYPHEN_DASH = /(?<=[\p{L},;)]) -{1,2} (?=[\p{L}(])|(?<=\p{L})--(?=\p{L})/gu;
149
149
 
150
- export const hyphenDash: Detector = (doc, options): Finding[] => reportFrom(hitsOf(ownSentences(doc), HYPHEN_DASH), options.limit);
150
+ /** A dash set as a character (an em dash, an en dash). */
151
+ const TRUE_DASH = /[—–]/u;
152
+ const DOUBLE_HYPHEN = "--";
153
+
154
+ /**
155
+ * Whether the hit is a double hyphen in a document that sets no dash as a character: there "--" is how the document types its
156
+ * dash (plain-text standards, typewriter text, Markdown that a typographer turns into a dash), not a hyphen standing in for one.
157
+ */
158
+ const isTypedDash = (hit: Hit, setsDashes: boolean): boolean => !setsDashes && hit.matched === DOUBLE_HYPHEN;
159
+
160
+ export const hyphenDash: Detector = (doc, options): Finding[] => {
161
+ const sentences = ownSentences(doc);
162
+ const setsDashes = sentences.some((sentence) => TRUE_DASH.test(sentence.text));
163
+ return reportFrom(
164
+ hitsOf(sentences, HYPHEN_DASH).filter((hit) => !isTypedDash(hit, setsDashes)),
165
+ options.limit,
166
+ );
167
+ };
151
168
 
152
169
  /** Every way of writing an abbreviation with some of its periods dropped but not all (e.g. → e.g, eg.). */
153
170
  export const partialForms = (abbreviation: string): string[] => {
@@ -0,0 +1,25 @@
1
+ // nado-closed-list: 等, など or etc. on a list a limit closes (自転車等に限ります, only A, B, etc.), read sentence by sentence
2
+ // (nado-closed-list.ts). The tokens are moved to the sentence's own offsets before they are read.
3
+ import { closedListWordsOf, openWordsOnClosedLists } from "../nado-closed-list.ts";
4
+ import type { Detector, Finding, Sentence, Token } from "../plugin.ts";
5
+
6
+ const sentenceTokens = (sentence: Sentence): Token[] =>
7
+ (sentence.tokens ?? []).map((token) => ({
8
+ ...token,
9
+ span: { start: token.span.start - sentence.span.start, end: token.span.end - sentence.span.start },
10
+ }));
11
+
12
+ export const nadoClosedList: Detector = (doc, options): Finding[] => {
13
+ const words = closedListWordsOf(options.lexicon ?? []);
14
+ if (words.open.length === 0) return [];
15
+ return doc.sentences.flatMap((sentence) =>
16
+ openWordsOnClosedLists(sentence.text, sentenceTokens(sentence), words).map((hit) => ({
17
+ rule: "",
18
+ severity: "info",
19
+ line: 0,
20
+ column: 0,
21
+ quote: sentence.text.trim(),
22
+ values: { open: hit.open, limit: hit.limit, offset: sentence.span.start + hit.offset },
23
+ })),
24
+ );
25
+ };
@@ -1,15 +1,118 @@
1
- import type { Detector, Finding } from "../plugin.ts";
2
- import { mentionsIn, nameVariants } from "../name-variants.ts";
1
+ import type { Detector, Finding, ProseDocument } from "../plugin.ts";
2
+ import { cuedNamesIn, mentionsIn, nameVariants, suffixedNamesIn, type NameMention, type VariantChars } from "../name-variants.ts";
3
+ import { nameCueAt, type NameCues } from "../name-cue.ts";
3
4
  import { quoteAt } from "./structure-tree.ts";
5
+ import { companyMentionsIn, companyVariants, type CompanyForm, type IsProper } from "../company-names.ts";
6
+ import { placeMentionsIn, placeVariants, type PlaceReader, type PlaceWord } from "../place-names.ts";
7
+ import type { Token } from "../plugin.ts";
8
+
9
+ // 人の名前と読ませる敬称(様、さん)は語彙表 person-suffix、人を指す前置き(担当の)は person-lead、名前のすぐ後ろに来る語
10
+ // (です、まで)は name-particle、字体の違う同じ字(斎・斉・齋)は name-variant-char が組(group)ごとに言う。
11
+
12
+ const variantCharsOf = (doc: ProseDocument): VariantChars =>
13
+ new Map((doc.lexicons["name-variant-char"] ?? []).flatMap((entry): [string, string][] => (entry.group === undefined ? [] : [[entry.pattern, entry.group]])));
14
+
15
+ const patternsOf = (doc: ProseDocument, id: string): string[] => (doc.lexicons[id] ?? []).map((entry) => entry.pattern);
16
+
17
+ /** 会社の形の語(株式会社、Inc)は語彙表 company-form が、同じ形の組(group)と名前のどちら側に立つか(position)とともに言う。 */
18
+ const companyFormsOf = (doc: ProseDocument): CompanyForm[] =>
19
+ (doc.lexicons["company-form"] ?? []).map((entry) => ({ pattern: entry.pattern, group: entry.group ?? entry.pattern, position: entry.position }));
20
+
21
+ /** source の上の範囲に、品詞解析が固有名詞と読んだ語が掛かるか。 */
22
+ const properOf = (doc: ProseDocument): IsProper => {
23
+ const spans = doc.sentences.flatMap((sentence) => (sentence.tokens ?? []).filter((token) => token.pos === "PROPN").map((token) => token.span));
24
+ return (start, end) => spans.some((span) => span.start < end && start < span.end);
25
+ };
26
+
27
+ /** 場所の名前の終わりに立つ語(口、駅、Street、St.)は語彙表 place-word が、同じ語の別の書き方の組(group)とともに言う。 */
28
+ const placeWordsOf = (doc: ProseDocument): PlaceWord[] =>
29
+ (doc.lexicons["place-word"] ?? []).map((entry) => ({ pattern: entry.pattern, group: entry.group ?? entry.pattern }));
30
+
31
+ /** 名前の頭に立たない語の品詞(The、at、and)。 */
32
+ const FUNCTION_POS: ReadonlySet<string> = new Set(["DET", "ADP", "PRON", "CCONJ", "SCONJ", "AUX", "PART"]);
33
+
34
+ const tokensOf = (doc: ProseDocument): Token[] => doc.sentences.flatMap((sentence) => sentence.tokens ?? []);
35
+
36
+ /** 場所の名前の語の数の上限。名前の読みを探す範囲。 */
37
+ const MAX_PLACE_TOKENS = 20;
38
+
39
+ /** 範囲をちょうど覆う語の読みをつないだもの。記号の語は読まない。覆えないか、読めない語があれば無い。 */
40
+ const readingIn = (tokens: readonly Token[], startAt: ReadonlyMap<number, number>, start: number, end: number): string | undefined => {
41
+ const first = startAt.get(start);
42
+ if (first === undefined) return undefined;
43
+ const window = tokens.slice(first, first + MAX_PLACE_TOKENS);
44
+ const covering = window.slice(0, window.findIndex((token) => token.span.end >= end) + 1);
45
+ if (covering.at(-1)?.span.end !== end) return undefined;
46
+ const readings = covering.filter((token) => token.pos !== "PUNCT").map((token) => token.reading);
47
+ return readings.every((reading) => reading !== undefined && reading !== "") ? readings.join("") : undefined;
48
+ };
49
+
50
+ const placeReaderOf = (doc: ProseDocument): PlaceReader => {
51
+ const tokens = tokensOf(doc);
52
+ const startAt = new Map(tokens.map((token, index) => [token.span.start, index]));
53
+ const functionStarts = new Set(tokens.filter((token) => FUNCTION_POS.has(token.pos)).map((token) => token.span.start));
54
+ return {
55
+ properWords: (start, end) => {
56
+ const first = startAt.get(start);
57
+ const window = first === undefined ? [] : tokens.slice(first, first + MAX_PLACE_TOKENS);
58
+ return window.filter((token) => token.pos === "PROPN" && token.span.start < end).map((token) => token.span);
59
+ },
60
+ joiners: new Set(patternsOf(doc, "place-name-joiner")),
61
+ isFunctionWord: (start) => functionStarts.has(start),
62
+ readingOf: (start, end) => readingIn(tokens, startAt, start, end),
63
+ };
64
+ };
65
+
66
+ type Reported = { readonly offset: number; readonly name: string; readonly usual: string; readonly kind: string };
67
+
68
+ const overlapsAny = (reported: readonly Reported[], offset: number, length: number): boolean =>
69
+ reported.some((other) => other.offset < offset + length && offset < other.offset + other.name.length);
70
+
71
+ /** 会社の名前の書き分け。名前の見方がすでに指した所と重なるものは除く。 */
72
+ const companyFindings = (doc: ProseDocument, prose: string, reported: readonly Reported[]): Reported[] =>
73
+ companyVariants(companyMentionsIn(prose, companyFormsOf(doc), properOf(doc)))
74
+ .filter(({ mention }) => !overlapsAny(reported, mention.offset, mention.surface.length))
75
+ .map(({ mention, usual, kind }) => ({ offset: mention.offset, name: mention.surface, usual, kind: kind === "spelling" ? kind : `company-${kind}` }));
76
+
77
+ /** 場所の名前の書き分け。人や会社の名前の見方がすでに指した所と重なるものは除く。 */
78
+ const placeFindings = (doc: ProseDocument, prose: string, reported: readonly Reported[]): Reported[] =>
79
+ placeVariants(placeMentionsIn(prose, placeWordsOf(doc), placeReaderOf(doc)))
80
+ .filter(({ mention }) => !overlapsAny(reported, mention.offset, mention.surface.length))
81
+ .map(({ mention, usual, kind }) => ({ offset: mention.offset, name: mention.surface, usual, kind }));
82
+
83
+ /** 人・製品・会社の名前の現れ。解析器が固有名詞と読む語、敬称の付く名前、前後の語で名前と読める漢字。 */
84
+ const nameMentionsOf = (doc: ProseDocument, prose: string, chars: VariantChars): NameMention[] => {
85
+ const cues: NameCues = { leads: patternsOf(doc, "person-lead"), suffixes: patternsOf(doc, "person-suffix"), particles: patternsOf(doc, "name-particle") };
86
+ const tagged = doc.sentences.flatMap((sentence) => mentionsIn(sentence.tokens ?? [], doc.source, cues.suffixes));
87
+ const taggedOrSuffixed = [...tagged, ...suffixedNamesIn(prose, cues.suffixes, chars, tagged)];
88
+ return [...taggedOrSuffixed, ...cuedNamesIn(prose, cues, chars, taggedOrSuffixed)]
89
+ .map((mention): NameMention => {
90
+ const cue = mention.cue ?? nameCueAt(prose, mention.offset, mention.surface, cues);
91
+ return cue === undefined ? mention : { ...mention, cue };
92
+ })
93
+ .toSorted((left, right) => left.offset - right.offset);
94
+ };
4
95
 
5
96
  /** 同じ名前を、文書の中で少しだけ違う形に書いた所(GitHub と Github、山田太郎 と 山田太朗)。少ないほうを指す。 */
6
- export const nameVariant: Detector = (doc): Finding[] =>
7
- nameVariants(doc.sentences.flatMap((sentence) => mentionsIn(sentence.tokens ?? [], doc.source))).map(({ mention, usual, kind }) => ({
8
- rule: "",
9
- severity: "warning",
10
- line: 0,
11
- column: 0,
12
- quote: quoteAt(doc.source, mention.offset),
13
- values: { name: mention.surface, usual, offset: mention.offset },
14
- variant: kind,
97
+ export const nameVariant: Detector = (doc): Finding[] => {
98
+ const prose = doc.prose ?? doc.source;
99
+ const chars = variantCharsOf(doc);
100
+ const names = nameVariants(nameMentionsOf(doc, prose, chars), chars).map(({ mention, usual, kind }): Reported => ({
101
+ offset: mention.offset,
102
+ name: mention.surface,
103
+ usual,
104
+ kind,
15
105
  }));
106
+ const namesAndCompanies = [...names, ...companyFindings(doc, prose, names)];
107
+ return [...namesAndCompanies, ...placeFindings(doc, prose, namesAndCompanies)]
108
+ .toSorted((left, right) => left.offset - right.offset)
109
+ .map(({ offset, name, usual, kind }) => ({
110
+ rule: "",
111
+ severity: "warning",
112
+ line: 0,
113
+ column: 0,
114
+ quote: quoteAt(doc.source, offset),
115
+ values: { name, usual, offset },
116
+ variant: kind,
117
+ }));
118
+ };
@@ -1,5 +1,6 @@
1
1
  import type { Detector, Finding, Lexicon, Sentence, Token } from "../plugin.ts";
2
2
  import { densityFindings } from "./ai-phrasing.ts";
3
+ import { entryEndsAt } from "./lexicon-match.ts";
3
4
 
4
5
  /**
5
6
  * The word kinds an article can stand before. A conjunction, a preposition or a verb after "a" is the letter a ("option A
@@ -127,30 +128,76 @@ const ADJECTIVE = "ADJ";
127
128
 
128
129
  type Intensified = { readonly sentence: Sentence; readonly matched: string; readonly offset: number };
129
130
 
130
- type IntensifierWords = { readonly intensifiers: ReadonlySet<string>; readonly exceptions: ReadonlySet<string> };
131
+ type IntensifierWords = {
132
+ readonly intensifiers: Lexicon;
133
+ readonly exceptions: ReadonlySet<string>;
134
+ /** Words after a noun that make it an adjective (便利な, 静かだ). Japanese only: its adjectival nouns are tagged as nouns. */
135
+ readonly copulas: ReadonlySet<string>;
136
+ };
137
+
138
+ /** An adjective, or a noun the lexicon's copula, an auxiliary (not the particle で), makes one: 便利 in 便利な. */
139
+ const isAdjectiveAt = (tokens: readonly Token[], at: number, copulas: ReadonlySet<string>): boolean => {
140
+ const token = tokens[at];
141
+ if (token?.pos === ADJECTIVE) return true;
142
+ const after = tokens[at + 1];
143
+ return token?.pos === "NOUN" && after?.pos === "AUX" && copulas.has(after.surface);
144
+ };
145
+
146
+ const isBlank = (token: Token): boolean => token.surface.trim() === "";
147
+
148
+ /** For each token, the index of the last non-blank token before it, or -1: one pass, so a long sentence is not rescanned per token. */
149
+ const previousWords = (tokens: readonly Token[]): number[] =>
150
+ tokens.reduce<{ readonly before: number[]; readonly last: number }>(
151
+ ({ before, last }, token, index) => {
152
+ before.push(last);
153
+ return { before, last: isBlank(token) ? last : index };
154
+ },
155
+ { before: [], last: -1 },
156
+ ).before;
157
+
158
+ /** The intensifier that ends at `end` (past a line break: 非常に / 危険), as the index of its first token. */
159
+ const intensifierStart = (tokens: readonly Token[], end: number, intensifiers: Lexicon): number | undefined => {
160
+ const entry = intensifiers.find((candidate) => entryEndsAt(tokens, candidate, end));
161
+ return entry === undefined ? undefined : end - (entry.tokens?.length ?? 1);
162
+ };
163
+
164
+ /** The intensifier and the adjective as words: "very important" in a spaced language, 非常に危険 in one measured in characters. */
165
+ const matchedText = (tokens: readonly Token[], start: number, at: number, spaced: boolean): string =>
166
+ tokens
167
+ .slice(start, at + 1)
168
+ .filter((token) => !isBlank(token))
169
+ .map((token) => token.surface)
170
+ .join(spaced ? " " : "");
131
171
 
132
172
  /** The lexicon's intensifier right before an adjective ("very important"), not before an excepted word ("the very first"). */
133
- const intensifiedIn = (source: string, sentence: Sentence, words: IntensifierWords): Intensified[] => {
173
+ const intensifiedIn = (source: string, sentence: Sentence, words: IntensifierWords, spaced: boolean): Intensified[] => {
134
174
  const tokens = sentence.tokens ?? [];
135
- return tokens.flatMap((token, at) => {
136
- const next = tokens[at + 1];
137
- if (next === undefined || !words.intensifiers.has(token.surface.toLowerCase()) || next.pos !== ADJECTIVE) return [];
138
- if (!adjacent(source, token, next)) return [];
139
- return words.exceptions.has(next.surface.toLowerCase()) ? [] : [{ sentence, matched: `${token.surface} ${next.surface}`, offset: token.span.start }];
175
+ const before = previousWords(tokens);
176
+ return tokens.flatMap((next, at) => {
177
+ const lastAt = before[at] ?? -1;
178
+ const start = intensifierStart(tokens, lastAt + 1, words.intensifiers);
179
+ const first = start === undefined ? undefined : tokens[start];
180
+ const last = tokens[lastAt];
181
+ if (start === undefined || first === undefined || last === undefined || !isAdjectiveAt(tokens, at, words.copulas)) return [];
182
+ if (!adjacent(source, last, next) || words.exceptions.has(next.surface.toLowerCase())) return [];
183
+ return [{ sentence, matched: matchedText(tokens, start, at, spaced), offset: first.span.start }];
140
184
  });
141
185
  };
142
186
 
143
187
  const EXCEPTIONS = "very-exception";
188
+ const COPULAS = "very-copula";
144
189
 
145
190
  /** "very" + adjective, dense for the document's length: each one leans on "very" instead of a stronger word. */
146
191
  export const intensifiedAdjective: Detector = (doc, options): Finding[] => {
147
192
  const words = {
148
- intensifiers: new Set((options.lexicon ?? []).map((entry) => entry.pattern)),
193
+ intensifiers: options.lexicon ?? [],
149
194
  exceptions: new Set((doc.lexicons[EXCEPTIONS] ?? []).map((entry) => entry.pattern)),
195
+ copulas: new Set((doc.lexicons[COPULAS] ?? []).map((entry) => entry.pattern)),
150
196
  };
197
+ const spaced = doc.lengthUnit !== "char";
151
198
  return densityFindings(
152
199
  doc,
153
- doc.sentences.flatMap((sentence) => intensifiedIn(doc.source, sentence, words)),
200
+ doc.sentences.flatMap((sentence) => intensifiedIn(doc.source, sentence, words, spaced)),
154
201
  options.limit,
155
202
  );
156
203
  };