@fuzdev/mdz 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +4 -0
  2. package/dist/Mdz.svelte +18 -9
  3. package/dist/Mdz.svelte.d.ts +9 -2
  4. package/dist/Mdz.svelte.d.ts.map +1 -1
  5. package/dist/MdzNodeView.svelte +129 -115
  6. package/dist/MdzNodeView.svelte.d.ts +4 -1
  7. package/dist/MdzNodeView.svelte.d.ts.map +1 -1
  8. package/dist/MdzPrecompiled.svelte +3 -3
  9. package/dist/MdzPrecompiled.svelte.d.ts.map +1 -1
  10. package/dist/MdzRoot.svelte +3 -3
  11. package/dist/MdzRoot.svelte.d.ts.map +1 -1
  12. package/dist/MdzStream.svelte +6 -6
  13. package/dist/MdzStream.svelte.d.ts.map +1 -1
  14. package/dist/MdzStreamNodeView.svelte +129 -118
  15. package/dist/MdzStreamNodeView.svelte.d.ts +4 -1
  16. package/dist/MdzStreamNodeView.svelte.d.ts.map +1 -1
  17. package/dist/context_helpers.js +1 -1
  18. package/dist/mdz.d.ts +6 -0
  19. package/dist/mdz.d.ts.map +1 -1
  20. package/dist/mdz.js +8 -0
  21. package/dist/mdz_contexts.d.ts.map +1 -1
  22. package/dist/mdz_debug_work.d.ts +38 -0
  23. package/dist/mdz_debug_work.d.ts.map +1 -0
  24. package/dist/mdz_debug_work.js +37 -0
  25. package/dist/mdz_helpers.d.ts +61 -0
  26. package/dist/mdz_helpers.d.ts.map +1 -1
  27. package/dist/mdz_helpers.js +74 -2
  28. package/dist/mdz_lexer.d.ts +12 -0
  29. package/dist/mdz_lexer.d.ts.map +1 -1
  30. package/dist/mdz_lexer.js +190 -40
  31. package/dist/mdz_opcodes.d.ts.map +1 -1
  32. package/dist/mdz_opcodes_to_nodes.d.ts.map +1 -1
  33. package/dist/mdz_opcodes_to_nodes.js +22 -17
  34. package/dist/mdz_stream_parser.d.ts.map +1 -1
  35. package/dist/mdz_stream_parser.js +8 -8
  36. package/dist/mdz_stream_parser_block.js +5 -5
  37. package/dist/mdz_stream_parser_inline.d.ts.map +1 -1
  38. package/dist/mdz_stream_parser_inline.js +22 -20
  39. package/dist/mdz_stream_parser_link.d.ts.map +1 -1
  40. package/dist/mdz_stream_parser_link.js +88 -56
  41. package/dist/mdz_stream_parser_list.d.ts.map +1 -1
  42. package/dist/mdz_stream_parser_list.js +23 -9
  43. package/dist/mdz_stream_parser_state.d.ts +29 -0
  44. package/dist/mdz_stream_parser_state.d.ts.map +1 -1
  45. package/dist/mdz_stream_parser_state.js +59 -10
  46. package/dist/mdz_stream_parser_table.d.ts +3 -2
  47. package/dist/mdz_stream_parser_table.d.ts.map +1 -1
  48. package/dist/mdz_stream_parser_table.js +24 -13
  49. package/dist/mdz_stream_parser_text.d.ts.map +1 -1
  50. package/dist/mdz_stream_parser_text.js +36 -25
  51. package/dist/mdz_stream_parser_url.js +7 -7
  52. package/dist/mdz_stream_state.svelte.d.ts.map +1 -1
  53. package/dist/mdz_to_svelte.d.ts +1 -1
  54. package/dist/mdz_to_svelte.d.ts.map +1 -1
  55. package/dist/mdz_to_svelte.js +28 -31
  56. package/dist/mdz_token_parser.d.ts.map +1 -1
  57. package/dist/mdz_token_parser.js +24 -25
  58. package/dist/svelte_preprocess_mdz.d.ts +2 -2
  59. package/dist/svelte_preprocess_mdz.d.ts.map +1 -1
  60. package/dist/svelte_preprocess_mdz.js +41 -47
  61. package/package.json +28 -40
  62. package/src/lib/context_helpers.ts +2 -2
  63. package/src/lib/mdz.ts +11 -2
  64. package/src/lib/mdz_contexts.ts +5 -5
  65. package/src/lib/mdz_debug_work.ts +38 -0
  66. package/src/lib/mdz_helpers.ts +126 -23
  67. package/src/lib/mdz_lexer.ts +243 -93
  68. package/src/lib/mdz_opcodes.ts +1 -1
  69. package/src/lib/mdz_opcodes_to_nodes.ts +35 -30
  70. package/src/lib/mdz_stream_parser.ts +17 -17
  71. package/src/lib/mdz_stream_parser_block.ts +14 -14
  72. package/src/lib/mdz_stream_parser_inline.ts +38 -34
  73. package/src/lib/mdz_stream_parser_link.ts +99 -66
  74. package/src/lib/mdz_stream_parser_list.ts +41 -29
  75. package/src/lib/mdz_stream_parser_state.ts +100 -28
  76. package/src/lib/mdz_stream_parser_table.ts +47 -36
  77. package/src/lib/mdz_stream_parser_text.ts +40 -39
  78. package/src/lib/mdz_stream_parser_url.ts +11 -11
  79. package/src/lib/mdz_stream_state.svelte.ts +8 -8
  80. package/src/lib/mdz_to_svelte.ts +38 -46
  81. package/src/lib/mdz_token_parser.ts +55 -58
  82. package/src/lib/svelte_preprocess_mdz.ts +92 -89
  83. package/src/lib/tsdoc_mdz.ts +1 -1
