@redocly/recheck 0.1.0 → 0.3.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 (595) hide show
  1. package/README.md +1023 -56
  2. package/dist/cli.js +40 -7
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/markdoc-schema.d.ts +17 -0
  5. package/dist/commands/markdoc-schema.d.ts.map +1 -0
  6. package/dist/commands/markdoc-schema.js +127 -0
  7. package/dist/commands/markdoc-schema.js.map +1 -0
  8. package/dist/commands/run.d.ts +2 -1
  9. package/dist/commands/run.d.ts.map +1 -1
  10. package/dist/commands/run.js +87 -10
  11. package/dist/commands/run.js.map +1 -1
  12. package/dist/config/load.d.ts +11 -0
  13. package/dist/config/load.d.ts.map +1 -1
  14. package/dist/config/load.js +12 -2
  15. package/dist/config/load.js.map +1 -1
  16. package/dist/config/presets/google.d.ts +3 -0
  17. package/dist/config/presets/google.d.ts.map +1 -0
  18. package/dist/config/presets/google.js +1671 -0
  19. package/dist/config/presets/google.js.map +1 -0
  20. package/dist/config/presets/inclusive-language.d.ts +3 -0
  21. package/dist/config/presets/inclusive-language.d.ts.map +1 -0
  22. package/dist/config/presets/inclusive-language.js +321 -0
  23. package/dist/config/presets/inclusive-language.js.map +1 -0
  24. package/dist/config/presets/index.d.ts +67 -0
  25. package/dist/config/presets/index.d.ts.map +1 -0
  26. package/dist/config/presets/index.js +137 -0
  27. package/dist/config/presets/index.js.map +1 -0
  28. package/dist/config/presets/markdoc.d.ts +21 -0
  29. package/dist/config/presets/markdoc.d.ts.map +1 -0
  30. package/dist/config/presets/markdoc.js +101 -0
  31. package/dist/config/presets/markdoc.js.map +1 -0
  32. package/dist/config/presets/markdown-relaxed.d.ts +3 -0
  33. package/dist/config/presets/markdown-relaxed.d.ts.map +1 -0
  34. package/dist/config/presets/markdown-relaxed.js +98 -0
  35. package/dist/config/presets/markdown-relaxed.js.map +1 -0
  36. package/dist/config/presets/markdown.d.ts +43 -0
  37. package/dist/config/presets/markdown.d.ts.map +1 -0
  38. package/dist/config/presets/markdown.js +132 -0
  39. package/dist/config/presets/markdown.js.map +1 -0
  40. package/dist/config/presets/microsoft.d.ts +3 -0
  41. package/dist/config/presets/microsoft.d.ts.map +1 -0
  42. package/dist/config/presets/microsoft.js +2268 -0
  43. package/dist/config/presets/microsoft.js.map +1 -0
  44. package/dist/config/presets/minimal.d.ts +3 -0
  45. package/dist/config/presets/minimal.d.ts.map +1 -0
  46. package/dist/config/presets/minimal.js +21 -0
  47. package/dist/config/presets/minimal.js.map +1 -0
  48. package/dist/config/presets/plain-language.d.ts +3 -0
  49. package/dist/config/presets/plain-language.d.ts.map +1 -0
  50. package/dist/config/presets/plain-language.js +351 -0
  51. package/dist/config/presets/plain-language.js.map +1 -0
  52. package/dist/config/presets/prose.d.ts +52 -0
  53. package/dist/config/presets/prose.d.ts.map +1 -0
  54. package/dist/config/presets/prose.js +138 -0
  55. package/dist/config/presets/prose.js.map +1 -0
  56. package/dist/config/schema.d.ts +128 -22
  57. package/dist/config/schema.d.ts.map +1 -1
  58. package/dist/config/schema.js +105 -21
  59. package/dist/config/schema.js.map +1 -1
  60. package/dist/config/validate.d.ts +12 -2
  61. package/dist/config/validate.d.ts.map +1 -1
  62. package/dist/config/validate.js +1200 -44
  63. package/dist/config/validate.js.map +1 -1
  64. package/dist/core/auto-fix.d.ts +8 -13
  65. package/dist/core/auto-fix.d.ts.map +1 -1
  66. package/dist/core/auto-fix.js +94 -75
  67. package/dist/core/auto-fix.js.map +1 -1
  68. package/dist/core/case-preserve.d.ts +46 -0
  69. package/dist/core/case-preserve.d.ts.map +1 -0
  70. package/dist/core/case-preserve.js +57 -0
  71. package/dist/core/case-preserve.js.map +1 -0
  72. package/dist/core/directives.d.ts +9 -0
  73. package/dist/core/directives.d.ts.map +1 -0
  74. package/dist/core/directives.js +73 -0
  75. package/dist/core/directives.js.map +1 -0
  76. package/dist/core/files.d.ts +63 -0
  77. package/dist/core/files.d.ts.map +1 -1
  78. package/dist/core/files.js +185 -0
  79. package/dist/core/files.js.map +1 -1
  80. package/dist/core/inline-code.d.ts +87 -0
  81. package/dist/core/inline-code.d.ts.map +1 -0
  82. package/dist/core/inline-code.js +104 -0
  83. package/dist/core/inline-code.js.map +1 -0
  84. package/dist/core/line-endings.d.ts +32 -0
  85. package/dist/core/line-endings.d.ts.map +1 -0
  86. package/dist/core/line-endings.js +65 -0
  87. package/dist/core/line-endings.js.map +1 -0
  88. package/dist/core/markdoc-tags.d.ts +79 -0
  89. package/dist/core/markdoc-tags.d.ts.map +1 -0
  90. package/dist/core/markdoc-tags.js +131 -0
  91. package/dist/core/markdoc-tags.js.map +1 -0
  92. package/dist/core/rule-filters.d.ts +17 -0
  93. package/dist/core/rule-filters.d.ts.map +1 -1
  94. package/dist/core/rule-filters.js +64 -0
  95. package/dist/core/rule-filters.js.map +1 -1
  96. package/dist/core/runner.d.ts +92 -3
  97. package/dist/core/runner.d.ts.map +1 -1
  98. package/dist/core/runner.js +348 -110
  99. package/dist/core/runner.js.map +1 -1
  100. package/dist/core/timing.d.ts.map +1 -1
  101. package/dist/data/markdoc-realm-schema.d.ts +3 -0
  102. package/dist/data/markdoc-realm-schema.d.ts.map +1 -0
  103. package/dist/data/markdoc-realm-schema.js +760 -0
  104. package/dist/data/markdoc-realm-schema.js.map +1 -0
  105. package/dist/data/proper-nouns.d.ts +2 -0
  106. package/dist/data/proper-nouns.d.ts.map +1 -0
  107. package/dist/data/proper-nouns.js +47 -0
  108. package/dist/data/proper-nouns.js.map +1 -0
  109. package/dist/index.d.ts +90 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +152 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/metrics/formulas.d.ts +17 -0
  114. package/dist/metrics/formulas.d.ts.map +1 -0
  115. package/dist/metrics/formulas.js +70 -0
  116. package/dist/metrics/formulas.js.map +1 -0
  117. package/dist/metrics/index.d.ts +5 -0
  118. package/dist/metrics/index.d.ts.map +1 -0
  119. package/dist/metrics/index.js +3 -0
  120. package/dist/metrics/index.js.map +1 -0
  121. package/dist/metrics/statistics.d.ts +27 -0
  122. package/dist/metrics/statistics.d.ts.map +1 -0
  123. package/dist/metrics/statistics.js +56 -0
  124. package/dist/metrics/statistics.js.map +1 -0
  125. package/dist/parser/index.d.ts +18 -0
  126. package/dist/parser/index.d.ts.map +1 -0
  127. package/dist/parser/index.js +168 -0
  128. package/dist/parser/index.js.map +1 -0
  129. package/dist/parser/markdoc/extract-statics.d.ts +45 -0
  130. package/dist/parser/markdoc/extract-statics.d.ts.map +1 -0
  131. package/dist/parser/markdoc/extract-statics.js +139 -0
  132. package/dist/parser/markdoc/extract-statics.js.map +1 -0
  133. package/dist/parser/markdoc/pairing.d.ts +63 -0
  134. package/dist/parser/markdoc/pairing.d.ts.map +1 -0
  135. package/dist/parser/markdoc/pairing.js +94 -0
  136. package/dist/parser/markdoc/pairing.js.map +1 -0
  137. package/dist/parser/markdoc/schema.d.ts +85 -0
  138. package/dist/parser/markdoc/schema.d.ts.map +1 -0
  139. package/dist/parser/markdoc/schema.js +86 -0
  140. package/dist/parser/markdoc/schema.js.map +1 -0
  141. package/dist/parser/markdoc/span.d.ts +64 -0
  142. package/dist/parser/markdoc/span.d.ts.map +1 -0
  143. package/dist/parser/markdoc/span.js +729 -0
  144. package/dist/parser/markdoc/span.js.map +1 -0
  145. package/dist/parser/markdoc/structure.d.ts +28 -0
  146. package/dist/parser/markdoc/structure.d.ts.map +1 -0
  147. package/dist/parser/markdoc/structure.js +153 -0
  148. package/dist/parser/markdoc/structure.js.map +1 -0
  149. package/dist/parser/markdoc/syntax.d.ts +44 -0
  150. package/dist/parser/markdoc/syntax.d.ts.map +1 -0
  151. package/dist/parser/markdoc/syntax.js +317 -0
  152. package/dist/parser/markdoc/syntax.js.map +1 -0
  153. package/dist/parser/types.d.ts +18 -0
  154. package/dist/parser/types.d.ts.map +1 -0
  155. package/dist/parser/types.js.map +1 -0
  156. package/dist/reporter/fixes.d.ts.map +1 -1
  157. package/dist/reporter/fixes.js +22 -1
  158. package/dist/reporter/fixes.js.map +1 -1
  159. package/dist/reporter/statistics.d.ts +1 -8
  160. package/dist/reporter/statistics.d.ts.map +1 -1
  161. package/dist/reporter/statistics.js.map +1 -1
  162. package/dist/rules/registry.d.ts +15 -0
  163. package/dist/rules/registry.d.ts.map +1 -0
  164. package/dist/rules/registry.js +81 -0
  165. package/dist/rules/registry.js.map +1 -0
  166. package/dist/rules/scope/capitalization.d.ts +3 -0
  167. package/dist/rules/scope/capitalization.d.ts.map +1 -0
  168. package/dist/rules/scope/capitalization.js +163 -0
  169. package/dist/rules/scope/capitalization.js.map +1 -0
  170. package/dist/rules/scope/conditional.d.ts +3 -0
  171. package/dist/rules/scope/conditional.d.ts.map +1 -0
  172. package/dist/rules/scope/conditional.js +112 -0
  173. package/dist/rules/scope/conditional.js.map +1 -0
  174. package/dist/rules/scope/consistency.d.ts +3 -0
  175. package/dist/rules/scope/consistency.d.ts.map +1 -0
  176. package/dist/rules/scope/consistency.js +178 -0
  177. package/dist/rules/scope/consistency.js.map +1 -0
  178. package/dist/rules/scope/length.d.ts +3 -0
  179. package/dist/rules/scope/length.d.ts.map +1 -0
  180. package/dist/rules/scope/length.js +69 -0
  181. package/dist/rules/scope/length.js.map +1 -0
  182. package/dist/rules/scope/max-image-size.d.ts +3 -0
  183. package/dist/rules/scope/max-image-size.d.ts.map +1 -0
  184. package/dist/rules/scope/max-image-size.js +65 -0
  185. package/dist/rules/scope/max-image-size.js.map +1 -0
  186. package/dist/rules/scope/metric.d.ts +17 -0
  187. package/dist/rules/scope/metric.d.ts.map +1 -0
  188. package/dist/rules/scope/metric.js +216 -0
  189. package/dist/rules/scope/metric.js.map +1 -0
  190. package/dist/rules/scope/occurrence.d.ts +3 -0
  191. package/dist/rules/scope/occurrence.d.ts.map +1 -0
  192. package/dist/rules/scope/occurrence.js +48 -0
  193. package/dist/rules/scope/occurrence.js.map +1 -0
  194. package/dist/rules/scope/pattern.d.ts +3 -0
  195. package/dist/rules/scope/pattern.d.ts.map +1 -0
  196. package/dist/rules/scope/pattern.js +75 -0
  197. package/dist/rules/scope/pattern.js.map +1 -0
  198. package/dist/rules/scope/repetition.d.ts +3 -0
  199. package/dist/rules/scope/repetition.d.ts.map +1 -0
  200. package/dist/rules/scope/repetition.js +139 -0
  201. package/dist/rules/scope/repetition.js.map +1 -0
  202. package/dist/rules/scope/semantic-line-breaks.d.ts +3 -0
  203. package/dist/rules/scope/semantic-line-breaks.d.ts.map +1 -0
  204. package/dist/rules/scope/semantic-line-breaks.js +213 -0
  205. package/dist/rules/scope/semantic-line-breaks.js.map +1 -0
  206. package/dist/rules/scope/spelling.d.ts +27 -0
  207. package/dist/rules/scope/spelling.d.ts.map +1 -0
  208. package/dist/rules/scope/spelling.js +227 -0
  209. package/dist/rules/scope/spelling.js.map +1 -0
  210. package/dist/rules/scope/swap.d.ts +3 -0
  211. package/dist/rules/scope/swap.d.ts.map +1 -0
  212. package/dist/rules/scope/swap.js +149 -0
  213. package/dist/rules/scope/swap.js.map +1 -0
  214. package/dist/rules/scope/title-case.d.ts +46 -0
  215. package/dist/rules/scope/title-case.d.ts.map +1 -0
  216. package/dist/rules/scope/title-case.js +301 -0
  217. package/dist/rules/scope/title-case.js.map +1 -0
  218. package/dist/rules/token/blanks-around-fences.d.ts +3 -0
  219. package/dist/rules/token/blanks-around-fences.d.ts.map +1 -0
  220. package/dist/rules/token/blanks-around-fences.js +44 -0
  221. package/dist/rules/token/blanks-around-fences.js.map +1 -0
  222. package/dist/rules/token/blanks-around-headings.d.ts +3 -0
  223. package/dist/rules/token/blanks-around-headings.d.ts.map +1 -0
  224. package/dist/rules/token/blanks-around-headings.js +108 -0
  225. package/dist/rules/token/blanks-around-headings.js.map +1 -0
  226. package/dist/rules/token/blanks-around-lists.d.ts +3 -0
  227. package/dist/rules/token/blanks-around-lists.d.ts.map +1 -0
  228. package/dist/rules/token/blanks-around-lists.js +56 -0
  229. package/dist/rules/token/blanks-around-lists.js.map +1 -0
  230. package/dist/rules/token/blanks-around-tables.d.ts +3 -0
  231. package/dist/rules/token/blanks-around-tables.d.ts.map +1 -0
  232. package/dist/rules/token/blanks-around-tables.js +42 -0
  233. package/dist/rules/token/blanks-around-tables.js.map +1 -0
  234. package/dist/rules/token/code-block-style.d.ts +3 -0
  235. package/dist/rules/token/code-block-style.d.ts.map +1 -0
  236. package/dist/rules/token/code-block-style.js +30 -0
  237. package/dist/rules/token/code-block-style.js.map +1 -0
  238. package/dist/rules/token/code-fence-style.d.ts +3 -0
  239. package/dist/rules/token/code-fence-style.d.ts.map +1 -0
  240. package/dist/rules/token/code-fence-style.js +35 -0
  241. package/dist/rules/token/code-fence-style.js.map +1 -0
  242. package/dist/rules/token/commands-show-output.d.ts +3 -0
  243. package/dist/rules/token/commands-show-output.d.ts.map +1 -0
  244. package/dist/rules/token/commands-show-output.js +38 -0
  245. package/dist/rules/token/commands-show-output.js.map +1 -0
  246. package/dist/rules/token/descriptive-link-text.d.ts +3 -0
  247. package/dist/rules/token/descriptive-link-text.d.ts.map +1 -0
  248. package/dist/rules/token/descriptive-link-text.js +53 -0
  249. package/dist/rules/token/descriptive-link-text.js.map +1 -0
  250. package/dist/rules/token/emphasis-style.d.ts +3 -0
  251. package/dist/rules/token/emphasis-style.d.ts.map +1 -0
  252. package/dist/rules/token/emphasis-style.js +51 -0
  253. package/dist/rules/token/emphasis-style.js.map +1 -0
  254. package/dist/rules/token/fenced-code-language.d.ts +3 -0
  255. package/dist/rules/token/fenced-code-language.d.ts.map +1 -0
  256. package/dist/rules/token/fenced-code-language.js +35 -0
  257. package/dist/rules/token/fenced-code-language.js.map +1 -0
  258. package/dist/rules/token/first-line-h1.d.ts +3 -0
  259. package/dist/rules/token/first-line-h1.d.ts.map +1 -0
  260. package/dist/rules/token/first-line-h1.js +107 -0
  261. package/dist/rules/token/first-line-h1.js.map +1 -0
  262. package/dist/rules/token/heading-increment.d.ts +3 -0
  263. package/dist/rules/token/heading-increment.d.ts.map +1 -0
  264. package/dist/rules/token/heading-increment.js +27 -0
  265. package/dist/rules/token/heading-increment.js.map +1 -0
  266. package/dist/rules/token/heading-start-left.d.ts +3 -0
  267. package/dist/rules/token/heading-start-left.d.ts.map +1 -0
  268. package/dist/rules/token/heading-start-left.js +31 -0
  269. package/dist/rules/token/heading-start-left.js.map +1 -0
  270. package/dist/rules/token/heading-style.d.ts +3 -0
  271. package/dist/rules/token/heading-style.d.ts.map +1 -0
  272. package/dist/rules/token/heading-style.js +41 -0
  273. package/dist/rules/token/heading-style.js.map +1 -0
  274. package/dist/rules/token/helpers.d.ts +313 -0
  275. package/dist/rules/token/helpers.d.ts.map +1 -0
  276. package/dist/rules/token/helpers.js +746 -0
  277. package/dist/rules/token/helpers.js.map +1 -0
  278. package/dist/rules/token/hr-style.d.ts +3 -0
  279. package/dist/rules/token/hr-style.d.ts.map +1 -0
  280. package/dist/rules/token/hr-style.js +28 -0
  281. package/dist/rules/token/hr-style.js.map +1 -0
  282. package/dist/rules/token/index.d.ts +75 -0
  283. package/dist/rules/token/index.d.ts.map +1 -0
  284. package/dist/rules/token/index.js +226 -0
  285. package/dist/rules/token/index.js.map +1 -0
  286. package/dist/rules/token/line-length.d.ts +3 -0
  287. package/dist/rules/token/line-length.d.ts.map +1 -0
  288. package/dist/rules/token/line-length.js +120 -0
  289. package/dist/rules/token/line-length.js.map +1 -0
  290. package/dist/rules/token/link-fragments.d.ts +3 -0
  291. package/dist/rules/token/link-fragments.d.ts.map +1 -0
  292. package/dist/rules/token/link-fragments.js +145 -0
  293. package/dist/rules/token/link-fragments.js.map +1 -0
  294. package/dist/rules/token/link-image-reference-definitions.d.ts +3 -0
  295. package/dist/rules/token/link-image-reference-definitions.d.ts.map +1 -0
  296. package/dist/rules/token/link-image-reference-definitions.js +50 -0
  297. package/dist/rules/token/link-image-reference-definitions.js.map +1 -0
  298. package/dist/rules/token/link-image-style.d.ts +3 -0
  299. package/dist/rules/token/link-image-style.d.ts.map +1 -0
  300. package/dist/rules/token/link-image-style.js +131 -0
  301. package/dist/rules/token/link-image-style.js.map +1 -0
  302. package/dist/rules/token/list-indent.d.ts +3 -0
  303. package/dist/rules/token/list-indent.d.ts.map +1 -0
  304. package/dist/rules/token/list-indent.js +60 -0
  305. package/dist/rules/token/list-indent.js.map +1 -0
  306. package/dist/rules/token/list-length.d.ts +3 -0
  307. package/dist/rules/token/list-length.d.ts.map +1 -0
  308. package/dist/rules/token/list-length.js +55 -0
  309. package/dist/rules/token/list-length.js.map +1 -0
  310. package/dist/rules/token/list-marker-space.d.ts +3 -0
  311. package/dist/rules/token/list-marker-space.d.ts.map +1 -0
  312. package/dist/rules/token/list-marker-space.js +52 -0
  313. package/dist/rules/token/list-marker-space.js.map +1 -0
  314. package/dist/rules/token/markdoc-attributes.d.ts +3 -0
  315. package/dist/rules/token/markdoc-attributes.d.ts.map +1 -0
  316. package/dist/rules/token/markdoc-attributes.js +269 -0
  317. package/dist/rules/token/markdoc-attributes.js.map +1 -0
  318. package/dist/rules/token/markdoc-pairing.d.ts +3 -0
  319. package/dist/rules/token/markdoc-pairing.d.ts.map +1 -0
  320. package/dist/rules/token/markdoc-pairing.js +73 -0
  321. package/dist/rules/token/markdoc-pairing.js.map +1 -0
  322. package/dist/rules/token/markdoc-syntax.d.ts +3 -0
  323. package/dist/rules/token/markdoc-syntax.d.ts.map +1 -0
  324. package/dist/rules/token/markdoc-syntax.js +119 -0
  325. package/dist/rules/token/markdoc-syntax.js.map +1 -0
  326. package/dist/rules/token/markdoc-unknown-tag.d.ts +3 -0
  327. package/dist/rules/token/markdoc-unknown-tag.d.ts.map +1 -0
  328. package/dist/rules/token/markdoc-unknown-tag.js +64 -0
  329. package/dist/rules/token/markdoc-unknown-tag.js.map +1 -0
  330. package/dist/rules/token/messages.d.ts +4 -0
  331. package/dist/rules/token/messages.d.ts.map +1 -0
  332. package/dist/rules/token/messages.js +20 -0
  333. package/dist/rules/token/messages.js.map +1 -0
  334. package/dist/rules/token/no-alt-text.d.ts +3 -0
  335. package/dist/rules/token/no-alt-text.d.ts.map +1 -0
  336. package/dist/rules/token/no-alt-text.js +47 -0
  337. package/dist/rules/token/no-alt-text.js.map +1 -0
  338. package/dist/rules/token/no-bare-urls.d.ts +3 -0
  339. package/dist/rules/token/no-bare-urls.d.ts.map +1 -0
  340. package/dist/rules/token/no-bare-urls.js +88 -0
  341. package/dist/rules/token/no-bare-urls.js.map +1 -0
  342. package/dist/rules/token/no-blanks-blockquote.d.ts +3 -0
  343. package/dist/rules/token/no-blanks-blockquote.d.ts.map +1 -0
  344. package/dist/rules/token/no-blanks-blockquote.js +39 -0
  345. package/dist/rules/token/no-blanks-blockquote.js.map +1 -0
  346. package/dist/rules/token/no-duplicate-heading.d.ts +3 -0
  347. package/dist/rules/token/no-duplicate-heading.d.ts.map +1 -0
  348. package/dist/rules/token/no-duplicate-heading.js +101 -0
  349. package/dist/rules/token/no-duplicate-heading.js.map +1 -0
  350. package/dist/rules/token/no-duplicate-link-destinations.d.ts +3 -0
  351. package/dist/rules/token/no-duplicate-link-destinations.d.ts.map +1 -0
  352. package/dist/rules/token/no-duplicate-link-destinations.js +65 -0
  353. package/dist/rules/token/no-duplicate-link-destinations.js.map +1 -0
  354. package/dist/rules/token/no-emphasis-as-heading.d.ts +3 -0
  355. package/dist/rules/token/no-emphasis-as-heading.d.ts.map +1 -0
  356. package/dist/rules/token/no-emphasis-as-heading.js +44 -0
  357. package/dist/rules/token/no-emphasis-as-heading.js.map +1 -0
  358. package/dist/rules/token/no-empty-headings.d.ts +3 -0
  359. package/dist/rules/token/no-empty-headings.d.ts.map +1 -0
  360. package/dist/rules/token/no-empty-headings.js +28 -0
  361. package/dist/rules/token/no-empty-headings.js.map +1 -0
  362. package/dist/rules/token/no-empty-links.d.ts +3 -0
  363. package/dist/rules/token/no-empty-links.d.ts.map +1 -0
  364. package/dist/rules/token/no-empty-links.js +67 -0
  365. package/dist/rules/token/no-empty-links.js.map +1 -0
  366. package/dist/rules/token/no-hard-tabs.d.ts +3 -0
  367. package/dist/rules/token/no-hard-tabs.d.ts.map +1 -0
  368. package/dist/rules/token/no-hard-tabs.js +76 -0
  369. package/dist/rules/token/no-hard-tabs.js.map +1 -0
  370. package/dist/rules/token/no-inline-html.d.ts +3 -0
  371. package/dist/rules/token/no-inline-html.d.ts.map +1 -0
  372. package/dist/rules/token/no-inline-html.js +45 -0
  373. package/dist/rules/token/no-inline-html.js.map +1 -0
  374. package/dist/rules/token/no-missing-space-atx.d.ts +3 -0
  375. package/dist/rules/token/no-missing-space-atx.d.ts.map +1 -0
  376. package/dist/rules/token/no-missing-space-atx.js +36 -0
  377. package/dist/rules/token/no-missing-space-atx.js.map +1 -0
  378. package/dist/rules/token/no-missing-space-closed-atx.d.ts +3 -0
  379. package/dist/rules/token/no-missing-space-closed-atx.d.ts.map +1 -0
  380. package/dist/rules/token/no-missing-space-closed-atx.js +45 -0
  381. package/dist/rules/token/no-missing-space-closed-atx.js.map +1 -0
  382. package/dist/rules/token/no-multiple-blanks.d.ts +3 -0
  383. package/dist/rules/token/no-multiple-blanks.d.ts.map +1 -0
  384. package/dist/rules/token/no-multiple-blanks.js +35 -0
  385. package/dist/rules/token/no-multiple-blanks.js.map +1 -0
  386. package/dist/rules/token/no-multiple-space-atx.d.ts +13 -0
  387. package/dist/rules/token/no-multiple-space-atx.d.ts.map +1 -0
  388. package/dist/rules/token/no-multiple-space-atx.js +50 -0
  389. package/dist/rules/token/no-multiple-space-atx.js.map +1 -0
  390. package/dist/rules/token/no-multiple-space-blockquote.d.ts +3 -0
  391. package/dist/rules/token/no-multiple-space-blockquote.d.ts.map +1 -0
  392. package/dist/rules/token/no-multiple-space-blockquote.js +43 -0
  393. package/dist/rules/token/no-multiple-space-blockquote.js.map +1 -0
  394. package/dist/rules/token/no-multiple-space-closed-atx.d.ts +3 -0
  395. package/dist/rules/token/no-multiple-space-closed-atx.d.ts.map +1 -0
  396. package/dist/rules/token/no-multiple-space-closed-atx.js +19 -0
  397. package/dist/rules/token/no-multiple-space-closed-atx.js.map +1 -0
  398. package/dist/rules/token/no-reversed-links.d.ts +3 -0
  399. package/dist/rules/token/no-reversed-links.d.ts.map +1 -0
  400. package/dist/rules/token/no-reversed-links.js +52 -0
  401. package/dist/rules/token/no-reversed-links.js.map +1 -0
  402. package/dist/rules/token/no-space-in-code.d.ts +3 -0
  403. package/dist/rules/token/no-space-in-code.d.ts.map +1 -0
  404. package/dist/rules/token/no-space-in-code.js +75 -0
  405. package/dist/rules/token/no-space-in-code.js.map +1 -0
  406. package/dist/rules/token/no-space-in-emphasis.d.ts +3 -0
  407. package/dist/rules/token/no-space-in-emphasis.d.ts.map +1 -0
  408. package/dist/rules/token/no-space-in-emphasis.js +79 -0
  409. package/dist/rules/token/no-space-in-emphasis.js.map +1 -0
  410. package/dist/rules/token/no-space-in-links.d.ts +3 -0
  411. package/dist/rules/token/no-space-in-links.d.ts.map +1 -0
  412. package/dist/rules/token/no-space-in-links.js +48 -0
  413. package/dist/rules/token/no-space-in-links.js.map +1 -0
  414. package/dist/rules/token/no-trailing-punctuation.d.ts +3 -0
  415. package/dist/rules/token/no-trailing-punctuation.d.ts.map +1 -0
  416. package/dist/rules/token/no-trailing-punctuation.js +38 -0
  417. package/dist/rules/token/no-trailing-punctuation.js.map +1 -0
  418. package/dist/rules/token/no-trailing-spaces.d.ts +3 -0
  419. package/dist/rules/token/no-trailing-spaces.d.ts.map +1 -0
  420. package/dist/rules/token/no-trailing-spaces.js +89 -0
  421. package/dist/rules/token/no-trailing-spaces.js.map +1 -0
  422. package/dist/rules/token/ol-prefix.d.ts +3 -0
  423. package/dist/rules/token/ol-prefix.d.ts.map +1 -0
  424. package/dist/rules/token/ol-prefix.js +70 -0
  425. package/dist/rules/token/ol-prefix.js.map +1 -0
  426. package/dist/rules/token/proper-names.d.ts +3 -0
  427. package/dist/rules/token/proper-names.d.ts.map +1 -0
  428. package/dist/rules/token/proper-names.js +93 -0
  429. package/dist/rules/token/proper-names.js.map +1 -0
  430. package/dist/rules/token/reference-links-images.d.ts +3 -0
  431. package/dist/rules/token/reference-links-images.d.ts.map +1 -0
  432. package/dist/rules/token/reference-links-images.js +36 -0
  433. package/dist/rules/token/reference-links-images.js.map +1 -0
  434. package/dist/rules/token/required-headings.d.ts +3 -0
  435. package/dist/rules/token/required-headings.d.ts.map +1 -0
  436. package/dist/rules/token/required-headings.js +83 -0
  437. package/dist/rules/token/required-headings.js.map +1 -0
  438. package/dist/rules/token/single-h1.d.ts +3 -0
  439. package/dist/rules/token/single-h1.d.ts.map +1 -0
  440. package/dist/rules/token/single-h1.js +56 -0
  441. package/dist/rules/token/single-h1.js.map +1 -0
  442. package/dist/rules/token/single-trailing-newline.d.ts +3 -0
  443. package/dist/rules/token/single-trailing-newline.d.ts.map +1 -0
  444. package/dist/rules/token/single-trailing-newline.js +25 -0
  445. package/dist/rules/token/single-trailing-newline.js.map +1 -0
  446. package/dist/rules/token/strong-style.d.ts +3 -0
  447. package/dist/rules/token/strong-style.d.ts.map +1 -0
  448. package/dist/rules/token/strong-style.js +51 -0
  449. package/dist/rules/token/strong-style.js.map +1 -0
  450. package/dist/rules/token/table-column-count.d.ts +3 -0
  451. package/dist/rules/token/table-column-count.d.ts.map +1 -0
  452. package/dist/rules/token/table-column-count.js +44 -0
  453. package/dist/rules/token/table-column-count.js.map +1 -0
  454. package/dist/rules/token/table-column-style.d.ts +3 -0
  455. package/dist/rules/token/table-column-style.d.ts.map +1 -0
  456. package/dist/rules/token/table-column-style.js +179 -0
  457. package/dist/rules/token/table-column-style.js.map +1 -0
  458. package/dist/rules/token/table-pipe-style.d.ts +3 -0
  459. package/dist/rules/token/table-pipe-style.d.ts.map +1 -0
  460. package/dist/rules/token/table-pipe-style.js +54 -0
  461. package/dist/rules/token/table-pipe-style.js.map +1 -0
  462. package/dist/rules/token/ul-indent.d.ts +3 -0
  463. package/dist/rules/token/ul-indent.d.ts.map +1 -0
  464. package/dist/rules/token/ul-indent.js +72 -0
  465. package/dist/rules/token/ul-indent.js.map +1 -0
  466. package/dist/rules/token/ul-style.d.ts +3 -0
  467. package/dist/rules/token/ul-style.d.ts.map +1 -0
  468. package/dist/rules/token/ul-style.js +80 -0
  469. package/dist/rules/token/ul-style.js.map +1 -0
  470. package/dist/rules/types.d.ts +81 -0
  471. package/dist/rules/types.d.ts.map +1 -0
  472. package/dist/rules/types.js +2 -0
  473. package/dist/rules/types.js.map +1 -0
  474. package/dist/rules/utils.d.ts +29 -0
  475. package/dist/rules/utils.d.ts.map +1 -0
  476. package/dist/{assertions → rules}/utils.js +27 -0
  477. package/dist/rules/utils.js.map +1 -0
  478. package/dist/scopes/extractor.d.ts +7 -0
  479. package/dist/scopes/extractor.d.ts.map +1 -0
  480. package/dist/scopes/extractor.js +475 -0
  481. package/dist/scopes/extractor.js.map +1 -0
  482. package/dist/scopes/selector.d.ts +51 -0
  483. package/dist/scopes/selector.d.ts.map +1 -0
  484. package/dist/scopes/selector.js +121 -0
  485. package/dist/scopes/selector.js.map +1 -0
  486. package/dist/scopes/sentences.d.ts +15 -0
  487. package/dist/scopes/sentences.d.ts.map +1 -0
  488. package/dist/scopes/sentences.js +124 -0
  489. package/dist/scopes/sentences.js.map +1 -0
  490. package/dist/scopes/types.d.ts +44 -0
  491. package/dist/scopes/types.d.ts.map +1 -0
  492. package/dist/scopes/types.js +2 -0
  493. package/dist/scopes/types.js.map +1 -0
  494. package/dist/scopes/vocabulary.d.ts +16 -0
  495. package/dist/scopes/vocabulary.d.ts.map +1 -0
  496. package/dist/scopes/vocabulary.js +70 -0
  497. package/dist/scopes/vocabulary.js.map +1 -0
  498. package/dist/types/assertions.d.ts +95 -32
  499. package/dist/types/assertions.d.ts.map +1 -1
  500. package/dist/types/problems.d.ts +4 -5
  501. package/dist/types/problems.d.ts.map +1 -1
  502. package/dist/types/rules.d.ts +4 -6
  503. package/dist/types/rules.d.ts.map +1 -1
  504. package/examples/appendices/google.appendix.yaml +91 -0
  505. package/examples/appendices/inclusive-language.appendix.yaml +61 -0
  506. package/examples/appendices/microsoft.appendix.yaml +99 -0
  507. package/examples/appendices/plain-language.appendix.yaml +88 -0
  508. package/examples/google.yaml +1525 -0
  509. package/examples/inclusive-language.yaml +304 -0
  510. package/examples/microsoft.yaml +1542 -0
  511. package/examples/plain-language.yaml +325 -0
  512. package/package.json +49 -16
  513. package/presets/google/PROVENANCE.md +1022 -0
  514. package/presets/google/sources.json +192 -0
  515. package/presets/inclusive-language/PROVENANCE.md +174 -0
  516. package/presets/inclusive-language/sources.json +107 -0
  517. package/presets/microsoft/PROVENANCE.md +1555 -0
  518. package/presets/microsoft/sources.json +494 -0
  519. package/presets/plain-language/PROVENANCE.md +364 -0
  520. package/presets/plain-language/sources.json +108 -0
  521. package/dist/assertions/bullet-style.d.ts +0 -3
  522. package/dist/assertions/bullet-style.d.ts.map +0 -1
  523. package/dist/assertions/bullet-style.js +0 -60
  524. package/dist/assertions/bullet-style.js.map +0 -1
  525. package/dist/assertions/index.d.ts +0 -21
  526. package/dist/assertions/index.d.ts.map +0 -1
  527. package/dist/assertions/index.js +0 -30
  528. package/dist/assertions/index.js.map +0 -1
  529. package/dist/assertions/max-image-size.d.ts +0 -3
  530. package/dist/assertions/max-image-size.d.ts.map +0 -1
  531. package/dist/assertions/max-image-size.js +0 -73
  532. package/dist/assertions/max-image-size.js.map +0 -1
  533. package/dist/assertions/max-line-length.d.ts +0 -3
  534. package/dist/assertions/max-line-length.d.ts.map +0 -1
  535. package/dist/assertions/max-line-length.js +0 -68
  536. package/dist/assertions/max-line-length.js.map +0 -1
  537. package/dist/assertions/no-broken-fragment-links.d.ts +0 -3
  538. package/dist/assertions/no-broken-fragment-links.d.ts.map +0 -1
  539. package/dist/assertions/no-broken-fragment-links.js +0 -79
  540. package/dist/assertions/no-broken-fragment-links.js.map +0 -1
  541. package/dist/assertions/no-duplicate-headings.d.ts +0 -3
  542. package/dist/assertions/no-duplicate-headings.d.ts.map +0 -1
  543. package/dist/assertions/no-duplicate-headings.js +0 -66
  544. package/dist/assertions/no-duplicate-headings.js.map +0 -1
  545. package/dist/assertions/no-hard-tabs.d.ts +0 -3
  546. package/dist/assertions/no-hard-tabs.d.ts.map +0 -1
  547. package/dist/assertions/no-hard-tabs.js +0 -63
  548. package/dist/assertions/no-hard-tabs.js.map +0 -1
  549. package/dist/assertions/no-trailing-spaces.d.ts +0 -3
  550. package/dist/assertions/no-trailing-spaces.d.ts.map +0 -1
  551. package/dist/assertions/no-trailing-spaces.js +0 -72
  552. package/dist/assertions/no-trailing-spaces.js.map +0 -1
  553. package/dist/assertions/pattern.d.ts +0 -3
  554. package/dist/assertions/pattern.d.ts.map +0 -1
  555. package/dist/assertions/pattern.js +0 -39
  556. package/dist/assertions/pattern.js.map +0 -1
  557. package/dist/assertions/semantic-line-breaks.d.ts +0 -3
  558. package/dist/assertions/semantic-line-breaks.d.ts.map +0 -1
  559. package/dist/assertions/semantic-line-breaks.js +0 -152
  560. package/dist/assertions/semantic-line-breaks.js.map +0 -1
  561. package/dist/assertions/swap.d.ts +0 -3
  562. package/dist/assertions/swap.d.ts.map +0 -1
  563. package/dist/assertions/swap.js +0 -39
  564. package/dist/assertions/swap.js.map +0 -1
  565. package/dist/assertions/utils.d.ts +0 -8
  566. package/dist/assertions/utils.d.ts.map +0 -1
  567. package/dist/assertions/utils.js.map +0 -1
  568. package/dist/core/scope-parser.d.ts +0 -26
  569. package/dist/core/scope-parser.d.ts.map +0 -1
  570. package/dist/core/scope-parser.js +0 -110
  571. package/dist/core/scope-parser.js.map +0 -1
  572. package/dist/files.d.ts +0 -2
  573. package/dist/files.d.ts.map +0 -1
  574. package/dist/files.js +0 -39
  575. package/dist/files.js.map +0 -1
  576. package/dist/load-config.d.ts +0 -25
  577. package/dist/load-config.d.ts.map +0 -1
  578. package/dist/load-config.js +0 -104
  579. package/dist/load-config.js.map +0 -1
  580. package/dist/load.d.ts +0 -25
  581. package/dist/load.d.ts.map +0 -1
  582. package/dist/load.js +0 -112
  583. package/dist/load.js.map +0 -1
  584. package/dist/scope.d.ts +0 -26
  585. package/dist/scope.d.ts.map +0 -1
  586. package/dist/scope.js +0 -110
  587. package/dist/scope.js.map +0 -1
  588. package/dist/types.d.ts +0 -109
  589. package/dist/types.d.ts.map +0 -1
  590. package/dist/types.js.map +0 -1
  591. package/dist/validate.d.ts +0 -31
  592. package/dist/validate.d.ts.map +0 -1
  593. package/dist/validate.js +0 -154
  594. package/dist/validate.js.map +0 -1
  595. /package/dist/{types.js → parser/types.js} +0 -0
