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
+12
-3
@@ -80,7 +80,10 @@ export function parse(text){
|
||||
if(descTarget !== SKIP) addDesc(descTarget, raw.trim());
|
||||
return;
|
||||
}
|
||||
const idm = raw.match(/^#([\p{L}\p{N}._-]+)\s*$/u);
|
||||
/* Der trennende Doppelpunkt (siehe Knoten-ID unten) ist auch hier
|
||||
zugelassen — ein Block-Kopf hat zwar keinen Titel dahinter, aber wer
|
||||
die Schreibweise `#auth:` gewohnt ist, soll nicht darüber stolpern. */
|
||||
const idm = raw.match(/^#([\p{L}\p{N}._-]+):?\s*$/u);
|
||||
if(!idm){
|
||||
/* Uneingerückt, keine ID-Zeile — bei einem versehentlichen Trenner
|
||||
mitten im Plan melden sich die verschluckten Knotenzeilen so
|
||||
@@ -129,9 +132,15 @@ export function parse(text){
|
||||
bleibt Label, und das reservierte `:#a,#b` (§11) wird nicht gefressen.
|
||||
Nur der ERSTE Treffer (kein /g): weitere `#`-Token bleiben im Label
|
||||
stehen, dort wohnt die reservierte Ticket-Referenz. Zeichenmenge wie bei
|
||||
`@name`; kein Lookbehind (Safari erst ab 16.4). */
|
||||
`@name`; kein Lookbehind (Safari erst ab 16.4).
|
||||
Übliche Schreibweise ist die ID **vor** dem Titel, abgetrennt durch einen
|
||||
Doppelpunkt: `#auth: Backend`. Der Doppelpunkt ist optional, gehört weder
|
||||
zur ID noch zum Label und verschwindet hier. Er wird nur geschluckt, wenn
|
||||
**Leerraum oder Zeilenende** folgt — sonst bliebe von `#auth:#db` nicht
|
||||
die Abhängigkeit `:#db` übrig. Die ID-Erkennung selbst bleibt unberührt
|
||||
(die Doppelpunkt-Gruppe ist optional, verlangt also nichts). */
|
||||
let id = null;
|
||||
rest = rest.replace(/(^|\s)#([\p{L}\p{N}._-]+)/u, (s, pre, g) => { id = g; return pre; });
|
||||
rest = rest.replace(/(^|\s)#([\p{L}\p{N}._-]+)(?::(?=\s|$))?/u, (s, pre, g) => { id = g; return pre; });
|
||||
/* Abhängigkeiten `:#a,#b` (SPEC §1, D37): EIN zusammenhängendes Token ohne
|
||||
Leerraum, nur ALLEINSTEHEND ANGESETZT — eingeklammerte Erwähnungen wie
|
||||
`(:#auth,#api)` bleiben damit Label (dieselbe Zitier-Konvention wie bei
|
||||
|
||||
Reference in New Issue
Block a user