package/README.md CHANGED
@@ -31,6 +31,10 @@ for the designs and intros. mdz is the result of 5+ years of prototyping ideas.
31
31
  > some features (like attributes) are not yet implemented.
32
32
  > Feedback is welcome!
33
33
 
34
+ ## Contributing
35
+
36
+ [fuz.dev/contributing](https://www.fuz.dev/contributing)
37
+
34
38
  ## License
35
39
 
36
40
  [MIT](LICENSE)
package/dist/Mdz.svelte CHANGED
@@ -1,22 +1,23 @@
1
1
  <script lang="ts">
2
- import type {SvelteHTMLElements} from 'svelte/elements';
2
+ import type { SvelteHTMLElements } from 'svelte/elements';
3
+ import { DEV } from 'esm-env';
3
4
 
4
- import {mdz_parse} from './mdz.js';
5
+ import { mdz_parse, type MdzNode } from './mdz.js';
5
6
  import MdzNodeView from './MdzNodeView.svelte';
6
7
  import {
7
8
  mdz_base_context,
8
9
  mdz_set_context_with_fallback,
9
- type MdzWhitespace,
10
+ type MdzWhitespace
10
11
  } from './mdz_contexts.js';
11
12
 
12
13
  const {
13
14
  content,
15
+ nodes: nodes_prop,
14
16
  inline = false,
15
17
  whitespace,
16
18
  base,
17
19
  ...rest
18
20
  }: (SvelteHTMLElements['div'] | SvelteHTMLElements['span']) & {
19
- content: string;
20
21
  inline?: boolean;
21
22
  /**
22
23
  * Sets `white-space` on the wrapper. When omitted, whitespace collapses
@@ -25,15 +26,23 @@
25
26
  */
26
27
  whitespace?: MdzWhitespace;
27
28
  base?: string;
28
- } = $props();
29
+ } & // pass `content` to parse at render, or `nodes` to render a pre-parsed
30
+ // tree (e.g. one parsed once and rendered in several places) and skip
31
+ // `mdz_parse` entirely
32
+ (
33
+ { content: string; nodes?: undefined } | { content?: undefined; nodes: Array<MdzNode> }
34
+ ) = $props();
29
35
 
30
36
  mdz_set_context_with_fallback(mdz_base_context, () => base);
31
37
 
