chaffjs 0.17.0 → 0.19.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 (1236) hide show
  1. package/README.md +52 -56
  2. package/bin/chaff.js +17 -2
  3. package/dist/acronym-expansions.d.ts +26 -0
  4. package/dist/acronym-expansions.d.ts.map +1 -0
  5. package/dist/acronym-expansions.js +88 -0
  6. package/dist/acronym-expansions.js.map +1 -0
  7. package/dist/announced-count.d.ts +26 -0
  8. package/dist/announced-count.d.ts.map +1 -0
  9. package/dist/announced-count.js +138 -0
  10. package/dist/announced-count.js.map +1 -0
  11. package/dist/announced-list.d.ts +30 -0
  12. package/dist/announced-list.d.ts.map +1 -0
  13. package/dist/announced-list.js +95 -0
  14. package/dist/announced-list.js.map +1 -0
  15. package/dist/api.d.ts +168 -0
  16. package/dist/api.d.ts.map +1 -0
  17. package/dist/api.js +10 -0
  18. package/dist/api.js.map +1 -0
  19. package/dist/bare-url.d.ts +14 -0
  20. package/dist/bare-url.d.ts.map +1 -0
  21. package/dist/bare-url.js +28 -0
  22. package/dist/bare-url.js.map +1 -0
  23. package/dist/baseline.d.ts +5 -0
  24. package/dist/baseline.d.ts.map +1 -1
  25. package/dist/baseline.js +16 -1
  26. package/dist/baseline.js.map +1 -1
  27. package/dist/body-section.d.ts +7 -0
  28. package/dist/body-section.d.ts.map +1 -0
  29. package/dist/body-section.js +6 -0
  30. package/dist/body-section.js.map +1 -0
  31. package/dist/calendar-number.d.ts +2 -0
  32. package/dist/calendar-number.d.ts.map +1 -1
  33. package/dist/calendar-number.js +9 -2
  34. package/dist/calendar-number.js.map +1 -1
  35. package/dist/cli-args.d.ts +4 -0
  36. package/dist/cli-args.d.ts.map +1 -1
  37. package/dist/cli-args.js +5 -0
  38. package/dist/cli-args.js.map +1 -1
  39. package/dist/cli-text.d.ts +0 -1
  40. package/dist/cli-text.d.ts.map +1 -1
  41. package/dist/cli-text.js +14 -18
  42. package/dist/cli-text.js.map +1 -1
  43. package/dist/cli.d.ts.map +1 -1
  44. package/dist/cli.js +83 -84
  45. package/dist/cli.js.map +1 -1
  46. package/dist/closing-paragraph.d.ts +7 -0
  47. package/dist/closing-paragraph.d.ts.map +1 -0
  48. package/dist/closing-paragraph.js +22 -0
  49. package/dist/closing-paragraph.js.map +1 -0
  50. package/dist/commands/compare.d.ts +15 -0
  51. package/dist/commands/compare.d.ts.map +1 -0
  52. package/dist/commands/compare.js +64 -0
  53. package/dist/commands/compare.js.map +1 -0
  54. package/dist/commands/document-commands.d.ts +9 -0
  55. package/dist/commands/document-commands.d.ts.map +1 -0
  56. package/dist/commands/document-commands.js +17 -0
  57. package/dist/commands/document-commands.js.map +1 -0
  58. package/dist/commands/eval.d.ts.map +1 -1
  59. package/dist/commands/eval.js +19 -10
  60. package/dist/commands/eval.js.map +1 -1
  61. package/dist/commands/facts.d.ts +8 -0
  62. package/dist/commands/facts.d.ts.map +1 -0
  63. package/dist/commands/facts.js +30 -0
  64. package/dist/commands/facts.js.map +1 -0
  65. package/dist/commands/feedback.d.ts +15 -2
  66. package/dist/commands/feedback.d.ts.map +1 -1
  67. package/dist/commands/feedback.js +36 -6
  68. package/dist/commands/feedback.js.map +1 -1
  69. package/dist/commands/fix-plan.d.ts +13 -0
  70. package/dist/commands/fix-plan.d.ts.map +1 -0
  71. package/dist/commands/fix-plan.js +44 -0
  72. package/dist/commands/fix-plan.js.map +1 -0
  73. package/dist/commands/outline.d.ts +8 -0
  74. package/dist/commands/outline.d.ts.map +1 -0
  75. package/dist/commands/outline.js +43 -0
  76. package/dist/commands/outline.js.map +1 -0
  77. package/dist/commands/read-document.d.ts +14 -0
  78. package/dist/commands/read-document.d.ts.map +1 -0
  79. package/dist/commands/read-document.js +21 -0
  80. package/dist/commands/read-document.js.map +1 -0
  81. package/dist/commands/suppressions.d.ts +7 -0
  82. package/dist/commands/suppressions.d.ts.map +1 -0
  83. package/dist/commands/suppressions.js +9 -0
  84. package/dist/commands/suppressions.js.map +1 -0
  85. package/dist/commands/test.d.ts.map +1 -1
  86. package/dist/commands/test.js +3 -5
  87. package/dist/commands/test.js.map +1 -1
  88. package/dist/commands/tree.d.ts +13 -0
  89. package/dist/commands/tree.d.ts.map +1 -1
  90. package/dist/commands/tree.js +35 -5
  91. package/dist/commands/tree.js.map +1 -1
  92. package/dist/compare/atom.d.ts +31 -0
  93. package/dist/compare/atom.d.ts.map +1 -0
  94. package/dist/compare/atom.js +4 -0
  95. package/dist/compare/atom.js.map +1 -0
  96. package/dist/compare/clock-time.d.ts +8 -0
  97. package/dist/compare/clock-time.d.ts.map +1 -0
  98. package/dist/compare/clock-time.js +68 -0
  99. package/dist/compare/clock-time.js.map +1 -0
  100. package/dist/compare/distinct.d.ts +9 -0
  101. package/dist/compare/distinct.d.ts.map +1 -0
  102. package/dist/compare/distinct.js +12 -0
  103. package/dist/compare/distinct.js.map +1 -0
  104. package/dist/compare/extract.d.ts +15 -0
  105. package/dist/compare/extract.d.ts.map +1 -0
  106. package/dist/compare/extract.js +60 -0
  107. package/dist/compare/extract.js.map +1 -0
  108. package/dist/compare/fact-key.d.ts +17 -0
  109. package/dist/compare/fact-key.d.ts.map +1 -0
  110. package/dist/compare/fact-key.js +25 -0
  111. package/dist/compare/fact-key.js.map +1 -0
  112. package/dist/compare/fact-text.d.ts +28 -0
  113. package/dist/compare/fact-text.d.ts.map +1 -0
  114. package/dist/compare/fact-text.js +61 -0
  115. package/dist/compare/fact-text.js.map +1 -0
  116. package/dist/compare/facts-render.d.ts +17 -0
  117. package/dist/compare/facts-render.d.ts.map +1 -0
  118. package/dist/compare/facts-render.js +43 -0
  119. package/dist/compare/facts-render.js.map +1 -0
  120. package/dist/compare/facts-text.d.ts +15 -0
  121. package/dist/compare/facts-text.d.ts.map +1 -0
  122. package/dist/compare/facts-text.js +27 -0
  123. package/dist/compare/facts-text.js.map +1 -0
  124. package/dist/compare/markup-atoms.d.ts +11 -0
  125. package/dist/compare/markup-atoms.d.ts.map +1 -0
  126. package/dist/compare/markup-atoms.js +23 -0
  127. package/dist/compare/markup-atoms.js.map +1 -0
  128. package/dist/compare/match.d.ts +20 -0
  129. package/dist/compare/match.d.ts.map +1 -0
  130. package/dist/compare/match.js +84 -0
  131. package/dist/compare/match.js.map +1 -0
  132. package/dist/compare/outcome.d.ts +36 -0
  133. package/dist/compare/outcome.d.ts.map +1 -0
  134. package/dist/compare/outcome.js +46 -0
  135. package/dist/compare/outcome.js.map +1 -0
  136. package/dist/compare/proper-nouns.d.ts +19 -0
  137. package/dist/compare/proper-nouns.d.ts.map +1 -0
  138. package/dist/compare/proper-nouns.js +43 -0
  139. package/dist/compare/proper-nouns.js.map +1 -0
  140. package/dist/compare/render.d.ts +13 -0
  141. package/dist/compare/render.d.ts.map +1 -0
  142. package/dist/compare/render.js +64 -0
  143. package/dist/compare/render.js.map +1 -0
  144. package/dist/compare/spans.d.ts +9 -0
  145. package/dist/compare/spans.d.ts.map +1 -0
  146. package/dist/compare/spans.js +11 -0
  147. package/dist/compare/spans.js.map +1 -0
  148. package/dist/compare/text-atoms.d.ts +27 -0
  149. package/dist/compare/text-atoms.d.ts.map +1 -0
  150. package/dist/compare/text-atoms.js +69 -0
  151. package/dist/compare/text-atoms.js.map +1 -0
  152. package/dist/compare/text.d.ts +24 -0
  153. package/dist/compare/text.d.ts.map +1 -0
  154. package/dist/compare/text.js +90 -0
  155. package/dist/compare/text.js.map +1 -0
  156. package/dist/compare/tree-atoms.d.ts +20 -0
  157. package/dist/compare/tree-atoms.d.ts.map +1 -0
  158. package/dist/compare/tree-atoms.js +58 -0
  159. package/dist/compare/tree-atoms.js.map +1 -0
  160. package/dist/compare/written-names.d.ts +8 -0
  161. package/dist/compare/written-names.d.ts.map +1 -0
  162. package/dist/compare/written-names.js +24 -0
  163. package/dist/compare/written-names.js.map +1 -0
  164. package/dist/config/load.d.ts +23 -0
  165. package/dist/config/load.d.ts.map +1 -1
  166. package/dist/config/load.js +6 -0
  167. package/dist/config/load.js.map +1 -1
  168. package/dist/config/option-problems.d.ts +17 -0
  169. package/dist/config/option-problems.d.ts.map +1 -0
  170. package/dist/config/option-problems.js +59 -0
  171. package/dist/config/option-problems.js.map +1 -0
  172. package/dist/config/read.d.ts +4 -0
  173. package/dist/config/read.d.ts.map +1 -0
  174. package/dist/config/read.js +8 -0
  175. package/dist/config/read.js.map +1 -0
  176. package/dist/config/rule-problems.d.ts +2 -4
  177. package/dist/config/rule-problems.d.ts.map +1 -1
  178. package/dist/config/rule-problems.js +7 -1
  179. package/dist/config/rule-problems.js.map +1 -1
  180. package/dist/config/style.d.ts +21 -0
  181. package/dist/config/style.d.ts.map +1 -0
  182. package/dist/config/style.js +48 -0
  183. package/dist/config/style.js.map +1 -0
  184. package/dist/config/warnings.d.ts +6 -0
  185. package/dist/config/warnings.d.ts.map +1 -0
  186. package/dist/config/warnings.js +10 -0
  187. package/dist/config/warnings.js.map +1 -0
  188. package/dist/config/write.d.ts.map +1 -1
  189. package/dist/config/write.js +17 -4
  190. package/dist/config/write.js.map +1 -1
  191. package/dist/custom/bounded-match.d.ts +15 -0
  192. package/dist/custom/bounded-match.d.ts.map +1 -0
  193. package/dist/custom/bounded-match.js +43 -0
  194. package/dist/custom/bounded-match.js.map +1 -0
  195. package/dist/custom/load.d.ts +11 -0
  196. package/dist/custom/load.d.ts.map +1 -0
  197. package/dist/custom/load.js +19 -0
  198. package/dist/custom/load.js.map +1 -0
  199. package/dist/custom/module-path.d.ts +11 -0
  200. package/dist/custom/module-path.d.ts.map +1 -0
  201. package/dist/custom/module-path.js +15 -0
  202. package/dist/custom/module-path.js.map +1 -0
  203. package/dist/custom/parse.d.ts +84 -0
  204. package/dist/custom/parse.d.ts.map +1 -0
  205. package/dist/custom/parse.js +258 -0
  206. package/dist/custom/parse.js.map +1 -0
  207. package/dist/custom/problems.d.ts +8 -0
  208. package/dist/custom/problems.d.ts.map +1 -0
  209. package/dist/custom/problems.js +95 -0
  210. package/dist/custom/problems.js.map +1 -0
  211. package/dist/custom/regex-safety.d.ts +11 -0
  212. package/dist/custom/regex-safety.d.ts.map +1 -0
  213. package/dist/custom/regex-safety.js +110 -0
  214. package/dist/custom/regex-safety.js.map +1 -0
  215. package/dist/custom/token-pattern.d.ts +8 -0
  216. package/dist/custom/token-pattern.d.ts.map +1 -0
  217. package/dist/custom/token-pattern.js +75 -0
  218. package/dist/custom/token-pattern.js.map +1 -0
  219. package/dist/detect-language.js +1 -1
  220. package/dist/detect.d.ts.map +1 -1
  221. package/dist/detect.js +30 -2
  222. package/dist/detect.js.map +1 -1
  223. package/dist/detectors/acronym-context.d.ts +2 -0
  224. package/dist/detectors/acronym-context.d.ts.map +1 -1
  225. package/dist/detectors/acronym-context.js +12 -4
  226. package/dist/detectors/acronym-context.js.map +1 -1
  227. package/dist/detectors/ai-phrasing.d.ts +23 -0
  228. package/dist/detectors/ai-phrasing.d.ts.map +1 -0
  229. package/dist/detectors/ai-phrasing.js +116 -0
  230. package/dist/detectors/ai-phrasing.js.map +1 -0
  231. package/dist/detectors/announced-count.d.ts +4 -0
  232. package/dist/detectors/announced-count.d.ts.map +1 -0
  233. package/dist/detectors/announced-count.js +20 -0
  234. package/dist/detectors/announced-count.js.map +1 -0
  235. package/dist/detectors/bold-label.d.ts +10 -0
  236. package/dist/detectors/bold-label.d.ts.map +1 -0
  237. package/dist/detectors/bold-label.js +44 -0
  238. package/dist/detectors/bold-label.js.map +1 -0
  239. package/dist/detectors/broken-link.d.ts +17 -0
  240. package/dist/detectors/broken-link.d.ts.map +1 -0
  241. package/dist/detectors/broken-link.js +66 -0
  242. package/dist/detectors/broken-link.js.map +1 -0
  243. package/dist/detectors/cited-name.d.ts.map +1 -1
  244. package/dist/detectors/cited-name.js +4 -4
  245. package/dist/detectors/cited-name.js.map +1 -1
  246. package/dist/detectors/cited-title.d.ts +11 -0
  247. package/dist/detectors/cited-title.d.ts.map +1 -0
  248. package/dist/detectors/cited-title.js +75 -0
  249. package/dist/detectors/cited-title.js.map +1 -0
  250. package/dist/detectors/concrete-evidence.d.ts +1 -1
  251. package/dist/detectors/concrete-evidence.d.ts.map +1 -1
  252. package/dist/detectors/concrete-evidence.js +2 -1
  253. package/dist/detectors/concrete-evidence.js.map +1 -1
  254. package/dist/detectors/contrast-frame.d.ts +17 -0
  255. package/dist/detectors/contrast-frame.d.ts.map +1 -0
  256. package/dist/detectors/contrast-frame.js +32 -0
  257. package/dist/detectors/contrast-frame.js.map +1 -0
  258. package/dist/detectors/custom.d.ts +8 -0
  259. package/dist/detectors/custom.d.ts.map +1 -0
  260. package/dist/detectors/custom.js +71 -0
  261. package/dist/detectors/custom.js.map +1 -0
  262. package/dist/detectors/dangling-figure.d.ts +7 -0
  263. package/dist/detectors/dangling-figure.d.ts.map +1 -0
  264. package/dist/detectors/dangling-figure.js +20 -0
  265. package/dist/detectors/dangling-figure.js.map +1 -0
  266. package/dist/detectors/definition-use.d.ts +8 -0
  267. package/dist/detectors/definition-use.d.ts.map +1 -0
  268. package/dist/detectors/definition-use.js +32 -0
  269. package/dist/detectors/definition-use.js.map +1 -0
  270. package/dist/detectors/doubled-punctuation.d.ts +9 -0
  271. package/dist/detectors/doubled-punctuation.d.ts.map +1 -0
  272. package/dist/detectors/doubled-punctuation.js +35 -0
  273. package/dist/detectors/doubled-punctuation.js.map +1 -0
  274. package/dist/detectors/doubled-word.d.ts +5 -0
  275. package/dist/detectors/doubled-word.d.ts.map +1 -1
  276. package/dist/detectors/doubled-word.js +24 -11
  277. package/dist/detectors/doubled-word.js.map +1 -1
  278. package/dist/detectors/duplicate-heading.d.ts +14 -0
  279. package/dist/detectors/duplicate-heading.d.ts.map +1 -0
  280. package/dist/detectors/duplicate-heading.js +39 -0
  281. package/dist/detectors/duplicate-heading.js.map +1 -0
  282. package/dist/detectors/empty-section.d.ts +8 -0
  283. package/dist/detectors/empty-section.d.ts.map +1 -0
  284. package/dist/detectors/empty-section.js +16 -0
  285. package/dist/detectors/empty-section.js.map +1 -0
  286. package/dist/detectors/enumerated-runs.d.ts +1 -1
  287. package/dist/detectors/enumerated-runs.d.ts.map +1 -1
  288. package/dist/detectors/enumerated-runs.js +15 -4
  289. package/dist/detectors/enumerated-runs.js.map +1 -1
  290. package/dist/detectors/fullwidth-alnum.d.ts +24 -0
  291. package/dist/detectors/fullwidth-alnum.d.ts.map +1 -0
  292. package/dist/detectors/fullwidth-alnum.js +88 -0
  293. package/dist/detectors/fullwidth-alnum.js.map +1 -0
  294. package/dist/detectors/gram-furniture.d.ts +6 -0
  295. package/dist/detectors/gram-furniture.d.ts.map +1 -0
  296. package/dist/detectors/gram-furniture.js +21 -0
  297. package/dist/detectors/gram-furniture.js.map +1 -0
  298. package/dist/detectors/gram-place.d.ts +2 -0
  299. package/dist/detectors/gram-place.d.ts.map +1 -1
  300. package/dist/detectors/gram-place.js +9 -7
  301. package/dist/detectors/gram-place.js.map +1 -1
  302. package/dist/detectors/gram-windows.d.ts +9 -0
  303. package/dist/detectors/gram-windows.d.ts.map +1 -0
  304. package/dist/detectors/gram-windows.js +27 -0
  305. package/dist/detectors/gram-windows.js.map +1 -0
  306. package/dist/detectors/hankaku-kana.d.ts +9 -0
  307. package/dist/detectors/hankaku-kana.d.ts.map +1 -0
  308. package/dist/detectors/hankaku-kana.js +27 -0
  309. package/dist/detectors/hankaku-kana.js.map +1 -0
  310. package/dist/detectors/heading-case.d.ts +2 -0
  311. package/dist/detectors/heading-case.d.ts.map +1 -1
  312. package/dist/detectors/heading-case.js +29 -2
  313. package/dist/detectors/heading-case.js.map +1 -1
  314. package/dist/detectors/heading-code-words.d.ts +6 -0
  315. package/dist/detectors/heading-code-words.d.ts.map +1 -0
  316. package/dist/detectors/heading-code-words.js +29 -0
  317. package/dist/detectors/heading-code-words.js.map +1 -0
  318. package/dist/detectors/heading-echo.d.ts.map +1 -1
  319. package/dist/detectors/heading-echo.js +7 -4
  320. package/dist/detectors/heading-echo.js.map +1 -1
  321. package/dist/detectors/heading-level-skip.d.ts +12 -0
  322. package/dist/detectors/heading-level-skip.d.ts.map +1 -0
  323. package/dist/detectors/heading-level-skip.js +11 -0
  324. package/dist/detectors/heading-level-skip.js.map +1 -0
  325. package/dist/detectors/image-alt-text.d.ts +3 -0
  326. package/dist/detectors/image-alt-text.d.ts.map +1 -0
  327. package/dist/detectors/image-alt-text.js +9 -0
  328. package/dist/detectors/image-alt-text.js.map +1 -0
  329. package/dist/detectors/index.d.ts.map +1 -1
  330. package/dist/detectors/index.js +70 -1
  331. package/dist/detectors/index.js.map +1 -1
  332. package/dist/detectors/invisible-character.d.ts +20 -0
  333. package/dist/detectors/invisible-character.d.ts.map +1 -0
  334. package/dist/detectors/invisible-character.js +143 -0
  335. package/dist/detectors/invisible-character.js.map +1 -0
  336. package/dist/detectors/kutoten-consistency.d.ts +24 -0
  337. package/dist/detectors/kutoten-consistency.d.ts.map +1 -0
  338. package/dist/detectors/kutoten-consistency.js +77 -0
  339. package/dist/detectors/kutoten-consistency.js.map +1 -0
  340. package/dist/detectors/lead-in.d.ts +1 -0
  341. package/dist/detectors/lead-in.d.ts.map +1 -1
  342. package/dist/detectors/lead-in.js +2 -1
  343. package/dist/detectors/lead-in.js.map +1 -1
  344. package/dist/detectors/lexicon-match.d.ts +14 -1
  345. package/dist/detectors/lexicon-match.d.ts.map +1 -1
  346. package/dist/detectors/lexicon-match.js +32 -2
  347. package/dist/detectors/lexicon-match.js.map +1 -1
  348. package/dist/detectors/lexicon.d.ts +6 -1
  349. package/dist/detectors/lexicon.d.ts.map +1 -1
  350. package/dist/detectors/lexicon.js +31 -13
  351. package/dist/detectors/lexicon.js.map +1 -1
  352. package/dist/detectors/list-item.d.ts +45 -0
  353. package/dist/detectors/list-item.d.ts.map +1 -0
  354. package/dist/detectors/list-item.js +88 -0
  355. package/dist/detectors/list-item.js.map +1 -0
  356. package/dist/detectors/list-items.d.ts +31 -0
  357. package/dist/detectors/list-items.d.ts.map +1 -0
  358. package/dist/detectors/list-items.js +113 -0
  359. package/dist/detectors/list-items.js.map +1 -0
  360. package/dist/detectors/list-lead-in.d.ts +7 -0
  361. package/dist/detectors/list-lead-in.d.ts.map +1 -0
  362. package/dist/detectors/list-lead-in.js +28 -0
  363. package/dist/detectors/list-lead-in.js.map +1 -0
  364. package/dist/detectors/list-sentence.d.ts +67 -0
  365. package/dist/detectors/list-sentence.d.ts.map +1 -0
  366. package/dist/detectors/list-sentence.js +130 -0
  367. package/dist/detectors/list-sentence.js.map +1 -0
  368. package/dist/detectors/list-view.d.ts +34 -0
  369. package/dist/detectors/list-view.d.ts.map +1 -0
  370. package/dist/detectors/list-view.js +137 -0
  371. package/dist/detectors/list-view.js.map +1 -0
  372. package/dist/detectors/long-vowel.d.ts +7 -0
  373. package/dist/detectors/long-vowel.d.ts.map +1 -0
  374. package/dist/detectors/long-vowel.js +71 -0
  375. package/dist/detectors/long-vowel.js.map +1 -0
  376. package/dist/detectors/markup-finding.d.ts +8 -0
  377. package/dist/detectors/markup-finding.d.ts.map +1 -0
  378. package/dist/detectors/markup-finding.js +29 -0
  379. package/dist/detectors/markup-finding.js.map +1 -0
  380. package/dist/detectors/modal-conflict.d.ts +4 -0
  381. package/dist/detectors/modal-conflict.d.ts.map +1 -0
  382. package/dist/detectors/modal-conflict.js +22 -0
  383. package/dist/detectors/modal-conflict.js.map +1 -0
  384. package/dist/detectors/name-numeral.d.ts +1 -1
  385. package/dist/detectors/name-numeral.d.ts.map +1 -1
  386. package/dist/detectors/name-numeral.js +2 -7
  387. package/dist/detectors/name-numeral.js.map +1 -1
  388. package/dist/detectors/name-variant.d.ts +4 -0
  389. package/dist/detectors/name-variant.d.ts.map +1 -0
  390. package/dist/detectors/name-variant.js +13 -0
  391. package/dist/detectors/name-variant.js.map +1 -0
  392. package/dist/detectors/nominalization.d.ts +11 -0
  393. package/dist/detectors/nominalization.d.ts.map +1 -0
  394. package/dist/detectors/nominalization.js +56 -0
  395. package/dist/detectors/nominalization.js.map +1 -0
  396. package/dist/detectors/orthography.d.ts.map +1 -1
  397. package/dist/detectors/orthography.js +72 -37
  398. package/dist/detectors/orthography.js.map +1 -1
  399. package/dist/detectors/outside-announced-list.d.ts +4 -0
  400. package/dist/detectors/outside-announced-list.d.ts.map +1 -0
  401. package/dist/detectors/outside-announced-list.js +24 -0
  402. package/dist/detectors/outside-announced-list.js.map +1 -0
  403. package/dist/detectors/oxford-comma.d.ts +7 -1
  404. package/dist/detectors/oxford-comma.d.ts.map +1 -1
  405. package/dist/detectors/oxford-comma.js +136 -229
  406. package/dist/detectors/oxford-comma.js.map +1 -1
  407. package/dist/detectors/phrase-match.d.ts +4 -1
  408. package/dist/detectors/phrase-match.d.ts.map +1 -1
  409. package/dist/detectors/phrase-match.js +26 -7
  410. package/dist/detectors/phrase-match.js.map +1 -1
  411. package/dist/detectors/place-run.d.ts.map +1 -1
  412. package/dist/detectors/place-run.js +10 -6
  413. package/dist/detectors/place-run.js.map +1 -1
  414. package/dist/detectors/placeholder-text.d.ts +9 -0
  415. package/dist/detectors/placeholder-text.d.ts.map +1 -0
  416. package/dist/detectors/placeholder-text.js +18 -0
  417. package/dist/detectors/placeholder-text.js.map +1 -0
  418. package/dist/detectors/quote-around.d.ts +3 -0
  419. package/dist/detectors/quote-around.d.ts.map +1 -0
  420. package/dist/detectors/quote-around.js +8 -0
  421. package/dist/detectors/quote-around.js.map +1 -0
  422. package/dist/detectors/ra-nuki.d.ts +9 -0
  423. package/dist/detectors/ra-nuki.d.ts.map +1 -0
  424. package/dist/detectors/ra-nuki.js +30 -0
  425. package/dist/detectors/ra-nuki.js.map +1 -0
  426. package/dist/detectors/register.d.ts +11 -3
  427. package/dist/detectors/register.d.ts.map +1 -1
  428. package/dist/detectors/register.js +28 -9
  429. package/dist/detectors/register.js.map +1 -1
  430. package/dist/detectors/requirement-modal.d.ts +5 -0
  431. package/dist/detectors/requirement-modal.d.ts.map +1 -0
  432. package/dist/detectors/requirement-modal.js +54 -0
  433. package/dist/detectors/requirement-modal.js.map +1 -0
  434. package/dist/detectors/requirement-smell.d.ts +4 -0
  435. package/dist/detectors/requirement-smell.d.ts.map +1 -0
  436. package/dist/detectors/requirement-smell.js +41 -0
  437. package/dist/detectors/requirement-smell.js.map +1 -0
  438. package/dist/detectors/roman-numeral.d.ts +2 -0
  439. package/dist/detectors/roman-numeral.d.ts.map +1 -1
  440. package/dist/detectors/roman-numeral.js +2 -0
  441. package/dist/detectors/roman-numeral.js.map +1 -1
  442. package/dist/detectors/sentence-ending.d.ts +17 -1
  443. package/dist/detectors/sentence-ending.d.ts.map +1 -1
  444. package/dist/detectors/sentence-ending.js +13 -7
  445. package/dist/detectors/sentence-ending.js.map +1 -1
  446. package/dist/detectors/sentence-length.d.ts.map +1 -1
  447. package/dist/detectors/sentence-length.js +13 -4
  448. package/dist/detectors/sentence-length.js.map +1 -1
  449. package/dist/detectors/signals.d.ts +8 -0
  450. package/dist/detectors/signals.d.ts.map +1 -1
  451. package/dist/detectors/signals.js +67 -46
  452. package/dist/detectors/signals.js.map +1 -1
  453. package/dist/detectors/space-before-punctuation.d.ts +8 -0
  454. package/dist/detectors/space-before-punctuation.d.ts.map +1 -0
  455. package/dist/detectors/space-before-punctuation.js +24 -0
  456. package/dist/detectors/space-before-punctuation.js.map +1 -0
  457. package/dist/detectors/spelling-variety.d.ts +23 -0
  458. package/dist/detectors/spelling-variety.d.ts.map +1 -0
  459. package/dist/detectors/spelling-variety.js +59 -0
  460. package/dist/detectors/spelling-variety.js.map +1 -0
  461. package/dist/detectors/structure-tree.d.ts +6 -0
  462. package/dist/detectors/structure-tree.d.ts.map +1 -1
  463. package/dist/detectors/structure-tree.js +39 -1
  464. package/dist/detectors/structure-tree.js.map +1 -1
  465. package/dist/detectors/structure.d.ts +1 -3
  466. package/dist/detectors/structure.d.ts.map +1 -1
  467. package/dist/detectors/structure.js +19 -6
  468. package/dist/detectors/structure.js.map +1 -1
  469. package/dist/detectors/superlative-comparison.d.ts +20 -0
  470. package/dist/detectors/superlative-comparison.d.ts.map +1 -0
  471. package/dist/detectors/superlative-comparison.js +32 -0
  472. package/dist/detectors/superlative-comparison.js.map +1 -0
  473. package/dist/detectors/superlative-name.d.ts.map +1 -1
  474. package/dist/detectors/superlative-name.js +8 -5
  475. package/dist/detectors/superlative-name.js.map +1 -1
  476. package/dist/detectors/superlative-scope.d.ts.map +1 -1
  477. package/dist/detectors/superlative-scope.js +9 -4
  478. package/dist/detectors/superlative-scope.js.map +1 -1
  479. package/dist/detectors/token-column.d.ts +46 -0
  480. package/dist/detectors/token-column.d.ts.map +1 -0
  481. package/dist/detectors/token-column.js +95 -0
  482. package/dist/detectors/token-column.js.map +1 -0
  483. package/dist/detectors/unbalanced-bracket.d.ts +22 -0
  484. package/dist/detectors/unbalanced-bracket.d.ts.map +1 -0
  485. package/dist/detectors/unbalanced-bracket.js +119 -0
  486. package/dist/detectors/unbalanced-bracket.js.map +1 -0
  487. package/dist/detectors/url-run-on.d.ts +9 -0
  488. package/dist/detectors/url-run-on.d.ts.map +1 -0
  489. package/dist/detectors/url-run-on.js +24 -0
  490. package/dist/detectors/url-run-on.js.map +1 -0
  491. package/dist/detectors/vague-figure-pointer.d.ts +10 -0
  492. package/dist/detectors/vague-figure-pointer.d.ts.map +1 -0
  493. package/dist/detectors/vague-figure-pointer.js +46 -0
  494. package/dist/detectors/vague-figure-pointer.js.map +1 -0
  495. package/dist/detectors/word-list.d.ts +2 -0
  496. package/dist/detectors/word-list.d.ts.map +1 -1
  497. package/dist/detectors/word-list.js +4 -1
  498. package/dist/detectors/word-list.js.map +1 -1
  499. package/dist/document-sections.d.ts +13 -0
  500. package/dist/document-sections.d.ts.map +1 -0
  501. package/dist/document-sections.js +32 -0
  502. package/dist/document-sections.js.map +1 -0
  503. package/dist/document.d.ts +20 -7
  504. package/dist/document.d.ts.map +1 -1
  505. package/dist/document.js +140 -125
  506. package/dist/document.js.map +1 -1
  507. package/dist/email-parts.d.ts +28 -0
  508. package/dist/email-parts.d.ts.map +1 -0
  509. package/dist/email-parts.js +230 -0
  510. package/dist/email-parts.js.map +1 -0
  511. package/dist/eval.d.ts +2 -1
  512. package/dist/eval.d.ts.map +1 -1
  513. package/dist/eval.js +16 -4
  514. package/dist/eval.js.map +1 -1
  515. package/dist/extension/document-view.d.ts +7 -0
  516. package/dist/extension/document-view.d.ts.map +1 -0
  517. package/dist/extension/document-view.js +91 -0
  518. package/dist/extension/document-view.js.map +1 -0
  519. package/dist/extension/failure-text.d.ts +5 -0
  520. package/dist/extension/failure-text.d.ts.map +1 -0
  521. package/dist/extension/failure-text.js +33 -0
  522. package/dist/extension/failure-text.js.map +1 -0
  523. package/dist/extension/import-default.d.ts +7 -0
  524. package/dist/extension/import-default.d.ts.map +1 -0
  525. package/dist/extension/import-default.js +21 -0
  526. package/dist/extension/import-default.js.map +1 -0
  527. package/dist/extension/load.d.ts +28 -0
  528. package/dist/extension/load.d.ts.map +1 -0
  529. package/dist/extension/load.js +51 -0
  530. package/dist/extension/load.js.map +1 -0
  531. package/dist/extension/module-detector.d.ts +21 -0
  532. package/dist/extension/module-detector.d.ts.map +1 -0
  533. package/dist/extension/module-detector.js +49 -0
  534. package/dist/extension/module-detector.js.map +1 -0
  535. package/dist/extension/plugin-load.d.ts +9 -0
  536. package/dist/extension/plugin-load.d.ts.map +1 -0
  537. package/dist/extension/plugin-load.js +68 -0
  538. package/dist/extension/plugin-load.js.map +1 -0
  539. package/dist/extension/plugin-name.d.ts +8 -0
  540. package/dist/extension/plugin-name.d.ts.map +1 -0
  541. package/dist/extension/plugin-name.js +22 -0
  542. package/dist/extension/plugin-name.js.map +1 -0
  543. package/dist/extension/plugin-parse.d.ts +41 -0
  544. package/dist/extension/plugin-parse.d.ts.map +1 -0
  545. package/dist/extension/plugin-parse.js +156 -0
  546. package/dist/extension/plugin-parse.js.map +1 -0
  547. package/dist/extension/problem-text.d.ts +5 -0
  548. package/dist/extension/problem-text.d.ts.map +1 -0
  549. package/dist/extension/problem-text.js +74 -0
  550. package/dist/extension/problem-text.js.map +1 -0
  551. package/dist/extension/real-path.d.ts +3 -0
  552. package/dist/extension/real-path.d.ts.map +1 -0
  553. package/dist/extension/real-path.js +8 -0
  554. package/dist/extension/real-path.js.map +1 -0
  555. package/dist/extension/returned-findings.d.ts +17 -0
  556. package/dist/extension/returned-findings.d.ts.map +1 -0
  557. package/dist/extension/returned-findings.js +48 -0
  558. package/dist/extension/returned-findings.js.map +1 -0
  559. package/dist/extension/rule-export.d.ts +13 -0
  560. package/dist/extension/rule-export.d.ts.map +1 -0
  561. package/dist/extension/rule-export.js +16 -0
  562. package/dist/extension/rule-export.js.map +1 -0
  563. package/dist/feedback/draft.d.ts +2 -0
  564. package/dist/feedback/draft.d.ts.map +1 -1
  565. package/dist/feedback/draft.js +3 -0
  566. package/dist/feedback/draft.js.map +1 -1
  567. package/dist/figure-references.d.ts +39 -0
  568. package/dist/figure-references.d.ts.map +1 -0
  569. package/dist/figure-references.js +113 -0
  570. package/dist/figure-references.js.map +1 -0
  571. package/dist/files.d.ts +2 -0
  572. package/dist/files.d.ts.map +1 -1
  573. package/dist/files.js +4 -0
  574. package/dist/files.js.map +1 -1
  575. package/dist/finding-order.d.ts +9 -0
  576. package/dist/finding-order.d.ts.map +1 -0
  577. package/dist/finding-order.js +3 -0
  578. package/dist/finding-order.js.map +1 -0
  579. package/dist/fix-plan/mode.d.ts +21 -0
  580. package/dist/fix-plan/mode.d.ts.map +1 -0
  581. package/dist/fix-plan/mode.js +16 -0
  582. package/dist/fix-plan/mode.js.map +1 -0
  583. package/dist/fix-plan/plan.d.ts +77 -0
  584. package/dist/fix-plan/plan.d.ts.map +1 -0
  585. package/dist/fix-plan/plan.js +100 -0
  586. package/dist/fix-plan/plan.js.map +1 -0
  587. package/dist/fix-plan/render.d.ts +6 -0
  588. package/dist/fix-plan/render.d.ts.map +1 -0
  589. package/dist/fix-plan/render.js +101 -0
  590. package/dist/fix-plan/render.js.map +1 -0
  591. package/dist/fix-plan/text.d.ts +35 -0
  592. package/dist/fix-plan/text.d.ts.map +1 -0
  593. package/dist/fix-plan/text.js +95 -0
  594. package/dist/fix-plan/text.js.map +1 -0
  595. package/dist/heading-label.d.ts +22 -0
  596. package/dist/heading-label.d.ts.map +1 -0
  597. package/dist/heading-label.js +50 -0
  598. package/dist/heading-label.js.map +1 -0
  599. package/dist/in-page-nav.d.ts +4 -1
  600. package/dist/in-page-nav.d.ts.map +1 -1
  601. package/dist/in-page-nav.js +53 -18
  602. package/dist/in-page-nav.js.map +1 -1
  603. package/dist/joined-view.d.ts.map +1 -1
  604. package/dist/joined-view.js +1 -0
  605. package/dist/joined-view.js.map +1 -1
  606. package/dist/language-sample.d.ts +2 -0
  607. package/dist/language-sample.d.ts.map +1 -0
  608. package/dist/language-sample.js +41 -0
  609. package/dist/language-sample.js.map +1 -0
  610. package/dist/levels.d.ts +5 -1
  611. package/dist/levels.d.ts.map +1 -1
  612. package/dist/levels.js +9 -0
  613. package/dist/levels.js.map +1 -1
  614. package/dist/line-paragraphs.d.ts +8 -0
  615. package/dist/line-paragraphs.d.ts.map +1 -1
  616. package/dist/line-paragraphs.js +33 -10
  617. package/dist/line-paragraphs.js.map +1 -1
  618. package/dist/link-line.d.ts +8 -0
  619. package/dist/link-line.d.ts.map +1 -0
  620. package/dist/link-line.js +12 -0
  621. package/dist/link-line.js.map +1 -0
  622. package/dist/long-vowel.d.ts +38 -0
  623. package/dist/long-vowel.d.ts.map +1 -0
  624. package/dist/long-vowel.js +78 -0
  625. package/dist/long-vowel.js.map +1 -0
  626. package/dist/markdown-node.d.ts +19 -0
  627. package/dist/markdown-node.d.ts.map +1 -0
  628. package/dist/markdown-node.js +6 -0
  629. package/dist/markdown-node.js.map +1 -0
  630. package/dist/markdown-read.d.ts +17 -0
  631. package/dist/markdown-read.d.ts.map +1 -0
  632. package/dist/markdown-read.js +37 -0
  633. package/dist/markdown-read.js.map +1 -0
  634. package/dist/markup.d.ts +22 -0
  635. package/dist/markup.d.ts.map +1 -0
  636. package/dist/markup.js +182 -0
  637. package/dist/markup.js.map +1 -0
  638. package/dist/mask.js +8 -5
  639. package/dist/mask.js.map +1 -1
  640. package/dist/name-variants.d.ts +25 -0
  641. package/dist/name-variants.d.ts.map +1 -0
  642. package/dist/name-variants.js +181 -0
  643. package/dist/name-variants.js.map +1 -0
  644. package/dist/node-version.d.ts +7 -0
  645. package/dist/node-version.d.ts.map +1 -0
  646. package/dist/node-version.js +19 -0
  647. package/dist/node-version.js.map +1 -0
  648. package/dist/not-run.d.ts +14 -0
  649. package/dist/not-run.d.ts.map +1 -0
  650. package/dist/not-run.js +12 -0
  651. package/dist/not-run.js.map +1 -0
  652. package/dist/number-name.d.ts +21 -5
  653. package/dist/number-name.d.ts.map +1 -1
  654. package/dist/number-name.js +119 -17
  655. package/dist/number-name.js.map +1 -1
  656. package/dist/orthography.d.ts +10 -1
  657. package/dist/orthography.d.ts.map +1 -1
  658. package/dist/orthography.js +42 -16
  659. package/dist/orthography.js.map +1 -1
  660. package/dist/outline/render.d.ts +18 -0
  661. package/dist/outline/render.d.ts.map +1 -0
  662. package/dist/outline/render.js +60 -0
  663. package/dist/outline/render.js.map +1 -0
  664. package/dist/outline/shape.d.ts +26 -0
  665. package/dist/outline/shape.d.ts.map +1 -0
  666. package/dist/outline/shape.js +37 -0
  667. package/dist/outline/shape.js.map +1 -0
  668. package/dist/outline/text.d.ts +21 -0
  669. package/dist/outline/text.d.ts.map +1 -0
  670. package/dist/outline/text.js +30 -0
  671. package/dist/outline/text.js.map +1 -0
  672. package/dist/page-furniture.d.ts +5 -2
  673. package/dist/page-furniture.d.ts.map +1 -1
  674. package/dist/page-furniture.js +8 -2
  675. package/dist/page-furniture.js.map +1 -1
  676. package/dist/plain-source.d.ts +1 -0
  677. package/dist/plain-source.d.ts.map +1 -1
  678. package/dist/plain-source.js +2 -1
  679. package/dist/plain-source.js.map +1 -1
  680. package/dist/plugin.d.ts +138 -1
  681. package/dist/plugin.d.ts.map +1 -1
  682. package/dist/profile/for-file.d.ts.map +1 -1
  683. package/dist/profile/for-file.js +3 -1
  684. package/dist/profile/for-file.js.map +1 -1
  685. package/dist/quoted-span.d.ts.map +1 -1
  686. package/dist/quoted-span.js +8 -3
  687. package/dist/quoted-span.js.map +1 -1
  688. package/dist/reasons.d.ts +4 -0
  689. package/dist/reasons.d.ts.map +1 -1
  690. package/dist/reasons.js +8 -0
  691. package/dist/reasons.js.map +1 -1
  692. package/dist/reference-lists.d.ts +3 -0
  693. package/dist/reference-lists.d.ts.map +1 -0
  694. package/dist/reference-lists.js +75 -0
  695. package/dist/reference-lists.js.map +1 -0
  696. package/dist/render/compact.d.ts +3 -1
  697. package/dist/render/compact.d.ts.map +1 -1
  698. package/dist/render/compact.js +8 -2
  699. package/dist/render/compact.js.map +1 -1
  700. package/dist/render/explain.d.ts +9 -1
  701. package/dist/render/explain.d.ts.map +1 -1
  702. package/dist/render/explain.js +54 -13
  703. package/dist/render/explain.js.map +1 -1
  704. package/dist/render/friendly.d.ts.map +1 -1
  705. package/dist/render/friendly.js +19 -9
  706. package/dist/render/friendly.js.map +1 -1
  707. package/dist/render/options.d.ts +7 -0
  708. package/dist/render/options.d.ts.map +1 -0
  709. package/dist/render/options.js +50 -0
  710. package/dist/render/options.js.map +1 -0
  711. package/dist/render/rules-json.d.ts +4 -1
  712. package/dist/render/rules-json.d.ts.map +1 -1
  713. package/dist/render/rules-json.js +110 -16
  714. package/dist/render/rules-json.js.map +1 -1
  715. package/dist/render/rules-table.d.ts +4 -0
  716. package/dist/render/rules-table.d.ts.map +1 -0
  717. package/dist/render/rules-table.js +70 -0
  718. package/dist/render/rules-table.js.map +1 -0
  719. package/dist/render/sarif.js +4 -4
  720. package/dist/render/sarif.js.map +1 -1
  721. package/dist/render/semantic.js +3 -3
  722. package/dist/render/semantic.js.map +1 -1
  723. package/dist/render/severity-name.d.ts +6 -0
  724. package/dist/render/severity-name.d.ts.map +1 -0
  725. package/dist/render/severity-name.js +7 -0
  726. package/dist/render/severity-name.js.map +1 -0
  727. package/dist/render/suppressions.d.ts +3 -0
  728. package/dist/render/suppressions.d.ts.map +1 -1
  729. package/dist/render/suppressions.js +20 -1
  730. package/dist/render/suppressions.js.map +1 -1
  731. package/dist/render/text.d.ts +7 -2
  732. package/dist/render/text.d.ts.map +1 -1
  733. package/dist/render/text.js +15 -4
  734. package/dist/render/text.js.map +1 -1
  735. package/dist/resolve-genre.d.ts +1 -1
  736. package/dist/resolve-genre.d.ts.map +1 -1
  737. package/dist/resolve-genre.js +4 -1
  738. package/dist/resolve-genre.js.map +1 -1
  739. package/dist/rule-genres.d.ts +24 -0
  740. package/dist/rule-genres.d.ts.map +1 -0
  741. package/dist/rule-genres.js +11 -0
  742. package/dist/rule-genres.js.map +1 -0
  743. package/dist/rule-guide.d.ts +73 -0
  744. package/dist/rule-guide.d.ts.map +1 -0
  745. package/dist/rule-guide.js +95 -0
  746. package/dist/rule-guide.js.map +1 -0
  747. package/dist/rule-load.d.ts.map +1 -1
  748. package/dist/rule-load.js +87 -33
  749. package/dist/rule-load.js.map +1 -1
  750. package/dist/rule-options.d.ts +50 -0
  751. package/dist/rule-options.d.ts.map +1 -0
  752. package/dist/rule-options.js +106 -0
  753. package/dist/rule-options.js.map +1 -0
  754. package/dist/run-semantic.d.ts.map +1 -1
  755. package/dist/run-semantic.js +2 -1
  756. package/dist/run-semantic.js.map +1 -1
  757. package/dist/run.d.ts +18 -1
  758. package/dist/run.d.ts.map +1 -1
  759. package/dist/run.js +80 -19
  760. package/dist/run.js.map +1 -1
  761. package/dist/sentence-shape.d.ts.map +1 -1
  762. package/dist/sentence-shape.js +4 -4
  763. package/dist/sentence-shape.js.map +1 -1
  764. package/dist/setting-problems.d.ts +2 -1
  765. package/dist/setting-problems.d.ts.map +1 -1
  766. package/dist/setting-problems.js +8 -1
  767. package/dist/setting-problems.js.map +1 -1
  768. package/dist/spacing-minority.d.ts +16 -0
  769. package/dist/spacing-minority.d.ts.map +1 -0
  770. package/dist/spacing-minority.js +23 -0
  771. package/dist/spacing-minority.js.map +1 -0
  772. package/dist/span-cut.d.ts +6 -0
  773. package/dist/span-cut.d.ts.map +1 -0
  774. package/dist/span-cut.js +22 -0
  775. package/dist/span-cut.js.map +1 -0
  776. package/dist/stet-block.d.ts +5 -0
  777. package/dist/stet-block.d.ts.map +1 -0
  778. package/dist/stet-block.js +59 -0
  779. package/dist/stet-block.js.map +1 -0
  780. package/dist/stet.d.ts +4 -0
  781. package/dist/stet.d.ts.map +1 -1
  782. package/dist/stet.js +31 -11
  783. package/dist/stet.js.map +1 -1
  784. package/dist/structure/aside-depth.d.ts +21 -0
  785. package/dist/structure/aside-depth.d.ts.map +1 -0
  786. package/dist/structure/aside-depth.js +65 -0
  787. package/dist/structure/aside-depth.js.map +1 -0
  788. package/dist/structure/build.d.ts +5 -1
  789. package/dist/structure/build.d.ts.map +1 -1
  790. package/dist/structure/build.js +29 -17
  791. package/dist/structure/build.js.map +1 -1
  792. package/dist/structure/closed-pairs.d.ts +8 -0
  793. package/dist/structure/closed-pairs.d.ts.map +1 -0
  794. package/dist/structure/closed-pairs.js +22 -0
  795. package/dist/structure/closed-pairs.js.map +1 -0
  796. package/dist/structure/date-range.d.ts +31 -0
  797. package/dist/structure/date-range.d.ts.map +1 -0
  798. package/dist/structure/date-range.js +77 -0
  799. package/dist/structure/date-range.js.map +1 -0
  800. package/dist/structure/definition-use.d.ts +32 -0
  801. package/dist/structure/definition-use.d.ts.map +1 -0
  802. package/dist/structure/definition-use.js +102 -0
  803. package/dist/structure/definition-use.js.map +1 -0
  804. package/dist/structure/known-mentions.d.ts +18 -0
  805. package/dist/structure/known-mentions.d.ts.map +1 -0
  806. package/dist/structure/known-mentions.js +78 -0
  807. package/dist/structure/known-mentions.js.map +1 -0
  808. package/dist/structure/lazy-tree.d.ts +8 -0
  809. package/dist/structure/lazy-tree.d.ts.map +1 -0
  810. package/dist/structure/lazy-tree.js +14 -0
  811. package/dist/structure/lazy-tree.js.map +1 -0
  812. package/dist/structure/modal-conflict.d.ts +28 -0
  813. package/dist/structure/modal-conflict.d.ts.map +1 -0
  814. package/dist/structure/modal-conflict.js +74 -0
  815. package/dist/structure/modal-conflict.js.map +1 -0
  816. package/dist/structure/numbered-clauses.d.ts +4 -0
  817. package/dist/structure/numbered-clauses.d.ts.map +1 -0
  818. package/dist/structure/numbered-clauses.js +9 -0
  819. package/dist/structure/numbered-clauses.js.map +1 -0
  820. package/dist/structure/numbering.d.ts +1 -0
  821. package/dist/structure/numbering.d.ts.map +1 -1
  822. package/dist/structure/numbering.js +11 -6
  823. package/dist/structure/numbering.js.map +1 -1
  824. package/dist/structure/of.d.ts +3 -1
  825. package/dist/structure/of.d.ts.map +1 -1
  826. package/dist/structure/of.js +5 -1
  827. package/dist/structure/of.js.map +1 -1
  828. package/dist/structure/percent-sum.d.ts +16 -0
  829. package/dist/structure/percent-sum.d.ts.map +1 -0
  830. package/dist/structure/percent-sum.js +104 -0
  831. package/dist/structure/percent-sum.js.map +1 -0
  832. package/dist/structure/quoted-number.d.ts +8 -0
  833. package/dist/structure/quoted-number.d.ts.map +1 -0
  834. package/dist/structure/quoted-number.js +34 -0
  835. package/dist/structure/quoted-number.js.map +1 -0
  836. package/dist/structure/relative-find.d.ts.map +1 -1
  837. package/dist/structure/relative-find.js +34 -46
  838. package/dist/structure/relative-find.js.map +1 -1
  839. package/dist/structure/relative-resolve.d.ts.map +1 -1
  840. package/dist/structure/relative-resolve.js +76 -30
  841. package/dist/structure/relative-resolve.js.map +1 -1
  842. package/dist/structure/runs.d.ts +2 -0
  843. package/dist/structure/runs.d.ts.map +1 -1
  844. package/dist/structure/runs.js +2 -2
  845. package/dist/structure/runs.js.map +1 -1
  846. package/dist/structure/sexp.d.ts +1 -1
  847. package/dist/structure/sexp.d.ts.map +1 -1
  848. package/dist/structure/sexp.js +18 -6
  849. package/dist/structure/sexp.js.map +1 -1
  850. package/dist/structure/total.d.ts +3 -0
  851. package/dist/structure/total.d.ts.map +1 -1
  852. package/dist/structure/total.js +2 -2
  853. package/dist/structure/total.js.map +1 -1
  854. package/dist/structure/universal.d.ts +14 -2
  855. package/dist/structure/universal.d.ts.map +1 -1
  856. package/dist/structure/universal.js +24 -3
  857. package/dist/structure/universal.js.map +1 -1
  858. package/dist/structure/wrapped-tail.d.ts +14 -7
  859. package/dist/structure/wrapped-tail.d.ts.map +1 -1
  860. package/dist/structure/wrapped-tail.js +33 -8
  861. package/dist/structure/wrapped-tail.js.map +1 -1
  862. package/dist/style-load.d.ts +4 -0
  863. package/dist/style-load.d.ts.map +1 -0
  864. package/dist/style-load.js +28 -0
  865. package/dist/style-load.js.map +1 -0
  866. package/dist/style-parse.d.ts +25 -0
  867. package/dist/style-parse.d.ts.map +1 -0
  868. package/dist/style-parse.js +88 -0
  869. package/dist/style-parse.js.map +1 -0
  870. package/dist/subheading-line.d.ts +23 -0
  871. package/dist/subheading-line.d.ts.map +1 -0
  872. package/dist/subheading-line.js +85 -0
  873. package/dist/subheading-line.js.map +1 -0
  874. package/dist/tag-coverage.d.ts +8 -0
  875. package/dist/tag-coverage.d.ts.map +1 -0
  876. package/dist/tag-coverage.js +7 -0
  877. package/dist/tag-coverage.js.map +1 -0
  878. package/dist/template-syntax.d.ts +17 -0
  879. package/dist/template-syntax.d.ts.map +1 -0
  880. package/dist/template-syntax.js +140 -0
  881. package/dist/template-syntax.js.map +1 -0
  882. package/dist/text-above.d.ts +19 -0
  883. package/dist/text-above.d.ts.map +1 -0
  884. package/dist/text-above.js +43 -0
  885. package/dist/text-above.js.map +1 -0
  886. package/dist/text-figures.d.ts +10 -0
  887. package/dist/text-figures.d.ts.map +1 -0
  888. package/dist/text-figures.js +131 -0
  889. package/dist/text-figures.js.map +1 -0
  890. package/dist/trailing-aside.d.ts +2 -0
  891. package/dist/trailing-aside.d.ts.map +1 -0
  892. package/dist/trailing-aside.js +53 -0
  893. package/dist/trailing-aside.js.map +1 -0
  894. package/dist/tree-walk.d.ts +18 -0
  895. package/dist/tree-walk.d.ts.map +1 -0
  896. package/dist/tree-walk.js +45 -0
  897. package/dist/tree-walk.js.map +1 -0
  898. package/genres.yaml +68 -0
  899. package/package.json +9 -3
  900. package/reference-headings.yaml +17 -0
  901. package/rules/acronym-expansion-conflict.yaml +82 -0
  902. package/rules/adverb-overuse.yaml +19 -0
  903. package/rules/agentless-passive.yaml +47 -0
  904. package/rules/agreement-slip.yaml +14 -1
  905. package/rules/ai-generated-composite.yaml +102 -0
  906. package/rules/ai-tell.yaml +57 -0
  907. package/rules/announced-count-mismatch.yaml +57 -0
  908. package/rules/announcing-opener.yaml +82 -0
  909. package/rules/assistant-residue.yaml +82 -0
  910. package/rules/bold-density.yaml +59 -0
  911. package/rules/bold-label-list.yaml +81 -0
  912. package/rules/broken-link.yaml +65 -0
  913. package/rules/closing-cliche.yaml +58 -0
  914. package/rules/colon-lead-in.yaml +83 -0
  915. package/rules/concrete-evidence-density.yaml +41 -0
  916. package/rules/contraction-consistency.yaml +18 -0
  917. package/rules/contrast-framing.yaml +88 -0
  918. package/rules/cushion-phrase-density.yaml +53 -1
  919. package/rules/dangling-figure-reference.yaml +61 -0
  920. package/rules/dangling-reference.yaml +54 -1
  921. package/rules/date-order.yaml +34 -1
  922. package/rules/date-range-reversed.yaml +46 -0
  923. package/rules/date-weekday-mismatch.yaml +17 -1
  924. package/rules/double-keigo.yaml +16 -0
  925. package/rules/double-negative.yaml +51 -0
  926. package/rules/doubled-punctuation.yaml +45 -0
  927. package/rules/doubled-word.yaml +18 -2
  928. package/rules/duplicate-definition.yaml +59 -1
  929. package/rules/duplicate-heading.yaml +78 -0
  930. package/rules/emoji-density.yaml +28 -2
  931. package/rules/empty-conclusion.yaml +28 -0
  932. package/rules/empty-intensifier.yaml +44 -0
  933. package/rules/empty-section.yaml +74 -0
  934. package/rules/excessive-hedging.yaml +49 -2
  935. package/rules/expletive-construction.yaml +19 -0
  936. package/rules/fullwidth-alnum-consistency.yaml +53 -0
  937. package/rules/hankaku-kana.yaml +41 -0
  938. package/rules/heading-echo.yaml +31 -0
  939. package/rules/heading-level-skip.yaml +78 -0
  940. package/rules/hiragana-fukushi.yaml +16 -0
  941. package/rules/image-alt-text.yaml +54 -0
  942. package/rules/internal-jargon.yaml +21 -0
  943. package/rules/invisible-character.yaml +63 -0
  944. package/rules/katakana-long-vowel.yaml +99 -0
  945. package/rules/kutoten-consistency.yaml +53 -0
  946. package/rules/latin-spacing.yaml +30 -4
  947. package/rules/max-kanji-continuous.yaml +17 -0
  948. package/rules/max-paragraph-length.yaml +34 -0
  949. package/rules/max-sentence-length.yaml +58 -0
  950. package/rules/modal-conflict.yaml +106 -0
  951. package/rules/name-variant.yaml +88 -0
  952. package/rules/ngram-repetition.yaml +29 -2
  953. package/rules/no-doubled-joshi.yaml +17 -0
  954. package/rules/no-em-dash.yaml +49 -0
  955. package/rules/no-mixed-desumasu.yaml +28 -2
  956. package/rules/no-nakaguro-parallel.yaml +20 -0
  957. package/rules/nominalization.yaml +89 -0
  958. package/rules/numbering-gap.yaml +53 -1
  959. package/rules/outside-announced-list.yaml +80 -0
  960. package/rules/oxford-comma-consistency.yaml +18 -0
  961. package/rules/padded-intro.yaml +44 -0
  962. package/rules/paragraph-length-variance.yaml +73 -0
  963. package/rules/percent-sum-mismatch.yaml +58 -0
  964. package/rules/preamble-length.yaml +56 -0
  965. package/rules/preferred-term.yaml +28 -0
  966. package/rules/proper-noun-density.yaml +37 -2
  967. package/rules/ra-nuki.yaml +43 -0
  968. package/rules/repeated-conjunction.yaml +47 -0
  969. package/rules/repeated-sentence-head.yaml +23 -0
  970. package/rules/required-sections.yaml +49 -0
  971. package/rules/requirement-modal.yaml +94 -0
  972. package/rules/requirement-smell.yaml +70 -0
  973. package/rules/risk-disclosure.yaml +22 -0
  974. package/rules/rule-of-three.yaml +143 -0
  975. package/rules/sasete-itadaku.yaml +18 -0
  976. package/rules/section-length-uniformity.yaml +113 -0
  977. package/rules/sentence-initial-conjunction-run.yaml +18 -0
  978. package/rules/sentence-rhythm.yaml +51 -0
  979. package/rules/space-before-punctuation.yaml +41 -0
  980. package/rules/spelling-consistency.yaml +47 -0
  981. package/rules/stock-transition.yaml +86 -0
  982. package/rules/stray-space.yaml +18 -0
  983. package/rules/taigen-dome-in-prose.yaml +33 -0
  984. package/rules/title-case-consistency.yaml +42 -0
  985. package/rules/total-mismatch.yaml +38 -1
  986. package/rules/unbalanced-bracket.yaml +56 -0
  987. package/rules/undefined-acronym.yaml +23 -0
  988. package/rules/unfilled-placeholder.yaml +50 -0
  989. package/rules/unqualified-superlative.yaml +20 -0
  990. package/rules/unsourced-number.yaml +16 -0
  991. package/rules/unused-definition.yaml +75 -0
  992. package/rules/url-run-on.yaml +45 -0
  993. package/rules/use-before-definition.yaml +77 -0
  994. package/rules/vague-figure-reference.yaml +66 -0
  995. package/skills/chaff/SKILL.md +171 -1
  996. package/src/acronym-expansions.ts +106 -0
  997. package/src/announced-count.ts +190 -0
  998. package/src/announced-list.ts +120 -0
  999. package/src/api.ts +154 -0
  1000. package/src/bare-url.ts +35 -0
  1001. package/src/baseline.ts +17 -1
  1002. package/src/body-section.ts +7 -0
  1003. package/src/calendar-number.ts +18 -4
  1004. package/src/cli-args.ts +6 -0
  1005. package/src/cli-text.ts +14 -15
  1006. package/src/cli.ts +93 -92
  1007. package/src/closing-paragraph.ts +24 -0
  1008. package/src/commands/compare.ts +73 -0
  1009. package/src/commands/document-commands.ts +19 -0
  1010. package/src/commands/eval.ts +22 -10
  1011. package/src/commands/facts.ts +33 -0
  1012. package/src/commands/feedback.ts +45 -7
  1013. package/src/commands/fix-plan.ts +53 -0
  1014. package/src/commands/outline.ts +49 -0
  1015. package/src/commands/read-document.ts +24 -0
  1016. package/src/commands/suppressions.ts +19 -0
  1017. package/src/commands/test.ts +3 -5
  1018. package/src/commands/tree.ts +41 -5
  1019. package/src/compare/atom.ts +33 -0
  1020. package/src/compare/clock-time.ts +89 -0
  1021. package/src/compare/distinct.ts +13 -0
  1022. package/src/compare/extract.ts +80 -0
  1023. package/src/compare/fact-key.ts +31 -0
  1024. package/src/compare/fact-text.ts +87 -0
  1025. package/src/compare/facts-render.ts +63 -0
  1026. package/src/compare/facts-text.ts +41 -0
  1027. package/src/compare/markup-atoms.ts +29 -0
  1028. package/src/compare/match.ts +105 -0
  1029. package/src/compare/outcome.ts +80 -0
  1030. package/src/compare/proper-nouns.ts +65 -0
  1031. package/src/compare/render.ts +102 -0
  1032. package/src/compare/spans.ts +17 -0
  1033. package/src/compare/text-atoms.ts +96 -0
  1034. package/src/compare/text.ts +121 -0
  1035. package/src/compare/tree-atoms.ts +80 -0
  1036. package/src/compare/written-names.ts +26 -0
  1037. package/src/config/load.ts +30 -0
  1038. package/src/config/option-problems.ts +72 -0
  1039. package/src/config/read.ts +8 -0
  1040. package/src/config/rule-problems.ts +12 -2
  1041. package/src/config/style.ts +55 -0
  1042. package/src/config/warnings.ts +13 -0
  1043. package/src/config/write.ts +18 -4
  1044. package/src/custom/bounded-match.ts +58 -0
  1045. package/src/custom/load.ts +23 -0
  1046. package/src/custom/module-path.ts +23 -0
  1047. package/src/custom/parse.ts +323 -0
  1048. package/src/custom/problems.ts +111 -0
  1049. package/src/custom/regex-safety.ts +118 -0
  1050. package/src/custom/token-pattern.ts +84 -0
  1051. package/src/detect-language.ts +1 -1
  1052. package/src/detect.ts +35 -2
  1053. package/src/detectors/acronym-context.ts +16 -4
  1054. package/src/detectors/ai-phrasing.ts +141 -0
  1055. package/src/detectors/announced-count.ts +25 -0
  1056. package/src/detectors/bold-label.ts +55 -0
  1057. package/src/detectors/broken-link.ts +90 -0
  1058. package/src/detectors/cited-name.ts +6 -5
  1059. package/src/detectors/cited-title.ts +96 -0
  1060. package/src/detectors/concrete-evidence.ts +3 -2
  1061. package/src/detectors/contrast-frame.ts +54 -0
  1062. package/src/detectors/custom.ts +89 -0
  1063. package/src/detectors/dangling-figure.ts +26 -0
  1064. package/src/detectors/definition-use.ts +41 -0
  1065. package/src/detectors/doubled-punctuation.ts +52 -0
  1066. package/src/detectors/doubled-word.ts +19 -4
  1067. package/src/detectors/duplicate-heading.ts +47 -0
  1068. package/src/detectors/empty-section.ts +21 -0
  1069. package/src/detectors/enumerated-runs.ts +13 -4
  1070. package/src/detectors/fullwidth-alnum.ts +118 -0
  1071. package/src/detectors/gram-furniture.ts +30 -0
  1072. package/src/detectors/gram-place.ts +9 -5
  1073. package/src/detectors/gram-windows.ts +31 -0
  1074. package/src/detectors/hankaku-kana.ts +38 -0
  1075. package/src/detectors/heading-case.ts +30 -2
  1076. package/src/detectors/heading-code-words.ts +35 -0
  1077. package/src/detectors/heading-echo.ts +8 -4
  1078. package/src/detectors/heading-level-skip.ts +19 -0
  1079. package/src/detectors/image-alt-text.ts +11 -0
  1080. package/src/detectors/index.ts +79 -1
  1081. package/src/detectors/invisible-character.ts +190 -0
  1082. package/src/detectors/kutoten-consistency.ts +96 -0
  1083. package/src/detectors/lead-in.ts +3 -1
  1084. package/src/detectors/lexicon-match.ts +41 -2
  1085. package/src/detectors/lexicon.ts +40 -13
  1086. package/src/detectors/list-item.ts +122 -0
  1087. package/src/detectors/list-items.ts +163 -0
  1088. package/src/detectors/list-lead-in.ts +33 -0
  1089. package/src/detectors/list-sentence.ts +198 -0
  1090. package/src/detectors/list-view.ts +157 -0
  1091. package/src/detectors/long-vowel.ts +82 -0
  1092. package/src/detectors/markup-finding.ts +39 -0
  1093. package/src/detectors/modal-conflict.ts +26 -0
  1094. package/src/detectors/name-numeral.ts +4 -2
  1095. package/src/detectors/name-variant.ts +15 -0
  1096. package/src/detectors/nominalization.ts +73 -0
  1097. package/src/detectors/orthography.ts +97 -41
  1098. package/src/detectors/outside-announced-list.ts +25 -0
  1099. package/src/detectors/oxford-comma.ts +179 -283
  1100. package/src/detectors/phrase-match.ts +27 -7
  1101. package/src/detectors/place-run.ts +7 -4
  1102. package/src/detectors/placeholder-text.ts +27 -0
  1103. package/src/detectors/quote-around.ts +9 -0
  1104. package/src/detectors/ra-nuki.ts +38 -0
  1105. package/src/detectors/register.ts +37 -10
  1106. package/src/detectors/requirement-modal.ts +67 -0
  1107. package/src/detectors/requirement-smell.ts +52 -0
  1108. package/src/detectors/roman-numeral.ts +3 -0
  1109. package/src/detectors/sentence-ending.ts +14 -7
  1110. package/src/detectors/sentence-length.ts +16 -5
  1111. package/src/detectors/signals.ts +80 -46
  1112. package/src/detectors/space-before-punctuation.ts +32 -0
  1113. package/src/detectors/spelling-variety.ts +81 -0
  1114. package/src/detectors/structure-tree.ts +47 -1
  1115. package/src/detectors/structure.ts +20 -7
  1116. package/src/detectors/superlative-comparison.ts +47 -0
  1117. package/src/detectors/superlative-name.ts +7 -4
  1118. package/src/detectors/superlative-scope.ts +8 -3
  1119. package/src/detectors/token-column.ts +149 -0
  1120. package/src/detectors/unbalanced-bracket.ts +153 -0
  1121. package/src/detectors/url-run-on.ts +33 -0
  1122. package/src/detectors/vague-figure-pointer.ts +58 -0
  1123. package/src/detectors/word-list.ts +6 -1
  1124. package/src/document-sections.ts +46 -0
  1125. package/src/document.ts +188 -173
  1126. package/src/email-parts.ts +269 -0
  1127. package/src/eval.ts +14 -4
  1128. package/src/extension/document-view.ts +109 -0
  1129. package/src/extension/failure-text.ts +46 -0
  1130. package/src/extension/import-default.ts +13 -0
  1131. package/src/extension/load.ts +97 -0
  1132. package/src/extension/module-detector.ts +61 -0
  1133. package/src/extension/plugin-load.ts +82 -0
  1134. package/src/extension/plugin-name.ts +26 -0
  1135. package/src/extension/plugin-parse.ts +229 -0
  1136. package/src/extension/problem-text.ts +103 -0
  1137. package/src/extension/real-path.ts +10 -0
  1138. package/src/extension/returned-findings.ts +62 -0
  1139. package/src/extension/rule-export.ts +23 -0
  1140. package/src/feedback/draft.ts +6 -0
  1141. package/src/figure-references.ts +173 -0
  1142. package/src/files.ts +5 -0
  1143. package/src/finding-order.ts +3 -0
  1144. package/src/fix-plan/mode.ts +34 -0
  1145. package/src/fix-plan/plan.ts +181 -0
  1146. package/src/fix-plan/render.ts +128 -0
  1147. package/src/fix-plan/text.ts +133 -0
  1148. package/src/heading-label.ts +55 -0
  1149. package/src/in-page-nav.ts +48 -19
  1150. package/src/joined-view.ts +1 -0
  1151. package/src/language-sample.ts +48 -0
  1152. package/src/levels.ts +14 -1
  1153. package/src/line-paragraphs.ts +52 -9
  1154. package/src/link-line.ts +13 -0
  1155. package/src/long-vowel.ts +109 -0
  1156. package/src/markdown-node.ts +19 -0
  1157. package/src/markdown-read.ts +44 -0
  1158. package/src/markup.ts +212 -0
  1159. package/src/mask.ts +8 -8
  1160. package/src/name-variants.ts +217 -0
  1161. package/src/node-version.ts +22 -0
  1162. package/src/not-run.ts +16 -0
  1163. package/src/number-name.ts +151 -24
  1164. package/src/orthography.ts +50 -14
  1165. package/src/outline/render.ts +85 -0
  1166. package/src/outline/shape.ts +72 -0
  1167. package/src/outline/text.ts +50 -0
  1168. package/src/page-furniture.ts +11 -2
  1169. package/src/plain-source.ts +2 -1
  1170. package/src/plugin.ts +120 -3
  1171. package/src/profile/for-file.ts +3 -1
  1172. package/src/quoted-span.ts +9 -3
  1173. package/src/reasons.ts +12 -0
  1174. package/src/reference-lists.ts +91 -0
  1175. package/src/render/compact.ts +13 -3
  1176. package/src/render/explain.ts +75 -14
  1177. package/src/render/friendly.ts +20 -9
  1178. package/src/render/options.ts +58 -0
  1179. package/src/render/rules-json.ts +140 -18
  1180. package/src/render/rules-table.ts +91 -0
  1181. package/src/render/sarif.ts +4 -4
  1182. package/src/render/semantic.ts +3 -3
  1183. package/src/render/severity-name.ts +10 -0
  1184. package/src/render/suppressions.ts +30 -2
  1185. package/src/render/text.ts +21 -7
  1186. package/src/resolve-genre.ts +4 -1
  1187. package/src/rule-genres.ts +25 -0
  1188. package/src/rule-guide.ts +173 -0
  1189. package/src/rule-load.ts +91 -34
  1190. package/src/rule-options.ts +131 -0
  1191. package/src/run-semantic.ts +2 -1
  1192. package/src/run.ts +105 -22
  1193. package/src/sentence-shape.ts +4 -5
  1194. package/src/setting-problems.ts +9 -1
  1195. package/src/spacing-minority.ts +27 -0
  1196. package/src/span-cut.ts +28 -0
  1197. package/src/stet-block.ts +60 -0
  1198. package/src/stet.ts +41 -15
  1199. package/src/structure/aside-depth.ts +67 -0
  1200. package/src/structure/build.ts +38 -19
  1201. package/src/structure/closed-pairs.ts +20 -0
  1202. package/src/structure/date-range.ts +117 -0
  1203. package/src/structure/definition-use.ts +130 -0
  1204. package/src/structure/known-mentions.ts +96 -0
  1205. package/src/structure/lazy-tree.ts +15 -0
  1206. package/src/structure/modal-conflict.ts +86 -0
  1207. package/src/structure/numbered-clauses.ts +11 -0
  1208. package/src/structure/numbering.ts +9 -5
  1209. package/src/structure/of.ts +11 -3
  1210. package/src/structure/percent-sum.ts +135 -0
  1211. package/src/structure/quoted-number.ts +36 -0
  1212. package/src/structure/relative-find.ts +34 -47
  1213. package/src/structure/relative-resolve.ts +77 -30
  1214. package/src/structure/runs.ts +2 -2
  1215. package/src/structure/sexp.ts +17 -5
  1216. package/src/structure/total.ts +2 -2
  1217. package/src/structure/universal.ts +33 -5
  1218. package/src/structure/wrapped-tail.ts +38 -13
  1219. package/src/style-load.ts +28 -0
  1220. package/src/style-parse.ts +112 -0
  1221. package/src/subheading-line.ts +106 -0
  1222. package/src/tag-coverage.ts +13 -0
  1223. package/src/template-syntax.ts +164 -0
  1224. package/src/text-above.ts +49 -0
  1225. package/src/text-figures.ts +147 -0
  1226. package/src/trailing-aside.ts +50 -0
  1227. package/src/tree-walk.ts +48 -0
  1228. package/styles/bunkacho.yaml +25 -0
  1229. package/styles/ieice.yaml +30 -0
  1230. package/styles/jis-z8301-2011.yaml +28 -0
  1231. package/styles/jis-z8301-2019.yaml +31 -0
  1232. package/styles/koyobun.yaml +35 -0
  1233. package/dist/legal-address.d.ts +0 -2
  1234. package/dist/legal-address.d.ts.map +0 -1
  1235. package/dist/legal-address.js +0 -16
  1236. package/dist/legal-address.js.map +0 -1
