Commit graph www/layouts
Author SHA1 Message Date
98c3207c00 Separate date and name in the upcoming events table
The two columns of the table on the start page touched each other, so the entry
read "Donnerstag, 27.08., 19:00 UhrClub Discordia".

The table is created with the classes "table table-condensed", which no
stylesheet of the site defines, and the table styling that the theme applies
inside prose addresses "tbody td". The table is delivered empty and its rows
are added through the DOM, where a tr appended to a table stays a direct child
instead of being put into a tbody the way the HTML parser would. The rows are
therefore outside of any tbody and the padding of the theme never applied.

Give the column holding the date its own padding, and keep the date on one
line, it is one piece of information and reads badly broken after the weekday.

The padding alone does not fit, though. The table stands in a prose column that
the theme limits to 65 characters so that running text stays readable, and a
date and the name of an event next to each other are wider than that, so the
names would be wrapped over several lines. Lift the limit off the column and
put it back on everything in it except the table, which leaves the table room
to grow while the heading and the paragraph around it keep their width.

That much space then has to be filled sensibly. The theme lays a table out as a
block, "table { display: block; overflow: auto }", so that a wide one can be
scrolled sideways, and a block fills its parent instead of shrinking to its
content the way a table does. Spanning the page the entries would all sit at
its left edge. Ask for the width of the content with fit-content, which the
automatic margins then centre.

Addressing the table by its id keeps all of this to the start page and takes
precedence over the theme, whose prose rules are written with :where() and
carry no specificity.

Measured in a browser at 1280, 768 and 500 pixels: date and name share one line
at the first two, the table is 602 pixels wide with the same distance left and
right, and at 500 the column is narrower than the table, so the table fills it
and only the longest name wraps. The page never scrolls sideways.

Fixes: c28f04c6e8 ("switch to ics files; make calendars work; fix some minor issues")
Assisted-by: Claude:claude-opus-5
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-08-22 21:40:20 +02:00
cb70a095b2 Parse the calendar with ical.js
The calendar page brought its own ICS parser and its own RRULE expansion. Both
only covered the cases that happened to be needed when they were written, and
the calendar has moved on since. Against the published calendar, for September
2026:

  Spieleabend  FREQ=WEEKLY;INTERVAL=2;BYDAY=SA  shown 05. 12. 19. 26., correct 05. 19.
  CCCB Plenum  FREQ=MONTHLY;BYDAY=TU;BYSETPOS=2 shown 01.,               correct 08.
  CCCB Plenum  FREQ=MONTHLY;BYDAY=TU;BYSETPOS=4 shown 01.,               correct 22.

INTERVAL was only read for monthly rules, so the Spieleabend was shown twice as
often as it takes place. BYSETPOS was not implemented at all, and since
parseInt("TU") is NaN the fallback turned both Plenum rules into "first
Tuesday", putting two Plenums on a day without one and none on the two days
with one. UNTIL, COUNT, EXDATE, RECURRENCE-ID, BYMONTHDAY and a BYDAY listing
more than one weekday were not handled either.

The text was no better. Content lines longer than 75 characters are continued
on the next line, of which there are 477 in the calendar, and the parser did
not join them, so it cut values off in the middle of a word. It also split
every line at the first colon, which lands inside the parameter of
DESCRIPTION;ALTREP="data:text/html,...". And it never resolved the escaping, so
"\n" was shown as those two characters. 30 of 31 descriptions were wrong:

  before: "Der Club Discordia ist ein öffentliches Treffen in den Clubr"
  after:  "Der Club Discordia ist ein öffentliches Treffen in den Clubräumen des CCC Berlin"

Hand the parsing and the expansion to ical.js, which is vendored for the start
page anyway. The month view now asks the library for the occurrences that touch
the month, which removes the reimplementation along with all of the above.

While the events are being reduced to what the view needs:

- An event is entered on every day it covers, so the Amateurfunk trip from
  30.10. to 01.11. is no longer marked on 30.10. alone. The end of an event is
  not part of it, so one ending at midnight stays on the day before.
- Days and times are derived in Europe/Berlin instead of from the digits of the
  ICS string. Every event currently carries TZID=Europe/Berlin, so the wall
  clock time shown does not change, but a UTC timestamp would have been shown
  in UTC.
- The URL of the event is used for the link in the detail panel. Events without
  one are shown without a link, as on the start page. This replaces
  createEventLink(), which guessed URLs from the title and was never called,
  and the panel no longer builds an <h> element, which is not an element.

Descriptions may contain line breaks, so keep them in the panel.

Fixes: 4068fab565 ("improved calendar and fixed url temporarily")
Assisted-by: Claude:claude-opus-5
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-08-22 21:40:20 +02:00
8745b246e6 Vendor ical.js instead of loading it from unpkg.com
The upcoming events table pulled its ICS parser straight from a CDN with
`import ICAL from "https://unpkg.com/ical.js/dist/ical.min.js"`. That sends
every visitor of the start page to unpkg.com, which hands their IP address and
user agent to a third party before any of our own code runs. The URL is not
even pinned to a version, so whatever ical.js publishes next is executed on our
site without anybody looking at it, and the start page silently breaks when the
CDN is unreachable.

