mindnet_obsidian/docs/12_Heading_Block_Link_Recommendation.md
Lars 725adb5302
Some checks are pending
Node.js build / build (20.x) (push) Waiting to run
Node.js build / build (22.x) (push) Waiting to run
Enhance UI and functionality for Chain Workbench and related features
- 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.
2026-02-05 11:41:15 +01:00

114 lines
7.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.