@@ -1,22 +1,47 @@
1
1
  import type { Mention } from "../plugin.ts";
2
2
 
3
3
  /**
4
- * 参照を読む行と、その後ろにつないだ次の行。
4
+ * 参照を読む行と、その前後につないだ行。
5
5
  *
6
- * 72 桁で折り返す RFC は「Section 16.3.2\n of [HTTP]」のように、参照と「どの文書の」を別の行に書く。行だけを読むと
7
- * 自分の文書の 16.3.2 に見える。改行と字下げは読み手には空白一つなので、そうつないだ文字列を言語の読み手に渡す。
8
- * 拾った参照は行の中にあるものだけを残す。次の行の参照は、次の行を読むときに拾う。位置は行の上のまま。
6
+ * 72 桁で折り返す RFC は「Section 16.3.2\n of [HTTP]」「RFC 7657\n (Sections 5.1 …)」のように、参照と「どの文書の」を別の行に書く。
7
+ * 行だけを読むと自分の文書の 16.3.2 に見える。改行と字下げは読み手には空白一つなので、そうつないだ文字列を言語の読み手に渡す。
8
+ * 拾った参照は行の中にあるものだけを残す。前後の行の参照は、その行を読むときに拾う。位置は行の上のまま。
9
+ * leadLength は text の先頭につないだ前の行の長さ(つなぎの空白を含む)。前の行をつながなければ無い。
9
10
  */
