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

7.7 KiB
Raw Permalink Blame History

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)

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.