32
- const nodes = $derived(mdz_parse(content));
38
+ const nodes = $derived.by(() => {
39
+ if (DEV && (content === undefined) === (nodes_prop === undefined)) {
40
+ throw new Error('Mdz: pass exactly one of `content` or `nodes`');
41
+ }
42
+ return nodes_prop ?? mdz_parse(content ?? '');
43
+ });
33
44
  </script>
34
45
 
35
46
  <svelte:element this={inline ? 'span' : 'div'} {...rest} style:white-space={whitespace}>
36
- {#each nodes as node (node)}
37
- <MdzNodeView {node} />
38
- {/each}
47
+ <MdzNodeView {nodes} />
39
48
  </svelte:element>
@@ -1,7 +1,7 @@
1
1
  import type { SvelteHTMLElements } from 'svelte/elements';
2
+ import { type MdzNode } from './mdz.js';
2
3
  import { type MdzWhitespace } from './mdz_contexts.js';
3
4
  type $$ComponentProps = (SvelteHTMLElements['div'] | SvelteHTMLElements['span']) & {
4
- content: string;
5
5
  inline?: boolean;
6
6
  /**
7
7
  * Sets `white-space` on the wrapper. When omitted, whitespace collapses
@@ -10,7 +10,14 @@ type $$ComponentProps = (SvelteHTMLElements['div'] | SvelteHTMLElements['span'])
10
10
  */
11
11
  whitespace?: MdzWhitespace;
12
12
  base?: string;
13
- };
13
+ } & // pass `content` to parse at render, or `nodes` to render a pre-parsed
14
+ ({
15
+ content: string;
16
+ nodes?: undefined;
17
+ } | {
18
+ content?: undefined;
19
+ nodes: Array<MdzNode>;
20
+ });
14
21
  declare const Mdz: import("svelte").Component<$$ComponentProps, {}, "">;
15
22
  type Mdz = ReturnType<typeof Mdz>;
16
23
  export default Mdz;
@@ -1 +1 @@
1
- {"version":3,"file":"Mdz.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/Mdz.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAIxD,OAAO,EAGL,KAAK,aAAa,EAClB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,gBAAgB,GAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AA6BH,QAAA,MAAM,GAAG,sDAAwC,CAAC;AAClD,KAAK,GAAG,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;AAClC,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"Mdz.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/Mdz.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,EAGL,KAAK,aAAa,EAClB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,gBAAgB,GAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,uEAAuE;AAG1E,CACC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,OAAO,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CAAE,CACvF,CAAC;AAkCJ,QAAA,MAAM,GAAG,sDAAwC,CAAC;AAClD,KAAK,GAAG,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;AAClC,eAAe,GAAG,CAAC"}
@@ -1,26 +1,23 @@
1
1
  <script lang="ts">
2
- import {resolve} from '$app/paths';
2
+ import { resolve } from '$app/paths';
3
3
 
4
- import type {MdzNode, MdzNodeTableRow, MdzTableAlign} from './mdz.js';
5
- import {
6
- mdz_resolve_relative_path,
7
- mdz_is_safe_reference,
8
- mdz_is_void_element,
9
- } from './mdz_helpers.js';
10
- import MdzNodeView from './MdzNodeView.svelte';
4
+ import type { MdzNode, MdzNodeTableRow, MdzTableAlign } from './mdz.js';
5
+ import { mdz_classify_link, mdz_is_void_element } from './mdz_helpers.js';
11
6
  import {
12
7
  mdz_components_context,
13
8
  mdz_elements_context,
14
9
  mdz_base_context,
15
10
  mdz_code_context,
16
- mdz_codeblock_context,
11
+ mdz_codeblock_context
17
12
  } from './mdz_contexts.js';
18
13
 
19
14
  const {
20
15
  node,
21
- }: {
22
- node: MdzNode;
23
- } = $props();
16
+ nodes
17
+ }:
18
+ // exactly one of `node`/`nodes` — the array form renders a whole tree
19
+ // through this single component instance (used by `Mdz`)
20
+ { node: MdzNode; nodes?: undefined } | { node?: undefined; nodes: Array<MdzNode> } = $props();
24
21
 
25
22
  const get_components = mdz_components_context.get_maybe();
