@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 @@
1
+ {"version":3,"file":"inline-pending.mjs","names":[],"sources":["../../src/parser/inline-pending.ts"],"sourcesContent":["import type { SourceText } from \"../source-text.ts\";\nimport type { ResolvedSyntaxOptions } from \"../syntax-options.ts\";\nimport type { InlineInput } from \"./inline-input.ts\";\nimport type { Output } from \"./inline-output.ts\";\nimport type { InlinePendingSyntax } from \"./inline-syntax.ts\";\n\nimport { isUnicodeWhitespace } from \"./characters.ts\";\nimport { codeSpan } from \"./inline-code.ts\";\nimport { convertOutput, isDelimiter, markerRunEnd, textNode } from \"./inline-output.ts\";\n\nexport interface PendingCandidate {\n readonly start: number;\n readonly pending: InlinePendingSyntax;\n}\n\nexport interface PendingInlineResult {\n readonly pending: InlinePendingSyntax | undefined;\n /** Earliest raw syntax future input can change; the input length means none remains. */\n readonly earliest: number;\n}\n\n/**\n * The construct still open at the end of the input. Before `from`, a safe\n * point, every construct is closed, so scans start there, and at `fromOutput`\n * in the output.\n */\nexport function pendingInline(\n input: InlineInput,\n value: SourceText,\n output: readonly Output[],\n openEmbedded: PendingCandidate | undefined,\n syntax: ResolvedSyntaxOptions,\n from: number,\n fromOutput: number,\n checkpoint: number | undefined,\n): PendingInlineResult {\n const candidates: PendingCandidate[] = openEmbedded === undefined ? [] : [openEmbedded];\n let earliest = value.length;\n\n for (let index = output.length - 1; index >= fromOutput; index--) {\n const opener = output[index];\n\n if (!isDelimiter(opener) || !opener.canOpen || index === output.length - 1) {\n continue;\n }\n\n const kind =\n opener.marker === \"~\"\n ? opener.length >= (syntax.singleTilde ? 1 : 2)\n ? \"delete\"\n : undefined\n : opener.length >= 2\n ? \"strong\"\n : \"emphasis\";\n\n if (kind === undefined || isUnicodeWhitespace(value.char(opener.start + opener.length) ?? \"\")) {\n continue;\n }\n\n candidates.push({\n start: opener.start,\n pending: {\n kind,\n range: input.sourceRange(opener.start, input.length),\n children: convertOutput(input, output.slice(index + 1)),\n },\n });\n break;\n }\n\n for (let offset = value.indexOf(\"`\", from); offset !== -1;) {\n const matched = codeSpan(input, value, offset);\n\n if (matched !== undefined) {\n if (checkpoint !== undefined && offset < checkpoint && matched.end > checkpoint) {\n earliest = Math.min(earliest, offset);\n }\n\n offset = value.indexOf(\"`\", matched.end);\n continue;\n }\n\n const openingEnd = markerRunEnd(value, offset, \"`\");\n earliest = Math.min(earliest, offset);\n\n if (openingEnd < value.length) {\n candidates.push({\n start: offset,\n pending: {\n kind: \"code\",\n range: input.sourceRange(offset, input.length),\n value: value.slice(openingEnd).replace(/\\r\\n|[\\r\\n]/gu, \" \"),\n },\n });\n }\n\n break;\n }\n\n const suffix = value.slice(from);\n // Escaped brackets and brackets inside code still participate in raw pending syntax.\n const label = /!?\\[[^\\]]*\\]?$/u.exec(suffix);\n\n if (label !== null) {\n earliest = Math.min(earliest, from + label.index);\n }\n\n const pendingLink = /(!?)\\[([^\\]]+)\\]\\(([^)]*)$/u.exec(suffix);\n\n if (pendingLink !== null) {\n const start = from + pendingLink.index;\n const image = pendingLink[1] === \"!\";\n candidates.push({\n start,\n pending: image\n ? {\n kind: \"image\",\n range: input.sourceRange(start, input.length),\n alt: pendingLink[2],\n }\n : {\n kind: \"link\",\n range: input.sourceRange(start, input.length),\n children: [textNode(input, value, start + 1, start + 1 + pendingLink[2].length)],\n },\n });\n }\n\n if (syntax.math.includes(\"tex\")) {\n const start = value.lastIndexOf(\"\\\\(\");\n\n if (start !== -1 && value.indexOf(\"\\\\)\", start + 2) === -1 && start + 2 < value.length) {\n candidates.push({\n start,\n pending: {\n kind: \"math\",\n range: input.sourceRange(start, input.length),\n value: value.slice(start + 2),\n format: \"tex\",\n },\n });\n }\n }\n\n if (syntax.math.includes(\"dollar\")) {\n const start = value.lastIndexOf(\"$\");\n\n if (\n start !== -1 &&\n start + 1 < value.length &&\n !isUnicodeWhitespace(value.char(start + 1) ?? \"\")\n ) {\n candidates.push({\n start,\n pending: {\n kind: \"math\",\n range: input.sourceRange(start, input.length),\n value: value.slice(start + 1),\n format: \"dollar\",\n },\n });\n }\n }\n\n candidates.sort((left, right) => right.start - left.start);\n\n return {\n pending: candidates[0]?.pending,\n earliest: Math.min(earliest, candidates.at(-1)?.start ?? value.length),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { SourceRange } from "../ranges.mjs";
2
+ import { MathFormat } from "../syntax-options.mjs";
3
+ //#region src/parser/inline-syntax.d.ts
4
+ export type DefinitionLookup = Pick<ReadonlySet<string>, "has">;
5
+ interface InlineSyntaxBase {
6
+ readonly range: SourceRange;
7
+ }
8
+ export interface TextSyntax extends InlineSyntaxBase {
9
+ readonly kind: "text";
10
+ readonly value: string;
11
+ }
12
+ export interface InlineParentSyntax extends InlineSyntaxBase {
13
+ readonly kind: "emphasis" | "strong" | "delete";
14
+ readonly children: readonly InlineSyntax[];
15
+ }
16
+ export interface CodeSpanSyntax extends InlineSyntaxBase {
17
+ readonly kind: "code";
18
+ readonly value: string;
19
+ }
20
+ export interface HardBreakSyntax extends InlineSyntaxBase {
21
+ readonly kind: "hardBreak";
22
+ }
23
+ export interface LinkSyntax extends InlineSyntaxBase {
24
+ readonly kind: "link";
25
+ readonly destination: string;
26
+ readonly title: string | undefined;
27
+ readonly children: readonly InlineSyntax[];
28
+ }
29
+ export interface ImageSyntax extends InlineSyntaxBase {
30
+ readonly kind: "image";
31
+ readonly destination: string;
32
+ readonly title: string | undefined;
33
+ readonly alt: string;
34
+ }
35
+ export interface ReferenceSyntax extends InlineSyntaxBase {
36
+ readonly kind: "reference";
37
+ readonly identifier: string;
38
+ readonly referenceKind: "full" | "collapsed" | "shortcut";
39
+ readonly image: boolean;
40
+ readonly children: readonly InlineSyntax[];
41
+ }
42
+ interface ValuedInlineSyntax extends InlineSyntaxBase {
43
+ readonly value: string;
44
+ }
45
+ export interface RawHtmlSyntax extends ValuedInlineSyntax {
46
+ readonly kind: "rawHtml";
47
+ }
48
+ export interface ExpressionSyntax extends ValuedInlineSyntax {
49
+ readonly kind: "expression";
50
+ }
51
+ export interface JsxSyntax extends ValuedInlineSyntax {
52
+ readonly kind: "jsx";
53
+ }
54
+ export interface InlineMathSyntax extends ValuedInlineSyntax {
55
+ readonly kind: "math";
56
+ readonly format: MathFormat;
57
+ }
58
+ export interface FootnoteReferenceSyntax extends InlineSyntaxBase {
59
+ readonly kind: "footnoteReference";
60
+ readonly identifier: string;
61
+ }
62
+ export interface InlineDirectiveAttribute {
63
+ readonly name: string;
64
+ readonly value: string;
65
+ }
66
+ export interface InlineDirectiveSyntax extends InlineSyntaxBase {
67
+ readonly kind: "directive";
68
+ readonly name: string;
69
+ readonly label: readonly InlineSyntax[];
70
+ readonly attributes: readonly InlineDirectiveAttribute[];
71
+ }
72
+ export type InlineSyntax = TextSyntax | InlineParentSyntax | CodeSpanSyntax | HardBreakSyntax | LinkSyntax | ImageSyntax | ReferenceSyntax | RawHtmlSyntax | ExpressionSyntax | JsxSyntax | InlineMathSyntax | FootnoteReferenceSyntax | InlineDirectiveSyntax;
73
+ export interface InvalidInlineSyntax {
74
+ readonly range: SourceRange;
75
+ readonly syntax: "expression" | "jsx";
76
+ readonly open: boolean;
77
+ }
78
+ export interface InlineParseResult {
79
+ /** Includes references that could change which surrounding link wins. */
80
+ readonly references: readonly string[];
81
+ /**
82
+ * Parsed nodes. A resumed parse shares this array with the next parse that
83
+ * resumes from it, so read it before parsing the same input again.
84
+ */
85
+ readonly nodes: readonly InlineSyntax[];
86
+ readonly invalid: readonly InvalidInlineSyntax[];
87
+ readonly pending?: InlinePendingSyntax;
88
+ /** First node whose materialized output must be rebuilt. */
89
+ readonly changedFrom: number;
90
+ }
91
+ export interface PendingInlineParentSyntax extends InlineSyntaxBase {
92
+ readonly kind: "strong" | "emphasis" | "delete";
93
+ readonly children: readonly InlineSyntax[];
94
+ }
95
+ export interface PendingCodeSyntax extends InlineSyntaxBase {
96
+ readonly kind: "code";
97
+ readonly value: string;
98
+ }
99
+ export interface PendingLinkSyntax extends InlineSyntaxBase {
100
+ readonly kind: "link";
101
+ readonly children: readonly InlineSyntax[];
102
+ }
103
+ export interface PendingImageSyntax extends InlineSyntaxBase {
104
+ readonly kind: "image";
105
+ readonly alt: string;
106
+ }
107
+ export interface PendingMathSyntax extends InlineSyntaxBase {
108
+ readonly kind: "math";
109
+ readonly value: string;
110
+ readonly format: MathFormat;
111
+ }
112
+ export interface PendingEmbeddedSyntax extends InlineSyntaxBase {
113
+ readonly kind: "jsx" | "expression";
114
+ }
115
+ export type InlinePendingSyntax = PendingInlineParentSyntax | PendingCodeSyntax | PendingLinkSyntax | PendingImageSyntax | PendingMathSyntax | PendingEmbeddedSyntax;
116
+ //#endregion
117
+ export {};
118
+ //# sourceMappingURL=inline-syntax.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-syntax.d.mts","names":[],"sources":["../../src/parser/inline-syntax.ts"],"mappings":";;;YAGY,mBAAmB,KAAK;UAE1B;WACC,OAAO;;iBAGD,mBAAmB;WACzB;WACA;;iBAGM,2BAA2B;WACjC;WACA,mBAAmB;;iBAGb,uBAAuB;WAC7B;WACA;;iBAGM,wBAAwB;WAC9B;;iBAGM,mBAAmB;WACzB;WACA;WACA;WACA,mBAAmB;;iBAGb,oBAAoB;WAC1B;WACA;WACA;WACA;;iBAGM,wBAAwB;WAC9B;WACA;WACA;WACA;WACA,mBAAmB;;UAGpB,2BAA2B;WAC1B;;iBAGM,sBAAsB;WAC5B;;iBAGM,yBAAyB;WAC/B;;iBAGM,kBAAkB;WACxB;;iBAGM,yBAAyB;WAC/B;WACA,QAAQ;;iBAGF,gCAAgC;WACtC;WACA;;iBAGM;WACN;WACA;;iBAGM,8BAA8B;WACpC;WACA;WACA,gBAAgB;WAChB,qBAAqB;;YAGpB,eACR,aACA,qBACA,iBACA,kBACA,aACA,cACA,kBACA,gBACA,mBACA,YACA,mBACA,0BACA;iBAEa;WACN,OAAO;WACP;WAEA;;iBAGM;;WAEN;;;;;WAKA,gBAAgB;WAChB,kBAAkB;WAClB,UAAU;;WAEV;;iBAGM,kCAAkC;WACxC;WACA,mBAAmB;;iBAGb,0BAA0B;WAChC;WACA;;iBAGM,0BAA0B;WAChC;WACA,mBAAmB;;iBAGb,2BAA2B;WACjC;WACA;;iBAGM,0BAA0B;WAChC;WACA;WACA,QAAQ;;iBAGF,8BAA8B;WACpC;;YAGC,sBACR,4BACA,oBACA,oBACA,qBACA,oBACA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import { JavaScriptScannerState } from "./javascript-scanner.mjs";
2
+ //#region src/parser/javascript-boundary.d.ts
3
+ export type EmbeddedJavaScriptKind = "expression" | "jsxExpression" | "esm";
4
+ export type JavaScriptBoundaryResult = Readonly<{
5
+ kind: "valid";
6
+ }> | Readonly<{
7
+ kind: "incompleteAtPhysicalEof";
8
+ offset: number;
9
+ state: JavaScriptScannerState;
10
+ }> | Readonly<{
11
+ kind: "invalid";
12
+ offset: number;
13
+ }>;
14
+ export declare function parseJavaScriptBoundary(kind: EmbeddedJavaScriptKind, source: string, sourceOffset?: number): JavaScriptBoundaryResult;
15
+ //#endregion
16
+ //# sourceMappingURL=javascript-boundary.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-boundary.d.mts","names":[],"sources":["../../src/parser/javascript-boundary.ts"],"mappings":";;YASY;YAEA,2BACR;EAAW;KACX;EACE;EACA;EACA,OAAO;KAET;EAAW;EAAiB;;wBAEhB,wBACd,MAAM,wBACN,gBACA,wBACC"}
@@ -0,0 +1,42 @@
1
+ import { hasJavaScriptToken, parseJavaScriptExpression, parseJavaScriptProgram } from "../javascript.mjs";
2
+ import { JavaScriptScanner } from "./javascript-scanner.mjs";
3
+ import { isNumber, isObject } from "@temelj/value";
4
+ //#region src/parser/javascript-boundary.ts
5
+ function parseJavaScriptBoundary(kind, source, sourceOffset = 0) {
6
+ try {
7
+ const node = kind === "esm" ? parseJavaScriptProgram(source) : parseJavaScriptExpression(source);
8
+ if (kind !== "esm" && hasJavaScriptToken(source.slice(node.end))) return {
9
+ kind: "invalid",
10
+ offset: sourceOffset + node.end
11
+ };
12
+ return { kind: "valid" };
13
+ } catch (cause) {
14
+ const offset = acornFailureOffset(cause);
15
+ const scanner = new JavaScriptScanner();
16
+ const scanned = scanner.append(source);
17
+ if (scanned.kind === "invalid") return {
18
+ kind: "invalid",
19
+ offset: sourceOffset + scanned.offset
20
+ };
21
+ if (scanner.incomplete || offset >= source.length) return {
22
+ kind: "incompleteAtPhysicalEof",
23
+ offset: sourceOffset + source.length,
24
+ state: scanner.state
25
+ };
26
+ return {
27
+ kind: "invalid",
28
+ offset: sourceOffset + offset
29
+ };
30
+ }
31
+ }
32
+ function acornFailureOffset(cause) {
33
+ if (!isObject(cause) || !("pos" in cause)) throw cause;
34
+ const position = cause.pos;
35
+ if (!isNumber(position)) throw cause;
36
+ const raisedAt = "raisedAt" in cause ? cause.raisedAt : void 0;
37
+ return isNumber(raisedAt) ? Math.max(position, raisedAt) : position;
38
+ }
39
+ //#endregion
40
+ export { parseJavaScriptBoundary };
41
+
42
+ //# sourceMappingURL=javascript-boundary.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-boundary.mjs","names":[],"sources":["../../src/parser/javascript-boundary.ts"],"sourcesContent":["import { isObject, isNumber } from \"@temelj/value\";\n\nimport {\n hasJavaScriptToken,\n parseJavaScriptExpression,\n parseJavaScriptProgram,\n} from \"../javascript.ts\";\nimport { JavaScriptScanner, type JavaScriptScannerState } from \"./javascript-scanner.ts\";\n\nexport type EmbeddedJavaScriptKind = \"expression\" | \"jsxExpression\" | \"esm\";\n\nexport type JavaScriptBoundaryResult =\n | Readonly<{ kind: \"valid\" }>\n | Readonly<{\n kind: \"incompleteAtPhysicalEof\";\n offset: number;\n state: JavaScriptScannerState;\n }>\n | Readonly<{ kind: \"invalid\"; offset: number }>;\n\nexport function parseJavaScriptBoundary(\n kind: EmbeddedJavaScriptKind,\n source: string,\n sourceOffset = 0,\n): JavaScriptBoundaryResult {\n try {\n const node =\n kind === \"esm\" ? parseJavaScriptProgram(source) : parseJavaScriptExpression(source);\n\n if (kind !== \"esm\" && hasJavaScriptToken(source.slice(node.end))) {\n return { kind: \"invalid\", offset: sourceOffset + node.end };\n }\n\n return { kind: \"valid\" };\n } catch (cause) {\n const offset = acornFailureOffset(cause);\n const scanner = new JavaScriptScanner();\n const scanned = scanner.append(source);\n\n if (scanned.kind === \"invalid\") {\n return { kind: \"invalid\", offset: sourceOffset + scanned.offset };\n }\n\n if (scanner.incomplete || offset >= source.length) {\n return {\n kind: \"incompleteAtPhysicalEof\",\n offset: sourceOffset + source.length,\n state: scanner.state,\n };\n }\n\n return { kind: \"invalid\", offset: sourceOffset + offset };\n }\n}\n\nfunction acornFailureOffset(cause: unknown): number {\n if (!isObject(cause) || !(\"pos\" in cause)) {\n throw cause;\n }\n\n const position = cause.pos;\n\n if (!isNumber(position)) {\n throw cause;\n }\n\n const raisedAt = \"raisedAt\" in cause ? cause.raisedAt : undefined;\n\n return isNumber(raisedAt) ? Math.max(position, raisedAt) : position;\n}\n"],"mappings":";;;;AAoBA,SAAgB,wBACd,MACA,QACA,eAAe,GACW;CAC1B,IAAI;EACF,MAAM,OACJ,SAAS,QAAQ,uBAAuB,MAAM,IAAI,0BAA0B,MAAM;EAEpF,IAAI,SAAS,SAAS,mBAAmB,OAAO,MAAM,KAAK,GAAG,CAAC,GAC7D,OAAO;GAAE,MAAM;GAAW,QAAQ,eAAe,KAAK;EAAI;EAG5D,OAAO,EAAE,MAAM,QAAQ;CACzB,SAAS,OAAO;EACd,MAAM,SAAS,mBAAmB,KAAK;EACvC,MAAM,UAAU,IAAI,kBAAkB;EACtC,MAAM,UAAU,QAAQ,OAAO,MAAM;EAErC,IAAI,QAAQ,SAAS,WACnB,OAAO;GAAE,MAAM;GAAW,QAAQ,eAAe,QAAQ;EAAO;EAGlE,IAAI,QAAQ,cAAc,UAAU,OAAO,QACzC,OAAO;GACL,MAAM;GACN,QAAQ,eAAe,OAAO;GAC9B,OAAO,QAAQ;EACjB;EAGF,OAAO;GAAE,MAAM;GAAW,QAAQ,eAAe;EAAO;CAC1D;AACF;AAEA,SAAS,mBAAmB,OAAwB;CAClD,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,QACjC,MAAM;CAGR,MAAM,WAAW,MAAM;CAEvB,IAAI,CAAC,SAAS,QAAQ,GACpB,MAAM;CAGR,MAAM,WAAW,cAAc,QAAQ,MAAM,WAAW,KAAA;CAExD,OAAO,SAAS,QAAQ,IAAI,KAAK,IAAI,UAAU,QAAQ,IAAI;AAC7D"}
@@ -0,0 +1,22 @@
1
+ //#region src/parser/javascript-scanner.d.ts
2
+ export type EmbeddedScannerResult = Readonly<{
3
+ kind: "open";
4
+ }> | Readonly<{
5
+ kind: "closed";
6
+ offset: number;
7
+ }> | Readonly<{
8
+ kind: "invalid";
9
+ offset: number;
10
+ }>;
11
+ export type JavaScriptScannerState = "code" | "singleQuotedString" | "doubleQuotedString" | "template" | "lineComment" | "blockComment" | "regularExpression";
12
+ /** Retained lexical state shared by embedded expressions and strict JavaScript validation. */
13
+ export declare class JavaScriptScanner {
14
+ #private;
15
+ constructor(outer?: "}");
16
+ get state(): JavaScriptScannerState;
17
+ get incomplete(): boolean;
18
+ append(text: string): EmbeddedScannerResult;
19
+ clone(): JavaScriptScanner;
20
+ }
21
+ //#endregion
22
+ //# sourceMappingURL=javascript-scanner.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-scanner.d.mts","names":[],"sources":["../../src/parser/javascript-scanner.ts"],"mappings":";YAEY,wBACR;EAAW;KACX;EAAW;EAAgB;KAC3B;EAAW;EAAiB;;YAEpB;;qBAeC;;EAQX,YAAmB;MAQR,SAAS;MAIT;EAIJ,OAAO,eAAe;EAwHtB,SAAS"}
@@ -0,0 +1,122 @@
1
+ import { startsRegularExpression } from "../javascript.mjs";
2
+ //#region src/parser/javascript-scanner.ts
3
+ /** Retained lexical state shared by embedded expressions and strict JavaScript validation. */
4
+ var JavaScriptScanner = class JavaScriptScanner {
5
+ #delimiters = [];
6
+ #outer;
7
+ #source = "";
8
+ #characterClass = false;
9
+ #escaped = false;
10
+ #state = "code";
11
+ constructor(outer) {
12
+ this.#outer = outer;
13
+ if (outer !== void 0) this.#delimiters.push({
14
+ character: outer,
15
+ resumesTemplate: false
16
+ });
17
+ }
18
+ get state() {
19
+ return this.#state === "lineComment" ? "code" : this.#state;
20
+ }
21
+ get incomplete() {
22
+ return this.state !== "code" || this.#delimiters.length > 0;
23
+ }
24
+ append(text) {
25
+ const start = this.#source.length;
26
+ this.#source += text;
27
+ for (let index = 0; index < text.length; index++) {
28
+ const character = text[index];
29
+ const next = text[index + 1];
30
+ if (this.#state === "lineComment") {
31
+ if (character === "\n" || character === "\r") this.#state = "code";
32
+ continue;
33
+ }
34
+ if (this.#state === "blockComment") {
35
+ if (character === "*" && next === "/") {
36
+ this.#state = "code";
37
+ index++;
38
+ }
39
+ continue;
40
+ }
41
+ if (this.#state === "singleQuotedString" || this.#state === "doubleQuotedString") {
42
+ if (this.#escaped) this.#escaped = false;
43
+ else if (character === "\\") this.#escaped = true;
44
+ else if (this.#state === "singleQuotedString" && character === "'" || this.#state === "doubleQuotedString" && character === "\"") this.#state = "code";
45
+ continue;
46
+ }
47
+ if (this.#state === "regularExpression") {
48
+ if (this.#escaped) this.#escaped = false;
49
+ else if (character === "\\") this.#escaped = true;
50
+ else if (character === "[") this.#characterClass = true;
51
+ else if (character === "]") this.#characterClass = false;
52
+ else if (character === "/" && !this.#characterClass) this.#state = "code";
53
+ continue;
54
+ }
55
+ if (this.#state === "template") {
56
+ if (this.#escaped) this.#escaped = false;
57
+ else if (character === "\\") this.#escaped = true;
58
+ else if (character === "`") this.#state = "code";
59
+ else if (character === "$" && next === "{") {
60
+ this.#delimiters.push({
61
+ character: "}",
62
+ resumesTemplate: true
63
+ });
64
+ this.#state = "code";
65
+ index++;
66
+ }
67
+ continue;
68
+ }
69
+ if (character === "/" && next === "/") {
70
+ this.#state = "lineComment";
71
+ index++;
72
+ } else if (character === "/" && next === "*") {
73
+ this.#state = "blockComment";
74
+ index++;
75
+ } else if (character === "/" && startsRegularExpression((this.#outer === void 0 ? "" : "(") + this.#source.slice(0, start + index))) {
76
+ this.#state = "regularExpression";
77
+ this.#characterClass = false;
78
+ } else if (character === "'") this.#state = "singleQuotedString";
79
+ else if (character === "\"") this.#state = "doubleQuotedString";
80
+ else if (character === "`") this.#state = "template";
81
+ else if (character === "(") this.#delimiters.push({
82
+ character: ")",
83
+ resumesTemplate: false
84
+ });
85
+ else if (character === "[") this.#delimiters.push({
86
+ character: "]",
87
+ resumesTemplate: false
88
+ });
89
+ else if (character === "{") this.#delimiters.push({
90
+ character: "}",
91
+ resumesTemplate: false
92
+ });
93
+ else if (character === ")" || character === "]" || character === "}") {
94
+ const delimiter = this.#delimiters.at(-1);
95
+ if (delimiter?.character !== character) return {
96
+ kind: "invalid",
97
+ offset: index
98
+ };
99
+ this.#delimiters.pop();
100
+ if (this.#outer !== void 0 && this.#delimiters.length === 0) return {
101
+ kind: "closed",
102
+ offset: index + 1
103
+ };
104
+ if (delimiter.resumesTemplate) this.#state = "template";
105
+ }
106
+ }
107
+ return { kind: "open" };
108
+ }
109
+ clone() {
110
+ const copy = new JavaScriptScanner(this.#outer);
111
+ copy.#source = this.#source;
112
+ copy.#characterClass = this.#characterClass;
113
+ copy.#delimiters.splice(0, copy.#delimiters.length, ...this.#delimiters);
114
+ copy.#escaped = this.#escaped;
115
+ copy.#state = this.#state;
116
+ return copy;
117
+ }
118
+ };
119
+ //#endregion
120
+ export { JavaScriptScanner };
121
+
122
+ //# sourceMappingURL=javascript-scanner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-scanner.mjs","names":[],"sources":["../../src/parser/javascript-scanner.ts"],"sourcesContent":["import { startsRegularExpression } from \"../javascript.ts\";\n\nexport type EmbeddedScannerResult =\n | Readonly<{ kind: \"open\" }>\n | Readonly<{ kind: \"closed\"; offset: number }>\n | Readonly<{ kind: \"invalid\"; offset: number }>;\n\nexport type JavaScriptScannerState =\n | \"code\"\n | \"singleQuotedString\"\n | \"doubleQuotedString\"\n | \"template\"\n | \"lineComment\"\n | \"blockComment\"\n | \"regularExpression\";\n\ninterface JavaScriptDelimiter {\n readonly character: \")\" | \"]\" | \"}\";\n readonly resumesTemplate: boolean;\n}\n\n/** Retained lexical state shared by embedded expressions and strict JavaScript validation. */\nexport class JavaScriptScanner {\n readonly #delimiters: JavaScriptDelimiter[] = [];\n readonly #outer: \"}\" | undefined;\n #source = \"\";\n #characterClass = false;\n #escaped = false;\n #state: JavaScriptScannerState = \"code\";\n\n public constructor(outer?: \"}\") {\n this.#outer = outer;\n\n if (outer !== undefined) {\n this.#delimiters.push({ character: outer, resumesTemplate: false });\n }\n }\n\n public get state(): JavaScriptScannerState {\n return this.#state === \"lineComment\" ? \"code\" : this.#state;\n }\n\n public get incomplete(): boolean {\n return this.state !== \"code\" || this.#delimiters.length > 0;\n }\n\n public append(text: string): EmbeddedScannerResult {\n const start = this.#source.length;\n this.#source += text;\n\n for (let index = 0; index < text.length; index++) {\n const character = text[index];\n const next = text[index + 1];\n\n if (this.#state === \"lineComment\") {\n if (character === \"\\n\" || character === \"\\r\") {\n this.#state = \"code\";\n }\n\n continue;\n }\n\n if (this.#state === \"blockComment\") {\n if (character === \"*\" && next === \"/\") {\n this.#state = \"code\";\n index++;\n }\n\n continue;\n }\n\n if (this.#state === \"singleQuotedString\" || this.#state === \"doubleQuotedString\") {\n if (this.#escaped) {\n this.#escaped = false;\n } else if (character === \"\\\\\") {\n this.#escaped = true;\n } else if (\n (this.#state === \"singleQuotedString\" && character === \"'\") ||\n (this.#state === \"doubleQuotedString\" && character === '\"')\n ) {\n this.#state = \"code\";\n }\n\n continue;\n }\n\n if (this.#state === \"regularExpression\") {\n if (this.#escaped) {\n this.#escaped = false;\n } else if (character === \"\\\\\") {\n this.#escaped = true;\n } else if (character === \"[\") {\n this.#characterClass = true;\n } else if (character === \"]\") {\n this.#characterClass = false;\n } else if (character === \"/\" && !this.#characterClass) {\n this.#state = \"code\";\n }\n\n continue;\n }\n\n if (this.#state === \"template\") {\n if (this.#escaped) {\n this.#escaped = false;\n } else if (character === \"\\\\\") {\n this.#escaped = true;\n } else if (character === \"`\") {\n this.#state = \"code\";\n } else if (character === \"$\" && next === \"{\") {\n this.#delimiters.push({ character: \"}\", resumesTemplate: true });\n this.#state = \"code\";\n index++;\n }\n\n continue;\n }\n\n if (character === \"/\" && next === \"/\") {\n this.#state = \"lineComment\";\n index++;\n } else if (character === \"/\" && next === \"*\") {\n this.#state = \"blockComment\";\n index++;\n } else if (\n character === \"/\" &&\n startsRegularExpression(\n (this.#outer === undefined ? \"\" : \"(\") + this.#source.slice(0, start + index),\n )\n ) {\n this.#state = \"regularExpression\";\n this.#characterClass = false;\n } else if (character === \"'\") {\n this.#state = \"singleQuotedString\";\n } else if (character === '\"') {\n this.#state = \"doubleQuotedString\";\n } else if (character === \"`\") {\n this.#state = \"template\";\n } else if (character === \"(\") {\n this.#delimiters.push({ character: \")\", resumesTemplate: false });\n } else if (character === \"[\") {\n this.#delimiters.push({ character: \"]\", resumesTemplate: false });\n } else if (character === \"{\") {\n this.#delimiters.push({ character: \"}\", resumesTemplate: false });\n } else if (character === \")\" || character === \"]\" || character === \"}\") {\n const delimiter = this.#delimiters.at(-1);\n\n if (delimiter?.character !== character) {\n return { kind: \"invalid\", offset: index };\n }\n\n this.#delimiters.pop();\n\n if (this.#outer !== undefined && this.#delimiters.length === 0) {\n return { kind: \"closed\", offset: index + 1 };\n }\n\n if (delimiter.resumesTemplate) {\n this.#state = \"template\";\n }\n }\n }\n\n return { kind: \"open\" };\n }\n\n public clone(): JavaScriptScanner {\n const copy = new JavaScriptScanner(this.#outer);\n copy.#source = this.#source;\n copy.#characterClass = this.#characterClass;\n copy.#delimiters.splice(0, copy.#delimiters.length, ...this.#delimiters);\n copy.#escaped = this.#escaped;\n copy.#state = this.#state;\n\n return copy;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { FlowContent, ListItemNode } from "../model.mjs";
2
+ import { BlockSyntax, ListItemSyntax } from "./block-syntax.mjs";
3
+ //#region src/parser/materialize-cache.d.ts
4
+ export interface CachedMaterialization<TNode> {
5
+ readonly node: TNode;
6
+ readonly nodeCount: number;
7
+ readonly depth: number;
8
+ readonly references: readonly string[];
9
+ }
10
+ /**
11
+ * Materialized nodes keyed by parser output identity, for materialization that
12
+ * keeps references. Resolving references depends on the definitions, so a
13
+ * resolving materialization does not use a cache.
14
+ */
15
+ export interface MaterializeCache {
16
+ readonly blocks: WeakMap<BlockSyntax, CachedMaterialization<FlowContent>>;
17
+ readonly items: WeakMap<ListItemSyntax, CachedMaterialization<ListItemNode>>;
18
+ /** A growing list's leading items, by the item they end with. */
19
+ readonly lists: WeakMap<ListItemSyntax, CachedListPrefix>;
20
+ }
21
+ /** The materialized first `index + 1` items of a list: the first `length` of `nodes`. */
22
+ export interface CachedListPrefix {
23
+ readonly index: number;
24
+ readonly nodes: ListItemNode[];
25
+ readonly length: number;
26
+ /** `nodes` belongs to the open list, which extends it in place on the next append. */
27
+ readonly live: boolean;
28
+ readonly nodeCount: number;
29
+ readonly depth: number;
30
+ readonly references: readonly string[];
31
+ }
32
+ export declare function createMaterializeCache(): MaterializeCache;
33
+ //#endregion
34
+ //# sourceMappingURL=materialize-cache.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize-cache.d.mts","names":[],"sources":["../../src/parser/materialize-cache.ts"],"mappings":";;;iBAGiB,sBAAsB;WAC5B,MAAM;WACN;WACA;WACA;;;;;;;iBAQM;WACN,QAAQ,QAAQ,aAAa,sBAAsB;WACnD,OAAO,QAAQ,gBAAgB,sBAAsB;;WAErD,OAAO,QAAQ,gBAAgB;;;iBAIzB;WACN;WACA,OAAO;WACP;;WAEA;WACA;WACA;WACA;;wBAGK,0BAA0B"}
@@ -0,0 +1,12 @@
1
+ //#region src/parser/materialize-cache.ts
2
+ function createMaterializeCache() {
3
+ return {
4
+ blocks: /* @__PURE__ */ new WeakMap(),
5
+ items: /* @__PURE__ */ new WeakMap(),
6
+ lists: /* @__PURE__ */ new WeakMap()
7
+ };
8
+ }
9
+ //#endregion
10
+ export { createMaterializeCache };
11
+
12
+ //# sourceMappingURL=materialize-cache.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize-cache.mjs","names":[],"sources":["../../src/parser/materialize-cache.ts"],"sourcesContent":["import type { FlowContent, ListItemNode } from \"../model.ts\";\nimport type { BlockSyntax, ListItemSyntax } from \"./block-syntax.ts\";\n\nexport interface CachedMaterialization<TNode> {\n readonly node: TNode;\n readonly nodeCount: number;\n readonly depth: number;\n readonly references: readonly string[];\n}\n\n/**\n * Materialized nodes keyed by parser output identity, for materialization that\n * keeps references. Resolving references depends on the definitions, so a\n * resolving materialization does not use a cache.\n */\nexport interface MaterializeCache {\n readonly blocks: WeakMap<BlockSyntax, CachedMaterialization<FlowContent>>;\n readonly items: WeakMap<ListItemSyntax, CachedMaterialization<ListItemNode>>;\n /** A growing list's leading items, by the item they end with. */\n readonly lists: WeakMap<ListItemSyntax, CachedListPrefix>;\n}\n\n/** The materialized first `index + 1` items of a list: the first `length` of `nodes`. */\nexport interface CachedListPrefix {\n readonly index: number;\n readonly nodes: ListItemNode[];\n readonly length: number;\n /** `nodes` belongs to the open list, which extends it in place on the next append. */\n readonly live: boolean;\n readonly nodeCount: number;\n readonly depth: number;\n readonly references: readonly string[];\n}\n\nexport function createMaterializeCache(): MaterializeCache {\n return { blocks: new WeakMap(), items: new WeakMap(), lists: new WeakMap() };\n}\n"],"mappings":";AAkCA,SAAgB,yBAA2C;CACzD,OAAO;EAAE,wBAAQ,IAAI,QAAQ;EAAG,uBAAO,IAAI,QAAQ;EAAG,uBAAO,IAAI,QAAQ;CAAE;AAC7E"}
@@ -0,0 +1,14 @@
1
+ import { SourceRange } from "../ranges.mjs";
2
+ import { JsxAttributeLike } from "../model.mjs";
3
+ import { SourceFile } from "../source.mjs";
4
+ //#region src/parser/materialize-jsx.d.ts
5
+ /** Children that start on a new line are Markdown flow content; same-line children are phrasing. */
6
+ export declare function isFlowJsxChildren(file: SourceFile, range: SourceRange): boolean;
7
+ export interface JsxParts {
8
+ readonly attributes: readonly JsxAttributeLike[];
9
+ readonly children: SourceRange | undefined;
10
+ readonly name: string | undefined;
11
+ }
12
+ export declare function jsxParts(authored: string, sourceOffset: number): JsxParts;
13
+ //#endregion
14
+ //# sourceMappingURL=materialize-jsx.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize-jsx.d.mts","names":[],"sources":["../../src/parser/materialize-jsx.ts"],"mappings":";;;;;wBAWgB,kBAAkB,MAAM,YAAY,OAAO;iBAI1C;WACN,qBAAqB;WACrB,UAAU;WACV;;wBAGK,SAAS,kBAAkB,uBAAuB"}
@@ -0,0 +1,76 @@
1
+ import { CompileError } from "../errors.mjs";
2
+ import { childNode, nodeArray, nodeValue } from "../javascript-ast.mjs";
3
+ import { parseJavaScriptExpression } from "../javascript.mjs";
4
+ import { isString } from "@temelj/value";
5
+ //#region src/parser/materialize-jsx.ts
6
+ /** Children that start on a new line are Markdown flow content; same-line children are phrasing. */
7
+ function isFlowJsxChildren(file, range) {
8
+ return /^[ \t]*(?:\r\n|\r|\n)/u.test(file.slice(range));
9
+ }
10
+ function jsxParts(authored, sourceOffset) {
11
+ const element = parseJavaScriptExpression(authored);
12
+ const fragment = element.type === "JSXFragment";
13
+ const opening = childNode(nodeValue(element, fragment ? "openingFragment" : "openingElement"));
14
+ const closing = childNode(nodeValue(element, fragment ? "closingFragment" : "closingElement"));
15
+ if (opening === void 0) throw CompileError.jsxElementOpeningMissing();
16
+ const name = fragment ? void 0 : childNode(nodeValue(opening, "name"));
17
+ if (!fragment && name === void 0) throw CompileError.jsxElementNameMissing();
18
+ return {
19
+ attributes: nodeArray(opening, "attributes").map((attribute) => jsxAttribute(attribute, authored, sourceOffset)),
20
+ children: closing === void 0 ? void 0 : range(sourceOffset + opening.end, sourceOffset + closing.start),
21
+ name: name === void 0 ? void 0 : authored.slice(name.start, name.end)
22
+ };
23
+ }
24
+ function jsxAttribute(attribute, opening, sourceOffset) {
25
+ const origin = range(sourceOffset + attribute.start, sourceOffset + attribute.end);
26
+ if (attribute.type === "JSXSpreadAttribute") {
27
+ const argument = childNode(nodeValue(attribute, "argument"));
28
+ if (argument === void 0) throw CompileError.jsxSpreadArgumentMissing();
29
+ return {
30
+ kind: "jsxSpreadAttribute",
31
+ code: opening.slice(argument.start, argument.end),
32
+ origin
33
+ };
34
+ }
35
+ const nameNode = childNode(nodeValue(attribute, "name"));
36
+ const name = nameNode === void 0 ? void 0 : opening.slice(nameNode.start, nameNode.end);
37
+ const value = childNode(nodeValue(attribute, "value"));
38
+ if (name === void 0) throw CompileError.jsxAttributeNameMissing();
39
+ if (value === void 0) return {
40
+ kind: "jsxAttribute",
41
+ name,
42
+ origin
43
+ };
44
+ if (value.type === "JSXExpressionContainer") {
45
+ const expression = childNode(nodeValue(value, "expression"));
46
+ if (expression === void 0 || expression.type === "JSXEmptyExpression") throw CompileError.jsxAttributeExpressionEmpty();
47
+ return {
48
+ kind: "jsxAttribute",
49
+ name,
50
+ value: {
51
+ kind: "jsxAttributeValueExpression",
52
+ code: opening.slice(expression.start, expression.end),
53
+ origin: range(sourceOffset + value.start, sourceOffset + value.end)
54
+ },
55
+ origin
56
+ };
57
+ }
58
+ const literal = nodeValue(value, "value");
59
+ if (!isString(literal)) throw CompileError.jsxAttributeExpressionEmpty();
60
+ return {
61
+ kind: "jsxAttribute",
62
+ name,
63
+ value: literal,
64
+ origin
65
+ };
66
+ }
67
+ function range(start, end) {
68
+ return {
69
+ start,
70
+ end
71
+ };
72
+ }
73
+ //#endregion
74
+ export { isFlowJsxChildren, jsxParts };
75
+
76
+ //# sourceMappingURL=materialize-jsx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize-jsx.mjs","names":[],"sources":["../../src/parser/materialize-jsx.ts"],"sourcesContent":["import { isString } from \"@temelj/value\";\n\nimport type { JsxAttributeLike } from \"../model.ts\";\nimport type { SourceRange } from \"../ranges.ts\";\nimport type { SourceFile } from \"../source.ts\";\n\nimport { CompileError } from \"../errors.ts\";\nimport { childNode, nodeArray, nodeValue, type JavaScriptNode } from \"../javascript-ast.ts\";\nimport { parseJavaScriptExpression } from \"../javascript.ts\";\n\n/** Children that start on a new line are Markdown flow content; same-line children are phrasing. */\nexport function isFlowJsxChildren(file: SourceFile, range: SourceRange): boolean {\n return /^[ \\t]*(?:\\r\\n|\\r|\\n)/u.test(file.slice(range));\n}\n\nexport interface JsxParts {\n readonly attributes: readonly JsxAttributeLike[];\n readonly children: SourceRange | undefined;\n readonly name: string | undefined;\n}\n\nexport function jsxParts(authored: string, sourceOffset: number): JsxParts {\n const element = parseJavaScriptExpression(authored);\n const fragment = element.type === \"JSXFragment\";\n const opening = childNode(nodeValue(element, fragment ? \"openingFragment\" : \"openingElement\"));\n const closing = childNode(nodeValue(element, fragment ? \"closingFragment\" : \"closingElement\"));\n\n if (opening === undefined) {\n throw CompileError.jsxElementOpeningMissing();\n }\n\n const name = fragment ? undefined : childNode(nodeValue(opening, \"name\"));\n\n if (!fragment && name === undefined) {\n throw CompileError.jsxElementNameMissing();\n }\n\n return {\n attributes: nodeArray(opening, \"attributes\").map((attribute) =>\n jsxAttribute(attribute, authored, sourceOffset),\n ),\n children:\n closing === undefined\n ? undefined\n : range(sourceOffset + opening.end, sourceOffset + closing.start),\n name: name === undefined ? undefined : authored.slice(name.start, name.end),\n };\n}\n\nfunction jsxAttribute(\n attribute: JavaScriptNode,\n opening: string,\n sourceOffset: number,\n): JsxAttributeLike {\n const origin = range(sourceOffset + attribute.start, sourceOffset + attribute.end);\n\n if (attribute.type === \"JSXSpreadAttribute\") {\n const argument = childNode(nodeValue(attribute, \"argument\"));\n\n if (argument === undefined) {\n throw CompileError.jsxSpreadArgumentMissing();\n }\n\n return {\n kind: \"jsxSpreadAttribute\",\n code: opening.slice(argument.start, argument.end),\n origin,\n };\n }\n\n const nameNode = childNode(nodeValue(attribute, \"name\"));\n const name = nameNode === undefined ? undefined : opening.slice(nameNode.start, nameNode.end);\n const value = childNode(nodeValue(attribute, \"value\"));\n\n if (name === undefined) {\n throw CompileError.jsxAttributeNameMissing();\n }\n\n if (value === undefined) {\n return { kind: \"jsxAttribute\", name, origin };\n }\n\n if (value.type === \"JSXExpressionContainer\") {\n const expression = childNode(nodeValue(value, \"expression\"));\n\n if (expression === undefined || expression.type === \"JSXEmptyExpression\") {\n throw CompileError.jsxAttributeExpressionEmpty();\n }\n\n return {\n kind: \"jsxAttribute\",\n name,\n value: {\n kind: \"jsxAttributeValueExpression\",\n code: opening.slice(expression.start, expression.end),\n origin: range(sourceOffset + value.start, sourceOffset + value.end),\n },\n origin,\n };\n }\n\n // String literals keep JSX semantics, including decoded character references.\n const literal = nodeValue(value, \"value\");\n\n if (!isString(literal)) {\n throw CompileError.jsxAttributeExpressionEmpty();\n }\n\n return { kind: \"jsxAttribute\", name, value: literal, origin };\n}\n\nfunction range(start: number, end: number): SourceRange {\n return { start, end };\n}\n"],"mappings":";;;;;;AAWA,SAAgB,kBAAkB,MAAkB,OAA6B;CAC/E,OAAO,yBAAyB,KAAK,KAAK,MAAM,KAAK,CAAC;AACxD;AAQA,SAAgB,SAAS,UAAkB,cAAgC;CACzE,MAAM,UAAU,0BAA0B,QAAQ;CAClD,MAAM,WAAW,QAAQ,SAAS;CAClC,MAAM,UAAU,UAAU,UAAU,SAAS,WAAW,oBAAoB,gBAAgB,CAAC;CAC7F,MAAM,UAAU,UAAU,UAAU,SAAS,WAAW,oBAAoB,gBAAgB,CAAC;CAE7F,IAAI,YAAY,KAAA,GACd,MAAM,aAAa,yBAAyB;CAG9C,MAAM,OAAO,WAAW,KAAA,IAAY,UAAU,UAAU,SAAS,MAAM,CAAC;CAExE,IAAI,CAAC,YAAY,SAAS,KAAA,GACxB,MAAM,aAAa,sBAAsB;CAG3C,OAAO;EACL,YAAY,UAAU,SAAS,YAAY,CAAC,CAAC,KAAK,cAChD,aAAa,WAAW,UAAU,YAAY,CAChD;EACA,UACE,YAAY,KAAA,IACR,KAAA,IACA,MAAM,eAAe,QAAQ,KAAK,eAAe,QAAQ,KAAK;EACpE,MAAM,SAAS,KAAA,IAAY,KAAA,IAAY,SAAS,MAAM,KAAK,OAAO,KAAK,GAAG;CAC5E;AACF;AAEA,SAAS,aACP,WACA,SACA,cACkB;CAClB,MAAM,SAAS,MAAM,eAAe,UAAU,OAAO,eAAe,UAAU,GAAG;CAEjF,IAAI,UAAU,SAAS,sBAAsB;EAC3C,MAAM,WAAW,UAAU,UAAU,WAAW,UAAU,CAAC;EAE3D,IAAI,aAAa,KAAA,GACf,MAAM,aAAa,yBAAyB;EAG9C,OAAO;GACL,MAAM;GACN,MAAM,QAAQ,MAAM,SAAS,OAAO,SAAS,GAAG;GAChD;EACF;CACF;CAEA,MAAM,WAAW,UAAU,UAAU,WAAW,MAAM,CAAC;CACvD,MAAM,OAAO,aAAa,KAAA,IAAY,KAAA,IAAY,QAAQ,MAAM,SAAS,OAAO,SAAS,GAAG;CAC5F,MAAM,QAAQ,UAAU,UAAU,WAAW,OAAO,CAAC;CAErD,IAAI,SAAS,KAAA,GACX,MAAM,aAAa,wBAAwB;CAG7C,IAAI,UAAU,KAAA,GACZ,OAAO;EAAE,MAAM;EAAgB;EAAM;CAAO;CAG9C,IAAI,MAAM,SAAS,0BAA0B;EAC3C,MAAM,aAAa,UAAU,UAAU,OAAO,YAAY,CAAC;EAE3D,IAAI,eAAe,KAAA,KAAa,WAAW,SAAS,sBAClD,MAAM,aAAa,4BAA4B;EAGjD,OAAO;GACL,MAAM;GACN;GACA,OAAO;IACL,MAAM;IACN,MAAM,QAAQ,MAAM,WAAW,OAAO,WAAW,GAAG;IACpD,QAAQ,MAAM,eAAe,MAAM,OAAO,eAAe,MAAM,GAAG;GACpE;GACA;EACF;CACF;CAGA,MAAM,UAAU,UAAU,OAAO,OAAO;CAExC,IAAI,CAAC,SAAS,OAAO,GACnB,MAAM,aAAa,4BAA4B;CAGjD,OAAO;EAAE,MAAM;EAAgB;EAAM,OAAO;EAAS;CAAO;AAC9D;AAEA,SAAS,MAAM,OAAe,KAA0B;CACtD,OAAO;EAAE;EAAO;CAAI;AACtB"}
@@ -0,0 +1,61 @@
1
+ import { SourceRange } from "../ranges.mjs";
2
+ import { ResolvedSyntaxOptions } from "../syntax-options.mjs";
3
+ import { DocumentNode, FlowContent, PhrasingContent } from "../model.mjs";
4
+ import { SourceFile } from "../source.mjs";
5
+ import { Diagnostic } from "../diagnostics.mjs";
6
+ import { ResolvedParserLimits } from "./config.mjs";
7
+ import { BlockSyntax } from "./block-syntax.mjs";
8
+ import { DefinitionLookup, InlineSyntax } from "./inline-syntax.mjs";
9
+ import { MaterializeCache } from "./materialize-cache.mjs";
10
+ //#region src/parser/materialize.d.ts
11
+ export interface MaterializedBlock {
12
+ readonly references: readonly string[];
13
+ readonly nodeCount: number;
14
+ readonly node: FlowContent;
15
+ }
16
+ export interface MaterializeOptions {
17
+ /** Definitions already known to a stream, including definitions in other blocks. */
18
+ readonly definitionLookup?: DefinitionLookup;
19
+ /**
20
+ * Keeps references whose definitions are missing, for a stream where the
21
+ * definitions may still arrive. Otherwise they become authored text.
22
+ */
23
+ readonly keepReferences?: boolean;
24
+ /** Open embedded syntax at the end of the source is inert instead of invalid. */
25
+ readonly allowIncomplete?: boolean;
26
+ readonly cache?: MaterializeCache;
27
+ /**
28
+ * The range of a stream's open leaf. A stream renders that leaf itself, so it
29
+ * materializes as an empty placeholder with the same kind and origin.
30
+ */
31
+ readonly open?: SourceRange;
32
+ }
33
+ export type StrictMaterializeResult = Readonly<{
34
+ kind: "ok";
35
+ document: DocumentNode;
36
+ blocks: readonly MaterializedBlock[];
37
+ diagnostics: readonly Diagnostic[];
38
+ }> | Readonly<{
39
+ kind: "invalid";
40
+ diagnostics: readonly [Diagnostic, ...Diagnostic[]];
41
+ }> | Readonly<{
42
+ kind: "limitExceeded";
43
+ limit: "maximumNestingDepth" | "maximumNodes";
44
+ diagnostics: readonly [Diagnostic, ...Diagnostic[]];
45
+ }>;
46
+ export declare function materializeDocument(file: SourceFile, blocks: readonly BlockSyntax[], syntax: ResolvedSyntaxOptions, limits: ResolvedParserLimits, options?: MaterializeOptions): StrictMaterializeResult;
47
+ export interface MaterializedPhrasing {
48
+ readonly nodes: readonly PhrasingContent[];
49
+ readonly nodeCount: number;
50
+ }
51
+ /** Materialized phrasing by inline syntax identity, valid while references are kept. */
52
+ export type PhrasingCache = WeakMap<InlineSyntax, MaterializedPhrasing>;
53
+ /**
54
+ * Materializes parsed inline syntax that a stream renders outside a block,
55
+ * keeping references.
56
+ */
57
+ export declare function materializePhrasing(file: SourceFile, nodes: readonly InlineSyntax[], syntax: ResolvedSyntaxOptions, limits: ResolvedParserLimits): MaterializedPhrasing;
58
+ /** Independent inline groups share one context while retaining their own node budgets. */
59
+ export declare function materializePhrasingGroups(file: SourceFile, nodes: readonly InlineSyntax[], syntax: ResolvedSyntaxOptions, limits: ResolvedParserLimits, cache: PhrasingCache): readonly MaterializedPhrasing[];
60
+ //#endregion
61
+ //# sourceMappingURL=materialize.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materialize.d.mts","names":[],"sources":["../../src/parser/materialize.ts"],"mappings":";;;;;;;;;;iBAuCiB;WACN;WACA;WACA,MAAM;;iBAGA;;WAEN,mBAAmB;;;;;WAKnB;;WAEA;WACA,QAAQ;;;;;WAKR,OAAO;;YAGN,0BACR;EACE;EACA,UAAU;EACV,iBAAiB;EACjB,sBAAsB;KAExB;EAAW;EAAiB,uBAAuB,eAAe;KAClE;EACE;EACA;EACA,uBAAuB,eAAe;;wBAgC5B,oBACd,MAAM,YACN,iBAAiB,eACjB,QAAQ,uBACR,QAAQ,sBACR,UAAS,qBACR;iBAkGc;WACN,gBAAgB;WAChB;;;YAIC,gBAAgB,QAAQ,cAAc;;;;;wBAMlC,oBACd,MAAM,YACN,gBAAgB,gBAChB,QAAQ,uBACR,QAAQ,uBACP;;wBAoBa,0BACd,MAAM,YACN,gBAAgB,gBAChB,QAAQ,uBACR,QAAQ,sBACR,OAAO,yBACG"}