#!/usr/bin/env python3
"""Generate PDFs from HTML files for a given Science week.
Usage:
python3 generate_week.py Week08 # generates PDFs in Week08/
python3 generate_week.py Week08 W08_Monday_Liquids_Intro.html # single file
Requires: weasyprint (in ~/.venvs/math-curve)
"""
import glob
import os
import sys
import subprocess
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
def generate_html_to_pdf(html_path, output_dir):
"""Convert a single HTML file to PDF using WeasyPrint."""
base_name = os.path.splitext(os.path.basename(html_path))[0]
pdf_path = os.path.join(output_dir, base_name + ".pdf")
try:
from weasyprint import HTML
HTML(filename=html_path).write_pdf(pdf_path)
# Verify page count
result = subprocess.run(
["pdfinfo", pdf_path],
capture_output=True, text=True
)
for line in result.stdout.split("\n"):
if "Pages" in line:
pages = line.strip().split(":")[1].strip()
if pages == "3":
print(f" ✓ {base_name}.pdf ({pages} pages)")
else:
print(f" ✗ {base_name}.pdf ({pages} pages — expected 3)")
break
else:
print(f" ? {base_name}.pdf (page count unknown)")
return pdf_path
except Exception as e:
print(f" ✗ {base_name}: {e}")
return None
def generate_week(week_dir):
"""Generate all PDFs for a week directory."""
abs_week_dir = os.path.join(SCRIPT_DIR, week_dir)
if not os.path.isdir(abs_week_dir):
print(f"Error: {week_dir} not found")
sys.exit(1)
html_files = sorted(glob.glob(os.path.join(abs_week_dir, "W*.html")))
if not html_files:
print(f"No HTML files found in {week_dir}/")
sys.exit(1)
print(f"Generating PDFs for {week_dir}/")
print(f"Found {len(html_files)} HTML file(s)")
success = 0
failed = 0
for html_path in html_files:
result = generate_html_to_pdf(html_path, abs_week_dir)
if result:
success += 1
else:
failed += 1
print(f"\nDone: {success} success, {failed} failed")
return failed == 0
def generate_weeks(week_dirs):
"""Generate PDFs for multiple week directories."""
total_failed = 0
for week_dir in week_dirs:
if not generate_week(week_dir):
total_failed += 1
return total_failed == 0
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: generate_week.py Week08 [Week09 ...]")
sys.exit(1)
success = generate_weeks(sys.argv[1:])
sys.exit(0 if success else 1)