#!/usr/bin/env python3 import json import os import re import shutil from dataclasses import dataclass from datetime import datetime from pathlib import Path import jinja2 import typst @dataclass class Metadata: title: str date: datetime def main() -> None: repo_dir = Path(__file__).parent site_dir = repo_dir / 'site' content_dir = site_dir / 'content' public_dir = repo_dir / 'public' shutil.rmtree(public_dir, ignore_errors=True) shutil.copytree(repo_dir / 'static', public_dir / 'static') os.environ['TYPST_FEATURES'] = 'html' pages: dict[Path, Metadata] = {} for path in content_dir.rglob('*.typ'): print(path) output_path = public_dir / path.relative_to(content_dir).with_suffix('.html') output_path.parent.mkdir(parents=True, exist_ok=True) metadata = json.loads(typst.query( root=site_dir, input=path, selector='', field='value', one=True, )) output_url = str(output_path.relative_to(public_dir)) pages[output_url] = Metadata( title=metadata['title'], date=datetime( year=metadata['date_year'], month=metadata['date_month'], day=metadata['date_day'], ), ) typst.compile( root=site_dir, input=path, output=output_path ) print(pages) template = jinja2.Template(open(site_dir / 'index.html').read()) open(public_dir / 'index.html', 'w').write(template.render(pages=pages)) if __name__ == '__main__': main()