From ac8055314cf58fc161fa711bc15273de131b9115 Mon Sep 17 00:00:00 2001 From: t0xa Date: Tue, 11 Nov 2025 09:58:07 +0300 Subject: [PATCH] Add calendar generator --- generate_calendar.py | 219 +++++++++++++++++++++++++++++++++++++++++++ lua/datetime.lua | 1 + 2 files changed, 220 insertions(+) create mode 100644 generate_calendar.py create mode 100644 lua/datetime.lua diff --git a/generate_calendar.py b/generate_calendar.py new file mode 100644 index 0000000..019ff46 --- /dev/null +++ b/generate_calendar.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python3 +""" +Configurable Calendar Generator for ODS format +Usage: python3 generate_calendar.py [year] [output_file] +Example: python3 generate_calendar.py 2026 calendar_2026.ods +""" + +from datetime import datetime, timedelta +import zipfile +import sys + +def create_calendar_ods(year, output_file): + month_names = ['January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December'] + day_headers = ['M', 'T', 'W', 'T', 'F', 'S', 'S'] + + def get_month_calendar(year, month): + """Returns list of weeks for a month, each week has 7 days (0 = empty)""" + first_day = datetime(year, month, 1) + first_weekday = first_day.weekday() # 0=Monday, 6=Sunday + + if month == 12: + last_day = 31 + else: + last_day = (datetime(year, month + 1, 1) - timedelta(days=1)).day + + weeks = [] + week = [0] * first_weekday + + for day in range(1, last_day + 1): + week.append(day) + if len(week) == 7: + weeks.append(week) + week = [] + + if week: + week.extend([0] * (7 - len(week))) + weeks.append(week) + + return weeks + + # Generate calendar for all months + month_rows_xml = "" + + for row in range(3): + start_month = row * 4 + 1 + months_in_row = [start_month, start_month + 1, start_month + 2, start_month + 3] + + # Title row + month_rows_xml += ' \n' + for month in months_in_row: + month_rows_xml += f' {month_names[month-1]} {year}\n' + month_rows_xml += ' \n' + month_rows_xml += ' \n' + + # Day headers + month_rows_xml += ' \n' + for month in months_in_row: + for day_header in day_headers: + month_rows_xml += f' {day_header}\n' + month_rows_xml += ' \n' + month_rows_xml += ' \n' + + # Get calendar data for all months + month_cals = [get_month_calendar(year, m) for m in months_in_row] + max_weeks = max(len(cal) for cal in month_cals) + + # Days + for week_idx in range(max_weeks): + month_rows_xml += ' \n' + + for month_idx, month in enumerate(months_in_row): + if week_idx < len(month_cals[month_idx]): + week = month_cals[month_idx][week_idx] + for day_idx, day in enumerate(week): + if day == 0: + month_rows_xml += ' \n' + else: + # Weekend is Saturday (day_idx=5) and Sunday (day_idx=6) + if day_idx >= 5: + month_rows_xml += f' {day}\n' + else: + month_rows_xml += f' {day}\n' + else: + for _ in range(7): + month_rows_xml += ' \n' + + month_rows_xml += ' \n' + + month_rows_xml += ' \n' + + month_rows_xml += ' \n' + + content_xml = f''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{month_rows_xml} + + + +''' + + manifest_xml = ''' + + + + + +''' + + styles_xml = ''' + +''' + + meta_xml = f''' + + + Calendar {year} + {datetime.now().isoformat()} + +''' + + with zipfile.ZipFile(output_file, 'w', zipfile.ZIP_DEFLATED) as ods: + ods.writestr('mimetype', 'application/vnd.oasis.opendocument.spreadsheet', compress_type=zipfile.ZIP_STORED) + ods.writestr('META-INF/manifest.xml', manifest_xml) + ods.writestr('content.xml', content_xml) + ods.writestr('styles.xml', styles_xml) + ods.writestr('meta.xml', meta_xml) + + print(f"✓ Calendar for {year} created: {output_file}") + +if __name__ == "__main__": + if len(sys.argv) < 2: + year = int(input("Enter year: ")) + output = f"calendar_{year}.ods" + else: + year = int(sys.argv[1]) + output = sys.argv[2] if len(sys.argv) > 2 else f"calendar_{year}.ods" + + try: + create_calendar_ods(year, output) + except Exception as e: + print(f"Error: {e}") + sys.exit(1) diff --git a/lua/datetime.lua b/lua/datetime.lua new file mode 100644 index 0000000..03d58af --- /dev/null +++ b/lua/datetime.lua @@ -0,0 +1 @@ +print(os.date("%Y-%m-%d"))