markstream-svelte 0.0.1-beta.1

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 (233) hide show
  1. package/README.md +77 -0
  2. package/dist/components/AdmonitionNode.svelte +8 -0
  3. package/dist/components/AdmonitionNode.svelte.d.ts +23 -0
  4. package/dist/components/AdmonitionNode.svelte.d.ts.map +1 -0
  5. package/dist/components/BlockquoteNode.svelte +10 -0
  6. package/dist/components/BlockquoteNode.svelte.d.ts +24 -0
  7. package/dist/components/BlockquoteNode.svelte.d.ts.map +1 -0
  8. package/dist/components/CheckboxNode.svelte +5 -0
  9. package/dist/components/CheckboxNode.svelte.d.ts +22 -0
  10. package/dist/components/CheckboxNode.svelte.d.ts.map +1 -0
  11. package/dist/components/CodeBlockNode.svelte +944 -0
  12. package/dist/components/CodeBlockNode.svelte.d.ts +43 -0
  13. package/dist/components/CodeBlockNode.svelte.d.ts.map +1 -0
  14. package/dist/components/D2BlockNode.svelte +272 -0
  15. package/dist/components/D2BlockNode.svelte.d.ts +33 -0
  16. package/dist/components/D2BlockNode.svelte.d.ts.map +1 -0
  17. package/dist/components/DefinitionListNode.svelte +8 -0
  18. package/dist/components/DefinitionListNode.svelte.d.ts +23 -0
  19. package/dist/components/DefinitionListNode.svelte.d.ts.map +1 -0
  20. package/dist/components/EmojiNode.svelte +7 -0
  21. package/dist/components/EmojiNode.svelte.d.ts +22 -0
  22. package/dist/components/EmojiNode.svelte.d.ts.map +1 -0
  23. package/dist/components/EmphasisNode.svelte +8 -0
  24. package/dist/components/EmphasisNode.svelte.d.ts +24 -0
  25. package/dist/components/EmphasisNode.svelte.d.ts.map +1 -0
  26. package/dist/components/FallbackComponent.svelte +8 -0
  27. package/dist/components/FallbackComponent.svelte.d.ts +23 -0
  28. package/dist/components/FallbackComponent.svelte.d.ts.map +1 -0
  29. package/dist/components/FootnoteAnchorNode.svelte +21 -0
  30. package/dist/components/FootnoteAnchorNode.svelte.d.ts +22 -0
  31. package/dist/components/FootnoteAnchorNode.svelte.d.ts.map +1 -0
  32. package/dist/components/FootnoteNode.svelte +19 -0
  33. package/dist/components/FootnoteNode.svelte.d.ts +24 -0
  34. package/dist/components/FootnoteNode.svelte.d.ts.map +1 -0
  35. package/dist/components/FootnoteReferenceNode.svelte +26 -0
  36. package/dist/components/FootnoteReferenceNode.svelte.d.ts +22 -0
  37. package/dist/components/FootnoteReferenceNode.svelte.d.ts.map +1 -0
  38. package/dist/components/HardBreakNode.svelte +1 -0
  39. package/dist/components/HardBreakNode.svelte.d.ts +27 -0
  40. package/dist/components/HardBreakNode.svelte.d.ts.map +1 -0
  41. package/dist/components/HeadingNode.svelte +15 -0
  42. package/dist/components/HeadingNode.svelte.d.ts +24 -0
  43. package/dist/components/HeadingNode.svelte.d.ts.map +1 -0
  44. package/dist/components/HighlightNode.svelte +8 -0
  45. package/dist/components/HighlightNode.svelte.d.ts +24 -0
  46. package/dist/components/HighlightNode.svelte.d.ts.map +1 -0
  47. package/dist/components/HtmlBlockNode.svelte +8 -0
  48. package/dist/components/HtmlBlockNode.svelte.d.ts +23 -0
  49. package/dist/components/HtmlBlockNode.svelte.d.ts.map +1 -0
  50. package/dist/components/HtmlInlineNode.svelte +8 -0
  51. package/dist/components/HtmlInlineNode.svelte.d.ts +23 -0
  52. package/dist/components/HtmlInlineNode.svelte.d.ts.map +1 -0
  53. package/dist/components/HtmlPreviewFrame.svelte +13 -0
  54. package/dist/components/HtmlPreviewFrame.svelte.d.ts +26 -0
  55. package/dist/components/HtmlPreviewFrame.svelte.d.ts.map +1 -0
  56. package/dist/components/ImageNode.svelte +86 -0
  57. package/dist/components/ImageNode.svelte.d.ts +25 -0
  58. package/dist/components/ImageNode.svelte.d.ts.map +1 -0
  59. package/dist/components/InfographicBlockNode.svelte +429 -0
  60. package/dist/components/InfographicBlockNode.svelte.d.ts +34 -0
  61. package/dist/components/InfographicBlockNode.svelte.d.ts.map +1 -0
  62. package/dist/components/InlineCodeNode.svelte +7 -0
  63. package/dist/components/InlineCodeNode.svelte.d.ts +22 -0
  64. package/dist/components/InlineCodeNode.svelte.d.ts.map +1 -0
  65. package/dist/components/InlineWrapNode.svelte +10 -0
  66. package/dist/components/InlineWrapNode.svelte.d.ts +25 -0
  67. package/dist/components/InlineWrapNode.svelte.d.ts.map +1 -0
  68. package/dist/components/InsertNode.svelte +8 -0
  69. package/dist/components/InsertNode.svelte.d.ts +24 -0
  70. package/dist/components/InsertNode.svelte.d.ts.map +1 -0
  71. package/dist/components/LinkNode.svelte +41 -0
  72. package/dist/components/LinkNode.svelte.d.ts +25 -0
  73. package/dist/components/LinkNode.svelte.d.ts.map +1 -0
  74. package/dist/components/ListItemNode.svelte +9 -0
  75. package/dist/components/ListItemNode.svelte.d.ts +24 -0
  76. package/dist/components/ListItemNode.svelte.d.ts.map +1 -0
  77. package/dist/components/ListNode.svelte +16 -0
  78. package/dist/components/ListNode.svelte.d.ts +24 -0
  79. package/dist/components/ListNode.svelte.d.ts.map +1 -0
  80. package/dist/components/MarkdownCodeBlockNode.svelte +7 -0
  81. package/dist/components/MarkdownCodeBlockNode.svelte.d.ts +23 -0
  82. package/dist/components/MarkdownCodeBlockNode.svelte.d.ts.map +1 -0
  83. package/dist/components/MathBlockNode.svelte +96 -0
  84. package/dist/components/MathBlockNode.svelte.d.ts +22 -0
  85. package/dist/components/MathBlockNode.svelte.d.ts.map +1 -0
  86. package/dist/components/MathInlineNode.svelte +103 -0
  87. package/dist/components/MathInlineNode.svelte.d.ts +22 -0
  88. package/dist/components/MathInlineNode.svelte.d.ts.map +1 -0
  89. package/dist/components/MermaidBlockNode.svelte +557 -0
  90. package/dist/components/MermaidBlockNode.svelte.d.ts +40 -0
  91. package/dist/components/MermaidBlockNode.svelte.d.ts.map +1 -0
  92. package/dist/components/NodeOutlet.svelte +192 -0
  93. package/dist/components/NodeOutlet.svelte.d.ts +24 -0
  94. package/dist/components/NodeOutlet.svelte.d.ts.map +1 -0
  95. package/dist/components/NodeRenderer.svelte +349 -0
  96. package/dist/components/NodeRenderer.svelte.d.ts +64 -0
  97. package/dist/components/NodeRenderer.svelte.d.ts.map +1 -0
  98. package/dist/components/ParagraphNode.svelte +21 -0
  99. package/dist/components/ParagraphNode.svelte.d.ts +24 -0
  100. package/dist/components/ParagraphNode.svelte.d.ts.map +1 -0
  101. package/dist/components/PreCodeNode.svelte +13 -0
  102. package/dist/components/PreCodeNode.svelte.d.ts +22 -0
  103. package/dist/components/PreCodeNode.svelte.d.ts.map +1 -0
  104. package/dist/components/ReferenceNode.svelte +8 -0
  105. package/dist/components/ReferenceNode.svelte.d.ts +23 -0
  106. package/dist/components/ReferenceNode.svelte.d.ts.map +1 -0
  107. package/dist/components/RenderChildren.svelte +12 -0
  108. package/dist/components/RenderChildren.svelte.d.ts +24 -0
  109. package/dist/components/RenderChildren.svelte.d.ts.map +1 -0
  110. package/dist/components/StrikethroughNode.svelte +8 -0
  111. package/dist/components/StrikethroughNode.svelte.d.ts +24 -0
  112. package/dist/components/StrikethroughNode.svelte.d.ts.map +1 -0
  113. package/dist/components/StrongNode.svelte +8 -0
  114. package/dist/components/StrongNode.svelte.d.ts +24 -0
  115. package/dist/components/StrongNode.svelte.d.ts.map +1 -0
  116. package/dist/components/SubscriptNode.svelte +8 -0
  117. package/dist/components/SubscriptNode.svelte.d.ts +24 -0
  118. package/dist/components/SubscriptNode.svelte.d.ts.map +1 -0
  119. package/dist/components/SuperscriptNode.svelte +8 -0
  120. package/dist/components/SuperscriptNode.svelte.d.ts +24 -0
  121. package/dist/components/SuperscriptNode.svelte.d.ts.map +1 -0
  122. package/dist/components/TableNode.svelte +8 -0
  123. package/dist/components/TableNode.svelte.d.ts +23 -0
  124. package/dist/components/TableNode.svelte.d.ts.map +1 -0
  125. package/dist/components/TextNode.svelte +37 -0
  126. package/dist/components/TextNode.svelte.d.ts +25 -0
  127. package/dist/components/TextNode.svelte.d.ts.map +1 -0
  128. package/dist/components/ThematicBreakNode.svelte +1 -0
  129. package/dist/components/ThematicBreakNode.svelte.d.ts +27 -0
  130. package/dist/components/ThematicBreakNode.svelte.d.ts.map +1 -0
  131. package/dist/components/Tooltip.svelte +4 -0
  132. package/dist/components/Tooltip.svelte.d.ts +21 -0
  133. package/dist/components/Tooltip.svelte.d.ts.map +1 -0
  134. package/dist/components/VmrContainerNode.svelte +8 -0
  135. package/dist/components/VmrContainerNode.svelte.d.ts +23 -0
  136. package/dist/components/VmrContainerNode.svelte.d.ts.map +1 -0
  137. package/dist/components/shared/diagram-height.d.ts +10 -0
  138. package/dist/components/shared/diagram-height.d.ts.map +1 -0
  139. package/dist/components/shared/diagram-height.js +52 -0
  140. package/dist/components/shared/node-helpers.d.ts +108 -0
  141. package/dist/components/shared/node-helpers.d.ts.map +1 -0
  142. package/dist/components/shared/node-helpers.js +220 -0
  143. package/dist/components/shared/node-outlet-helpers.d.ts +9 -0
  144. package/dist/components/shared/node-outlet-helpers.d.ts.map +1 -0
  145. package/dist/components/shared/node-outlet-helpers.js +92 -0
  146. package/dist/components/shared/render-window.d.ts +19 -0
  147. package/dist/components/shared/render-window.d.ts.map +1 -0
  148. package/dist/components/shared/render-window.js +63 -0
  149. package/dist/components/shared/renderNodeHtml.d.ts +4 -0
  150. package/dist/components/shared/renderNodeHtml.d.ts.map +1 -0
  151. package/dist/components/shared/renderNodeHtml.js +19 -0
  152. package/dist/components/shared/rich-block-helpers.d.ts +7 -0
  153. package/dist/components/shared/rich-block-helpers.d.ts.map +1 -0
  154. package/dist/components/shared/rich-block-helpers.js +76 -0
  155. package/dist/customComponents.d.ts +10 -0
  156. package/dist/customComponents.d.ts.map +1 -0
  157. package/dist/customComponents.js +66 -0
  158. package/dist/enhanceRenderedHtml.d.ts +21 -0
  159. package/dist/enhanceRenderedHtml.d.ts.map +1 -0
  160. package/dist/enhanceRenderedHtml.js +768 -0
  161. package/dist/hydrateCustomTagContent.d.ts +3 -0
  162. package/dist/hydrateCustomTagContent.d.ts.map +1 -0
  163. package/dist/hydrateCustomTagContent.js +130 -0
  164. package/dist/i18n/useSafeI18n.d.ts +5 -0
  165. package/dist/i18n/useSafeI18n.d.ts.map +1 -0
  166. package/dist/i18n/useSafeI18n.js +42 -0
  167. package/dist/index.css +2009 -0
  168. package/dist/index.d.ts +78 -0
  169. package/dist/index.d.ts.map +1 -0
  170. package/dist/index.js +66 -0
  171. package/dist/index.px.css +2009 -0
  172. package/dist/index.tailwind.css +2009 -0
  173. package/dist/optional/d2.d.ts +7 -0
  174. package/dist/optional/d2.d.ts.map +1 -0
  175. package/dist/optional/d2.js +67 -0
  176. package/dist/optional/infographic.d.ts +2 -0
  177. package/dist/optional/infographic.d.ts.map +1 -0
  178. package/dist/optional/infographic.js +29 -0
  179. package/dist/optional/katex.d.ts +7 -0
  180. package/dist/optional/katex.d.ts.map +1 -0
  181. package/dist/optional/katex.js +93 -0
  182. package/dist/optional/mermaid.d.ts +7 -0
  183. package/dist/optional/mermaid.d.ts.map +1 -0
  184. package/dist/optional/mermaid.js +171 -0
  185. package/dist/optional/monaco.d.ts +5 -0
  186. package/dist/optional/monaco.d.ts.map +1 -0
  187. package/dist/optional/monaco.js +70 -0
  188. package/dist/parseNestedMarkdownToNodes.d.ts +15 -0
  189. package/dist/parseNestedMarkdownToNodes.d.ts.map +1 -0
  190. package/dist/parseNestedMarkdownToNodes.js +66 -0
  191. package/dist/renderMarkdownHtml.d.ts +31 -0
  192. package/dist/renderMarkdownHtml.d.ts.map +1 -0
  193. package/dist/renderMarkdownHtml.js +465 -0
  194. package/dist/sanitizeHtmlContent.d.ts +3 -0
  195. package/dist/sanitizeHtmlContent.d.ts.map +1 -0
  196. package/dist/sanitizeHtmlContent.js +175 -0
  197. package/dist/sanitizeSvg.d.ts +3 -0
  198. package/dist/sanitizeSvg.d.ts.map +1 -0
  199. package/dist/sanitizeSvg.js +76 -0
  200. package/dist/tailwind-entry.d.ts +2 -0
  201. package/dist/tailwind-entry.d.ts.map +1 -0
  202. package/dist/tailwind-entry.js +1 -0
  203. package/dist/tooltip/singletonTooltip.d.ts +8 -0
  204. package/dist/tooltip/singletonTooltip.d.ts.map +1 -0
  205. package/dist/tooltip/singletonTooltip.js +124 -0
  206. package/dist/types/monaco.d.ts +66 -0
  207. package/dist/types/monaco.d.ts.map +1 -0
  208. package/dist/types/monaco.js +1 -0
  209. package/dist/utils/languageIcon.d.ts +8 -0
  210. package/dist/utils/languageIcon.d.ts.map +1 -0
  211. package/dist/utils/languageIcon.js +182 -0
  212. package/dist/utils/normalizeKaTeXRenderInput.d.ts +2 -0
  213. package/dist/utils/normalizeKaTeXRenderInput.d.ts.map +1 -0
  214. package/dist/utils/normalizeKaTeXRenderInput.js +7 -0
  215. package/dist/workers/katexCdnWorker.d.ts +21 -0
  216. package/dist/workers/katexCdnWorker.d.ts.map +1 -0
  217. package/dist/workers/katexCdnWorker.js +193 -0
  218. package/dist/workers/katexRenderer.worker.d.ts +2 -0
  219. package/dist/workers/katexRenderer.worker.d.ts.map +1 -0
  220. package/dist/workers/katexRenderer.worker.js +55 -0
  221. package/dist/workers/katexWorkerClient.d.ts +36 -0
  222. package/dist/workers/katexWorkerClient.d.ts.map +1 -0
  223. package/dist/workers/katexWorkerClient.js +270 -0
  224. package/dist/workers/mermaidCdnWorker.d.ts +16 -0
  225. package/dist/workers/mermaidCdnWorker.d.ts.map +1 -0
  226. package/dist/workers/mermaidCdnWorker.js +235 -0
  227. package/dist/workers/mermaidParser.worker.d.ts +2 -0
  228. package/dist/workers/mermaidParser.worker.d.ts.map +1 -0
  229. package/dist/workers/mermaidParser.worker.js +85 -0
  230. package/dist/workers/mermaidWorkerClient.d.ts +16 -0
  231. package/dist/workers/mermaidWorkerClient.d.ts.map +1 -0
  232. package/dist/workers/mermaidWorkerClient.js +170 -0
  233. package/package.json +95 -0
