svelte-streamdown 1.0.8 → 2.0.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.
- package/README.md +155 -140
- package/dist/Block.svelte +17 -41
- package/dist/Elements/Alert.svelte +1 -2
- package/dist/Elements/Code.svelte +3 -5
- package/dist/Elements/Code.svelte.d.ts +0 -2
- package/dist/Elements/Element.svelte +170 -42
- package/dist/Elements/FootnoteRef.svelte +126 -0
- package/dist/Elements/FootnoteRef.svelte.d.ts +7 -0
- package/dist/Elements/Image.svelte +4 -4
- package/dist/Elements/{A.svelte → Link.svelte} +4 -4
- package/dist/Elements/{A.svelte.d.ts → Link.svelte.d.ts} +3 -3
- package/dist/Elements/Math.svelte +13 -24
- package/dist/Elements/Math.svelte.d.ts +0 -2
- package/dist/Elements/Mermaid.svelte +105 -115
- package/dist/Elements/Mermaid.svelte.d.ts +0 -2
- package/dist/Elements/Table.svelte +1 -1
- package/dist/Elements/index.d.ts +5 -24
- package/dist/Elements/index.js +5 -24
- package/dist/Streamdown.d.ts +52 -10
- package/dist/Streamdown.js +19 -1
- package/dist/Streamdown.svelte +2 -34
- package/dist/Streamdown.svelte.d.ts +1 -14
- package/dist/marked/index.d.ts +6 -10
- package/dist/marked/index.js +29 -17
- package/dist/marked/marked-alert.d.ts +2 -2
- package/dist/marked/marked-alert.js +11 -24
- package/dist/marked/marked-footnotes.d.ts +1 -0
- package/dist/marked/marked-footnotes.js +27 -8
- package/dist/marked/marked-list.d.ts +36 -0
- package/dist/marked/marked-list.js +232 -0
- package/dist/marked/marked-math.js +1 -4
- package/dist/marked/marked-subsup.d.ts +28 -0
- package/dist/marked/marked-subsup.js +45 -0
- package/dist/marked/marked-table.d.ts +59 -0
- package/dist/marked/marked-table.js +495 -0
- package/dist/theme.d.ts +54 -30
- package/dist/theme.js +51 -35
- package/dist/utils/panzoom.svelte.d.ts +17 -18
- package/dist/utils/panzoom.svelte.js +0 -2
- package/dist/utils/parse-incomplete-markdown.js +157 -0
- package/dist/utils/useClickOutside.svelte.d.ts +8 -0
- package/dist/utils/useClickOutside.svelte.js +41 -0
- package/dist/utils/useKeyDown.svelte.d.ts +5 -0
- package/dist/utils/useKeyDown.svelte.js +23 -0
- package/package.json +2 -1
- package/dist/Elements/Blockquote.svelte +0 -28
- package/dist/Elements/Blockquote.svelte.d.ts +0 -9
- package/dist/Elements/Del.svelte +0 -28
- package/dist/Elements/Del.svelte.d.ts +0 -9
- package/dist/Elements/Em.svelte +0 -28
- package/dist/Elements/Em.svelte.d.ts +0 -9
- package/dist/Elements/Heading.svelte +0 -25
- package/dist/Elements/Heading.svelte.d.ts +0 -9
- package/dist/Elements/Hr.svelte +0 -26
- package/dist/Elements/Hr.svelte.d.ts +0 -9
- package/dist/Elements/InlineCode.svelte +0 -28
- package/dist/Elements/InlineCode.svelte.d.ts +0 -9
- package/dist/Elements/Li.svelte +0 -28
- package/dist/Elements/Li.svelte.d.ts +0 -9
- package/dist/Elements/Ol.svelte +0 -30
- package/dist/Elements/Ol.svelte.d.ts +0 -9
- package/dist/Elements/P.svelte +0 -28
- package/dist/Elements/P.svelte.d.ts +0 -9
- package/dist/Elements/Strong.svelte +0 -28
- package/dist/Elements/Strong.svelte.d.ts +0 -9
- package/dist/Elements/Sub.svelte +0 -27
- package/dist/Elements/Sub.svelte.d.ts +0 -8
- package/dist/Elements/Sup.svelte +0 -28
- package/dist/Elements/Sup.svelte.d.ts +0 -8
- package/dist/Elements/Tbody.svelte +0 -24
- package/dist/Elements/Tbody.svelte.d.ts +0 -7
- package/dist/Elements/Td.svelte +0 -28
- package/dist/Elements/Td.svelte.d.ts +0 -9
- package/dist/Elements/Th.svelte +0 -28
- package/dist/Elements/Th.svelte.d.ts +0 -9
- package/dist/Elements/Thead.svelte +0 -27
- package/dist/Elements/Thead.svelte.d.ts +0 -9
- package/dist/Elements/Tr.svelte +0 -27
- package/dist/Elements/Tr.svelte.d.ts +0 -9
- package/dist/Elements/Ul.svelte +0 -28
- package/dist/Elements/Ul.svelte.d.ts +0 -9
- /package/dist/{hightlighter.svelte.d.ts → utils/hightlighter.svelte.d.ts} +0 -0
- /package/dist/{hightlighter.svelte.js → utils/hightlighter.svelte.js} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { onMount } from 'svelte';
|
|
3
|
-
import { useStreamdown } from '../Streamdown.
|
|
3
|
+
import { useStreamdown } from '../Streamdown.js';
|
|
4
4
|
import Slot from './Slot.svelte';
|
|
5
5
|
import type { Tokens } from 'marked';
|
|
6
6
|
import type { Snippet } from 'svelte';
|
|
@@ -11,10 +11,8 @@
|
|
|
11
11
|
const streamdown = useStreamdown();
|
|
12
12
|
|
|
13
13
|
const {
|
|
14
|
-
children,
|
|
15
14
|
token
|
|
16
15
|
}: {
|
|
17
|
-
children: Snippet;
|
|
18
16
|
token: Tokens.Code;
|
|
19
17
|
} = $props();
|
|
20
18
|
|
|
@@ -117,121 +115,113 @@
|
|
|
117
115
|
};
|
|
118
116
|
</script>
|
|
119
117
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
>
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
/><path d="M7 21H5a2 2 0 0 1-2-2v-2" /><rect
|
|
153
|
-
width="10"
|
|
154
|
-
height="8"
|
|
155
|
-
x="7"
|
|
156
|
-
y="8"
|
|
157
|
-
rx="1"
|
|
158
|
-
/></svg
|
|
159
|
-
>
|
|
160
|
-
</button>
|
|
161
|
-
<button
|
|
162
|
-
class={streamdown.theme.mermaid.button}
|
|
163
|
-
aria-label="Zoom in"
|
|
164
|
-
onclick={() => panzoom.zoomIn()}
|
|
165
|
-
data-panzoom-ignore
|
|
118
|
+
{#if mermaid}
|
|
119
|
+
<div
|
|
120
|
+
class={streamdown.theme.mermaid.base}
|
|
121
|
+
{@attach (node) => renderMermaid(code, node)}
|
|
122
|
+
{@attach insider.attach}
|
|
123
|
+
data-expanded={'false'}
|
|
124
|
+
>
|
|
125
|
+
<div class={streamdown.theme.mermaid.buttons}>
|
|
126
|
+
<button
|
|
127
|
+
class={streamdown.theme.mermaid.button}
|
|
128
|
+
aria-label="Zoom to fit"
|
|
129
|
+
onclick={() => panzoom.zoomToFit()}
|
|
130
|
+
data-panzoom-ignore
|
|
131
|
+
>
|
|
132
|
+
<svg
|
|
133
|
+
class={streamdown.theme.mermaid.icon}
|
|
134
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
135
|
+
viewBox="0 0 24 24"
|
|
136
|
+
fill="none"
|
|
137
|
+
stroke="currentColor"
|
|
138
|
+
stroke-width="2"
|
|
139
|
+
stroke-linecap="round"
|
|
140
|
+
stroke-linejoin="round"
|
|
141
|
+
><path d="M3 7V5a2 2 0 0 1 2-2h2" /><path d="M17 3h2a2 2 0 0 1 2 2v2" /><path
|
|
142
|
+
d="M21 17v2a2 2 0 0 1-2 2h-2"
|
|
143
|
+
/><path d="M7 21H5a2 2 0 0 1-2-2v-2" /><rect
|
|
144
|
+
width="10"
|
|
145
|
+
height="8"
|
|
146
|
+
x="7"
|
|
147
|
+
y="8"
|
|
148
|
+
rx="1"
|
|
149
|
+
/></svg
|
|
166
150
|
>
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
><svg
|
|
190
|
-
class={streamdown.theme.mermaid.icon}
|
|
191
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
192
|
-
viewBox="0 0 24 24"
|
|
193
|
-
fill="none"
|
|
194
|
-
stroke="currentColor"
|
|
195
|
-
stroke-width="2"
|
|
196
|
-
stroke-linecap="round"
|
|
197
|
-
stroke-linejoin="round"
|
|
198
|
-
><circle cx="11" cy="11" r="8" /><line x1="21" x2="16.65" y1="21" y2="16.65" /><line
|
|
199
|
-
x1="8"
|
|
200
|
-
x2="14"
|
|
201
|
-
y1="11"
|
|
202
|
-
y2="11"
|
|
203
|
-
/></svg
|
|
204
|
-
></button
|
|
151
|
+
</button>
|
|
152
|
+
<button
|
|
153
|
+
class={streamdown.theme.mermaid.button}
|
|
154
|
+
aria-label="Zoom in"
|
|
155
|
+
onclick={() => panzoom.zoomIn()}
|
|
156
|
+
data-panzoom-ignore
|
|
157
|
+
>
|
|
158
|
+
<svg
|
|
159
|
+
class={streamdown.theme.mermaid.icon}
|
|
160
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
161
|
+
viewBox="0 0 24 24"
|
|
162
|
+
fill="none"
|
|
163
|
+
stroke="currentColor"
|
|
164
|
+
stroke-width="2"
|
|
165
|
+
stroke-linecap="round"
|
|
166
|
+
stroke-linejoin="round"
|
|
167
|
+
><circle cx="11" cy="11" r="8" /><line x1="21" x2="16.65" y1="21" y2="16.65" /><line
|
|
168
|
+
x1="11"
|
|
169
|
+
x2="11"
|
|
170
|
+
y1="8"
|
|
171
|
+
y2="14"
|
|
172
|
+
/><line x1="8" x2="14" y1="11" y2="11" /></svg
|
|
205
173
|
>
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
174
|
+
</button>
|
|
175
|
+
<button
|
|
176
|
+
class={streamdown.theme.mermaid.button}
|
|
177
|
+
aria-label="Zoom out"
|
|
178
|
+
onclick={() => panzoom.zoomOut()}
|
|
179
|
+
data-panzoom-ignore
|
|
180
|
+
><svg
|
|
181
|
+
class={streamdown.theme.mermaid.icon}
|
|
182
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
183
|
+
viewBox="0 0 24 24"
|
|
184
|
+
fill="none"
|
|
185
|
+
stroke="currentColor"
|
|
186
|
+
stroke-width="2"
|
|
187
|
+
stroke-linecap="round"
|
|
188
|
+
stroke-linejoin="round"
|
|
189
|
+
><circle cx="11" cy="11" r="8" /><line x1="21" x2="16.65" y1="21" y2="16.65" /><line
|
|
190
|
+
x1="8"
|
|
191
|
+
x2="14"
|
|
192
|
+
y1="11"
|
|
193
|
+
y2="11"
|
|
194
|
+
/></svg
|
|
195
|
+
></button
|
|
196
|
+
>
|
|
197
|
+
<button
|
|
198
|
+
class={streamdown.theme.mermaid.button}
|
|
199
|
+
aria-label="Toggle expand"
|
|
200
|
+
onclick={() => panzoom.toggleExpand()}
|
|
201
|
+
data-panzoom-ignore
|
|
202
|
+
>
|
|
203
|
+
<svg
|
|
204
|
+
class={streamdown.theme.mermaid.icon}
|
|
205
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
206
|
+
viewBox="0 0 24 24"
|
|
207
|
+
fill="none"
|
|
208
|
+
stroke="currentColor"
|
|
209
|
+
stroke-width="2"
|
|
210
|
+
stroke-linecap="round"
|
|
211
|
+
stroke-linejoin="round"
|
|
212
|
+
><path d="m15 15 6 6" /><path d="m15 9 6-6" /><path d="M21 16v5h-5" /><path
|
|
213
|
+
d="M21 8V3h-5"
|
|
214
|
+
/><path d="M3 16v5h5" /><path d="m3 21 6-6" /><path d="M3 8V3h5" /><path
|
|
215
|
+
d="M9 9 3 3"
|
|
216
|
+
/></svg
|
|
211
217
|
>
|
|
212
|
-
|
|
213
|
-
class={streamdown.theme.mermaid.icon}
|
|
214
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
215
|
-
viewBox="0 0 24 24"
|
|
216
|
-
fill="none"
|
|
217
|
-
stroke="currentColor"
|
|
218
|
-
stroke-width="2"
|
|
219
|
-
stroke-linecap="round"
|
|
220
|
-
stroke-linejoin="round"
|
|
221
|
-
><path d="m15 15 6 6" /><path d="m15 9 6-6" /><path d="M21 16v5h-5" /><path
|
|
222
|
-
d="M21 8V3h-5"
|
|
223
|
-
/><path d="M3 16v5h5" /><path d="m3 21 6-6" /><path d="M3 8V3h5" /><path
|
|
224
|
-
d="M9 9 3 3"
|
|
225
|
-
/></svg
|
|
226
|
-
>
|
|
227
|
-
</button>
|
|
228
|
-
</div>
|
|
229
|
-
<svg {@attach panzoom.attach} data-mermaid-svg></svg>
|
|
218
|
+
</button>
|
|
230
219
|
</div>
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
220
|
+
<svg {@attach panzoom.attach} data-mermaid-svg></svg>
|
|
221
|
+
</div>
|
|
222
|
+
{:else}
|
|
223
|
+
<div class={streamdown.theme.mermaid.base}></div>
|
|
224
|
+
{/if}
|
|
235
225
|
|
|
236
226
|
<style>
|
|
237
227
|
/* View Transition styles for zoom effect */
|
|
@@ -269,7 +259,7 @@
|
|
|
269
259
|
}
|
|
270
260
|
}
|
|
271
261
|
|
|
272
|
-
[data-expanded='true'] {
|
|
262
|
+
:global([data-expanded='true']) {
|
|
273
263
|
::view-transition-old(panzoom-element),
|
|
274
264
|
::view-transition-new(panzoom-element) {
|
|
275
265
|
animation-duration: 0.3s;
|
package/dist/Elements/index.d.ts
CHANGED
|
@@ -1,28 +1,9 @@
|
|
|
1
|
-
export { default as
|
|
2
|
-
export { default as Blockquote } from './Blockquote.svelte';
|
|
1
|
+
export { default as Alert } from './Alert.svelte';
|
|
3
2
|
export { default as Code } from './Code.svelte';
|
|
4
|
-
export { default as
|
|
5
|
-
export { default as Heading } from './Heading.svelte';
|
|
6
|
-
export { default as Hr } from './Hr.svelte';
|
|
3
|
+
export { default as Element } from './Element.svelte';
|
|
7
4
|
export { default as Image } from './Image.svelte';
|
|
8
|
-
export { default as
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
5
|
+
export { default as Link } from './Link.svelte';
|
|
6
|
+
export { default as Math } from './Math.svelte';
|
|
7
|
+
export { default as Mermaid } from './Mermaid.svelte';
|
|
11
8
|
export { default as Slot } from './Slot.svelte';
|
|
12
|
-
export { default as Strong } from './Strong.svelte';
|
|
13
|
-
export { default as Sub } from './Sub.svelte';
|
|
14
|
-
export { default as Sup } from './Sup.svelte';
|
|
15
9
|
export { default as Table } from './Table.svelte';
|
|
16
|
-
export { default as Tbody } from './Tbody.svelte';
|
|
17
|
-
export { default as Td } from './Td.svelte';
|
|
18
|
-
export { default as Th } from './Th.svelte';
|
|
19
|
-
export { default as Thead } from './Thead.svelte';
|
|
20
|
-
export { default as Tr } from './Tr.svelte';
|
|
21
|
-
export { default as Ul } from './Ul.svelte';
|
|
22
|
-
export { default as InlineCode } from './InlineCode.svelte';
|
|
23
|
-
export { default as Mermaid } from './Mermaid.svelte';
|
|
24
|
-
export { default as Math } from './Math.svelte';
|
|
25
|
-
export { default as Em } from './Em.svelte';
|
|
26
|
-
export { default as Del } from './Del.svelte';
|
|
27
|
-
export { default as Alert } from './Alert.svelte';
|
|
28
|
-
export { default as Element } from './Element.svelte';
|
package/dist/Elements/index.js
CHANGED
|
@@ -1,28 +1,9 @@
|
|
|
1
|
-
export { default as
|
|
2
|
-
export { default as Blockquote } from './Blockquote.svelte';
|
|
1
|
+
export { default as Alert } from './Alert.svelte';
|
|
3
2
|
export { default as Code } from './Code.svelte';
|
|
4
|
-
export { default as
|
|
5
|
-
export { default as Heading } from './Heading.svelte';
|
|
6
|
-
export { default as Hr } from './Hr.svelte';
|
|
3
|
+
export { default as Element } from './Element.svelte';
|
|
7
4
|
export { default as Image } from './Image.svelte';
|
|
8
|
-
export { default as
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
5
|
+
export { default as Link } from './Link.svelte';
|
|
6
|
+
export { default as Math } from './Math.svelte';
|
|
7
|
+
export { default as Mermaid } from './Mermaid.svelte';
|
|
11
8
|
export { default as Slot } from './Slot.svelte';
|
|
12
|
-
export { default as Strong } from './Strong.svelte';
|
|
13
|
-
export { default as Sub } from './Sub.svelte';
|
|
14
|
-
export { default as Sup } from './Sup.svelte';
|
|
15
9
|
export { default as Table } from './Table.svelte';
|
|
16
|
-
export { default as Tbody } from './Tbody.svelte';
|
|
17
|
-
export { default as Td } from './Td.svelte';
|
|
18
|
-
export { default as Th } from './Th.svelte';
|
|
19
|
-
export { default as Thead } from './Thead.svelte';
|
|
20
|
-
export { default as Tr } from './Tr.svelte';
|
|
21
|
-
export { default as Ul } from './Ul.svelte';
|
|
22
|
-
export { default as InlineCode } from './InlineCode.svelte';
|
|
23
|
-
export { default as Mermaid } from './Mermaid.svelte';
|
|
24
|
-
export { default as Math } from './Math.svelte';
|
|
25
|
-
export { default as Em } from './Em.svelte';
|
|
26
|
-
export { default as Del } from './Del.svelte';
|
|
27
|
-
export { default as Alert } from './Alert.svelte';
|
|
28
|
-
export { default as Element } from './Element.svelte';
|
package/dist/Streamdown.d.ts
CHANGED
|
@@ -3,14 +3,62 @@ import type { Snippet } from 'svelte';
|
|
|
3
3
|
import type { Theme } from './theme.js';
|
|
4
4
|
import type { MermaidConfig } from 'mermaid';
|
|
5
5
|
import type { KatexOptions } from 'katex';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export interface StreamdownContext extends Omit<StreamdownProps, keyof Snippets | 'class' | 'theme' | 'shikiTheme'> {
|
|
7
|
+
snippets: Snippets;
|
|
8
|
+
shikiTheme: BundledTheme;
|
|
9
|
+
theme: Theme;
|
|
10
|
+
}
|
|
11
|
+
export declare class StreamdownContext {
|
|
12
|
+
footnotes: {
|
|
13
|
+
refs: Map<string, FootnoteRef>;
|
|
14
|
+
footnotes: Map<string, Footnote>;
|
|
15
|
+
};
|
|
16
|
+
constructor(props: Omit<StreamdownProps, keyof Snippets | 'class'> & {
|
|
17
|
+
snippets: Snippets;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export declare const useStreamdown: () => StreamdownContext;
|
|
21
|
+
import type { AlertToken, MathToken, SubSupToken, TableToken, THead, TBody, TFoot, THeadRow, TRow, TD, TH } from './marked/index.js';
|
|
22
|
+
import type { Tokens } from 'marked';
|
|
23
|
+
import type { ListItemToken, ListToken } from './marked/marked-list.js';
|
|
24
|
+
import type { Footnote, FootnoteRef, FootnoteToken } from './marked/marked-footnotes.js';
|
|
25
|
+
type TokenSnippet = {
|
|
26
|
+
heading: Tokens.Heading;
|
|
27
|
+
paragraph: Tokens.Paragraph;
|
|
28
|
+
blockquote: Tokens.Blockquote;
|
|
29
|
+
code: Tokens.Code;
|
|
30
|
+
codespan: Tokens.Codespan;
|
|
31
|
+
ul: ListToken;
|
|
32
|
+
ol: ListToken;
|
|
33
|
+
li: ListItemToken;
|
|
34
|
+
table: TableToken;
|
|
35
|
+
thead: THead;
|
|
36
|
+
tbody: TBody;
|
|
37
|
+
tfoot: TFoot;
|
|
38
|
+
tr: THeadRow | TRow;
|
|
39
|
+
td: TD;
|
|
40
|
+
th: TH;
|
|
41
|
+
image: Tokens.Image;
|
|
42
|
+
link: Tokens.Link;
|
|
43
|
+
strong: Tokens.Strong;
|
|
44
|
+
em: Tokens.Em;
|
|
45
|
+
del: Tokens.Del;
|
|
46
|
+
hr: Tokens.Hr;
|
|
47
|
+
br: Tokens.Br;
|
|
48
|
+
math: MathToken;
|
|
49
|
+
alert: AlertToken;
|
|
50
|
+
mermaid: Tokens.Code;
|
|
51
|
+
footnoteRef: FootnoteRef;
|
|
52
|
+
footnotePopover: FootnoteToken;
|
|
53
|
+
sup: SubSupToken;
|
|
54
|
+
sub: SubSupToken;
|
|
55
|
+
};
|
|
56
|
+
type PredefinedElements = keyof TokenSnippet;
|
|
9
57
|
export type Snippets = {
|
|
10
58
|
[K in PredefinedElements]?: Snippet<[
|
|
11
59
|
{
|
|
12
60
|
children: Snippet;
|
|
13
|
-
token:
|
|
61
|
+
token: TokenSnippet[K];
|
|
14
62
|
}
|
|
15
63
|
]>;
|
|
16
64
|
};
|
|
@@ -38,11 +86,5 @@ export type StreamdownProps = {
|
|
|
38
86
|
important?: string;
|
|
39
87
|
};
|
|
40
88
|
};
|
|
41
|
-
customElements?: Record<string, Snippet<[
|
|
42
|
-
{
|
|
43
|
-
children: Snippet;
|
|
44
|
-
token: StreamdownToken;
|
|
45
|
-
}
|
|
46
|
-
]>>;
|
|
47
89
|
} & Partial<Snippets>;
|
|
48
90
|
export {};
|
package/dist/Streamdown.js
CHANGED
|
@@ -1 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
export class StreamdownContext {
|
|
3
|
+
footnotes = {
|
|
4
|
+
refs: new Map(),
|
|
5
|
+
footnotes: new Map()
|
|
6
|
+
};
|
|
7
|
+
constructor(props) {
|
|
8
|
+
bind(this, props);
|
|
9
|
+
setContext('streamdown', this);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export const useStreamdown = () => {
|
|
13
|
+
const context = getContext('streamdown');
|
|
14
|
+
if (!context) {
|
|
15
|
+
throw new Error('Streamdown context not found');
|
|
16
|
+
}
|
|
17
|
+
return context;
|
|
18
|
+
};
|
|
19
|
+
import { bind } from './utils/bind.js';
|
package/dist/Streamdown.svelte
CHANGED
|
@@ -1,34 +1,8 @@
|
|
|
1
|
-
<script lang="ts" module>
|
|
2
|
-
import { getContext, setContext } from 'svelte';
|
|
3
|
-
|
|
4
|
-
export interface StreamdownContext
|
|
5
|
-
extends Omit<StreamdownProps, keyof Snippets | 'class' | 'theme' | 'shikiTheme'> {
|
|
6
|
-
snippets: Snippets;
|
|
7
|
-
shikiTheme: BundledTheme;
|
|
8
|
-
theme: Theme;
|
|
9
|
-
}
|
|
10
|
-
export class StreamdownContext {
|
|
11
|
-
constructor(props: Omit<StreamdownProps, keyof Snippets | 'class'> & { snippets: Snippets }) {
|
|
12
|
-
bind(this, props);
|
|
13
|
-
setContext('streamdown', this);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export const useStreamdown = () => {
|
|
17
|
-
const context = getContext<StreamdownContext>('streamdown');
|
|
18
|
-
if (!context) {
|
|
19
|
-
throw new Error('Streamdown context not found');
|
|
20
|
-
}
|
|
21
|
-
return context;
|
|
22
|
-
};
|
|
23
|
-
</script>
|
|
24
|
-
|
|
25
1
|
<script lang="ts">
|
|
26
2
|
import Block from './Block.svelte';
|
|
27
|
-
import
|
|
28
|
-
import { bind } from './utils/bind.js';
|
|
3
|
+
import { StreamdownContext, type StreamdownProps } from './Streamdown.js';
|
|
29
4
|
import 'katex/dist/katex.min.css';
|
|
30
|
-
import { mergeTheme,
|
|
31
|
-
import type { BundledTheme } from 'shiki';
|
|
5
|
+
import { mergeTheme, shadcnTheme } from './theme.js';
|
|
32
6
|
import { parseBlocks } from './marked/index.js';
|
|
33
7
|
|
|
34
8
|
let {
|
|
@@ -46,13 +20,10 @@
|
|
|
46
20
|
translations,
|
|
47
21
|
baseTheme,
|
|
48
22
|
mergeTheme: shouldMergeTheme = true,
|
|
49
|
-
customElements,
|
|
50
23
|
streamdown = $bindable(),
|
|
51
24
|
...snippets
|
|
52
25
|
}: StreamdownProps = $props();
|
|
53
26
|
|
|
54
|
-
console.log('render');
|
|
55
|
-
|
|
56
27
|
streamdown = new StreamdownContext({
|
|
57
28
|
get content() {
|
|
58
29
|
return content;
|
|
@@ -92,9 +63,6 @@
|
|
|
92
63
|
get translations() {
|
|
93
64
|
return translations;
|
|
94
65
|
},
|
|
95
|
-
get customElements() {
|
|
96
|
-
return customElements;
|
|
97
|
-
},
|
|
98
66
|
get shikiPreloadThemes() {
|
|
99
67
|
return shikiPreloadThemes;
|
|
100
68
|
}
|
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
snippets: Snippets;
|
|
3
|
-
shikiTheme: BundledTheme;
|
|
4
|
-
theme: Theme;
|
|
5
|
-
}
|
|
6
|
-
export declare class StreamdownContext {
|
|
7
|
-
constructor(props: Omit<StreamdownProps, keyof Snippets | 'class'> & {
|
|
8
|
-
snippets: Snippets;
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
export declare const useStreamdown: () => StreamdownContext;
|
|
12
|
-
import type { Snippets, StreamdownProps } from './Streamdown.js';
|
|
1
|
+
import { type StreamdownProps } from './Streamdown.js';
|
|
13
2
|
import 'katex/dist/katex.min.css';
|
|
14
|
-
import { type Theme } from './theme.js';
|
|
15
|
-
import type { BundledTheme } from 'shiki';
|
|
16
3
|
declare const Streamdown: import("svelte").Component<StreamdownProps, {}, "streamdown">;
|
|
17
4
|
type Streamdown = ReturnType<typeof Streamdown>;
|
|
18
5
|
export default Streamdown;
|
package/dist/marked/index.d.ts
CHANGED
|
@@ -2,15 +2,11 @@ import { type MarkedToken, type Tokens } from 'marked';
|
|
|
2
2
|
import { type AlertToken } from './marked-alert.js';
|
|
3
3
|
import { type FootnoteToken } from './marked-footnotes.js';
|
|
4
4
|
import { type MathToken } from './marked-math.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export type
|
|
10
|
-
type: 'tableRow';
|
|
11
|
-
tokens: TableCell[];
|
|
12
|
-
isHeader: boolean;
|
|
13
|
-
};
|
|
5
|
+
import { type SubSupToken } from './marked-subsup.js';
|
|
6
|
+
import { type ListItemToken, type ListToken } from './marked-list.js';
|
|
7
|
+
import { type TableToken, type THead, type TBody, type TFoot, type THeadRow, type TRow, type TH, type TD } from './marked-table.js';
|
|
8
|
+
export type StreamdownToken = Exclude<MarkedToken, Tokens.List | Tokens.ListItem | Tokens.Table> | ListToken | ListItemToken | MathToken | AlertToken | FootnoteToken | SubSupToken | TableToken | THead | TBody | TFoot | THeadRow | TRow | TH | TD;
|
|
9
|
+
export type { TableToken, THead, TBody, TFoot, THeadRow, TRow, TH, TD } from './marked-table.js';
|
|
14
10
|
export declare const lex: (markdown: string) => StreamdownToken[];
|
|
15
11
|
export declare const parseBlocks: (markdown: string) => string[];
|
|
16
|
-
export type { MathToken, AlertToken, FootnoteToken };
|
|
12
|
+
export type { MathToken, AlertToken, FootnoteToken, SubSupToken };
|
package/dist/marked/index.js
CHANGED
|
@@ -1,28 +1,40 @@
|
|
|
1
|
-
import { Lexer,
|
|
1
|
+
import { Lexer, Marked } from 'marked';
|
|
2
2
|
import markedAlert, {} from './marked-alert.js';
|
|
3
3
|
import markedFootnote, {} from './marked-footnotes.js';
|
|
4
4
|
import { markedMath } from './marked-math.js';
|
|
5
|
+
import markedSubSup, {} from './marked-subsup.js';
|
|
6
|
+
import { markedList } from './marked-list.js';
|
|
7
|
+
import { markedTable } from './marked-table.js';
|
|
8
|
+
const completeLexer = new Marked({
|
|
9
|
+
// Enable GFM features but disable built-in tables
|
|
10
|
+
gfm: true,
|
|
11
|
+
tokenizer: {
|
|
12
|
+
table: () => {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
.use(markedAlert())
|
|
18
|
+
.use(markedFootnote())
|
|
19
|
+
.use(markedMath())
|
|
20
|
+
.use(markedSubSup())
|
|
21
|
+
.use(markedList())
|
|
22
|
+
.use(markedTable());
|
|
23
|
+
const blockLexer = new Lexer({
|
|
24
|
+
gfm: true,
|
|
25
|
+
extensions: {
|
|
26
|
+
childTokens: {},
|
|
27
|
+
renderers: {},
|
|
28
|
+
block: [markedFootnote().extensions[0].tokenizer, markedTable().extensions[0].tokenizer]
|
|
29
|
+
}
|
|
30
|
+
});
|
|
5
31
|
export const lex = (markdown) => {
|
|
6
|
-
return
|
|
7
|
-
.use({
|
|
8
|
-
gfm: true
|
|
9
|
-
})
|
|
10
|
-
.use(markedAlert())
|
|
11
|
-
.use(markedFootnote())
|
|
12
|
-
.use(markedMath())
|
|
32
|
+
return completeLexer
|
|
13
33
|
.lexer(markdown)
|
|
14
34
|
.filter((token) => token.type !== 'space' && token.type !== 'footnote');
|
|
15
35
|
};
|
|
16
36
|
export const parseBlocks = (markdown) => {
|
|
17
|
-
|
|
18
|
-
gfm: true,
|
|
19
|
-
extensions: {
|
|
20
|
-
childTokens: {},
|
|
21
|
-
renderers: {},
|
|
22
|
-
block: [markedFootnote().extensions[0].tokenizer]
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
return lexer.blockTokens(markdown, []).reduce((acc, block) => {
|
|
37
|
+
return blockLexer.blockTokens(markdown, []).reduce((acc, block) => {
|
|
26
38
|
if (block.type === 'space' || block.type === 'footnote') {
|
|
27
39
|
return acc;
|
|
28
40
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Tokenizer, Tokens } from 'marked';
|
|
2
2
|
import type { TokenizerExtensionFunction } from 'marked';
|
|
3
3
|
type variantType = 'note' | 'tip' | 'important' | 'warning' | 'caution';
|
|
4
4
|
export declare function createSyntaxPattern(type: variantType): string;
|
|
@@ -9,7 +9,7 @@ export default function markedAlert(): {
|
|
|
9
9
|
tokenizer: TokenizerExtensionFunction;
|
|
10
10
|
}>;
|
|
11
11
|
};
|
|
12
|
-
export declare function processAlertToken(token:
|
|
12
|
+
export declare function processAlertToken(token: Tokens.Blockquote, tokenizer: Tokenizer): void;
|
|
13
13
|
export type AlertToken = {
|
|
14
14
|
type: 'alert';
|
|
15
15
|
variant: variantType;
|