@@ -0,0 +1,301 @@
1
+ // Pure AP/Chicago title-case algorithms backing the Vale-parity
2
+ // `capitalization` assertion's `$title` match (see ./capitalization.ts).
3
+ // Deliberately no markdown/Vale awareness here -- these functions operate
4
+ // on plain text only. Scope/segment handling, backtick-span freezing, and
5
+ // the problem/fix wiring all live in capitalization.ts. The one import below
6
+ // is the mask CHARACTER, not any markdown handling: masking happens in
7
+ // capitalization.ts, and the tokenizer here only has to recognize the result.
8
+ //
9
+ // Shared casing rules (both styles):
10
+ // - The FIRST and LAST word are ALWAYS capitalized, regardless of any
11
+ // stopword list below.
12
+ // - A word listed in `exceptions` (matched case-insensitively) is
13
+ // rewritten to its EXACT as-written form from that list, everywhere in
14
+ // the title -- including first/last position -- overriding every rule
15
+ // below (e.g. 'GitHub', 'iPhone').
16
+ // - A word already in ALL-CAPS (2+ letters, e.g. an acronym like 'API') is
17
+ // left exactly as written, also overriding the stopword/position rules.
18
+ // - A hyphenated compound (e.g. 'editor-in-chief' -> 'Editor-in-Chief')
19
+ // runs each hyphen part through the same rules a standalone word gets --
20
+ // see capitalizeHyphenated.
21
+ // - Every other (non-edge, non-hyphenated, non-exception, non-ALL-CAPS)
22
+ // word is either forced lowercase (a stopword for the active style) or
23
+ // capitalized (initial letter upper, rest lower).
24
+ //
25
+ // Style difference (the stopword list lowercased mid-title):
26
+ // - AP: articles, coordinating conjunctions, and prepositions of THREE
27
+ // letters or fewer.
28
+ // - Chicago: articles, coordinating conjunctions, and EVERY preposition
29
+ // regardless of length -- via the fixed list below (JS has no built-in
30
+ // dictionary of "all English prepositions" to draw on).
31
+ import { INLINE_CODE_MASK_CHAR } from '../../core/inline-code.js';
32
+ import { ABBREVIATIONS, lastWordBefore } from '../../scopes/sentences.js';
33
+ const ARTICLES = ['a', 'an', 'the'];
34
+ const COORDINATING_CONJUNCTIONS = ['and', 'but', 'or', 'nor', 'for', 'so', 'yet'];
35
+ // Every entry here is <= 3 letters -- both AP and Chicago lowercase these.
36
+ const SHORT_PREPOSITIONS = ['at', 'by', 'in', 'of', 'off', 'on', 'out', 'to', 'up', 'via'];
37
+ // Chicago-only: prepositions of 4+ letters. AP capitalizes these mid-title
38
+ // (they're not in AP_STOPWORDS); Chicago lowercases them like any other
39
+ // preposition.
40
+ const LONG_PREPOSITIONS = [
41
+ 'about',
42
+ 'above',
43
+ 'across',
44
+ 'after',
45
+ 'against',
46
+ 'along',
47
+ 'among',
48
+ 'around',
49
+ 'before',
50
+ 'behind',
51
+ 'below',
52
+ 'between',
53
+ 'during',
54
+ 'through',
55
+ 'toward',
56
+ 'under',
57
+ 'until',
58
+ 'with',
59
+ 'within',
60
+ 'without',
61
+ ];
62
+ const AP_STOPWORDS = new Set([...ARTICLES, ...COORDINATING_CONJUNCTIONS, ...SHORT_PREPOSITIONS]);
63
+ const CHICAGO_STOPWORDS = new Set([
64
+ ...ARTICLES,
65
+ ...COORDINATING_CONJUNCTIONS,
66
+ ...SHORT_PREPOSITIONS,
67
+ ...LONG_PREPOSITIONS,
68
+ ]);
69
+ // One "word" is a run of letters/digits, optionally joined by internal
70
+ // hyphens ('well-known') or apostrophes ("don't"); anything else is a
71
+ // separator copied through verbatim. Phrase exceptions never reach the
72
+ // tokenizer -- tokenizeCasingWords carves them out first.
73
+ /**
74
+ * True for a word that's already an ALL-CAPS acronym (2+ letters, e.g.
75
+ * 'API', 'HTML5') -- both styles leave these exactly as written rather
76
+ * than lowercasing or capitalizing them. Non-letter characters (digits)
77
+ * don't count toward the length or case check.
78
+ */
79
+ export function isAllCapsWord(word) {
80
+ const letters = word.replace(/[^A-Za-z]/g, '');
81
+ return letters.length >= 2 && letters === letters.toUpperCase();
82
+ }
83
+ /** The `v2` of `v2.0`, or `v3`. The `v` must be the whole alphabetic part,
84
+ * so an ordinary word like `vector3` is untouched. */
85
+ export function isVersionToken(word) {
86
+ return /^v\d+$/i.test(word);
87
+ }
88
+ /** `x-metadata`, `x-codeSamples`. Case-sensitive: matching `X-` too would
89
+ * freeze `X-ray` and AWS `X-Ray`. */
90
+ export function isVendorExtensionToken(word) {
91
+ return /^x-./.test(word);
92
+ }
93
+ /** Tokens whose own casing is already correct. Must be checked before
94
+ * hyphen splitting -- an extension's `-` is part of its name. */
95
+ export function keepsOwnCasing(word) {
96
+ return isAllCapsWord(word) || isVersionToken(word) || isVendorExtensionToken(word);
97
+ }
98
+ function capitalizeWord(word) {
99
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
100
+ }
101
+ export function buildExceptionPlan(exceptions) {
102
+ const phrases = exceptions.filter((e) => /[\s.]/.test(e)).sort((a, b) => b.length - a.length);
103
+ const phraseSet = new Set(phrases);
104
+ const wordMap = new Map();
105
+ for (const exception of exceptions) {
106
+ if (phraseSet.has(exception))
107
+ continue; // phrases are matched separately, below
108
+ wordMap.set(exception.toLowerCase(), exception);
109
+ }
110
+ return { wordMap, phrases };
111
+ }
112
+ function escapeRegExp(text) {
113
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
114
+ }
115
+ // Finds every non-overlapping occurrence of a phrase exception in `text`,
116
+ // case-insensitively but otherwise LITERALLY -- no whitespace normalization,
117
+ // no word-boundary requirement, and no regex sourced from config (every
118
+ // candidate is a fixed exception string, run through escapeRegExp). Literal
119
+ // matching is what guarantees a match is always exactly `phrase.length`
120
+ // characters long, which is in turn what lets a matched span be replaced by
121
+ // the as-written exception without shifting any later offset (see
122
+ // CasingToken.exception).
123
+ // `phrases` is already longest-first (buildExceptionPlan), so a match
124
+ // recorded for an earlier (longer) phrase claims its range and a later
125
+ // (shorter) phrase cannot also match any part of it.
126
+ function findPhraseMatches(text, phrases) {
127
+ const matches = [];
128
+ for (const phrase of phrases) {
129
+ const pattern = new RegExp(escapeRegExp(phrase), 'gi');
130
+ let match;
131
+ while ((match = pattern.exec(text)) !== null) {
132
+ const start = match.index;
133
+ const end = start + match[0].length;
134
+ if (!matches.some((claimed) => start < claimed.end && claimed.start < end)) {
135
+ matches.push({ start, end, exception: phrase });
136
+ }
137
+ }
138
+ }
139
+ return matches.sort((a, b) => a.start - b.start);
140
+ }
141
+ // A mask run is one inline code span (core/inline-code.ts). It gets its own
142
+ // token so it OCCUPIES a position, like a phrase exception (#25610) -- a
143
+ // heading opening with a code span must not hand position 0 to the next word.
144
+ // `exception` is the run itself so it survives byte for byte; restoreInlineCode
145
+ // splices by offset.
146
+ const WORD_OR_MASK_RE = new RegExp(`${INLINE_CODE_MASK_CHAR}+|[A-Za-z0-9]+(?:['’-][A-Za-z0-9]+)*`, 'g');
147
+ function pushWordTokens(text, from, to, tokens) {
148
+ if (from >= to)
149
+ return;
150
+ for (const match of text.slice(from, to).matchAll(WORD_OR_MASK_RE)) {
151
+ const start = from + (match.index ?? 0);
152
+ const isMask = match[0].startsWith(INLINE_CODE_MASK_CHAR);
153
+ tokens.push({
154
+ text: match[0],
155
+ start,
156
+ end: start + match[0].length,
157
+ ...(isMask ? { exception: match[0] } : {}),
158
+ });
159
+ }
160
+ }
161
+ /**
162
+ * Tokenizes `text` into the word sequence the `$`-styles case, with every
163
+ * non-overlapping phrase-exception match collapsed into a single token.
164
+ *
165
+ * Ordinary words are tokenized only in the GAPS between phrase matches, which
166
+ * makes a phrase span a hard token boundary: a word can never straddle one
167
+ * (e.g. with the phrase 'VS Code', the text 'xVS Codey' yields 'x', the
168
+ * phrase, then 'y'). That is exactly the boundary the previous placeholder run
169
+ * produced, since the placeholder sat outside WORD_RE's character class.
170
+ */
171
+ function tokenizeCasingWords(text, phrases) {
172
+ const tokens = [];
173
+ let cursor = 0;
174
+ for (const { start, end, exception } of findPhraseMatches(text, phrases)) {
175
+ pushWordTokens(text, cursor, start, tokens);
176
+ tokens.push({ text: text.slice(start, end), start, end, exception });
177
+ cursor = end;
178
+ }
179
+ pushWordTokens(text, cursor, text.length, tokens);
180
+ return tokens;
181
+ }
182
+ // Trailing whitespace is required: a bare dot is usually a dotted identifier
183
+ // or version (`element.focus()`, `v2.0`), not a sentence end. No ':' -- both
184
+ // style guides lowercase after a colon unless a full sentence follows, which
185
+ // nothing here can detect.
186
+ const SENTENCE_BREAK_RE = /[.?!]["'’”)\]]*\s/;
187
+ // ABBREVIATIONS is the sentence splitter's own list, reused so the two cannot
188
+ // disagree about what ends a sentence (`Cost vs. value` is one sentence).
189
+ function gapEndsSentence(text, gapStart, gap) {
190
+ const match = SENTENCE_BREAK_RE.exec(gap);
191
+ if (!match)
192
+ return false;
193
+ if (match[0][0] !== '.')
194
+ return true; // '?' and '!' never abbreviate
195
+ return !ABBREVIATIONS.has(lastWordBefore(text, gapStart + (match.index ?? 0)));
196
+ }
197
+ /**
198
+ * Rebuilds `text` with every word re-cased by `caseWord`, which receives the
199
+ * word, its `index`, the sequence `total`, and whether it opens a sentence.
200
+ * Separators are copied through verbatim.
201
+ *
202
+ * Phrase-exception and mask tokens are emitted as-written but still OCCUPY an
203
+ * index, so a leading one cannot hand position 0 to a neighbour (#25610).
204
+ *
205
+ * Shared by apTitleCase/chicagoTitleCase and capitalization.ts's sentenceCase.
206
+ * Length-preserving whenever `caseWord` is.
207
+ */
208
+ export function recaseWords(text, phrases, caseWord) {
209
+ const tokens = tokenizeCasingWords(text, phrases);
210
+ if (tokens.length === 0)
211
+ return text;
212
+ let result = '';
213
+ let cursor = 0;
214
+ tokens.forEach((token, index) => {
215
+ const separator = text.slice(cursor, token.start);
216
+ const startsSentence = index === 0 || gapEndsSentence(text, cursor, separator);
217
+ result += separator;
218
+ result += token.exception ?? caseWord(token.text, index, tokens.length, startsSentence);
219
+ cursor = token.end;
220
+ });
221
+ return result + text.slice(cursor);
222
+ }
223
+ // Each hyphen part gets its own exceptions/ALL-CAPS decision first, then
224
+ // the same stopword test a standalone word gets. The first/last part also
225
+ // inherits the compound's own first/last-word treatment, so a stopword
226
+ // part still capitalizes when the compound opens/closes the title.
227
+ function capitalizeHyphenated(word, isFirstWord, isLastWord, stopwords, exceptionMap) {
228
+ const parts = word.split('-');
229
+ const lastPartIndex = parts.length - 1;
230
+ return parts
231
+ .map((part, partIndex) => {
232
+ if (part.length === 0)
233
+ return part; // leading/trailing/doubled hyphen -- nothing to capitalize
234
+ const exceptionHit = exceptionMap.get(part.toLowerCase());
235
+ if (exceptionHit !== undefined)
236
+ return exceptionHit;
237
+ if (isAllCapsWord(part))
238
+ return part;
239
+ if (partIndex === 0 && isFirstWord)
240
+ return capitalizeWord(part);
241
+ if (partIndex === lastPartIndex && isLastWord)
242
+ return capitalizeWord(part);
243
+ if (stopwords.has(part.toLowerCase()))
244
+ return part.toLowerCase();
245
+ return capitalizeWord(part);
246
+ })
247
+ .join('-');
248
+ }
249
+ function transformWord(word, isFirstWord, isLastWord, stopwords, exceptionMap) {
250
+ // Whole-compound exception check FIRST, before any hyphen splitting: an
251
+ // exceptions entry may itself be an entire hyphenated compound (e.g.
252
+ // 'e-commerce'), which must be preserved as-written rather than falling
253
+ // through to per-part handling below -- $sentence (capitalization.ts's
254
+ // sentenceCase) already treats a hyphenated compound as one token and
255
+ // honors this, so $title must agree on the same documented behavior.
256
+ const exceptionHit = exceptionMap.get(word.toLowerCase());
257
+ if (exceptionHit !== undefined)
258
+ return exceptionHit;
259
+ // Before the hyphen split: `x-codeSamples` split into parts became
260
+ // `X-codesamples`. An exceptions entry still wins, above.
261
+ if (keepsOwnCasing(word))
262
+ return word;
263
+ // Hyphenation check: with no whole-compound exception match, a hyphenated
264
+ // compound is stopword-tested part by part instead (the stopword lists
265
+ // only contain single words, so a whole-string lookup against them would
266
+ // never hit anyway). Per-part exceptions (e.g. 'GitHub' inside
267
+ // 'github-hosted') are still handled inside capitalizeHyphenated.
268
+ if (word.includes('-')) {
269
+ return capitalizeHyphenated(word, isFirstWord, isLastWord, stopwords, exceptionMap);
270
+ }
271
+ if (isFirstWord || isLastWord)
272
+ return capitalizeWord(word);
273
+ if (stopwords.has(word.toLowerCase()))
274
+ return word.toLowerCase();
275
+ return capitalizeWord(word);
276
+ }
277
+ function titleCase(text, stopwords, exceptions) {
278
+ // Phrase entries become atomic tokens in the sequence recaseWords walks
279
+ // (each emitted as-written, each counting toward first/last position);
280
+ // `wordMap` holds the single-token entries transformWord looks up per word
281
+ // and per hyphen part. Both come from the one shared exception plan.
282
+ const { wordMap, phrases } = buildExceptionPlan(exceptions);
283
+ return recaseWords(text, phrases, (word, index, total) => transformWord(word, index === 0, index === total - 1, stopwords, wordMap));
284
+ }
285
+ /**
286
+ * AP style: lowercases articles, coordinating conjunctions, and
287
+ * prepositions of 3 letters or fewer -- everything else is capitalized,
288
+ * except `exceptions` (kept as-written) and ALL-CAPS words (left alone).
289
+ * The first and last word are always capitalized.
290
+ */
291
+ export function apTitleCase(text, exceptions = []) {
292
+ return titleCase(text, AP_STOPWORDS, exceptions);
293
+ }
294
+ /**
295
+ * Chicago style: like AP, but lowercases EVERY preposition regardless of
296
+ * length (not just the 3-letters-or-fewer ones AP lowercases).
297
+ */
298
+ export function chicagoTitleCase(text, exceptions = []) {
299
+ return titleCase(text, CHICAGO_STOPWORDS, exceptions);
300
+ }
301
+ //# sourceMappingURL=title-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title-case.js","sourceRoot":"","sources":["../../../src/rules/scope/title-case.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TokenRule } from '../types.js';
2
+ export declare const blanksAroundFences: TokenRule;
3
+ //# sourceMappingURL=blanks-around-fences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-fences.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-fences.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AA6B/D,eAAO,MAAM,kBAAkB,EAAE,SAuBhC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { filterByTypes } from '../../parser/index.js';
2
+ import { getParentOfType, isBlankLine } from './helpers.js';
3
+ const codeFencePrefixRe = /^(.*?)[`~]/;
4
+ function addFenceError(ctx, lines, lineNumber, top) {
5
+ const line = lines[lineNumber - 1] ?? '';
6
+ const prefixMatch = codeFencePrefixRe.exec(line);
7
+ const prefix = prefixMatch?.[1];
8
+ ctx.onError({
9
+ line: lineNumber,
10
+ context: line.trim(),
11
+ fixInfo: prefix === undefined
12
+ ? undefined
13
+ : {
14
+ lineNumber: lineNumber + (top ? 0 : 1),
15
+ editColumn: 1,
16
+ insertText: `${prefix.replace(/[^>]/g, ' ').trim()}\n`,
17
+ },
18
+ });
19
+ }
20
+ export const blanksAroundFences = {
21
+ name: 'blanks-around-fences',
22
+ tags: ['code', 'blank_lines'],
23
+ fixable: true,
24
+ defaults: {
25
+ message: 'Fenced code blocks should be surrounded by blank lines',
26
+ listItems: true,
27
+ },
28
+ check(ctx) {
29
+ const listItems = ctx.config.listItems;
30
+ const includeListItems = listItems === undefined ? true : !!listItems;
31
+ const { lines } = ctx;
32
+ for (const codeBlock of filterByTypes(ctx.tree, ['codeFenced'])) {
33
+ if (includeListItems || !getParentOfType(codeBlock, ['listOrdered', 'listUnordered'])) {
34
+ if (!isBlankLine(lines[codeBlock.startLine - 2])) {
35
+ addFenceError(ctx, lines, codeBlock.startLine, true);
36
+ }
37
+ if (!isBlankLine(lines[codeBlock.endLine]) && !isBlankLine(lines[codeBlock.endLine - 1])) {
38
+ addFenceError(ctx, lines, codeBlock.endLine, false);
39
+ }
40
+ }
41
+ }
42
+ },
43
+ };
44
+ //# sourceMappingURL=blanks-around-fences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-fences.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-fences.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAEvC,SAAS,aAAa,CACpB,GAAqB,EACrB,KAAwB,EACxB,UAAkB,EAClB,GAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,OAAO,CAAC;QACV,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QACpB,OAAO,EACL,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,UAAU,EAAE,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI;aACvD;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR,OAAO,EAAE,wDAAwD;QACjE,SAAS,EAAE,IAAI;KAChB;IACD,KAAK,CAAC,GAAG;QACP,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACvC,MAAM,gBAAgB,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;QACtB,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAChE,IAAI,gBAAgB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACvD,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzF,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TokenRule } from '../types.js';
2
+ export declare const blanksAroundHeadings: TokenRule;
3
+ //# sourceMappingURL=blanks-around-headings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-headings.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-headings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAwD7C,eAAO,MAAM,oBAAoB,EAAE,SA0ElC,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { filterByTypes } from '../../parser/index.js';
2
+ import { getBlockQuotePrefixText, getHeadingLevel, isBlankLine } from './helpers.js';
3
+ const defaultLines = 1;
4
+ /**
5
+ * Upstream's `getLinesFunction`: `linesAbove`/`linesBelow` config can be a
6
+ * single number applied to every heading level, or a `number[6]` (one
7
+ * entry per heading level 1-6, missing/short entries fall back to the
8
+ * default of 1).
9
+ */
10
+ function getLinesFunction(linesParam) {
11
+ if (Array.isArray(linesParam)) {
12
+ const linesArray = new Array(6).fill(defaultLines);
13
+ for (const [index, value] of linesParam.slice(0, 6).entries()) {
14
+ linesArray[index] = Number(value);
15
+ }
16
+ return (heading) => linesArray[getHeadingLevel(heading) - 1];
17
+ }
18
+ const lines = linesParam === undefined ? defaultLines : Number(linesParam);
19
+ return () => lines;
20
+ }
21
+ /**
22
+ * Gets a 0-based line's text for the "lines above" scan. Upstream strips
23
+ * front matter out of `params.lines` entirely and only reconstructs it via
24
+ * a separate `frontMatterLines` array for negative indices; Recheck keeps
25
+ * front matter in-band as a real `yaml` token occupying real line numbers
26
+ * in `ctx.lines`. To preserve upstream's documented default ("front matter
27
+ * is ignored" — i.e. no blank line is required between it and the first
28
+ * heading), a line that falls inside the yaml token's span is treated as
29
+ * blank (returns `''`) unless `includeFrontMatter` is set, in which case
30
+ * its real text is returned like any other line.
31
+ */
32
+ function getLineAbove(lines, index, frontMatterRange, includeFrontMatter) {
33
+ if (index < 0 || index >= lines.length)
34
+ return '';
35
+ const lineNumber = index + 1;
36
+ if (!includeFrontMatter &&
37
+ frontMatterRange &&
38
+ lineNumber >= frontMatterRange.start &&
39
+ lineNumber <= frontMatterRange.end) {
40
+ return '';
41
+ }
42
+ return lines[index];
43
+ }
44
+ export const blanksAroundHeadings = {
45
+ name: 'blanks-around-headings',
46
+ tags: ['headings', 'blank_lines'],
47
+ fixable: true,
48
+ defaults: {
49
+ message: 'Headings should be surrounded by blank lines',
50
+ includeFrontMatter: false,
51
+ linesAbove: 1,
52
+ linesBelow: 1,
53
+ },
54
+ check(ctx) {
55
+ const getLinesAbove = getLinesFunction(ctx.config.linesAbove);
56
+ const getLinesBelow = getLinesFunction(ctx.config.linesBelow);
57
+ const includeFrontMatter = !!ctx.config.includeFrontMatter;
58
+ const { lines } = ctx;
59
+ const frontmatter = ctx.tree.flat.find((token) => token.type === 'yaml');
60
+ const frontMatterRange = frontmatter
61
+ ? { start: frontmatter.startLine, end: frontmatter.endLine }
62
+ : undefined;
63
+ for (const heading of filterByTypes(ctx.tree, ['atxHeading', 'setextHeading'])) {
64
+ const { startLine, endLine } = heading;
65
+ const lineText = (lines[startLine - 1] ?? '').trim();
66
+ const linesAbove = getLinesAbove(heading);
67
+ if (linesAbove >= 0) {
68
+ let actualAbove = 0;
69
+ for (let i = 0; i < linesAbove &&
70
+ isBlankLine(getLineAbove(lines, startLine - 2 - i, frontMatterRange, includeFrontMatter)); i++) {
71
+ actualAbove++;
72
+ }
73
+ if (linesAbove !== actualAbove) {
74
+ ctx.onError({
75
+ line: startLine,
76
+ detail: `Expected: ${linesAbove}; Actual: ${actualAbove}; Above`,
77
+ context: lineText,
78
+ fixInfo: {
79
+ lineNumber: startLine,
80
+ editColumn: 1,
81
+ insertText: getBlockQuotePrefixText(ctx.tree, startLine - 1, linesAbove - actualAbove),
82
+ },
83
+ });
84
+ }
85
+ }
86
+ const linesBelow = getLinesBelow(heading);
87
+ if (linesBelow >= 0) {
88
+ let actualBelow = 0;
89
+ for (let i = 0; i < linesBelow && isBlankLine(lines[endLine + i] ?? ''); i++) {
90
+ actualBelow++;
91
+ }
92
+ if (linesBelow !== actualBelow) {
93
+ ctx.onError({
94
+ line: startLine,
95
+ detail: `Expected: ${linesBelow}; Actual: ${actualBelow}; Below`,
96
+ context: lineText,
97
+ fixInfo: {
98
+ lineNumber: endLine + 1,
99
+ editColumn: 1,
100
+ insertText: getBlockQuotePrefixText(ctx.tree, endLine + 1, linesBelow - actualBelow),
101
+ },
102
+ });
103
+ }
104
+ }
105
+ }
106
+ },
107
+ };
108
+ //# sourceMappingURL=blanks-around-headings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-headings.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-headings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TokenRule } from '../types.js';
2
+ export declare const blanksAroundLists: TokenRule;
3
+ //# sourceMappingURL=blanks-around-lists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-lists.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-lists.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAW7C,eAAO,MAAM,iBAAiB,EAAE,SA+D/B,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { filterByPredicate, getBlockQuotePrefixText, isBlankLine, nonContentTokens, } from './helpers.js';
2
+ const isList = (token) => token.type === 'listOrdered' || token.type === 'listUnordered';
3
+ export const blanksAroundLists = {
4
+ name: 'blanks-around-lists',
5
+ tags: ['bullet', 'ul', 'ol', 'blank_lines'],
6
+ fixable: true,
7
+ defaults: {
8
+ message: 'Lists should be surrounded by blank lines',
9
+ },
10
+ check(ctx) {
11
+ const { lines } = ctx;
12
+ // Only *top-level* lists: stop descending into a token's children once
13
+ // it is itself a list (or an htmlFlow block, matching upstream) so a
14
+ // nested sublist isn't independently reported as needing its own
15
+ // surrounding blank lines -- that's the parent list's job.
16
+ const topLevelLists = filterByPredicate(ctx.tree, isList, (token) => isList(token) || token.type === 'htmlFlow' ? [] : token.children);
17
+ for (const list of topLevelLists) {
18
+ // Look for a blank line above the list.
19
+ const firstLineNumber = list.startLine;
20
+ if (!isBlankLine(lines[firstLineNumber - 2])) {
21
+ ctx.onError({
22
+ line: firstLineNumber,
23
+ context: (lines[firstLineNumber - 1] ?? '').trim(),
24
+ fixInfo: {
25
+ lineNumber: firstLineNumber,
26
+ editColumn: 1,
27
+ insertText: getBlockQuotePrefixText(ctx.tree, firstLineNumber),
28
+ },
29
+ });
30
+ }
31
+ // Find the "visual" end of the list: its last non-"structural"
32
+ // (indentation/blank-line/container-prefix) descendant's end line,
33
+ // walked via the tree rather than list.endLine so a trailing
34
+ // listItemIndent on an otherwise-empty final line doesn't push the
35
+ // expected "below" blank-line check past the list's real content.
36
+ const flattenedChildren = filterByPredicate(list.children, (token) => !nonContentTokens.has(token.type), (token) => (nonContentTokens.has(token.type) ? [] : token.children));
37
+ const endLine = flattenedChildren.length > 0
38
+ ? flattenedChildren[flattenedChildren.length - 1].endLine
39
+ : list.endLine;
40
+ // Look for a blank line below the list.
41
+ const lastLineNumber = endLine;
42
+ if (!isBlankLine(lines[lastLineNumber])) {
43
+ ctx.onError({
44
+ line: lastLineNumber,
45
+ context: (lines[lastLineNumber - 1] ?? '').trim(),
46
+ fixInfo: {
47
+ lineNumber: lastLineNumber + 1,
48
+ editColumn: 1,
49
+ insertText: getBlockQuotePrefixText(ctx.tree, lastLineNumber),
50
+ },
51
+ });
52
+ }
53
+ }
54
+ },
55
+ };
56
+ //# sourceMappingURL=blanks-around-lists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-lists.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-lists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TokenRule } from '../types.js';
2
+ export declare const blanksAroundTables: TokenRule;
3
+ //# sourceMappingURL=blanks-around-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-tables.d.ts","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-tables.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,eAAO,MAAM,kBAAkB,EAAE,SAwChC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { filterByTypes } from '../../parser/index.js';
2
+ import { getBlockQuotePrefixText, isBlankLine } from './helpers.js';
3
+ export const blanksAroundTables = {
4
+ name: 'blanks-around-tables',
5
+ tags: ['table'],
6
+ fixable: true,
7
+ defaults: {
8
+ message: 'Tables should be surrounded by blank lines',
9
+ },
10
+ check(ctx) {
11
+ const { lines } = ctx;
12
+ for (const table of filterByTypes(ctx.tree, ['table'])) {
13
+ // Look for a blank line above the table.
14
+ const firstLineNumber = table.startLine;
15
+ if (!isBlankLine(lines[firstLineNumber - 2])) {
16
+ ctx.onError({
17
+ line: firstLineNumber,
18
+ context: (lines[firstLineNumber - 1] ?? '').trim(),
19
+ fixInfo: {
20
+ lineNumber: firstLineNumber,
21
+ editColumn: 1,
22
+ insertText: getBlockQuotePrefixText(ctx.tree, firstLineNumber),
23
+ },
24
+ });
25
+ }
26
+ // Look for a blank line below the table.
27
+ const lastLineNumber = table.endLine;
28
+ if (!isBlankLine(lines[lastLineNumber])) {
29
+ ctx.onError({
30
+ line: lastLineNumber,
31
+ context: (lines[lastLineNumber - 1] ?? '').trim(),
32
+ fixInfo: {
33
+ lineNumber: lastLineNumber + 1,
34
+ editColumn: 1,
35
+ insertText: getBlockQuotePrefixText(ctx.tree, lastLineNumber),
36
+ },
37
+ });
38
+ }
39
+ }
40
+ },
41
+ };
42
+ //# sourceMappingURL=blanks-around-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blanks-around-tables.js","sourceRoot":"","sources":["../../../src/rules/token/blanks-around-tables.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE;QACR,OAAO,EAAE,4CAA4C;KACtD;IACD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;QAEtB,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACvD,yCAAyC;YACzC,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,OAAO,CAAC;oBACV,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;oBAClD,OAAO,EAAE;wBACP,UAAU,EAAE,eAAe;wBAC3B,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC;qBAC/D;iBACF,CAAC,CAAC;YACL,CAAC;YAED,yCAAyC;YACzC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,OAAO,CAAC;oBACV,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;oBACjD,OAAO,EAAE;wBACP,UAAU,EAAE,cAAc,GAAG,CAAC;wBAC9B,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC;qBAC9D;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TokenRule } from '../types.js';
2
+ export declare const codeBlockStyle: TokenRule;
3
+ //# sourceMappingURL=code-block-style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-block-style.d.ts","sourceRoot":"","sources":["../../../src/rules/token/code-block-style.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,eAAO,MAAM,cAAc,EAAE,SAwB5B,CAAC"}