- Introduced a wide two-column layout for the Chain Workbench modal, improving user experience and accessibility. - Added new styles for workbench components, including headers, filters, and main containers, to enhance visual organization. - Updated chain templates to allow for multiple distinct matches per template, improving flexibility in template matching. - Enhanced documentation to clarify the new settings and commands related to the Chain Workbench and edge detection features. - Implemented logging for better tracking of missing configurations, ensuring users are informed about any loading issues.
114 lines
7.7 KiB
Markdown
114 lines
7.7 KiB
Markdown
# Bewertung & Empfehlung: Überschrift vs. Block-Link (Heading-Match)
|
||
|
||
**Datum:** Januar 2026
|
||
**Kontext:** Exaktes Heading-Matching in Inspect Chains / Chain Workbench vs. Obsidian-Standard und Interview-Assistent.
|
||
|
||
---
|
||
|
||
## 1. Obsidian-Standard (Dokumentation & beobachtetes Verhalten)
|
||
|
||
### 1.1 Drei relevante Link-Formen (bei Überschrift mit Block-ID)
|
||
|
||
Bei einer Zeile `## Überschrift ^Block` in der Zieldatei:
|
||
|
||
| Link | Verhalten beim Klick |
|
||
|------|----------------------|
|
||
| **`[[Titel#Überschrift Block]]`** (ohne `^`) | Obsidian **erzeugt diese Form**, wenn man manuell per UI auf die Überschrift verlinkt – das Zeichen `^` wird **immer entfernt**. Springt auf die Überschrift, **highlighted den kompletten Text unter der Überschrift**. |
|
||
| **`[[Titel#Überschrift]]`** (nur Text, ohne „ Block“) | Springt **in die Note, aber nicht auf die Überschrift**. Entspricht dem aktuellen Interview-Assistenten. |
|
||
| **`[[Titel#^Block]]`** (Block-Link) | Springt auf die Überschrift, **highlighted nur die Überschrift selbst** (nicht den Abschnitt darunter). Funktioniert auch, wenn man `^` manuell einträgt (Obsidian entfernt `^` nur bei UI-erzeugten Links). |
|
||
|
||
### 1.2 Beobachtetes Verhalten
|
||
|
||
- **Obsidian entfernt bei UI-Links das `^`:** Ein manuell gesetzter Wikilink auf eine Überschrift mit Block-ID wird zu `[[Titel#Überschrift Block]]` (mit Leerzeichen, ohne Caret).
|
||
- **Drei Schreibweisen bezeichnen dieselbe Sektion:** `Überschrift`, `Überschrift ^Block` (im Quelldokument), `Überschrift Block` (in Obsidian-Links). Für Matching müssen alle drei als dieselbe Sektion gelten.
|
||
|
||
---
|
||
|
||
## 2. Aktuelles Verhalten im Plugin
|
||
|
||
### 2.1 Section-Parser & Graph-Index
|
||
|
||
- **sectionParser:** Speichert `heading` als **vollständige Zeile** nach den `#`, also z. B. `"Überschrift ^block"` (inkl. Block-ID).
|
||
- **graphIndex `parseTarget`:**
|
||
- Bei `[[Datei#X]]`: `target.heading = X` (exakt der Teil nach `#`).
|
||
- Bei `[[#^block-id]]`: Auflösung über Sektionen → `heading = section.heading` (ebenfalls voller Text, inkl. ` ^block`).
|
||
- **Section-Nodes:** Werden aus `section.heading` gebaut → ebenfalls voller Text (z. B. `"Überschrift ^block"`).
|
||
|
||
### 2.2 Interview-Assistent (LinkTargetPicker + renderNoteEdges)
|
||
|
||
- **getHeadingsWithSectionTypes** (targetTypeResolver): Liest Überschriften per **eigenem Regex** und **entfernt** den Block-Teil: `(.+?)(?:\s+\^[\w-]+)?\s*$` → `match[2]` ist nur der Text (z. B. `"Überschrift"`).
|
||
- **LinkTargetPicker:** Setzt `linkTarget = basename + "#" + h.heading` → es wird **nur** `[[Note#Überschrift]]` erzeugt (ohne „ Block“ / ` ^block`).
|
||
- **renderNoteEdges:** Schreibt `[[${toNote}]]`; `toNote` ist bereits `"Note"` oder `"Note#Überschrift"`.
|
||
|
||
**Fazit:** Der Interview-Assistent erzeugt `[[Note#Überschrift]]`. In Obsidian springt dieser Link **in die Note, aber nicht auf die Überschrift** (siehe Abschnitt 1). Obsidian-typisches Springen auf die Überschrift (inkl. Highlight des Abschnitts) liefert nur `[[Titel#Überschrift Block]]` (UI-erzeugt, ohne `^`).
|
||
|
||
### 2.3 Inspect Chains & Chain Workbench
|
||
|
||
- **chainInspector** vergleicht überall **strikt:**
|
||
`edge.target.heading === context.heading` und
|
||
`edge.source.sectionHeading === context.heading`.
|
||
- **dangling_target_heading:** Prüfung gegen `metadataCache.getFileCache(...).headings` mit
|
||
`h.heading === targetHeading` (ebenfalls exakt).
|
||
- **Chain Workbench** nutzt dieselben Konzepte (context/assignment mit `heading`); keine Normalisierung.
|
||
|
||
**Folge:** Sobald eine Seite `"Überschrift ^block"` und ein Link `[[Titel#Überschrift]]` vorkommt (oder umgekehrt), stimmen die Strings nicht überein → kein Match, ggf. falscher `dangling_target_heading`.
|
||
|
||
---
|
||
|
||
## 3. Bewertung
|
||
|
||
| Aspekt | Bewertung |
|
||
|--------|-----------|
|
||
| **Obsidian (UI)** | Beim manuellen Verlinken auf eine Überschrift mit Block-ID: Link wird zu `[[Titel#Überschrift Block]]` (ohne `^`). Klick springt auf Überschrift und highlighted den Abschnitt. |
|
||
| **Interview-Assistent** | Erzeugt `[[Note#Überschrift]]`. In Obsidian springt der Link **nicht** auf die Überschrift (nur in die Note). Besseres Spring-Verhalten hätte `[[Note#Überschrift Block]]` (Obsidian-Stil) oder `[[Note#^Block]]`. |
|
||
| **Inspect Chains / Workbench** | Exaktes Match ist zu streng: „Überschrift“, „Überschrift ^Block“, „Überschrift Block“ bezeichnen dieselbe Sektion. |
|
||
| **Risiko** | Ohne Normalisierung matchen diese drei Schreibweisen nicht; falsche Findings / fehlende Zuordnung. |
|
||
|
||
---
|
||
|
||
## 4. Empfehlung
|
||
|
||
### 4.1 Eine Baustelle zuerst (keine Überladung)
|
||
|
||
Um nicht zu viele Änderungen gleichzeitig zu öffnen:
|
||
|
||
- **Nur eine Baustelle:** **Normalisierung in Inspect Chains & Chain Workbench** (zentrale Normalisierungsfunktion + alle Heading-Vergleiche und `dangling_target_heading` auf normalisierte Form umstellen).
|
||
- **Interview-Assistent vorerst unverändert:** Weiter `[[Note#Überschrift]]` ausgeben. Eine spätere, **optionale** Anpassung (z. B. Ausgabe `[[Note#Überschrift Block]]` im Obsidian-Stil, damit der Klick auf die Überschrift springt) kann separat erfolgen.
|
||
|
||
### 4.2 Normalisierungsregel (für Vergleiche)
|
||
|
||
Drei Schreibweisen sollen als **dieselbe Sektion** gelten:
|
||
|
||
- `Überschrift` (Interview, reiner Text)
|
||
- `Überschrift ^Block` (Quelldokument / sectionParser)
|
||
- `Überschrift Block` (Obsidian-UI-Link, ohne `^`)
|
||
|
||
**Kanonische Form für Vergleiche:**
|
||
|
||
1. Am Ende **Block-Suffix mit Caret** entfernen: `\s+\^[a-zA-Z0-9_-]+$` → z. B. `"Überschrift ^Block"` → `"Überschrift"`.
|
||
2. Danach **ein einzelnes Wort am Ende** (nur Buchstaben, Zahlen, Bindestrich, Unterstrich) optional entfernen: `\s+[a-zA-Z0-9_-]+$` → z. B. `"Überschrift Block"` → `"Überschrift"`.
|
||
|
||
So werden alle drei Varianten auf `"Überschrift"` abgebildet. **Randfall:** Eine Überschrift, die wirklich „X Y“ heißt (ohne Block-ID), würde ebenfalls zu „X“ normalisiert und könnte mit „X“ matchen; in der Praxis selten. Die Funktion **nur** für Vergleiche/Prüfungen nutzen, nicht für Anzeige oder gespeicherte Links.
|
||
|
||
### 4.3 Konkrete Maßnahmen (nur diese eine Baustelle)
|
||
|
||
1. **Eine zentrale Normalisierungsfunktion** (z. B. in `linkHelpers` oder eigenem Modul): Eingabe = Überschrift-String, Ausgabe = kanonische Form wie oben.
|
||
|
||
2. **Inspect Chains (chainInspector):** Alle Vergleiche mit `heading` / `sectionHeading` auf die **normalisierte** Form umstellen; bei **dangling_target_heading** `targetHeading` und Cache-Headings vor dem Vergleich normalisieren.
|
||
|
||
3. **Chain Workbench:** Dieselbe Normalisierung überall, wo Headings verglichen werden.
|
||
|
||
4. **graphIndex / Interview:** Keine Änderung in dieser Baustelle.
|
||
|
||
### 4.4 Optional später (separate Baustelle)
|
||
|
||
- **Interview-Assistent:** Wenn gewünscht, Links so erzeugen, dass Obsidian auf die Überschrift springt: z. B. `[[Note#Überschrift Block]]` (Block-Teil ohne `^`, wie Obsidian-UI) statt `[[Note#Überschrift]]`. Dann würde der Klick auf den vom Assistenten gesetzten Link dasselbe tun wie bei manuell gesetzten Links.
|
||
|
||
---
|
||
|
||
## 5. Kurzfassung
|
||
|
||
- **Obsidian (beobachtet):** Manueller Link auf Überschrift mit Block-ID → `[[Titel#Überschrift Block]]` (ohne `^`). Klick springt auf Überschrift und highlighted den Abschnitt. `[[Titel#Überschrift]]` springt nur in die Note, nicht auf die Überschrift. `[[Titel#^Block]]` highlighted nur die Überschrift.
|
||
- **Eine Baustelle:** Nur **Normalisierung in Inspect Chains & Chain Workbench** umsetzen (zentrale Funktion: Block-Suffix mit `^` und ggf. ein trailinges Wort entfernen; alle Heading-Vergleiche und `dangling_target_heading` auf diese Form umstellen). Interview-Assistent und graphIndex in dieser Runde **nicht** anfassen.
|
||
- **Optional später:** Interview-Assistent so anpassen, dass er z. B. `[[Note#Überschrift Block]]` erzeugt (Obsidian-Stil), damit der Klick auf den Link auf die Überschrift springt.
|