feat: Cursor in einer Beschreibung wählt ihren Knoten aus
Bisher fiel die Hervorhebung weg, sobald der Cursor von der Knotenzeile auf die `"`-Zeile darunter rückte: Die trägt keinen Knoten, also fand die Zeilensuche nichts. Falsche Auskunft — sie trägt keinen EIGENEN Knoten, gehört aber zu einem, und wer in ihr schreibt, arbeitet an genau diesem. Gilt für beide Formen, nicht nur die Kurzform: Die Zuordnung entsteht an derselben Stelle im Parser, an der auch die `---`-Blöcke landen, und dort trägt die Begründung sogar weiter — der Langtext steht am Dateiende, weit weg von seinem Knoten. Zugeordnet werden Textzeilen, Block-Kopfzeile (sie nennt den Knoten) und Leerzeilen innerhalb eines Blocks; nicht der `---`-Trenner und nichts unter unbekannter ID. `node.descLines` entsteht im Parser, der Renderer gibt sie als `data-desc-lines="3 4 5"` aus, app.js trifft sie per `[data-desc-lines~="N"]`. Bewusst getrennt von `descLines` (dem Text): Dort fallen Leerzeilen zu einem Absatztrenner zusammen und Blocktext unter unbekannter ID kommt gar nicht an. Beide Richtungen gehen jetzt über eine Auflösung (`nodeOfLine()`) — sonst wäre der ausdrückliche Alt+Klick aus einer Beschreibung heraus stumm geblieben, und das ist gerade der Ort, an dem man ihn braucht. 5 neue Tests (204 gesamt). SPEC §9 und D40 (Nachtrag 2) nachgezogen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
e223734d58
commit
24a70ca49e
+14
-4
@@ -947,6 +947,18 @@ out.addEventListener('touchend', e => {
|
||||
out.addEventListener('touchcancel', disarmPress);
|
||||
out.addEventListener('contextmenu', e => { if(pressTimer || armedEl) e.preventDefault(); });
|
||||
|
||||
/* Welcher Knoten gehört zu einer Textzeile? Zuerst der Knoten, DER auf dieser
|
||||
Zeile steht; sonst der Knoten, dessen **Beschreibung** hier steht (SPEC §9):
|
||||
Eine `"`-Zeile und die Zeilen eines `---`-Blocks tragen keinen eigenen
|
||||
Knoten, gehören aber zu einem — und wer darin schreibt, arbeitet an genau
|
||||
diesem Knoten. `~=` trifft die Zeilennummer als Glied der Liste in
|
||||
`data-desc-lines` (vom Renderer, gefüllt aus `node.descLines`). */
|
||||
function nodeOfLine(line){
|
||||
if(line == null) return null;
|
||||
return out.querySelector('.node[data-line="' + line + '"]')
|
||||
|| out.querySelector('.node[data-desc-lines~="' + line + '"]');
|
||||
}
|
||||
|
||||
/* Text -> Diagramm: Knoten der Cursor-Zeile hervorheben (`caretLine` steht oben). */
|
||||
/* `scroll` sagt, WIE ins Bild geholt wird: 'nearest' beim gewöhnlichen
|
||||
Zeilenwechsel (nur so weit wie nötig — sonst ruckelte das Diagramm),
|
||||
@@ -955,9 +967,7 @@ out.addEventListener('contextmenu', e => { if(pressTimer || armedEl) e.preventDe
|
||||
function highlightCurrentNode(moved, scroll = 'nearest'){
|
||||
markCurrentLineNo(); /* die eine Stelle, an der die Cursor-Zeile neu gesetzt wird */
|
||||
if(currentNodeEl) currentNodeEl.classList.remove('current', 'pulse');
|
||||
currentNodeEl = caretLine == null
|
||||
? null
|
||||
: out.querySelector('.node[data-line="' + caretLine + '"]');
|
||||
currentNodeEl = nodeOfLine(caretLine);
|
||||
if(!currentNodeEl){ drawDepLinks(); return; }
|
||||
currentNodeEl.classList.add('current');
|
||||
/* Die Cursor-Zeile ist die zweite Lesart von „ausgewählt" — ihre
|
||||
@@ -995,7 +1005,7 @@ for(const ev of ['click','keyup','input','focus']) src.addEventListener(ev, sync
|
||||
eine Geste, zwei Richtungen. */
|
||||
function focusNodeOfCaret(){
|
||||
const line = caretLineOf();
|
||||
const el = out.querySelector('.node[data-line="' + line + '"]');
|
||||
const el = nodeOfLine(line);
|
||||
if(!el) return; /* Kommentar, Leerzeile, ausgeblendet Verworfenes */
|
||||
caretLine = line;
|
||||
/* Die Gegenrichtung zu revealEditor(): Auf Mobil steht der Text vorn, das
|
||||
|
||||
Reference in New Issue
Block a user