DOCX/ODT-export: codeblok lekt _Ctx.codeBlock op de visitor-stack, inline code daarna wordt een blok #2095

Closed
opened 2026-09-15 08:28:57 +00:00 by brenno · 0 comments
Owner

Probleem

Een met OciDeck gemaakt document dat een (mermaid-)codeblok bevat, gevolgd door alinea's met inline code (enkele backticks), produceert een ongeldig .docx-bestand dat niet te openen is.

Oorzaak

In markdown_to_docx.dart en markdown_to_odt.dart returnt _visitCode voor een codeblok false uit visitElementBefore. De markdown-package roept daardoor visitElementAfter voor dat <code>-element niet meer aan (ast.dart:107). Toch pushte _visitCode _Ctx.codeBlockBody op de stack. Die placeholder wordt nooit meer weggehaald, waardoor pre's visitElementAfter per ongeluk _Ctx.codeBlockBody popt in plaats van _Ctx.codeBlock. Na het eerste codeblok blijft _Ctx.codeBlock permanent op de stack staan, dus _inCodeBlock is voor altijd true.

Gevolg: élke volgende inline `code` wordt als een blok-level PreformattedText-alinea gerenderd, genest in de alinea die al open was. Die alinea sluit nooit meer → </w:body> mismatch → ongeldig .docx.

Repro

foo


Alinea met `code` erin.

Oplossing

Push geen _Ctx.codeBlockBody meer (het was dood: nooit gelezen, nooit opgeruimd). Daardoor popt pre's visitElementAfter correct _Ctx.codeBlock en blijft de stack schoon. De enum-waarde codeBlockBody en de dode branch in visitElementAfter zijn verwijderd.

Dezelfde bug bestond in de ODT-converter; LaTeX en EPUB hadden hem niet (die returnen true uit _visitCode).

Reële impact

Het document Information-Security-Policy-2.0-concept.docx (met een mermaid-blok op regel 163 en inline code op regels 460, 495, 520) was niet te openen.

## Probleem Een met OciDeck gemaakt document dat een (mermaid-)codeblok bevat, gevolgd door alinea's met inline code (enkele backticks), produceert een ongeldig .docx-bestand dat niet te openen is. ## Oorzaak In `markdown_to_docx.dart` en `markdown_to_odt.dart` returnt `_visitCode` voor een codeblok `false` uit `visitElementBefore`. De `markdown`-package roept daardoor `visitElementAfter` voor dat `<code>`-element **niet** meer aan (ast.dart:107). Toch pushte `_visitCode` `_Ctx.codeBlockBody` op de stack. Die placeholder wordt nooit meer weggehaald, waardoor `pre`'s `visitElementAfter` per ongeluk `_Ctx.codeBlockBody` popt in plaats van `_Ctx.codeBlock`. Na het eerste codeblok blijft `_Ctx.codeBlock` permanent op de stack staan, dus `_inCodeBlock` is voor altijd `true`. Gevolg: élke volgende inline `` `code` `` wordt als een blok-level PreformattedText-alinea gerenderd, genest in de alinea die al open was. Die alinea sluit nooit meer → `</w:body>` mismatch → ongeldig .docx. ## Repro ``` ``` foo ``` Alinea met `code` erin. ``` ## Oplossing Push geen `_Ctx.codeBlockBody` meer (het was dood: nooit gelezen, nooit opgeruimd). Daardoor popt `pre`'s `visitElementAfter` correct `_Ctx.codeBlock` en blijft de stack schoon. De enum-waarde `codeBlockBody` en de dode branch in `visitElementAfter` zijn verwijderd. Dezelfde bug bestond in de ODT-converter; LaTeX en EPUB hadden hem niet (die returnen `true` uit `_visitCode`). ## Reële impact Het document `Information-Security-Policy-2.0-concept.docx` (met een mermaid-blok op regel 163 en inline code op regels 460, 495, 520) was niet te openen.
brenno 2026-09-15 08:36:11 +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#2095
No description provided.