Documentafbeeldingen met haakjes of spaties in de bestemming worden verkeerd geparseerd #1657

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

Probleem

De eigen Markdown-afbeeldingsparser stopt de bestemming bij de eerste sluitende haak en kapt vervolgens op de eerste whitespace af. Geldige of veelvoorkomende bronnen zoals images/figure (1).png en angle-bracket destinations worden daardoor niet als het bedoelde beeld geladen. De paginaweergave gebruikt dezelfde regex en herkent zulke beelden ook niet voor asynchrone hermeting.

Reproductie

  1. Voeg een bestand toe met een spatie en haakjes in de naam.
  2. Verwijs ernaar met geldige Markdown-escaping/angle brackets.
  3. Bekijk het document en de paginaweergave.

Verwacht

De afbeelding wordt volgens de ondersteunde Markdown-syntaxis geparseerd en telt mee voor paginering.

Technische aanwijzing

_imageLinePattern is ^![([^]])](([^)]))$ in document_markdown_blocks.dart en paged_document_view.dart; _parseImageLine neemt de bron tot de eerste whitespace.

Gevonden bij audit van commit d439638c6b.

## Probleem De eigen Markdown-afbeeldingsparser stopt de bestemming bij de eerste sluitende haak en kapt vervolgens op de eerste whitespace af. Geldige of veelvoorkomende bronnen zoals images/figure (1).png en angle-bracket destinations worden daardoor niet als het bedoelde beeld geladen. De paginaweergave gebruikt dezelfde regex en herkent zulke beelden ook niet voor asynchrone hermeting. ## Reproductie 1. Voeg een bestand toe met een spatie en haakjes in de naam. 2. Verwijs ernaar met geldige Markdown-escaping/angle brackets. 3. Bekijk het document en de paginaweergave. ## Verwacht De afbeelding wordt volgens de ondersteunde Markdown-syntaxis geparseerd en telt mee voor paginering. ## Technische aanwijzing _imageLinePattern is ^!\[([^\]]*)\]\(([^)]*)\)$ in document_markdown_blocks.dart en paged_document_view.dart; _parseImageLine neemt de bron tot de eerste whitespace. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted

Bevestigd tegen main (e93ef205c). _imageLinePattern = RegExp(r'^!\[([^\]]*)\]\(([^)]*)\)$') staat twee keer los in de boom: lib/widgets/reader/parts/document_markdown_blocks.dart en lib/widgets/reader/paged_document_view.dart. _parseImageLine (document_markdown_blocks.dart) kapt de bestemming bovendien af op de eerste witruimte.

Uitkomst:

  • ![a](images/figure (1).png) matcht helemaal niet — de groep stopt bij de eerste ), waarna $ faalt. CommonMark staat gebalanceerde haakjes in een kale bestemming wél toe.
  • ![a](<mijn bestand.png>) levert bron <mijn op.
  • De paginaweergave herkent zulke regels evenmin, dus ze tellen niet mee voor de asynchrone hermeting (en zie #1652).

Oplossingsrichting

Eén gedeelde ontleder in lib/utils/, door beide bestanden geïmporteerd. Dat de regex nu twee keer bestaat is precies hoe ze uit elkaar kunnen lopen; dit is het moment om dat op te heffen.

De ontleder is een kleine handgeschreven scanner, geen regex — haakjes tellen kan een regex niet. Hij dekt wat wij ondersteunen:

  • kale bestemming met gebalanceerde haakjes;
  • <…>-bestemming (alles tot de sluitende >, spaties toegestaan);
  • backslash-ontsnapte \(, \) en \<;
  • optionele "titel" / 'titel' / (titel) ná de bestemming, die niet in het pad hoort.

Regressietest (verplicht)

Nieuwe unittest op de ontleder: figure (1).png, <mijn bestand.png>, pad\(1\).png, bestemming met titel, en de bestaande gevallen als vangnet. Plus in test/paged_document_view_test.dart dat zo'n afbeelding als beeldblok telt voor de hermeting.

Kosten

Nieuw bestand in lib/utils/ — let op de registratieketen: SOURCE_MAP-regel plus dekking, anders valt make check (zie CI static-gate). Twee aanroepers omzetten. Halve dag.

Prioriteit

Middel: het beeld verdwijnt stil, en het pagina-einde klopt daarna precies één beeldhoogte niet.

## Triage: accepted **Bevestigd tegen `main` (e93ef205c).** `_imageLinePattern = RegExp(r'^!\[([^\]]*)\]\(([^)]*)\)$')` staat twee keer los in de boom: `lib/widgets/reader/parts/document_markdown_blocks.dart` en `lib/widgets/reader/paged_document_view.dart`. `_parseImageLine` (`document_markdown_blocks.dart`) kapt de bestemming bovendien af op de eerste witruimte. Uitkomst: - `![a](images/figure (1).png)` matcht helemaal niet — de groep stopt bij de eerste `)`, waarna `$` faalt. CommonMark staat gebalanceerde haakjes in een kale bestemming wél toe. - `![a](<mijn bestand.png>)` levert bron `<mijn` op. - De paginaweergave herkent zulke regels evenmin, dus ze tellen niet mee voor de asynchrone hermeting (en zie #1652). ## Oplossingsrichting Eén gedeelde ontleder in `lib/utils/`, door beide bestanden geïmporteerd. Dat de regex nu twee keer bestaat is precies hoe ze uit elkaar kunnen lopen; dit is het moment om dat op te heffen. De ontleder is een kleine handgeschreven scanner, geen regex — haakjes tellen kan een regex niet. Hij dekt wat wij ondersteunen: - kale bestemming met gebalanceerde haakjes; - `<…>`-bestemming (alles tot de sluitende `>`, spaties toegestaan); - backslash-ontsnapte `\(`, `\)` en `\<`; - optionele `"titel"` / `'titel'` / `(titel)` ná de bestemming, die niet in het pad hoort. ## Regressietest (verplicht) Nieuwe unittest op de ontleder: `figure (1).png`, `<mijn bestand.png>`, `pad\(1\).png`, bestemming met titel, en de bestaande gevallen als vangnet. Plus in `test/paged_document_view_test.dart` dat zo'n afbeelding als beeldblok telt voor de hermeting. ## Kosten Nieuw bestand in `lib/utils/` — let op de registratieketen: `SOURCE_MAP`-regel plus dekking, anders valt `make check` (zie `CI static-gate`). Twee aanroepers omzetten. Halve dag. ## Prioriteit Middel: het beeld verdwijnt stil, en het pagina-einde klopt daarna precies één beeldhoogte niet.
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#1657
No description provided.