chaosevents/chaosevents.py

78 lines
1.9 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)
(out_path / "index.html").write_text(
env.get_template("index.html").render(
currentevents=t.now() if any(t.now()) else None,
upcomingevents=t.start_after(arrow.utcnow())
)
)
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()