26
23
  const get_elements = mdz_elements_context.get_maybe();
@@ -29,122 +26,137 @@
29
26
  const get_codeblock = mdz_codeblock_context.get_maybe();
30
27
  </script>
31
28
 
32
- {#if node.type === 'Element'}
33
- {@const element_config = get_elements?.()?.get(node.name)}
34
- {#if element_config !== undefined}
35
- {#if mdz_is_void_element(node.name)}
36
- <!-- void elements cannot have content — any parsed children are dropped -->
37
- <svelte:element this={node.name} />
29
+ <!-- The tree renders through recursive snippets rather than recursive
30
+ component instances — one component (and one set of context reads) per
31
+ tree instead of per node. -->
32
+ {#if nodes}
33
+ {@render render_children(nodes)}
34
+ {:else if node}
35
+ {@render render_node(node)}
36
+ {/if}
37
+
38
+ {#snippet render_node(node: MdzNode)}
39
+ {#if node.type === 'Element'}
40
+ {@const element_config = get_elements?.()?.get(node.name)}
41
+ {#if element_config !== undefined}
42
+ {#if mdz_is_void_element(node.name)}
43
+ <!-- void elements cannot have content — any parsed children are dropped -->
44
+ <svelte:element this={node.name} />
45
+ {:else}
46
+ <svelte:element this={node.name}>
47
+ {#if node.children.length > 0}
48
+ {@render render_children(node.children)}
49
+ {/if}
50
+ </svelte:element>
51
+ {/if}
38
52
  {:else}
39
- <svelte:element this={node.name}>
53
+ {@render render_unregistered_tag(node.name, node.children)}
54
+ {/if}
55
+ {:else if node.type === 'Component'}
56
+ {@const Component = get_components?.()?.get(node.name)}
57
+ {#if Component}
58
+ <Component>
40
59
  {#if node.children.length > 0}
41
60
  {@render render_children(node.children)}
42
61
  {/if}
43
- </svelte:element>
62
+ </Component>
63
+ {:else}
64
+ {@render render_unregistered_tag(node.name, node.children)}
44
65
  {/if}
45
- {:else}
46
- {@render render_unregistered_tag(node.name, node.children)}
47
- {/if}
48
- {:else if node.type === 'Component'}
49
- {@const Component = get_components?.()?.get(node.name)}
50
- {#if Component}
51
- <Component>
52
- {#if node.children.length > 0}
66
+ {:else if node.type === 'Text'}
67
+ {node.content}
68
+ {:else if node.type === 'Code'}
69
+ {@const Code = get_code?.()}
70
+ {#if Code}
71
+ <Code reference={node.content} />
72
+ {:else}
73
+ <code>{node.content}</code>
74
+ {/if}
75
+ {:else if node.type === 'Bold'}
76
+ <strong>{@render render_children(node.children)}</strong>
77
+ {:else if node.type === 'Italic'}
78
+ <em>{@render render_children(node.children)}</em>
79
+ {:else if node.type === 'Strikethrough'}
80
+ <s>{@render render_children(node.children)}</s>
81
+ {:else if node.type === 'Link'}
82
+ {@const link = mdz_classify_link(node.reference, node.link_type, get_mdz_base?.())}
83
+ {#if link.kind === 'unsafe'}
84
+ {@render render_children(node.children)}
85
+ {:else if link.kind === 'resolve'}
86
+ <a href={resolve(link.href as any)}>{@render render_children(node.children)}</a>
87
+ {:else if link.kind === 'external'}
88
+ <!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
89
+ <a href={link.href} target="_blank" rel="noopener">
53
90
  {@render render_children(node.children)}
54
- {/if}
55
- </Component>
56
- {:else}
57
- {@render render_unregistered_tag(node.name, node.children)}
58
- {/if}
59
- {:else if node.type === 'Text'}
60
- {node.content}
61
- {:else if node.type === 'Code'}
62
- {@const Code = get_code?.()}
63
- {#if Code}
64
- <Code reference={node.content} />
65
- {:else}
66
- <code>{node.content}</code>
67
- {/if}
68
- {:else if node.type === 'Bold'}
69
- <strong>{@render render_children(node.children)}</strong>
70
- {:else if node.type === 'Italic'}
71
- <em>{@render render_children(node.children)}</em>
72
- {:else if node.type === 'Strikethrough'}
73
- <s>{@render render_children(node.children)}</s>
74
- {:else if node.type === 'Link'}
75
- {@const {reference} = node}
76
- {#if !mdz_is_safe_reference(reference)}
77
- {@render render_children(node.children)}
78
- {:else if node.link_type === 'internal'}
79
- {@const skip_resolve = reference.startsWith('#') || reference.startsWith('?')}
80
- {@const mdz_base = get_mdz_base?.()}
81
- {#if reference.startsWith('.') && mdz_base}
82
- {@const resolved = mdz_resolve_relative_path(reference, mdz_base)}
83
- <a href={resolve(resolved as any)}>{@render render_children(node.children)}</a>
84
- {:else if skip_resolve || reference.startsWith('.') || !reference.startsWith('/')}
85
- <!-- Fragment, query, and relative links (including bare references like `foo`) skip resolve() -->
86
- <!-- resolve() only accepts absolute pathnames or route IDs and throws on anything else -->
91
+ </a>
92
+ {:else}
93
+ <!-- fragment/query/relative/bare references skip resolve() (it accepts only absolute paths) -->
87
94
  <!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
88
- <a href={reference}>{@render render_children(node.children)}</a>
95
+ <a href={link.href}>{@render render_children(node.children)}</a>
96
+ {/if}
97
+ {:else if node.type === 'Paragraph'}
98
+ <p>{@render render_children(node.children)}</p>
99
+ {:else if node.type === 'List'}
100
+ {#if node.ordered}
101
+ <ol start={node.start_number === 1 ? undefined : node.start_number}>
102
+ {@render render_children(node.children)}
103
+ </ol>
89
104
  {:else}
90
- <a href={resolve(reference as any)}>{@render render_children(node.children)}</a>
105
+ <ul>{@render render_children(node.children)}</ul>
91
106
  {/if}
92
- {:else}
93
- <!-- external link -->
94
- <!-- eslint-disable-next-line svelte/no-navigation-without-resolve -->
95
- <a href={reference} target="_blank" rel="noopener">{@render render_children(node.children)}</a>
96
- {/if}
97
- {:else if node.type === 'Paragraph'}
98
- <p>{@render render_children(node.children)}</p>
99
- {:else if node.type === 'List'}
100
- {#if node.ordered}
101
- <ol start={node.start_number === 1 ? undefined : node.start_number}>
107
+ {:else if node.type === 'ListItem'}
108
+ <li>{@render render_children(node.children)}</li>
109
+ {:else if node.type === 'Blockquote'}
110
+ <blockquote>{@render render_children(node.children)}</blockquote>
111
+ {:else if node.type === 'Table'}
112
+ <!-- by grammar the header row is always first (and the only one) — read
113
+ it by index and skip it per-row in the body, rather than filtering
114
+ twice (matches the streaming view, where a filter would go O(n²)
115
+ across a streamed table) -->
116
+ {@const header_row = node.children[0]?.header ? node.children[0] : undefined}
117
+ <table>
118
+ {#if header_row}
119
+ <thead>
120
+ <tr>
121
+ {@render render_cells(header_row, 'th', node.align)}
122
+ </tr>
123
+ </thead>
124
+ {/if}
125
+ {#if node.children.length > (header_row ? 1 : 0)}
126
+ <tbody>
127
+ {#each node.children as row, i (i)}
128
+ {#if !row.header}
129
+ <tr>
130
+ {@render render_cells(row, 'td', node.align)}
131
+ </tr>
132
+ {/if}
133
+ {/each}
134
+ </tbody>
135
+ {/if}
136
+ </table>
137
+ {:else if node.type === 'Hr'}
138
+ <hr />
139
+ {:else if node.type === 'Heading'}
140
+ <svelte:element this={`h${node.level}`} id={node.id || undefined}>
102
141
  {@render render_children(node.children)}
103
- </ol>
104
- {:else}
105
- <ul>{@render render_children(node.children)}</ul>
106
- {/if}
107
- {:else if node.type === 'ListItem'}
108
- <li>{@render render_children(node.children)}</li>
109
- {:else if node.type === 'Blockquote'}
110
- <blockquote>{@render render_children(node.children)}</blockquote>
111
- {:else if node.type === 'Table'}
112
- {@const header_rows = node.children.filter((r) => r.header)}
113
- {@const body_rows = node.children.filter((r) => !r.header)}
114
- <table>
115
- {#if header_rows.length > 0}
116
- <thead>
117
- {#each header_rows as row (row)}
118
- <tr>{@render render_cells(row, 'th', node.align)}</tr>
119
- {/each}
120
- </thead>
121
- {/if}
122
- {#if body_rows.length > 0}
123
- <tbody>
124
- {#each body_rows as row (row)}
125
- <tr>{@render render_cells(row, 'td', node.align)}</tr>
126
- {/each}
127
- </tbody>
142
+ </svelte:element>
143
+ {:else if node.type === 'Codeblock'}
144
+ {@const Codeblock = get_codeblock?.()}
145
+ {#if Codeblock}
146
+ <Codeblock lang={node.lang} content={node.content} />
147
+ {:else}
148
+ <pre><code>{node.content}</code></pre>
128
149
  {/if}
129
- </table>
130
- {:else if node.type === 'Hr'}
131
- <hr />
132
- {:else if node.type === 'Heading'}
133
- <svelte:element this={`h${node.level}`} id={node.id || undefined}>
134
- {@render render_children(node.children)}
135
- </svelte:element>
136
- {:else if node.type === 'Codeblock'}
137
- {@const Codeblock = get_codeblock?.()}
138
- {#if Codeblock}
139
- <Codeblock lang={node.lang} content={node.content} />
140
- {:else}
141
- <pre><code>{node.content}</code></pre>
142
150
  {/if}
143
- {/if}
151
+ {/snippet}
144
152
 
145
153
  {#snippet render_children(nodes: Array<MdzNode>)}
146
- {#each nodes as node (node)}
147
- <MdzNodeView {node} />
154
+ <!-- index keys, not object identity: `mdz_parse` yields a fresh node graph
155
+ on every `content` change, so identity keys never match and Svelte rebuilds
156
+ the whole subtree; positional keys let it patch in place. (Sync nodes have
157
+ no stable id; the stream view keys by `node.id`.) -->
158
+ {#each nodes as node, i (i)}
159
+ {@render render_node(node)}
148
160
  {/each}
149
161
  {/snippet}
150
162
 
@@ -161,8 +173,10 @@
161
173
  {#snippet render_unregistered_tag(name: string, children: Array<MdzNode>)}
162
174
  {#if children.length > 0}
163
175
  <code class="color_c_50">&lt;{name}&gt;</code>{@render render_children(children)}<code
164
- class="color_c_50">&lt;/{name}&gt;</code
176
+ class="color_c_50"
165
177
  >
178
+ &lt;/{name}&gt;
179
+ </code>
166
180
  {:else}
167
181
  <code class="color_c_50">&lt;{name} /&gt;</code>
168
182
  {/if}
@@ -1,7 +1,10 @@
1
1
  import type { MdzNode } from './mdz.js';
2
- import MdzNodeView from './MdzNodeView.svelte';
3
2
  type $$ComponentProps = {
4
3
  node: MdzNode;
4
+ nodes?: undefined;
5
+ } | {
6
+ node?: undefined;
7
+ nodes: Array<MdzNode>;
5
8
  };
6
9
  declare const MdzNodeView: import("svelte").Component<$$ComponentProps, {}, "">;
7
10
  type MdzNodeView = ReturnType<typeof MdzNodeView>;
@@ -1 +1 @@
1
- {"version":3,"file":"MdzNodeView.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzNodeView.svelte"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,OAAO,EAAiC,MAAM,UAAU,CAAC;AAMtE,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAS9C,KAAK,gBAAgB,GAAI;IACxB,IAAI,EAAE,OAAO,CAAC;CACd,CAAC;AA+JH,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"MdzNodeView.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzNodeView.svelte"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAkC,MAAM,UAAU,CAAC;AAUvE,KAAK,gBAAgB,GAGpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAwKrF,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
- import type {Snippet} from 'svelte';
3
- import type {SvelteHTMLElements} from 'svelte/elements';
2
+ import type { Snippet } from 'svelte';
3
+ import type { SvelteHTMLElements } from 'svelte/elements';
4
4
 
5
- import type {MdzWhitespace} from './mdz_contexts.js';
5
+ import type { MdzWhitespace } from './mdz_contexts.js';
6
6
 
7
7
  /**
8
8
  * Wrapper for precompiled mdz content. Used by `svelte_preprocess_mdz`.
@@ -1 +1 @@
1
- {"version":3,"file":"MdzPrecompiled.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzPrecompiled.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEpD,KAAK,gBAAgB,GAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CAClB,CAAC;AA4BH,QAAA,MAAM,cAAc,sDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"MdzPrecompiled.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzPrecompiled.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEtD,KAAK,gBAAgB,GAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CAClB,CAAC;AA4BH,QAAA,MAAM,cAAc,sDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type {Snippet} from 'svelte';
2
+ import type { Snippet } from 'svelte';
3
3
 
4
4
  import {
5
5
  mdz_base_context,
@@ -11,7 +11,7 @@
11
11
  type MdzCodeComponent,
12
12
  type MdzCodeblockComponent,
13
13
  type MdzComponents,
14
- type MdzElements,
14
+ type MdzElements
15
15
  } from './mdz_contexts.js';
16
16
 
17
17
  const {
@@ -20,7 +20,7 @@
20
20
  elements,
21
21
  code,
22
22
  codeblock,
23
- children,
23
+ children
24
24
  }: {
25
25
  base?: string;
26
26
  components?: MdzComponents;
@@ -1 +1 @@
1
- {"version":3,"file":"MdzRoot.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzRoot.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAOL,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,gBAAgB,GAAI;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;CAClB,CAAC;AA0BH,QAAA,MAAM,OAAO,sDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"MdzRoot.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzRoot.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAOL,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,gBAAgB,GAAI;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,QAAQ,EAAE,OAAO,CAAC;CAClB,CAAC;AA0BH,QAAA,MAAM,OAAO,sDAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
@@ -1,13 +1,13 @@
1
1
  <script lang="ts">
2
- import type {SvelteHTMLElements} from 'svelte/elements';
2
+ import type { SvelteHTMLElements } from 'svelte/elements';
3
3
 
4
4
  import MdzStreamNodeView from './MdzStreamNodeView.svelte';
5
5
  import {
6
6
  mdz_base_context,
7
7
  mdz_set_context_with_fallback,
8
- type MdzWhitespace,
8
+ type MdzWhitespace
9
9
  } from './mdz_contexts.js';
10
- import type {MdzStreamState} from './mdz_stream_state.svelte.js';
10
+ import type { MdzStreamState } from './mdz_stream_state.svelte.js';
11
11
 
12
12
  const {
13
13
  stream,
@@ -31,7 +31,7 @@
31
31
  </script>
32
32
 
33
33
  <svelte:element this={inline ? 'span' : 'div'} {...rest} style:white-space={whitespace}>
34
- {#each stream.root as node (node.id)}
35
- <MdzStreamNodeView {node} />
36
- {/each}
34
+ <!-- the array form renders the whole stream through one MdzStreamNodeView
35
+ instance (one set of context reads) instead of one per top-level block -->
36
+ <MdzStreamNodeView nodes={stream.root} />
37
37
  </svelte:element>
@@ -1 +1 @@
1
- {"version":3,"file":"MdzStream.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzStream.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAGL,KAAK,aAAa,EAClB,MAAM,mBAAmB,CAAC;AAC5B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAEhE,KAAK,gBAAgB,GAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG;IACnF,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AA2BH,QAAA,MAAM,SAAS,sDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"MdzStream.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/MdzStream.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAGL,KAAK,aAAa,EAClB,MAAM,mBAAmB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAElE,KAAK,gBAAgB,GAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG;IACnF,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AA0BH,QAAA,MAAM,SAAS,sDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}