10
- export type WrappedLine = { readonly line: string; readonly text: string; readonly lineLength: number };
11
+ export type WrappedLine = { readonly line: string; readonly text: string; readonly lineLength: number; readonly leadLength?: number };
11
12
 
12
- /** 見出しは次の行へ続かない。見出しの行か、次の行が無い・空なら、行だけ。 */
13
- export const wrappedLine = (text: string, onHeading: boolean, next: string | undefined): WrappedLine => {
13
+ /**
14
+ * 前の行は末尾のこれだけを読む。文書の名前(「35 CFR」「RFC 7657」)は数語なので足りる。長く読むと前の行の参照
15
+ * (「Article 58 of the UK GDPR (powers),」)まで入り、その文書が次の行の括弧の中の参照に移る。
16
+ */
17
+ export const LEAD_REACH = 24;
18
+
19
+ /** 前の行の末尾。長ければ LEAD_REACH の内側の最初の空白から後ろにして、語の途中から始めない。空白が無ければ読まない。 */
20
+ const leadOf = (previous: string | undefined): string => {
21
+ const trimmed = previous?.trim() ?? "";
22
+ if (trimmed.length <= LEAD_REACH) return trimmed;
23
+ const end = trimmed.slice(-LEAD_REACH);
24
+ const space = end.search(/\s/u);
25
+ return space === -1 ? "" : end.slice(space).trimStart();
26
+ };
27
+
28
+ /** 見出しは前後の行へ続かない。見出しの行か、前後の行が無い・空なら、その側はつながない。 */
29
+ export const wrappedLine = (text: string, onHeading: boolean, next: string | undefined, previous?: string): WrappedLine => {
14
30
  const tail = onHeading ? "" : (next?.trim() ?? "");
15
- if (tail === "") return { line: text, text, lineLength: text.length };
16
- const kept = text.trimEnd();
17
- return { line: text, text: `${kept} ${tail}`, lineLength: kept.length };
31
+ const lead = onHeading ? "" : leadOf(previous);
32
+ const kept = tail === "" ? text : text.trimEnd();
33
+ const joined = tail === "" ? text : `${kept} ${tail}`;
34
+ if (lead === "") return { line: text, text: joined, lineLength: kept.length };
35
+ // 全角どうしでも空白でつなぐ。詰めると、前の行の宛名(「…担当課」)が次の行の法令名(「構造改革特別区域法」)に付く。
36
+ const joint = `${lead} `;
37
+ return { line: text, text: `${joint}${joined}`, lineLength: kept.length, leadLength: joint.length };
18
38
  };
19
39
 
20
- /** 行の中で終わる参照だけ。つないだ次の行に入り込んだもの(「Sections 1,\n 2」の 2)は捨てる。 */
21
- export const onLine = (mentions: readonly Mention[], wrapped: WrappedLine): readonly Mention[] =>
22
- mentions.filter((mention) => mention.end <= wrapped.lineLength);
40
+ /** 行の中で始まり、行の中で終わる参照だけを、行の上の位置で。つないだ前後の行に入り込んだもの(「Sections 1,\n 2」の 2)は捨てる。 */
41
+ export const onLine = (mentions: readonly Mention[], wrapped: WrappedLine): readonly Mention[] => {
42
+ const lead = wrapped.leadLength ?? 0;
43
+ if (lead === 0) return mentions.filter((mention) => mention.end <= wrapped.lineLength);
44
+ return mentions
45
+ .filter((mention) => mention.start >= lead && mention.end <= lead + wrapped.lineLength)
46
+ .map((mention) => ({ ...mention, start: mention.start - lead, end: mention.end - lead }));
47
+ };
@@ -0,0 +1,28 @@
1
+ import { readFileSync, readdirSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { parse } from "yaml";
5
+ import { parseStyle, type StyleDefinition } from "./style-parse.ts";
6
+
7
+ const STYLES_DIR = join(dirname(fileURLToPath(import.meta.url)), "..", "styles");
8
+
9
+ const loaded: { value: readonly StyleDefinition[] | undefined } = { value: undefined };
10
+
11
+ const readStyle = (dir: string, file: string): StyleDefinition => {
12
+ try {
13
+ return parseStyle(parse(readFileSync(join(dir, file), "utf8")), file);
14
+ } catch (error) {
15
+ throw new Error(`cannot read ${join(dir, file)}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
16
+ }
17
+ };
18
+
19
+ /** The bundled house styles (styles/*.yaml), by file name. Read once. */
20
+ export const loadStyles = (dir: string = STYLES_DIR): readonly StyleDefinition[] => {
21
+ if (dir === STYLES_DIR && loaded.value !== undefined) return loaded.value;
22
+ const styles = readdirSync(dir)
23
+ .filter((file) => file.endsWith(".yaml"))
24
+ .toSorted((left, right) => left.localeCompare(right, "en"))
25
+ .map((file) => readStyle(dir, file));
26
+ if (dir === STYLES_DIR) loaded.value = styles;
27
+ return styles;
28
+ };
@@ -0,0 +1,112 @@
1
+ import { isLevel } from "./levels.ts";
2
+ import type { Level, Localized } from "./plugin.ts";
3
+
4
+ // A house style (styles/*.yaml): a well-known guideline a team picks with style: in chaff.yaml. It sets rule levels and
5
+ // options, and says where they come from. Pure: the YAML comes in already parsed.
6
+
7
+ export type StyleSource = { readonly title: Localized; readonly url: string };
8
+
9
+ /** { rule id: { language: limit } }. A guideline gives a number for one language (60 characters for Japanese) and none for another. */
10
+ export type StyleLimits = Readonly<Record<string, Readonly<Record<string, number>>>>;
11
+
12
+ export type StyleDefinition = {
13
+ readonly id: string;
14
+ readonly name: Localized;
15
+ /** What the style decides, in one or two plain sentences. */
16
+ readonly summary: Localized;
17
+ /** The guideline the style follows, so a reader can check it. */
18
+ readonly source: StyleSource;
19
+ readonly rules: Readonly<Record<string, Level>>;
20
+ /** { rule id: { option: value } }, checked against the rules' declared options by the tests. */
21
+ readonly options: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
22
+ /** The numbers the guideline sets, by language. The rule needs a level under rules too, or the limit decides nothing. */
23
+ readonly limits: StyleLimits;
24
+ };
25
+
26
+ const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null && !Array.isArray(value);
27
+
28
+ const isLocalized = (value: unknown): value is Localized =>
29
+ isRecord(value) && typeof value["ja"] === "string" && typeof value["en"] === "string" && value["ja"] !== "" && value["en"] !== "";
30
+
31
+ const localizedOf = (value: unknown, field: string, where: string): Localized => {
32
+ if (!isLocalized(value)) throw new Error(`${where}: ${field} needs a ja and an en text`);
33
+ return value;
34
+ };
35
+
36
+ const sourceOf = (value: unknown, where: string): StyleSource => {
37
+ if (!isRecord(value)) throw new Error(`${where}: source needs a title and a url`);
38
+ const url = value["url"];
39
+ if (typeof url !== "string" || !url.startsWith("https://")) throw new Error(`${where}: source.url must be an https:// address`);
40
+ return { title: localizedOf(value["title"], "source.title", where), url };
41
+ };
42
+
43
+ const levelsOf = (value: unknown, where: string): Record<string, Level> => {
44
+ if (value === undefined) return {};
45
+ if (!isRecord(value)) throw new Error(`${where}: rules must be a map of rule ids to levels`);
46
+ return Object.fromEntries(
47
+ Object.entries(value).map(([id, level]) => {
48
+ if (!isLevel(level)) throw new Error(`${where}: ${id} has the level ${String(level)}; use strict, normal, relaxed or off`);
49
+ return [id, level];
50
+ }),
51
+ );
52
+ };
53
+
54
+ const optionsOf = (value: unknown, where: string): Record<string, Readonly<Record<string, unknown>>> => {
55
+ if (value === undefined) return {};
56
+ if (!isRecord(value)) throw new Error(`${where}: options must be a map of rule ids`);
57
+ return Object.fromEntries(
58
+ Object.entries(value).map(([id, options]) => {
59
+ if (!isRecord(options)) throw new Error(`${where}: options.${id} must be a map of option names to values`);
60
+ return [id, options];
61
+ }),
62
+ );
63
+ };
64
+
65
+ const isLimit = (value: unknown): value is number => typeof value === "number" && Number.isFinite(value) && value > 0;
66
+
67
+ const languageLimitsOf = (id: string, value: unknown, where: string): Record<string, number> => {
68
+ if (!isRecord(value) || Object.keys(value).length === 0) throw new Error(`${where}: limits.${id} must be a map of languages to numbers`);
69
+ return Object.fromEntries(
70
+ Object.entries(value).map(([language, limit]) => {
71
+ if (!isLimit(limit)) throw new Error(`${where}: limits.${id}.${language} must be a number above 0`);
72
+ return [language, limit];
73
+ }),
74
+ );
75
+ };
76
+
77
+ const limitsOf = (value: unknown, rules: Readonly<Record<string, Level>>, where: string): Record<string, Record<string, number>> => {
78
+ if (value === undefined) return {};
79
+ if (!isRecord(value)) throw new Error(`${where}: limits must be a map of rule ids`);
80
+ return Object.fromEntries(
81
+ Object.entries(value).map(([id, byLanguage]) => {
82
+ if (rules[id] === undefined || rules[id] === "off") throw new Error(`${where}: limits.${id} needs ${id} under rules at a level that runs`);
83
+ return [id, languageLimitsOf(id, byLanguage, where)];
84
+ }),
85
+ );
86
+ };
87
+
88
+ /** One style file. Throws on anything it cannot read: the file ships with chaff, so a wrong entry is chaff's bug. */
89
+ export const parseStyle = (raw: unknown, file: string): StyleDefinition => {
90
+ const id = isRecord(raw) ? raw["id"] : undefined;
91
+ if (isRecord(raw) && (typeof id !== "string" || `${id}.yaml` !== file)) throw new Error(`${file}: id must be the file's name without .yaml`);
92
+ return styleOf(raw, file);
93
+ };
94
+
95
+ /** One style, wherever it was written (where names it in what is thrown). Throws on anything it cannot read. */
96
+ export const styleOf = (raw: unknown, where: string): StyleDefinition => {
97
+ if (!isRecord(raw)) throw new Error(`${where}: a style must be a map`);
98
+ const id = raw["id"];
99
+ if (typeof id !== "string" || id === "") throw new Error(`${where}: a style needs an id`);
100
+ const rules = levelsOf(raw["rules"], where);
101
+ const options = optionsOf(raw["options"], where);
102
+ if (Object.keys(rules).length === 0 && Object.keys(options).length === 0) throw new Error(`${where}: a style must set rules or options`);
103
+ return {
104
+ id,
105
+ name: localizedOf(raw["name"], "name", where),
106
+ summary: localizedOf(raw["summary"], "summary", where),
107
+ source: sourceOf(raw["source"], where),
108
+ rules,
109
+ options,
110
+ limits: limitsOf(raw["limits"], rules, where),
111
+ };
112
+ };
@@ -0,0 +1,106 @@
1
+ import type { Span } from "./plugin.ts";
2
+
3
+ /**
4
+ * 括弧でくくった短い句だけの行(「(経済再生)」「(目的)」)は、段落の中の小見出し。
5
+ * 改行だけで次の文へ続けて書かれると、分割器は次の文の頭に読み込み、その文の指摘が小見出しの行に出る。
6
+ * 小見出しは文を閉じないが、次の文へは続かないので、その行の後ろで段落を切って別々に分割する。
7
+ *
8
+ * かぎ括弧(「」『』)は引用で、後ろの文へ続くことがある(「…ますから」\n自分は…)ので含めない。
9
+ * 前の行が文の途中で終わるなら、括弧の行は文の中の挿入(折り返した文)なので切らない。
10
+ */
11
+ const PAIRS: ReadonlyMap<string, string> = new Map([
12
+ ["(", ")"],
13
+ ["(", ")"],
14
+ ["【", "】"],
15
+ ["〔", "〕"],
16
+ ["[", "]"],
17
+ ["[", "]"],
18
+ ]);
19
+
20
+ /** 小見出しとして読む括弧の中身の字数の上限。これより長い括弧の行は、括弧でくくった注記。 */
21
+ const MAX_SUBHEADING_CHARS = 40;
22
+
23
+ /** 中身の文が終わっている。「(ただし、例外を除く。)」は注記の文で、小見出しではない。 */
24
+ const SENTENCE_END_INSIDE = /(?:[。!?!?])|(?:[..]$)/u;
25
+ /** 行が文で終わっている。句点の後に閉じ括弧・引用符が続いてよい。 */
26
+ const ENDS_SENTENCE = /[。.!?.!?][」』"'”’))\]]】〕]*$/u;
27
+
28
+ /** 行が、次の行を導く印(「関連記事:」)で終わっている。その次の行は前の行の続きではない。 */
29
+ const LEADS_IN = /[::]$/u;
30
+
31
+ const NEWLINE = /\r?\n/gu;
32
+
33
+ export type Line = { readonly start: number; readonly end: number; readonly next: number };
34
+
35
+ const linesOf = (text: string): Line[] => {
36
+ const breaks = [...text.matchAll(NEWLINE)];
37
+ const starts = [0, ...breaks.map((match) => match.index + match[0].length)];
38
+ return starts.map((start, index) => {
39
+ const found = breaks[index];
40
+ return { start, end: found?.index ?? text.length, next: found === undefined ? text.length : found.index + found[0].length };
41
+ });
42
+ };
43
+
44
+ /** 行が、括弧一組とその中の短い句だけか。 */
45
+ export const isSubheadingLine = (line: string): boolean => {
46
+ const trimmed = line.trim();
47
+ const close = PAIRS.get(trimmed[0] ?? "");
48
+ if (close === undefined || !trimmed.endsWith(close)) return false;
49
+ const inner = trimmed.slice(1, -1);
50
+ const chars = [...inner].length;
51
+ return chars > 0 && chars <= MAX_SUBHEADING_CHARS && !inner.includes(close) && !inner.includes(trimmed[0] ?? "") && !SENTENCE_END_INSIDE.test(inner);
52
+ };
53
+
54
+ const hasText = (text: string, line: Line | undefined): boolean => line !== undefined && text.slice(line.start, line.end).trim().length > 0;
55
+
56
+ /** 行の範囲(text の中の位置)。その行だけで一つの項目として立つか。 */
57
+ export type StandsAlone = (start: number, end: number) => boolean;
58
+
59
+ /**
60
+ * 一つで立つ行: 小見出しの行か standsAlone が言う行(リンクだけの行など)で、前の行が無いか、文で終わっているか、
61
+ * 次を導く「:」で終わっているか、それも一つで立つ行。前の行が文の途中で終わるなら、その行は折り返した文の中にある。
62
+ */
63
+ export const standaloneLines = (text: string, standsAlone: StandsAlone = () => false): Line[] => {
64
+ const lines = linesOf(text);
65
+ const alone = (line: Line): boolean => isSubheadingLine(text.slice(line.start, line.end)) || standsAlone(line.start, line.end);
66
+ const startsFresh = (previous: Line | undefined): boolean => {
67
+ if (previous === undefined || alone(previous)) return true;
68
+ const written = text.slice(previous.start, previous.end).trimEnd();
69
+ return ENDS_SENTENCE.test(written) || LEADS_IN.test(written);
70
+ };
71
+ return lines.filter((line, index) => alone(line) && startsFresh(lines[index - 1]));
72
+ };
73
+
74
+ /**
75
+ * lines のうち、段落の終わり(end)まで切れ目なく続く後ろの並び。lines は text の順で、行は次の行の頭(next)で隣の行に続く。
76
+ * 段落の途中の 1 行は本文の文の一つで、終わりまで続く並びだけが本文の後に置いた一覧。
77
+ */
78
+ export const closingRun = (lines: readonly Line[], end: number): readonly Line[] =>
79
+ lines.reduceRight<{ readonly run: readonly Line[]; readonly until: number }>(
80
+ (acc, line) => (line.next === acc.until ? { run: [line, ...acc.run], until: line.start } : acc),
81
+ { run: [], until: end },
82
+ ).run;
83
+
84
+ /** 片の切れ目。前の片は end で終わり、次の片は next から始まる。 */
85
+ type Cut = { readonly end: number; readonly next: number };
86
+
87
+ /**
88
+ * 一つで立つ行(lines[index])の切れ目。後ろに続く行があれば後ろで切る。前の行が「:」で終わる導きなら前でも切る。
89
+ * 文で終わる前の行は文の分割器が切るので、前では切らない。
90
+ */
91
+ const cutsAround = (text: string, lines: readonly Line[], index: number): Cut[] => {
92
+ const [previous, line, following] = [lines[index - 1], lines[index], lines[index + 1]];
93
+ if (line === undefined) return [];
94
+ const leadsIn = previous !== undefined && LEADS_IN.test(text.slice(previous.start, previous.end).trimEnd());
95
+ return [...(leadsIn ? [{ end: previous.end, next: line.start }] : []), ...(hasText(text, following) ? [{ end: line.end, next: line.next }] : [])];
96
+ };
97
+
98
+ /** 段落 text を、一つで立つ行の後ろ(と、導きの行に続くときは前)で切った片。切る所が無ければ text 全体の 1 片。片は改行を含まない端で終わる。 */
99
+ export const subheadingPieces = (text: string, standsAlone: StandsAlone = () => false): Span[] => {
100
+ const lines = linesOf(text);
101
+ const indexOf = new Map(lines.map((line, index) => [line.start, index]));
102
+ const cuts = standaloneLines(text, standsAlone).flatMap((line) => cutsAround(text, lines, indexOf.get(line.start) ?? 0));
103
+ const ordered = [...new Map(cuts.map((cut) => [cut.next, cut])).values()].toSorted((left, right) => left.next - right.next);
104
+ const starts = [0, ...ordered.map((cut) => cut.next)];
105
+ return starts.map((start, index) => ({ start, end: ordered[index]?.end ?? text.length }));
106
+ };
@@ -0,0 +1,13 @@
1
+ import type { Sentence } from "./plugin.ts";
2
+
3
+ /**
4
+ * How many of the sentences came back with tokens. A prepared adapter tags every sentence, so "some" means it could not
5
+ * read part of the document (lang-ja returns no tokens for a paragraph its analyser threw on), and "none" that it tagged nothing.
6
+ */
7
+ export type TagCoverage = "all" | "some" | "none";
8
+
9
+ export const tagCoverage = (sentences: readonly Pick<Sentence, "tokens">[]): TagCoverage => {
10
+ const tagged = sentences.filter((sentence) => sentence.tokens !== undefined).length;
11
+ if (tagged === sentences.length) return "all";
12
+ return tagged === 0 ? "none" : "some";
13
+ };
@@ -0,0 +1,164 @@
1
+ import { spanOf, type MarkdownNode } from "./markdown-node.ts";
2
+ import type { Span } from "./plugin.ts";
3
+
4
+ /** `closer` finds where each `close` starts. */
5
+ type Delimiters = { readonly open: string; readonly close: string; readonly closer: RegExp };
6
+
7
+ /**
8
+ * Template and MDX syntax written into the text: Liquid and Jinja tags (`{% ifversion %}`,
9
+ * `{% data variables.product.github %}`), outputs (`{{ page.title }}`, which also covers Hugo's shortcodes
10
+ * `{{< note >}}` and `{{% alert %}}`) and comments (`{# … #}`), and MDX comments (a block comment in braces).
11
+ */
12
+ const DELIMITERS: readonly Delimiters[] = [
13
+ { open: "{%", close: "%}", closer: /%\}/gu },
14
+ { open: "{{", close: "}}", closer: /\}\}/gu },
15
+ { open: "{#", close: "#}", closer: /#\}/gu },
16
+ { open: "{/*", close: "*/}", closer: /\*\/\}/gu },
17
+ ];
18
+
19
+ const OPENER = /\{(?=[{%#]|\/\*)/gu;
20
+
21
+ // A tag never runs past a blank line: an unclosed `{{` is a character in the text, not a tag that swallows the page.
22
+ const BLANK_LINE = /\n[ \t]*\n/gu;
23
+
24
+ const stretchesOf = (text: string): Span[] => {
25
+ const breaks = [...text.matchAll(BLANK_LINE)];
26
+ const starts = [0, ...breaks.map((blank) => blank.index + blank[0].length)];
27
+ return starts.map((start, index) => ({ start, end: breaks[index]?.index ?? text.length }));
28
+ };
29
+
30
+ /** The first of the sorted `positions` at or after `from`. */
31
+ const firstAtOrAfter = (positions: readonly number[], from: number, low = 0, high = positions.length): number | undefined => {
32
+ if (low >= high) return positions[low];
33
+ const middle = (low + high) >> 1;
34
+ return (positions[middle] ?? from) >= from ? firstAtOrAfter(positions, from, low, middle) : firstAtOrAfter(positions, from, middle + 1, high);
35
+ };
36
+
37
+ /**
38
+ * The tags in one stretch, left to right: each opener closes at the first closer after it, and an opener inside a tag
39
+ * opens nothing. Each opener looks its closer up instead of scanning for it, so a line of unclosed openers is linear.
40
+ */
41
+ const tagsIn = (stretch: string): Span[] => {
42
+ const closers = DELIMITERS.map(({ closer }) => [...stretch.matchAll(closer)].map((match) => match.index));
43
+ return [...stretch.matchAll(OPENER)].reduce<Span[]>((tags, { index }) => {
44
+ if (index < (tags.at(-1)?.end ?? 0)) return tags;
45
+ const kind = DELIMITERS.findIndex(({ open }) => stretch.startsWith(open, index));
46
+ const delimiters = DELIMITERS[kind];
47
+ const close = delimiters === undefined ? undefined : firstAtOrAfter(closers[kind] ?? [], index + delimiters.open.length);
48
+ if (delimiters !== undefined && close !== undefined) tags.push({ start: index, end: close + delimiters.close.length });
49
+ return tags;
50
+ }, []);
51
+ };
52
+
53
+ /** Where the template syntax stands. Read `code` with code already blanked, so a `{{` inside backticks opens nothing. */
54
+ export const templateSpans = (code: string): Span[] =>
55
+ stretchesOf(code).flatMap((stretch) =>
56
+ tagsIn(code.slice(stretch.start, stretch.end)).map((tag) => ({ start: stretch.start + tag.start, end: stretch.start + tag.end })),
57
+ );
58
+
59
+ /** A line that starts with a JSX element's tag (`<Tabs>`, `</Tabs>`). HTML's tags are lower case and stay HTML. */
60
+ const COMPONENT_START = /^[ \t]*<\/?[A-Z][^\n]*$/gmu;
61
+
62
+ const QUOTED = /"[^"\n]*"|'[^'\n]*'/gu;
63
+
64
+ /** Tags and nothing else, once quoted values are emptied and expressions taken out: `<TabItem value= label=>`. */
65
+ const TAGS_ONLY = /^[ \t]*(?:<\/?[A-Za-z][\w.:-]*(?:[ \t][^<>{}]*)?>[ \t]*)+$/u;
66
+
67
+ /** The line without its brace expressions, however deeply they nest; undefined when its braces do not balance. */
68
+ const withoutExpressions = (line: string): string | undefined => {
69
+ const kept: string[] = [];
70
+ const depth = [...line.replace(QUOTED, '""')].reduce((level, char) => {
71
+ if (level < 0) return level;
72
+ if (char === "{") return level + 1;
73
+ if (char === "}") return level - 1;
74
+ if (level === 0) kept.push(char);
75
+ return level;
76
+ }, 0);
77
+ return depth === 0 ? kept.join("") : undefined;
78
+ };
79
+
80
+ const isComponentLine = (line: string): boolean => {
81
+ const bare = withoutExpressions(line);
82
+ return bare !== undefined && TAGS_ONLY.test(bare);
83
+ };
84
+
85
+ /**
86
+ * Lines of nothing but JSX tags. MDX reads such a line as a block of its own, so the text on the next line is a
87
+ * paragraph; CommonMark reads it as the start of an HTML block that runs to the next blank line and hides that text.
88
+ */
89
+ export const componentLines = (source: string): Span[] =>
90
+ [...source.matchAll(COMPONENT_START)]
91
+ .filter((match) => isComponentLine(match[0]))
92
+ .map((match) => ({ start: match.index, end: match.index + match[0].length }));
93
+
94
+ const IMPORT_START = /^import(?:\s|\{)/u;
95
+ // The module's name in quotes ends the statement: "import data from 'CSV' before review." goes on, so it is prose.
96
+ const IMPORT_FROM = /(?:[\s}*]from\s*|^import\s*)["'][^"'\n]*["'];?[ \t]*(?:\n|$)/u;
97
+
98
+ /** JavaScript's shapes of `export`, read on the first line, so that "export default reports from…" stays a sentence. */
99
+ const EXPORT_SHAPES: readonly RegExp[] = [
100
+ /^export\s+(?:async\s+)?function\b/u,
101
+ /^export\s+class\s+[\w$]/u,
102
+ /^export\s+(?:const|let|var)\s+[\w${[][^=]*=/u,
103
+ /^export\s+default\s+(?:async\s+)?(?:function|class)\b/u,
104
+ /^export\s+default\s*[{(["'`<]/u,
105
+ /^export\s+default\s+[\w$.]+\s*\(/u,
106
+ /^export\s+default\s+[\w$]+(?:\.[\w$]+)*;?\s*$/u,
107
+ /^export\s*[{*]/u,
108
+ ];
109
+
110
+ const isExport = (paragraph: string): boolean => {
111
+ const firstLine = paragraph.split("\n", 1)[0] ?? "";
112
+ return EXPORT_SHAPES.some((shape) => shape.test(firstLine));
113
+ };
114
+
115
+ /** A paragraph that is MDX's `import`/`export` block: JavaScript, which MDX runs to the next blank line. */
116
+ const isModuleBlock = (paragraph: string): boolean => (IMPORT_START.test(paragraph) && IMPORT_FROM.test(paragraph)) || isExport(paragraph);
117
+
118
+ /** MDX's `import`/`export` lines: JavaScript, and only at the top level of the page. */
119
+ export const moduleBlocks = (root: MarkdownNode, source: string): Span[] =>
120
+ (root.children ?? []).flatMap((node) => {
121
+ const span = node.type === "paragraph" ? spanOf(node) : undefined;
122
+ return span !== undefined && isModuleBlock(source.slice(span.start, span.end)) ? [span] : [];
123
+ });
124
+
125
+ /** `[!NOTE]` and the like opening a quote: a GitHub alert (Obsidian's callouts write the same). */
126
+ const alertMarkerAt = (source: string, start: number): Span | undefined => {
127
+ const marker = /\[![A-Za-z]+\][^\n]*/uy;
128
+ marker.lastIndex = start;
129
+ return marker.test(source) ? { start, end: marker.lastIndex } : undefined;
130
+ };
131
+
132
+ const QUOTE_MARK = /^[ \t]*>[ \t]?/gmu;
133
+
134
+ /** The `>` that opens each line of a quote spanning `quote`: the quote's own mark, not its text. */
135
+ const quoteMarks = (source: string, quote: Span): Span[] =>
136
+ [...source.slice(quote.start, quote.end).matchAll(QUOTE_MARK)].map((match) => ({
137
+ start: quote.start + match.index,
138
+ end: quote.start + match.index + match[0].length,
139
+ }));
140
+
141
+ /**
142
+ * A GitHub alert (`> [!NOTE]`) is the writer's own text set in a box, not a quote: only its marker line and the `>` of
143
+ * each line are not prose. Undefined when the quote is not an alert.
144
+ */
145
+ const alertMarks = (quote: MarkdownNode, whole: Span, source: string): Span[] | undefined => {
146
+ const first = quote.children?.[0];
147
+ const start = first?.type === "paragraph" ? spanOf(first)?.start : undefined;
148
+ const marker = start === undefined ? undefined : alertMarkerAt(source, start);
149
+ return marker === undefined ? undefined : [marker, ...quoteMarks(source, whole)];
150
+ };
151
+
152
+ /**
153
+ * Reads the alerts of one walk over the tree in pre-order: the marks of each alert, undefined for any other node. A
154
+ * quote inside a quote is quoted, even one that opens like an alert; pre-order meets the outer quote first.
155
+ */
156
+ export const alertReader = (source: string): ((node: MarkdownNode) => Span[] | undefined) => {
157
+ const outer = { end: -1 };
158
+ return (node) => {
159
+ const quote = node.type === "blockquote" ? spanOf(node) : undefined;
160
+ if (quote === undefined || quote.start < outer.end) return undefined;
161
+ outer.end = quote.end;
162
+ return alertMarks(node, quote, source);
163
+ };
164
+ };
@@ -0,0 +1,49 @@
1
+ /**
2
+ * 箇条書きや表のすぐ上に書いた文の塊。予告の文(以下の3点)や、割合の表の説明(売上の構成比)を読む rule が使う。
3
+ * 文書の頭まで読み返さないので、箇条書きや表の多い長い文書でも行数に比例する。
4
+ */
5
+ export type TextBlock = { readonly start: number; readonly text: string };
6
+
7
+ const BLANK = /^[ \t]*$/u;
8
+ const LIST_MARKER = /^[ \t]*(?:[-*+]|\d{1,3}[.)])[ \t]/u;
9
+
10
+ export const isBlank = (text: string): boolean => BLANK.test(text);
11
+
12
+ /** 位置 end の改行で終わる行。 */
13
+ const lineEndingAt = (source: string, end: number): TextBlock => {
14
+ const start = end === 0 ? 0 : source.lastIndexOf("\n", end - 1) + 1;
15
+ return { start, text: source.slice(start, end) };
16
+ };
17
+
18
+ /** start の行の一つ上の行。文書の最初の行なら undefined。 */
19
+ export const lineAbove = (source: string, start: number): TextBlock | undefined => {
20
+ if (start === 0) return undefined;
21
+ const end = source.lastIndexOf("\n", start - 1);
22
+ return end < 0 ? undefined : lineEndingAt(source, end);
23
+ };
24
+
25
+ /**
26
+ * start の行より上の塊を、下の行から上へ。passed に当たる行(表の見出しの行など)と空行は、塊に着くまで飛ばす。
27
+ * 塊は次の空行まで。箇条書きの印で始まる行(親の項目)はそこで止める。下の行から順に返す。
28
+ */
29
+ export const linesAbove = (source: string, start: number, passed: (text: string) => boolean = () => false): TextBlock[] => {
30
+ const block: TextBlock[] = [];
31
+ let line = lineAbove(source, start);
32
+ while (line !== undefined) {
33
+ if (isBlank(line.text) || (block.length === 0 && passed(line.text))) {
34
+ if (block.length > 0) break;
35
+ } else {
36
+ block.push(line);
37
+ if (LIST_MARKER.test(line.text)) break;
38
+ }
39
+ line = lineAbove(source, line.start);
40
+ }
41
+ return block;
42
+ };
43
+
44
+ /** 下の行から並べた塊を、一続きの文字列にする。 */
45
+ export const joined = (source: string, lines: readonly TextBlock[]): TextBlock | undefined => {
46
+ const top = lines.at(-1);
47
+ const bottom = lines[0];
48
+ return top === undefined || bottom === undefined ? undefined : { start: top.start, text: source.slice(top.start, bottom.start + bottom.text.length) };
49
+ };