fix(codec): blokinhoud in een lijstitem reist verliesvrij door de visuele modus (#1925) #1938

Merged
brenno merged 1 commit from fix/codec-list-item-block-content-v3 into main 2026-09-03 11:37:13 +00:00
Owner

Samenvatting

Quills documentmodel is vlak: list en codeBlock zijn exclusieve blokattributen, dus een codeblok in een lijstitem kon niet als kind van de bulletregel reizen. MarkdownToDelta plakte de inhoud aan de lijstitem-tekst met een x-md-codeblock-lang-attribuut, waardoor de fence en de inspringing stil verloren gingen bij de rondgang. Hetzelfde gold voor tabellen en mermaid-diagrammen in lijstitems.

De codec voert blokinhoud in een lijstitem nu als x-embed-list-block-embed met de inspringing bewaard:

  • Heenweg (MarkdownToDelta): onderschept pre en embeds in visitElementBefore wanneer _listItemIndent >= 0, sluit de lijstitem-regel af, reconstrueert de ruwe markdown (fence voor codeblokken, data-attribuut voor embeds), en draagt het blok als embed met de juiste inspringing (2 spaties per niveau voor ongeordende lijsten, 3 voor geordende).
  • Terugweg (DeltaToMarkdown): de EmbeddableListBlock.toMdSyntax handler schrijft de ruwe markdown verbatim terug.
  • Lijstnummering: de afsluitende regel krijgt een indent-attribuut zodat _prefixNumber de nummering niet verbreekt — de teller slaat ingesprongen niet-lijst-regels over.

Wat er verandert aan het bestandsformaat

Niets. De round-trip was al supposed to be lossless; deze fix maakt het daadwerkelijk lossless. De Markdown die er uit komt is standaard GFM met ingesprongen blokinhoud in lijstitems — precies wat de CommonMark/GFM-spec voorschrijft voor geneste blokken.

Testplan

  • Regressietests voor codeblok, tabel, mermaid en geordende lijst in test/markdown_quill_codec_test.dart
  • Bestaande codec-tests, round-trip tests, visual-save tests, pentest tests en source-map tests groen (211 tests)
  • Statische poorten groen (format, analyze, conventions, dead-code, comment-language, hardcoded-text)

Generated with Devin

## Samenvatting Quills documentmodel is vlak: `list` en `codeBlock` zijn exclusieve blokattributen, dus een codeblok in een lijstitem kon niet als kind van de bulletregel reizen. `MarkdownToDelta` plakte de inhoud aan de lijstitem-tekst met een `x-md-codeblock-lang`-attribuut, waardoor de fence en de inspringing stil verloren gingen bij de rondgang. Hetzelfde gold voor tabellen en mermaid-diagrammen in lijstitems. De codec voert blokinhoud in een lijstitem nu als `x-embed-list-block`-embed met de inspringing bewaard: - **Heenweg** (`MarkdownToDelta`): onderschept `pre` en embeds in `visitElementBefore` wanneer `_listItemIndent >= 0`, sluit de lijstitem-regel af, reconstrueert de ruwe markdown (fence voor codeblokken, `data`-attribuut voor embeds), en draagt het blok als embed met de juiste inspringing (2 spaties per niveau voor ongeordende lijsten, 3 voor geordende). - **Terugweg** (`DeltaToMarkdown`): de `EmbeddableListBlock.toMdSyntax` handler schrijft de ruwe markdown verbatim terug. - **Lijstnummering**: de afsluitende regel krijgt een `indent`-attribuut zodat `_prefixNumber` de nummering niet verbreekt — de teller slaat ingesprongen niet-lijst-regels over. ## Wat er verandert aan het bestandsformaat Niets. De round-trip was al supposed to be lossless; deze fix maakt het daadwerkelijk lossless. De Markdown die er uit komt is standaard GFM met ingesprongen blokinhoud in lijstitems — precies wat de CommonMark/GFM-spec voorschrijft voor geneste blokken. ## Testplan - [x] Regressietests voor codeblok, tabel, mermaid en geordende lijst in `test/markdown_quill_codec_test.dart` - [x] Bestaande codec-tests, round-trip tests, visual-save tests, pentest tests en source-map tests groen (211 tests) - [x] Statische poorten groen (format, analyze, conventions, dead-code, comment-language, hardcoded-text) Generated with [Devin](https://devin.ai)
fix(codec): blokinhoud in een lijstitem reist verliesvrij door de visuele modus (#1925)
Some checks failed
scans / scans (pull_request) Successful in 7m0s
static-gate / static-gate (pull_request) Failing after 8m58s
4df486f1f2
Quills documentmodel is vlak: `list` en `codeBlock` zijn exclusieve
blokattributen, dus een codeblok in een lijstitem kon niet als kind van
de bulletregel reizen. `MarkdownToDelta` plakte de inhoud aan de
lijstitem-tekst met een `x-md-codeblock-lang`-attribuut, waardoor de
fence en de inspringing stil verloren gingen bij de rondgang. Hetzelfde
gold voor tabellen en mermaid-diagrammen in lijstitems.

De codec voert blokinhoud in een lijstitem nu als `x-embed-list-block`-
embed met de inspringing bewaard. De heenweg onderschept `pre` en embeds
in `visitElementBefore` wanneer `_listItemIndent >= 0`, sluit de
lijstitem-regel af, en draagt het blok als embed met de juiste
inspringing (2 spaties per niveau voor ongeordende lijsten, 3 voor
geordende). De terugweg schrijft de ruwe markdown verbatim terug. De
afsluitende regel krijgt een `indent`-attribuut zodat de lijstnummering
niet verbreekt (`_prefixNumber` slaat ingesprongen niet-lijst-regels
over).

Regressietests voor codeblok, tabel, mermaid en geordende lijst.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno force-pushed fix/codec-list-item-block-content-v3 from 4df486f1f2
Some checks failed
scans / scans (pull_request) Successful in 7m0s
static-gate / static-gate (pull_request) Failing after 8m58s
to 05e4884c89
Some checks failed
scans / scans (pull_request) Successful in 3m56s
static-gate / static-gate (pull_request) Failing after 9m29s
2026-09-03 08:17:25 +00:00
Compare
chore: trigger fresh CI run
Some checks failed
scans / scans (pull_request) Successful in 4m57s
static-gate / static-gate (pull_request) Failing after 11m32s
45cb2f7cd5
brenno force-pushed fix/codec-list-item-block-content-v3 from 45cb2f7cd5
Some checks failed
scans / scans (pull_request) Successful in 4m57s
static-gate / static-gate (pull_request) Failing after 11m32s
to 0250b7b00f
All checks were successful
scans / scans (pull_request) Successful in 3m45s
static-gate / static-gate (pull_request) Successful in 11m6s
2026-09-03 09:32:49 +00:00
Compare
brenno force-pushed fix/codec-list-item-block-content-v3 from 0250b7b00f
All checks were successful
scans / scans (pull_request) Successful in 3m45s
static-gate / static-gate (pull_request) Successful in 11m6s
to 9732690453
All checks were successful
scans / scans (pull_request) Successful in 4m59s
static-gate / static-gate (pull_request) Successful in 15m46s
2026-09-03 10:02:59 +00:00
Compare
brenno force-pushed fix/codec-list-item-block-content-v3 from 9732690453
All checks were successful
scans / scans (pull_request) Successful in 4m59s
static-gate / static-gate (pull_request) Successful in 15m46s
to ebd2d00992
All checks were successful
scans / scans (pull_request) Successful in 6m43s
web-gate / web-gate (pull_request) Successful in 12m2s
static-gate / static-gate (pull_request) Successful in 15m57s
2026-09-03 11:20:49 +00:00
Compare
brenno merged commit b15431ac8b into main 2026-09-03 11:37:13 +00:00
Sign in to join this conversation.
No description provided.