#!/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'
'
)
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())