#!/usr/bin/env python3
"""
Week 12: Adding 3 Numbers (to 100) — REWRITTEN
Phase 2: Addition & Subtraction to 100
Key skills: Commutative property, grouping friendly numbers, left-to-right method
New Standard:
- Reduced drill (40% fewer problems)
- Estimation before calculating
- Multiple strategies encouraged
- Better word problems (reasoning over keywords)
- Real challenges (open-ended thinking)
- Number talks (compare without calculating)
- Friday self-check with reflection
- Mental math ±10, ±100 woven throughout
- Unknowns in equations
- Word problems every day
- Fact fluency warmup daily
"""
import os
import glob
from weasyprint import HTML
from math_helpers import (
CSS, TEACHER_CSS,
page, page_multi, hdr, sec, b, bw, bl,
tg_page, tg_page_multi, tg_sec, tg_note, tg_section_title,
)
BASE = os.path.expanduser("~/Home_School/2nd_Grade/Math")
WEEK = os.path.join(BASE, "Week_12")
# ═══════════════════════════════════════════════════
# MONDAY — Intro: Adding 3 Numbers
# ═══════════════════════════════════════════════════
def monday():
# 1: Fluency warmup — ±10 (2.NBT.B.8)
s1 = '<div class="abox" style="background:#e8f5e9;">'\
'<p><b>2-min Fluency Warm-up</b> — Mental math.</p>'\
'<div class="mgrid c3">'
for expr in [("42 + 10", ""), ("75 − 10", ""), ("36 + 10", ""), ("88 − 10", "")]:
s1 += f'<div class="abox"><p>{expr[0]} = {b("4em")}</p></div>'
s1 += '</div></div>'
# 2: Learn the method — add first two, then add the third
s2 = '<div class="abox" style="background:#e3f2fd;">'\
'<p><b>New Skill: Adding 3 Numbers</b></p>'\
'<p>When adding 3 numbers, add the first two, then add the third.</p>'\
'<div class="mgrid c2" style="gap:12px;">'\
'<div class="abox" style="text-align:center; padding:12px;">'\
'<p style="font-family:monospace; font-size:16px; font-weight:bold;">25 + 10 + 20</p>'\
'<p style="color:#3f51b5; font-size:11px;">Step 1: 25 + 10 = 35</p>'\
'<p style="color:#3f51b5; font-size:11px;">Step 2: 35 + 20 = 55</p>'\
'<p style="font-weight:bold; font-size:14px;">Answer: 55</p></div>'\
'<div class="abox" style="text-align:center; padding:12px;">'\
'<p style="font-family:monospace; font-size:16px; font-weight:bold;">30 + 15 + 5</p>'\
'<p style="color:#3f51b5; font-size:11px;">Step 1: 30 + 15 = 45</p>'\
'<p style="color:#3f51b5; font-size:11px;">Step 2: 45 + 5 = 50</p>'\
'<p style="font-weight:bold; font-size:14px;">Answer: 50</p></div>'\
'</div></div>'
# 3: Guided practice — fill in the intermediate step
s3 = '<p class="note">Fill in the blanks. Add the first two numbers, then add the third.</p>'\
'<div class="mgrid c2">'
examples = [
(12, 20, 30, 32, 62),
(15, 5, 25, 20, 45),
(40, 10, 8, 50, 58),
(33, 7, 20, 40, 60),
]
for a, num2, c, step1, total in examples:
s3 += f'<div class="abox"><p style="font-family:monospace; font-size:15px; text-align:center;">'\
f'{a} + {num2} + {c}</p>'\
f'<p>First: {a} + {num2} = {b("4em")}</p>'\
f'<p>Then: {b("4em")} + {c} = {b("4em")}</p></div>'
s3 += '</div>'
# 4: Number Talk — which is easier to add first?
s4 = '<div class="abox" style="background:#fff3e0;">'\
'<p><b>Number Talk</b> — Without calculating, which order is EASIER? Explain.</p>'\
'<div class="mgrid c2">'
s4 += '<div class="abox"><p>A: 15 + 20 + 5</p><p>B: 15 + 5 + 20</p>'\
'<p style="font-size:11px;">My thinking: ' + bw() + '</p></div>'
s4 += '<div class="abox"><p>A: 28 + 12 + 35</p><p>B: 35 + 28 + 12</p>'\
'<p style="font-size:11px;">My thinking: ' + bw() + '</p></div>'
s4 += '</div></div>'
# 5: Word problem — 3 numbers
s5 = '<div class="wp"><p class="note">Read carefully. There are THREE numbers in this problem.</p>'\
'<div class="abox"><p style="font-size:0.95em;">You found 12 shells on the beach. '\
'Your sister found 8 shells. Your brother found 15 shells. '\
'How many shells did you all find together?</p>'\
'<p style="font-size:11px;">Draw or write your thinking: ' + bw() + '</p>'\
'<p>' + b("6em") + ' shells</p></div></div>'
return page(12, "Monday", "Adding 3 Numbers",
f'''{sec(1, "Warm-up: ±10 Mental Math", s1)}
{sec(2, "Learn: Adding 3 Numbers", s2)}
{sec(3, "Guided Practice", s3)}
{sec(4, "Number Talk: Which Order is Easier?", s4)}
{sec(5, "Word Problem", s5)}''')
# ═══════════════════════════════════════════════════
# TUESDAY — Strategy: Group "Friendly Numbers"
# ═══════════════════════════════════════════════════
def tuesday():
# 1: Fluency warmup — ±10 (2.NBT.B.8)
s1 = '<div class="abox" style="background:#e8f5e9;">'\
'<p><b>2-min Fluency Warm-up</b> — Mental math. Go fast!</p>'\
'<div class="mgrid c3">'
for expr in [("53 + 10", ""), ("68 − 10", ""), ("91 + 10", ""), ("74 − 10", "")]:
s1 += f'<div class="abox"><p>{expr[0]} = {b("4em")}</p></div>'
s1 += '</div></div>'
# 2: Strategy — group friendly numbers (add to 10 or multiples of 10)
s2 = '<div class="abox" style="background:#e3f2fd;">'\
'<p><b>Pro Strategy: Group "Friendly Numbers"</b></p>'\
'<p style="font-size:11px;">Look for two numbers that add up nicely (to 10, 20, 30...).</p>'\
'<div class="mgrid c2" style="gap:12px;">'\
'<div class="abox" style="text-align:center; padding:12px;">'\
'<p style="font-weight:bold; font-size:14px;">18 + 32 + 25</p>'\
'<p style="color:#3f51b5; font-size:11px;">18 + 32 = 50 ← nice round number!</p>'\
'<p style="color:#3f51b5; font-size:11px;">50 + 25 = 75</p></div>'\
'<div class="abox" style="text-align:center; padding:12px;">'\
'<p style="font-weight:bold; font-size:14px;">43 + 7 + 29</p>'\
'<p style="color:#3f51b5; font-size:11px;">43 + 7 = 50 ← nice round number!</p>'\
'<p style="color:#3f51b5; font-size:11px;">50 + 29 = 79</p></div>'\
'</div></div>'
# 3: Practice — find the friendly pair first
s3 = '<p class="note">Circle the two numbers that are easiest to add first, then solve.</p>'\
'<div class="mgrid c2">'
problems = [
(25, 15, 38),
(6, 34, 22),
(40, 28, 12),
(53, 7, 19),
]
for a, num2, c in problems:
s3 += f'<div class="abox"><p style="font-size:1.1em; text-align:center;">{a} + {num2} + {c} = {b("5em")}</p>'\
'<p style="font-size:11px; color:#666;">I added ______ and ______ first because ' + bw() + '</p></div>'
s3 += '</div>'
# 4: Word problems — 3 numbers
s4 = '<div class="wp"><p class="note">Look for friendly numbers in these problems.</p>'\
'<div class="mgrid c2">'
problems = [
("At lunch, 18 kids ate chicken nuggets, 12 kids ate sandwiches, and 27 kids ate pizza. How many kids ate lunch?", "kids"),
("The garden has 24 red flowers, 6 yellow flowers, and 35 blue flowers. How many flowers are in the garden?", "flowers"),
]
for text, unit in problems:
s4 += f'<div class="abox"><p style="font-size:0.95em;">{text}</p>'\
'<p style="font-size:11px;">Draw or write your thinking: ' + bw() + '</p>'\
'<p>' + b("6em") + f' {unit}</p></div>'
s4 += '</div></div>'
# 5a: Two Ways — same sum, two different orders (commutative/associative)
s4 += '<div class="abox" style="background:#fff8e1; margin-top:6px;">'\
'<p><b>Two Ways!</b> Solve 16 + 24 + 8 <b>two different ways</b>. Pick a different pair to add first each time.</p>'\
'<div class="mgrid c2">'\
'<div class="abox"><p>Way 1: I added ' + b("3em") + ' + ' + b("3em") + ' first. Total: ' + b("4em") + '</p></div>'\
'<div class="abox"><p>Way 2 (another way): I added ' + b("3em") + ' + ' + b("3em") + ' first. Total: ' + b("4em") + '</p></div>'\
'</div><p style="font-size:11px; color:#666;">Did you get the same total both ways? Why? ' + bw() + '</p></div>'
# 5: Challenge — make 100
s5 = '<div class="abox" style="background:#f3e5f5;">'\
'<p><b>Challenge: Can you make 100?</b></p>'\
'<p>Fill in the blanks so all three numbers add up to 100. There are MANY answers!</p>'\
'<p style="font-size:1.1em; text-align:center;">' + b("5em") + ' + ' + b("5em") + ' + ' + b("5em") + ' = 100</p>'\
'<p style="font-size:11px; color:#666;">Show your work: ' + bl() + '</p></div>'
return page(12, "Tuesday", "Strategy: Group Friendly Numbers",
f'''{sec(1, "Warm-up: ±10 Mental Math", s1)}
{sec(2, "Strategy: Friendly Numbers", s2)}
{sec(3, "Find the Friendly Pair", s3)}
{sec(4, "Word Problems", s4)}
{sec(5, "Challenge: Make 100", s5)}''')
# ═══════════════════════════════════════════════════
# WEDNESDAY — Estimating 3-Number Sums
# ═══════════════════════════════════════════════════
def wednesday():
# 1: Fluency warmup — ±10 (2.NBT.B.8)
s1 = '<div class="abox" style="background:#e8f5e9;">'\
'<p><b>2-min Fluency Warm-up</b> — Mental math.</p>'\
'<div class="mgrid c3">'
for expr in [("67 − 10", ""), ("34 + 10", ""), ("55 − 10", ""), ("23 + 10", "")]:
s1 += f'<div class="abox"><p>{expr[0]} = {b("4em")}</p></div>'
s1 += '</div></div>'
# 2: Estimate first — round to tens
s2 = '<div class="abox" style="background:#fff3e0;">'\
'<p><b>Estimate First!</b> Round each number to the nearest 10, add, then find the actual answer.</p>'\
'<div class="mgrid c2">'
problems = [
(28, 13, 25),
(44, 17, 36),
(52, 28, 19),
(33, 46, 14),
]
for a, num2, c in problems:
at = round(a / 10) * 10
bt = round(num2 / 10) * 10
ct = round(c / 10) * 10
s2 += f'<div class="abox"><p style="font-weight:bold;">{a} + {num2} + {c}</p>'\
f'<p>Estimate ({at}+{bt}+{ct}): {b("4em")}</p>'\
f'<p>Actual: {b("4em")}</p></div>'
s2 += '</div></div>'
# 3: Mixed practice — 3 number addition
s3 = '<p class="note">Solve using your favorite strategy.</p>'\
'<div class="mgrid c2">'
problems = [
(15, 20, 35),
(28, 12, 40),
(45, 8, 17),
(33, 27, 18),
(19, 41, 25),
(56, 14, 22),
]
for a, num2, c in problems:
s3 += f'<div class="abox"><p style="font-size:1.1em; text-align:center;">{a} + {num2} + {c} = {b("5em")}</p></div>'
s3 += '</div>'
# 4: Unknowns in equations — missing addends
s4 = '<div class="abox"><p class="note">Find the missing number.</p>'\
'<div class="mgrid c2">'
problems = [
(15, 20, 55), # 15 + ? + 20 = 55
(30, 25, 75), # ? + 30 + 25 = 75
(18, 42, 80), # 18 + 20 + ? = 40
]
# 15 + ? + 20 = 55 → ? = 20
s4 += f'<div class="abox"><p>15 + ' + b("4em") + ' + 20 = 55</p>'\
'<p style="font-size:11px;">How did you figure it out? ' + bw() + '</p></div>'
# ? + 30 + 25 = 75 → ? = 20
s4 += f'<div class="abox"><p>' + b("4em") + ' + 30 + 25 = 75</p>'\
'<p style="font-size:11px;">How did you figure it out? ' + bw() + '</p></div>'
s4 += '</div></div>'
# 5: Word problem — reasoning
s5 = '<div class="wp"><p class="note">Read carefully. Three numbers, one question.</p>'\
'<div class="mgrid c2">'
problems = [
("The class read 18 books in September, 22 books in October, and 15 books in November. How many books did the class read in all?", "books"),
("There were 36 boys at the soccer game, 24 girls, and 20 adults. How many people were at the game?", "people"),
]
for text, unit in problems:
s5 += f'<div class="abox"><p style="font-size:0.95em;">{text}</p>'\
'<p style="font-size:11px;">Draw or write your thinking: ' + bw() + '</p>'\
'<p>' + b("6em") + f' {unit}</p></div>'
s5 += '</div></div>'
return page(12, "Wednesday", "Estimating 3-Number Sums",
f'''{sec(1, "Warm-up: ±10 Mental Math", s1)}
{sec(2, "Estimate First!", s2)}
{sec(3, "Practice", s3)}
{sec(4, "Find the Missing Number", s4)}
{sec(5, "Word Problems", s5)}''')
# ═══════════════════════════════════════════════════
# THURSDAY — Application & Open-Ended Challenges
# ═══════════════════════════════════════════════════
def thursday():
# 1: Fluency warmup — ±10 and ±100 (2.NBT.B.8)
s1 = '<div class="abox" style="background:#e8f5e9;">'\
'<p><b>2-min Fluency Warm-up</b> — Mental math.</p>'\
'<div class="mgrid c3">'
for expr in [("81 − 10", ""), ("43 + 10", ""), ("600 − 100", ""), ("100 + 100", "")]:
s1 += f'<div class="abox"><p>{expr[0]} = {b("4em")}</p></div>'
s1 += '</div></div>'
# 2: Real-world 3-number problems
s2 = '<div class="wp"><p class="note">Think about the situation. Draw if it helps.</p>'\
'<div class="mgrid c2">'
problems = [
("On Saturday, the pet store sold 14 fish, 8 dogs, and 23 cats. How many pets did they sell that day?", "pets"),
("The school collected 45 pounds of books, 25 pounds of clothes, and 30 pounds of toys for the drive. How many pounds were collected?", "pounds"),
("Three friends ran a race. Sarah ran 38 meters, Jake ran 22 meters, and Lily ran 40 meters. How many meters did they run altogether?", "meters"),
]
for text, unit in problems:
s2 += f'<div class="abox"><p style="font-size:0.95em;">{text}</p>'\
'<p style="font-size:11px;">Draw or write your thinking: ' + bw() + '</p>'\
'<p>' + b("6em") + f' {unit}</p></div>'
s2 += '</div></div>'
# 3: Number Talk — compare WITHOUT calculating
s3 = '<div class="abox" style="background:#e3f2fd;">'\
'<p><b>Number Talk</b> — Which sum is bigger? Explain WITHOUT calculating.</p>'\
'<div class="mgrid c2">'
s3 += '<div class="abox"><p>A: 15 + 25 + 30</p><p>B: 25 + 20 + 35</p>'\
'<p style="font-size:11px;">My thinking: ' + bw() + '</p></div>'
s3 += '<div class="abox"><p>A: 40 + 30 + 20</p><p>B: 38 + 32 + 18</p>'\
'<p style="font-size:11px;">My thinking: ' + bw() + '</p></div>'
s3 += '</div></div>'
# 4: Even/Odd check
s4 = '<div class="abox"><p class="note">Solve each. Is the answer even or odd?</p>'\
'<div class="mgrid c3">'
for a, num2, c in [(15, 22, 33), (28, 14, 27), (19, 31, 40)]:
s4 += f'<div class="abox"><p>{a} + {num2} + {c} = {b("4em")}</p>'\
'<p>even or odd? <span class="bw">____</span></p></div>'
s4 += '</div></div>'
# 5: Open-ended challenge
s5 = '<div class="abox" style="background:#f3e5f5;">'\
'<p><b>Create Your Own 3-Number Problem</b></p>'\
'<p>Write a word problem that adds 3 numbers together. Make it about something YOU care about (your hobbies, pets, sports, etc.).</p>'\
'<p style="min-height:60px; border-bottom:1px solid #333;"></p>'\
'<p style="min-height:30px; border-bottom:1px solid #333;"></p>'\
'<p style="font-size:11px;">My answer: ' + b("5em") + '</p>'\
'</div>'
return page(12, "Thursday", "Application & Open-Ended Challenges",
f'''{sec(1, "Warm-up: ±10 and ±100", s1)}
{sec(2, "Real-World Word Problems", s2)}
{sec(3, "Number Talk: Compare Sums", s3)}
{sec(4, "Even or Odd?", s4)}
{sec(5, "Challenge: Create Your Own", s5)}''')
# ═══════════════════════════════════════════════════
# FRIDAY — Review & Self-Check
# ═══════════════════════════════════════════════════
def friday():
# 1: Fluency warmup — ±10 (2.NBT.B.8)
s1 = '<div class="abox" style="background:#e8f5e9;">'\
'<p><b>2-min Fluency Warm-up</b> — Mental math. Go fast!</p>'\
'<div class="mgrid c3">'
for expr in [("76 − 10", ""), ("52 + 10", ""), ("300 + 100", ""), ("500 − 100", "")]:
s1 += f'<div class="abox"><p>{expr[0]} = {b("4em")}</p></div>'
s1 += '</div></div>'
# 2: Estimate and solve
s2 = '<div class="abox" style="background:#fff3e0;">'\
'<p><b>Estimate First!</b> Round to tens, estimate, then solve.</p>'\
'<div class="mgrid c2">'
problems = [
(34, 27, 18),
(45, 16, 33),
]
for a, num2, c in problems:
at = round(a / 10) * 10
bt = round(num2 / 10) * 10
ct = round(c / 10) * 10
s2 += f'<div class="abox"><p style="font-weight:bold;">{a} + {num2} + {c}</p>'\
f'<p>Estimate ({at}+{bt}+{ct}): {b("4em")}</p>'\
f'<p>Actual: {b("4em")}</p></div>'
s2 += '</div></div>'
# 3: Mixed review — adding 3 numbers
s3 = '<p class="note">Use the strategy you like best.</p>'\
'<div class="mgrid c2">'
problems = [
(18, 22, 40),
(35, 15, 20),
(27, 33, 19),
(42, 8, 50),
]
for a, num2, c in problems:
s3 += f'<div class="abox"><p style="font-size:1.1em; text-align:center;">{a} + {num2} + {c} = {b("5em")}</p></div>'
s3 += '</div>'
# 4: Word problem review
s4 = '<div class="wp"><p class="note">Read carefully. Show your thinking.</p>'\
'<div class="abox"><p style="font-size:0.95em;">The book fair sold 26 science books, 14 animal books, and 20 space books. '\
'How many books were sold in all?</p>'\
'<p style="font-size:11px;">Draw or write your thinking: ' + bw() + '</p>'\
'<p>' + b("6em") + ' books</p></div></div>'
# 5: Self-check with reflection
s5 = '<div class="selfcheck">' \
'<p><b>Self-Check: How do you feel about adding 3 numbers?</b></p>' \
'<div style="display:flex; gap:20px; flex-wrap:wrap;">' \
'<div style="background:#fff3e0; padding:10px; border-radius:5px; flex:1; min-width:150px;">' \
'<p><b>Grouping Friendly Numbers</b></p>' \
'<p>😊 I got it! | 😐 Getting there | 😟 Need help</p>' \
'</div>' \
'<div style="background:#e3f2fd; padding:10px; border-radius:5px; flex:1; min-width:150px;">' \
'<p><b>Estimating 3-Number Sums</b></p>' \
'<p>😊 I got it! | 😐 Getting there | 😟 Need help</p>' \
'</div>' \
'<div style="background:#f3e5f5; padding:10px; border-radius:5px; flex:1; min-width:150px;">' \
'<p><b>Solving 3-Number Word Problems</b></p>' \
'<p>😊 I got it! | 😐 Getting there | 😟 Need help</p>' \
'</div>' \
'</div>' \
'<p style="margin-top:10px;"><b>One thing I learned this week:</b> ' + bl() + '</p>' \
'<p><b>One thing I want to practice more:</b> ' + bl() + '</p>' \
'<p><b>My favorite strategy for adding 3 numbers:</b> ' + bl() + '</p>' \
'</div>'
return page(12, "Friday", "Week 12 Review & Self-Check",
f'''{sec(1, "Warm-up: ±10 and ±100", s1)}
{sec(2, "Estimate First!", s2)}
{sec(3, "Review: Adding 3 Numbers", s3)}
{sec(4, "Word Problem", s4)}
{sec(5, "Self-Check & Reflection", s5)}''')
# ═══════════════════════════════════════════════════
# TEACHER GUIDE
# ═══════════════════════════════════════════════════
def teacher_guide():
return tg_page_multi(
"Week 12", "Adding 3 Numbers (to 100) — Teacher Guide",
tg_section_title("Monday: Adding 3 Numbers") +
tg_sec(1, "Warm-up ±10", ["52, 65, 46, 78"]) +
tg_sec(2, "Examples", ["25+10+20=55, 30+15+5=50"]) +
tg_sec(3, "Guided Practice", ["32,62 | 20,45 | 50,58 | 40,60"]) +
tg_sec(4, "Number Talk", ["B is easier (15+5=20) | Same sum either way (commutative)"]) +
tg_sec(5, "Word Problem", ["12+8+15=35 shells"]) +
tg_note("Page break"),
tg_section_title("Tuesday: Group Friendly Numbers") +
tg_sec(1, "Warm-up", ["63, 58, 101, 64"]) +
tg_sec(2, "Strategy", ["18+32=50, +25=75 | 43+7=50, +29=79"]) +
tg_sec(3, "Friendly Pair", ["25+15=40, +38=78 | 6+34=40, +22=62 | 28+12=40, +40=80 | 53+7=60, +19=79"]) +
tg_sec(4, "Word Problems", ["18+12+27=57 kids | 24+6+35=65 flowers", "Two Ways: 16+24+8=48 both ways (e.g., 16+24=40 first, or 24+8=32 first — order doesn't change the sum)"]) +
tg_sec(5, "Make 100", ["Many answers: 40+30+30, 50+25+25, etc."]) +
tg_note("Page break"),
tg_section_title("Wednesday: Estimating 3-Number Sums") +
tg_sec(1, "Warm-up", ["57, 44, 45, 33"]) +
tg_sec(2, "Estimation", ["Est 30+10+30=70, actual 66 | Est 40+20+40=100, actual 97 | Est 50+30+20=100, actual 99 | Est 30+50+10=90, actual 93"]) +
tg_sec(3, "Practice", ["70, 80, 69, 78, 85, 92"]) +
tg_sec(4, "Missing Numbers", ["15+20+20=55 | 20+30+25=75"]) +
tg_sec(5, "Word Problems", ["18+22+15=55 books | 36+24+20=80 people"]) +
tg_note("Page break"),
tg_section_title("Thursday: Application & Challenges") +
tg_sec(1, "Warm-up", ["71, 53, 500, 200"]) +
tg_sec(2, "Real-World Problems", ["14+8+23=45 pets | 45+25+30=100 pounds | 38+22+40=100 meters"]) +
tg_sec(3, "Number Talk", ["B bigger (25+20+35 > 15+25+30) | Same (all 90)"]) +
tg_sec(4, "Even/Odd", ["70(even), 69(odd), 90(even)"]) +
tg_sec(5, "Create Own", ["Accept student-created problems"]) +
tg_note("Page break"),
tg_section_title("Friday: Review & Self-Check") +
tg_sec(1, "Warm-up", ["66, 62, 400, 400"]) +
tg_sec(2, "Estimation", ["Est 30+30+20=80, actual 79 | Est 50+20+30=100, actual 94"]) +
tg_sec(3, "Review", ["80, 70, 79, 100"]) +
tg_sec(4, "Word Problem", ["26+14+20=60 books"]) +
tg_sec(5, "Self-Check", ["Accept student self-assessment and reflection"])
)
# ═══════════════════════════════════════════════════
# GENERATE
# ═══════════════════════════════════════════════════
if __name__ == "__main__":
os.makedirs(WEEK, exist_ok=True)
for f in glob.glob(os.path.join(WEEK, "*.pdf")):
os.remove(f)
days = [
(monday, "Monday", "Adding 3 Numbers"),
(tuesday, "Tuesday", "Strategy: Group Friendly Numbers"),
(wednesday, "Wednesday", "Estimating 3-Number Sums"),
(thursday, "Thursday", "Application & Open-Ended Challenges"),
(friday, "Friday", "Week 12 Review & Self-Check"),
]
for lesson_func, day, title in days:
html = lesson_func()
fname = f"Week_12_{day}"
path = os.path.join(WEEK, f"{fname}.html")
with open(path, "w") as f:
f.write(html)
pdf_path = os.path.join(WEEK, f"{fname}.pdf")
HTML(filename=path).write_pdf(pdf_path)
print(f"Generated: {pdf_path}")
html = teacher_guide()
path = os.path.join(WEEK, "Week_12_Teacher_Guide.html")
with open(path, "w") as f:
f.write(html)
pdf_path = os.path.join(WEEK, "Week_12_Teacher_Guide.pdf")
HTML(filename=path).write_pdf(pdf_path)
print(f"Generated: {pdf_path}")