Voetnoot invoegen kan een bestaande ongebruikte definitie dupliceren #1658

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

Probleem

nextFootnoteLabel zoekt definities met een regex die aan het begin van de volledige string is verankerd maar niet multiline is. Alleen een definitie op de allereerste regel wordt gevonden. Een bestaande, nog niet gerefereerde definitie verderop wordt gemist, waarna de invoegactie hetzelfde numerieke label kan kiezen en een dubbele definitie maakt.

Reproductie

  1. Zet verderop in een document alleen [^1]: bestaande tekst, zonder referentie.
  2. Kies Voetnoot invoegen.
  3. Observeer dat opnieuw label 1 en een tweede definitie worden toegevoegd.

Verwacht

Alle bestaande definities in alle regels reserveren hun label, ook als ze nog niet worden gerefereerd.

Technische aanwijzing

lib/utils/footnotes.dart:_definitionStart heeft ^ maar geen multiLine:true; nextFootnoteLabel gebruikt _definitionStart.allMatches(markdown).

Gevonden bij audit van commit d439638c6b.

## Probleem nextFootnoteLabel zoekt definities met een regex die aan het begin van de volledige string is verankerd maar niet multiline is. Alleen een definitie op de allereerste regel wordt gevonden. Een bestaande, nog niet gerefereerde definitie verderop wordt gemist, waarna de invoegactie hetzelfde numerieke label kan kiezen en een dubbele definitie maakt. ## Reproductie 1. Zet verderop in een document alleen [^1]: bestaande tekst, zonder referentie. 2. Kies Voetnoot invoegen. 3. Observeer dat opnieuw label 1 en een tweede definitie worden toegevoegd. ## Verwacht Alle bestaande definities in alle regels reserveren hun label, ook als ze nog niet worden gerefereerd. ## Technische aanwijzing lib/utils/footnotes.dart:_definitionStart heeft ^ maar geen multiLine:true; nextFootnoteLabel gebruikt _definitionStart.allMatches(markdown). Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted

Bevestigd tegen main (e93ef205c). lib/utils/footnotes.dart_definitionStart heeft wél ^ maar geen multiLine: true. nextFootnoteLabel draait allMatches over de héle documenttekst, dus alleen een definitie op regel 1 wordt gevonden. Verwijzingen komen wel binnen via _reference, dus dit bijt uitsluitend bij een definitie die (nog) nergens wordt aangehaald — precies het geval uit de reproductie.

Oplossingsrichting

nextFootnoteLabel dezelfde regelscan laten gebruiken als de rest van dit bestand: over de regels lopen met de _fence-schakelaar, en labels verzamelen uit definitieregels búiten codehekken — zoals stripFootnoteDefinitions en documentFootnotes het al doen.

Dat lost meteen een tweede, stillere fout op: multiLine: true op de bestaande regex zou een [^1]: ín een codeblok een label laten reserveren, en dat hoort juist níét. De regelscan houdt dat onderscheid.

Regressietest (verplicht)

test/footnotes_test.dart:

  • ongerefereerde definitie [^1]: op regel 5 → nextFootnoteLabel == '2';
  • [^1]: binnen een ``` -hek → nextFootnoteLabel == '1';
  • gemengd (verwijzing 1, losse definitie 2) → '3'.

Kosten

Klein: één functie, drie tests.

Prioriteit

Middel: het resultaat is een document met twee definities voor hetzelfde label — kapot, en de gebruiker ziet het pas in de uitvoer.

## Triage: accepted **Bevestigd tegen `main` (e93ef205c).** `lib/utils/footnotes.dart` — `_definitionStart` heeft wél `^` maar geen `multiLine: true`. `nextFootnoteLabel` draait `allMatches` over de héle documenttekst, dus alleen een definitie op regel 1 wordt gevonden. Verwijzingen komen wel binnen via `_reference`, dus dit bijt uitsluitend bij een definitie die (nog) nergens wordt aangehaald — precies het geval uit de reproductie. ## Oplossingsrichting `nextFootnoteLabel` dezelfde regelscan laten gebruiken als de rest van dit bestand: over de regels lopen met de `_fence`-schakelaar, en labels verzamelen uit definitieregels búiten codehekken — zoals `stripFootnoteDefinitions` en `documentFootnotes` het al doen. Dat lost meteen een tweede, stillere fout op: `multiLine: true` op de bestaande regex zou een `[^1]:` ín een codeblok een label laten reserveren, en dat hoort juist níét. De regelscan houdt dat onderscheid. ## Regressietest (verplicht) `test/footnotes_test.dart`: - ongerefereerde definitie `[^1]:` op regel 5 → `nextFootnoteLabel == '2'`; - `[^1]:` binnen een ``` -hek → `nextFootnoteLabel == '1'`; - gemengd (verwijzing 1, losse definitie 2) → `'3'`. ## Kosten Klein: één functie, drie tests. ## Prioriteit Middel: het resultaat is een document met twee definities voor hetzelfde label — kapot, en de gebruiker ziet het pas in de uitvoer.
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#1658
No description provided.