"""Build html to be served at agenda.blaise.zone.""" import os import pathlib import datetime __here__ = pathlib.Path(__file__).parent # consume org file -------------------------------------------------------------------------------- global latest_scheduled latest_scheduled = datetime.date.today() class Event: def __init__(self, line): global latest_scheduled # timestamp (start time) year, month, day = (int(s) for s in line.split("<")[1][0:10].split("-")) self.timestamp = datetime.date(year, month, day) if self.timestamp > latest_scheduled: latest_scheduled = self.timestamp # end time if "--<" in line: year, month, day = (int(s) for s in line.split("--<")[1][0:10].split("-")) self.end = datetime.date(year, month, day) if self.end > latest_scheduled: latest_scheduled = self.end else: self.end = None # time of day tod = line[line.find("<") + 1 : line.find(">")][15:] # description self.description = " ".join(filter(None, [tod, line.split(">")[-1].strip()])) org_fp = "/home/nginx/org/agenda.org" events = [] with open(org_fp, "r") as org: for line in org: line = line.strip() if not line: continue if not line[0] == "*": continue if ":private:" in line: continue if ":info:" in line: continue events.append(Event(line)) # create html ------------------------------------------------------------------------------------- today = datetime.date.today() if not os.path.isdir(__here__ / "public"): os.mkdir(__here__ / "public") head = """ agenda.blaise.zone """ with open(__here__ / "public" / "index.html", "w") as html: # header html.write("\n") html.write(head) html.write("\n") html.write("

blaise-agenda

\n") html.write("
") html.write("

") html.write("Welcome to my public agenda!
\n") html.write("All timestamps are in 'blaise-local-time'.
\n") html.write("Thanks for stopping by! —Blaise\n") html.write("

") # body monday = today - datetime.timedelta(days=today.weekday()) while True: year, week, day = monday.isocalendar() id = f"{year}-w{week}" html.write( f'

{year} W{week}

' ) for i in range(7): day = monday + datetime.timedelta(days=i) id = day.isoformat() html.write( f"

{day.isoformat()} {day.strftime('%A')}

" ) for event in events: if event.end: if event.timestamp <= day and event.end >= day: total = event.end - event.timestamp elapsed = total - (event.end - day) html.write( f"(day {elapsed.days+1}/{total.days+1}) {event.description}
" ) else: if event.timestamp == day: html.write(f"{event.description}
") # increment monday += datetime.timedelta(days=7) if monday > latest_scheduled: break # footer html.write("
") html.write("

") html.write(f"built {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')} UTC") html.write("

") html.write("CC0: no copyright") html.write(" (source)") html.write("
") html.write("

") html.write("\n") html.write("\n")