Formaat: een spreeknotitie die met "Woord:" begint laat de dia stil haar type verliezen #1815

Closed
opened 2026-08-27 16:41:29 +00:00 by brenno · 2 comments
Owner

Wat er misgaat

requiresWholeMarpBlockPreservation in lib/services/marp_source_preservation.dart
ziet élk enkelregelig HTML-commentaar waarvan de inhoud matcht op
^[A-Za-z][A-Za-z0-9_-]*\s*: aan voor een onbekende Marp-directive, tenzij het
begint met advance:, tlp:, ocideck_ of _. Is er zo'n commentaar, dan valt
het hele diablok terug op SlideType.freeMarkdown.

Een gewone spreeknotitie is in het Nederlands (en Engels) vaak van precies die
vorm. Deze drie zijn genoeg:

<!-- Antwoord: onwaar. Herstel is alleen toegestaan voor verduidelijking. -->
<!-- Pareto: de balken staan gesorteerd, de gekleurde kop is de vitale minderheid. -->
<!-- Verdiepingsdia: valt weg in de beknopte export. -->

Gemeten op main (bcde8be6a), 2026-08-27. Een handgeschreven deck van 45
dia's met onder meer <!-- _class: question -->, <!-- _class: matrix --> en
<!-- _class: chart -->. Drie dia's parsten als freeMarkdown in plaats van als
question/matrix/chart — precies de drie waarvan de notitie met Woord: begon.
Alleen die drie notities herschrijven (geen andere wijziging) herstelde alle
drie de types.

Voor de grafiekdia betekent dit dat de ```chart-fence als codeblok rendert in
plaats van als grafiek. Voor de vraagdia dat de quiz niet speelbaar is.

Waarom de heuristiek te breed is

Marpit honoreert alleen directives waarvan het de sleutel kent; een onbekende
sleutel wordt genegeerd. Een blok bewaren om Antwoord: is dus niet alleen
schadelijk, het is ook zinloos: Marp doet er zelf niets mee. De bewaarroute is
bedoeld voor sleutels die Marp wél honoreert maar OciDeck niet modelleert
(paginate, backgroundPosition, size, transition, class, …). De toets
hoort dan ook tegen die woordenlijst te gaan, niet tegen "elk woord gevolgd door
een dubbele punt".

Het tweede gat: de structuurcontrole zwijgt

MarkdownValidator.validate() levert op ditzelfde deck nul bevindingen,
terwijl drie dia's stil hun type verliezen. _reDirectiveKey daar kijkt bewust
alleen naar _- en ocideck_-voorvoegsels, dus de bare-word:-val valt buiten
beeld. Dit is precies het soort stille degradatie waarvoor §10 bestaat.

Wat het met het bestandsformaat doet

FILE_FORMAT.md §8 belooft: "Presenter notes — any other comment that does not
start with _"
. Die belofte klopt vandaag niet. Wie een deck met de hand
schrijft — of laat genereren — kan een dia stil kwijtraken op een notitie die
niets bijzonders is.

Toetsen

Een regressietest die een question- en een chart-dia met de notitie
<!-- Antwoord: onwaar. --> parseert en eist dat het diatype behouden blijft, en
een tegenhanger die aantoont dat een echte, niet-gemodelleerde Marp-directive
(<!-- backgroundPosition: top -->) het blok wél nog bewaart. Beide falen
vandaag de eerste kant op.

Verhouding tot #1810

Aangrenzend, maar een andere fout. #1810 gaat over onbekende ocideck_*-
directieven die een opslag niet overleven; dit gaat over prozanotities die
bij het lezen voor een Marp-directive worden aangezien. Ander pad, andere
reparatie, ze bijten elkaar niet.

**Wat er misgaat** `requiresWholeMarpBlockPreservation` in `lib/services/marp_source_preservation.dart` ziet élk enkelregelig HTML-commentaar waarvan de inhoud matcht op `^[A-Za-z][A-Za-z0-9_-]*\s*:` aan voor een onbekende Marp-directive, tenzij het begint met `advance:`, `tlp:`, `ocideck_` of `_`. Is er zo'n commentaar, dan valt het **hele diablok** terug op `SlideType.freeMarkdown`. Een gewone spreeknotitie is in het Nederlands (en Engels) vaak van precies die vorm. Deze drie zijn genoeg: <!-- Antwoord: onwaar. Herstel is alleen toegestaan voor verduidelijking. --> <!-- Pareto: de balken staan gesorteerd, de gekleurde kop is de vitale minderheid. --> <!-- Verdiepingsdia: valt weg in de beknopte export. --> **Gemeten op `main` (bcde8be6a), 2026-08-27.** Een handgeschreven deck van 45 dia's met onder meer `<!-- _class: question -->`, `<!-- _class: matrix -->` en `<!-- _class: chart -->`. Drie dia's parsten als `freeMarkdown` in plaats van als question/matrix/chart — precies de drie waarvan de notitie met `Woord:` begon. Alleen die drie notities herschrijven (geen andere wijziging) herstelde alle drie de types. Voor de grafiekdia betekent dit dat de ```chart-fence als codeblok rendert in plaats van als grafiek. Voor de vraagdia dat de quiz niet speelbaar is. **Waarom de heuristiek te breed is** Marpit honoreert alleen directives waarvan het de sleutel kent; een onbekende sleutel wordt genegeerd. Een blok bewaren om `Antwoord:` is dus niet alleen schadelijk, het is ook zinloos: Marp doet er zelf niets mee. De bewaarroute is bedoeld voor sleutels die Marp wél honoreert maar OciDeck niet modelleert (`paginate`, `backgroundPosition`, `size`, `transition`, `class`, …). De toets hoort dan ook tegen die woordenlijst te gaan, niet tegen "elk woord gevolgd door een dubbele punt". **Het tweede gat: de structuurcontrole zwijgt** `MarkdownValidator.validate()` levert op ditzelfde deck **nul bevindingen**, terwijl drie dia's stil hun type verliezen. `_reDirectiveKey` daar kijkt bewust alleen naar `_`- en `ocideck_`-voorvoegsels, dus de bare-`word:`-val valt buiten beeld. Dit is precies het soort stille degradatie waarvoor §10 bestaat. **Wat het met het bestandsformaat doet** `FILE_FORMAT.md` §8 belooft: *"Presenter notes — any other comment that does not start with `_`"*. Die belofte klopt vandaag niet. Wie een deck met de hand schrijft — of laat genereren — kan een dia stil kwijtraken op een notitie die niets bijzonders is. **Toetsen** Een regressietest die een `question`- en een `chart`-dia met de notitie `<!-- Antwoord: onwaar. -->` parseert en eist dat het diatype behouden blijft, en een tegenhanger die aantoont dat een echte, niet-gemodelleerde Marp-directive (`<!-- backgroundPosition: top -->`) het blok wél nog bewaart. Beide falen vandaag de eerste kant op. **Verhouding tot #1810** Aangrenzend, maar een andere fout. #1810 gaat over onbekende `ocideck_*`- directieven die een **opslag** niet overleven; dit gaat over prozanotities die bij het **lezen** voor een Marp-directive worden aangezien. Ander pad, andere reparatie, ze bijten elkaar niet.
Author
Owner

