Takenlijst verliest vakjes bij plakken en krijgt extra regels bij opslaan #2398

Closed
opened 2026-10-12 11:52:58 +00:00 by brenno · 2 comments
Owner

Wat er misgaat

Twee verschijnselen, vermoedelijk één oorzaak.

  1. Een takenlijst met vakjes (- [ ]) knippen met Ctrl+X en plakken met Ctrl+V maakt de vakjes weg en trekt alles op één regel.
  2. Bij opslaan worden opsommingstekens soms verdubbeld. Bij een vakje verschijnt dan een extra regel - [ ].

Wat de code nu doet

De lezer begrijpt een GFM-takenlijst. _listItem in lib/widgets/reader/parts/document_markdown_blocks.dart haalt [ ] / [x] van de itemtekst en tekent een vakje. In de bronmodus zet MarkdownEditorActions.insertTask het voorvoegsel - [ ] .

De visuele editor niet. MarkdownQuillCodec (lib/utils/markdown_quill_codec.dart) heeft embeds voor tabellen, voetnoten, mermaid en lijstblokken, maar geen takenlijst. De Quill-balk zet showListCheck uit (lib/widgets/markdown_editor/wysiwyg_notes_toolbar.dart). Een vakje is in die laag dus gewone lijsttekst of een bolletje, niet een eigen kenmerk dat de terugweg weer als - [ ] schrijft.

Plakken in het document gaat niet door Quill heen. _smartPaste (lib/widgets/parts/document_editor_layouts.dart) leest platte tekst én HTML en laat resolveClipboardMarkdown kiezen. HTML wint van platte tekst zodra er HTML op het klembord staat (lib/utils/clipboard_markdown.dart). html_to_markdown.dart schrijft een lijstitem als - plus de kinderen (_convertListItem) en kent geen checkbox: een <input> verdwijnt. Staan de items in de HTML niet als aparte <li>’s, dan wordt het één regel. De platte tekst had de vakjes en de regeleinden nog kunnen hebben; die wordt dan niet gebruikt.

