#!/usr/bin/env python3 """Generate README.md and index.html with emoji listings.""" import html import re from collections import defaultdict from datetime import datetime, timezone from pathlib import Path from urllib.parse import quote PER_ROW = 10 EMOJI_DIR = Path("emoji") EXTENSIONS = (".png", ".gif", ".jpg", ".jpeg") def generate_readme(files: list[Path]) -> None: """Generate README.md with HTML tables of all emoji images.""" listing = defaultdict(list) for file in files: first_char = file.name[0].lower() if not re.match(r"[a-z]", first_char): first_char = r"\[^a-zA-Z:\]" listing[first_char].append(file) per_row_width = f"{100 // PER_ROW}%" contents = "# Emotes\n\n" for header in sorted(listing.keys(), key=lambda x: (not x.startswith("\\"), x)): icons = listing[header] contents += f"## {header}\n\n" contents += '\n' for i in range(0, len(icons), PER_ROW): chunk = icons[i:i + PER_ROW] contents += "\n" for icon in chunk: name = icon.stem encoded_path = f"emoji/{quote(icon.name)}" display_path = f"emoji/{icon.name}" contents += ( f"\n" ) contents += "\n" contents += "
" f"
\n\n" contents += f"\n\n Generated: {datetime.now(timezone.utc).isoformat()}" Path("README.md").write_text(contents, encoding="utf-8") print(f"Generated README.md with {len(files)} emojis") def generate_html(files: list[Path]) -> None: """Generate index.html with searchable emoji grid grouped alphabetically.""" # Group files by first character listing = defaultdict(list) for file in files: first_char = file.name[0].lower() if not re.match(r"[a-z]", first_char): first_char = "#" listing[first_char].append(file) # Build grouped HTML sections = [] for header in sorted(listing.keys(), key=lambda x: (x != "#", x)): display_header = "0-9 / Special" if header == "#" else header.upper() emoji_items = [] for file in listing[header]: name = file.stem encoded_path = f"emoji/{quote(file.name)}" escaped_name = html.escape(name) emoji_items.append( f'
' f'{escaped_name}
' ) sections.append( f'
\n' f'

{display_header}

\n' f'
\n{chr(10).join(emoji_items)}\n
\n' f'
' ) contents = f''' Emotes

ivuorinen/emoji

{len(files)} emojis
{chr(10).join(sections)}
''' Path("index.html").write_text(contents, encoding="utf-8") print(f"Generated index.html with {len(files)} emojis") def main(): files = sorted( f for f in EMOJI_DIR.iterdir() if f.suffix.lower() in EXTENSIONS ) if not files: raise SystemExit("No images to continue with.") generate_readme(files) generate_html(files) if __name__ == "__main__": main()