fix(docx/odt): codeblok lekt niet meer door naar volgende inline code #2096
No reviewers
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck!2096
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/docx-odt-codeblock-stack-leak"
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?
Samenvatting
Een document met een (mermaid-)codeblok gevolgd door alinea's met inline code (enkele backticks) produceerde een ongeldig
.docx/.odtdat niet te openen was.Oorzaak:
_visitCodepushte_Ctx.codeBlockBodyop de visitor-stack en returntefalseuitvisitElementBefore. Demarkdown-package roeptvisitElementAfterdan niet meer aan (ast.dart:107), dus die placeholder bleef staan.pre'svisitElementAfterpopte daardoor_Ctx.codeBlockBodyin plaats van_Ctx.codeBlock. Na het eerste codeblok stond_Ctx.codeBlockpermanent op de stack →_inCodeBlockwas voor altijdtrue→ élke volgende inline`code`werd als een blok-level PreformattedText-alinea gerenderd, genest in een alinea die nooit sloot →</w:body>mismatch.Oplossing: de
_Ctx.codeBlockBody-push was dood (nooit gelezen, nooit opgeruimd). Verwijderd, plus de dode enum-waarde en de dodevisitElementAfter-branch. Nu poptpre'svisitElementAftercorrect_Ctx.codeBlocken blijft de stack schoon.Dezelfde bug bestond in de ODT-converter. LaTeX en EPUB hadden hem niet (die returnen
trueuit_visitCode, dusvisitElementAfterwordt wél aangeroepen).Reële impact: het document
Information-Security-Policy-2.0-concept.docx(mermaid-blok op regel 163, inline code op regels 460/495/520) was niet te openen. Na de fix is de body welgevormd XML (xmllint: exit 0).Dit raakt het exportformaat, maar alleen om output te herstellen die al kapot was — geen nieuw formaat, geen nieuwe afhankelijkheid, geen nieuwe belofte. De bewaker-stap is inhoudelijk een reparatie van uitwisselbaarheid, geen afweging ertegen.
Fixes #2095.
Testplan
<w:p><w:p>, inline code is een run metSourceTextSource_Textspan, geenPreformatted_Text-alinea2026-09-11_Information_Security_Policy_NEO_NL_v2.0.mdis welgevormd XML (xmllint exit 0)make checkgroen (format, analyze, conventions, dead-code, l10n, volledige suite, coverage, goldens)Generated with Devin