diff --git a/docs/superpowers/specs/2026-04-21-prerender-snapshot-design.md b/docs/superpowers/specs/2026-04-21-prerender-snapshot-design.md index 92cfff1..9b16fce 100644 --- a/docs/superpowers/specs/2026-04-21-prerender-snapshot-design.md +++ b/docs/superpowers/specs/2026-04-21-prerender-snapshot-design.md @@ -139,15 +139,16 @@ Neues Deno-Modul. Verzeichnis: `snapshot/` als Geschwister zu `publish/`. schreiben wenn verfügbar. Beide tot: primäre URL trotzdem schreiben + Warnung loggen (Blossom ist content-addressed, URL wird später wieder erreichbar sein). -7. **Markdown-zu-HTML-Rendering.** Body des Events wird mit `marked` - gerendert, dann mit `DOMPurify` gemäß gemeinsamer Policy sanitized, - dann Code-Blöcke mit `highlight.js` hervorgehoben. Gemeinsame - Konfiguration (Allowlist, Syntax-Sprachen) liegt als Konstanten-Modul - in `shared/markdown-policy.ts` und wird von Snapshot **und** SPA - identisch importiert. Ergebnis wird als `content_html` ins JSON - geschrieben. Das rohe `content_markdown` bleibt ebenfalls im JSON - (Debuggability, alternative Renderer, die der HTML-Sanitization nicht - trauen). +7. **Kein Markdown-Rendering im Snapshot.** Body des Events wird als + rohes `content_markdown` ins JSON geschrieben. Das Rendering zu HTML + übernimmt der SvelteKit-Prerender-Schritt mit dem bereits existierenden + `$lib/render/markdown.ts`-Modul (marked + DOMPurify + highlight.js). + **Begründung:** Der SvelteKit-Build führt `renderMarkdown()` ohnehin + aus; eine Duplikation in Deno wäre doppelter Code-Pfad mit identischer + Policy. Für Blaupausen-Nutzung ist rohes Markdown zudem portabler — + jeder andere Renderer (Astro, Eleventy, …) bringt seinen eigenen + Markdown-Prozessor mit und würde fertiges HTML eher als Bürde + empfinden. 8. **Fallback-Politik für fehlende Felder:** - fehlt `summary` im Event → aus `content_markdown` die ersten 200 Zeichen (Whitespace normalisiert, abgeschnitten an Wortgrenze, @@ -198,8 +199,7 @@ Neues Deno-Modul. Verzeichnis: `snapshot/` als Geschwister zu `publish/`. "alt": "Alt-Text", "mime": "image/jpeg" }, - "content_html": "
…sanitized HTML with highlighted code blocks…
", - "content_markdown": "…full markdown, raw, for debugging or alternative renderers…", + "content_markdown": "…full markdown body, raw — Renderer sanitizes und rendert on demand…", "tags": ["Nostr", "Bibel"], "naddr": "naddr1...", "habla_url": "https://habla.news/a/naddr1...", @@ -290,8 +290,11 @@ Die Route rendert den Snapshot-Content statt Relay-Fetch. Im - `