Chart-export kan geldige vier-backtick-fences ongeldig herschrijven #1685

Closed
opened 2026-08-21 12:02:19 +00:00 by brenno · 1 comment
Owner

Probleem

De document→deck-brug kan fence-runlengtes generiek lezen, maar serialiseert chartblokken altijd terug met drie backticks. Een geldig chartblok dat juist vier backticks gebruikt omdat de inhoud een regel met drie backticks bevat, wordt bij projectie/export in een kortere fence gezet. Die innerlijke regel sluit dan voortijdig het blok en de export-Mardown raakt structureel beschadigd.

Reproductie

  1. Maak een chart fence met vier backticks en neem een losse drie-backtickregel op in de inhoud.
  2. Exporteer het document naar Markdown of een formaat dat via DocumentDeckBridge projecteert.
  3. Inspecteer de opnieuw geserialiseerde chartbron.

Verwacht

De oorspronkelijke veilige runlengte blijft behouden of de serializer kiest dynamisch een fence langer dan iedere run in de inhoud.

Technische aanwijzing

DocumentDeckBridge heeft een generieke _FenceInfo bij lezen, maar de chart-serialisatie emitteert vast drie backticks.

Gevonden bij audit van commit d439638c6b.

## Probleem De document→deck-brug kan fence-runlengtes generiek lezen, maar serialiseert chartblokken altijd terug met drie backticks. Een geldig chartblok dat juist vier backticks gebruikt omdat de inhoud een regel met drie backticks bevat, wordt bij projectie/export in een kortere fence gezet. Die innerlijke regel sluit dan voortijdig het blok en de export-Mardown raakt structureel beschadigd. ## Reproductie 1. Maak een chart fence met vier backticks en neem een losse drie-backtickregel op in de inhoud. 2. Exporteer het document naar Markdown of een formaat dat via DocumentDeckBridge projecteert. 3. Inspecteer de opnieuw geserialiseerde chartbron. ## Verwacht De oorspronkelijke veilige runlengte blijft behouden of de serializer kiest dynamisch een fence langer dan iedere run in de inhoud. ## Technische aanwijzing DocumentDeckBridge heeft een generieke _FenceInfo bij lezen, maar de chart-serialisatie emitteert vast drie backticks. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted

Bevestigd tegen main (e93ef205c). De leeskant kent de runlengte: _fenceOpen (lib/services/document_deck_bridge.dart) ontleedt `{3,} en ~{3,} en _isFenceClose eist minstens dezelfde lengte. De schrijfkant niet: document_deck_bridge.dart geeft '```chart\n${slide.customMarkdown}\n```' terug, met drie backticks vast ingebakken.

Hetzelfde staat in lib/services/markdown_service_serialize.dart: _writeChartSlide en _writeCockpitSlide schrijven een vaste hekrij. De code-dia is de enige die het goed doet — die gebruikt fenceFor (lib/services/markdown_service_fenced.dart), dat precies hiervoor bestaat.

Oplossingsrichting

fenceFor(body) gebruiken op élke plek die een fenced blok schrijft: chart, cockpit, question én de brug. De hekrij volgt dan uit de inhoud en is per definitie lang genoeg.

De brug importeert markdown_service niet (alleen models/, markdown_table_codec, pentest_blocks, document_timeline), dus fenceFor verhuist naar lib/utils/ en beide bibliotheken importeren hem daar. Niet een tweede kopie in de brug laten ontstaan — dat is exact hoe dit soort verschillen groeien (zie ook #1657).

Wat ik er níét bij zou doen: de oorspronkelijke hekrij bewáren. De leeskant kent hem wel (_FenceInfo.length) maar laat hem vallen bij het bouwen van de chart-dia, en een ~~~chart komt sowieso als backticks terug. Dat herstellen vraagt een veld op Slide en lost geen kapotte uitvoer op; de hekrij uit de inhoud berekenen dekt het correctheidsgeval volledig.

Regressietest (verplicht)

  • test/document_deck_bridge_test.dart: chart-hek van vier backticks met een losse ``` -regel erin → heen en terug, en de geserialiseerde vorm omsluit de inhoud nog (parseer het resultaat terug en vergelijk de inhoud, niet de tekst).
  • Dezelfde toets voor cockpit en question in de markdown_service-tests.

Kosten

Eén verhuisde functie plus vier aanroepplekken. Let op de registratieketen bij een nieuw bestand in lib/utils/ (SOURCE_MAP + dekking).

Prioriteit

Middel: zeldzame constructie, maar de uitkomst is structureel kapotte uitvoer-Markdown.

## Triage: accepted **Bevestigd tegen `main` (e93ef205c).** De leeskant kent de runlengte: `_fenceOpen` (`lib/services/document_deck_bridge.dart`) ontleedt `` `{3,} `` en `~{3,}` en `_isFenceClose` eist minstens dezelfde lengte. De schrijfkant niet: `document_deck_bridge.dart` geeft `'```chart\n${slide.customMarkdown}\n```'` terug, met drie backticks vast ingebakken. Hetzelfde staat in `lib/services/markdown_service_serialize.dart`: `_writeChartSlide` en `_writeCockpitSlide` schrijven een vaste hekrij. De code-dia is de enige die het goed doet — die gebruikt `fenceFor` (`lib/services/markdown_service_fenced.dart`), dat precies hiervoor bestaat. ## Oplossingsrichting `fenceFor(body)` gebruiken op élke plek die een fenced blok schrijft: chart, cockpit, question én de brug. De hekrij volgt dan uit de inhoud en is per definitie lang genoeg. De brug importeert `markdown_service` niet (alleen `models/`, `markdown_table_codec`, `pentest_blocks`, `document_timeline`), dus `fenceFor` verhuist naar `lib/utils/` en beide bibliotheken importeren hem daar. Niet een tweede kopie in de brug laten ontstaan — dat is exact hoe dit soort verschillen groeien (zie ook #1657). Wat ik er níét bij zou doen: de oorspronkelijke hekrij bewáren. De leeskant kent hem wel (`_FenceInfo.length`) maar laat hem vallen bij het bouwen van de chart-dia, en een `~~~chart` komt sowieso als backticks terug. Dat herstellen vraagt een veld op `Slide` en lost geen kapotte uitvoer op; de hekrij uit de inhoud berekenen dekt het correctheidsgeval volledig. ## Regressietest (verplicht) - `test/document_deck_bridge_test.dart`: chart-hek van vier backticks met een losse ``` -regel erin → heen en terug, en de geserialiseerde vorm omsluit de inhoud nog (parseer het resultaat terug en vergelijk de inhoud, niet de tekst). - Dezelfde toets voor cockpit en question in de markdown_service-tests. ## Kosten Eén verhuisde functie plus vier aanroepplekken. Let op de registratieketen bij een nieuw bestand in `lib/utils/` (`SOURCE_MAP` + dekking). ## Prioriteit Middel: zeldzame constructie, maar de uitkomst is structureel kapotte uitvoer-Markdown.
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#1685
No description provided.