#!/usr/bin/env python3
"""
Curriculum PDF Generator CLI
Usage:
generate.py render <outline.json> --template-dir <dir> --output-dir <dir>
generate.py week --outlines <dir> --template-dir <dir> --output <dir> --week N [--days M W F]
generate.py all --outlines <dir> --template-dir <dir> --output <dir> [--weeks 32] [--days M W F]
generate.py validate <outline.json>
Examples:
# Render a single lesson
generate.py render 2nd_Grade/Science/outlines/W01_Monday.json \
--template-dir 2nd_Grade/Science/templates \
--output-dir 2nd_Grade/Science/Week01
# Render a full week
generate.py week --outlines 2nd_Grade/Science/outlines \
--template-dir 2nd_Grade/Science/templates \
--output 2nd_Grade/Science --week 1 --days Monday Wednesday Friday
# Render all 32 weeks
generate.py all --outlines 2nd_Grade/Science/outlines \
--template-dir 2nd_Grade/Science/templates \
--output 2nd_Grade/Science --weeks 32 --days Monday Wednesday Friday
# Validate an outline
generate.py validate 2nd_Grade/Science/outlines/W01_Monday.json
"""
import argparse
import sys
import os
from pathlib import Path
# Add shared dir to path
sys.path.insert(0, str(Path(__file__).parent))
from render import (
render_outline,
render_week,
render_all,
validate_outline,
)
def cmd_render(args):
"""Render a single outline JSON to PDF."""
pdf = render_outline(
args.outline,
args.template_dir,
args.output_dir,
template_name=args.template,
verbose=args.verbose,
)
print(f"✓ Generated: {pdf}")
return pdf
def cmd_week(args):
"""Render all days in a week."""
days = [d.strip() for d in args.days.split(",")] if args.days else None
pdfs = render_week(
args.outlines,
args.template_dir,
args.output,
args.week,
template_name=args.template,
days=days,
verbose=args.verbose,
)
print(f"✓ Week {args.week}: {len(pdfs)} PDF(s)")
return pdfs
def cmd_all(args):
"""Render all weeks in a course."""
days = [d.strip() for d in args.days.split(",")] if args.days else None
pdfs = render_all(
args.outlines,
args.template_dir,
args.output,
total_weeks=args.weeks,
template_name=args.template,
days=days,
verbose=args.verbose,
)
print(f"✓ Total: {len(pdfs)} PDF(s) across {args.weeks} weeks")
return pdfs
def cmd_validate(args):
"""Validate an outline JSON."""
result = validate_outline(args.outline)
if result["valid"]:
print(f"✓ {args.outline} is valid")
else:
print(f"✗ {args.outline} has errors:")
for err in result["errors"]:
print(f" - {err}")
return result
def main():
parser = argparse.ArgumentParser(
description="Curriculum PDF Generator",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
subparsers = parser.add_subparsers(dest="command", help="Command to run")
# render
p_render = subparsers.add_parser("render", help="Render a single outline")
p_render.add_argument("outline", help="Outline JSON path")
p_render.add_argument("-t", "--template-dir", required=True)
p_render.add_argument("-o", "--output-dir", required=True)
p_render.add_argument("--template", help="Template filename")
p_render.add_argument("-v", "--verbose", action="store_true")
# week
p_week = subparsers.add_parser("week", help="Render a full week")
p_week.add_argument("--outlines", required=True, help="Outlines directory")
p_week.add_argument("-t", "--template-dir", required=True)
p_week.add_argument("-o", "--output", required=True, help="Output base directory")
p_week.add_argument("--week", type=int, required=True)
p_week.add_argument("--template", help="Template filename")
p_week.add_argument("--days", help="Comma-separated day names (e.g. 'Monday,Wednesday,Friday')")
p_week.add_argument("-v", "--verbose", action="store_true")
# all
p_all = subparsers.add_parser("all", help="Render all weeks")
p_all.add_argument("--outlines", required=True, help="Outlines directory")
p_all.add_argument("-t", "--template-dir", required=True)
p_all.add_argument("-o", "--output", required=True, help="Output base directory")
p_all.add_argument("--weeks", type=int, default=32)
p_all.add_argument("--template", help="Template filename")
p_all.add_argument("--days", help="Comma-separated day names")
p_all.add_argument("-v", "--verbose", action="store_true")
# validate
p_val = subparsers.add_parser("validate", help="Validate an outline")
p_val.add_argument("outline", help="Outline JSON path")
args = parser.parse_args()
if args.command is None:
parser.print_help()
sys.exit(1)
cmds = {
"render": cmd_render,
"week": cmd_week,
"all": cmd_all,
"validate": cmd_validate,
}
cmds[args.command](args)
if __name__ == "__main__":
main()