adjust styling and bump dates etc

This commit is contained in:
April John 2026-08-28 15:39:56 +02:00
commit a584a5252f
40 changed files with 678 additions and 294 deletions

Binary file not shown.

View file

@ -2,16 +2,16 @@
if [ $# -lt 2 ]; then
echo "Usage: $0 Mediawiki_Page_Name [page|post]"
exit
exit 1
fi
echo Converting $1...
echo "Converting $1..."
page=$(echo $1 | sed 's,/,_,g' | tr '[:upper:]' '[:lower:]')
page=$(printf '%s\n' "$1" | sed 's,/,_,g' | tr '[:upper:]' '[:lower:]')
hugo new $2/$page.md
hugo new "$2/$page.md"
curl -s "https://berlin.ccc.de/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=$1" \
| jq -r '.query.pages |..| objects|.["*"]' \
| sed '/null/d' \
| pandoc -f mediawiki -t markdown \
>> content/$2/$page.md
>> "content/$2/$page.md"

View file

@ -1,48 +1,60 @@
#!/usr/bin/env python3
import sys
import html
import logging
import locale
from dateutil.parser import parse
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone, date
from dateutil.rrule import rruleset, rrulestr
import icalendar
def _to_aware(dt):
"""Normalize a date or datetime to a timezone-aware UTC datetime."""
if isinstance(dt, date) and not isinstance(dt, datetime):
return datetime(dt.year, dt.month, dt.day, tzinfo=timezone.utc)
if dt.tzinfo is None:
return dt.replace(tzinfo=timezone.utc)
return dt.astimezone(timezone.utc)
def vevent_to_event(event, rrstart=None):
if rrstart == None:
begin = parse(event["DTSTART"].to_ical())
if rrstart is None:
begin = _to_aware(event["DTSTART"].dt)
else:
begin = rrstart
begin = _to_aware(rrstart)
return {
"name": event["SUMMARY"].to_ical(),
"url": event["URL"].to_ical(),
"name": str(event.get("SUMMARY", "")),
"url": str(event.get("URL", "")),
"begin": begin
}
def parse_single_event(event, start, end):
logging.info(f"Processing single event {event['SUMMARY'].to_ical().decode('utf-8')}")
dtstart = parse(event["DTSTART"].to_ical())
logging.info(f"Processing single event {event.get('SUMMARY', '')}")
dtstart = _to_aware(event["DTSTART"].dt)
if dtstart >= start and dtstart < end:
return vevent_to_event(event)
def parse_recurring_event(event, start, end):
logging.info(f"Processing recurring event {event['SUMMARY'].to_ical().decode('utf-8')}")
dtstart = parse(event["DTSTART"].to_ical())
logging.info(f"Processing recurring event {event.get('SUMMARY', '')}")
dtstart = _to_aware(event["DTSTART"].dt)
rs = rruleset()
rs.rrule(rrulestr(event["RRULE"].to_ical().decode("utf-8"), dtstart=dtstart))
if "EXDATE" in event.keys():
for exdate in event["EXDATE"]:
rs.exdate(parse(exdate.to_ical()))
exdates = event["EXDATE"]
if not isinstance(exdates, list):
exdates = [exdates]
for exdate_list in exdates:
for dt in exdate_list.dts:
rs.exdate(_to_aware(dt.dt))
events = []
for date in list(rs):
if date >= start and date < end:
events.append(vevent_to_event(event, date))
for dt in rs.between(start, end, inc=True):
events.append(vevent_to_event(event, dt))
return events
@ -70,26 +82,27 @@ def find_events(icsfilestr, start, end, num):
def format_events(events):
print("<table class=\"table table-condensed\">")
for event in events:
name = html.escape(event['name'])
url = html.escape(event['url'])
print(
"<tr>"
f"<td>{event['begin'].strftime('%A, %d.%m um %H:%M Uhr')}</td>"
f"<td><a href=\"{event['url'].decode('utf-8')}\">{event['name'].decode('utf-8')}</a></td>"
f"<td><a href=\"{url}\">{name}</a></td>"
"</tr>"
)
print("</table><!--/.table .table-condensed-->")
if __name__ == "__main__":
if len(sys.argv) < 3:
if len(sys.argv) < 4:
print(f"Usage: {sys.argv[0]} calendar max_days max_items")
sys.exit(-1)
sys.exit(1)
locale.setlocale(locale.LC_TIME, "de_DE.UTF-8")
calendar = sys.argv[1]
max_days = int(sys.argv[2])
max_items = int(sys.argv[3])
now = datetime.now()
now = datetime.now(timezone.utc)
events = find_events(calendar, now, now + timedelta(days=max_days), max_items)
format_events(events)

View file

@ -1,8 +1,8 @@
#!/usr/bin/env python3
import logging
from glob import glob
import pytz
import icalendar
@ -12,9 +12,12 @@ merged.add("prodid", "-//CCCB Calendar Generator//berlin.ccc.de//")
merged.add("version", "2.0")
for icsfilestr in glob("public/*/**/*.ics", recursive=True):
with open(icsfilestr, "r") as icsfile:
print(f"Importing {icsfilestr}")
calendars.append(icalendar.Calendar.from_ical(icsfile.read()))
try:
with open(icsfilestr, "r") as icsfile:
print(f"Importing {icsfilestr}")
calendars.append(icalendar.Calendar.from_ical(icsfile.read()))
except Exception as e:
logging.warning(f"Skipping {icsfilestr}: {e}")
for calendar in calendars:
for event in calendar.subcomponents: