Documentmodus: platte terugval in de visuele stand wordt ten onrechte als Quill-bewerking opgeslagen #1649

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

Probleem

De visuele stand valt bij niet-rondreisbare Markdown bewust terug op de platte broneditor. Wijzigingen in die terugval worden toch als visualEdit gemarkeerd, alleen omdat de geselecteerde modus visual is. Opslaan stuurt daardoor byte-getrouwe bronbewerkingen onnodig door de Quill-baseline en source patcher, met risico op normalisatie of verkeerde patches rond juist de constructies die Quill niet ondersteunt.

Reproductie

  1. Open een document dat de visuele terugval activeert, bijvoorbeeld met raw HTML of een andere niet-rondreisbare constructie.
  2. Bewerk de zichtbare platte Markdown terwijl de modus Visueel geselecteerd blijft.
  3. Sla op en vergelijk de bron.

Verwacht

Bewerkingen in de platte terugval gelden als bronbewerkingen en worden rechtstreeks byte-getrouw opgeslagen.

Technische aanwijzing

lib/widgets/document_editor_screen.dart:_onControllerChanged baseert visualEdit uitsluitend op _viewMode. De werkelijke keuze voor Quill versus bronterugval wordt bepaald door markdownRoundTripsVisually.

Gevonden bij audit van commit d439638c6b.

## Probleem De visuele stand valt bij niet-rondreisbare Markdown bewust terug op de platte broneditor. Wijzigingen in die terugval worden toch als visualEdit gemarkeerd, alleen omdat de geselecteerde modus visual is. Opslaan stuurt daardoor byte-getrouwe bronbewerkingen onnodig door de Quill-baseline en source patcher, met risico op normalisatie of verkeerde patches rond juist de constructies die Quill niet ondersteunt. ## Reproductie 1. Open een document dat de visuele terugval activeert, bijvoorbeeld met raw HTML of een andere niet-rondreisbare constructie. 2. Bewerk de zichtbare platte Markdown terwijl de modus Visueel geselecteerd blijft. 3. Sla op en vergelijk de bron. ## Verwacht Bewerkingen in de platte terugval gelden als bronbewerkingen en worden rechtstreeks byte-getrouw opgeslagen. ## Technische aanwijzing lib/widgets/document_editor_screen.dart:_onControllerChanged baseert visualEdit uitsluitend op _viewMode. De werkelijke keuze voor Quill versus bronterugval wordt bepaald door markdownRoundTripsVisually. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted

Bevestigd tegen main (e93ef205c). lib/widgets/document_editor_screen.dart zet visualEdit: _viewMode == _DocViewMode.visual. De werkelijke keuze tussen Quill en de platte terugval valt een laag lager, in MarkdownNotesEditor._effectiveMode (lib/widgets/markdown_editor/markdown_editor.dart): zodra markdownVisualLimitations niet leeg is, staat daar de bewerkbare brontekst, niet Quill.

Het scherm wisselt zelf ook om (_autoFallbackToSource), maar dat gebeurt in een post-frame-callback. De bewerking die de niet-rondreisbare constructie binnenbrengt, is dan al met visualEdit: true bij de notifier binnen. Wie op dat moment opslaat, stuurt byte-getrouwe brontekst door de Quill-baseline en de patcher — precies over de constructies die Quill niet aankan.

Oplossingsrichting

Zelfde voorspelling gebruiken als de editor:

visualEdit: _viewMode == _DocViewMode.visual && markdownRoundTripsVisually(body),

Dat is één uitdrukking en hij deelt de functie mét de terugval, dus ze kunnen niet meer uit elkaar lopen. Netter (en even goedkoop) is de editor laten mélden welk oppervlak de wijziging maakte — onDiscreteVisualEdit bestaat al als kanaal — zodat er één bron van waarheid is in plaats van twee aanroepers die hetzelfde raden.

Regressietest (verplicht)

test/document_editor_screen_test.dart: document met rauwe HTML, modus Visueel gevraagd, typen in de terugval → documentProvider.state.visualEdited == false, en de opslag landt byte-getrouw.

Kosten

Klein: één regel plus test. Wel eerst nagaan of er geen tweede aanroeper is die dezelfde aanname maakt.

Prioriteit

Middelhoog: smal venster, maar de schade is stille normalisatie van juist de fragiele constructies.

## Triage: accepted **Bevestigd tegen `main` (e93ef205c).** `lib/widgets/document_editor_screen.dart` zet `visualEdit: _viewMode == _DocViewMode.visual`. De werkelijke keuze tussen Quill en de platte terugval valt een laag lager, in `MarkdownNotesEditor._effectiveMode` (`lib/widgets/markdown_editor/markdown_editor.dart`): zodra `markdownVisualLimitations` niet leeg is, staat daar de bewerkbare brontekst, niet Quill. Het scherm wisselt zelf ook om (`_autoFallbackToSource`), maar dat gebeurt in een post-frame-callback. De bewerking die de niet-rondreisbare constructie binnenbrengt, is dan al met `visualEdit: true` bij de notifier binnen. Wie op dat moment opslaat, stuurt byte-getrouwe brontekst door de Quill-baseline en de patcher — precies over de constructies die Quill niet aankan. ## Oplossingsrichting Zelfde voorspelling gebruiken als de editor: ```dart visualEdit: _viewMode == _DocViewMode.visual && markdownRoundTripsVisually(body), ``` Dat is één uitdrukking en hij deelt de functie mét de terugval, dus ze kunnen niet meer uit elkaar lopen. Netter (en even goedkoop) is de editor laten mélden welk oppervlak de wijziging maakte — `onDiscreteVisualEdit` bestaat al als kanaal — zodat er één bron van waarheid is in plaats van twee aanroepers die hetzelfde raden. ## Regressietest (verplicht) `test/document_editor_screen_test.dart`: document met rauwe HTML, modus Visueel gevraagd, typen in de terugval → `documentProvider.state.visualEdited == false`, en de opslag landt byte-getrouw. ## Kosten Klein: één regel plus test. Wel eerst nagaan of er geen tweede aanroeper is die dezelfde aanname maakt. ## Prioriteit Middelhoog: smal venster, maar de schade is stille normalisatie van juist de fragiele constructies.
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#1649
No description provided.