diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/frontmatter.py | 28 |
1 files changed, 28 insertions, 0 deletions
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") |
