import xml.etree.ElementTree as ET
import datetime
def ordinal(n):
if 11 <= n % 100 <= 13:
suffix = 'th'
else:
suffix = {1: 'st', 2: 'nd', 3: 'rd'}.get(n % 10, 'th')
return str(n) + suffix
def generate_weekly_opml(week_num, year=2025):
start_date = datetime.date(year, 1, 1) + datetime.timedelta(weeks=week_num-1)
start_date = start_date - datetime.timedelta(days=start_date.weekday())
# start_date = start_date - datetime.timedelta(days=start_date.weekday() + 1)
day_date = start_date
weekday = day_date.strftime('%A')
week_outline = ET.Element(
"outline",
text=f"2025 Week {week_num}",
_note=f""
)
empty = ET.SubElement(week_outline, "outline", text="")
for i in range(7):
day_date = start_date + datetime.timedelta(days=i)
weekday = day_date.strftime('%A')
day_outline = ET.SubElement(
week_outline,
"outline",
text=f"{weekday} {ordinal(day_date.day)} {day_date.strftime('%b')}",
_note=f""
)
if weekday in ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']:
outline = ET.SubElement(day_outline, "outline", text="")
return week_outline
def get_color(weekday):
colors = {
"Sunday": "purple",
"Monday": "red",
"Tuesday": "teal",
"Wednesday": "pink",
"Thursday": "green",
"Friday": "yellow",
"Saturday": "sky"
}
return colors.get(weekday, "gray")
def create_opml_for_year_and_first_week_2026():
root_opml = ET.Element("opml", version="2.0")
head = ET.SubElement(root_opml, "head")
owner_email = ET.SubElement(head, "ownerEmail")
owner_email.text = "contact@gregoryleeman.com"
body = ET.SubElement(root_opml, "body")
for week_num in range(1, 53):
week_opml = generate_weekly_opml(week_num)
body.append(week_opml)
week_2026_opml = generate_weekly_opml(1, year=2026)
body.append(week_2026_opml)
tree = ET.ElementTree(root_opml)
return tree
def save_opml_to_file(filename="diary.opml"):
tree = create_opml_for_year_and_first_week_2026()
tree.write(filename, encoding="utf-8", xml_declaration=True)
save_opml_to_file()