Opgepakt. Tak: fix/marp-notitie-directive (worktree). Verwachte reikwijdte: lib/services/marp_source_preservation.dart, lib/services/markdown_validator.dart (+ vocabulary), test/, docs/FILE_FORMAT.md §8/§9, CHANGELOG. Raakt #1810 niet: die zit in het schrijfpad voor onbekende ocideck_*-directieven, deze in de leesheuristiek voor Marp-directives.

Opgepakt. Tak: fix/marp-notitie-directive (worktree). Verwachte reikwijdte: lib/services/marp_source_preservation.dart, lib/services/markdown_validator.dart (+ vocabulary), test/, docs/FILE_FORMAT.md §8/§9, CHANGELOG. Raakt #1810 niet: die zit in het schrijfpad voor onbekende ocideck_*-directieven, deze in de leesheuristiek voor Marp-directives.
brenno 2026-08-27 17:27:11 +00:00
Author
Owner

Opgelost en op main geverifieerd: merge-commit 2bc36eea6 (PR #1816).

De toets gaat nu positief tegen kMarpitDirectiveNames — de sleutellijst van Marpit zelf, hoofdlettergevoelig — in plaats van tegen 'elk woord gevolgd door een dubbele punt'. De uitzonderingslijst (advance:, tlp:, ocideck_, _) verviel daarmee: geen van vieren is een Marp-richtlijn, dus geen van vieren komt de toets nog binnen.

Het tweede gat is ook dicht: valt een dia wél terecht terug (paginate:, footer:, backgroundPosition:), dan meldt MarkdownValidator dat nu met naam en gevolg. FILE_FORMAT §8 belooft weer wat de lezer doet, met §9, de §10-controletabel en de Nederlandse versie mee.

Regressietest: test/marp_directive_note_test.dart, eerst rood (6 van 15 faalden tegen de onherstelde code). Praktijktoets: het deck van 46 dia's dat de fout blootlegde, mét de drie oorspronkelijke notities, parseert nu met nul terugvallen naar freeMarkdown.

Wat er NIET in zit: de lijst hangt aan geen enkele poort. Voegt Marp een richtlijn toe, dan gaat die bij het opslaan verloren tot de naam erbij staat. Die afweging staat opgeschreven bij de lijst zelf, met de omslagvoorwaarde — een poort op make check-marp (#1804), of de doorgeeflus van #1810 die de vraag opheft. Zie #1817.

Opgelost en op main geverifieerd: merge-commit 2bc36eea6 (PR #1816). De toets gaat nu positief tegen `kMarpitDirectiveNames` — de sleutellijst van Marpit zelf, hoofdlettergevoelig — in plaats van tegen 'elk woord gevolgd door een dubbele punt'. De uitzonderingslijst (`advance:`, `tlp:`, `ocideck_`, `_`) verviel daarmee: geen van vieren is een Marp-richtlijn, dus geen van vieren komt de toets nog binnen. Het tweede gat is ook dicht: valt een dia wél terecht terug (`paginate:`, `footer:`, `backgroundPosition:`), dan meldt `MarkdownValidator` dat nu met naam en gevolg. FILE_FORMAT §8 belooft weer wat de lezer doet, met §9, de §10-controletabel en de Nederlandse versie mee. Regressietest: `test/marp_directive_note_test.dart`, eerst rood (6 van 15 faalden tegen de onherstelde code). Praktijktoets: het deck van 46 dia's dat de fout blootlegde, mét de drie oorspronkelijke notities, parseert nu met nul terugvallen naar freeMarkdown. Wat er NIET in zit: de lijst hangt aan geen enkele poort. Voegt Marp een richtlijn toe, dan gaat die bij het opslaan verloren tot de naam erbij staat. Die afweging staat opgeschreven bij de lijst zelf, met de omslagvoorwaarde — een poort op `make check-marp` (#1804), of de doorgeeflus van #1810 die de vraag opheft. Zie #1817.
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#1815
No description provided.