# Förbättringsförslag — rendering & editor Genomgång av renderings- och editorlagret (`frontend/src/bridge/*`, `components/editor/*`) med konkreta, prioriterade förslag. En bekräftad bugg är redan åtgärdad i denna gren (se punkt 0). --- ## 0. ÅTGÄRDAD bugg: inline-formatering tappades vid sparning I `asciidoc-bridge.ts → renderTextNodes` byggdes den markerade strängen (`*fet*`, `_kursiv_`, `` `kod` ``, länkar) men **lades aldrig till utdata** — i stället lades den *omarkerade* texten till i ett andra `if`-block. Följd: all inline-formatering försvann tyst varje gång ett dokument sparades från den visuella editorn. Nu appliceras och skrivs marks korrekt (en enda gång). > Rekommendation: lägg ett litet round-trip-test (`adoc → toTipTap → fromTipTap`) > som CI-steg så att den här klassen av regressioner fångas automatiskt. --- ## 1. Round-trip-modellen är den största risken Idag är flödet vid varje sparning: ``` .adoc ──asciidoctor.convert──▶ HTML ──generateJSON──▶ TipTap-JSON ▲ │ └─────────── fromTipTap (handskriven) ◀──────────────────┘ ``` Två lossy konverteringar i rad. Allt som TipTap-schemat inte känner till (attribut, `ifdef`/`ifeval`, `:attribut:`-definitioner, block-roller, kommentarer, tabellformat, korsreferenser) går förlorat så fort man öppnar och sparar i den visuella vyn. **Förslag (välj en):** - **A. Källan är sanningen.** Behandla `.adoc` som master. Visuella editorn får bara redigera dokument som är "rena" (kan round-trippa förlustfritt), annars öppnas källeditorn. Visa en varning "det här dokumentet innehåller avancerad AsciiDoc — redigera i källvyn". - **B. Patch-baserad sparning.** Spara bara de block som faktiskt ändrats i den visuella vyn i stället för att reserialisera hela dokumentet. - **C. Byt serialisering.** Använd en riktig AST (t.ex. `downdoc`/`@asciidoctor` reducer) i stället för den handskrivna `TipTapToAsciidoc`-klassen. Minst arbete/störst nytta på kort sikt: **A** + en tydlig indikator i UI. --- ## 2. Konkreta serialiseringsluckor i `fromTipTap` | Nod / mark | Problem | Förslag | |------------|---------|---------| | Kombinerade marks (fet+kursiv) | Ger `*_text_*` — bräckligt intill andra tecken | Använd oконstruerad syntax (`**`, `__`) vid behov | | Tabeller (`convertTable`) | Ingen header-rad (`[%header]`), inga kolumn-specar, colspan/align tappas | Detektera `tableHeader`, skriv `[options="header"]`, `cols=` | | Listor (`convertListItem`) | Blandning av stycke + nästlad lista i samma item blir fel; principallista använder nivå-räkning som spretar | Rendera item-innehåll block för block med `+`-continuation för flerstycke | | `blockquote` | Attribution/citat-källa tappas | Stöd `[quote, author, source]` | | `admonition` | Bara 5 typer, alltid versalt block-format | Bevara ursprunglig form (inline `NOTE:` vs `[NOTE]`-block) | | Bild | `role`/alignment/`link=` tappas | Utöka `AsciidocImage`-attribut och serialisering | --- ## 3. Renderingspipelinen (adoc → HTML) - **Regex-omskrivning av admonitions** (`htmlContent.replace(/