Opslaan vanuit Visueel overschrijft het bestand niet met de Quill-rondgang. _patchVisualSave (lib/widgets/shell/document_save_actions.dart, #1613) rekent een baseline (rondgang zónder bewerking) en plakt het verschil op de oorspronkelijke bron (patchVisualEdits in lib/utils/source_patcher.dart), per regel. Wijkt de rondgang van - [ ] punt af van de regel op schijf — bolletje zonder vakje, of het vakje op een eigen regel — dan is dat verschil een “bewerking”. De patcher voegt hem toe. Dat is precies een extra - [ ] of een verdubbeld punt, terwijl de gebruiker alleen heeft opgeslagen of een ander stuk heeft aangeraakt.

Oplossingsrichting

Eén rondgang voor GFM-takenlijsten, en de plak- en opslagpaden die daarop leunen.

  • De codec moet - [ ] en - [x] heen en terug halen zonder er een regel bij te maken en zonder het vakje tot losse tekst te maken. Een vinkje in de visuele stand schrijft [x] terug; een leeg vakje schrijft [ ]. Geen nieuw dialect: het blijft gewone GFM.
  • Plakken: is de platte tekst al een takenlijst of een opsomming met een regel per punt, gebruik die. HTML alleen waar die de structuur écht bewaart, inclusief een checkbox (<input type="checkbox"> wordt - [ ] of - [x], niet een bolletje en niet niets). Nooit beide achter elkaar invoegen.
  • De opslagpatcher mag een regel die alleen door de rondgang van vorm veranderde (vakje wel of niet, zelfde woorden) niet als invoeging zien. De duurzame reparatie is de rondgang gelijk trekken, zodat baseline en bron dezelfde takenregels zijn; de patcher is het vangnet, niet de parser.
  • Bronmodus en de lezer doen dit al. De regressie zit in Visueel, het klembord en de opslagpatcher. Een presentatie-notitie die dezelfde codec gebruikt hoort in dezelfde test mee.

Bestandsformaat

Geen. - [ ] / - [x] is bestaande GFM. Opslaan mag daar geen regel aan toevoegen en geen vakje van maken tot een gewoon bolletje.

Test

Eerst rood, dan de reparatie.

  • Rondgang: een document met - [ ] open en - [x] klaar, genest en met een gewone - eronder, komt uit markdownFromDocument(documentFromMarkdown(...)) met dezelfde vakjes en hetzelfde aantal regels.
  • Plakken: knippen en plakken van die lijst in de visuele stand levert dezelfde lijst, niet één regel en niet zonder vakjes. HTML met checkbox-inputs en platte tekst met - [ ] allebei.
  • Opslaan: één woord wijzigen buiten de lijst en opslaan laat de takenlijst byte-gelijk (geen extra - [ ], geen tweede bolletje). Dekken met patchVisualEdits én met het pad van _patchVisualSave.

Kosten

Geen nieuwe interfacetekst als de vakjes blijven wat ze zijn. Een zin in de handleiding alleen als het gedrag naar buiten toe anders wordt uitgelegd. Geen afhankelijkheid, geen formaatwijziging.

## Wat er misgaat Twee verschijnselen, vermoedelijk één oorzaak. 1. Een takenlijst met vakjes (`- [ ]`) knippen met Ctrl+X en plakken met Ctrl+V maakt de vakjes weg en trekt alles op één regel. 2. Bij opslaan worden opsommingstekens soms verdubbeld. Bij een vakje verschijnt dan een extra regel `- [ ]`. ## Wat de code nu doet De lezer begrijpt een GFM-takenlijst. `_listItem` in `lib/widgets/reader/parts/document_markdown_blocks.dart` haalt `[ ]` / `[x]` van de itemtekst en tekent een vakje. In de bronmodus zet `MarkdownEditorActions.insertTask` het voorvoegsel `- [ ] `. De visuele editor niet. `MarkdownQuillCodec` (`lib/utils/markdown_quill_codec.dart`) heeft embeds voor tabellen, voetnoten, mermaid en lijstblokken, maar geen takenlijst. De Quill-balk zet `showListCheck` uit (`lib/widgets/markdown_editor/wysiwyg_notes_toolbar.dart`). Een vakje is in die laag dus gewone lijsttekst of een bolletje, niet een eigen kenmerk dat de terugweg weer als `- [ ]` schrijft. Plakken in het document gaat niet door Quill heen. `_smartPaste` (`lib/widgets/parts/document_editor_layouts.dart`) leest platte tekst én HTML en laat `resolveClipboardMarkdown` kiezen. HTML wint van platte tekst zodra er HTML op het klembord staat (`lib/utils/clipboard_markdown.dart`). `html_to_markdown.dart` schrijft een lijstitem als `- ` plus de kinderen (`_convertListItem`) en kent geen checkbox: een `<input>` verdwijnt. Staan de items in de HTML niet als aparte `<li>`’s, dan wordt het één regel. De platte tekst had de vakjes en de regeleinden nog kunnen hebben; die wordt dan niet gebruikt. Opslaan vanuit Visueel overschrijft het bestand niet met de Quill-rondgang. `_patchVisualSave` (`lib/widgets/shell/document_save_actions.dart`, #1613) rekent een baseline (rondgang zónder bewerking) en plakt het verschil op de oorspronkelijke bron (`patchVisualEdits` in `lib/utils/source_patcher.dart`), per regel. Wijkt de rondgang van `- [ ] punt` af van de regel op schijf — bolletje zonder vakje, of het vakje op een eigen regel — dan is dat verschil een “bewerking”. De patcher voegt hem toe. Dat is precies een extra `- [ ]` of een verdubbeld punt, terwijl de gebruiker alleen heeft opgeslagen of een ander stuk heeft aangeraakt. ## Oplossingsrichting Eén rondgang voor GFM-takenlijsten, en de plak- en opslagpaden die daarop leunen. - De codec moet `- [ ]` en `- [x]` heen en terug halen zonder er een regel bij te maken en zonder het vakje tot losse tekst te maken. Een vinkje in de visuele stand schrijft `[x]` terug; een leeg vakje schrijft `[ ]`. Geen nieuw dialect: het blijft gewone GFM. - Plakken: is de platte tekst al een takenlijst of een opsomming met een regel per punt, gebruik die. HTML alleen waar die de structuur écht bewaart, inclusief een checkbox (`<input type="checkbox">` wordt `- [ ]` of `- [x]`, niet een bolletje en niet niets). Nooit beide achter elkaar invoegen. - De opslagpatcher mag een regel die alleen door de rondgang van vorm veranderde (vakje wel of niet, zelfde woorden) niet als invoeging zien. De duurzame reparatie is de rondgang gelijk trekken, zodat baseline en bron dezelfde takenregels zijn; de patcher is het vangnet, niet de parser. - Bronmodus en de lezer doen dit al. De regressie zit in Visueel, het klembord en de opslagpatcher. Een presentatie-notitie die dezelfde codec gebruikt hoort in dezelfde test mee. ## Bestandsformaat Geen. `- [ ]` / `- [x]` is bestaande GFM. Opslaan mag daar geen regel aan toevoegen en geen vakje van maken tot een gewoon bolletje. ## Test Eerst rood, dan de reparatie. - Rondgang: een document met `- [ ] open` en `- [x] klaar`, genest en met een gewone `- ` eronder, komt uit `markdownFromDocument(documentFromMarkdown(...))` met dezelfde vakjes en hetzelfde aantal regels. - Plakken: knippen en plakken van die lijst in de visuele stand levert dezelfde lijst, niet één regel en niet zonder vakjes. HTML met checkbox-inputs en platte tekst met `- [ ]` allebei. - Opslaan: één woord wijzigen buiten de lijst en opslaan laat de takenlijst byte-gelijk (geen extra `- [ ]`, geen tweede bolletje). Dekken met `patchVisualEdits` én met het pad van `_patchVisualSave`. ## Kosten Geen nieuwe interfacetekst als de vakjes blijven wat ze zijn. Een zin in de handleiding alleen als het gedrag naar buiten toe anders wordt uitgelegd. Geen afhankelijkheid, geen formaatwijziging.
Author
Owner

Opgepakt. Tak: fix/document-werkvloer. Verwachte reikwijdte: lib/utils/markdown_quill_codec.dart, lib/utils/html_to_markdown.dart, lib/utils/clipboard_markdown.dart, lib/utils/source_patcher.dart, lib/widgets/shell/document_save_actions.dart.

Opgepakt. Tak: fix/document-werkvloer. Verwachte reikwijdte: lib/utils/markdown_quill_codec.dart, lib/utils/html_to_markdown.dart, lib/utils/clipboard_markdown.dart, lib/utils/source_patcher.dart, lib/widgets/shell/document_save_actions.dart.
Author
Owner

Geland op main in 597353b59, via PR #2401.

ZAP/DAST is niet gedraaid: ZAP is niet geïnstalleerd. Geheimen-scan en SAST zijn lokaal wel gedraaid, vóór de merge.

Geland op main in 597353b59, via PR #2401. ZAP/DAST is niet gedraaid: ZAP is niet geïnstalleerd. Geheimen-scan en SAST zijn lokaal wel gedraaid, vóór de merge.
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#2398
No description provided.