108 lines
2.7 KiB
Python
Executable File
108 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import arrow
|
|
from ics import Calendar
|
|
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
|
from markdown2 import Markdown
|
|
from pathlib import Path
|
|
import re
|
|
import requests
|
|
import sys
|
|
|
|
basepath = Path(__file__).resolve().parent
|
|
|
|
env = Environment(
|
|
loader=FileSystemLoader(basepath / "templates"),
|
|
autoescape=select_autoescape()
|
|
)
|
|
|
|
def render_markdown(text):
|
|
pattern = re.compile(
|
|
r"""
|
|
\b
|
|
(
|
|
(?:https?://|(?<!//)www\.) # prefix - https:// or www.
|
|
\w[\w_\-]*(?:\.\w[\w_\-]*)* # host
|
|
[^<>\s"']* # rest of url
|
|
(?<![?!.,:*_~);]) # exclude trailing punctuation
|
|
(?=[?!.,:*_~);]?(?:[<\s]|$)) # make sure that we're not followed by " or ', i.e. we're outside of href="...".
|
|
)
|
|
""",
|
|
re.X
|
|
)
|
|
|
|
markdown = Markdown(
|
|
extras=["link-patterns"],
|
|
link_patterns=[(pattern, r'\1')]
|
|
)
|
|
|
|
return markdown.convert('' if text is None else text)
|
|
|
|
def main(ics_url, out_path):
|
|
|
|
(out_path / "style.css").write_text((basepath / "assets" / "style.css").read_text())
|
|
|
|
r = requests.get(ics_url)
|
|
|
|
|
|
c = Calendar(r.text)
|
|
t = c.timeline
|
|
|
|
for e in t:
|
|
e.description_rendered = render_markdown(e.description)
|
|
|
|
(out_path / "chaosevents.ics").write_text(r.text)
|
|
|
|
events_by_year = {}
|
|
|
|
for event in t:
|
|
if event.begin.year not in events_by_year:
|
|
events_by_year[event.begin.year] = []
|
|
events_by_year[event.begin.year].append(event)
|
|
|
|
years_index = sorted(events_by_year.keys())
|
|
|
|
# Index page
|
|
|
|
sections = {}
|
|
if any(t.now()):
|
|
sections["Current"] = t.now()
|
|
sections["Upcoming"] = t.start_after(arrow.utcnow())
|
|
|
|
(out_path / "index.html").write_text(
|
|
env.get_template("index.html").render(
|
|
sections=sections,
|
|
years_index=years_index,
|
|
)
|
|
)
|
|
|
|
# Year pages
|
|
|
|
for year, year_events in events_by_year.items():
|
|
year_directory = out_path / "year" / str(year)
|
|
year_directory.mkdir(exist_ok=True, parents=True)
|
|
|
|
(year_directory / "index.html").write_text(
|
|
env.get_template("index.html").render(
|
|
title=f"Year {year}",
|
|
sections={f"Year {year}": year_events},
|
|
years_index=years_index,
|
|
)
|
|
)
|
|
|
|
|
|
def cli():
|
|
ics_url = "https://cloud.fem.tu-ilmenau.de/remote.php/dav/public-calendars/Q58G8xM52HXPc6Jj/?export"
|
|
|
|
out_path = Path("html")
|
|
|
|
if len(sys.argv) > 1:
|
|
out_path = Path(sys.argv[1])
|
|
|
|
out_path.mkdir(exist_ok=True)
|
|
|
|
main(ics_url, out_path)
|
|
|
|
if __name__ == "__main__":
|
|
cli()
|