feat: ID-Kurzform wird beim Doppelpunkt aufgelöst (D55-Nachtrag)

`#.kc` wird jetzt aufgelöst, sobald ein Doppelpunkt die ID abschließt —
beim Tippen des Doppelpunkts ebenso wie beim nächsten Tastendruck in
einer Zeile, die ihn schon trägt. Ohne Doppelpunkt bleibt es beim
Verlassen der Zeile.

Der Cursor allein löst weiterhin nichts aus: Angefasst wird nur die
Zeile, in der auch getippt wurde (D55/D27).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-24 14:52:29 +02:00
co-authored by Claude Opus 5
parent a60c466d82
commit 4900eb3428
6 changed files with 176 additions and 19 deletions
+49 -1
View File
@@ -1,5 +1,5 @@
import { describe, it, expect } from 'vitest';
import { expandShortIds, parse } from '../src/parser.js';
import { expandShortIds, shortIdClosed, parse } from '../src/parser.js';
/* Kurzschreibweise der Knoten-ID (D55): `#.kc` unter `#prod-stage` wird beim
Verlassen der Zeile zu `#prod-stage.kc`. Eingabehilfe, keine Notation — in
@@ -115,3 +115,51 @@ describe('expandShortIds — das Ergebnis parst wie eine von Hand geschriebene I
expect(r.warnings).toEqual([]); /* kein unknownDep mehr */
});
});
/* Vorfilter für den frühen Zeitpunkt (D55-Nachtrag): Folgt der Kurzform
unmittelbar ein Doppelpunkt, steht fest, wie die ID heißt — der Editor löst
dann sofort auf, statt das Verlassen der Zeile abzuwarten. */
describe('shortIdClosed — die Kurzform ist mit einem Doppelpunkt abgeschlossen', () => {
it('erkennt den Trenner vor dem Titel', () => {
expect(shortIdClosed(' - #.kc: Keycloak')).toBe(true);
});
it('erkennt ihn auch am Zeilenende, noch ohne Titel', () => {
expect(shortIdClosed(' - #.kc:')).toBe(true);
});
it('zählt auch den Anfang einer Abhängigkeitsliste', () => {
expect(shortIdClosed(' - #.kc:#db')).toBe(true);
});
it('sagt ohne Doppelpunkt nein — dort wird beim Verlassen der Zeile aufgelöst', () => {
expect(shortIdClosed(' - #.kc Keycloak')).toBe(false);
});
it('verlangt ihn unmittelbar, nicht irgendwo in der Zeile', () => {
expect(shortIdClosed(' - #.kc Keycloak: Stage')).toBe(false);
});
it('lässt die volle ID in Ruhe — da gibt es nichts aufzulösen', () => {
expect(shortIdClosed(' - #prod-stage.kc: Keycloak')).toBe(false);
});
it('fasst `#..x` nicht an, wie expandShortIds auch nicht', () => {
expect(shortIdClosed(' - #..x: X')).toBe(false);
});
it('sieht nur das erste `#`-Token', () => {
expect(shortIdClosed(' - #a: siehe #.b: dort')).toBe(false);
});
it('übergeht den Kommentar', () => {
expect(shortIdClosed(' - #.kc Keycloak %% #.x: Notiz')).toBe(false);
});
it('was er meldet, löst expandShortIds auch wirklich auf', () => {
const zeile = ' - #.kc: Keycloak';
expect(shortIdClosed(zeile)).toBe(true);
expect(expandShortIds(['#prod-stage: Stage', zeile].join('\n')))
.toContain('#prod-stage.kc: Keycloak');
});
});