Konzept-Raterei enger: keine fremden Konzepte an laufende Karten haengen
Der Datei-Fallback darf den Dateinamen ueber den Kartentitel raten. Live gesehen:
eine gerade LAUFENDE neue ARM-Karte zeigte das alte arm-ui-Konzept, als waere es
ihr Ergebnis — ein einzelnes gemeinsames Wort ("arm") reichte.
- Titel-Raterei nur noch bei FERTIGEN Karten; laeuft eine noch, zaehlt allein ein
im Text genannter Pfad.
- Und sie braucht jetzt zwei gemeinsame Woerter oder ein langes (>=6 Zeichen),
damit nicht irgendeine Datei auf irgendeine Karte passt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -736,17 +736,24 @@ _KONZEPT_PFAD_RX = re.compile(r"(?:~|/home/[A-Za-z0-9_.-]+)?/?konzepte/([A-Za-z0
|
|||||||
|
|
||||||
|
|
||||||
def _lokales_konzept(text: str, titel: str = "") -> tuple | None:
|
def _lokales_konzept(text: str, titel: str = "") -> tuple | None:
|
||||||
"""(pfad, inhalt) einer Konzept-Datei aus ~/konzepte — aus dem Text oder per Titel geraten."""
|
"""(pfad, inhalt) einer Konzept-Datei aus ~/konzepte — aus dem Text oder per Titel geraten.
|
||||||
|
|
||||||
|
`titel` nur setzen, wenn die Karte FERTIG ist: sonst hängt die Raterei einer gerade
|
||||||
|
laufenden Karte das Konzept ihres Vorgängers an (live gesehen 21.07. — eine neue
|
||||||
|
ARM-Karte zeigte das alte ARM-Konzept, als wäre es ihr Ergebnis).
|
||||||
|
"""
|
||||||
kandidaten: list[str] = []
|
kandidaten: list[str] = []
|
||||||
m = _KONZEPT_PFAD_RX.search(text or "")
|
m = _KONZEPT_PFAD_RX.search(text or "")
|
||||||
if m:
|
if m:
|
||||||
kandidaten.append(m.group(1))
|
kandidaten.append(m.group(1))
|
||||||
# Kein Pfad genannt (aeltere Karten): ueber den Titel raten — grobe Wortschnittmenge
|
# Kein Pfad genannt (aeltere Karten): ueber den Titel raten — Wortschnittmenge zwischen
|
||||||
# zwischen Dateiname und Kartentitel, nur bei einem eindeutigen Treffer.
|
# Dateiname und Kartentitel. Streng: EIN Treffer, und ein einzelnes kurzes Allerweltswort
|
||||||
|
# („arm") reicht nicht — sonst passt irgendeine Datei auf irgendeine Karte.
|
||||||
if not kandidaten and titel and _KONZEPT_DIR.is_dir():
|
if not kandidaten and titel and _KONZEPT_DIR.is_dir():
|
||||||
worte = {w for w in re.findall(r"[a-z0-9]{3,}", titel.lower())}
|
worte = {w for w in re.findall(r"[a-z0-9]{3,}", titel.lower())}
|
||||||
treffer = [p.name for p in _KONZEPT_DIR.glob("*.md")
|
treffer = [p.name for p in _KONZEPT_DIR.glob("*.md")
|
||||||
if worte & set(re.findall(r"[a-z0-9]{3,}", p.stem.lower()))]
|
if (lambda g: len(g) >= 2 or any(len(w) >= 6 for w in g))(
|
||||||
|
worte & set(re.findall(r"[a-z0-9]{3,}", p.stem.lower())))]
|
||||||
if len(treffer) == 1:
|
if len(treffer) == 1:
|
||||||
kandidaten.append(treffer[0])
|
kandidaten.append(treffer[0])
|
||||||
for name in kandidaten:
|
for name in kandidaten:
|
||||||
@@ -815,7 +822,9 @@ def konzept_of(task_id: str) -> dict:
|
|||||||
|
|
||||||
def _datei_antwort(repo: str | None = None) -> dict | None:
|
def _datei_antwort(repo: str | None = None) -> dict | None:
|
||||||
"""Konzept aus ~/konzepte als vollwertige Antwort — der zweite Ablage-Ort."""
|
"""Konzept aus ~/konzepte als vollwertige Antwort — der zweite Ablage-Ort."""
|
||||||
lokal = _lokales_konzept(haystack, titel)
|
# Titel-Raterei nur bei fertigen Karten (sonst erbt eine laufende Karte das
|
||||||
|
# Konzept ihres Vorgängers); läuft sie noch, zählt allein ein genannter Pfad.
|
||||||
|
lokal = _lokales_konzept(haystack, titel if task_status == "done" else "")
|
||||||
if not lokal:
|
if not lokal:
|
||||||
return None
|
return None
|
||||||
pfad, inhalt = lokal
|
pfad, inhalt = lokal
|
||||||
|
|||||||
Reference in New Issue
Block a user