diff --git a/src/lib/components/Markdown.svelte b/src/lib/components/Markdown.svelte index 205fb6a..6786210 100644 --- a/src/lib/components/Markdown.svelte +++ b/src/lib/components/Markdown.svelte @@ -108,15 +108,19 @@ return processed; } - function renderMarkdown(text: string): string { + // Two-stage reactive rendering: + // Stage 1 — only re-runs when `content` changes (expensive: marked + hljs + spoilers) + let parsedHtml = $derived.by(() => { try { - const html = marked.parse(text) as string; - const withSpoilers = processSpoilers(html); - return highlightSearchMatches(withSpoilers, searchQuery); + const html = marked.parse(content) as string; + return processSpoilers(html); } catch { - return text; + return content; } - } + }); + + // Stage 2 — re-runs when search changes; skips re-parsing markdown entirely + let renderedHtml = $derived(highlightSearchMatches(parsedHtml, searchQuery)); function handleSpoilerClick(event: Event) { const target = event.target as HTMLElement; @@ -191,7 +195,7 @@ role="presentation" > - {@html renderMarkdown(content)} + {@html renderedHtml}