Kernblock je Kapitel: Frage-Antwort-Paare zum Auffrischen, KERN.md in der Montage

Jedes Kapitel endet mit „## Kern“. Die Montage sammelt alle Blöcke in
buch/KERN.md, die API liefert sie unter kern.md. Stilregel, Kapitel- und
Prüfprompt angepasst.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
team3
2026-10-08 15:42:01 +02:00
parent c3a0df76de
commit fb95558657
6 changed files with 25 additions and 4 deletions

View File

@@ -168,6 +168,11 @@ async def buch_md(slug: str, n: int):
return montage.markdown(_key(slug, n))
@app.get("/api/themen/{slug}/v{n}/kern.md", response_class=PlainTextResponse)
async def kern_md(slug: str, n: int):
return montage.kern(_key(slug, n))
@app.get("/api/themen/{slug}/v{n}/buch.pdf")
async def buch_pdf(slug: str, n: int):
key = _key(slug, n)

View File

@@ -9,6 +9,7 @@ from . import config, gliederung, state
log = logging.getLogger("buchwerk")
ABSCHNITT_RE = re.compile(r"^## (\d+\.\d+) (.+?)\s*$", re.M)
KERN_RE = re.compile(r"^## Kern[ \t]*\n(.*?)(?=^## |\Z)", re.S | re.M)
def _woerter(text: str) -> int:
@@ -88,12 +89,24 @@ def markdown(name: str) -> str:
return "\n".join(zeilen)
def kern(name: str) -> str:
"""Alle `## Kern`-Blöcke der Kapitel in einer Datei – zum Auffrischen eines gelesenen Buchs."""
g = guide(name); v = state.verzeichnis(name)
out = [f"# Kernerkenntnisse – {g['titel']}", ""]
for k in g["kapitel"]:
p = v / "buch" / k["datei"].split("/", 1)[1]
m = KERN_RE.search(p.read_text()) if p.exists() else None
if m:
out += [f"## Kapitel {k['ord']} – {k['titel']}", "", m.group(1).strip(), ""]
return "\n".join(out)
def readme(name: str) -> str:
g = guide(name)
out = [f"# {g['titel']}", ""]
if g["untertitel"]:
out += [f"*{g['untertitel']}*", ""]
out += ["PDF: [buch.pdf](buch.pdf) · Gesamttext: [buch.md](buch.md)", "", "## Inhalt", "", "[Vorwort](00-vorwort.md)", ""]
out += ["PDF: [buch.pdf](buch.pdf) · Gesamttext: [buch.md](buch.md) · Kernerkenntnisse: [KERN.md](KERN.md)", "", "## Inhalt", "", "[Vorwort](00-vorwort.md)", ""]
teil = None
for k in g["kapitel"]:
if k["teil"] and k["teil"] != teil:
@@ -194,4 +207,5 @@ def bauen(name: str) -> bool:
v = state.verzeichnis(name)
(v / "buch" / "README.md").write_text(readme(name))
(v / "buch" / "buch.md").write_text(markdown(name))
(v / "buch" / "KERN.md").write_text(kern(name))
return pdf(name)