From d3bdf8a4ca28871469c6cef06a882e8cb87784ea Mon Sep 17 00:00:00 2001 From: Martin Frost Date: Thu, 31 Jul 2025 19:27:17 +0200 Subject: [PATCH] A first attempt at converting frontmatter --- README.md | 15 ++++++++++ nikola_to_zola.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 README.md create mode 100755 nikola_to_zola.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b16d7c --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Convert nikola frontmatter to zola + +Nikola uses HTML comments for frontmatter. + +Zola does not. + +## Requirements + +A somewhat modern Python 3 installation. + +## Usage + +``` +./nikola_to_zola.py path/to/nikola/page.md > desired/destination/zola/page.md +``` diff --git a/nikola_to_zola.py b/nikola_to_zola.py new file mode 100755 index 0000000..968e3de --- /dev/null +++ b/nikola_to_zola.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +import argparse +import datetime +import zoneinfo + +SWEDEN = zoneinfo.ZoneInfo("Europe/Stockholm") + +parser = argparse.ArgumentParser( + prog="nikola_to_zola.py", + description="Convert Nikola frontmatter to Zola", +) +parser.add_argument("filename") + +args = parser.parse_args() + +def parse_frontmatter_line(line: str) -> tuple[str, str]: + """Parse one line from Nikola frontmatter + + Returns a tuple with (key, value). + + Parses dates into ISO8601 format. + """ + frontmatter = tuple(line.strip()[3:].split(": ", 1)) + key = frontmatter[0] + if len(frontmatter) < 2: + val = "" + else: + val = frontmatter[1] + + # Parse dateformat used in our frontmatter + if key == 'date': + try: + time_format = "%Y-%m-%d %H:%M:%S %Z" + val = datetime.datetime.strptime(val, time_format) + except ValueError: + time_format2 = "%Y-%m-%d %H:%M %Z" + val = datetime.datetime.strptime(val, time_format2) + + val = val.astimezone(SWEDEN).isoformat() + + return key, val + + +def read_file(): + frontmatter = {} + text = [] + with open(args.filename, 'r') as file: + reading_frontmatter = True + for line in file: + if line == ""): + reading_frontmatter = False + continue + + # Strip out teaser comments + if line.startswith("