summaryrefslogtreecommitdiff
path: root/build.py
diff options
context:
space:
mode:
Diffstat (limited to 'build.py')
-rw-r--r--build.py119
1 files changed, 119 insertions, 0 deletions
diff --git a/build.py b/build.py
new file mode 100644
index 0000000..f4ee289
--- /dev/null
+++ b/build.py
@@ -0,0 +1,119 @@
+"""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 = """<html>
+<head>
+ <meta charset="utf-8" name="viewport" content="width=80ch">
+ <title>agenda.blaise.zone</title>
+ <link rel="stylesheet" href="style.css">
+</head>
+"""
+
+with open(__here__ / "public" / "index.html", "w") as html:
+ # header
+ html.write("<!DOCTYPE html>\n")
+ html.write(head)
+ html.write("<body>\n")
+ html.write("<h1><a href='http://blaise.zone'>blaise</a>-agenda</h1>\n")
+ html.write("<hr>")
+ html.write("<p>")
+ html.write("Welcome to my public agenda!<br>\n")
+ html.write("All timestamps are in 'blaise-local-time'.<br>\n")
+ html.write("Thanks for stopping by! —Blaise\n")
+ html.write("</p>")
+ # body
+ monday = today - datetime.timedelta(days=today.weekday())
+ while True:
+ year, week, day = monday.isocalendar()
+ id = f"{year}-w{week}"
+ html.write(
+ f'<h2 id="{id}"><a href=#{id} style=color:#f0c674>{year} W{week}</a></h2>'
+ )
+ for i in range(7):
+ day = monday + datetime.timedelta(days=i)
+ id = day.isoformat()
+ html.write(
+ f"<h3 id={id}><a href=#{id}>{day.isoformat()} {day.strftime('%A')}</a></h3>"
+ )
+ 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}<br>"
+ )
+ else:
+ if event.timestamp == day:
+ html.write(f"{event.description}<br>")
+ # increment
+ monday += datetime.timedelta(days=7)
+ if monday > latest_scheduled:
+ break
+ # footer
+ html.write("<hr>")
+ html.write(f"last updated {today.isoformat()}")
+ html.write("</body>\n")
+ html.write("</html>\n")