# Hackertours Web Site ## Complete the checkout We need the submodule for the theme, so update/clone the submodules: ```shell git submodule update --init --recursive ``` ## Run in dev mode ```shell hugo server --buildFuture --buildDrafts ``` Then open http://localhost:1313 ## Shortcode: Language badge Use the `lang` shortcode to mark whether a tour is in German, English or bilingual. It renders a small superscript badge next to the text, with details when hovered over or parsed by a screenreader. - German: `{{< lang de >}}` - English: `{{< lang en >}}` - Bilingual: `{{< lang deen >}}` ## Shortcode: Tour schedule The tour overview of an event (`content/*//_index.md`) shows the schedule with `{{< schedule >}}`. It reads `data/schedule/.yaml`, which is shared by both languages: ```yaml days: - day: 1 date: "2025-12-27" tours: - { time: "11:30", tour: xfel, lang: deen } - { time: "12:00", tour: city-walk, lang: de } ``` - `tour` is the slug of the tour page in the event section. The card shows that page's title, without the event prefix, and links to it. - `lang` is `de`, `en` or `deen`, or a list of these. It renders the same badge as the `lang` shortcode. - `time` is `HH:MM` with a leading zero (`09:30`). Tours are sorted by time, so their order in the file doesn't matter. - `title` (optional) replaces the page's title on the card, with one entry per language: `title: { de: "Hafen am Abend", en: "Harbour by Night" }`. - `status` (optional): `soldout` marks the tour as fully booked. Other values are ignored. For the events managed with Hackertours-Admin, the data file is generated by its website sync; don't edit it by hand. Wide screens get one column per day on an hour grid, with tours that start at the same time side by side. The first column shows the hour wherever the first day has no tour in it. On narrow screens a day picker shows one day at a time, starting with today's day during the event. For a different event than the page's section, pass its name: `{{< schedule 39c3 >}}`. Without a data file, or without any tours in it, the shortcode renders nothing and the build logs a warning. To silence it, for example for an upcoming event, add `warning-schedule-empty` to `ignoreLogs` in `hugo.yaml`. ## Accessibility check CI runs [pa11y-ci](https://github.com/pa11y/pa11y-ci) with the axe and HTML_CodeSniffer rules for WCAG 2 AA on every push and pull request, in its own job (`accessibility`), so findings show up without blocking the deploy. To run the same check locally (needs Node.js, Python 3 and Chrome or Chromium): ```shell ./scripts/pa11y.sh ``` The script builds the site, serves it on `localhost:8080` and checks every page in the sitemaps, except the past events and the individual news posts, which are kept as they were. The list of skipped sections is `EXCLUDE` in [scripts/pa11y.sh](scripts/pa11y.sh); the rules are in [.pa11yci.json](.pa11yci.json). pa11y only checks the light colour scheme. Some things to keep in mind when writing pages: - Give every image an alt text that says what it shows. The image title is the photo credit (`![Alt text](photo.jpg "© Photographer")`); it is shown below the image. - Headings in a page start at `##`; `#` is the page title. - Don't put information only into images, like directions on a map; write it out as text as well.