91 lines
2.8 KiB
Python
Executable File
91 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
from datetime import date
|
|
from collections import defaultdict
|
|
from sys import argv, exit, stderr
|
|
from calendar import Calendar, month_name, day_abbr
|
|
|
|
def HTMLCalendarMonthWithEntries(year, month, entries=[], weekday_start=6):
|
|
cal = Calendar(weekday_start)
|
|
returnable = [
|
|
'<table class="calendar-month">',
|
|
"<thead>",
|
|
'<tr><th colspan="7">', month_name[month], " - ", str(year), "</th></tr>\n",
|
|
"<tr>",
|
|
*[
|
|
f"<th>{day_abbr[(i+weekday_start)%7]}</th>"
|
|
for i in range(7)
|
|
],
|
|
"</tr>\n"
|
|
"</thead>\n",
|
|
"<tbody>\n",
|
|
]
|
|
for week in cal.monthdays2calendar(year, month):
|
|
returnable.append("<tr>")
|
|
for day, weekday in week:
|
|
returnable.append(
|
|
"<td></td>"
|
|
if day == 0
|
|
else f"<td>{day}</td>"
|
|
if (d := date(year, month, day)) not in entries
|
|
else f'<td><a href="{d.isoformat()}.html">{day}</a></td>'
|
|
)
|
|
returnable.append("</tr>\n")
|
|
returnable.extend([
|
|
"</tbody>\n",
|
|
"</table>",
|
|
])
|
|
return "".join(returnable)
|
|
|
|
|
|
def generate_index_full(diary_entries):
|
|
entries_by_month = defaultdict(list)
|
|
for entry in diary_entries:
|
|
entries_by_month[(entry.year, entry.month)].append(entry)
|
|
months = sorted(entries_by_month.keys(), key=lambda x: "%02d-%02d" % x, reverse=False)
|
|
prev_year = None
|
|
for month in months:
|
|
year, _month = month
|
|
if prev_year != year:
|
|
print("\n## ", year, "{.calendar-container}\n")
|
|
# print("<hr/>")
|
|
prev_year = year
|
|
print(HTMLCalendarMonthWithEntries(*month, entries_by_month[month]))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
diary_dir = Path(argv[1])
|
|
if not diary_dir.is_dir():
|
|
raise Exception()
|
|
except:
|
|
print("Please provide a valid path for diary source.")
|
|
exit(1)
|
|
try:
|
|
build_dir = Path(argv[2])
|
|
if not build_dir.is_dir():
|
|
build_dir.mkdir(parents=True)
|
|
except:
|
|
print("Please provide a valid path for diary build.")
|
|
exit(1)
|
|
diary_entries = [
|
|
date.fromisoformat(p.stem) for p in diary_dir.iterdir()
|
|
]
|
|
if 'list-months' in argv:
|
|
pass
|
|
if 'list-weeks' in argv:
|
|
pass
|
|
if 'index-files' in argv:
|
|
targets = set([
|
|
"index.html",
|
|
*[f"{d.year}.html" for d in diary_entries],
|
|
*["%d-%02d.html" % (d.year, d.month) for d in diary_entries],
|
|
])
|
|
for t in targets:
|
|
print(str(build_dir / t))
|
|
if 'index-full' in argv:
|
|
generate_index_full(diary_entries)
|
|
if 'index-years' in argv:
|
|
generate_index_years(diary_entries)
|
|
|