summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/frontmatter.py28
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")