Skip to content

Commit 1c7a050

Browse files
good state, if nasty
1 parent b378909 commit 1c7a050

12 files changed

+285
-114
lines changed

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
}
3333
},
3434
"peerDependencies": {
35-
"svelte": "^5.0.0"
35+
"svelte": "^5.5.0"
3636
},
3737
"devDependencies": {
3838
"@eslint/compat": "^1.2.5",
@@ -54,7 +54,7 @@
5454
"publint": "^0.3.2",
5555
"rehype-raw": "^7.0.0",
5656
"remark-gfm": "^4.0.1",
57-
"svelte": "^5.0.0",
57+
"svelte": "^5.5.0",
5858
"svelte-check": "^4.0.0",
5959
"typescript": "^5.0.0",
6060
"typescript-eslint": "^8.20.0",
@@ -76,8 +76,10 @@
7676
"esm-env": "^1.2.2",
7777
"hast": "^1.0.0",
7878
"html-url-attributes": "^3.0.1",
79+
"property-information": "^7.1.0",
7980
"remark-parse": "^11.0.0",
8081
"remark-rehype": "^11.1.2",
82+
"style-to-object": "^1.0.9",
8183
"unified": "^11.0.5",
8284
"unist-util-visit": "^5.0.0",
8385
"vfile": "^6.0.3"

pnpm-lock.yaml

Lines changed: 19 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/Markdown.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
<script lang="ts">
22
import type { Options } from './types.js';
33
import { create_processor, create_file, post } from './core.js';
4-
import RecursiveRenderer from './RecursiveRenderer.svelte';
4+
import { hast_to_svelte } from './hast-to-svelte.svelte.js';
55
66
let options: Options = $props();
77
88
const processor = $derived(create_processor(options));
99
const file = $derived(create_file(options));
1010
const processed = $derived(processor.runSync(processor.parse(file), file));
1111
const tree = $derived(post(processed, options));
12+
const renderer = $derived(hast_to_svelte(tree, { renderers: options }));
1213
</script>
1314

14-
<RecursiveRenderer {tree} renderers={options} />
15+
{@render renderer()}

src/lib/Markdown.svelte.test.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,6 @@ import Markdown from './Markdown.svelte';
44
import rehype_raw from 'rehype-raw';
55
import remark_gfm from 'remark-gfm';
66

7-
function strip_comments(html: string) {
8-
return html.replace(/<!--[\s\S]*?-->/g, '');
9-
}
10-
11-
expect.extend({
12-
to_equal_html(received, expected) {
13-
const received_html = strip_comments(received.innerHTML).trim();
14-
const { isNot } = this;
15-
return {
16-
pass: received_html === expected.trim(),
17-
message: () => `Expected ${received_html}${isNot ? ' not' : ''} to be ${expected}`,
18-
actual: received_html,
19-
expected: expected.trim()
20-
};
21-
}
22-
});
23-
247
describe('Markdown', () => {
258
it('should support `null` as children', async () => {
269
const screen = render(Markdown, { content: null });
@@ -179,7 +162,7 @@ describe('Markdown', () => {
179162
await expect
180163
.element(screen.container)
181164
.to_equal_html(
182-
'<table><thead><tr><th style="text-align:left">a</th><th style="text-align:center">b</th><th style="text-align:right">c</th><th>d</th></tr></thead></table>'
165+
'<table><thead><tr><th style="text-align: left;">a</th><th style="text-align: center;">b</th><th style="text-align: right;">c</th><th>d</th></tr></thead></table>'
183166
);
184167
});
185168

src/lib/RecursiveRenderer.svelte

Lines changed: 0 additions & 78 deletions
This file was deleted.

src/lib/Renderers.svelte

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<script module lang="ts">
2+
import type { Snippet } from 'svelte';
3+
import type { SpecificSvelteHTMLElements } from './types.js';
4+
5+
export { render_void_element, render_children_element, render_children, render_raw };
6+
</script>
7+
8+
{#snippet render_void_element({
9+
tagName: tag_name,
10+
props
11+
}: {
12+
tagName: keyof SpecificSvelteHTMLElements;
13+
props: SpecificSvelteHTMLElements[keyof SpecificSvelteHTMLElements];
14+
})}
15+
<svelte:element this={tag_name} {...props} />
16+
{/snippet}
17+
18+
{#snippet render_children_element({
19+
tagName: tag_name,
20+
children,
21+
props
22+
}: {
23+
tagName: keyof SpecificSvelteHTMLElements;
24+
children?: Snippet;
25+
props: SpecificSvelteHTMLElements[keyof SpecificSvelteHTMLElements];
26+
})}
27+
<svelte:element this={tag_name} {...props}>{@render children?.()}</svelte:element>
28+
{/snippet}
29+
30+
{#snippet render_children(renderers: Snippet[])}
31+
{#each renderers as renderer, i (i)}
32+
{@render renderer()}
33+
{/each}
34+
{/snippet}
35+
36+
{#snippet render_raw(value: string)}{value}{/snippet}

0 commit comments

Comments
 (0)