Opslaan vanuit Visueel dupliceert frontmatter in de body (theme:/--- lekken als tekst en kop) #2142
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#2142
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptoom
Opslaan vanuit de visuele stand op een document met frontmatter (een gekozen stijl, TLP of documentvelden) corrupt de bron: de frontmatter-regels worden gedupliceerd ín de body. Zichtbaar als:
theme: rvsverschijnt als tekst/kop in het document en een gewone tekstregel wordt door een losse---eronder als (setext-)kop weergegeven. De corruptie wordt op schijf geschreven én vianotifier.replaceSourceterug in de editor getrokken — vandaar dat het "opeens bij Opslaan" optreedt.Oorzaak
saveDocumentWithDestination→_patchVisualSave(lib/widgets/shell/document_save_actions.dart:126):De baseline wordt berekend over de hele
savedSourceinclusief het frontmatter-blok, maarcurrent(=document.source) isfrontMatter + roundTrip(body)— de frontmatter is daar intact. De codec kent geen YAML-frontmatter:theme: rvs\n---parseert als setext-kop, dus de baseline vermangelt het blok tot---\n\n\n## theme: rvs\n…. De regel-diff tussen die vermangelde baseline en de intactecurrentziet het frontmatter-verschil als een gebruikersbewerking, en_applyEdits(lib/utils/source_patcher.dart) plant detheme:- en----regels op een afgeleide plek midden in de body.Reproductie (bewezen met de pure functies)
levert:
Voorwaarde:
state.visualEdited == true— dus alleen bij documenten die in Visueel bewerkt zijn én frontmatter dragen. Precies de combinatie "document met gekozen stijl, getypt, opgeslagen".Oplossingsrichting
Splits de frontmatter buiten de patch:
savedSplit.body, niet over de hele bron — dat is ook exact wat de editor in_controller.texthad.currSplit.block(de huidige frontmatter) terug in het resultaat, nietsavedSplit.block: zo overleeft een tussentijdse stijl-/TLP-wijziging de opslag.savedSourceencurrentSourcestrippen vóór de diff en achteraf weer voorplakken — zelfde idee, minder netjes.theme:-frontmatter + één visuele aanslag → opgeslagen bron begint met ongewijzigd frontmatter, bevat geen tweedetheme:-regel in de body, en bevat de bewerking. Dezelfde testvariant voortlp:/vrije velden, en voor "visueel bewerkt maar géén frontmatter" (moet ongewijzigd blijven werken).