import json from pathlib import Path from PIL import Image, ImageDraw, ImageFont ROOT = Path(__file__).resolve().parent.parent MANIFEST = ROOT / "assets" / "fallback-manifest.json" OUT = ROOT / "artifacts" / "fallback-ascii-contact-sheet.png" MAX_WIDTH = 120 MAX_HEIGHT = 80 def main() -> None: records = json.loads(MANIFEST.read_text(encoding="utf-8")) assert len(records) == 20 font = ImageFont.load_default(size=7) cell_width, cell_height = 720, 620 sheet = Image.new("RGB", (cell_width * 4, cell_height * 5), "#030503") draw = ImageDraw.Draw(sheet) results = [] for index, record in enumerate(records): image_path = ROOT / "frontend" / "public" / record["image"].lstrip("/") ascii_path = ROOT / record["ascii"] assert image_path.is_file(), image_path assert ascii_path.is_file(), ascii_path with Image.open(image_path) as image: assert image.size == (768, 512), (record["slug"], image.size) art = ascii_path.read_text(encoding="utf-8") lines = art.splitlines() width = len(lines[0]) height = len(lines) assert height <= MAX_HEIGHT, record["slug"] assert width <= MAX_WIDTH, record["slug"] assert all(len(line) == width for line in lines), record["slug"] non_space = sum(character != " " for character in art if character != "\n") coverage = non_space / (width * height) unique = len(set(art) - {" ", "\n"}) assert 0.015 < coverage < 0.70, (record["slug"], coverage) assert unique >= 3, (record["slug"], unique) results.append((record["slug"], coverage, unique)) x = (index % 4) * cell_width + 10 y = (index // 4) * cell_height + 10 draw.text( (x, y), f"{index + 1:02d} {record['slug']} coverage={coverage:.1%} glyphs={unique}", fill="#ffb547", font=font, ) draw.multiline_text((x, y + 22), art, fill="#78f78c", font=font, spacing=0) OUT.parent.mkdir(parents=True, exist_ok=True) sheet.save(OUT) for slug, coverage, unique in results: print(f"{slug:22} coverage={coverage:6.1%} glyphs={unique:2d}") print(f"Validated {len(results)} individual image/ASCII pairs") print(OUT) if __name__ == "__main__": main()