feat: Umklappen im Diagramm schreibt die Faltmarke in den Text zurück
Erster Schritt der Schreibrichtung Diagramm -> Text. Damit ist der Text auch für
die Faltung die eine Quelle der Wahrheit (D14): Was man sieht, steht
geschrieben, und ein Neuladen stellt es wieder her. Kehrt die bisherige
Festlegung aus D34/D38 um („die Marken bestimmen nur den Anfangszustand").
Verfahren: minimal patchen, dann nachrechnen. Die Ableitung Text -> Zustand ist
nicht umkehrbar — mehrere Markensätze ergeben denselben Zustand, und `<` faltet
Knoten, die gar keine Marke tragen. Statt zu invertieren wird der Kandidat
befragt: `>` an die eine Zeile, initialCollapsed() darauf, mit dem Soll
vergleichen. Passt es, bleibt alles andere unangetastet — so überleben von Hand
gesetzte `<`. Passt es nicht, werden alle Marken neu gesetzt (das `<` löst sich
dabei auf). Passt auch das nicht (ein `!!!` holt seinen Knoten immer wieder
hervor), wird gar nicht geschrieben: Ein Text, der etwas anderes sagt als das
Bild, wäre schlimmer als eine fehlende Marke. initialCollapsed() bleibt die
einzige Stelle, die die Marken versteht.
Undo-fähig über execCommand('insertText') — gemessen: value= UND setRangeText
machen Strg+Z wirkungslos, wer tippt und dann faltet käme an sein Getipptes
nicht mehr heran. Falten ist damit ein eigener Undo-Schritt (geprüft: einmal
Strg+Z nimmt die Faltung, ein zweites das Getippte).
Zwei gemessene Fallen: Ein Textfeld mit display:none-Vorfahr nimmt kein
execCommand an (liefert false, obwohl activeElement es meldet) — auf Mobil ist
der Editor beim Falten genau das, deshalb schaltet ihn `writing-fold` für die
Dauer des synchronen Schreibens aus dem Bild heraus sichtbar. Und der nötige
Fokus zöge dort die Tastatur hoch, dagegen inputmode="none" wie beim Sprung
(D25); danach geht der Fokus an den Knoten zurück.
Bei schreibgeschütztem Text (Pad, D31) wird nicht geschrieben — dort trägt
weiter die Sitzungs-Überlagerung. Schreibmarke und Scrollstand bleiben erhalten.
Im Browser geprüft: `<` bleibt stehen, wenn es noch stimmt, und löst sich auf,
wenn nicht; Falten bei verborgenem Editor auf Mobil; Pad-Fall sitzungsweise;
Hin- und Herklappen führt zeichengenau zum Ausgangstext zurück.
7 neue Tests für setFoldMark (215 gesamt). SPEC §1/§9, D38 (Nachtrag 2) und
frontend/CLAUDE.md nachgezogen.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
38104a4c5d
commit
321bdc9dfa
+17
-1
@@ -311,7 +311,23 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der
|
||||
Pfad-Mitgliedschaft (ein per `:#…` gezogenes Ziel unter einem `+`-Knoten):
|
||||
Dann ist er der einzige sichtbare Griff darauf und zählt als `cheap`.
|
||||
`extraCls()` muss dieselbe Eingeklappt-Bedingung bilden wie `itemHtml`
|
||||
(nur mit sichtbaren Kindern). Umklappen: Klick aufs
|
||||
(nur mit sichtbaren Kindern).
|
||||
**Umklappen schreibt in den TEXT zurück** (`writeFoldToText`, D38-Nachtrag 2):
|
||||
Die Ableitung Text → Zustand ist nicht umkehrbar (mehrere Markensätze ergeben
|
||||
denselben Zustand; `<` faltet Knoten ohne eigene Marke), deshalb **minimal
|
||||
patchen und nachrechnen** — `setFoldMark()` auf die eine Zeile, dann
|
||||
`initialCollapsed()` auf dem Kandidaten gegen den Soll vergleichen; erst bei
|
||||
Abweichung alle Marken neu setzen; passt auch das nicht (z. B. `!!!` holt den
|
||||
Knoten immer hervor), gar nicht schreiben. Nie eine eigene Umkehrfunktion
|
||||
bauen — `initialCollapsed()` bleibt die einzige Stelle, die die Marken
|
||||
versteht. Geschrieben wird mit `execCommand('insertText')`: `value =` und
|
||||
`setRangeText` zerstören die Undo-Historie (gemessen). Zwei Fallen: Ein
|
||||
Textfeld mit `display:none`-Vorfahr nimmt **kein** `execCommand` an (Klasse
|
||||
`writing-fold` schaltet es kurz sichtbar), und der nötige Fokus zieht auf
|
||||
Mobil die Tastatur hoch (`keyboardOnJump(true)`). Bei `src.readOnly` (Pad,
|
||||
D31) wird nicht geschrieben, dort trägt weiter `foldOverrides` — die
|
||||
Überlagerungen werden nach erfolgreichem Schreiben geleert, sonst maskieren
|
||||
sie den Text. Umklappen: Klick aufs
|
||||
`.fold`-Zeichen (preventDefault — es sitzt bei Link-Knoten im `<a>`) oder
|
||||
←/→ am fokussierten Knoten; nach `render()` den Fokus per `data-line`
|
||||
wiederherstellen. Export/Druck: „▸ n" bleibt, das ▾ offener Knoten fällt weg
|
||||
|
||||
Reference in New Issue
Block a user