from __future__ import annotations from pathlib import Path import tomlkit def parse_frontmatter(path: Path) -> tuple[dict, str]: """Parse TOML frontmatter delimited by +++. Returns (frontmatter_dict, body_str).""" text = path.read_text(encoding="utf-8") if not text.startswith("+++"): raise ValueError(f"No TOML frontmatter found in {path}") parts = text.split("+++", 2) if len(parts) < 3: raise ValueError(f"Malformed frontmatter in {path}") _, toml_block, body = parts fm = dict(tomlkit.loads(toml_block)) return fm, body.lstrip("\n") def write_frontmatter(path: Path, frontmatter: dict, body: str) -> None: """Write frontmatter + body back to file, preserving TOML format.""" text = path.read_text(encoding="utf-8") parts = text.split("+++", 2) if len(parts) < 3: raise ValueError(f"Malformed frontmatter in {path}") _, original_toml, _ = parts doc = tomlkit.loads(original_toml) for k, v in frontmatter.items(): doc[k] = v new_text = f"+++\n{tomlkit.dumps(doc).strip()}\n+++\n\n{body}" path.write_text(new_text, encoding="utf-8")