ODT-documentexport: Mermaid-diagram verschijnt als ontsnapte brontekst #2471

Closed
opened 2026-10-19 11:39:54 +00:00 by brenno · 0 comments
Owner

Gebruikersprobleem

Een offerte met een Mermaid-flowchart exporteert naar .odt met regels als flowchart LR en F1["1. Inventarisatie<br/>..."] in plaats van een leesbaar diagram. De ontvanger ziet implementatiebron en XML-entiteiten in een document dat klaar moet zijn voor verzending.

Reproductie

Zet een Mermaid-codeblok in een document met onder meer:

flowchart LR
F1["1. Inventarisatie<br/>en concretisering"] --> F2["2. Gunningsleidraad"]
F2 --> F3["3. Nota van<br/>Inlichtingen"]

Exporteer als ODT en open het bestand in LibreOffice. Controleer zowel de zichtbare pagina als content.xml in de ODT-ZIP.

Oorzaak op origin/main (334604137)

De ODT-tak in lib/services/document_export_service.dart:350-365 geeft geen renderMermaid-callback door. buildDocumentExportOdt in lib/services/odt/document_odt_export.dart:46-76 zet de geprojecteerde Markdown rechtstreeks om met markdownToOdtBody; er is geen Mermaid-detectie, rasterisatie of afbeeldingsentry. De converter behandelt pre/code als Preformatted_Text (lib/services/odt/markdown_to_odt.dart:409-425). DOCX heeft wél Mermaid-detectie en PNG-rasterisatie (lib/services/docx/document_docx_export.dart:181-240). Bovendien gebruikt de ODT-parser encodeHtml: true (markdown_to_odt.dart:74) en codebloktekst gaat daarna nog door xmlEscape; dat verklaart vermoedelijk waarom de zichtbare bron &quot;/&lt; kan bevatten. Bevestig dit met de aangeleverde reproductie.

Oplossing

Geef de ODT-route dezelfde diagramsemantiek als de andere documentexports: herken fenced mermaid, render met de bestaande themakleuren naar SVG en rasteriseer naar een scherp PNG of gebruik een ODT-compatibele vectorafbeelding. Plaats de afbeelding als draw:image met een Pictures/-entry en manifestregistratie, begrensd binnen tekstbreedte en met passende alternatieve beschrijving. Maak een mislukte render expliciet zichtbaar in het exportresultaat; lever niet stilweg een offerte met broncode als zogenaamd diagram. Repareer afzonderlijk de dubbele XML-escaping van gewone codeblokken, zonder XML-injectie mogelijk te maken. Houd de originele Markdown intact en respecteer de bestaande privacyprojectie.

Acceptatie en regressietests

  • Exporteer het bovenstaande diagram en controleer dat ODT één echte afbeelding bevat en geen zichtbare flowchart LR-bron of letterlijke &quot;/&lt;-entiteiten.
  • Open de ODT in LibreOffice en vergelijk de leesbaarheid met documentweergave en PDF/DOCX, ook met een breed diagram en meerdere diagrammen.
  • Een gewoon codeblok met aanhalingstekens, <br/> en ampersand toont de bedoelde tekens één keer correct en levert geldige XML.
  • Een renderfout wordt aan de gebruiker gemeld en geeft geen vals succes; privacyprojectie en bestandsinhoud blijven correct.
  • Voeg een gerichte ODT-regressietest toe; test/document_odt_export_test.dart heeft nu alleen gewone codebloktests en geen Mermaid-exporttest.
## Gebruikersprobleem Een offerte met een Mermaid-flowchart exporteert naar .odt met regels als `flowchart LR` en `F1[&quot;1. Inventarisatie&lt;br/&gt;...&quot;]` in plaats van een leesbaar diagram. De ontvanger ziet implementatiebron en XML-entiteiten in een document dat klaar moet zijn voor verzending. ## Reproductie Zet een Mermaid-codeblok in een document met onder meer: ```mermaid flowchart LR F1["1. Inventarisatie<br/>en concretisering"] --> F2["2. Gunningsleidraad"] F2 --> F3["3. Nota van<br/>Inlichtingen"] ``` Exporteer als ODT en open het bestand in LibreOffice. Controleer zowel de zichtbare pagina als content.xml in de ODT-ZIP. ## Oorzaak op origin/main (334604137) De ODT-tak in lib/services/document_export_service.dart:350-365 geeft geen renderMermaid-callback door. buildDocumentExportOdt in lib/services/odt/document_odt_export.dart:46-76 zet de geprojecteerde Markdown rechtstreeks om met markdownToOdtBody; er is geen Mermaid-detectie, rasterisatie of afbeeldingsentry. De converter behandelt `pre/code` als Preformatted_Text (lib/services/odt/markdown_to_odt.dart:409-425). DOCX heeft wél Mermaid-detectie en PNG-rasterisatie (lib/services/docx/document_docx_export.dart:181-240). Bovendien gebruikt de ODT-parser encodeHtml: true (markdown_to_odt.dart:74) en codebloktekst gaat daarna nog door xmlEscape; dat verklaart vermoedelijk waarom de zichtbare bron `&quot;`/`&lt;` kan bevatten. Bevestig dit met de aangeleverde reproductie. ## Oplossing Geef de ODT-route dezelfde diagramsemantiek als de andere documentexports: herken fenced `mermaid`, render met de bestaande themakleuren naar SVG en rasteriseer naar een scherp PNG of gebruik een ODT-compatibele vectorafbeelding. Plaats de afbeelding als `draw:image` met een Pictures/-entry en manifestregistratie, begrensd binnen tekstbreedte en met passende alternatieve beschrijving. Maak een mislukte render expliciet zichtbaar in het exportresultaat; lever niet stilweg een offerte met broncode als zogenaamd diagram. Repareer afzonderlijk de dubbele XML-escaping van gewone codeblokken, zonder XML-injectie mogelijk te maken. Houd de originele Markdown intact en respecteer de bestaande privacyprojectie. ## Acceptatie en regressietests - Exporteer het bovenstaande diagram en controleer dat ODT één echte afbeelding bevat en geen zichtbare `flowchart LR`-bron of letterlijke `&quot;`/`&lt;`-entiteiten. - Open de ODT in LibreOffice en vergelijk de leesbaarheid met documentweergave en PDF/DOCX, ook met een breed diagram en meerdere diagrammen. - Een gewoon codeblok met aanhalingstekens, `<br/>` en ampersand toont de bedoelde tekens één keer correct en levert geldige XML. - Een renderfout wordt aan de gebruiker gemeld en geeft geen vals succes; privacyprojectie en bestandsinhoud blijven correct. - Voeg een gerichte ODT-regressietest toe; test/document_odt_export_test.dart heeft nu alleen gewone codebloktests en geen Mermaid-exporttest.
brenno 2026-10-19 14:49:58 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2471
No description provided.