@temelj/mdx 0.14.0 → 0.15.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 (373) hide show
  1. package/README.md +468 -82
  2. package/dist/character-entities.d.mts +4 -0
  3. package/dist/character-entities.d.mts.map +1 -0
  4. package/dist/character-entities.mjs +2132 -0
  5. package/dist/character-entities.mjs.map +1 -0
  6. package/dist/character-reference.d.mts +6 -0
  7. package/dist/character-reference.d.mts.map +1 -0
  8. package/dist/character-reference.mjs +18 -0
  9. package/dist/character-reference.mjs.map +1 -0
  10. package/dist/compile-analysis.d.mts +28 -0
  11. package/dist/compile-analysis.d.mts.map +1 -0
  12. package/dist/compile-analysis.mjs +74 -0
  13. package/dist/compile-analysis.mjs.map +1 -0
  14. package/dist/compile-emit.d.mts +9 -0
  15. package/dist/compile-emit.d.mts.map +1 -0
  16. package/dist/compile-emit.mjs +187 -0
  17. package/dist/compile-emit.mjs.map +1 -0
  18. package/dist/compile-esm.d.mts +34 -0
  19. package/dist/compile-esm.d.mts.map +1 -0
  20. package/dist/compile-esm.mjs +187 -0
  21. package/dist/compile-esm.mjs.map +1 -0
  22. package/dist/compile-names.d.mts +13 -0
  23. package/dist/compile-names.d.mts.map +1 -0
  24. package/dist/compile-names.mjs +32 -0
  25. package/dist/compile-names.mjs.map +1 -0
  26. package/dist/compiler.d.mts +69 -85
  27. package/dist/compiler.d.mts.map +1 -1
  28. package/dist/compiler.mjs +185 -418
  29. package/dist/compiler.mjs.map +1 -1
  30. package/dist/diagnostics.d.mts +37 -0
  31. package/dist/diagnostics.d.mts.map +1 -0
  32. package/dist/diagnostics.mjs +57 -0
  33. package/dist/diagnostics.mjs.map +1 -0
  34. package/dist/errors.d.mts +157 -0
  35. package/dist/errors.d.mts.map +1 -0
  36. package/dist/errors.mjs +263 -0
  37. package/dist/errors.mjs.map +1 -0
  38. package/dist/footnote-numbering.d.mts +27 -0
  39. package/dist/footnote-numbering.d.mts.map +1 -0
  40. package/dist/footnote-numbering.mjs +49 -0
  41. package/dist/footnote-numbering.mjs.map +1 -0
  42. package/dist/format-context.d.mts +46 -0
  43. package/dist/format-context.d.mts.map +1 -0
  44. package/dist/format-context.mjs +26 -0
  45. package/dist/format-context.mjs.map +1 -0
  46. package/dist/format-directive.d.mts +9 -0
  47. package/dist/format-directive.d.mts.map +1 -0
  48. package/dist/format-directive.mjs +99 -0
  49. package/dist/format-directive.mjs.map +1 -0
  50. package/dist/format-jsx.d.mts +8 -0
  51. package/dist/format-jsx.d.mts.map +1 -0
  52. package/dist/format-jsx.mjs +47 -0
  53. package/dist/format-jsx.mjs.map +1 -0
  54. package/dist/format-math.d.mts +9 -0
  55. package/dist/format-math.d.mts.map +1 -0
  56. package/dist/format-math.mjs +79 -0
  57. package/dist/format-math.mjs.map +1 -0
  58. package/dist/format-safe.d.mts +25 -0
  59. package/dist/format-safe.d.mts.map +1 -0
  60. package/dist/format-safe.mjs +366 -0
  61. package/dist/format-safe.mjs.map +1 -0
  62. package/dist/format-table.d.mts +8 -0
  63. package/dist/format-table.d.mts.map +1 -0
  64. package/dist/format-table.mjs +55 -0
  65. package/dist/format-table.mjs.map +1 -0
  66. package/dist/format-track.d.mts +18 -0
  67. package/dist/format-track.d.mts.map +1 -0
  68. package/dist/format-track.mjs +34 -0
  69. package/dist/format-track.mjs.map +1 -0
  70. package/dist/format.d.mts +7 -0
  71. package/dist/format.d.mts.map +1 -0
  72. package/dist/format.mjs +549 -0
  73. package/dist/format.mjs.map +1 -0
  74. package/dist/frontmatter.d.mts +15 -0
  75. package/dist/frontmatter.d.mts.map +1 -0
  76. package/dist/frontmatter.mjs +187 -0
  77. package/dist/frontmatter.mjs.map +1 -0
  78. package/dist/heading.d.mts +6 -0
  79. package/dist/heading.d.mts.map +1 -0
  80. package/dist/heading.mjs +19 -0
  81. package/dist/heading.mjs.map +1 -0
  82. package/dist/html-format.d.mts +32 -0
  83. package/dist/html-format.d.mts.map +1 -0
  84. package/dist/html-format.mjs +127 -0
  85. package/dist/html-format.mjs.map +1 -0
  86. package/dist/html-lower.d.mts +78 -0
  87. package/dist/html-lower.d.mts.map +1 -0
  88. package/dist/html-lower.mjs +583 -0
  89. package/dist/html-lower.mjs.map +1 -0
  90. package/dist/html-stream.d.mts +13 -0
  91. package/dist/html-stream.d.mts.map +1 -0
  92. package/dist/html-stream.mjs +32 -0
  93. package/dist/html-stream.mjs.map +1 -0
  94. package/dist/html.d.mts +120 -0
  95. package/dist/html.d.mts.map +1 -0
  96. package/dist/html.mjs +77 -0
  97. package/dist/html.mjs.map +1 -0
  98. package/dist/identifier.d.mts +4 -0
  99. package/dist/identifier.d.mts.map +1 -0
  100. package/dist/identifier.mjs +8 -0
  101. package/dist/identifier.mjs.map +1 -0
  102. package/dist/javascript-ast.d.mts +16 -0
  103. package/dist/javascript-ast.d.mts.map +1 -0
  104. package/dist/javascript-ast.mjs +39 -0
  105. package/dist/javascript-ast.mjs.map +1 -0
  106. package/dist/javascript-jsx.d.mts +24 -0
  107. package/dist/javascript-jsx.d.mts.map +1 -0
  108. package/dist/javascript-jsx.mjs +189 -0
  109. package/dist/javascript-jsx.mjs.map +1 -0
  110. package/dist/javascript.d.mts +9 -0
  111. package/dist/javascript.d.mts.map +1 -0
  112. package/dist/javascript.mjs +31 -0
  113. package/dist/javascript.mjs.map +1 -0
  114. package/dist/jsx-reference.d.mts +15 -0
  115. package/dist/jsx-reference.d.mts.map +1 -0
  116. package/dist/jsx-reference.mjs +31 -0
  117. package/dist/jsx-reference.mjs.map +1 -0
  118. package/dist/mod.d.mts +25 -9
  119. package/dist/mod.mjs +19 -8
  120. package/dist/model.d.mts +196 -0
  121. package/dist/model.d.mts.map +1 -0
  122. package/dist/model.mjs +113 -0
  123. package/dist/model.mjs.map +1 -0
  124. package/dist/parser/block-container-recognizers.d.mts +40 -0
  125. package/dist/parser/block-container-recognizers.d.mts.map +1 -0
  126. package/dist/parser/block-container-recognizers.mjs +90 -0
  127. package/dist/parser/block-container-recognizers.mjs.map +1 -0
  128. package/dist/parser/block-directive-recognizers.d.mts +22 -0
  129. package/dist/parser/block-directive-recognizers.d.mts.map +1 -0
  130. package/dist/parser/block-directive-recognizers.mjs +77 -0
  131. package/dist/parser/block-directive-recognizers.mjs.map +1 -0
  132. package/dist/parser/block-leaf-recognizers.d.mts +53 -0
  133. package/dist/parser/block-leaf-recognizers.d.mts.map +1 -0
  134. package/dist/parser/block-leaf-recognizers.mjs +386 -0
  135. package/dist/parser/block-leaf-recognizers.mjs.map +1 -0
  136. package/dist/parser/block-parser.d.mts +38 -0
  137. package/dist/parser/block-parser.d.mts.map +1 -0
  138. package/dist/parser/block-parser.mjs +895 -0
  139. package/dist/parser/block-parser.mjs.map +1 -0
  140. package/dist/parser/block-syntax.d.mts +240 -0
  141. package/dist/parser/block-syntax.d.mts.map +1 -0
  142. package/dist/parser/characters.d.mts +19 -0
  143. package/dist/parser/characters.d.mts.map +1 -0
  144. package/dist/parser/characters.mjs +52 -0
  145. package/dist/parser/characters.mjs.map +1 -0
  146. package/dist/parser/config.d.mts +16 -0
  147. package/dist/parser/config.d.mts.map +1 -0
  148. package/dist/parser/config.mjs +25 -0
  149. package/dist/parser/config.mjs.map +1 -0
  150. package/dist/parser/directive-attributes.d.mts +9 -0
  151. package/dist/parser/directive-attributes.d.mts.map +1 -0
  152. package/dist/parser/directive-attributes.mjs +24 -0
  153. package/dist/parser/directive-attributes.mjs.map +1 -0
  154. package/dist/parser/embedded-scanner.d.mts +18 -0
  155. package/dist/parser/embedded-scanner.d.mts.map +1 -0
  156. package/dist/parser/embedded-scanner.mjs +199 -0
  157. package/dist/parser/embedded-scanner.mjs.map +1 -0
  158. package/dist/parser/inline-autolink.d.mts +7 -0
  159. package/dist/parser/inline-autolink.d.mts.map +1 -0
  160. package/dist/parser/inline-autolink.mjs +42 -0
  161. package/dist/parser/inline-autolink.mjs.map +1 -0
  162. package/dist/parser/inline-character-reference.d.mts +7 -0
  163. package/dist/parser/inline-character-reference.d.mts.map +1 -0
  164. package/dist/parser/inline-character-reference.mjs +22 -0
  165. package/dist/parser/inline-character-reference.mjs.map +1 -0
  166. package/dist/parser/inline-code.d.mts +7 -0
  167. package/dist/parser/inline-code.d.mts.map +1 -0
  168. package/dist/parser/inline-code.mjs +29 -0
  169. package/dist/parser/inline-code.mjs.map +1 -0
  170. package/dist/parser/inline-directive.d.mts +9 -0
  171. package/dist/parser/inline-directive.d.mts.map +1 -0
  172. package/dist/parser/inline-directive.mjs +45 -0
  173. package/dist/parser/inline-directive.mjs.map +1 -0
  174. package/dist/parser/inline-embedded.d.mts +19 -0
  175. package/dist/parser/inline-embedded.d.mts.map +1 -0
  176. package/dist/parser/inline-embedded.mjs +92 -0
  177. package/dist/parser/inline-embedded.mjs.map +1 -0
  178. package/dist/parser/inline-emphasis.d.mts +11 -0
  179. package/dist/parser/inline-emphasis.d.mts.map +1 -0
  180. package/dist/parser/inline-emphasis.mjs +79 -0
  181. package/dist/parser/inline-emphasis.mjs.map +1 -0
  182. package/dist/parser/inline-input.d.mts +46 -0
  183. package/dist/parser/inline-input.d.mts.map +1 -0
  184. package/dist/parser/inline-input.mjs +137 -0
  185. package/dist/parser/inline-input.mjs.map +1 -0
  186. package/dist/parser/inline-link.d.mts +12 -0
  187. package/dist/parser/inline-link.d.mts.map +1 -0
  188. package/dist/parser/inline-link.mjs +187 -0
  189. package/dist/parser/inline-link.mjs.map +1 -0
  190. package/dist/parser/inline-math.d.mts +10 -0
  191. package/dist/parser/inline-math.d.mts.map +1 -0
  192. package/dist/parser/inline-math.mjs +46 -0
  193. package/dist/parser/inline-math.mjs.map +1 -0
  194. package/dist/parser/inline-output.d.mts +34 -0
  195. package/dist/parser/inline-output.d.mts.map +1 -0
  196. package/dist/parser/inline-output.mjs +62 -0
  197. package/dist/parser/inline-output.mjs.map +1 -0
  198. package/dist/parser/inline-parser.d.mts +14 -0
  199. package/dist/parser/inline-parser.d.mts.map +1 -0
  200. package/dist/parser/inline-parser.mjs +328 -0
  201. package/dist/parser/inline-parser.mjs.map +1 -0
  202. package/dist/parser/inline-pending.d.mts +23 -0
  203. package/dist/parser/inline-pending.d.mts.map +1 -0
  204. package/dist/parser/inline-pending.mjs +100 -0
  205. package/dist/parser/inline-pending.mjs.map +1 -0
  206. package/dist/parser/inline-syntax.d.mts +118 -0
  207. package/dist/parser/inline-syntax.d.mts.map +1 -0
  208. package/dist/parser/inline-syntax.mjs +1 -0
  209. package/dist/parser/javascript-boundary.d.mts +16 -0
  210. package/dist/parser/javascript-boundary.d.mts.map +1 -0
  211. package/dist/parser/javascript-boundary.mjs +42 -0
  212. package/dist/parser/javascript-boundary.mjs.map +1 -0
  213. package/dist/parser/javascript-scanner.d.mts +22 -0
  214. package/dist/parser/javascript-scanner.d.mts.map +1 -0
  215. package/dist/parser/javascript-scanner.mjs +122 -0
  216. package/dist/parser/javascript-scanner.mjs.map +1 -0
  217. package/dist/parser/materialize-cache.d.mts +34 -0
  218. package/dist/parser/materialize-cache.d.mts.map +1 -0
  219. package/dist/parser/materialize-cache.mjs +12 -0
  220. package/dist/parser/materialize-cache.mjs.map +1 -0
  221. package/dist/parser/materialize-jsx.d.mts +14 -0
  222. package/dist/parser/materialize-jsx.d.mts.map +1 -0
  223. package/dist/parser/materialize-jsx.mjs +76 -0
  224. package/dist/parser/materialize-jsx.mjs.map +1 -0
  225. package/dist/parser/materialize.d.mts +61 -0
  226. package/dist/parser/materialize.d.mts.map +1 -0
  227. package/dist/parser/materialize.mjs +736 -0
  228. package/dist/parser/materialize.mjs.map +1 -0
  229. package/dist/parser/recognizer.d.mts +20 -0
  230. package/dist/parser/recognizer.d.mts.map +1 -0
  231. package/dist/parser/recognizer.mjs +24 -0
  232. package/dist/parser/recognizer.mjs.map +1 -0
  233. package/dist/parser/session.d.mts +42 -0
  234. package/dist/parser/session.d.mts.map +1 -0
  235. package/dist/parser/session.mjs +89 -0
  236. package/dist/parser/session.mjs.map +1 -0
  237. package/dist/parser.d.mts +25 -0
  238. package/dist/parser.d.mts.map +1 -0
  239. package/dist/parser.mjs +37 -0
  240. package/dist/parser.mjs.map +1 -0
  241. package/dist/plugin-internal.d.mts +25 -0
  242. package/dist/plugin-internal.d.mts.map +1 -0
  243. package/dist/plugin-internal.mjs +99 -0
  244. package/dist/plugin-internal.mjs.map +1 -0
  245. package/dist/plugin.d.mts +37 -0
  246. package/dist/plugin.d.mts.map +1 -0
  247. package/dist/plugin.mjs +1 -0
  248. package/dist/plugins/code-block-metadata.d.mts +42 -0
  249. package/dist/plugins/code-block-metadata.d.mts.map +1 -0
  250. package/dist/plugins/code-block-metadata.mjs +133 -0
  251. package/dist/plugins/code-block-metadata.mjs.map +1 -0
  252. package/dist/plugins/heading-id.d.mts +15 -0
  253. package/dist/plugins/heading-id.d.mts.map +1 -0
  254. package/dist/plugins/heading-id.mjs +45 -0
  255. package/dist/plugins/heading-id.mjs.map +1 -0
  256. package/dist/plugins/lower-heading.d.mts +16 -0
  257. package/dist/plugins/lower-heading.d.mts.map +1 -0
  258. package/dist/plugins/lower-heading.mjs +28 -0
  259. package/dist/plugins/lower-heading.mjs.map +1 -0
  260. package/dist/plugins/math-render.d.mts +26 -0
  261. package/dist/plugins/math-render.d.mts.map +1 -0
  262. package/dist/plugins/math-render.mjs +51 -0
  263. package/dist/plugins/math-render.mjs.map +1 -0
  264. package/dist/plugins/mod.d.mts +9 -6
  265. package/dist/plugins/mod.mjs +8 -6
  266. package/dist/plugins/remove-esm.d.mts +10 -0
  267. package/dist/plugins/remove-esm.d.mts.map +1 -0
  268. package/dist/plugins/remove-esm.mjs +12 -0
  269. package/dist/plugins/remove-esm.mjs.map +1 -0
  270. package/dist/plugins/shiki.d.mts +21 -0
  271. package/dist/plugins/shiki.d.mts.map +1 -0
  272. package/dist/plugins/shiki.mjs +144 -0
  273. package/dist/plugins/shiki.mjs.map +1 -0
  274. package/dist/plugins/syntax-highlight.d.mts +38 -0
  275. package/dist/plugins/syntax-highlight.d.mts.map +1 -0
  276. package/dist/plugins/syntax-highlight.mjs +106 -0
  277. package/dist/plugins/syntax-highlight.mjs.map +1 -0
  278. package/dist/processor.d.mts +60 -0
  279. package/dist/processor.d.mts.map +1 -0
  280. package/dist/processor.mjs +106 -0
  281. package/dist/processor.mjs.map +1 -0
  282. package/dist/ranges.d.mts +10 -0
  283. package/dist/ranges.d.mts.map +1 -0
  284. package/dist/ranges.mjs +22 -0
  285. package/dist/ranges.mjs.map +1 -0
  286. package/dist/source-map.d.mts +28 -0
  287. package/dist/source-map.d.mts.map +1 -0
  288. package/dist/source-map.mjs +90 -0
  289. package/dist/source-map.mjs.map +1 -0
  290. package/dist/source-text.d.mts +35 -0
  291. package/dist/source-text.d.mts.map +1 -0
  292. package/dist/source-text.mjs +132 -0
  293. package/dist/source-text.mjs.map +1 -0
  294. package/dist/source.d.mts +86 -0
  295. package/dist/source.d.mts.map +1 -0
  296. package/dist/source.mjs +264 -0
  297. package/dist/source.mjs.map +1 -0
  298. package/dist/stream-events.d.mts +59 -0
  299. package/dist/stream-events.d.mts.map +1 -0
  300. package/dist/stream-events.mjs +115 -0
  301. package/dist/stream-events.mjs.map +1 -0
  302. package/dist/stream-session.d.mts +79 -0
  303. package/dist/stream-session.d.mts.map +1 -0
  304. package/dist/stream-session.mjs +904 -0
  305. package/dist/stream-session.mjs.map +1 -0
  306. package/dist/stream-tail.d.mts +84 -0
  307. package/dist/stream-tail.d.mts.map +1 -0
  308. package/dist/stream-tail.mjs +359 -0
  309. package/dist/stream-tail.mjs.map +1 -0
  310. package/dist/stream-types.d.mts +89 -0
  311. package/dist/stream-types.d.mts.map +1 -0
  312. package/dist/stream-types.mjs +1 -0
  313. package/dist/stream.d.mts +28 -0
  314. package/dist/stream.d.mts.map +1 -0
  315. package/dist/stream.mjs +68 -0
  316. package/dist/stream.mjs.map +1 -0
  317. package/dist/syntax-options.d.mts +21 -0
  318. package/dist/syntax-options.d.mts.map +1 -0
  319. package/dist/syntax-options.mjs +26 -0
  320. package/dist/syntax-options.mjs.map +1 -0
  321. package/dist/traversal.d.mts +25 -0
  322. package/dist/traversal.d.mts.map +1 -0
  323. package/dist/traversal.mjs +136 -0
  324. package/dist/traversal.mjs.map +1 -0
  325. package/dist/tree.d.mts +18 -0
  326. package/dist/tree.d.mts.map +1 -0
  327. package/dist/tree.mjs +43 -0
  328. package/dist/tree.mjs.map +1 -0
  329. package/dist/unified/adapter.d.mts +24 -0
  330. package/dist/unified/adapter.d.mts.map +1 -0
  331. package/dist/unified/adapter.mjs +44 -0
  332. package/dist/unified/adapter.mjs.map +1 -0
  333. package/dist/unified/mod.d.mts +2 -0
  334. package/dist/unified/mod.mjs +1 -0
  335. package/dist/unified/runtime.d.mts +10 -0
  336. package/dist/unified/runtime.d.mts.map +1 -0
  337. package/dist/unified/runtime.mjs +115 -0
  338. package/dist/unified/runtime.mjs.map +1 -0
  339. package/dist/unified/tree-bridge.d.mts +63 -0
  340. package/dist/unified/tree-bridge.d.mts.map +1 -0
  341. package/dist/unified/tree-bridge.mjs +876 -0
  342. package/dist/unified/tree-bridge.mjs.map +1 -0
  343. package/dist/uri.d.mts +5 -0
  344. package/dist/uri.d.mts.map +1 -0
  345. package/dist/uri.mjs +32 -0
  346. package/dist/uri.mjs.map +1 -0
  347. package/package.json +56 -30
  348. package/dist/plugins/heading-id/plugin.d.mts +0 -17
  349. package/dist/plugins/heading-id/plugin.d.mts.map +0 -1
  350. package/dist/plugins/heading-id/plugin.mjs +0 -23
  351. package/dist/plugins/heading-id/plugin.mjs.map +0 -1
  352. package/dist/plugins/katex/plugin.d.mts +0 -39
  353. package/dist/plugins/katex/plugin.d.mts.map +0 -1
  354. package/dist/plugins/katex/plugin.mjs +0 -107
  355. package/dist/plugins/katex/plugin.mjs.map +0 -1
  356. package/dist/plugins/remove-imports-exports.d.mts +0 -10
  357. package/dist/plugins/remove-imports-exports.d.mts.map +0 -1
  358. package/dist/plugins/remove-imports-exports.mjs +0 -15
  359. package/dist/plugins/remove-imports-exports.mjs.map +0 -1
  360. package/dist/plugins/syntax-highlight/code-meta.d.mts +0 -22
  361. package/dist/plugins/syntax-highlight/code-meta.d.mts.map +0 -1
  362. package/dist/plugins/syntax-highlight/code-meta.mjs +0 -38
  363. package/dist/plugins/syntax-highlight/code-meta.mjs.map +0 -1
  364. package/dist/plugins/syntax-highlight/plugin.d.mts +0 -57
  365. package/dist/plugins/syntax-highlight/plugin.d.mts.map +0 -1
  366. package/dist/plugins/syntax-highlight/plugin.mjs +0 -93
  367. package/dist/plugins/syntax-highlight/plugin.mjs.map +0 -1
  368. package/dist/plugins/tree-processor/plugin.d.mts +0 -19
  369. package/dist/plugins/tree-processor/plugin.d.mts.map +0 -1
  370. package/dist/plugins/tree-processor/plugin.mjs +0 -21
  371. package/dist/plugins/tree-processor/plugin.mjs.map +0 -1
  372. package/dist/types.d.mts +0 -2
  373. /package/dist/{types.mjs → parser/block-syntax.mjs} +0 -0