Check the parser into `assets/js/vendor/` and let Hugo bundle it. This is what
`js.Build` is for: it runs the esbuild that is built into Hugo, so it resolves
the import at build time and needs no node_modules and no extra tooling in the
build environment. The result is minified and fingerprinted like the other
scripts of the site, and the script tag carries a subresource integrity hash.

Since the bundle now has a content hash in its name, its URL cannot be written
by hand in the markdown any more. Move the table and the script tag into an
`upcoming` shortcode, which is the same pattern `calendar.html` already uses,
and move `upcoming.js` from `static/` to `assets/` so Hugo can process it.

The vendored file is the unminified `dist/ical.js` of the pinned release: it
carries the MPL-2.0 header and is the source form of what we ship, and Hugo
minifies it for delivery anyway. `assets/js/vendor/README.md` records the
version, where it came from and how to update it.

The built bundle renders the same table as before, checked against
https://berlin.ccc.de/calendars/all.ics.

Fixes: c28f04c6e8 ("switch to ics files; make calendars work; fix some minor issues")
Assisted-by: Claude:claude-opus-5
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-08-22 21:22:11 +02:00
9363618157 Behebe Layoutauswahl unter aktuellem Hugo.
Die layouts/_default/*.calendar.html-Vorlagen werden in Hugo
≥0.158 fälschlich für die HTML-Ausgabe ausgewählt, sodass alle
Sektions- und Einzelseiten VCALENDAR- statt HTML-Inhalt
enthielten. Die Vorlagen waren ohnehin nie funktionsfähig
(Warnung „found no layout file for calendar"); die ICS-Feeds
liefern die abschnittsspezifischen Vorlagen unter
layouts/{veranstaltungen,datengarten,page}/.

list.xml.html bekommt aus demselben Grund die korrekte Endung
.xml.

tools/gen_upcoming.py vergleicht Datumsangaben jetzt
zeitzonenneutral, damit Events mit Z-Suffix keinen TypeError
auslösen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-07-04 22:22:53 +02:00
murmeldin
1e245cf6cd newly added club status, currently disabled until spaceapi is set public 2025-04-17 00:48:03 +02:00
murmeldin
6281666093 datengarten post design overhaul 2025-04-17 00:45:32 +02:00
murmeldin
ccdaa9d95d fixed config + ics timezone 2025-04-16 18:36:08 +02:00
Marek Krug
5db017f998 Neues Template Datengarten talk infobox und kleine Korrektur 2025-03-31 20:04:11 +02:00
Marek Krug
2b5277a3a0 fixed ics generation 2025-03-12 17:41:44 +01:00
Marek Krug
4068fab565 improved calendar and fixed url temporarily 2025-03-12 16:06:29 +01:00
Vinzenz Schroeter
fabc5ff0ea fix naming conflict to restore old gallery with thumbnails 2025-03-10 17:40:10 +01:00
Marek Krug
1cd3099e37 favicons 2025-02-27 23:27:39 +01:00
Marek Krug
ba414b0015 new images, new content, new theme almost finished 2025-02-27 00:21:42 +01:00
Marek Krug
b62b53674f new theme (work in progress) 2025-02-26 19:47:07 +01:00
8fbd620e63 fix: update templates 2024-10-17 00:01:56 +02:00
f80ce7c40a
reformat html end tags 2023-06-13 21:41:28 +02:00
2e3a02af0c
refacture all the things! 2023-06-13 12:47:07 +02:00
0ee7913adb End regular Datengarten in 2019 2022-06-13 22:19:16 +02:00
ae512a738e Information über Umbau 2019-08-14 11:46:27 +02:00
de5e2ea51c ICS: Link als DETAILS text 2018-07-19 21:51:03 +02:00
48d93b0986 Talk Infobox: Sprachen ausschreiben 2018-07-19 21:50:03 +02:00
b36d187b37 Generate ics files correctly, incl. merged all.ics 2018-07-13 00:03:45 +02:00
a01afb2dd3 Calendars for all events
(to be tested)
2018-07-09 01:44:11 +02:00
a3f03d2273 Fix schedule.xml rendering 2018-06-11 22:49:04 +02:00
dd4e68b439 Datengärten regelmäßig ohne Titel anzeigen...
...außer es gibt einen Eintrag, dann nur diesen anzeigen.
2018-06-11 21:22:47 +02:00
ff62faf23a Move out datengartens into their own section
- /datengarten/index.html returns a blog-like list
- /datengarten/index.ics returns a VCALENDAR
- /datengarten/index.xml returns a schedule.xml-style view

No more pretty rendering includes in the content pages,
some more cleanup in the front matter
2018-05-21 18:31:39 +02:00
adb1819fb6 More concise location for CCCB 2018-05-20 15:55:44 +02:00
7ebb0231c9 Link speakers 2018-05-20 15:55:06 +02:00
6df3c9e8ba Fix icons in infobox 2018-05-20 14:29:34 +02:00
2b111b73ae Correct Series sorting, show correct icon for episodes without recording 2018-05-20 14:28:44 +02:00
c93bd4c6e6 Datengarten als Serie, Nr. 88 als Beispiel.
Fuer andere braucht es noch ein Import-Script.
2018-05-18 13:36:00 +02:00