#!/usr/bin/env python3 """Build sites from body.html + meta into index.html using shared templates.""" import json import os import sys def render(title, breadcrumb, style, extra_css, body, footer, standalone=False): css = style + ("\n" + extra_css if extra_css.strip() else "") if standalone: nav = f"" else: nav = f'' return f""" {title}
{nav}

{breadcrumb}

{body}
{footer} """ def build_demo_body(demos_file): demos = json.load(open(demos_file)) parts = [] for d in demos: url = d.get("url", "#") title = d.get("title", d.get("name", "")) desc = d.get("description", "") src = d.get("source", "") src_link = f' / source' if src else "" parts.append(f'

{title}{src_link}

\n

{desc}

') return "\n".join(parts) def build(sites_dir): shared = os.path.join(sites_dir, "_shared") style = open(os.path.join(shared, "style.css")).read() footer = open(os.path.join(shared, "footer.html")).read() for site in sorted(os.listdir(sites_dir)): if site.startswith("_") or site == "fonts" or site == "hooks": continue site_dir = os.path.join(sites_dir, site) if not os.path.isdir(site_dir): continue body_file = os.path.join(site_dir, "body.html") demos_file = os.path.join(site_dir, "demos.json") if site == "demo.gumx.cc" and os.path.exists(demos_file): body = build_demo_body(demos_file) elif os.path.exists(body_file): body = open(body_file).read() else: continue title = site breadcrumb = site standalone = False meta_file = os.path.join(site_dir, "meta") if os.path.exists(meta_file): for line in open(meta_file): k, _, v = line.strip().partition("=") if k == "TITLE": title = v.strip('"') elif k == "BREADCRUMB": breadcrumb = v.strip('"') elif k == "STANDALONE": standalone = v.strip().strip('"') not in ("0", "false", "") extra_css = "" extra_file = os.path.join(site_dir, "extra.css") if os.path.exists(extra_file): extra_css = open(extra_file).read() out = render(title, breadcrumb, style, extra_css, body, footer, standalone=standalone) with open(os.path.join(site_dir, "index.html"), "w") as f: f.write(out) print(f"built: {site}") if __name__ == "__main__": build(sys.argv[1] if len(sys.argv) > 1 else ".")