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,235 @@
1
+ function stringifyForWorker(value) {
2
+ return JSON.stringify(value);
3
+ }
4
+ export function buildMermaidCDNWorkerSource(options) {
5
+ var _a;
6
+ const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : 'module';
7
+ const mermaidUrlLiteral = stringifyForWorker(options.mermaidUrl);
8
+ const initLiteral = stringifyForWorker({
9
+ startOnLoad: false,
10
+ securityLevel: 'strict',
11
+ flowchart: { htmlLabels: false },
12
+ ...(options.initializeOptions || {}),
13
+ });
14
+ const sharedLogic = `
15
+ let DEBUG = false
16
+ let mermaid = null
17
+ let mermaidLoadError = null
18
+
19
+ function normalizeMermaidModule(mod) {
20
+ if (!mod)
21
+ return mod
22
+ const candidate = mod && mod.default ? mod.default : mod
23
+ if (candidate && (typeof candidate.render === 'function' || typeof candidate.parse === 'function' || typeof candidate.initialize === 'function'))
24
+ return candidate
25
+ if (candidate && candidate.mermaidAPI && (typeof candidate.mermaidAPI.render === 'function' || typeof candidate.mermaidAPI.parse === 'function')) {
26
+ const api = candidate.mermaidAPI
27
+ return {
28
+ ...candidate,
29
+ render: api.render ? api.render.bind(api) : undefined,
30
+ parse: api.parse ? api.parse.bind(api) : undefined,
31
+ initialize: (opts) => {
32
+ if (typeof candidate.initialize === 'function')
33
+ return candidate.initialize(opts)
34
+ return api.initialize ? api.initialize(opts) : undefined
35
+ },
36
+ }
37
+ }
38
+ if (mod && mod.mermaid && typeof mod.mermaid.parse === 'function')
39
+ return mod.mermaid
40
+ return candidate
41
+ }
42
+
43
+ function applyThemeTo(code, theme) {
44
+ const themeValue = theme === 'dark' ? 'dark' : 'default'
45
+ const themeConfig = \`%%{init: {"theme": "\${themeValue}"}}%%\\n\`
46
+ const trimmed = String(code || '').trimStart()
47
+ if (trimmed.startsWith('%%{'))
48
+ return code
49
+ return themeConfig + code
50
+ }
51
+
52
+ function findHeaderIndex(lines) {
53
+ const headerRe = /^(?:graph|flowchart|flowchart\\s+tb|flowchart\\s+lr|sequenceDiagram|gantt|classDiagram|stateDiagram(?:-v2)?|erDiagram|journey|pie|quadrantChart|timeline|xychart(?:-beta)?)\\b/
54
+ for (let i = 0; i < lines.length; i++) {
55
+ const line = (lines[i] || '').trim()
56
+ if (!line || line.startsWith('%%'))
57
+ continue
58
+ if (headerRe.test(line))
59
+ return i
60
+ }
61
+ return -1
62
+ }
63
+
64
+ async function canParse(code, theme) {
65
+ const themed = applyThemeTo(code, theme)
66
+ if (mermaid && typeof mermaid.parse === 'function') {
67
+ await mermaid.parse(themed)
68
+ return true
69
+ }
70
+ throw new Error('mermaid.parse not available in worker')
71
+ }
72
+
73
+ async function findLastRenderablePrefix(baseCode, theme) {
74
+ const lines = String(baseCode || '').split('\\n')
75
+ const headerIndex = findHeaderIndex(lines)
76
+ if (headerIndex === -1)
77
+ return null
78
+ const head = lines.slice(0, headerIndex + 1)
79
+ await canParse(head.join('\\n'), theme)
80
+
81
+ let low = headerIndex + 1
82
+ let high = lines.length
83
+ let lastGood = headerIndex + 1
84
+ let tries = 0
85
+ const MAX_TRIES = 12
86
+
87
+ while (low <= high && tries < MAX_TRIES) {
88
+ const mid = Math.floor((low + high) / 2)
89
+ const candidate = [...head, ...lines.slice(headerIndex + 1, mid)].join('\\n')
90
+ tries += 1
91
+ try {
92
+ await canParse(candidate, theme)
93
+ lastGood = mid
94
+ low = mid + 1
95
+ }
96
+ catch {
97
+ high = mid - 1
98
+ }
99
+ }
100
+
101
+ return [...head, ...lines.slice(headerIndex + 1, lastGood)].join('\\n')
102
+ }
103
+
104
+ function initMermaidOnce() {
105
+ if (!mermaid)
106
+ return
107
+ try {
108
+ if (typeof mermaid.initialize === 'function')
109
+ mermaid.initialize(${initLiteral})
110
+ }
111
+ catch (e) {
112
+ if (DEBUG)
113
+ console.warn('[markstream-svelte:mermaid-cdn-worker] initialize failed', e)
114
+ }
115
+ }
116
+
117
+ globalThis.addEventListener('message', async (ev) => {
118
+ const msg = ev.data || {}
119
+ if (msg.type === 'init') {
120
+ DEBUG = !!msg.debug
121
+ return
122
+ }
123
+
124
+ const id = msg.id
125
+ const action = msg.action
126
+ const payload = msg.payload || {}
127
+
128
+ if (!mermaid) {
129
+ const error = mermaidLoadError ? String(mermaidLoadError?.message || mermaidLoadError) : 'Mermaid is not available in worker'
130
+ globalThis.postMessage({ id, ok: false, error })
131
+ return
132
+ }
133
+
134
+ try {
135
+ if (action === 'canParse') {
136
+ const ok = await canParse(payload.code, payload.theme)
137
+ globalThis.postMessage({ id, ok: true, result: ok })
138
+ return
139
+ }
140
+ if (action === 'findPrefix') {
141
+ const result = await findLastRenderablePrefix(payload.code, payload.theme)
142
+ globalThis.postMessage({ id, ok: true, result })
143
+ return
144
+ }
145
+ globalThis.postMessage({ id, ok: false, error: 'Unknown action' })
146
+ }
147
+ catch (e) {
148
+ globalThis.postMessage({ id, ok: false, error: String(e?.message || e) })
149
+ }
150
+ })
151
+ `.trimStart();
152
+ if (mode === 'module') {
153
+ return `
154
+ ${sharedLogic}
155
+
156
+ let loadPromise = null
157
+ async function loadMermaid() {
158
+ if (mermaid || mermaidLoadError)
159
+ return
160
+ if (!loadPromise) {
161
+ loadPromise = (async () => {
162
+ try {
163
+ const mod = await import(${mermaidUrlLiteral})
164
+ mermaid = normalizeMermaidModule(mod) || null
165
+ initMermaidOnce()
166
+ }
167
+ catch (e) {
168
+ mermaidLoadError = e
169
+ }
170
+ })()
171
+ }
172
+ await loadPromise
173
+ }
174
+
175
+ await loadMermaid()
176
+ `.trimStart();
177
+ }
178
+ return `
179
+ ${sharedLogic}
180
+
181
+ function loadMermaidClassic() {
182
+ if (mermaid || mermaidLoadError)
183
+ return
184
+ try {
185
+ importScripts(${mermaidUrlLiteral})
186
+ mermaid = normalizeMermaidModule(globalThis.mermaid) || null
187
+ initMermaidOnce()
188
+ }
189
+ catch (e) {
190
+ mermaidLoadError = e
191
+ }
192
+ }
193
+
194
+ loadMermaidClassic()
195
+ `.trimStart();
196
+ }
197
+ export function createMermaidWorkerFromCDN(options) {
198
+ var _a, _b;
199
+ const source = buildMermaidCDNWorkerSource(options);
200
+ if (typeof Worker === 'undefined' || typeof URL === 'undefined' || typeof Blob === 'undefined') {
201
+ return {
202
+ worker: null,
203
+ dispose: () => { },
204
+ source,
205
+ };
206
+ }
207
+ const blob = new Blob([source], { type: 'text/javascript' });
208
+ const url = URL.createObjectURL(blob);
209
+ let revoked = false;
210
+ const dispose = () => {
211
+ if (revoked)
212
+ return;
213
+ revoked = true;
214
+ try {
215
+ URL.revokeObjectURL(url);
216
+ }
217
+ catch {
218
+ // Ignore revoke failures.
219
+ }
220
+ };
221
+ const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : 'module';
222
+ const workerOptions = mode === 'module'
223
+ ? { ...((_b = options.workerOptions) !== null && _b !== void 0 ? _b : {}), type: 'module' }
224
+ : options.workerOptions;
225
+ const worker = new Worker(url, workerOptions);
226
+ if (options.debug) {
227
+ try {
228
+ worker.postMessage({ type: 'init', debug: true });
229
+ }
230
+ catch {
231
+ // Ignore init messaging failures.
232
+ }
233
+ }
234
+ return { worker, dispose, source };
235
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mermaidParser.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaidParser.worker.d.ts","sourceRoot":"","sources":["../../src/workers/mermaidParser.worker.ts"],"names":[],"mappings":"AAiHA,OAAO,EAAE,CAAA"}
@@ -0,0 +1,85 @@
1
+ /// <reference lib="webworker" />
2
+ import mermaid from 'mermaid';
3
+ mermaid.initialize({ startOnLoad: false, securityLevel: 'strict', flowchart: { htmlLabels: false } });
4
+ function applyThemeTo(code, theme) {
5
+ const themeValue = theme === 'dark' ? 'dark' : 'default';
6
+ const themeConfig = `%%{init: {"theme": "${themeValue}"}}%%\n`;
7
+ const trimmed = code.trimStart();
8
+ if (trimmed.startsWith('%%{'))
9
+ return code;
10
+ return themeConfig + code;
11
+ }
12
+ function findHeaderIndex(lines) {
13
+ const headerRe = /^(?:graph|flowchart|flowchart\s+tb|flowchart\s+lr|sequenceDiagram|gantt|classDiagram|stateDiagram(?:-v2)?|erDiagram|journey|pie|quadrantChart|timeline|xychart(?:-beta)?)\b/;
14
+ for (let index = 0; index < lines.length; index += 1) {
15
+ const line = lines[index].trim();
16
+ if (!line || line.startsWith('%%'))
17
+ continue;
18
+ if (headerRe.test(line))
19
+ return index;
20
+ }
21
+ return -1;
22
+ }
23
+ async function canParse(code, theme) {
24
+ const themed = applyThemeTo(code, theme);
25
+ const anyMermaid = mermaid;
26
+ if (typeof anyMermaid.parse === 'function') {
27
+ await anyMermaid.parse(themed);
28
+ return true;
29
+ }
30
+ throw new Error('mermaid.parse not available in worker');
31
+ }
32
+ async function findLastRenderablePrefix(baseCode, theme) {
33
+ const lines = baseCode.split('\n');
34
+ const headerIndex = findHeaderIndex(lines);
35
+ if (headerIndex === -1)
36
+ return null;
37
+ const head = lines.slice(0, headerIndex + 1);
38
+ await canParse(head.join('\n'), theme);
39
+ let low = headerIndex + 1;
40
+ let high = lines.length;
41
+ let lastGood = headerIndex + 1;
42
+ let tries = 0;
43
+ const maxTries = 12;
44
+ while (low <= high && tries < maxTries) {
45
+ const mid = Math.floor((low + high) / 2);
46
+ const candidate = [...head, ...lines.slice(headerIndex + 1, mid)].join('\n');
47
+ tries += 1;
48
+ try {
49
+ await canParse(candidate, theme);
50
+ lastGood = mid;
51
+ low = mid + 1;
52
+ }
53
+ catch {
54
+ high = mid - 1;
55
+ }
56
+ }
57
+ return [...head, ...lines.slice(headerIndex + 1, lastGood)].join('\n');
58
+ }
59
+ self.onmessage = async (event) => {
60
+ var _a;
61
+ const message = event.data;
62
+ const send = (response) => self.postMessage(response);
63
+ try {
64
+ if (message.action === 'canParse') {
65
+ send({
66
+ id: message.id,
67
+ ok: true,
68
+ result: await canParse(message.payload.code, message.payload.theme),
69
+ });
70
+ return;
71
+ }
72
+ if (message.action === 'findPrefix') {
73
+ send({
74
+ id: message.id,
75
+ ok: true,
76
+ result: await findLastRenderablePrefix(message.payload.code, message.payload.theme),
77
+ });
78
+ return;
79
+ }
80
+ send({ id: message.id, ok: false, error: 'Unknown action' });
81
+ }
82
+ catch (error) {
83
+ send({ id: message.id, ok: false, error: (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : String(error) });
84
+ }
85
+ };
@@ -0,0 +1,16 @@
1
+ type Theme = 'light' | 'dark';
2
+ export declare function setMermaidWorkerClientDebug(enabled: boolean): void;
3
+ export declare function setMermaidWorkerMaxConcurrency(value: number): void;
4
+ export declare function getMermaidWorkerLoad(): {
5
+ inFlight: number;
6
+ max: number;
7
+ };
8
+ export declare const MERMAID_WORKER_BUSY_CODE = "WORKER_BUSY";
9
+ export declare const MERMAID_DISABLED_CODE = "MERMAID_DISABLED";
10
+ export declare function setMermaidWorker(nextWorker: Worker): void;
11
+ export declare function clearMermaidWorker(): void;
12
+ export declare function canParseOffthread(code: string, theme: Theme, timeout?: number): Promise<boolean>;
13
+ export declare function findPrefixOffthread(code: string, theme: Theme, timeout?: number): Promise<string>;
14
+ export declare function terminateWorker(): void;
15
+ export {};
16
+ //# sourceMappingURL=mermaidWorkerClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaidWorkerClient.d.ts","sourceRoot":"","sources":["../../src/workers/mermaidWorkerClient.ts"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;AAc7B,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,QAE3D;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,QAG3D;AAED,wBAAgB,oBAAoB;;;EAEnC;AAED,eAAO,MAAM,wBAAwB,gBAAgB,CAAA;AACrD,eAAO,MAAM,qBAAqB,qBAAqB,CAAA;AAEvD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,QAoDlD;AAED,wBAAgB,kBAAkB,SAcjC;AAgFD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,SAAO,oBAEjF;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,SAAO,mBAEnF;AAED,wBAAgB,eAAe,SAY9B"}
@@ -0,0 +1,170 @@
1
+ import { isMermaidEnabled } from '../optional/mermaid';
2
+ let worker = null;
3
+ let workerInitError = null;
4
+ const rpcMap = new Map();
5
+ let maxConcurrency = 5;
6
+ let debugClient = false;
7
+ export function setMermaidWorkerClientDebug(enabled) {
8
+ debugClient = !!enabled;
9
+ }
10
+ export function setMermaidWorkerMaxConcurrency(value) {
11
+ if (Number.isFinite(value) && value > 0)
12
+ maxConcurrency = Math.floor(value);
13
+ }
14
+ export function getMermaidWorkerLoad() {
15
+ return { inFlight: rpcMap.size, max: maxConcurrency };
16
+ }
17
+ export const MERMAID_WORKER_BUSY_CODE = 'WORKER_BUSY';
18
+ export const MERMAID_DISABLED_CODE = 'MERMAID_DISABLED';
19
+ export function setMermaidWorker(nextWorker) {
20
+ worker = nextWorker;
21
+ workerInitError = null;
22
+ const current = nextWorker;
23
+ worker.onmessage = (event) => {
24
+ if (worker !== current)
25
+ return;
26
+ const { id, ok, result, error } = event.data || {};
27
+ const active = rpcMap.get(id);
28
+ if (!active)
29
+ return;
30
+ if (ok === false || error)
31
+ active.reject(new Error(error || 'Unknown error'));
32
+ else
33
+ active.resolve(result);
34
+ };
35
+ worker.onerror = (event) => {
36
+ var _a, _b;
37
+ if (worker !== current)
38
+ return;
39
+ if (rpcMap.size === 0) {
40
+ (_a = console.debug) === null || _a === void 0 ? void 0 : _a.call(console, '[markstream-svelte:mermaidWorkerClient] Worker error (idle):', (event === null || event === void 0 ? void 0 : event.message) || event);
41
+ return;
42
+ }
43
+ try {
44
+ if (debugClient)
45
+ console.error('[markstream-svelte:mermaidWorkerClient] Worker error:', (event === null || event === void 0 ? void 0 : event.message) || event);
46
+ else
47
+ (_b = console.debug) === null || _b === void 0 ? void 0 : _b.call(console, '[markstream-svelte:mermaidWorkerClient] Worker error:', (event === null || event === void 0 ? void 0 : event.message) || event);
48
+ }
49
+ catch {
50
+ // Ignore logging failures.
51
+ }
52
+ for (const [, active] of rpcMap.entries())
53
+ active.reject(new Error(`Worker error: ${event.message}`));
54
+ rpcMap.clear();
55
+ };
56
+ worker.onmessageerror = (event) => {
57
+ var _a;
58
+ if (worker !== current)
59
+ return;
60
+ if (rpcMap.size === 0) {
61
+ (_a = console.debug) === null || _a === void 0 ? void 0 : _a.call(console, '[markstream-svelte:mermaidWorkerClient] Worker messageerror (idle):', event);
62
+ return;
63
+ }
64
+ for (const [, active] of rpcMap.entries())
65
+ active.reject(new Error('Worker messageerror'));
66
+ rpcMap.clear();
67
+ };
68
+ }
69
+ export function clearMermaidWorker() {
70
+ var _a;
71
+ if (worker) {
72
+ try {
73
+ for (const [, active] of rpcMap.entries())
74
+ active.reject(new Error('Worker cleared'));
75
+ rpcMap.clear();
76
+ (_a = worker.terminate) === null || _a === void 0 ? void 0 : _a.call(worker);
77
+ }
78
+ catch {
79
+ // Ignore worker termination failures.
80
+ }
81
+ }
82
+ worker = null;
83
+ workerInitError = null;
84
+ }
85
+ function ensureWorker() {
86
+ if (worker)
87
+ return worker;
88
+ workerInitError = new Error('[markstream-svelte:mermaidWorkerClient] No worker instance set. Please inject a Worker via setMermaidWorker().');
89
+ workerInitError.name = 'WorkerInitError';
90
+ workerInitError.code = 'WORKER_INIT_ERROR';
91
+ return null;
92
+ }
93
+ function callWorker(action, payload, timeout = 1400) {
94
+ if (!isMermaidEnabled()) {
95
+ const error = new Error('Mermaid rendering disabled');
96
+ error.name = 'MermaidDisabled';
97
+ error.code = MERMAID_DISABLED_CODE;
98
+ return Promise.reject(error);
99
+ }
100
+ if (workerInitError)
101
+ return Promise.reject(workerInitError);
102
+ const activeWorker = ensureWorker();
103
+ if (!activeWorker)
104
+ return Promise.reject(workerInitError);
105
+ if (rpcMap.size >= maxConcurrency) {
106
+ const error = new Error('Worker busy');
107
+ error.name = 'WorkerBusy';
108
+ error.code = MERMAID_WORKER_BUSY_CODE;
109
+ error.inFlight = rpcMap.size;
110
+ error.max = maxConcurrency;
111
+ return Promise.reject(error);
112
+ }
113
+ return new Promise((resolve, reject) => {
114
+ const id = Math.random().toString(36).slice(2);
115
+ let settled = false;
116
+ let timeoutId = null;
117
+ const cleanup = () => {
118
+ if (settled)
119
+ return;
120
+ settled = true;
121
+ if (timeoutId != null)
122
+ clearTimeout(timeoutId);
123
+ rpcMap.delete(id);
124
+ };
125
+ rpcMap.set(id, {
126
+ resolve: (value) => {
127
+ cleanup();
128
+ resolve(value);
129
+ },
130
+ reject: (error) => {
131
+ cleanup();
132
+ reject(error);
133
+ },
134
+ });
135
+ try {
136
+ activeWorker.postMessage({ id, action, payload });
137
+ }
138
+ catch (error) {
139
+ rpcMap.delete(id);
140
+ reject(error);
141
+ return;
142
+ }
143
+ timeoutId = setTimeout(() => {
144
+ const error = new Error('Worker call timed out');
145
+ error.name = 'WorkerTimeout';
146
+ error.code = 'WORKER_TIMEOUT';
147
+ const pending = rpcMap.get(id);
148
+ pending === null || pending === void 0 ? void 0 : pending.reject(error);
149
+ }, timeout);
150
+ });
151
+ }
152
+ export async function canParseOffthread(code, theme, timeout = 1400) {
153
+ return await callWorker('canParse', { code, theme }, timeout);
154
+ }
155
+ export async function findPrefixOffthread(code, theme, timeout = 1400) {
156
+ return await callWorker('findPrefix', { code, theme }, timeout);
157
+ }
158
+ export function terminateWorker() {
159
+ if (worker) {
160
+ try {
161
+ for (const [, active] of rpcMap.entries())
162
+ active.reject(new Error('Worker terminated'));
163
+ rpcMap.clear();
164
+ worker.terminate();
165
+ }
166
+ finally {
167
+ worker = null;
168
+ }
169
+ }
170
+ }
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "markstream-svelte",
3
+ "type": "module",
4
+ "version": "0.0.1-beta.1",
5
+ "description": "Svelte Markdown renderer for Markstream, aligned with markstream-vue and markstream-react.",
6
+ "author": "Simon He",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/Simon-He95/markstream-vue#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/Simon-He95/markstream-vue.git",
12
+ "directory": "packages/markstream-svelte"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/Simon-He95/markstream-vue/issues"
16
+ },
17
+ "keywords": [
18
+ "svelte",
19
+ "markdown",
20
+ "markdown-renderer",
21
+ "streaming-markdown",
22
+ "markstream",
23
+ "markstream-svelte"
24
+ ],
25
+ "sideEffects": [
26
+ "**/*.css"
27
+ ],
28
+ "svelte": "./dist/index.js",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "svelte": "./dist/index.js",
33
+ "import": "./dist/index.js"
34
+ },
35
+ "./index.css": "./dist/index.css",
36
+ "./index.px.css": "./dist/index.px.css",
37
+ "./index.tailwind.css": "./dist/index.tailwind.css",
38
+ "./workers/katexRenderer.worker": "./dist/workers/katexRenderer.worker.js",
39
+ "./workers/mermaidParser.worker": "./dist/workers/mermaidParser.worker.js"
40
+ },
41
+ "main": "./dist/index.js",
42
+ "module": "./dist/index.js",
43
+ "types": "./dist/index.d.ts",
44
+ "files": [
45
+ "dist"
46
+ ],
47
+ "peerDependencies": {
48
+ "@antv/infographic": "^0.2.3",
49
+ "@terrastruct/d2": ">=0.1.33",
50
+ "katex": ">=0.16.22",
51
+ "mermaid": ">=11",
52
+ "stream-monaco": ">=0.0.40",
53
+ "svelte": ">=5"
54
+ },
55
+ "peerDependenciesMeta": {
56
+ "@antv/infographic": {
57
+ "optional": true
58
+ },
59
+ "@terrastruct/d2": {
60
+ "optional": true
61
+ },
62
+ "katex": {
63
+ "optional": true
64
+ },
65
+ "mermaid": {
66
+ "optional": true
67
+ },
68
+ "stream-monaco": {
69
+ "optional": true
70
+ }
71
+ },
72
+ "dependencies": {
73
+ "@floating-ui/dom": "^1.7.6",
74
+ "stream-markdown-parser": "0.0.92"
75
+ },
76
+ "devDependencies": {
77
+ "@sveltejs/package": "^2.5.7",
78
+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
79
+ "@types/node": "^18.19.130",
80
+ "autoprefixer": "^10.4.27",
81
+ "postcss-cli": "^11.0.1",
82
+ "svelte": "^5.55.5",
83
+ "svelte-check": "^4.4.8",
84
+ "tailwindcss": "^3.4.19",
85
+ "typescript": "^5.9.3",
86
+ "vite": "^7.3.1"
87
+ },
88
+ "scripts": {
89
+ "build": "svelte-package -i src -o dist && postcss src/index.css -o dist/index.css && cp dist/index.css dist/index.tailwind.css && node ../../scripts/generate-px-css.mjs",
90
+ "dev": "vite dev",
91
+ "preview": "vite preview",
92
+ "typecheck": "svelte-check --tsconfig ./tsconfig.json",
93
+ "release": "bumpp --commit --no-tag --no-push && pnpm publish --access public && node ../../scripts/tag-package.mjs --package-json package.json --push"
94
+ }
95
+ }