#!/usr/bin/env python3
"""
Monday Generator for Math Curriculum
Usage:
from monday import generate_monday
generate_monday(week_dir=..., week_num=..., day_data=...)
"""
import os
import sys
sys.path.insert(0, os.path.dirname(__file__))
from math_helpers import CSS, page_multi, sec, b, bw, bl, BLUE, GREEN
from weasyprint import HTML
def generate_monday(week_dir: str, week_num: int, day_data: dict):
"""
Generate Monday worksheet from structured data.
Args:
week_dir: Path to week directory (e.g., ~/Home_School/2nd_Grade/Math/Week_2)
week_num: Week number (e.g., 2)
day_data: Dict with keys:
- topic: str (e.g., "Tens and Ones Introduction")
- activities: list of activity dicts with 'type' and 'data'
- answers: list of answer strings for teacher guide
"""
topic = day_data.get("topic", "Monday Practice")
activities = day_data.get("activities", [])
# Build sections from activities
sections = []
for i, activity in enumerate(activities, 1):
activity_type = activity.get("type", "generic")
activity_data = activity.get("data", {})
title = activity_data.get("title", f"Activity {i}")
note = activity_data.get("note", "")
section_html = build_activity_section(activity_type, activity_data)
sections.append((i, title, section_html))
# Split into 2 pages (3 activities per page)
mid = (len(sections) + 1) // 2
page1 = ""
for i, title, html in sections[:mid]:
page1 += sec(i, title, html)
page2 = ""
for i, title, html in sections[mid:]:
page2 += sec(i, title, html, pb=True)
html_content = page_multi(week_num, "Monday", topic, page1, page2)
# Write PDF
pdf_path = os.path.join(week_dir, f"Week_{week_num}_Monday.pdf")
HTML(string=html_content).write_pdf(pdf_path)
print(f"[ok] Week {week_num} Monday generated: {pdf_path}")
return day_data.get("answers", [])
# ═══════════════════════════════════════════════════
# Activity Builders
# ═══════════════════════════════════════════════════
def build_activity_section(activity_type: str, data: dict) -> str:
"""Build HTML for a specific activity type."""
builders = {
"tens_ones_count": build_tens_ones_count,
"tens_ones_chart": build_tens_ones_chart,
"expanded_form": build_expanded_form,
"build_from_expanded": build_build_from_expanded,
"draw_base10": build_draw_base10,
"compare_place_value": build_compare_place_value,
"word_problems": build_word_problems,
"generic": build_generic,
}
builder = builders.get(activity_type, build_generic)
return builder(data)
def build_tens_ones_count(data: dict) -> str:
"""Build tens and ones counting activity."""
html = '<p class="note">' + data.get("note", "Count the groups of ten sticks.") + '</p>'
html += '<div class="mgrid c3">'
for item in data.get("items", []):
sticks = item.get("sticks", "||||||||||")
label = item.get("label", "")
html += f'<div class="abox"><p><span style="color:#4caf50;">{sticks}</span></p>'
html += f'<p>{label} = {b("4em")} ten(s)</p></div>'
html += '</div>'
return html
def build_tens_ones_chart(data: dict) -> str:
"""Build a tens/ones chart activity."""
html = '<p class="note">' + data.get("note", "Fill in the chart.") + '</p>'
html += '<table class="tbl"><tr><th>Number</th><th>Tens</th><th>Ones</th></tr>'
for num in data.get("numbers", []):
html += f'<tr><td>{num}</td><td>{b("4em")}</td><td>{b("4em")}</td></tr>'
html += '</table>'
return html
def build_expanded_form(data: dict) -> str:
"""Build expanded form activity."""
html = '<p class="note">' + data.get("note", "Write each number as tens + ones.") + '</p>'
html += '<div class="mgrid c2">'
for num in data.get("numbers", []):
html += f'<div class="abox"><p>{num} = {b("4em")} + {b("4em")}</p></div>'
html += '</div>'
return html
def build_build_from_expanded(data: dict) -> str:
"""Build 'put expanded form together' activity."""
html = '<p class="note">' + data.get("note", "What number does the expanded form make?") + '</p>'
html += '<div class="mgrid c3">'
for tens, ones in data.get("pairs", []):
html += f'<div class="abox" style="text-align:center"><p>{tens} + {ones} = {b("4em")}</p></div>'
html += '</div>'
return html
def build_draw_base10(data: dict) -> str:
"""Build draw base-10 blocks activity."""
html = '<p class="note">' + data.get("note", "Draw rods (tens) and cubes (ones).") + '</p>'
html += '<div class="mgrid c2">'
for num in data.get("numbers", []):
html += f'<div class="abox"><p style="font-size:16px; font-weight:700;">{num}</p>'
html += '<div class="draw-box" style="min-height:50px;"></div></div>'
html += '</div>'
return html
def build_compare_place_value(data: dict) -> str:
"""Build comparison activity."""
html = '<p class="note">' + data.get("note", "Write >, <, or =.") + '</p>'
html += '<div class="mgrid c2">'
for left, right in data.get("pairs", []):
html += f'<div class="abox"><p>{left} {b("4em")} {right}</p></div>'
html += '</div>'
return html
def build_word_problems(data: dict) -> str:
"""Build word problems activity."""
html = '<div class="wp">'
for problem in data.get("problems", []):
text = problem.get("text", "")
blanks = problem.get("blanks", 1)
blank_html = " ".join([b("4em") for _ in range(blanks)])
html += f'<p>{text} {blank_html}</p>'
html += '</div>'
return html
def build_generic(data: dict) -> str:
"""Generic activity builder for custom HTML."""
return data.get("html", "")