feat: Knoten-ID vor dem Titel mit optionalem Doppelpunkt; Alt+Klick pulst mit
Übliche Schreibweise ist jetzt `#auth: Backend` — die ID benennt den Knoten, der Titel erläutert sie; vorn hat sie eine feste Stelle, an der das Auge sie sucht. Der Doppelpunkt ist optional und reines Trennzeichen: Er gehört weder zur ID noch zum Label und fällt beim Parsen weg, sonst wären `#auth` und `#auth:` zwei verschiedene Adressen. Geschluckt wird er nur mit folgendem Leerraum oder Zeilenende (Leerraum-Regel wie bei `=`, `>`/`<`, `"`). Damit bleibt `#auth:#db` ID plus Abhängigkeit, und ein Doppelpunkt im Titel bleibt stehen. Die ID-Erkennung selbst ist unverändert — die Doppelpunkt-Gruppe ist optional; ein verlangtes `(?=\s|$)` hinter der ID hätte bestehende Zeilen umgedeutet. Der Block-Kopf im Beschreibungsteil nimmt den Doppelpunkt ebenfalls an. Alle mitgelieferten Beispiele umgestellt (docs/examples/, INITIAL, llms.md); SPEC §10 hat keine IDs. Legenden-Zeile hint_id in allen neun Sprachen. Dazu: Alt+Klick im Textfeld zeigt jetzt dieselbe Hervorhebung wie der Zeilenwechsel, Puls eingeschlossen — bisher unterdrückte focusNodeOfCaret() ihn, um doppeltes Scrollen zu vermeiden, und ausgerechnet die ausdrückliche Geste kam stiller an als das beiläufige Tippen. Getrennt über den neuen Parameter highlightCurrentNode(moved, scroll): 'nearest' | 'center' | false. 7 neue Parser-Tests (197 gesamt). SPEC §1, D36 (Nachtrag), D25 (Nachtrag 2) und llms.md nachgezogen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
099ee87bc1
commit
ad2f3bab14
@@ -710,6 +710,28 @@ Nebenbefund beim Aufräumen: Der Kommentar über der Regel behauptete noch, die
|
||||
Fokusmarke `!!!` trage „bewusst DIESELBE Hervorhebung" — überholt, seit der
|
||||
D32-Nachtrag ihr den eigenen Petrol-Kranz gegeben hat. Ersetzt.
|
||||
|
||||
**Nachtrag 2 — Alt+Klick im Textfeld pulst jetzt auch.** Die erste Fassung des
|
||||
Pulses hing an derselben Bedingung wie das Scrollen, und `focusNodeOfCaret()`
|
||||
gab dort bewusst `false` weiter, um ein doppeltes Scrollen zu vermeiden
|
||||
(erst `nearest`, dann `center`). Folge: Ausgerechnet die **ausdrückliche**
|
||||
Geste — „ich will diesen Knoten jetzt sehen" — kam stiller an als das
|
||||
beiläufige Tippen. Das ist verkehrt herum.
|
||||
|
||||
Getrennt sind die beiden Dinge jetzt sauber: `highlightCurrentNode(moved,
|
||||
scroll)` nimmt zusätzlich, **wie** ins Bild geholt wird — `'nearest'` beim
|
||||
gewöhnlichen Zeilenwechsel, `'center'` beim Alt+Klick, `false` beim Neubau.
|
||||
Die Hervorhebung ist in allen Fällen dieselbe, Puls eingeschlossen; der
|
||||
Unterschied liegt allein im Scroll-Modus. Der Fokus wandert weiter mit
|
||||
(D25-Nachtrag 1, `focus({preventScroll:true})` **vor** dem Scrollen) — er
|
||||
verändert das Bild nicht, weil `:focus-visible` nach einem Mausklick nicht
|
||||
greift (nachgemessen: `false`).
|
||||
|
||||
Der Fall, den man beim Bauen leicht übersieht: Alt+Klick trifft oft den Knoten,
|
||||
der **schon** die Cursor-Zeile ist. Dann ist es dasselbe DOM-Element, und der
|
||||
Puls muss trotzdem neu anlaufen — genau dafür steht das Lesen von
|
||||
`offsetWidth` zwischen Entfernen und Setzen der Klasse. Nachgemessen: vor dem
|
||||
Klick keine laufende Animation, 80 ms danach beide bei `currentTime ≈ 67 ms`.
|
||||
|
||||
## D26 — Legende scrollbar: eigener Container statt `<details>`, plus Splitter
|
||||
Die Legende („Agenda") im Editor-Panel war zu hoch für ihren Platz und wurde
|
||||
**abgeschnitten** statt scrollbar zu sein — obwohl `.hint` seit jeher
|
||||
@@ -1884,6 +1906,50 @@ Abhängigkeits-Auflösung — dort ist die Warnung dann schon da. Eine Zeile, di
|
||||
**nur** aus einer ID besteht, wird wie jede leere Zeile ignoriert und belegt
|
||||
die ID nicht.
|
||||
|
||||
**Nachtrag — die übliche Stellung ist vor dem Titel, mit trennendem
|
||||
Doppelpunkt: `#auth: Backend`.** Die Stellung war frei und blieb es auch; was
|
||||
fehlte, war eine **Konvention**. In den Beispielen stand die ID mal hinten
|
||||
(`Documents on the server #docs (L)`), mal irgendwo dazwischen — lesbar, aber
|
||||
ohne feste Stelle, an der das Auge sie sucht. Vorn ist sie dort, wo sie
|
||||
hingehört: Sie **benennt** den Knoten, und der Titel ist die Erläuterung dazu.
|
||||
Damit liest sich eine Zeile wie ein Wörterbucheintrag, und Zeilen mit ID
|
||||
richten sich untereinander aus.
|
||||
|
||||
**Der Doppelpunkt ist optional und reines Trennzeichen.** Ohne ihn stünden
|
||||
zwei Bezeichner unmittelbar nebeneinander (`#auth Backend`) — das liest sich
|
||||
wie ein zweiteiliger Name, nicht wie Adresse plus Titel. Er gehört weder zur
|
||||
ID noch zum Label und wird nie gerendert; im Diagramm steht genau wie bisher
|
||||
nur der Titel. Ein Werkzeug, das ihn als Teil der ID führte, machte aus
|
||||
`#auth` und `#auth:` zwei verschiedene Adressen — deshalb fällt er beim Parsen
|
||||
weg, nicht erst beim Anzeigen.
|
||||
|
||||
**Geschluckt wird er nur mit folgendem Leerraum oder Zeilenende** — dieselbe
|
||||
Leerraum-Regel wie bei `=`, `>`/`<` und `"` (D34), hier aber mit einem
|
||||
konkreten Grund: `#auth:#db` bliebe sonst nicht als ID plus Abhängigkeit
|
||||
erhalten. Mit der Regel liest der Parser dort `#auth` als ID, lässt den
|
||||
Doppelpunkt stehen, und die Abhängigkeits-Extraktion (§1, Schritt 7) findet
|
||||
`:#db` — genau wie ohne die Neuerung. Ein Doppelpunkt **im Titel** bleibt
|
||||
ebenfalls unangetastet: `#auth: Regel: nur mit Token` ergibt das Label
|
||||
„Regel: nur mit Token“, weil nur der **unmittelbar** an die ID anschließende
|
||||
Doppelpunkt gemeint ist.
|
||||
|
||||
**Die ID-Erkennung selbst ist unverändert geblieben** — die Doppelpunkt-Gruppe
|
||||
im Regex ist optional und verlangt nichts. Ein zusätzlich verlangtes
|
||||
`(?=\s|$)` **hinter der ID** wäre der naheliegende, aber falsche Weg gewesen:
|
||||
Es hätte bestehende Zeilen umgedeutet, weil der Ausdruck bei einem Fehlschlag
|
||||
weiterwandert und dann ein *späteres* `#`-Token zur ID erklärt hätte.
|
||||
|
||||
Im **Beschreibungsteil** (`---`, §1) ist ein angehängter Doppelpunkt ebenfalls
|
||||
zugelassen (`#auth:` als Block-Kopf). Dort folgt kein Titel, die Konvention
|
||||
greift also nicht — aber wer sie gewohnt ist, soll nicht über eine
|
||||
`descStray`-Warnung stolpern. Die mitgelieferten Beispiele schreiben
|
||||
Block-Köpfe weiterhin ohne Doppelpunkt.
|
||||
|
||||
Umgestellt sind alle mitgelieferten Beispiele (`docs/examples/`, das
|
||||
`INITIAL`-Dokument und das Beispiel in `llms.md`); SPEC §10 hat keine IDs und
|
||||
bleibt unberührt. Die Legenden-Zeile `hint_id` nennt die neue Form in allen
|
||||
neun Sprachen.
|
||||
|
||||
## D37 — Abhängigkeiten (`:#a,#b`) geparst: ein Token, alleinstehend, IDs als Strings
|
||||
Der zweite Baustein der Phase-4-Kette. Gebaut ist die **Schreibweise** (SPEC
|
||||
§1); die Konsumenten — effektiver Status, Querverbindungen, Closure-Rechnung —
|
||||
|
||||
+12
-3
@@ -51,6 +51,13 @@ sie ist die Adresse für Abhängigkeiten und Beschreibungsblöcke (§11).
|
||||
dem Muster des angebundenen Trackers entspricht (`#123`, `#US-123`), ist
|
||||
zugleich die künftige Ticket-Referenz — oft ist die Ticket-Kennung die
|
||||
natürliche Knoten-ID (D34).
|
||||
- **Übliche Schreibweise ist die ID vor dem Titel, mit Doppelpunkt:**
|
||||
`#auth: Backend`. Der Doppelpunkt ist **optional** und reines Trennzeichen im
|
||||
Text — er gehört weder zur ID noch zum Label und erscheint nicht im Diagramm.
|
||||
Geschluckt wird er nur, wenn er **unmittelbar** auf die ID folgt und ihm
|
||||
**Leerraum oder Zeilenende** folgt; ein Doppelpunkt im Label (`#auth: Regel:
|
||||
nur mit Token`) bleibt also stehen, und `#auth:#db` bleibt ID plus
|
||||
Abhängigkeit. Die Stellung ist frei — `Backend #auth` bedeutet dasselbe.
|
||||
- Die ID gehört **nicht** zum Label. Eine eigene Darstellung im Diagramm hat
|
||||
sie (noch) nicht; sichtbar ist sie im Knoten-Tooltip und im `aria-label`.
|
||||
- **Doppelte ID:** Warnung `duplicateId` mit beiden Zeilennummern; die spätere
|
||||
@@ -110,7 +117,8 @@ Text zu einem Knoten (Anzeige: §9):
|
||||
umgebender Leerraum erlaubt) trennt den Baumteil vom **Beschreibungsteil**;
|
||||
alles danach gehört zu ihm (YAML-/Frontmatter-Konvention). Es gibt keinen
|
||||
Schlusszaun — er kann also nicht vergessen werden. Dort eröffnet eine
|
||||
**uneingerückte Zeile mit genau einer Knoten-ID** (`#auth`, allein) einen
|
||||
**uneingerückte Zeile mit genau einer Knoten-ID** (`#auth`, allein — ein
|
||||
angehängter Doppelpunkt ist auch hier zugelassen) einen
|
||||
Block; die **eingerückten** Zeilen darunter sind sein Text (um den Einzug
|
||||
gekürzt, Leerzeilen bleiben als Absatztrenner). Die Wurzelknoten-Regel (§2)
|
||||
gilt hinter dem Trenner nicht mehr. Weitere `---`-Zeilen dort sind ohne
|
||||
@@ -132,10 +140,11 @@ Referenz-Regex der Implementierung:
|
||||
^([ \t]*)([-|+]|=(?=[ \t]))?\s*(?:([><])(?=[ \t])\s*)?(?:\[([ ?~xX^/-])\]\s*)?(.*)$
|
||||
```
|
||||
|
||||
Für die Knoten-ID (Schritt 6, nur der erste Treffer):
|
||||
Für die Knoten-ID (Schritt 6, nur der erste Treffer; die letzte Gruppe ist der
|
||||
optionale Trenn-Doppelpunkt, der mit entfällt):
|
||||
|
||||
```
|
||||
(^|\s)#([\p{L}\p{N}._-]+)
|
||||
(^|\s)#([\p{L}\p{N}._-]+)(?::(?=\s|$))?
|
||||
```
|
||||
|
||||
Für die Abhängigkeiten (Schritt 7, alle Treffer):
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
- [^] People tags, bare URLs, %% comments (XS)
|
||||
- [^] And/or decomposition (S)
|
||||
- [^] Optional nodes — neither required nor an alternative (S)
|
||||
- [^] Node IDs (#auth) (S) %% often just the ticket number, see SPEC §11
|
||||
- [^] Node IDs, (#auth:) before the title (S) %% often the ticket number, see SPEC §11
|
||||
+ [?] Free tags, &tag (M) %% only together with a consumer, see D34
|
||||
- [?] A lens: highlight every node tagged &x (S)
|
||||
- [^] Dependencies across the tree, (:#auth,#api) (M)
|
||||
@@ -40,7 +40,7 @@
|
||||
- [^] Cheapest path (M)
|
||||
- [^] Cost model, missing size counts as M (S)
|
||||
- [^] Metro-map line through the leaves (S)
|
||||
- [^] Count the whole dependency closure #closure (M)
|
||||
- [^] #closure: Count the whole dependency closure (M)
|
||||
- [^] Shared dependencies counted only once (S)
|
||||
- [^] The cheapest alternative is no longer the local one (M) %% see D34, D42
|
||||
| [^] Search exactly, the trees are small enough (M)
|
||||
@@ -78,10 +78,10 @@
|
||||
- [-] Deploy through a gh-pages branch (S) %% GitHub Actions instead
|
||||
- [-] Fonts from Google (XS) %% self-hosted, no third-party request
|
||||
- [ ] Backend (XL)
|
||||
- [ ] Kotlin and Spring Boot scaffold #scaffold (M)
|
||||
- [ ] #scaffold: Kotlin and Spring Boot scaffold (M)
|
||||
- [ ] Gradle Kotlin DSL, JDK 21 (S)
|
||||
- [ ] Health endpoint and CI (S)
|
||||
- [ ] Documents on the server #docs (L) :#scaffold
|
||||
- [ ] #docs: Documents on the server (L) :#scaffold
|
||||
- [ ] Text plus metadata, no structure format (M)
|
||||
- [ ] REST endpoints (S)
|
||||
- [ ] Persistence (S)
|
||||
@@ -162,7 +162,7 @@
|
||||
| [?] Run the one JS parser inside the IDE (M)
|
||||
- [?] Tracker integration (XL) %% exactly one of these, hence =
|
||||
= [?] Taiga (L) https://taiga.io
|
||||
- [ ] Resolve "#123" over the REST API #resolve (M)
|
||||
- [ ] #resolve: Resolve "#123" over the REST API (M)
|
||||
- [ ] Read title, link and status (S)
|
||||
- [ ] Map the workflow onto the states (S)
|
||||
- [?] Write the status back (M) :#resolve
|
||||
|
||||
Reference in New Issue
Block a user