Seiten-Einbettung ![[Seite]] (Transklusion) im Lesemodus #135
Labels
No Label
area:auth
area:docs
area:export
area:ops
area:storage
area:supply-chain
auth
backend
blocked
collab
deployment
docs
effort:L
effort:M
effort:S
frontend
plugins
qa
vs-nfd
vs-nfd:blocker
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stwaidele/dorfteich#135
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ziel
Obsidian-Syntax
![[Seite]](Wikilink mit vorangestelltem!) als Seiten-Einbettung / Transklusion. Im Lese- und öffentlichen Modus wird der Inhalt der Zielseite an dieser Stelle gerendert. Im Editor erscheint eine Platzhalter-Karte mit Titel + Öffnen-Link (kein Volltext).Vorbild
Das bestehende
plugin_blockist das End-to-End-Muster (Block-Atom mit Daten, Placeholder indocToHtml, serverseitige Expansion) und wird nachgebaut.Umsetzung (Reihenfolge = Pipeline)
transclusioninpackages/shared/src/editor-schema/schema.ts(Vorbildplugin_block~L96-130 undwikilink~L226-256), AttrtargetSlug(+ optionaldisplayText). Reservierten Node-Namen ergänzen (Kommentar ~L11-12).![[…]]inpackages/shared/src/editor-schema/markdown.ts, vorwikilink/imageregistriert (sonst frisstimagedas!); Token→Node-Eintrag + Serializer (![[slug]]/![[slug|display]]). Innere Regeln wie beim Wikilink (kein\n/[/]).renderBlock-Fall inpackages/shared/src/editor-schema/html.ts, der einen Platzhalter ausgibt (<div data-transclusion="{slug}">…), analog zumdt-plugin-block-Placeholder (~L121-134).docToHtmlhat keinen DB-Zugriff und kann nicht selbst inlinen.apps/api/src/plugins/plugin-fallback-renderer.ts, aufgerufen inapps/api/src/public/public.service.ts(content(), ~L62-76, nebenfallbacks.applyToHtml/resolveMediaUrls) sowie inexport.service.ts/pdf-html.ts: ersetzt jeden Platzhalter durch die gecachte HTML der Zielseite (page_content_cache), pond-scoped und permission-gefiltert (Zielseite muss lesbar sein, sonst neutraler Hinweis/Link). Rekursion begrenzen (Tiefe max. 1–2, Zyklen erkennen).apps/web/src/editor/nodes/(Vorbildwikilink.tsx/plugin-block.tsx), indocument-extensions.ts(~L28-56) eintragen. NodeView = Platzhalter-Karte („⧉ Eingebettet: " + Öffnen-Link/p/{pond}/{slug}), Titel live überapps/web/src/editor/wikilink-context.tsx(makeWikilinkResolver); Phantom-Zustand kennzeichnen.packages/shared/src/editor-schema/wikilinks.tsextractWikilinkSlugs(~L13) so erweitern, dass auchtransclusion-Nodes ihrentargetSlugbeitragen. Beide Persistenz-Schreiber (collabpersistence.ts, apipages.service.ts) indizieren dann automatisch → Backlinks & Graph erfassen Einbettungen.![[analog zu[[auslösen (apps/web/src/editor/WikilinkAutocomplete.tsx).Akzeptanzkriterien
![[Seite]]rendert im Lese- und öffentlichen Modus den Inhalt der Zielseite inline.pnpm lint+ Unit/DB/e2e grün.Umgesetzt in
15376d4(+d5b895a@AuthenticatedOnly auf /read, Route-Coverage #52): Obsidian-Syntax![[slug]]/![[slug|Anzeige]]als Block-Nodetransclusion(Schema, Markdown-Regel vorparagraph, Serializer, HTML-Placeholder).extractWikilinkSlugserfasst Embeds → Backlinks/Graph. Serverseitige Expansion inPublicService(Tiefe ≤2, Zyklen-Guard, pond-scoped, permission-geprüft, Fehlend→Wikilink); neuer auth-EndpointGET /read/:pond/:slugfür die NodeView. Editor: Platzhalter-Karte im Bearbeiten-Modus, gerenderter Zielinhalt im Lesemodus;![[-Autocomplete.Verifiziert: 5 Round-Trip-Unit-Tests + Embed-DB-Test (zyklus-sicher) grün; live auf Test/Int in öffentlicher UND angemeldeter Ansicht. Deployt bis
60be198, von Stefan abgenommen.