@@ -0,0 +1,386 @@
1
+ import { normalizeIdentifier } from "../identifier.mjs";
2
+ import { sourceRange } from "../ranges.mjs";
3
+ import { consumeIndent, findUnescaped, isEscaped, isSpaceOrTab } from "./characters.mjs";
4
+ import { matched, noMatch } from "./recognizer.mjs";
5
+ //#region src/parser/block-leaf-recognizers.ts
6
+ const recognizeRawHtml = (source, line) => {
7
+ const content = source.slice(line.content.start, line.content.end);
8
+ const indent = leadingIndent(content);
9
+ if (indent > 3) return noMatch;
10
+ const value = content.slice(indent);
11
+ const closing = value.startsWith("<!--") ? "-->" : value.startsWith("<?") ? "?>" : value.startsWith("<![CDATA[") ? "]]>" : /^<![A-Z]/u.test(value) ? ">" : void 0;
12
+ if (closing === void 0) return noMatch;
13
+ const range = sourceRange(line.range.start, line.range.end);
14
+ return value.includes(closing, 2) ? matched({
15
+ kind: "block",
16
+ block: {
17
+ kind: "rawHtml",
18
+ range
19
+ }
20
+ }) : matched({
21
+ kind: "openLeaf",
22
+ leaf: {
23
+ kind: "html",
24
+ start: line.range.start,
25
+ end: line.range.end,
26
+ closing
27
+ }
28
+ });
29
+ };
30
+ function matchFrontmatter(source, line, syntax) {
31
+ const value = source.slice(line.content.start, line.content.end).trim();
32
+ const format = value === "---" ? "yaml" : value === "+++" ? "toml" : void 0;
33
+ if (format === void 0 || !syntax.frontmatter.includes(format)) return;
34
+ return {
35
+ kind: "frontmatter",
36
+ start: line.range.start,
37
+ end: line.range.end,
38
+ valueStart: line.range.end,
39
+ valueEnd: line.range.end,
40
+ format,
41
+ fence: format === "yaml" ? "---" : "+++"
42
+ };
43
+ }
44
+ function recognizeFrontmatter(source, line, syntax) {
45
+ const match = matchFrontmatter(source, line, syntax);
46
+ return match === void 0 ? noMatch : matched(match);
47
+ }
48
+ function matchMathFence(source, line, syntax) {
49
+ const content = source.slice(line.content.start, line.content.end);
50
+ const indent = leadingIndent(content);
51
+ if (indent > 3) return;
52
+ if (syntax.math.includes("tex") && content.slice(indent).trim() === "\\[") return {
53
+ kind: "math",
54
+ start: line.range.start,
55
+ end: line.range.end,
56
+ value: [],
57
+ format: "tex",
58
+ fence: "tex",
59
+ fenceLength: 2,
60
+ meta: void 0
61
+ };
62
+ if (!syntax.math.includes("dollar") || content[indent] !== "$") return;
63
+ let markerEnd = indent;
64
+ while (content[markerEnd] === "$") markerEnd++;
65
+ const fenceLength = markerEnd - indent;
66
+ if (fenceLength < 2) return;
67
+ let metaStart = markerEnd;
68
+ while (isSpaceOrTab(content[metaStart])) metaStart++;
69
+ return {
70
+ kind: "math",
71
+ start: line.range.start,
72
+ end: line.range.end,
73
+ value: [],
74
+ format: "dollar",
75
+ fence: "dollar",
76
+ fenceLength,
77
+ meta: metaStart === content.length ? void 0 : sourceRange(line.content.start + metaStart, line.content.end)
78
+ };
79
+ }
80
+ function recognizeMathFence(source, line, syntax) {
81
+ const match = matchMathFence(source, line, syntax);
82
+ return match === void 0 ? noMatch : matched(match);
83
+ }
84
+ function matchSameLineMath(source, line, syntax) {
85
+ const content = source.slice(line.content.start, line.content.end);
86
+ const indent = leadingIndent(content);
87
+ if (indent > 3) return;
88
+ const value = content.slice(indent);
89
+ const trimmed = value.trimEnd();
90
+ if (syntax.math.includes("tex") && trimmed.startsWith("\\[") && trimmed.endsWith("\\]") && trimmed.length > 4) return {
91
+ kind: "math",
92
+ range: sourceRange(line.range.start, line.content.end),
93
+ value: [{
94
+ kind: "source",
95
+ range: sourceRange(line.content.start + indent + 2, line.content.start + indent + trimmed.length - 2)
96
+ }],
97
+ format: "tex",
98
+ meta: void 0
99
+ };
100
+ if (!syntax.math.includes("dollar") || !value.startsWith("$$")) return;
101
+ let fenceLength = 0;
102
+ while (value[fenceLength] === "$") fenceLength++;
103
+ let closingStart = value.length;
104
+ while (value[closingStart - 1] === "$") closingStart--;
105
+ if (value.length - closingStart < fenceLength || closingStart <= fenceLength) return;
106
+ return {
107
+ kind: "math",
108
+ range: sourceRange(line.range.start, line.content.end),
109
+ value: [{
110
+ kind: "source",
111
+ range: sourceRange(line.content.start + indent + fenceLength, line.content.start + indent + closingStart)
112
+ }],
113
+ format: "dollar",
114
+ meta: void 0
115
+ };
116
+ }
117
+ function recognizeSameLineMath(source, line, syntax) {
118
+ const match = matchSameLineMath(source, line, syntax);
119
+ return match === void 0 ? noMatch : matched(match);
120
+ }
121
+ function trimLineEndingOffset(source, end) {
122
+ return source.char(end - 1) === "\n" && source.char(end - 2) === "\r" ? end - 2 : source.char(end - 1) === "\n" || source.char(end - 1) === "\r" ? end - 1 : end;
123
+ }
124
+ function isClosingMathFence(source, line, active) {
125
+ const content = source.slice(line.content.start, line.content.end);
126
+ const indent = leadingIndent(content);
127
+ if (indent > 3) return false;
128
+ if (active.fence === "tex") return content.slice(indent).trim() === "\\]";
129
+ let markerEnd = indent;
130
+ while (content[markerEnd] === "$") markerEnd++;
131
+ if (markerEnd - indent < active.fenceLength) return false;
132
+ while (isSpaceOrTab(content[markerEnd])) markerEnd++;
133
+ return markerEnd === content.length;
134
+ }
135
+ const recognizeDefinition = (source, line) => {
136
+ const end = line.content.end;
137
+ const labelStart = consumeIndent(source, line.content.start, end, 3).offset;
138
+ if (source.char(labelStart) !== "[") return noMatch;
139
+ const labelEnd = findUnescaped(source, "]", labelStart + 1, end);
140
+ if (labelEnd === void 0 || labelEnd === labelStart + 1 || labelEnd - labelStart > 1e3 || source.char(labelEnd + 1) !== ":" || source.char(labelStart + 1) === "^") return noMatch;
141
+ let cursor = labelEnd + 2;
142
+ while (cursor < end && isSpaceOrTab(source.char(cursor))) cursor++;
143
+ const destination = definitionDestination(source, cursor, end);
144
+ if (destination === void 0) return noMatch;
145
+ cursor = destination.next;
146
+ const beforeTitle = cursor;
147
+ while (cursor < end && isSpaceOrTab(source.char(cursor))) cursor++;
148
+ let title;
149
+ if (cursor < end) {
150
+ if (cursor === beforeTitle) return noMatch;
151
+ const opener = source.char(cursor);
152
+ const closer = opener === "(" ? ")" : opener === "\"" ? "\"" : opener === "'" ? "'" : void 0;
153
+ if (closer === void 0) return noMatch;
154
+ const titleEnd = findUnescaped(source, closer, cursor + 1, end);
155
+ if (titleEnd === void 0) return noMatch;
156
+ title = sourceRange(cursor + 1, titleEnd);
157
+ cursor = titleEnd + 1;
158
+ while (cursor < end && isSpaceOrTab(source.char(cursor))) cursor++;
159
+ }
160
+ if (cursor !== end) return noMatch;
161
+ return matched({
162
+ kind: "block",
163
+ block: {
164
+ kind: "definition",
165
+ range: sourceRange(line.range.start, line.content.end),
166
+ identifier: normalizeIdentifier(source.slice(labelStart + 1, labelEnd)),
167
+ destination: destination.range,
168
+ title
169
+ }
170
+ });
171
+ };
172
+ function definitionDestination(source, start, end) {
173
+ if (source.char(start) === "<") {
174
+ const close = findUnescaped(source, ">", start + 1, end);
175
+ return close === void 0 ? void 0 : {
176
+ range: sourceRange(start + 1, close),
177
+ next: close + 1
178
+ };
179
+ }
180
+ let cursor = start;
181
+ let depth = 0;
182
+ while (cursor < end && !isSpaceOrTab(source.char(cursor))) {
183
+ const character = source.char(cursor);
184
+ if (character === "(" && !isEscaped(source, cursor, start)) {
185
+ depth++;
186
+ if (depth > 32) return;
187
+ } else if (character === ")" && !isEscaped(source, cursor, start)) {
188
+ if (depth === 0) break;
189
+ depth--;
190
+ }
191
+ cursor++;
192
+ }
193
+ return cursor === start || depth !== 0 ? void 0 : {
194
+ range: sourceRange(start, cursor),
195
+ next: cursor
196
+ };
197
+ }
198
+ const recognizeAtxHeading = (source, line) => {
199
+ const content = source.slice(line.content.start, line.content.end);
200
+ const indent = leadingIndent(content);
201
+ if (indent > 3 || content[indent] !== "#") return noMatch;
202
+ let markerEnd = indent;
203
+ while (content[markerEnd] === "#") markerEnd++;
204
+ const depth = markerEnd - indent;
205
+ if (depth > 6 || markerEnd < content.length && !isSpaceOrTab(content[markerEnd])) return noMatch;
206
+ let valueStart = markerEnd;
207
+ while (isSpaceOrTab(content[valueStart])) valueStart++;
208
+ let valueEnd = content.length;
209
+ while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) valueEnd--;
210
+ let closingStart = valueEnd;
211
+ while (content[closingStart - 1] === "#") closingStart--;
212
+ if (closingStart < valueEnd && (closingStart === valueStart || isSpaceOrTab(content[closingStart - 1]))) {
213
+ valueEnd = closingStart;
214
+ while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) valueEnd--;
215
+ }
216
+ const inputRange = sourceRange(line.content.start + valueStart, line.content.start + valueEnd);
217
+ return matched({
218
+ kind: "block",
219
+ block: {
220
+ kind: "heading",
221
+ range: sourceRange(line.range.start, line.content.end),
222
+ depth: headingDepth(depth),
223
+ input: [{
224
+ kind: "source",
225
+ range: inputRange
226
+ }]
227
+ }
228
+ });
229
+ };
230
+ const recognizeThematicBreak = (source, line) => {
231
+ const content = source.slice(line.content.start, line.content.end);
232
+ const indent = leadingIndent(content);
233
+ const marker = content[indent];
234
+ if (indent > 3 || marker !== "*" && marker !== "-" && marker !== "_") return noMatch;
235
+ let count = 0;
236
+ for (let index = indent; index < content.length; index++) {
237
+ const character = content[index];
238
+ if (character === marker) count++;
239
+ else if (!isSpaceOrTab(character)) return noMatch;
240
+ }
241
+ return count < 3 ? noMatch : matched({
242
+ kind: "block",
243
+ block: {
244
+ kind: "thematicBreak",
245
+ range: sourceRange(line.range.start, line.content.end)
246
+ }
247
+ });
248
+ };
249
+ const recognizeFence = (source, line) => {
250
+ const content = source.slice(line.content.start, line.content.end);
251
+ const indent = leadingIndent(content);
252
+ const marker = content[indent];
253
+ if (indent > 3 || marker !== "`" && marker !== "~") return noMatch;
254
+ let markerEnd = indent;
255
+ while (content[markerEnd] === marker) markerEnd++;
256
+ const fenceLength = markerEnd - indent;
257
+ if (fenceLength < 3 || marker === "`" && content.slice(markerEnd).includes("`")) return noMatch;
258
+ let infoStart = markerEnd;
259
+ while (isSpaceOrTab(content[infoStart])) infoStart++;
260
+ let languageEnd = infoStart;
261
+ while (languageEnd < content.length && !isSpaceOrTab(content[languageEnd])) languageEnd++;
262
+ let metaStart = languageEnd;
263
+ while (isSpaceOrTab(content[metaStart])) metaStart++;
264
+ return matched({
265
+ kind: "openLeaf",
266
+ leaf: {
267
+ kind: "fencedCode",
268
+ start: line.range.start,
269
+ end: line.range.end,
270
+ value: [],
271
+ marker,
272
+ fenceLength,
273
+ language: languageEnd === infoStart ? void 0 : sourceRange(line.content.start + infoStart, line.content.start + languageEnd),
274
+ meta: metaStart === content.length ? void 0 : sourceRange(line.content.start + metaStart, line.content.end)
275
+ }
276
+ });
277
+ };
278
+ function recognizeTable(source, line, paragraph) {
279
+ if (paragraph.lines.length !== 1) return noMatch;
280
+ const headerSegment = paragraph.lines[0];
281
+ if (headerSegment.kind !== "source") return noMatch;
282
+ const header = tableRow(source, headerSegment.range);
283
+ const delimiterCells = tableCellRanges(source, line.content);
284
+ if (header.cells.length !== delimiterCells.length || delimiterCells.length === 0) return noMatch;
285
+ const alignments = [];
286
+ for (const segments of delimiterCells) {
287
+ const segment = segments[0];
288
+ if (segment?.kind !== "source") return noMatch;
289
+ const value = source.slice(segment.range.start, segment.range.end);
290
+ if (!/^:?-+:?$/u.test(value)) return noMatch;
291
+ alignments.push(value.startsWith(":") ? value.endsWith(":") ? "center" : "left" : value.endsWith(":") ? "right" : "none");
292
+ }
293
+ return matched({
294
+ kind: "table",
295
+ start: paragraph.start,
296
+ end: line.range.end,
297
+ alignments,
298
+ rows: [header]
299
+ });
300
+ }
301
+ function tableRow(source, range) {
302
+ return {
303
+ range,
304
+ cells: tableCellRanges(source, range)
305
+ };
306
+ }
307
+ function tableCellRanges(source, range) {
308
+ let start = range.start;
309
+ let end = range.end;
310
+ while (start < end && isSpaceOrTab(source.char(start))) start++;
311
+ while (end > start && isSpaceOrTab(source.char(end - 1))) end--;
312
+ if (source.char(start) === "|") start++;
313
+ if (source.char(end - 1) === "|" && !isEscaped(source, end - 1, start)) end--;
314
+ const cells = [];
315
+ let cellStart = start;
316
+ let codeFence = 0;
317
+ for (let offset = start; offset <= end; offset++) {
318
+ const character = source.char(offset);
319
+ if (character === "`" && !isEscaped(source, offset, start)) {
320
+ let runEnd = offset;
321
+ while (source.char(runEnd) === "`") runEnd++;
322
+ const run = runEnd - offset;
323
+ codeFence = codeFence === 0 ? run : codeFence === run ? 0 : codeFence;
324
+ offset = runEnd - 1;
325
+ }
326
+ if (offset === end || character === "|" && codeFence === 0 && !isEscaped(source, offset, start)) {
327
+ let valueStart = cellStart;
328
+ let valueEnd = offset;
329
+ while (valueStart < valueEnd && isSpaceOrTab(source.char(valueStart))) valueStart++;
330
+ while (valueEnd > valueStart && isSpaceOrTab(source.char(valueEnd - 1))) valueEnd--;
331
+ cells.push([{
332
+ kind: "source",
333
+ range: sourceRange(valueStart, valueEnd)
334
+ }]);
335
+ cellStart = offset + 1;
336
+ }
337
+ }
338
+ return cells;
339
+ }
340
+ function recognizeSetext(source, line, paragraph) {
341
+ const content = source.slice(line.content.start, line.content.end);
342
+ const indent = leadingIndent(content);
343
+ const marker = content[indent];
344
+ if (indent > 3 || marker !== "=" && marker !== "-") return noMatch;
345
+ let index = indent;
346
+ while (content[index] === marker) index++;
347
+ while (isSpaceOrTab(content[index])) index++;
348
+ if (index !== content.length) return noMatch;
349
+ return matched({
350
+ kind: "heading",
351
+ range: sourceRange(paragraph.start, line.content.end),
352
+ depth: marker === "=" ? 1 : 2,
353
+ input: paragraph.lines
354
+ });
355
+ }
356
+ function isClosingFence(source, line, active) {
357
+ const content = source.slice(line.content.start, line.content.end);
358
+ const indent = leadingIndent(content);
359
+ if (indent > 3 || content[indent] !== active.marker) return false;
360
+ let markerEnd = indent;
361
+ while (content[markerEnd] === active.marker) markerEnd++;
362
+ if (markerEnd - indent < active.fenceLength) return false;
363
+ while (isSpaceOrTab(content[markerEnd])) markerEnd++;
364
+ return markerEnd === content.length;
365
+ }
366
+ function interruptsParagraph(source, line) {
367
+ return [
368
+ recognizeRawHtml,
369
+ recognizeFence,
370
+ recognizeAtxHeading,
371
+ recognizeThematicBreak
372
+ ].some((recognize) => recognize(source, line).kind === "matched");
373
+ }
374
+ function headingDepth(value) {
375
+ if (value === 1 || value === 2 || value === 3 || value === 4 || value === 5 || value === 6) return value;
376
+ throw new Error(`Invalid ATX heading depth ${value}`);
377
+ }
378
+ function leadingIndent(value) {
379
+ let index = 0;
380
+ while (value[index] === " ") index++;
381
+ return index;
382
+ }
383
+ //#endregion
384
+ export { interruptsParagraph, isClosingFence, isClosingMathFence, recognizeAtxHeading, recognizeDefinition, recognizeFence, recognizeFrontmatter, recognizeMathFence, recognizeRawHtml, recognizeSameLineMath, recognizeSetext, recognizeTable, recognizeThematicBreak, tableRow, trimLineEndingOffset };
385
+
386
+ //# sourceMappingURL=block-leaf-recognizers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-leaf-recognizers.mjs","names":[],"sources":["../../src/parser/block-leaf-recognizers.ts"],"sourcesContent":["import type { SourceRange } from \"../ranges.ts\";\nimport type { SourceText } from \"../source-text.ts\";\nimport type { PhysicalLine } from \"../source.ts\";\nimport type { ResolvedSyntaxOptions } from \"../syntax-options.ts\";\nimport type {\n BlockSyntax,\n OpenLeaf,\n TableAlignmentSyntax,\n TableRowSyntax,\n} from \"./block-syntax.ts\";\nimport type { InlineSegment } from \"./inline-input.ts\";\nimport type { RecognizerResult } from \"./recognizer.ts\";\n\nimport { normalizeIdentifier } from \"../identifier.ts\";\nimport { sourceRange } from \"../ranges.ts\";\nimport { consumeIndent } from \"./characters.ts\";\nimport { findUnescaped, isEscaped, isSpaceOrTab } from \"./characters.ts\";\nimport { matched, noMatch } from \"./recognizer.ts\";\n\ninterface RecognizedCompleteBlock {\n readonly kind: \"block\";\n readonly block: BlockSyntax;\n}\n\ninterface RecognizedOpenLeaf {\n readonly kind: \"openLeaf\";\n readonly leaf: Extract<OpenLeaf, { kind: \"fencedCode\" | \"html\" }>;\n}\n\ntype RecognizedBlock = RecognizedCompleteBlock | RecognizedOpenLeaf;\n\ntype BlockRecognizer = (\n source: SourceText,\n line: PhysicalLine,\n) => RecognizerResult<RecognizedBlock>;\n\nexport const recognizeRawHtml: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return noMatch;\n }\n\n const value = content.slice(indent);\n\n const closing = value.startsWith(\"<!--\")\n ? \"-->\"\n : value.startsWith(\"<?\")\n ? \"?>\"\n : value.startsWith(\"<![CDATA[\")\n ? \"]]>\"\n : /^<![A-Z]/u.test(value)\n ? \">\"\n : undefined;\n\n if (closing === undefined) {\n return noMatch;\n }\n\n const range = sourceRange(line.range.start, line.range.end);\n\n return value.includes(closing, 2)\n ? matched({\n kind: \"block\",\n block: { kind: \"rawHtml\", range },\n })\n : matched({\n kind: \"openLeaf\",\n leaf: {\n kind: \"html\",\n start: line.range.start,\n end: line.range.end,\n closing,\n },\n });\n};\n\nfunction matchFrontmatter(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): Extract<OpenLeaf, { kind: \"frontmatter\" }> | undefined {\n const value = source.slice(line.content.start, line.content.end).trim();\n const format = value === \"---\" ? \"yaml\" : value === \"+++\" ? \"toml\" : undefined;\n\n if (format === undefined || !syntax.frontmatter.includes(format)) {\n return;\n }\n\n return {\n kind: \"frontmatter\",\n start: line.range.start,\n end: line.range.end,\n valueStart: line.range.end,\n valueEnd: line.range.end,\n format,\n fence: format === \"yaml\" ? \"---\" : \"+++\",\n };\n}\n\nexport function recognizeFrontmatter(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): RecognizerResult<Extract<OpenLeaf, { kind: \"frontmatter\" }>> {\n const match = matchFrontmatter(source, line, syntax);\n\n return match === undefined ? noMatch : matched(match);\n}\n\nfunction matchMathFence(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): Extract<OpenLeaf, { kind: \"math\" }> | undefined {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return;\n }\n\n if (syntax.math.includes(\"tex\") && content.slice(indent).trim() === \"\\\\[\") {\n return {\n kind: \"math\",\n start: line.range.start,\n end: line.range.end,\n value: [],\n format: \"tex\",\n fence: \"tex\",\n fenceLength: 2,\n meta: undefined,\n };\n }\n\n if (!syntax.math.includes(\"dollar\") || content[indent] !== \"$\") {\n return;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === \"$\") {\n markerEnd++;\n }\n\n const fenceLength = markerEnd - indent;\n\n if (fenceLength < 2) {\n return;\n }\n\n let metaStart = markerEnd;\n\n while (isSpaceOrTab(content[metaStart])) {\n metaStart++;\n }\n\n return {\n kind: \"math\",\n start: line.range.start,\n end: line.range.end,\n value: [],\n format: \"dollar\",\n fence: \"dollar\",\n fenceLength,\n meta:\n metaStart === content.length\n ? undefined\n : sourceRange(line.content.start + metaStart, line.content.end),\n };\n}\n\nexport function recognizeMathFence(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): RecognizerResult<Extract<OpenLeaf, { kind: \"math\" }>> {\n const match = matchMathFence(source, line, syntax);\n\n return match === undefined ? noMatch : matched(match);\n}\n\nfunction matchSameLineMath(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): Extract<BlockSyntax, { kind: \"math\" }> | undefined {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return;\n }\n\n const value = content.slice(indent);\n const trimmed = value.trimEnd();\n\n if (\n syntax.math.includes(\"tex\") &&\n trimmed.startsWith(\"\\\\[\") &&\n trimmed.endsWith(\"\\\\]\") &&\n trimmed.length > 4\n ) {\n return {\n kind: \"math\",\n range: sourceRange(line.range.start, line.content.end),\n value: [\n {\n kind: \"source\",\n range: sourceRange(\n line.content.start + indent + 2,\n line.content.start + indent + trimmed.length - 2,\n ),\n },\n ],\n format: \"tex\",\n meta: undefined,\n };\n }\n\n if (!syntax.math.includes(\"dollar\") || !value.startsWith(\"$$\")) {\n return;\n }\n\n let fenceLength = 0;\n\n while (value[fenceLength] === \"$\") {\n fenceLength++;\n }\n\n let closingStart = value.length;\n\n while (value[closingStart - 1] === \"$\") {\n closingStart--;\n }\n\n if (value.length - closingStart < fenceLength || closingStart <= fenceLength) {\n return;\n }\n\n return {\n kind: \"math\",\n range: sourceRange(line.range.start, line.content.end),\n value: [\n {\n kind: \"source\",\n range: sourceRange(\n line.content.start + indent + fenceLength,\n line.content.start + indent + closingStart,\n ),\n },\n ],\n format: \"dollar\",\n meta: undefined,\n };\n}\n\nexport function recognizeSameLineMath(\n source: SourceText,\n line: PhysicalLine,\n syntax: ResolvedSyntaxOptions,\n): RecognizerResult<Extract<BlockSyntax, { kind: \"math\" }>> {\n const match = matchSameLineMath(source, line, syntax);\n\n return match === undefined ? noMatch : matched(match);\n}\n\nexport function trimLineEndingOffset(source: SourceText, end: number): number {\n return source.char(end - 1) === \"\\n\" && source.char(end - 2) === \"\\r\"\n ? end - 2\n : source.char(end - 1) === \"\\n\" || source.char(end - 1) === \"\\r\"\n ? end - 1\n : end;\n}\n\nexport function isClosingMathFence(\n source: SourceText,\n line: PhysicalLine,\n active: Extract<OpenLeaf, { kind: \"math\" }>,\n): boolean {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3) {\n return false;\n }\n\n if (active.fence === \"tex\") {\n return content.slice(indent).trim() === \"\\\\]\";\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === \"$\") {\n markerEnd++;\n }\n\n if (markerEnd - indent < active.fenceLength) {\n return false;\n }\n\n while (isSpaceOrTab(content[markerEnd])) {\n markerEnd++;\n }\n\n return markerEnd === content.length;\n}\n\nexport const recognizeDefinition: BlockRecognizer = (source, line) => {\n const end = line.content.end;\n const indent = consumeIndent(source, line.content.start, end, 3);\n const labelStart = indent.offset;\n\n if (source.char(labelStart) !== \"[\") {\n return noMatch;\n }\n\n const labelEnd = findUnescaped(source, \"]\", labelStart + 1, end);\n\n if (\n labelEnd === undefined ||\n labelEnd === labelStart + 1 ||\n labelEnd - labelStart > 1000 ||\n source.char(labelEnd + 1) !== \":\" ||\n source.char(labelStart + 1) === \"^\"\n ) {\n return noMatch;\n }\n\n let cursor = labelEnd + 2;\n\n while (cursor < end && isSpaceOrTab(source.char(cursor))) {\n cursor++;\n }\n\n const destination = definitionDestination(source, cursor, end);\n\n if (destination === undefined) {\n return noMatch;\n }\n\n cursor = destination.next;\n const beforeTitle = cursor;\n\n while (cursor < end && isSpaceOrTab(source.char(cursor))) {\n cursor++;\n }\n\n let title: SourceRange | undefined;\n\n if (cursor < end) {\n if (cursor === beforeTitle) {\n return noMatch;\n }\n\n const opener = source.char(cursor);\n const closer = opener === \"(\" ? \")\" : opener === '\"' ? '\"' : opener === \"'\" ? \"'\" : undefined;\n\n if (closer === undefined) {\n return noMatch;\n }\n\n const titleEnd = findUnescaped(source, closer, cursor + 1, end);\n\n if (titleEnd === undefined) {\n return noMatch;\n }\n\n title = sourceRange(cursor + 1, titleEnd);\n cursor = titleEnd + 1;\n\n while (cursor < end && isSpaceOrTab(source.char(cursor))) {\n cursor++;\n }\n }\n\n if (cursor !== end) {\n return noMatch;\n }\n\n return matched({\n kind: \"block\",\n block: {\n kind: \"definition\",\n range: sourceRange(line.range.start, line.content.end),\n identifier: normalizeIdentifier(source.slice(labelStart + 1, labelEnd)),\n destination: destination.range,\n title,\n },\n });\n};\n\ninterface DefinitionDestination {\n readonly range: SourceRange;\n readonly next: number;\n}\n\nfunction definitionDestination(\n source: SourceText,\n start: number,\n end: number,\n): DefinitionDestination | undefined {\n if (source.char(start) === \"<\") {\n const close = findUnescaped(source, \">\", start + 1, end);\n\n return close === undefined\n ? undefined\n : { range: sourceRange(start + 1, close), next: close + 1 };\n }\n\n let cursor = start;\n let depth = 0;\n\n while (cursor < end && !isSpaceOrTab(source.char(cursor))) {\n const character = source.char(cursor);\n\n if (character === \"(\" && !isEscaped(source, cursor, start)) {\n depth++;\n\n if (depth > 32) {\n return;\n }\n } else if (character === \")\" && !isEscaped(source, cursor, start)) {\n if (depth === 0) {\n break;\n }\n\n depth--;\n }\n\n cursor++;\n }\n\n return cursor === start || depth !== 0\n ? undefined\n : { range: sourceRange(start, cursor), next: cursor };\n}\n\nexport const recognizeAtxHeading: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3 || content[indent] !== \"#\") {\n return noMatch;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === \"#\") {\n markerEnd++;\n }\n\n const depth = markerEnd - indent;\n\n if (depth > 6 || (markerEnd < content.length && !isSpaceOrTab(content[markerEnd]))) {\n return noMatch;\n }\n\n let valueStart = markerEnd;\n\n while (isSpaceOrTab(content[valueStart])) {\n valueStart++;\n }\n\n let valueEnd = content.length;\n\n while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) {\n valueEnd--;\n }\n\n let closingStart = valueEnd;\n\n while (content[closingStart - 1] === \"#\") {\n closingStart--;\n }\n\n if (\n closingStart < valueEnd &&\n (closingStart === valueStart || isSpaceOrTab(content[closingStart - 1]))\n ) {\n valueEnd = closingStart;\n\n while (valueEnd > valueStart && isSpaceOrTab(content[valueEnd - 1])) {\n valueEnd--;\n }\n }\n\n const inputRange = sourceRange(line.content.start + valueStart, line.content.start + valueEnd);\n\n return matched({\n kind: \"block\",\n block: {\n kind: \"heading\",\n range: sourceRange(line.range.start, line.content.end),\n depth: headingDepth(depth),\n input: [{ kind: \"source\", range: inputRange }],\n },\n });\n};\n\nexport const recognizeThematicBreak: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n const marker = content[indent];\n\n if (indent > 3 || (marker !== \"*\" && marker !== \"-\" && marker !== \"_\")) {\n return noMatch;\n }\n\n let count = 0;\n\n for (let index = indent; index < content.length; index++) {\n const character = content[index];\n\n if (character === marker) {\n count++;\n } else if (!isSpaceOrTab(character)) {\n return noMatch;\n }\n }\n\n return count < 3\n ? noMatch\n : matched({\n kind: \"block\",\n block: {\n kind: \"thematicBreak\",\n range: sourceRange(line.range.start, line.content.end),\n },\n });\n};\n\nexport const recognizeFence: BlockRecognizer = (source, line) => {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n const marker = content[indent];\n\n if (indent > 3 || (marker !== \"`\" && marker !== \"~\")) {\n return noMatch;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === marker) {\n markerEnd++;\n }\n\n const fenceLength = markerEnd - indent;\n\n if (fenceLength < 3 || (marker === \"`\" && content.slice(markerEnd).includes(\"`\"))) {\n return noMatch;\n }\n\n let infoStart = markerEnd;\n\n while (isSpaceOrTab(content[infoStart])) {\n infoStart++;\n }\n\n let languageEnd = infoStart;\n\n while (languageEnd < content.length && !isSpaceOrTab(content[languageEnd])) {\n languageEnd++;\n }\n\n let metaStart = languageEnd;\n\n while (isSpaceOrTab(content[metaStart])) {\n metaStart++;\n }\n\n return matched({\n kind: \"openLeaf\",\n leaf: {\n kind: \"fencedCode\",\n start: line.range.start,\n end: line.range.end,\n value: [],\n marker,\n fenceLength,\n language:\n languageEnd === infoStart\n ? undefined\n : sourceRange(line.content.start + infoStart, line.content.start + languageEnd),\n meta:\n metaStart === content.length\n ? undefined\n : sourceRange(line.content.start + metaStart, line.content.end),\n },\n });\n};\n\nexport function recognizeTable(\n source: SourceText,\n line: PhysicalLine,\n paragraph: Extract<OpenLeaf, { kind: \"paragraph\" }>,\n): RecognizerResult<Extract<OpenLeaf, { kind: \"table\" }>> {\n if (paragraph.lines.length !== 1) {\n return noMatch;\n }\n\n const headerSegment = paragraph.lines[0];\n\n if (headerSegment.kind !== \"source\") {\n return noMatch;\n }\n\n const header = tableRow(source, headerSegment.range);\n const delimiterCells = tableCellRanges(source, line.content);\n\n if (header.cells.length !== delimiterCells.length || delimiterCells.length === 0) {\n return noMatch;\n }\n\n const alignments: TableAlignmentSyntax[] = [];\n\n for (const segments of delimiterCells) {\n const segment = segments[0];\n\n if (segment?.kind !== \"source\") {\n return noMatch;\n }\n\n const value = source.slice(segment.range.start, segment.range.end);\n\n if (!/^:?-+:?$/u.test(value)) {\n return noMatch;\n }\n\n alignments.push(\n value.startsWith(\":\")\n ? value.endsWith(\":\")\n ? \"center\"\n : \"left\"\n : value.endsWith(\":\")\n ? \"right\"\n : \"none\",\n );\n }\n\n return matched({\n kind: \"table\",\n start: paragraph.start,\n end: line.range.end,\n alignments: alignments,\n rows: [header],\n });\n}\n\nexport function tableRow(source: SourceText, range: SourceRange): TableRowSyntax {\n return { range, cells: tableCellRanges(source, range) };\n}\n\nfunction tableCellRanges(\n source: SourceText,\n range: SourceRange,\n): readonly (readonly InlineSegment[])[] {\n let start = range.start;\n let end = range.end;\n\n while (start < end && isSpaceOrTab(source.char(start))) {\n start++;\n }\n\n while (end > start && isSpaceOrTab(source.char(end - 1))) {\n end--;\n }\n\n if (source.char(start) === \"|\") {\n start++;\n }\n\n if (source.char(end - 1) === \"|\" && !isEscaped(source, end - 1, start)) {\n end--;\n }\n\n const cells: (readonly InlineSegment[])[] = [];\n let cellStart = start;\n let codeFence = 0;\n\n for (let offset = start; offset <= end; offset++) {\n const character = source.char(offset);\n\n if (character === \"`\" && !isEscaped(source, offset, start)) {\n let runEnd = offset;\n\n while (source.char(runEnd) === \"`\") {\n runEnd++;\n }\n\n const run = runEnd - offset;\n codeFence = codeFence === 0 ? run : codeFence === run ? 0 : codeFence;\n offset = runEnd - 1;\n }\n\n if (\n offset === end ||\n (character === \"|\" && codeFence === 0 && !isEscaped(source, offset, start))\n ) {\n let valueStart = cellStart;\n let valueEnd = offset;\n\n while (valueStart < valueEnd && isSpaceOrTab(source.char(valueStart))) {\n valueStart++;\n }\n\n while (valueEnd > valueStart && isSpaceOrTab(source.char(valueEnd - 1))) {\n valueEnd--;\n }\n\n cells.push([{ kind: \"source\", range: sourceRange(valueStart, valueEnd) }]);\n cellStart = offset + 1;\n }\n }\n\n return cells;\n}\n\nexport function recognizeSetext(\n source: SourceText,\n line: PhysicalLine,\n paragraph: Extract<OpenLeaf, { kind: \"paragraph\" }>,\n): RecognizerResult<BlockSyntax> {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n const marker = content[indent];\n\n if (indent > 3 || (marker !== \"=\" && marker !== \"-\")) {\n return noMatch;\n }\n\n let index = indent;\n\n while (content[index] === marker) {\n index++;\n }\n\n while (isSpaceOrTab(content[index])) {\n index++;\n }\n\n if (index !== content.length) {\n return noMatch;\n }\n\n return matched({\n kind: \"heading\",\n range: sourceRange(paragraph.start, line.content.end),\n depth: marker === \"=\" ? 1 : 2,\n input: paragraph.lines,\n });\n}\n\nexport function isClosingFence(\n source: SourceText,\n line: PhysicalLine,\n active: Extract<OpenLeaf, { kind: \"fencedCode\" }>,\n): boolean {\n const content = source.slice(line.content.start, line.content.end);\n const indent = leadingIndent(content);\n\n if (indent > 3 || content[indent] !== active.marker) {\n return false;\n }\n\n let markerEnd = indent;\n\n while (content[markerEnd] === active.marker) {\n markerEnd++;\n }\n\n if (markerEnd - indent < active.fenceLength) {\n return false;\n }\n\n while (isSpaceOrTab(content[markerEnd])) {\n markerEnd++;\n }\n\n return markerEnd === content.length;\n}\n\nexport function interruptsParagraph(source: SourceText, line: PhysicalLine): boolean {\n return [recognizeRawHtml, recognizeFence, recognizeAtxHeading, recognizeThematicBreak].some(\n (recognize) => recognize(source, line).kind === \"matched\",\n );\n}\n\nfunction headingDepth(value: number): 1 | 2 | 3 | 4 | 5 | 6 {\n if (value === 1 || value === 2 || value === 3 || value === 4 || value === 5 || value === 6) {\n return value;\n }\n\n throw new Error(`Invalid ATX heading depth ${value}`);\n}\n\nfunction leadingIndent(value: string): number {\n let index = 0;\n\n while (value[index] === \" \") {\n index++;\n }\n\n return index;\n}\n"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { SourceRange } from "../ranges.mjs";
2
+ import { ResolvedSyntaxOptions } from "../syntax-options.mjs";
3
+ import { SourceText } from "../source-text.mjs";
4
+ import { PhysicalLine } from "../source.mjs";
5
+ import { BlockSyntax, PendingBlockSyntax } from "./block-syntax.mjs";
6
+ //#region src/parser/block-parser.d.ts
7
+ export interface BlockParserCheckpoint {
8
+ readonly length: number;
9
+ readonly tail: BlockSyntax | undefined;
10
+ }
11
+ /** Receives each top-level block once later input can no longer change it. */
12
+ export type SettledBlockListener = (block: BlockSyntax, index: number) => void;
13
+ export declare class BlockParser {
14
+ #private;
15
+ constructor(syntax: ResolvedSyntaxOptions, blocks?: readonly BlockSyntax[], onSettled?: SettledBlockListener);
16
+ /** The number of top-level blocks that later input cannot change. */
17
+ get settledCount(): number;
18
+ checkpoint(): BlockParserCheckpoint | undefined;
19
+ fork(checkpoint: BlockParserCheckpoint): BlockParser;
20
+ /**
21
+ * A copy of the unsettled part: a trailing list, the open containers, and
22
+ * the active leaf. Finishing it costs only the open tail.
23
+ */
24
+ tail(): BlockParser;
25
+ pending(): PendingBlockSyntax | undefined;
26
+ write(source: SourceText, physicalLine: PhysicalLine): void;
27
+ private writeLine;
28
+ finish(source: SourceText): readonly BlockSyntax[];
29
+ private appendLeafBlocks;
30
+ private closeContainers;
31
+ }
32
+ /**
33
+ * Parses a nested flow region, such as multi-line JSX children, with offsets in
34
+ * the enclosing source. Frontmatter is never recognized inside the region.
35
+ */
36
+ export declare function parseFlowRange(source: SourceText, range: SourceRange, syntax: ResolvedSyntaxOptions): readonly BlockSyntax[];
37
+ //#endregion
38
+ //# sourceMappingURL=block-parser.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-parser.d.mts","names":[],"sources":["../../src/parser/block-parser.ts"],"mappings":";;;;;;iBAuDiB;WACN;WACA,MAAM;;;YAIL,wBAAwB,OAAO,aAAa;qBAE3C;;EASX,YACE,QAAQ,uBACR,kBAAiB,eACjB,YAAY;;MAUH;EAIJ,cAAc;EAed,KAAK,YAAY,wBAAwB;;;;;EAczC,QAAQ;EASR,WAAW;EAIX,MAAM,QAAQ,YAAY,cAAc;UAUvC;EAkGD,OAAO,QAAQ,sBAAsB;UAQpC;UAMA;;;;;;wBAupCM,eACd,QAAQ,YACR,OAAO,aACP,QAAQ,iCACE"}