@@ -0,0 +1,193 @@
1
+ function stringifyForWorker(value) {
2
+ return JSON.stringify(value);
3
+ }
4
+ export function buildKaTeXCDNWorkerSource(options) {
5
+ var _a;
6
+ const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : 'classic';
7
+ const renderOptions = {
8
+ throwOnError: true,
9
+ displayMode: true,
10
+ output: 'html',
11
+ strict: 'ignore',
12
+ ...(options.renderOptions || {}),
13
+ };
14
+ const renderOptionsLiteral = stringifyForWorker(renderOptions);
15
+ const katexUrlLiteral = stringifyForWorker(options.katexUrl);
16
+ const mhchemUrlLiteral = options.mhchemUrl ? stringifyForWorker(options.mhchemUrl) : '""';
17
+ if (mode === 'module') {
18
+ return `
19
+ let DEBUG = false
20
+ let katex = null
21
+ let katexLoadError = null
22
+ let loadPromise = null
23
+
24
+ function normalizeKaTeX(mod) {
25
+ const resolved = mod && mod.default ? mod.default : mod
26
+ if (resolved && typeof resolved.renderToString === 'function')
27
+ return resolved
28
+ return null
29
+ }
30
+
31
+ async function loadKaTeX() {
32
+ if (katex || katexLoadError)
33
+ return
34
+ if (!loadPromise) {
35
+ loadPromise = (async () => {
36
+ try {
37
+ const mod = await import(${katexUrlLiteral})
38
+ katex = normalizeKaTeX(mod) || null
39
+ const mhchemUrl = ${mhchemUrlLiteral}
40
+ if (mhchemUrl) {
41
+ try {
42
+ await import(mhchemUrl)
43
+ }
44
+ catch (e) {
45
+ if (DEBUG)
46
+ console.warn('[markstream-svelte:katex-cdn-worker] failed to load mhchem', e)
47
+ }
48
+ }
49
+ }
50
+ catch (e) {
51
+ katexLoadError = e
52
+ }
53
+ })()
54
+ }
55
+ await loadPromise
56
+ }
57
+
58
+ globalThis.addEventListener('message', async (ev) => {
59
+ const data = ev.data || {}
60
+ if (data.type === 'init') {
61
+ DEBUG = !!data.debug
62
+ return
63
+ }
64
+
65
+ const id = data.id ?? ''
66
+ const content = data.content ?? ''
67
+ const displayMode = data.displayMode ?? true
68
+
69
+ await loadKaTeX()
70
+
71
+ if (!katex) {
72
+ const reason = katexLoadError ? String(katexLoadError?.message || katexLoadError) : 'KaTeX is not available in worker'
73
+ globalThis.postMessage({ id, error: reason, content, displayMode })
74
+ return
75
+ }
76
+
77
+ try {
78
+ const opts = ${renderOptionsLiteral}
79
+ const html = katex.renderToString(content, { ...opts, displayMode: !!displayMode })
80
+ globalThis.postMessage({ id, html, content, displayMode })
81
+ }
82
+ catch (err) {
83
+ globalThis.postMessage({ id, error: String(err?.message || err), content, displayMode })
84
+ }
85
+ })
86
+ `.trimStart();
87
+ }
88
+ return `
89
+ let DEBUG = false
90
+ let katex = null
91
+ let katexLoadError = null
92
+
93
+ function normalizeKaTeX(val) {
94
+ const resolved = val && val.default ? val.default : val
95
+ if (resolved && typeof resolved.renderToString === 'function')
96
+ return resolved
97
+ return null
98
+ }
99
+
100
+ function loadKaTeXClassic() {
101
+ if (katex || katexLoadError)
102
+ return
103
+ try {
104
+ importScripts(${katexUrlLiteral})
105
+ const mhchemUrl = ${mhchemUrlLiteral}
106
+ if (mhchemUrl) {
107
+ try {
108
+ importScripts(mhchemUrl)
109
+ }
110
+ catch (e) {
111
+ if (DEBUG)
112
+ console.warn('[markstream-svelte:katex-cdn-worker] failed to load mhchem', e)
113
+ }
114
+ }
115
+ katex = normalizeKaTeX(globalThis.katex)
116
+ }
117
+ catch (e) {
118
+ katexLoadError = e
119
+ }
120
+ }
121
+
122
+ loadKaTeXClassic()
123
+
124
+ globalThis.addEventListener('message', (ev) => {
125
+ const data = ev.data || {}
126
+ if (data.type === 'init') {
127
+ DEBUG = !!data.debug
128
+ return
129
+ }
130
+
131
+ const id = data.id ?? ''
132
+ const content = data.content ?? ''
133
+ const displayMode = data.displayMode ?? true
134
+
135
+ if (!katex && !katexLoadError)
136
+ loadKaTeXClassic()
137
+
138
+ if (!katex) {
139
+ const reason = katexLoadError ? String(katexLoadError?.message || katexLoadError) : 'KaTeX is not available in worker'
140
+ globalThis.postMessage({ id, error: reason, content, displayMode })
141
+ return
142
+ }
143
+
144
+ try {
145
+ const opts = ${renderOptionsLiteral}
146
+ const html = katex.renderToString(content, { ...opts, displayMode: !!displayMode })
147
+ globalThis.postMessage({ id, html, content, displayMode })
148
+ }
149
+ catch (err) {
150
+ globalThis.postMessage({ id, error: String(err?.message || err), content, displayMode })
151
+ }
152
+ })
153
+ `.trimStart();
154
+ }
155
+ export function createKaTeXWorkerFromCDN(options) {
156
+ var _a, _b;
157
+ const source = buildKaTeXCDNWorkerSource(options);
158
+ if (typeof Worker === 'undefined' || typeof URL === 'undefined' || typeof Blob === 'undefined') {
159
+ return {
160
+ worker: null,
161
+ dispose: () => { },
162
+ source,
163
+ };
164
+ }
165
+ const blob = new Blob([source], { type: 'text/javascript' });
166
+ const url = URL.createObjectURL(blob);
167
+ let revoked = false;
168
+ const dispose = () => {
169
+ if (revoked)
170
+ return;
171
+ revoked = true;
172
+ try {
173
+ URL.revokeObjectURL(url);
174
+ }
175
+ catch {
176
+ // Ignore revoke failures.
177
+ }
178
+ };
179
+ const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : 'classic';
180
+ const workerOptions = mode === 'module'
181
+ ? { ...((_b = options.workerOptions) !== null && _b !== void 0 ? _b : {}), type: 'module' }
182
+ : options.workerOptions;
183
+ const worker = new Worker(url, workerOptions);
184
+ if (options.debug) {
185
+ try {
186
+ worker.postMessage({ type: 'init', debug: true });
187
+ }
188
+ catch {
189
+ // Ignore init messaging failures.
190
+ }
191
+ }
192
+ return { worker, dispose, source };
193
+ }
@@ -0,0 +1,2 @@
1
+ import 'katex/dist/contrib/mhchem';
2
+ //# sourceMappingURL=katexRenderer.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"katexRenderer.worker.d.ts","sourceRoot":"","sources":["../../src/workers/katexRenderer.worker.ts"],"names":[],"mappings":"AACA,OAAO,2BAA2B,CAAA"}
@@ -0,0 +1,55 @@
1
+ import katex from 'katex';
2
+ import 'katex/dist/contrib/mhchem';
3
+ let debugWorker = false;
4
+ globalThis.addEventListener('message', (event) => {
5
+ var _a, _b, _c, _d;
6
+ const data = event.data || {};
7
+ if (data.type === 'init') {
8
+ debugWorker = !!data.debug;
9
+ return;
10
+ }
11
+ const id = (_a = data.id) !== null && _a !== void 0 ? _a : '';
12
+ const content = (_b = data.content) !== null && _b !== void 0 ? _b : '';
13
+ const displayMode = (_c = data.displayMode) !== null && _c !== void 0 ? _c : true;
14
+ try {
15
+ if (debugWorker)
16
+ console.debug('[markstream-svelte:katexRenderer.worker] render start', { id, displayMode, content });
17
+ const html = katex.renderToString(content, {
18
+ throwOnError: true,
19
+ displayMode,
20
+ output: 'html',
21
+ strict: 'ignore',
22
+ });
23
+ const result = {
24
+ id,
25
+ html,
26
+ content,
27
+ displayMode,
28
+ };
29
+ globalThis.postMessage(result);
30
+ }
31
+ catch (error) {
32
+ const result = {
33
+ id,
34
+ error: String((_d = error === null || error === void 0 ? void 0 : error.message) !== null && _d !== void 0 ? _d : error),
35
+ content,
36
+ displayMode,
37
+ };
38
+ globalThis.postMessage(result);
39
+ }
40
+ });
41
+ globalThis.addEventListener('error', (event) => {
42
+ var _a;
43
+ try {
44
+ ;
45
+ globalThis.postMessage({
46
+ id: '__worker_uncaught__',
47
+ error: String((_a = event.message) !== null && _a !== void 0 ? _a : event.error),
48
+ content: '',
49
+ displayMode: true,
50
+ });
51
+ }
52
+ catch {
53
+ // Ignore postMessage failures while surfacing uncaught worker errors.
54
+ }
55
+ });
@@ -0,0 +1,36 @@
1
+ export declare const WORKER_BUSY_CODE = "WORKER_BUSY";
2
+ export declare function setKaTeXWorker(nextWorker: Worker): void;
3
+ export declare function clearKaTeXWorker(): void;
4
+ export declare function setKaTeXWorkerDebug(enabled: boolean): void;
5
+ export declare function renderKaTeXInWorker(content: string, displayMode?: boolean, timeout?: number, signal?: AbortSignal): Promise<string>;
6
+ export declare function setKaTeXCache(content: string, displayMode: boolean, html: string): void;
7
+ export declare function getKaTeXWorkerLoad(): {
8
+ inFlight: number;
9
+ max: number;
10
+ };
11
+ export declare function setKaTeXWorkerMaxConcurrency(value: number): void;
12
+ export declare function isKaTeXWorkerBusy(): boolean;
13
+ export declare function waitForKaTeXWorkerSlot(timeout?: number, signal?: AbortSignal): Promise<void>;
14
+ export interface BackpressureOptions {
15
+ timeout?: number;
16
+ waitTimeout?: number;
17
+ backoffMs?: number;
18
+ maxRetries?: number;
19
+ signal?: AbortSignal;
20
+ }
21
+ declare const defaultBackpressure: {
22
+ timeout: number;
23
+ waitTimeout: number;
24
+ backoffMs: number;
25
+ maxRetries: number;
26
+ };
27
+ export declare function setKaTeXBackpressureDefaults(options: Partial<typeof defaultBackpressure>): void;
28
+ export declare function getKaTeXBackpressureDefaults(): {
29
+ timeout: number;
30
+ waitTimeout: number;
31
+ backoffMs: number;
32
+ maxRetries: number;
33
+ };
34
+ export declare function renderKaTeXWithBackpressure(content: string, displayMode?: boolean, options?: BackpressureOptions): Promise<string>;
35
+ export {};
36
+ //# sourceMappingURL=katexWorkerClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"katexWorkerClient.d.ts","sourceRoot":"","sources":["../../src/workers/katexWorkerClient.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AA4C7C,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,QAmChD;AAED,wBAAgB,gBAAgB,SAK/B;AAYD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAInD;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,UAAO,EAAE,OAAO,SAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA8EpI;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,SAAO,EAAE,IAAI,EAAE,MAAM,QAE9E;AAED,wBAAgB,kBAAkB;;;EAKjC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,QAGzD;AAED,wBAAgB,iBAAiB,YAEhC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,SAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD1F;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,QAAA,MAAM,mBAAmB;;;;;CAKxB,CAAA;AAGD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,mBAAmB,CAAC,QASxF;AAED,wBAAgB,4BAA4B;;;;;EAE3C;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,WAAW,UAAO,EAClB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAqCjB"}
@@ -0,0 +1,270 @@
1
+ import { isKatexEnabled } from '../optional/katex';
2
+ import { normalizeKaTeXRenderInput } from '../utils/normalizeKaTeXRenderInput';
3
+ export const WORKER_BUSY_CODE = 'WORKER_BUSY';
4
+ let worker = null;
5
+ let workerInitError = null;
6
+ let debugKatexWorker = false;
7
+ const pending = new Map();
8
+ const cache = new Map();
9
+ const cacheMax = 200;
10
+ const drainWaiters = new Set();
11
+ let maxConcurrency = 5;
12
+ function notifyDrainIfBelowCap() {
13
+ if (pending.size >= maxConcurrency || drainWaiters.size === 0)
14
+ return;
15
+ const currentWaiters = Array.from(drainWaiters);
16
+ drainWaiters.clear();
17
+ for (const waiter of currentWaiters) {
18
+ try {
19
+ waiter();
20
+ }
21
+ catch {
22
+ // Ignore waiter failures.
23
+ }
24
+ }
25
+ }
26
+ function rememberCache(content, displayMode, html) {
27
+ cache.set(`${displayMode ? 'd' : 'i'}:${content}`, html);
28
+ if (cache.size > cacheMax) {
29
+ const firstKey = cache.keys().next().value;
30
+ if (firstKey)
31
+ cache.delete(firstKey);
32
+ }
33
+ }
34
+ export function setKaTeXWorker(nextWorker) {
35
+ worker = nextWorker;
36
+ workerInitError = null;
37
+ worker.onmessage = (event) => {
38
+ const { id, html, error, content, displayMode } = event.data || {};
39
+ const active = pending.get(id);
40
+ if (!active)
41
+ return;
42
+ pending.delete(id);
43
+ clearTimeout(active.timeoutId);
44
+ notifyDrainIfBelowCap();
45
+ if (error) {
46
+ active.reject(new Error(error));
47
+ return;
48
+ }
49
+ if (content)
50
+ rememberCache(String(content), Boolean(displayMode), String(html || ''));
51
+ active.resolve(String(html || ''));
52
+ };
53
+ worker.onerror = (event) => {
54
+ for (const [, active] of pending.entries()) {
55
+ clearTimeout(active.timeoutId);
56
+ active.reject(new Error(`Worker error: ${event.message}`));
57
+ }
58
+ pending.clear();
59
+ notifyDrainIfBelowCap();
60
+ };
61
+ if (debugKatexWorker)
62
+ worker.postMessage({ type: 'init', debug: true });
63
+ }
64
+ export function clearKaTeXWorker() {
65
+ var _a;
66
+ if (worker)
67
+ (_a = worker.terminate) === null || _a === void 0 ? void 0 : _a.call(worker);
68
+ worker = null;
69
+ workerInitError = null;
70
+ }
71
+ function ensureWorker() {
72
+ if (worker)
73
+ return worker;
74
+ workerInitError = new Error('[markstream-svelte:katexWorkerClient] No worker instance set. Please inject a Worker via setKaTeXWorker().');
75
+ workerInitError.name = 'WorkerInitError';
76
+ workerInitError.code = 'WORKER_INIT_ERROR';
77
+ return null;
78
+ }
79
+ export function setKaTeXWorkerDebug(enabled) {
80
+ debugKatexWorker = !!enabled;
81
+ if (worker)
82
+ worker.postMessage({ type: 'init', debug: debugKatexWorker });
83
+ }
84
+ export async function renderKaTeXInWorker(content, displayMode = true, timeout = 2000, signal) {
85
+ const normalizedContent = normalizeKaTeXRenderInput(content);
86
+ if (!isKatexEnabled()) {
87
+ const error = new Error('KaTeX rendering disabled');
88
+ error.name = 'KaTeXDisabled';
89
+ error.code = 'KATEX_DISABLED';
90
+ return Promise.reject(error);
91
+ }
92
+ if (workerInitError)
93
+ return Promise.reject(workerInitError);
94
+ const cacheKey = `${displayMode ? 'd' : 'i'}:${normalizedContent}`;
95
+ const cached = cache.get(cacheKey);
96
+ if (cached)
97
+ return cached;
98
+ const activeWorker = ensureWorker();
99
+ if (!activeWorker)
100
+ return Promise.reject(workerInitError);
101
+ if (pending.size >= maxConcurrency) {
102
+ const error = new Error('Worker busy');
103
+ error.name = 'WorkerBusy';
104
+ error.code = WORKER_BUSY_CODE;
105
+ error.busy = true;
106
+ error.inFlight = pending.size;
107
+ error.max = maxConcurrency;
108
+ return Promise.reject(error);
109
+ }
110
+ return new Promise((resolve, reject) => {
111
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
112
+ const error = new Error('Aborted');
113
+ error.name = 'AbortError';
114
+ reject(error);
115
+ return;
116
+ }
117
+ const id = Math.random().toString(36).slice(2);
118
+ const timeoutId = globalThis.setTimeout(() => {
119
+ pending.delete(id);
120
+ notifyDrainIfBelowCap();
121
+ const error = new Error('Worker render timed out');
122
+ error.name = 'WorkerTimeout';
123
+ error.code = 'WORKER_TIMEOUT';
124
+ reject(error);
125
+ }, timeout);
126
+ const onAbort = () => {
127
+ globalThis.clearTimeout(timeoutId);
128
+ if (pending.delete(id))
129
+ notifyDrainIfBelowCap();
130
+ const error = new Error('Aborted');
131
+ error.name = 'AbortError';
132
+ reject(error);
133
+ };
134
+ signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', onAbort, { once: true });
135
+ pending.set(id, {
136
+ timeoutId,
137
+ resolve: (html) => {
138
+ signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', onAbort);
139
+ resolve(html);
140
+ },
141
+ reject: (error) => {
142
+ signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', onAbort);
143
+ reject(error);
144
+ },
145
+ });
146
+ activeWorker.postMessage({
147
+ id,
148
+ type: 'render',
149
+ content: normalizedContent,
150
+ displayMode,
151
+ });
152
+ });
153
+ }
154
+ export function setKaTeXCache(content, displayMode = true, html) {
155
+ rememberCache(normalizeKaTeXRenderInput(content), displayMode, html);
156
+ }
157
+ export function getKaTeXWorkerLoad() {
158
+ return {
159
+ inFlight: pending.size,
160
+ max: maxConcurrency,
161
+ };
162
+ }
163
+ export function setKaTeXWorkerMaxConcurrency(value) {
164
+ if (Number.isFinite(value) && value > 0)
165
+ maxConcurrency = Math.floor(value);
166
+ }
167
+ export function isKaTeXWorkerBusy() {
168
+ return pending.size >= maxConcurrency;
169
+ }
170
+ export function waitForKaTeXWorkerSlot(timeout = 2000, signal) {
171
+ if (pending.size < maxConcurrency)
172
+ return Promise.resolve();
173
+ return new Promise((resolve, reject) => {
174
+ let settled = false;
175
+ let timer = null;
176
+ const onDrain = () => {
177
+ if (settled)
178
+ return;
179
+ settled = true;
180
+ if (timer)
181
+ clearTimeout(timer);
182
+ drainWaiters.delete(onDrain);
183
+ resolve();
184
+ };
185
+ drainWaiters.add(onDrain);
186
+ timer = setTimeout(() => {
187
+ if (settled)
188
+ return;
189
+ settled = true;
190
+ drainWaiters.delete(onDrain);
191
+ const error = new Error('Wait for worker slot timed out');
192
+ error.name = 'WorkerBusyTimeout';
193
+ error.code = 'WORKER_BUSY_TIMEOUT';
194
+ reject(error);
195
+ }, timeout);
196
+ queueMicrotask(() => notifyDrainIfBelowCap());
197
+ if (signal) {
198
+ const onAbort = () => {
199
+ if (settled)
200
+ return;
201
+ settled = true;
202
+ if (timer)
203
+ clearTimeout(timer);
204
+ drainWaiters.delete(onDrain);
205
+ const error = new Error('Aborted');
206
+ error.name = 'AbortError';
207
+ reject(error);
208
+ };
209
+ if (signal.aborted)
210
+ onAbort();
211
+ else
212
+ signal.addEventListener('abort', onAbort, { once: true });
213
+ }
214
+ });
215
+ }
216
+ const defaultBackpressure = {
217
+ timeout: 2000,
218
+ waitTimeout: 1500,
219
+ backoffMs: 30,
220
+ maxRetries: 1,
221
+ };
222
+ const maxBackpressureRetries = 8;
223
+ export function setKaTeXBackpressureDefaults(options) {
224
+ if (options.timeout != null)
225
+ defaultBackpressure.timeout = Math.max(0, Math.floor(options.timeout));
226
+ if (options.waitTimeout != null)
227
+ defaultBackpressure.waitTimeout = Math.max(0, Math.floor(options.waitTimeout));
228
+ if (options.backoffMs != null)
229
+ defaultBackpressure.backoffMs = Math.max(0, Math.floor(options.backoffMs));
230
+ if (options.maxRetries != null)
231
+ defaultBackpressure.maxRetries = Math.max(0, Math.floor(options.maxRetries));
232
+ }
233
+ export function getKaTeXBackpressureDefaults() {
234
+ return { ...defaultBackpressure };
235
+ }
236
+ export async function renderKaTeXWithBackpressure(content, displayMode = true, options = {}) {
237
+ var _a, _b, _c, _d, _e;
238
+ if (!isKatexEnabled()) {
239
+ const error = new Error('KaTeX rendering disabled');
240
+ error.name = 'KaTeXDisabled';
241
+ error.code = 'KATEX_DISABLED';
242
+ throw error;
243
+ }
244
+ const timeout = (_a = options.timeout) !== null && _a !== void 0 ? _a : defaultBackpressure.timeout;
245
+ const waitTimeout = (_b = options.waitTimeout) !== null && _b !== void 0 ? _b : defaultBackpressure.waitTimeout;
246
+ const backoffMs = (_c = options.backoffMs) !== null && _c !== void 0 ? _c : defaultBackpressure.backoffMs;
247
+ const rawMaxRetries = (_d = options.maxRetries) !== null && _d !== void 0 ? _d : defaultBackpressure.maxRetries;
248
+ const maxRetries = Number.isFinite(rawMaxRetries)
249
+ ? Math.max(0, Math.min(Math.floor(rawMaxRetries), maxBackpressureRetries))
250
+ : defaultBackpressure.maxRetries;
251
+ let attempt = 0;
252
+ for (;;) {
253
+ if ((_e = options.signal) === null || _e === void 0 ? void 0 : _e.aborted) {
254
+ const error = new Error('Aborted');
255
+ error.name = 'AbortError';
256
+ throw error;
257
+ }
258
+ try {
259
+ return await renderKaTeXInWorker(content, displayMode, timeout, options.signal);
260
+ }
261
+ catch (error) {
262
+ if ((error === null || error === void 0 ? void 0 : error.code) !== WORKER_BUSY_CODE || attempt >= maxRetries)
263
+ throw error;
264
+ attempt += 1;
265
+ await waitForKaTeXWorkerSlot(waitTimeout, options.signal).catch(() => { });
266
+ if (backoffMs > 0)
267
+ await new Promise(resolve => globalThis.setTimeout(resolve, backoffMs * attempt));
268
+ }
269
+ }
270
+ }
@@ -0,0 +1,16 @@
1
+ export type MermaidCDNWorkerMode = 'classic' | 'module';
2
+ export interface MermaidCDNWorkerOptions {
3
+ mermaidUrl: string;
4
+ mode?: MermaidCDNWorkerMode;
5
+ debug?: boolean;
6
+ workerOptions?: WorkerOptions;
7
+ initializeOptions?: Record<string, any>;
8
+ }
9
+ export interface MermaidCDNWorkerHandle {
10
+ worker: Worker | null;
11
+ dispose: () => void;
12
+ source: string;
13
+ }
14
+ export declare function buildMermaidCDNWorkerSource(options: MermaidCDNWorkerOptions): string;
15
+ export declare function createMermaidWorkerFromCDN(options: MermaidCDNWorkerOptions): MermaidCDNWorkerHandle;
16
+ //# sourceMappingURL=mermaidCdnWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaidCdnWorker.d.ts","sourceRoot":"","sources":["../../src/workers/mermaidCdnWorker.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEvD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,oBAAoB,CAAA;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACxC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAMD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAkMpF;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA2CnG"}