#!/usr/bin/env python3
"""
Week 3: Comparing & Ordering Numbers
Phase 1: Number Sense & Operations
"""
import os
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_grid_answers, tg_note, tg_section_title,
)
BASE = os.path.expanduser("~/Home_School/2nd_Grade/Math")
WEEK = os.path.join(BASE, "Week_3")
# ═══════════════════════════════════════════════════
# MONDAY — Introduction to <, >, =
# ═══════════════════════════════════════════════════
def monday():
# 1: Learn the symbols
s1 = '<p class="note">The alligator always eats the bigger number! The open side faces the larger number.</p>'
s1 += '<div class="mgrid c3">'
s1 += '<div class="abox"><p style="font-size:18px; font-weight:700;">5 <span style="font-size:24px;">></span> 2</p><p>5 is <b>greater than</b> 2</p></div>'
s1 += '<div class="abox"><p style="font-size:18px; font-weight:700;">3 <span style="font-size:24px;"><</span> 7</p><p>3 is <b>less than</b> 7</p></div>'
s1 += '<div class="abox"><p style="font-size:18px; font-weight:700;">4 <span style="font-size:24px;">=</span> 4</p><p>4 is <b>equal to</b> 4</p></div>'
s1 += '</div>'
# 2: Practice with single digits
s2 = '<p class="note">Fill in <, >, or =.</p>'
s2 += '<div class="mgrid c3">'
pairs = [(6, 3), (2, 9), (5, 5), (8, 1), (4, 7), (9, 9)]
for left, right in pairs:
s2 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
s2 += '</div>'
# 3: Compare teen numbers
s3 = '<p class="note">Compare numbers to 20.</p>'
s3 += '<div class="mgrid c2">'
pairs = [(12, 15), (18, 14), (10, 10), (19, 11), (16, 17)]
for left, right in pairs:
s3 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
s3 += '</div>'
# 4: Compare two-digit numbers
s4 = '<p class="note">Compare larger numbers. Look at the tens place first!</p>'
s4 += '<div class="mgrid c2">'
pairs = [(34, 28), (56, 65), (42, 42), (71, 69)]
for left, right in pairs:
s4 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
s4 += '</div>'
# 5: Draw the alligator
s5 = '<p class="note">Draw the alligator mouth (or write =) for each pair.</p>'
s5 += '<div class="mgrid c2">'
pairs = [(23, 45), (67, 34), (50, 50), (89, 98)]
for left, right in pairs:
s5 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
s5 += '</div>'
return page(2, "Monday", "Introduction to <, >, =",
f'''{sec(1, "Learn the Symbols", s1)}
{sec(2, "Single Digits", s2)}
{sec(3, "Teen Numbers", s3)}
{sec(4, "Two-Digit Numbers", s4)}
{sec(5, "Draw the Alligator", s5)}'''
)
# ═══════════════════════════════════════════════════
# TUESDAY — Comparing & Ordering Pairs
# ═══════════════════════════════════════════════════
def tuesday():
# 1: Review symbols
s1 = '<p class="note">Fill in <, >, or =.</p>'
s1 += '<div class="mgrid c3">'
pairs = [(45, 38), (22, 22), (67, 76), (19, 21), (84, 79), (50, 49)]
for left, right in pairs:
s1 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
s1 += '</div>'
# 2: Compare using place value
s2 = '<p class="note">Look at the tens place first. The number with more tens is greater.</p>'
s2 += '<div class="mgrid c2">'
s2 += '<div class="abox"><p>34 has 3 tens. 42 has 4 tens.</p><p>34 ___ 42</p></div>'
s2 += '<div class="abox"><p>56 has 5 tens. 51 has 5 tens.</p><p>Look at ones: 6 ones ___ 1 one</p><p>56 ___ 51</p></div>'
s2 += '<div class="abox"><p>78 has 7 tens. 69 has 6 tens.</p><p>78 ___ 69</p></div>'
s2 += '<div class="abox"><p>43 has 4 tens. 47 has 4 tens.</p><p>Look at ones: 3 ones ___ 7 ones</p><p>43 ___ 47</p></div>'
s2 += '</div>'
# 3: Which is greater?
s3 = '<p class="note">Circle the greater number.</p>'
s3 += '<div class="mgrid c2">'
pairs = [(23, 32), (45, 41), (67, 76), (88, 88)]
for left, right in pairs:
s3 += f'<div class="abox"><p style="font-size:16px;">{left} or {right}</p></div>'
s3 += '</div>'
# 4: Which is less?
s4 = '<p class="note">Circle the lesser number.</p>'
s4 += '<div class="mgrid c2">'
pairs = [(56, 65), (34, 39), (72, 71), (90, 90)]
for left, right in pairs:
s4 += f'<div class="abox"><p style="font-size:16px;">{left} or {right}</p></div>'
s4 += '</div>'
# 5: True or false?
s5 = '<p class="note">Write T for true, F for false.</p>'
s5 += '<div class="mgrid c2">'
statements = ["34 > 28", "45 < 42", "67 = 67", "89 > 98"]
for stmt in statements:
s5 += f'<div class="abox"><p style="font-size:16px;">{stmt} ___</p></div>'
s5 += '</div>'
return page(2, "Tuesday", "Comparing & Ordering Pairs",
f'''{sec(1, "Fill in the Symbol", s1)}
{sec(2, "Use Place Value", s2)}
{sec(3, "Which is Greater?", s3)}
{sec(4, "Which is Less?", s4)}
{sec(5, "True or False?", s5)}'''
)
# ═══════════════════════════════════════════════════
# WEDNESDAY — Ordering Numbers (Least to Greatest)
# ═══════════════════════════════════════════════════
def wednesday():
# 1: Order 3 numbers (least to greatest)
s1 = '<p class="note">Write the numbers from least to greatest.</p>'
s1 += '<div class="mgrid c2">'
sets = [[12, 18, 15], [34, 28, 31], [45, 49, 42], [23, 27, 21]]
for nums in sets:
s1 += f'<div class="abox"><p style="font-size:14px;">{nums[0]}, {nums[1]}, {nums[2]}</p><p>{b("5em")} , {b("5em")} , {b("5em")}</p></div>'
s1 += '</div>'
# 2: Order 3 numbers (greatest to least)
s2 = '<p class="note">Write the numbers from greatest to least.</p>'
s2 += '<div class="mgrid c2">'
sets = [[23, 28, 25], [41, 47, 44], [56, 52, 59], [34, 31, 38]]
for nums in sets:
s2 += f'<div class="abox"><p style="font-size:14px;">{nums[0]}, {nums[1]}, {nums[2]}</p><p>{b("5em")} , {b("5em")} , {b("5em")}</p></div>'
s2 += '</div>'
# 3: Order 4 numbers (least to greatest)
s3 = '<p class="note">Write from least to greatest.</p>'
s3 += '<div class="mgrid c2">'
sets = [[12, 19, 15, 17], [34, 31, 38, 36]]
for nums in sets:
s3 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 4)}</p></div>'
s3 += '</div>'
# 4: Order 4 numbers (greatest to least)
s4 = '<p class="note">Write from greatest to least.</p>'
s4 += '<div class="mgrid c2">'
sets = [[45, 42, 48, 41], [23, 29, 26, 21]]
for nums in sets:
s4 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 4)}</p></div>'
s4 += '</div>'
# 5: Order 5 numbers (challenge)
s5 = '<p class="note">Challenge: Order from least to greatest.</p>'
s5 += '<div class="mgrid c2">'
sets = [[12, 18, 15, 11, 19], [34, 31, 38, 36, 33]]
for nums in sets:
s5 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 5)}</p></div>'
s5 += '</div>'
return page(2, "Wednesday", "Ordering Numbers",
f'''{sec(1, "Least to Greatest (3)", s1)}
{sec(2, "Greatest to Least (3)", s2)}
{sec(3, "Least to Greatest (4)", s3)}
{sec(4, "Greatest to Least (4)", s4)}
{sec(5, "Challenge (5 numbers)", s5)}'''
)
# ═══════════════════════════════════════════════════
# THURSDAY — Real Life Comparing
# ═══════════════════════════════════════════════════
def thursday():
# 1: Word problems - comparing
s1 = '<div class="wp">'
s1 += '<p>Sarah has 23 stickers. Tom has 31 stickers. Who has more? ' + b('6em') + '</p>'
s1 += '<p>Lily read 45 pages. Jake read 42 pages. Who read more? ' + b('6em') + '</p>'
s1 += '<p>Maya has 18 blocks. Sam has 28 blocks. Who has fewer? ' + b('6em') + '</p>'
s1 += '</div>'
# 2: Compare collections
s2 = '<p class="note">Fill in <, >, or =.</p>'
s2 += '<div class="mgrid c2">'
s2 += '<div class="abox"><p>Class A has 24 students. Class B has 27 students.</p><p>24 ___ 27</p></div>'
s2 += '<div class="abox"><p>Box A has 56 apples. Box B has 48 apples.</p><p>56 ___ 48</p></div>'
s2 += '<div class="abox"><p>Store A sells for $35. Store B sells for $42.</p><p>35 ___ 42</p></div>'
s2 += '<div class="abox"><p>Team A scored 67 points. Team B scored 67 points.</p><p>67 ___ 67</p></div>'
s2 += '</div>'
# 3: Height comparison
s3 = '<p class="note">Compare heights in inches.</p>'
s3 += '<div class="mgrid c2">'
s3 += '<div class="abox"><p>Tom is 42 inches tall. Sarah is 45 inches tall.</p><p>Who is taller? ' + b('6em') + '</p></div>'
s3 += '<div class="abox"><p>Maya is 38 inches tall. Jake is 40 inches tall.</p><p>Who is shorter? ' + b('6em') + '</p></div>'
s3 += '</div>'
# 4: Distance comparison
s4 = '<p class="note">Compare distances in meters.</p>'
s4 += '<div class="mgrid c2">'
s4 += '<div class="abox"><p>School is 125 meters from home. Park is 98 meters from home.</p><p>Which is farther? ' + b('6em') + '</p></div>'
s4 += '<div class="abox"><p>Store A is 67 meters away. Store B is 76 meters away.</p><p>Which is closer? ' + b('6em') + '</p></div>'
s4 += '</div>'
# 5: Age comparison
s5 = '<div class="starbox"><p><b>Age Comparison</b></p>'
s5 += '<p>Grandma is 65 years old. Grandpa is 68 years old. Who is older? ' + b('6em') + '</p>'
s5 += '<p>Mom is 42 years old. Dad is 45 years old. Who is younger? ' + b('6em') + '</p></div>'
return page(2, "Thursday", "Real Life Comparing",
f'''{sec(1, "Word Problems", s1)}
{sec(2, "Compare Collections", s2)}
{sec(3, "Height Comparison", s3)}
{sec(4, "Distance Comparison", s4)}
{sec(5, "Age Comparison", s5)}'''
)
# ═══════════════════════════════════════════════════
# FRIDAY — Week 3 Review & Challenge
# ═══════════════════════════════════════════════════
def friday():
# 1: Quick symbol review
s1 = '<p class="note">Fill in <, >, or =.</p>'
s1 += '<div class="mgrid c3">'
pairs = [(34, 43), (56, 56), (78, 67), (29, 31), (45, 42), (90, 89)]
for left, right in pairs:
s1 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
s1 += '</div>'
# 2: Order least to greatest
s2 = '<p class="note">Order from least to greatest.</p>'
s2 += '<div class="mgrid c2">'
sets = [[23, 28, 21], [45, 42, 48], [34, 39, 36]]
for nums in sets:
s2 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 3)}</p></div>'
s2 += '</div>'
# 3: Order greatest to least
s3 = '<p class="note">Order from greatest to least.</p>'
s3 += '<div class="mgrid c2">'
sets = [[56, 52, 59], [34, 31, 38], [67, 62, 65]]
for nums in sets:
s3 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 3)}</p></div>'
s3 += '</div>'
# 4: True or false review
s4 = '<p class="note">Write T for true, F for false.</p>'
s4 += '<div class="mgrid c2">'
statements = ["56 > 65", "34 < 43", "78 = 78", "29 > 31"]
for stmt in statements:
s4 += f'<div class="abox"><p style="font-size:16px;">{stmt} ___</p></div>'
s4 += '</div>'
# 5: Challenge word problems
s5 = '<div class="wp">'
s5 += '<p>Emma has 34 stickers. Jake has 28 stickers. Lily has 42 stickers. Order their names from least to greatest stickers.</p>'
s5 += '<p>' + b('6em') + ', ' + b('6em') + ', ' + b('6em') + '</p>'
s5 += '<p>Tom ran 156 meters. Sam ran 165 meters. Mike ran 159 meters. Who ran the farthest? ' + b('6em') + '</p>'
s5 += '</div>'
return page(2, "Friday", "Week 3 Review & Challenge",
f'''{sec(1, "Symbol Review", s1)}
{sec(2, "Least to Greatest", s2)}
{sec(3, "Greatest to Least", s3)}
{sec(4, "True or False", s4)}
{sec(5, "Challenge Problems", s5)}'''
)
# ═══════════════════════════════════════════════════
# COMBINED TEACHER GUIDE
# ═══════════════════════════════════════════════════
def teacher_guide():
"""Generate combined teacher guide for all 5 days."""
return tg_page_multi(
"Week 3", "Comparing & Ordering Numbers — Teacher Guide",
# Monday
tg_section_title("Monday: Introduction to <, >, =") +
tg_sec(1, "Learn Symbols", ["5>2", "3<7", "4=4"]) +
tg_sec(2, "Single Digits", [">", "<", "=", ">", "<", "="]) +
tg_sec(3, "Teen Numbers", ["<", ">", "=", ">", "<"]) +
tg_sec(4, "Two-Digit Numbers", [">", "<", "=", ">"]) +
tg_sec(5, "Draw Alligator", ["<", ">", "=", "<"]) +
tg_note("Page break"),
# Tuesday
tg_section_title("Tuesday: Comparing & Ordering Pairs") +
tg_sec(1, "Fill in Symbol", [">", "=", "<", ">", ">", ">"]) +
tg_sec(2, "Use Place Value", ["<", ">", ">"]) +
tg_sec(3, "Which Greater", ["32", "45", "76", "88 (equal)"]) +
tg_sec(4, "Which Less", ["56", "34", "71", "90 (equal)"]) +
tg_sec(5, "True or False", ["T", "F", "T", "F"]) +
tg_note("Page break"),
# Wednesday
tg_section_title("Wednesday: Ordering Numbers") +
tg_sec(1, "Least to Greatest (3)", ["12,15,18", "28,31,34", "42,45,49", "21,23,27"]) +
tg_sec(2, "Greatest to Least (3)", ["28,25,23", "47,44,41", "59,56,52", "38,34,31"]) +
tg_sec(3, "Least to Greatest (4)", ["12,15,17,19", "31,34,36,38"]) +
tg_sec(4, "Greatest to Least (4)", ["48,45,42,41", "29,26,23,21"]) +
tg_sec(5, "Challenge (5)", ["11,12,15,18,19", "31,33,34,36,38"]) +
tg_note("Page break"),
# Thursday
tg_section_title("Thursday: Real Life Comparing") +
tg_sec(1, "Word Problems", ["Tom", "Lily", "Maya"]) +
tg_sec(2, "Compare Collections", ["<", ">", "<", "="]) +
tg_sec(3, "Height Comparison", ["Sarah", "Maya"]) +
tg_sec(4, "Distance Comparison", ["School", "Store A"]) +
tg_sec(5, "Age Comparison", ["Grandpa", "Mom"]) +
tg_note("Page break"),
# Friday
tg_section_title("Friday: Week 3 Review & Challenge") +
tg_sec(1, "Symbol Review", ["<", "=", ">", "<", ">", ">"]) +
tg_sec(2, "Least to Greatest", ["21,23,28", "42,45,48", "34,36,39"]) +
tg_sec(3, "Greatest to Least", ["59,56,52", "38,34,31", "67,65,62"]) +
tg_sec(4, "True or False", ["F", "T", "T", "F"]) +
tg_sec(5, "Challenge", ["Jake, Emma, Lily", "Sam"])
)
# ═══════════════════════════════════════════════════
# GENERATE
# ═══════════════════════════════════════════════════
if __name__ == "__main__":
# Generate all days at once
days = [
(monday, "Monday", "Introduction to <, >, ="),
(tuesday, "Tuesday", "Comparing & Ordering Pairs"),
(wednesday, "Wednesday", "Ordering Numbers"),
(thursday, "Thursday", "Real Life Comparing"),
(friday, "Friday", "Week 3 Review & Challenge"),
]
# Generate student worksheets
for lesson_func, day, title in days:
html = lesson_func()
fname = f"Week_3_{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}")
# Generate combined teacher guide
html = teacher_guide()
path = os.path.join(WEEK, "Week_3_Teacher_Guide.html")
with open(path, "w") as f:
f.write(html)
pdf_path = os.path.join(WEEK, "Week_3_Teacher_Guide.pdf")
HTML(filename=path).write_pdf(pdf_path)
print(f"Generated: {pdf_path}")
print("Week 3 complete!")