notation: Faltmarke rückt hinter die Statusbox (D34-Nachtrag 2)

`- > [x] Backend` wird zu `- [x] > Backend`. Die alte Stellung verschob die
Statusbox um genau eine Einrückungsstufe — die Box einer gefalteten Zeile
stand damit in der Spalte der Boxen ihrer eigenen Kinder. Vor dem Label
kostet die Verschiebung nichts, weil Labels ohnehin ausgefranst sind.

Nebengewinn: Die Regel wird einfacher. Statt „zwischen Zeichen und Statusbox,
bei Wurzelknoten am Zeilenanfang" heißt sie jetzt ausnahmslos „unmittelbar
vor dem Label"; für Zeilen ohne Statusbox ändert sich nichts.

Die alte Stellung wird weiter gelesen (Pads und ?sourceUrl=-Quellen lassen
sich nicht migrieren), aber nie mehr geschrieben — setFoldMark() löst sie in
die neue auf. SPEC §1 hält zusätzlich fest, dass `<` gelesen, aber nie
erzeugt wird.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-23 10:04:16 +02:00
co-authored by Claude Fable 5
parent 321bdc9dfa
commit be729239ce
9 changed files with 183 additions and 60 deletions
+64 -1
View File
@@ -1958,6 +1958,10 @@ Kollision, wegen der D29 `*` verwarf — Markdown-Betonung). Wurzelknoten haben
kein Gate — dort steht die Marke am Zeilenanfang; Wurzeln sind selten, und
die Regel „hinter dem Zeichen“ bleibt trotzdem einheitlich formulierbar.
*(Der Satz „die Statusbox trägt keine Ausrichtungs-Information“ ist falsch —
sie trägt sie sehr wohl. Korrigiert in Nachtrag 2 am Ende dieses Eintrags;
die Stellung ist jetzt hinter der Statusbox.)*
**Export und Druck folgen der sichtbar eingeklappten Struktur — mit
Kennzeichnung.** Der Präzedenzfall steht in §9: „Es wird genau die sichtbare
Struktur exportiert (der verworfene einblenden-Filter wirkt auch hier).“
@@ -2008,6 +2012,65 @@ Zwei bewusste Verhaltensänderungen, beide dokumentiert (§11): `---` ergab
bisher einen Knoten mit Label `--`, und eine zeichenlose Zeile, die mit
`" ` beginnt, war bisher ein Wurzelknoten mit `"`-Label.
**Nachtrag 2 — die Faltmarke rückt hinter die Statusbox: `- [x] > Backend`.**
Der erste Nachtrag oben stellte sie zwischen Zeichen und Box und begründete
das damit, dass sich dabei „nur die Statusbox verschiebt, und die trägt keine
Ausrichtungs-Information“. **Dieser Satz ist falsch**, und der Fehler war im
Text nicht zu sehen, sondern erst im gefalteten Plan: Die Marke ist zwei
Zeichen breit — genau eine Einrückungsstufe. Die Box einer gefalteten Zeile
rückt dadurch exakt in die Spalte der Boxen ihrer **eigenen Kinder**:
```
- > [ ] erster Schritt %% Box bei Spalte 6
- [ ] Schritt 1a %% Box bei Spalte 6 ← dieselbe Spalte
```
Die Box-Spalte ist damit sehr wohl Ausrichtungs-Information: Sie ist die
zweite Spalte, an der das Auge die Ebene abliest, und der Fehler tritt
ausgerechnet dort auf, wo man ohnehin schon weniger sieht — an einem
eingeklappten Knoten, dessen Kinder gerade verborgen sind. Hinter der Box
steht die Marke dagegen vor dem **Label**, und Labels sind ohnehin ausgefranst
(unterschiedlich lange IDs, Größen, Tags) — dort kostet eine Verschiebung
nichts:
```
- [ ] > erster Schritt
- [ ] Schritt 1a
```
**Die Begründung des ersten Nachtrags bleibt im Übrigen gültig:** Die
Gate-Spalte ist der wichtigste Anker, `>` davor (`> - [x] …`) bliebe falsch,
und die Markdown-Blockquote-Kollision am Zeilenanfang ebenfalls. Die neue
Stellung greift keines der beiden an — sie verschiebt die Marke nur um eine
Position weiter nach rechts.
**Nebengewinn: Die Regel wird einfacher, nicht komplizierter.** Bisher hieß
sie „zwischen Zeichen und Statusbox, bei Wurzelknoten am Zeilenanfang“ — mit
einer Ausnahme für Wurzeln. Jetzt heißt sie **„unmittelbar vor dem Label“**,
und das gilt ohne Ausnahme: Fehlt die Statusbox, rückt die Marke von selbst an
deren Stelle; fehlen Box und Zeichen (Wurzelknoten), steht sie am
Zeilenanfang. Für Zeilen **ohne** Statusbox ändert sich dadurch gar nichts.
**Die alte Stellung wird weiter gelesen, aber nie mehr geschrieben.** Ein
harter Schnitt wäre vertretbar gewesen — die Faltmarken sind wenige Wochen alt
—, aber er träfe genau die Dokumente, die wir **nicht** migrieren können:
Pads (D31) und `?sourceUrl=`-Quellen (D23) liegen auf fremden Servern. Der
Parser hat deshalb zwei Marken-Gruppen (die erste gewinnt), `setFoldMark()`
schreibt immer die neue und löst eine alte dabei auf. Die Toleranz kostet eine
optionale Gruppe im Regex und eine Zeile in der SPEC; die Zeile *muss* dort
stehen, sonst ist die alte Schreibweise stillschweigend geduldete Magie statt
dokumentiertes Verhalten.
**Der Preis, benannt:** Die Marke steht jetzt direkt vor dem Label, also dort,
wo ein Label anfangen kann. Ein Label wie `> 100 Nutzer` wird zur Marke plus
`100 Nutzer`. Neu ist das nicht — für Zeilen ohne Statusbox galt es schon
immer —, aber es ist jetzt der Regelfall statt der Ausnahme. Der Ausweg ist
derselbe wie bei `=SUMME(A1:B2)` (D34): kein Leerzeichen, also `>100 Nutzer`.
Migriert sind die drei Marken in `docs/examples/werkbaum.werkbaum`, die eine
im `INITIAL`-Beispiel und das Beispiel in `llms.md`; die Legenden-Zeile
`hint_fold` nennt die neue Form in allen neun Sprachen.
## D35 — XOR (`=`) umgesetzt: „realisiert“ definiert, „1“-Plakette, keine neue Linienart
Das in D34 entschiedene XOR-Gate ist gebaut (SPEC §1/§3/§9); beim Bauen waren
drei Dinge zu entscheiden, die die SPEC bis dahin offen ließ:
@@ -2169,7 +2232,7 @@ Darstellung, bis die Querverbindungen (§11) gebaut sind; der Pfeil im Tooltip
sagt die Richtung („hängt ab von“), ohne ein neues Zeichen einzuführen.
## D38 — Faltmarken gebaut: `<` wandert die Faltung hinunter, Eingriffe sind flüchtig
Die in D34 entschiedene Schreibweise (`- > [x] …`, Export folgt der Faltung)
Die in D34 entschiedene Schreibweise (`- [x] > …`, Export folgt der Faltung)
ist umgesetzt (SPEC §1/§9). Die Bau-Entscheidungen:
**`<` holt seinen Teilbaum hervor, indem die Faltung die Pfad-Ebenen
+26 -9
View File
@@ -7,15 +7,15 @@ Syntaxänderungen werden zuerst hier dokumentiert, dann implementiert.
## 1. Zeilenformat
```
[Einrückung][Zeichen] [Faltmarke] [Statusbox] Label (Größe) URL @tag … !!! %% Kommentar
[Einrückung][Zeichen] [Statusbox] [Faltmarke] Label (Größe) URL @tag … !!! %% Kommentar
```
Alle Bestandteile außer dem Label sind optional. Die Extraktion erfolgt in
dieser Reihenfolge (wichtig für Kollisionsfreiheit):
1. Kommentar entfernen: alles ab `%%` bis Zeilenende.
2. Einrückung, Zeichen (`-` / `+` / `|` / `=`), Faltmarke (`>` / `<`) und
Statusbox `[…]` per Zeilen-Regex; `=` nur mit folgendem Leerraum (§3),
2. Einrückung, Zeichen (`-` / `+` / `|` / `=`), Statusbox `[…]` und Faltmarke
(`>` / `<`) per Zeilen-Regex; `=` nur mit folgendem Leerraum (§3),
die Faltmarke ebenso (siehe unten).
3. URL: erstes Token, das auf `https?://\S+` passt (dadurch stören `@` in URLs nicht).
4. Größe: erstes `(XS|S|M|L|XL|XXL)`, Groß-/Kleinschreibung egal.
@@ -27,13 +27,22 @@ dieser Reihenfolge (wichtig für Kollisionsfreiheit):
**Faltmarke `>` / `<`** — bestimmt, wie das Dokument **eröffnet** wird:
- Steht **zwischen** Zerlegungszeichen und Statusbox (`- > [x] Backend`); bei
Wurzelknoten (ohne Zeichen) am Zeilenanfang. Erkannt nur mit **folgendem
Leerraum** — `- >Achtung` bleibt damit ein Label. Begründung der Stellung:
D34-Nachtrag.
- Steht **unmittelbar vor dem Label**, also hinter der Statusbox
(`- [x] > Backend`); ohne Statusbox rückt sie an deren Stelle
(`- > Backend`, bei Wurzelknoten an den Zeilenanfang). Erkannt nur mit
**folgendem Leerraum**`- [x] >Achtung` bleibt damit ein Label. Die
Stellung hält die Spalte der Statusboxen über die Ebenen hinweg bündig;
Begründung: D34-Nachtrag 2.
- Die frühere Stellung **zwischen Zeichen und Statusbox** (`- > [x] Backend`)
wird weiterhin **gelesen**, aber nie mehr geschrieben: Beim Zurückschreiben
(§9) wird sie in die neue aufgelöst. Stehen beide, gilt die erste.
- `>` heißt: der Teilbaum dieses Knotens ist beim Öffnen **eingeklappt**.
- `<` innerhalb eines eingeklappten Bereichs holt den **eigenen Teilbaum**
gezielt wieder hervor (Mechanik: §9).
gezielt wieder hervor (Mechanik: §9). Es ist eine **Schreibhilfe für
Autoren**: gelesen wird es unverändert, erzeugt wird es nie — das
Zurückschreiben (§9) setzt ausschließlich `>`. Ein von Hand gesetztes `<`
bleibt stehen, solange es den Zustand noch richtig beschreibt, und wird
aufgelöst, sobald alle Marken neu gesetzt werden.
- Die Marken beschreiben den **Faltzustand des Dokuments**: Beim Öffnen stellen
sie ihn her, und Umklappen im Diagramm schreibt sie zurück (§9) — Text und
Bild sagen dasselbe. Sie sagen nichts über Fortschritt (§4) oder
@@ -138,7 +147,15 @@ Text zu einem Knoten (Anzeige: §9):
Referenz-Regex der Implementierung:
```
^([ \t]*)([-|+]|=(?=[ \t]))?\s*(?:([><])(?=[ \t])\s*)?(?:\[([ ?~xX^/-])\]\s*)?(.*)$
^([ \t]*)([-|+]|=(?=[ \t]))?\s*(?:([><])(?=[ \t])\s*)?(?:\[([ ?~xX^/-])\]\s*)?(?:([><])(?=[ \t])\s*)?(.*)$
```
Die **zweite** Faltmarken-Gruppe ist die gültige Stellung, die erste die
weiterhin gelesene alte (siehe oben). Umkehrung fürs Zurückschreiben (§9) —
sie setzt die Marke immer in die zweite Stellung und löst die erste dabei auf:
```
^([ \t]*(?:[-|+]|=(?=[ \t]))?[ \t]*)(?:[><](?=[ \t])[ \t]*)?((?:\[[^\]]\][ \t]*)?)(?:[><](?=[ \t])[ \t]*)?
```
Für die Knoten-ID (Schritt 6, nur der erste Treffer; die letzte Gruppe ist der
+3 -3
View File
@@ -101,7 +101,7 @@
| [?] Ask the admin for cookie.sameSite = None (XS)
| [ ] Live with it: edit in the pad's own tab (XS)
- [^] A shared pointer: !!! focuses a node for everyone (XS)
- > [?] Update by itself, within about 2 s (M)
- [?] > Update by itself, within about 2 s (M)
| [?] Our own Etherpad beside Werkbaum (M) %% then every setting below is ours
- [ ] Node and a real database in userland (S) %% the flatfile store is not for production
- [ ] Book the RAM quota for an own daemon (XS)
@@ -141,7 +141,7 @@
- [?] Registration with Mermaid (M)
| [?] External diagram, self-hosted pages only (M)
| [?] Pull request into Mermaid itself (L)
- > [?] IntelliJ IDEA plugin (XL)
- [?] > IntelliJ IDEA plugin (XL)
- [?] Show the diagram in the IDE (L)
| [?] Through Mermaid, once Werkbaum is part of Mermaid itself (M)
- [?] Fenced werkbaum blocks render in Markdown (S)
@@ -157,7 +157,7 @@
- [?] Completion for status, size and tags (S)
- [?] Structure view and folding (S)
- [?] Kotlin with the Gradle IntelliJ plugin (S)
- < [!] A second parser that must not drift from the SPEC (M) %% exactly what D14 warns about
- [!] < A second parser that must not drift from the SPEC (M) %% exactly what D14 warns about
| [?] Both parsers test against the same fixtures (S)
| [?] Run the one JS parser inside the IDE (M)
- [?] Tracker integration (XL) %% exactly one of these, hence =