fix(formaat): een notitie die met "Woord:" begint is geen Marp-richtlijn (#1815) #1816

Merged
brenno merged 4 commits from fix/marp-notitie-directive into main 2026-08-27 17:27:09 +00:00
Owner

Een spreeknotitie die met een woord plus dubbele punt begint, liet de dia stil haar type verliezen.

Wat er misging

requiresWholeMarpBlockPreservation toetste op ^[A-Za-z][A-Za-z0-9_-]*\s*: — "elk woord gevolgd door een dubbele punt" — en zag dat aan voor een Marp-richtlijn die OciDeck niet modelleert. Het hele diablok viel daarop terug op freeMarkdown.

Dat is precies de vorm van een gewone notitie. Gemeten op main met een handgeschreven deck van 46 dia's: drie verloren hun type.

notitie dia werd
<!-- Antwoord: onwaar. … --> question freeMarkdown — quiz niet meer speelbaar
<!-- Pareto: de balken staan gesorteerd … --> chart freeMarkdown — fence rendert als codeblok
<!-- Verdiepingsdia: valt weg in de export. --> matrix (FMEA) freeMarkdown

Alleen die drie notities herschrijven — geen andere wijziging — herstelde alle drie. En MarkdownValidator.validate() meldde er nul bevindingen over.

Wat deze PR doet

  1. De toets gaat positief tegen kMarpitDirectiveNames, de sleutellijst van Marpit zelf, hoofdlettergevoelig zoals Marpit die ook vergelijkt. Dat is niet alleen smaller maar juister: Marpit negeert een sleutel die het niet kent, dus een blok bewaren om Antwoord: hielp niemand — Marp deed er zelf al niets mee. De uitzonderingslijst (advance:, tlp:, ocideck_, _) verviel daarmee; geen van vieren is een Marp-richtlijn.
  2. De structuurcontrole zwijgt niet meer. Valt een dia wél terecht terug — paginate:, footer:, backgroundPosition: doet Marp iets mee — dan meldt §10 dat nu met naam en gevolg.
  3. FILE_FORMAT.md §8 belooft weer wat de lezer doet. Er stond "Presenter notes — any other comment that does not start with _", en dat klopte niet. §9 en de controletabel van §10 lopen mee; de Nederlandse versie ook.

De afweging, hardop

De oude brede toets ving élke toekomstige Marp-richtlijn vanzelf op; deze lijst niet. Voegt Marp er een toe, dan gaat die bij het opslaan verloren tot de naam hier bijstaat. Dat is een echte regressie in uitwisselbaarheid en hij staat opgeschreven bij de lijst zelf.

Ik laat betrouwbaarheid voorgaan: wat de brede toets kocht was toekomstvastheid voor iets zeldzaams (Marpit voegt zelden richtlijnen toe), wat ze kostte was een dagelijkse stille fout. Van gedachten veranderen we zodra dit aan een poort hangt — make check-marp (#1804) draait de échte gepinde Marp CLI en is de plek om de lijst tegen die versie te toetsen. De structurele oplossing is de doorgeeflus van #1810, die bewaren-of-niet een niet-vraag maakt.

Toetsen

test/marp_directive_note_test.dart, eerst rood tegen de onherstelde code (6 van 15 faalden), zet beide kanten vast:

  • drie prozanotities houden hun diatype, en overleven een terugschrijfronde;
  • acht echte Marpit-sleutels bewaren het blok nog steeds;
  • Footer: is proza, footer: is een richtlijn;
  • de validator meldt de eerste en zwijgt over de tweede.

Praktijktoets: het deck van 46 dia's dat de fout blootlegde, mét de drie oorspronkelijke notities, parseert nu met nul terugvallen naar freeMarkdown.

Gedraaid

  • make check — groen, exitcode 0 (niet door tail gepijpt), na rebase op 058a010c0
  • make check-secrets — 0 bevindingen
  • make sast — 4 regels, 1177 bestanden, 0 bevindingen
  • DAST (ZAP) niet gedraaid. Die toetst het geserveerde weboppervlak; dit is leeslogica in de parser en raakt de webbundel niet.
  • Bewaker-blik gedaan (verplicht: dit raakt het bestandsformaat). Er komt niets nieuws in het .md — de wijziging zit puur in het lezen — en OciDecks interpretatie komt juist dichter bij die van elk ander Marp-gereedschap te liggen. Het enige punt dat eruit kwam is de veroudering hierboven, nu vastgelegd in de code.

Closes #1815

Een spreeknotitie die met een woord plus dubbele punt begint, liet de dia stil haar type verliezen. ## Wat er misging `requiresWholeMarpBlockPreservation` toetste op `^[A-Za-z][A-Za-z0-9_-]*\s*:` — "elk woord gevolgd door een dubbele punt" — en zag dat aan voor een Marp-richtlijn die OciDeck niet modelleert. Het hele diablok viel daarop terug op `freeMarkdown`. Dat is precies de vorm van een gewone notitie. Gemeten op `main` met een handgeschreven deck van 46 dia's: drie verloren hun type. | notitie | dia | werd | | --- | --- | --- | | `<!-- Antwoord: onwaar. … -->` | `question` | `freeMarkdown` — quiz niet meer speelbaar | | `<!-- Pareto: de balken staan gesorteerd … -->` | `chart` | `freeMarkdown` — fence rendert als codeblok | | `<!-- Verdiepingsdia: valt weg in de export. -->` | `matrix` (FMEA) | `freeMarkdown` | Alleen die drie notities herschrijven — geen andere wijziging — herstelde alle drie. En `MarkdownValidator.validate()` meldde er **nul** bevindingen over. ## Wat deze PR doet 1. **De toets gaat positief tegen `kMarpitDirectiveNames`**, de sleutellijst van Marpit zelf, hoofdlettergevoelig zoals Marpit die ook vergelijkt. Dat is niet alleen smaller maar juister: Marpit negeert een sleutel die het niet kent, dus een blok bewaren om `Antwoord:` hielp niemand — Marp deed er zelf al niets mee. De uitzonderingslijst (`advance:`, `tlp:`, `ocideck_`, `_`) verviel daarmee; geen van vieren is een Marp-richtlijn. 2. **De structuurcontrole zwijgt niet meer.** Valt een dia wél terecht terug — `paginate:`, `footer:`, `backgroundPosition:` doet Marp iets mee — dan meldt §10 dat nu met naam en gevolg. 3. **`FILE_FORMAT.md` §8 belooft weer wat de lezer doet.** Er stond "Presenter notes — any other comment that does not start with `_`", en dat klopte niet. §9 en de controletabel van §10 lopen mee; de Nederlandse versie ook. ## De afweging, hardop De oude brede toets ving élke *toekomstige* Marp-richtlijn vanzelf op; deze lijst niet. Voegt Marp er een toe, dan gaat die bij het opslaan verloren tot de naam hier bijstaat. Dat is een echte regressie in uitwisselbaarheid en hij staat opgeschreven bij de lijst zelf. Ik laat betrouwbaarheid voorgaan: wat de brede toets kocht was toekomstvastheid voor iets zeldzaams (Marpit voegt zelden richtlijnen toe), wat ze kostte was een dagelijkse stille fout. Van gedachten veranderen we zodra dit aan een poort hangt — `make check-marp` (#1804) draait de échte gepinde Marp CLI en is de plek om de lijst tegen die versie te toetsen. De structurele oplossing is de doorgeeflus van #1810, die bewaren-of-niet een niet-vraag maakt. ## Toetsen `test/marp_directive_note_test.dart`, eerst rood tegen de onherstelde code (6 van 15 faalden), zet beide kanten vast: - drie prozanotities houden hun diatype, en overleven een terugschrijfronde; - acht echte Marpit-sleutels bewaren het blok nog steeds; - `Footer:` is proza, `footer:` is een richtlijn; - de validator meldt de eerste en zwijgt over de tweede. Praktijktoets: het deck van 46 dia's dat de fout blootlegde, mét de drie oorspronkelijke notities, parseert nu met nul terugvallen naar `freeMarkdown`. ## Gedraaid - `make check` — groen, exitcode 0 (niet door `tail` gepijpt), na rebase op `058a010c0` - `make check-secrets` — 0 bevindingen - `make sast` — 4 regels, 1177 bestanden, 0 bevindingen - **DAST (ZAP) niet gedraaid.** Die toetst het *geserveerde* weboppervlak; dit is leeslogica in de parser en raakt de webbundel niet. - **Bewaker-blik gedaan** (verplicht: dit raakt het bestandsformaat). Er komt niets nieuws in het `.md` — de wijziging zit puur in het lezen — en OciDecks interpretatie komt juist dichter bij die van elk ander Marp-gereedschap te liggen. Het enige punt dat eruit kwam is de veroudering hierboven, nu vastgelegd in de code. Closes #1815
`requiresWholeMarpBlockPreservation` toetste op "elk woord gevolgd door een
dubbele punt" en zette daarop het hele diablok om in vrije Markdown. Dat is
precies de vorm van een gewone notitie: op een handgeschreven deck van 46 dia's
verloren er drie stil hun type — `<!-- Antwoord: onwaar. -->` op een vraagdia,
`<!-- Pareto: de balken staan gesorteerd. -->` op een grafiekdia en
`<!-- Verdiepingsdia: valt weg in de export. -->` op een FMEA. De quiz was niet
meer speelbaar, de chart-fence rendeerde als codeblok.

De toets gaat nu positief tegen `kMarpitDirectiveNames`, de sleutellijst van
Marpit zelf, hoofdlettergevoelig zoals Marpit die ook vergelijkt. Dat is niet
alleen smaller maar juister: Marpit negeert een sleutel die het niet kent, dus
een blok bewaren om `Antwoord:` hielp niemand. De uitzonderingslijst kon
daarmee weg — geen van die vier is een Marp-richtlijn.

De test zet beide kanten vast: drie prozanotities houden hun diatype, acht
echte Marpit-sleutels bewaren het blok nog steeds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Op het deck dat de bug blootlegde gaf `MarkdownValidator.validate()` nul
bevindingen, terwijl drie dia's hun type kwijt waren. De controle keek alleen
naar `_`- en `ocideck_`-voorvoegsels, dus de kale Marp-richtlijn viel buiten
beeld.

Nu meldt hij die met naam en gevolg: `paginate:`, `footer:` en
`backgroundPosition:` zijn geldige Marp-richtlijnen die OciDeck niet
modelleert, dus de dia blijft terecht bron — maar dat hoort niet stil te
gebeuren. Dat is waar §10 voor bestaat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
§8 zei "Presenter notes — any other comment that does not start with `_`", en
dat klopte niet: een notitie die een Marp-sleutel toevallig als eerste woord
had, was een richtlijn. De regel staat er nu expliciet, met de sleutellijst en
de hoofdlettergevoeligheid erbij, plus wat er dan met de dia gebeurt en dat de
structuurcontrole dat meldt. §9 en de controletabel van §10 lopen mee, en de
Nederlandse versie ook.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs(formaat): schrijf op waarom de sleutellijst mag verouderen (#1815)
All checks were successful
scans / scans (pull_request) Successful in 3m19s
static-gate / static-gate (pull_request) Successful in 7m31s
9c7a6cd372
De bewaker-blik op deze wijziging leverde één punt op dat nergens stond: de
oude, brede toets ving élke toekomstige Marp-richtlijn vanzelf op, de nieuwe
niet. Dat is een echte regressie in uitwisselbaarheid, en die hoort niet
stilzwijgend gemaakt te worden.

De afweging staat nu bij de lijst zelf: een zeldzame gebeurtenis (Marpit voegt
zelden iets toe) tegenover een dagelijkse stille fout (elke notitie met een
dubbele punt sloopte haar dia). Met de omslagvoorwaarde erbij — een poort op
`make check-marp` (#1804), of de doorgeeflus van #1810, die de vraag helemaal
opheft.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit 2bc36eea66 into main 2026-08-27 17:27:09 +00:00
Sign in to join this conversation.
No description provided.