@localix-ai/flowdown 0.0.0-stage → 0.5.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 (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -2
  3. package/dist/browser/file-actions.js +80 -0
  4. package/dist/browser/file-actions.js.map +1 -0
  5. package/dist/core/block-facts.js +72 -0
  6. package/dist/core/block-facts.js.map +1 -0
  7. package/dist/core/blocks.d.ts +25 -0
  8. package/dist/core/blocks.js +463 -0
  9. package/dist/core/blocks.js.map +1 -0
  10. package/dist/core/bounded-cache.js +42 -0
  11. package/dist/core/bounded-cache.js.map +1 -0
  12. package/dist/core/dollars.d.ts +12 -0
  13. package/dist/core/dollars.js +88 -0
  14. package/dist/core/dollars.js.map +1 -0
  15. package/dist/core/fence-scan.js +53 -0
  16. package/dist/core/fence-scan.js.map +1 -0
  17. package/dist/core/file-tree-parse.d.ts +26 -0
  18. package/dist/core/file-tree-parse.js +51 -0
  19. package/dist/core/file-tree-parse.js.map +1 -0
  20. package/dist/core/forms-html.js +63 -0
  21. package/dist/core/forms-html.js.map +1 -0
  22. package/dist/core/forms.d.ts +28 -0
  23. package/dist/core/forms.js +23 -0
  24. package/dist/core/forms.js.map +1 -0
  25. package/dist/core/headings.d.ts +11 -0
  26. package/dist/core/headings.js +74 -0
  27. package/dist/core/headings.js.map +1 -0
  28. package/dist/core/heal.d.ts +11 -0
  29. package/dist/core/heal.js +220 -0
  30. package/dist/core/heal.js.map +1 -0
  31. package/dist/core/load-once.js +23 -0
  32. package/dist/core/load-once.js.map +1 -0
  33. package/dist/core/math-delimiters.js +33 -0
  34. package/dist/core/math-delimiters.js.map +1 -0
  35. package/dist/core/math-syntax.js +56 -0
  36. package/dist/core/math-syntax.js.map +1 -0
  37. package/dist/core/prose.d.ts +10 -0
  38. package/dist/core/prose.js +77 -0
  39. package/dist/core/prose.js.map +1 -0
  40. package/dist/core/remark-answer-blocks.d.ts +5 -0
  41. package/dist/core/remark-answer-blocks.js +172 -0
  42. package/dist/core/remark-answer-blocks.js.map +1 -0
  43. package/dist/core/remark-answer-containers.js +299 -0
  44. package/dist/core/remark-answer-containers.js.map +1 -0
  45. package/dist/core/sanitize-schema.d.ts +18 -0
  46. package/dist/core/sanitize-schema.js +62 -0
  47. package/dist/core/sanitize-schema.js.map +1 -0
  48. package/dist/core/syntax.d.ts +8 -0
  49. package/dist/core/syntax.js +32 -0
  50. package/dist/core/syntax.js.map +1 -0
  51. package/dist/dialect.d.ts +92 -0
  52. package/dist/dialect.js +176 -0
  53. package/dist/dialect.js.map +1 -0
  54. package/dist/document/fence.d.ts +25 -0
  55. package/dist/document/fence.js +101 -0
  56. package/dist/document/fence.js.map +1 -0
  57. package/dist/document/index.d.ts +46 -0
  58. package/dist/document/index.js +66 -0
  59. package/dist/document/index.js.map +1 -0
  60. package/dist/document/table.d.ts +11 -0
  61. package/dist/document/table.js +35 -0
  62. package/dist/document/table.js.map +1 -0
  63. package/dist/dom/index.d.ts +21 -0
  64. package/dist/dom/index.js +123 -0
  65. package/dist/dom/index.js.map +1 -0
  66. package/dist/dom/patch.js +104 -0
  67. package/dist/dom/patch.js.map +1 -0
  68. package/dist/element/index.d.ts +29 -0
  69. package/dist/element/index.js +64 -0
  70. package/dist/element/index.js.map +1 -0
  71. package/dist/engine/blocks.js +774 -0
  72. package/dist/engine/blocks.js.map +1 -0
  73. package/dist/engine/entities.js +83 -0
  74. package/dist/engine/entities.js.map +1 -0
  75. package/dist/engine/entity-core.js +9 -0
  76. package/dist/engine/entity-core.js.map +1 -0
  77. package/dist/engine/entity-table.js +9 -0
  78. package/dist/engine/entity-table.js.map +1 -0
  79. package/dist/engine/html.d.ts +7 -0
  80. package/dist/engine/html.js +207 -0
  81. package/dist/engine/html.js.map +1 -0
  82. package/dist/engine/index.d.ts +7 -0
  83. package/dist/engine/index.js +74 -0
  84. package/dist/engine/index.js.map +1 -0
  85. package/dist/engine/inlines.js +852 -0
  86. package/dist/engine/inlines.js.map +1 -0
  87. package/dist/engine/types.d.ts +109 -0
  88. package/dist/engine/url.d.ts +11 -0
  89. package/dist/engine/url.js +16 -0
  90. package/dist/engine/url.js.map +1 -0
  91. package/dist/engine/visit.d.ts +10 -0
  92. package/dist/engine/visit.js +29 -0
  93. package/dist/engine/visit.js.map +1 -0
  94. package/dist/highlight/highlight.d.ts +4 -0
  95. package/dist/highlight/highlight.js +144 -0
  96. package/dist/highlight/highlight.js.map +1 -0
  97. package/dist/highlight/index.d.ts +4 -0
  98. package/dist/highlight/index.js +18 -0
  99. package/dist/highlight/index.js.map +1 -0
  100. package/dist/html/index.d.ts +4 -0
  101. package/dist/html/index.js +544 -0
  102. package/dist/html/index.js.map +1 -0
  103. package/dist/index.d.ts +27 -0
  104. package/dist/index.js +13 -0
  105. package/dist/math/index.d.ts +17 -0
  106. package/dist/math/index.js +20 -0
  107. package/dist/math/index.js.map +1 -0
  108. package/dist/math/typeset.d.ts +12 -0
  109. package/dist/math/typeset.js +74 -0
  110. package/dist/math/typeset.js.map +1 -0
  111. package/dist/mermaid/diagram.d.ts +8 -0
  112. package/dist/mermaid/diagram.js +114 -0
  113. package/dist/mermaid/diagram.js.map +1 -0
  114. package/dist/mermaid/drawing.js +139 -0
  115. package/dist/mermaid/drawing.js.map +1 -0
  116. package/dist/mermaid/icons.js +16 -0
  117. package/dist/mermaid/icons.js.map +1 -0
  118. package/dist/mermaid/index.d.ts +13 -0
  119. package/dist/mermaid/index.js +3 -0
  120. package/dist/mermaid/loader.d.ts +5 -0
  121. package/dist/mermaid/loader.js +18 -0
  122. package/dist/mermaid/loader.js.map +1 -0
  123. package/dist/mermaid/look.d.ts +16 -0
  124. package/dist/mermaid/look.js +167 -0
  125. package/dist/mermaid/look.js.map +1 -0
  126. package/dist/mermaid/normalize-svg.js +44 -0
  127. package/dist/mermaid/normalize-svg.js.map +1 -0
  128. package/dist/mermaid/renderer.d.ts +22 -0
  129. package/dist/mermaid/renderer.js +132 -0
  130. package/dist/mermaid/renderer.js.map +1 -0
  131. package/dist/mermaid/viewer.js +309 -0
  132. package/dist/mermaid/viewer.js.map +1 -0
  133. package/dist/prompt/index.d.ts +19 -0
  134. package/dist/prompt/index.js +54 -0
  135. package/dist/prompt/index.js.map +1 -0
  136. package/dist/react/callout.d.ts +9 -0
  137. package/dist/react/callout.js +12 -0
  138. package/dist/react/callout.js.map +1 -0
  139. package/dist/react/code-block.d.ts +18 -0
  140. package/dist/react/code-block.js +81 -0
  141. package/dist/react/code-block.js.map +1 -0
  142. package/dist/react/context.d.ts +18 -0
  143. package/dist/react/context.js +17 -0
  144. package/dist/react/context.js.map +1 -0
  145. package/dist/react/draw.d.ts +2 -0
  146. package/dist/react/draw.js +16 -0
  147. package/dist/react/draw.js.map +1 -0
  148. package/dist/react/file-tree.d.ts +16 -0
  149. package/dist/react/file-tree.js +69 -0
  150. package/dist/react/file-tree.js.map +1 -0
  151. package/dist/react/growing-code.js +36 -0
  152. package/dist/react/growing-code.js.map +1 -0
  153. package/dist/react/helpers.d.ts +6 -0
  154. package/dist/react/helpers.js +17 -0
  155. package/dist/react/helpers.js.map +1 -0
  156. package/dist/react/icons.js +23 -0
  157. package/dist/react/icons.js.map +1 -0
  158. package/dist/react/labels.js +9 -0
  159. package/dist/react/labels.js.map +1 -0
  160. package/dist/react/markdown.d.ts +78 -0
  161. package/dist/react/markdown.js +204 -0
  162. package/dist/react/markdown.js.map +1 -0
  163. package/dist/react/render.d.ts +8 -0
  164. package/dist/react/render.js +41 -0
  165. package/dist/react/render.js.map +1 -0
  166. package/dist/react/table-rows.js +66 -0
  167. package/dist/react/table-rows.js.map +1 -0
  168. package/dist/react/table.js +36 -0
  169. package/dist/react/table.js.map +1 -0
  170. package/dist/react/tabs.d.ts +25 -0
  171. package/dist/react/tabs.js +58 -0
  172. package/dist/react/tabs.js.map +1 -0
  173. package/dist/react/use-smooth-text.d.ts +6 -0
  174. package/dist/react/use-smooth-text.js +156 -0
  175. package/dist/react/use-smooth-text.js.map +1 -0
  176. package/dist/react/use-stage.d.ts +9 -0
  177. package/dist/react/use-stage.js +57 -0
  178. package/dist/react/use-stage.js.map +1 -0
  179. package/dist/remark.d.ts +20 -0
  180. package/dist/remark.js +10 -0
  181. package/dist/render/factory.d.ts +15 -0
  182. package/dist/render/labels.d.ts +41 -0
  183. package/dist/render/labels.js +43 -0
  184. package/dist/render/labels.js.map +1 -0
  185. package/dist/render/tree.js +312 -0
  186. package/dist/render/tree.js.map +1 -0
  187. package/dist/render/view.d.ts +55 -0
  188. package/dist/render/view.js +302 -0
  189. package/dist/render/view.js.map +1 -0
  190. package/dist/render/views.d.ts +16 -0
  191. package/dist/render/views.js +261 -0
  192. package/dist/render/views.js.map +1 -0
  193. package/dist/render/vnode.d.ts +21 -0
  194. package/dist/render/vnode.js +194 -0
  195. package/dist/render/vnode.js.map +1 -0
  196. package/dist/static/index.d.ts +28 -0
  197. package/dist/static/index.js +27 -0
  198. package/dist/static/index.js.map +1 -0
  199. package/dist/stream.d.ts +12 -0
  200. package/dist/stream.js +3 -0
  201. package/dist/styles.css +1351 -0
  202. package/dist/tui/code.d.ts +5 -0
  203. package/dist/tui/code.js +240 -0
  204. package/dist/tui/code.js.map +1 -0
  205. package/dist/tui/index.d.ts +54 -0
  206. package/dist/tui/index.js +99 -0
  207. package/dist/tui/index.js.map +1 -0
  208. package/dist/tui/math.js +242 -0
  209. package/dist/tui/math.js.map +1 -0
  210. package/dist/tui/printable.d.ts +12 -0
  211. package/dist/tui/printable.js +31 -0
  212. package/dist/tui/printable.js.map +1 -0
  213. package/dist/tui/render.d.ts +12 -0
  214. package/dist/tui/render.js +524 -0
  215. package/dist/tui/render.js.map +1 -0
  216. package/dist/tui/style.d.ts +35 -0
  217. package/dist/tui/style.js +77 -0
  218. package/dist/tui/style.js.map +1 -0
  219. package/dist/tui/table.js +73 -0
  220. package/dist/tui/table.js.map +1 -0
  221. package/dist/tui/width.d.ts +2 -0
  222. package/dist/tui/width.js +133 -0
  223. package/dist/tui/width.js.map +1 -0
  224. package/dist/tui/wrap.d.ts +8 -0
  225. package/dist/tui/wrap.js +190 -0
  226. package/dist/tui/wrap.js.map +1 -0
  227. package/package.json +127 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","names":[],"sources":["../../src/engine/html.ts"],"sourcesContent":["/**\n * The tree as HTML text, in the form the CommonMark and GFM specs print their examples: what the\n * conformance tests compare, and what a page without React can put in a document.\n *\n * Raw HTML in the source is passed through as written. A page that shows text it did not write\n * must sanitize the result; `<Markdown>` does so on its own.\n */\nimport { normalizeUri } from './entities'\nimport type { Node } from './types'\n\nconst reEscape = /[&<>\"]/g\nconst ESCAPES: Record<string, string> = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }\n\nexport const escapeHtml = (text: string): string =>\n reEscape.test(text) ? text.replace(reEscape, (char) => ESCAPES[char] as string) : text\n\n/** GFM's tag filter: the tags that change how the rest of a page is read are shown as text. */\nconst reFiltered =\n /<(?=\\/?(?:title|textarea|style|xmp|iframe|noembed|noframes|script|plaintext)(?:[\\s/>]|$))/gi\n\nexport interface HtmlOptions {\n /** Applies GFM's tag filter to raw HTML. */\n tagFilter?: boolean\n}\n\nexport const toHtml = (root: Node, options: HtmlOptions = {}): string => {\n let out = ''\n /**\n * The last character written. `cr` asks for it after every block, and reading it from `out`\n * would make the engine flatten the string built so far each time: quadratic in the document.\n */\n let lastChar = 10\n const put = (text: string): void => {\n if (text === '') return\n out += text\n lastChar = text.charCodeAt(text.length - 1)\n }\n /** Starts a new line unless the output is already at the start of one (or of the document). */\n const cr = (): void => {\n if (lastChar !== 10) put('\\n')\n }\n const raw = (value: string): string =>\n options.tagFilter ? value.replace(reFiltered, '&lt;') : value\n\n /** Whether the nodes being written are text-level: HTML among them is not a block. */\n let inline = false\n\n const all = (nodes: Node[] | undefined, tight: boolean): void => {\n if (nodes) for (const node of nodes) one(node, tight)\n }\n\n const phrasing = (nodes: Node[] | undefined): void => {\n const was = inline\n inline = true\n all(nodes, false)\n inline = was\n }\n\n const one = (node: Node, tight: boolean): void => {\n switch (node.type) {\n case 'root':\n all(node.children, false)\n break\n case 'text':\n put(escapeHtml(node.value ?? ''))\n break\n case 'break':\n put('<br />\\n')\n break\n case 'emphasis':\n put('<em>')\n all(node.children, false)\n put('</em>')\n break\n case 'strong':\n put('<strong>')\n all(node.children, false)\n put('</strong>')\n break\n case 'delete':\n put('<del>')\n all(node.children, false)\n put('</del>')\n break\n case 'inlineCode':\n put(`<code>${escapeHtml(node.value ?? '')}</code>`)\n break\n case 'link':\n put(`<a href=\"${escapeHtml(node.url ?? '')}\"`)\n if (node.title) put(` title=\"${escapeHtml(node.title)}\"`)\n put('>')\n all(node.children, false)\n put('</a>')\n break\n case 'image':\n put(`<img src=\"${escapeHtml(node.url ?? '')}\" alt=\"${escapeHtml(node.alt ?? '')}\"`)\n if (node.title) put(` title=\"${escapeHtml(node.title)}\"`)\n put(' />')\n break\n case 'footnoteReference': {\n const id = normalizeUri(node.label ?? '')\n const nth = (node.occurrence ?? 1) > 1 ? `-${node.occurrence}` : ''\n put(\n `<sup class=\"footnote-ref\"><a href=\"#fn-${id}\" id=\"fnref-${id}${nth}\" data-footnote-ref>${node.index}</a></sup>`,\n )\n break\n }\n case 'footnotes':\n cr()\n put('<section class=\"footnotes\" data-footnotes>\\n<ol>\\n')\n all(node.children, false)\n put('</ol>\\n</section>\\n')\n break\n case 'footnoteDefinition': {\n const id = normalizeUri(node.label ?? '')\n let back = ''\n for (let nth = 1; nth <= (node.count ?? 1); nth++) {\n const suffix = nth > 1 ? `-${nth}` : ''\n back += `${nth > 1 ? ' ' : ''}<a href=\"#fnref-${id}${suffix}\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"${node.index}${suffix}\" aria-label=\"Back to reference ${node.index}${suffix}\">↩${nth > 1 ? `<sup class=\"footnote-ref\">${nth}</sup>` : ''}</a>`\n }\n put(`<li id=\"fn-${id}\">\\n`)\n const children = node.children ?? []\n const last = children[children.length - 1]\n for (const child of children) {\n if (child === last && child.type === 'paragraph') {\n put('<p>')\n phrasing(child.children)\n put(` ${back}</p>\\n`)\n } else one(child, false)\n }\n if (last === undefined || last.type !== 'paragraph') put(`${back}\\n`)\n put('</li>\\n')\n break\n }\n case 'paragraph':\n if (tight) phrasing(node.children)\n else {\n cr()\n put('<p>')\n phrasing(node.children)\n put('</p>\\n')\n }\n break\n case 'heading':\n cr()\n put(`<h${node.depth}>`)\n phrasing(node.children)\n put(`</h${node.depth}>\\n`)\n break\n case 'thematicBreak':\n cr()\n put('<hr />\\n')\n break\n case 'blockquote':\n cr()\n put('<blockquote>\\n')\n all(node.children, false)\n cr()\n put('</blockquote>\\n')\n break\n case 'code':\n cr()\n put(node.lang ? `<pre><code class=\"language-${escapeHtml(node.lang)}\">` : '<pre><code>')\n put(`${escapeHtml(node.value ?? '')}</code></pre>\\n`)\n break\n case 'html':\n if (inline) put(raw(node.value ?? ''))\n else {\n cr()\n put(`${raw(node.value ?? '')}\\n`)\n }\n break\n case 'list': {\n const tag = node.ordered ? 'ol' : 'ul'\n cr()\n put(node.ordered && node.start !== 1 ? `<ol start=\"${node.start}\">\\n` : `<${tag}>\\n`)\n all(node.children, node.spread === false)\n cr()\n put(`</${tag}>\\n`)\n break\n }\n case 'listItem':\n put('<li>')\n if (node.checked !== undefined)\n put(`<input ${node.checked ? 'checked=\"\" ' : ''}disabled=\"\" type=\"checkbox\"> `)\n all(node.children, tight)\n put('</li>\\n')\n break\n case 'table': {\n const rows = node.children ?? []\n cr()\n put('<table>\\n<thead>\\n')\n if (rows[0]) one(rows[0], false)\n put('</thead>\\n')\n if (rows.length > 1) {\n put('<tbody>\\n')\n for (let index = 1; index < rows.length; index++) one(rows[index] as Node, false)\n put('</tbody>\\n')\n }\n put('</table>\\n')\n break\n }\n case 'tableRow':\n put('<tr>\\n')\n all(node.children, false)\n put('</tr>\\n')\n break\n case 'tableCell': {\n const tag = node.header ? 'th' : 'td'\n put(node.cellAlign ? `<${tag} align=\"${node.cellAlign}\">` : `<${tag}>`)\n phrasing(node.children)\n put(`</${tag}>\\n`)\n break\n }\n default:\n all(node.children, tight)\n }\n }\n one(root, false)\n return out\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Align, Extension, FenceRule, InlineRule, InlineState, Node, NodeType, ParseOptions, Reference } from "./types.js";
2
+ import { HtmlOptions, escapeHtml, toHtml } from "./html.js";
3
+ import { UrlTransform, defaultUrlTransform } from "./url.js";
4
+ import { Visitor, toText, visit } from "./visit.js";
5
+ /** Parses Markdown into its tree. */
6
+ export declare const parse: (markdown: string, options?: ParseOptions) => Node;
7
+ export { type Align, type Extension, type FenceRule, type HtmlOptions, type InlineRule, type InlineState, type Node, type NodeType, type ParseOptions, type Reference, type UrlTransform, type Visitor, defaultUrlTransform, escapeHtml, toHtml, toText, visit };
@@ -0,0 +1,74 @@
1
+ import { parseBlocks } from "./blocks.js";
2
+ import { isolated, specialCharacters } from "./inlines.js";
3
+ import { escapeHtml, toHtml } from "./html.js";
4
+ import { defaultUrlTransform } from "./url.js";
5
+ import { toText, visit } from "./visit.js";
6
+ // src/engine/index.ts
7
+ /**
8
+ * The flowdown engine: Markdown text in, a tree out. CommonMark in full, GitHub's extensions,
9
+ * and whatever a page registers on top, with no dependency.
10
+ */
11
+ const prepare = (gfm, extensions) => {
12
+ const rules = [];
13
+ let chars = "";
14
+ for (const extension of extensions) for (const rule of extension.inline ?? []) {
15
+ chars += rule.chars;
16
+ for (const char of rule.chars) (rules[char.charCodeAt(0)] ??= []).push(rule.parse);
17
+ }
18
+ return {
19
+ gfm,
20
+ math: extensions.some((extension) => extension.mathFences === true),
21
+ rules,
22
+ special: specialCharacters(chars),
23
+ extensions
24
+ };
25
+ };
26
+ const NO_EXTENSIONS = [];
27
+ const prepared = /* @__PURE__ */ new WeakMap();
28
+ /** The prepared form of an options object's extensions, made once per array. */
29
+ const preparedFor = (gfm, extensions) => {
30
+ let pair = prepared.get(extensions);
31
+ if (pair === void 0) prepared.set(extensions, pair = [void 0, void 0]);
32
+ return pair[gfm ? 1 : 0] ??= prepare(gfm, extensions);
33
+ };
34
+ const applyFences = (node, extensions) => {
35
+ const children = node.children;
36
+ if (children === void 0) return;
37
+ for (let index = 0; index < children.length; index++) {
38
+ const child = children[index];
39
+ if (child.type === "code" && child.lang !== void 0) for (const extension of extensions) {
40
+ const replaced = extension.fences?.[child.lang]?.(child);
41
+ if (replaced) {
42
+ children[index] = replaced;
43
+ break;
44
+ }
45
+ }
46
+ else applyFences(child, extensions);
47
+ }
48
+ };
49
+ /** Parses Markdown into its tree. */
50
+ const parse = (markdown, options = {}) => {
51
+ const use = preparedFor(options.gfm !== false, options.extensions ?? NO_EXTENSIONS);
52
+ const context = {
53
+ refs: /* @__PURE__ */ new Map(),
54
+ footnotes: /* @__PURE__ */ new Map(),
55
+ footnoteUses: /* @__PURE__ */ new Map(),
56
+ gfm: use.gfm,
57
+ math: use.math,
58
+ rules: use.rules,
59
+ special: use.special
60
+ };
61
+ const { root, footnotes } = isolated(() => parseBlocks(markdown, context));
62
+ if (footnotes.length > 0) root.children?.push({
63
+ type: "footnotes",
64
+ children: footnotes
65
+ });
66
+ for (const extension of use.extensions) {
67
+ if (extension.fences) applyFences(root, [extension]);
68
+ extension.transform?.(root, markdown);
69
+ }
70
+ return root;
71
+ };
72
+ export { defaultUrlTransform, escapeHtml, parse, toHtml, toText, visit };
73
+
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/engine/index.ts"],"sourcesContent":["/**\n * The flowdown engine: Markdown text in, a tree out. CommonMark in full, GitHub's extensions,\n * and whatever a page registers on top, with no dependency.\n */\nimport { parseBlocks } from './blocks'\nimport { isolated, specialCharacters, type InlineContext } from './inlines'\nimport type { Extension, InlineRule, Node, ParseOptions } from './types'\n\nexport { toHtml, escapeHtml, type HtmlOptions } from './html'\nexport { defaultUrlTransform, type UrlTransform } from './url'\nexport { toText, visit, type Visitor } from './visit'\nexport type {\n Align,\n Extension,\n FenceRule,\n InlineRule,\n InlineState,\n Node,\n NodeType,\n ParseOptions,\n Reference,\n} from './types'\n\n/** A set of extensions made ready once: the lookups the parser uses on every character. */\ninterface Prepared {\n gfm: boolean\n math: boolean\n rules: (InlineRule['parse'][] | undefined)[]\n special: Uint8Array\n extensions: Extension[]\n}\n\nconst prepare = (gfm: boolean, extensions: Extension[]): Prepared => {\n const rules: (InlineRule['parse'][] | undefined)[] = []\n let chars = ''\n for (const extension of extensions) {\n for (const rule of extension.inline ?? []) {\n chars += rule.chars\n for (const char of rule.chars) (rules[char.charCodeAt(0)] ??= []).push(rule.parse)\n }\n }\n return {\n gfm,\n math: extensions.some((extension) => extension.mathFences === true),\n rules,\n special: specialCharacters(chars),\n extensions,\n }\n}\n\nconst NO_EXTENSIONS: Extension[] = []\nconst prepared = new WeakMap<Extension[], [Prepared | undefined, Prepared | undefined]>()\n\n/** The prepared form of an options object's extensions, made once per array. */\nconst preparedFor = (gfm: boolean, extensions: Extension[]): Prepared => {\n let pair = prepared.get(extensions)\n if (pair === undefined) prepared.set(extensions, (pair = [undefined, undefined]))\n return (pair[gfm ? 1 : 0] ??= prepare(gfm, extensions))\n}\n\nconst applyFences = (node: Node, extensions: Extension[]): void => {\n const children = node.children\n if (children === undefined) return\n for (let index = 0; index < children.length; index++) {\n const child = children[index] as Node\n if (child.type === 'code' && child.lang !== undefined) {\n for (const extension of extensions) {\n const replaced = extension.fences?.[child.lang]?.(child)\n if (replaced) {\n children[index] = replaced\n break\n }\n }\n } else applyFences(child, extensions)\n }\n}\n\n/** Parses Markdown into its tree. */\nexport const parse = (markdown: string, options: ParseOptions = {}): Node => {\n const use = preparedFor(options.gfm !== false, options.extensions ?? NO_EXTENSIONS)\n const context: InlineContext = {\n refs: new Map(),\n footnotes: new Map(),\n footnoteUses: new Map(),\n gfm: use.gfm,\n math: use.math,\n rules: use.rules,\n special: use.special,\n }\n const { root, footnotes } = isolated(() => parseBlocks(markdown, context))\n if (footnotes.length > 0) root.children?.push({ type: 'footnotes', children: footnotes })\n for (const extension of use.extensions) {\n if (extension.fences) applyFences(root, [extension])\n extension.transform?.(root, markdown)\n }\n return root\n}\n"],"mappings":";;;;;;;;;;AAgCA,MAAM,WAAW,KAAc,eAAsC;CACnE,MAAM,QAA+C,CAAC;CACtD,IAAI,QAAQ;CACZ,KAAK,MAAM,aAAa,YACtB,KAAK,MAAM,QAAQ,UAAU,UAAU,CAAC,GAAG;EACzC,SAAS,KAAK;EACd,KAAK,MAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,EAAA,CAAG,KAAK,KAAK,KAAK;CACnF;CAEF,OAAO;EACL;EACA,MAAM,WAAW,MAAM,cAAc,UAAU,eAAe,IAAI;EAClE;EACA,SAAS,kBAAkB,KAAK;EAChC;CACF;AACF;AAEA,MAAM,gBAA6B,CAAC;AACpC,MAAM,2BAAW,IAAI,QAAmE;;AAGxF,MAAM,eAAe,KAAc,eAAsC;CACvE,IAAI,OAAO,SAAS,IAAI,UAAU;CAClC,IAAI,SAAS,KAAA,GAAW,SAAS,IAAI,YAAa,OAAO,CAAC,KAAA,GAAW,KAAA,CAAS,CAAE;CAChF,OAAQ,KAAK,MAAM,IAAI,OAAO,QAAQ,KAAK,UAAU;AACvD;AAEA,MAAM,eAAe,MAAY,eAAkC;CACjE,MAAM,WAAW,KAAK;CACtB,IAAI,aAAa,KAAA,GAAW;CAC5B,KAAK,IAAI,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS;EACpD,MAAM,QAAQ,SAAS;EACvB,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS,KAAA,GAC1C,KAAK,MAAM,aAAa,YAAY;GAClC,MAAM,WAAW,UAAU,SAAS,MAAM,KAAK,GAAG,KAAK;GACvD,IAAI,UAAU;IACZ,SAAS,SAAS;IAClB;GACF;EACF;OACK,YAAY,OAAO,UAAU;CACtC;AACF;;AAGA,MAAa,SAAS,UAAkB,UAAwB,CAAC,MAAY;CAC3E,MAAM,MAAM,YAAY,QAAQ,QAAQ,OAAO,QAAQ,cAAc,aAAa;CAClF,MAAM,UAAyB;EAC7B,sBAAM,IAAI,IAAI;EACd,2BAAW,IAAI,IAAI;EACnB,8BAAc,IAAI,IAAI;EACtB,KAAK,IAAI;EACT,MAAM,IAAI;EACV,OAAO,IAAI;EACX,SAAS,IAAI;CACf;CACA,MAAM,EAAE,MAAM,cAAc,eAAe,YAAY,UAAU,OAAO,CAAC;CACzE,IAAI,UAAU,SAAS,GAAG,KAAK,UAAU,KAAK;EAAE,MAAM;EAAa,UAAU;CAAU,CAAC;CACxF,KAAK,MAAM,aAAa,IAAI,YAAY;EACtC,IAAI,UAAU,QAAQ,YAAY,MAAM,CAAC,SAAS,CAAC;EACnD,UAAU,YAAY,MAAM,QAAQ;CACtC;CACA,OAAO;AACT"}