#!/usr/bin/env python3 """Create responsive image variants and patch existing HTML img tags.""" from __future__ import annotations import argparse import os import re import sys from pathlib import Path from generate import log, write_text_atomic from images import create_responsive_variants, iter_source_images HERO_IMG_RE = re.compile( r'([^' ) THUMB_IMG_RE = re.compile( r'([^' ) def patch_html_images(path: Path, descriptors: dict[str, dict[str, str]]) -> bool: html = path.read_text(encoding="utf-8") original = html def replace_hero(match: re.Match[str]) -> str: date_iso, alt = match.group(1), match.group(2) image = descriptors.get(date_iso) if not image: return match.group(0) return ( f'' ) def replace_thumb(match: re.Match[str]) -> str: date_iso, alt = match.group(1), match.group(2) image = descriptors.get(date_iso) if not image: return match.group(0) return ( f'{alt}' ) html = HERO_IMG_RE.sub(replace_hero, html) html = THUMB_IMG_RE.sub(replace_thumb, html) if html != original: write_text_atomic(path, html) log(f"patched images in {path}") return True return False def main() -> int: parser = argparse.ArgumentParser(description="Create responsive hero image variants") parser.add_argument("--site-dir", default=None) args = parser.parse_args() repo_root = Path(__file__).resolve().parent.parent site_dir = Path(args.site_dir or os.environ.get("SITE_DIR", repo_root / "public")) img_dir = site_dir / "img" descriptors: dict[str, dict[str, str]] = {} for source in iter_source_images(img_dir): date_iso = source.stem descriptor = create_responsive_variants(img_dir, date_iso) if descriptor: descriptors[date_iso] = descriptor log(f"created variants for {date_iso}") patched = 0 targets = [site_dir / "index.html", site_dir / "archiv" / "index.html"] targets.extend(sorted((site_dir / "archiv").glob("2026-*.html"))) for path in targets: if path.exists(): patched += patch_html_images(path, descriptors) log(f"done, {len(descriptors)} image set(s), patched {patched} html file(s)") return 0 if __name__ == "__main__": sys.exit(main())