#!/usr/bin/env python3 """ render.py: Shopify-стенд GuardLabs. Рендерить справжні Liquid-шаблони (python-liquid, Shopify-сумісний синтаксис: render, forloop, offset, unless, filters) у статичні сторінки стенду: layout/theme.liquid -> store/optimized.html (SEO + AI-search head) layout/before.liquid -> store/before.html (голий head "з коробки") """ import json import pathlib import sys from liquid import CachingFileSystemLoader, Environment BASE = pathlib.Path(__file__).resolve().parent OUT = pathlib.Path(sys.argv[1]) if len(sys.argv) > 1 else BASE / "out" def money(cents) -> str: return f"${int(cents) / 100:,.2f}" def money_amount(cents) -> str: return f"{int(cents) / 100:.2f}" def to_json(obj) -> str: return json.dumps(obj, ensure_ascii=False) def main() -> None: env = Environment( loader=CachingFileSystemLoader( [BASE / "theme" / "layout", BASE / "theme" / "sections", BASE / "theme" / "snippets"], ext=".liquid", ) ) env.filters["money"] = money env.filters["money_amount"] = money_amount env.filters["json"] = to_json data = json.loads((BASE / "data" / "product.json").read_text(encoding="utf-8")) data["critical_css"] = (BASE / "theme" / "assets" / "critical.css").read_text(encoding="utf-8").strip() (OUT / "store").mkdir(parents=True, exist_ok=True) for layout, out_name in (("theme.liquid", "optimized.html"), ("before.liquid", "before.html")): html = env.get_template(layout).render(**data) path = OUT / "store" / out_name path.write_text(html, encoding="utf-8") print(f"rendered {layout} -> {path} ({len(html)} bytes)") if __name__ == "__main__": main()