app/core/parser.py aktualisiert
All checks were successful
Deploy mindnet to llm-node / deploy (push) Successful in 3s

This commit is contained in:
Lars 2025-10-01 12:08:50 +02:00
parent b4b7ea76ab
commit 28d173b8fd

View File

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
"""
Modul: app/core/parser.py
Version: 1.7.0 (fault-tolerant)
Version: 1.7.1 (fault-tolerant, API-kompatibel)
Datum: 2025-10-01
Zweck
@ -10,7 +10,7 @@ Zweck
Fehlertolerantes Einlesen von Markdown-Dateien mit YAML-Frontmatter.
Kompatibel zur bisherigen Parser-API, aber robust gegenüber Nicht-UTF-8-Dateien:
- Versucht nacheinander: utf-8 utf-8-sig cp1252 latin-1.
- Bei Fallback wird ein JSON-Warnhinweis auf stdout ausgegeben, Import bricht NICHT ab.
- Bei Fallback wird ein JSON-Warnhinweis auf stdout ausgegeben; der Import bricht NICHT ab.
- YAML-Frontmatter wird mit '---' am Anfang und '---' als Abschluss erkannt.
- extract_wikilinks() normalisiert [[id#anchor|label]] → 'id'.
@ -20,17 +20,16 @@ Kompatibel zur bisherigen Parser-API, aber robust gegenüber Nicht-UTF-8-Dateien
- normalize_frontmatter(fm) -> dict
- validate_required_frontmatter(fm, required: tuple[str,...]=("id","title")) -> None
- extract_wikilinks(text) -> list[str]
- FRONTMATTER_RE (Kompatibilitäts-Konstante; Regex für '---'-Zeilen)
Beispiele
---------
# Einzelnes Markdown lesen
from app.core.parser import read_markdown, normalize_frontmatter, validate_required_frontmatter
parsed = read_markdown("./vault/30_projects/project-demo.md")
fm = normalize_frontmatter(parsed.frontmatter)
validate_required_frontmatter(fm)
body = parsed.body
# Wikilinks extrahieren
from app.core.parser import extract_wikilinks
links = extract_wikilinks(body)
@ -70,12 +69,14 @@ class ParsedNote:
# Frontmatter-Erkennung
# ---------------------------------------------------------------------
# YAML-Frontmatter am Anfang der Datei:
# ---\n
# <yaml>
# ---\n
_FRONTMATTER_HEAD = re.compile(r"^\s*---\s*$")
_FRONTMATTER_END = re.compile(r"^\s*---\s*$")
# Öffentliche Kompatibilitäts-Konstante: frühere Skripte importieren FRONTMATTER_RE
FRONTMATTER_RE = re.compile(r"^\s*---\s*$") # <— public
# Zusätzlich interner Alias (falls jemand ihn referenziert)
FRONTMATTER_END = FRONTMATTER_RE # <— public alias
# interne Namen bleiben bestehen
_FRONTMATTER_HEAD = FRONTMATTER_RE
_FRONTMATTER_END = FRONTMATTER_RE
def _split_frontmatter(text: str) -> Tuple[Dict[str, Any], str]:
@ -229,7 +230,6 @@ def normalize_frontmatter(fm: Dict[str, Any]) -> Dict[str, Any]:
elif isinstance(out["tags"], list):
out["tags"] = [str(t).strip() for t in out["tags"] if t is not None]
else:
# Unbekannter Typ → in Liste mit String umwandeln
out["tags"] = [str(out["tags"]).strip()] if out["tags"] not in (None, "") else []
if "embedding_exclude" in out:
out["embedding_exclude"] = bool(out["embedding_exclude"])