Zoeken/vervangen telt en herschrijft onzichtbare markdown (links, comments, code) — telling wijkt af van gerenderde tekst #2137

Closed
opened 2026-09-20 20:54:58 +00:00 by brenno · 0 comments
Owner

Symptoom

Zoeken-en-vervangen in de documenteditor telt veel meer treffers dan dezelfde zoekterm in een tekstverwerker. Concreet gemeld: "Management Team" geeft in MS Word 7 treffers, in OciDeck 57.

Oorzaak

findAllMatches (lib/utils/text_search.dart) doet een kale substring-scan over de ruwe Markdown-bron (_controller.text, de body). De FindReplaceSession (lib/widgets/editors/find_replace_session.dart) en MarkdownFindBar tonen die telling ongefilterd.

De bron bevat de zoekterm ook op plekken die niet als tekst renderen:

  • link- en afbeeldingsyntax: [Management Team](Management Team.md) telt 2x (label én doel), ![Management Team](…) telt de alt-tekst mee;
  • HTML-comments <!-- … --> (o.a. <!-- toc -->, notities, <!-- skip -->-constructies);
  • fenced code blocks, o.a. chart- en mermaid-specificaties met labels;
  • voetnootdefinities en inline [^label]-verwijzingen;
  • eventueel front-matter-achtige blokken die midden in de body staan.

Een document dat de term zichtbaar 7 keer gebruikt maar daarnaast in links, comments of een grafiekspec, komt zo op tientallen "treffers". Word telt alleen de gerenderde tekst.

Erger dan de telling: vervangen corrupteert stilletjes

replaceAll/replaceCurrent herschrijven alle treffers, dus ook:

  • [Management Team](Management Team.md) → [Executive Team](Executive Team.md) — de link wijst daarna naar een bestand dat niet zo heet: stil gebroken;
  • een chart-spec die Management Team als datalabel gebruikt wordt herschreven terwijl de gebruiker alleen lopende tekst bedoelde;
  • comments/notities worden mee-vervangen zonder dat de gebruiker ze ooit zag.

Reproductie

  1. Nieuw document, body: `Management Team komt bijeen.

[Management Team](Management Team.md)

`
  1. Ctrl/Cmd+F, zoek Management Team.
  2. Verwacht (gerenderde tekst): 1 treffer. Werkelijk: 4 — en "Alles vervangen" breekt de link.

Oplossingsrichting

Tel en vervang alleen in proza, niet in markdown-machineonderdelen:

  • Maskeer vóór het zoeken de niet-tekst-regio's (fenced code, HTML-comments, link/afbeeldings-doelen, embed-specs) en mapt offsets terug naar de bron. Er bestaat precedent: protectTimelines in lib/utils/document_timeline.dart maskeert beschermde regio's voor de converters, en computeDocumentStats (lib/utils/document_stats.dart) slaat fenced code al over.
  • Alternatief/minimum: laat de telling op de bron staan maar voeg een "hele woorden"- en "ook in code/links"-schakelaar toe, zodat de gebruiker het verschil zelf kan sturen.
  • In elk geval: replaceAll mag nooit stil een link-target of codeblok herschrijven — dat is dataverlies in het klein.

Dezelfde sessie deelt de zoekbalk met de presentatie-broneditor (markdown_deck_editor.dart); daar telt hij bovendien sprekersnotities mee die nooit renderen — dezelfde fix dekt dat.

## Symptoom Zoeken-en-vervangen in de documenteditor telt veel meer treffers dan dezelfde zoekterm in een tekstverwerker. Concreet gemeld: "Management Team" geeft in MS Word 7 treffers, in OciDeck 57. ## Oorzaak `findAllMatches` (`lib/utils/text_search.dart`) doet een kale substring-scan over de **ruwe Markdown-bron** (`_controller.text`, de body). De `FindReplaceSession` (`lib/widgets/editors/find_replace_session.dart`) en `MarkdownFindBar` tonen die telling ongefilterd. De bron bevat de zoekterm ook op plekken die niet als tekst renderen: - link- en afbeeldingsyntax: `[Management Team](Management Team.md)` telt **2x** (label én doel), `![Management Team](…)` telt de alt-tekst mee; - HTML-comments `<!-- … -->` (o.a. `<!-- toc -->`, notities, `<!-- skip -->`-constructies); - fenced code blocks, o.a. ```chart```- en ```mermaid```-specificaties met labels; - voetnootdefinities en inline `[^label]`-verwijzingen; - eventueel front-matter-achtige blokken die midden in de body staan. Een document dat de term zichtbaar 7 keer gebruikt maar daarnaast in links, comments of een grafiekspec, komt zo op tientallen "treffers". Word telt alleen de gerenderde tekst. ## Erger dan de telling: vervangen corrupteert stilletjes `replaceAll`/`replaceCurrent` herschrijven **alle** treffers, dus ook: - `[Management Team](Management Team.md)` → `[Executive Team](Executive Team.md)` — de link wijst daarna naar een bestand dat niet zo heet: **stil gebroken**; - een chart-spec die `Management Team` als datalabel gebruikt wordt herschreven terwijl de gebruiker alleen lopende tekst bedoelde; - comments/notities worden mee-vervangen zonder dat de gebruiker ze ooit zag. ## Reproductie 1. Nieuw document, body: `Management Team komt bijeen. [Management Team](Management Team.md) <!-- Management Team overlegt maandag. -->` 2. Ctrl/Cmd+F, zoek `Management Team`. 3. Verwacht (gerenderde tekst): 1 treffer. Werkelijk: 4 — en "Alles vervangen" breekt de link. ## Oplossingsrichting Tel en vervang alleen in proza, niet in markdown-machineonderdelen: - Maskeer vóór het zoeken de niet-tekst-regio's (fenced code, HTML-comments, link/afbeeldings-doelen, embed-specs) en mapt offsets terug naar de bron. Er bestaat precedent: `protectTimelines` in `lib/utils/document_timeline.dart` maskeert beschermde regio's voor de converters, en `computeDocumentStats` (`lib/utils/document_stats.dart`) slaat fenced code al over. - Alternatief/minimum: laat de telling op de bron staan maar voeg een "hele woorden"- en "ook in code/links"-schakelaar toe, zodat de gebruiker het verschil zelf kan sturen. - In elk geval: `replaceAll` mag nooit stil een link-target of codeblok herschrijven — dat is dataverlies in het klein. Dezelfde sessie deelt de zoekbalk met de presentatie-broneditor (`markdown_deck_editor.dart`); daar telt hij bovendien sprekersnotities mee die nooit renderen — dezelfde fix dekt dat.
brenno 2026-09-20 23:36:23 +00:00
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#2137
No description provided.