From b4d3b526e232804e06b84d93628244cecd035df5 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 1 May 2026 12:51:54 +0200 Subject: feat: TOML frontmatter parse/write with tomlkit --- core/frontmatter.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 core/frontmatter.py (limited to 'core/frontmatter.py') diff --git a/core/frontmatter.py b/core/frontmatter.py new file mode 100644 index 0000000..4e9eff3 --- /dev/null +++ b/core/frontmatter.py @@ -0,0 +1,28 @@ +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)}+++\n\n{body}" + path.write_text(new_text, encoding="utf-8") -- cgit v1.2.3