From 7604cd637895462a87e9a5b35d215259d291ed91 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:03:52 +0000 Subject: [PATCH 01/11] edit navbars --- _quarto.yml | 6 ++---- index.qmd | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/_quarto.yml b/_quarto.yml index e6722f1..97af962 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -25,6 +25,8 @@ website: - icon: github url: https://github.com/DHBern/dhbern.github.io/ left: + - text: Events + href: /#events - text: Studies href: https://www.dh.unibe.ch/studium/index_ger.html - text: Research @@ -43,10 +45,6 @@ website: style: 'docked' collapse-level: 1 contents: - - text: Blog - href: / - - text: Events - href: /#events - text: Projects href: content/projects/index.qmd contents: content/projects/*/index.qmd diff --git a/index.qmd b/index.qmd index a6d39b6..3e2e4ad 100644 --- a/index.qmd +++ b/index.qmd @@ -1,6 +1,7 @@ --- title: "Digital Humanities Bern" title-block: false +sidebar: false listing: - id: blog contents: content @@ -18,7 +19,7 @@ listing: sort-ui: false filter-ui: false fields: [event-date, title, location, author] - field-display-names: + field-display-names: event-date: 'Date' title: 'Title' location: 'Location' From 1e2448274eb047854e1faced68c85dc1b7e07bcb Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:04:09 +0000 Subject: [PATCH 02/11] add copilot instructions for AI Agents --- .github/copilot-instructions.md | 121 ++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..a221f76 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,121 @@ +# Project Guidelines — dhbern.github.io + +Academic website for the Digital Humanities department at the University of Bern. Built with **Quarto** and hosted on **GitHub Pages**. + +## Architecture + +- **Quarto website** (`_quarto.yml`) with listings-driven homepage +- Content lives in `content/` with four main types: `posts/`, `events/`, `projects/`, `services/` +- `content/intro-lecture/` is a special synced section (from external repo via GitHub Actions) — do not edit directly +- Styling: `_brand.yml` → `custom.scss` → `styles.css` (Bootstrap + brand tokens + custom SCSS) +- Static assets (fonts) in `assets/fonts/` + +## Build & Dev + +```bash +npm install # Node deps (Prettier, git-cliff) +uv sync # Python environment +npm run check # Lint with Prettier +npm run format # Auto-format with Prettier +uv run quarto preview # Local dev server +uv run quarto render # Full build → _site/ +``` + +CI runs `npm run check` (lint) then Quarto render on every push to `main`. + +## Content Conventions + +### Folder naming + +- Posts: `content/posts/YYYYMMDD-short-slug/index.qmd` +- Events: `content/events/YYYYMMDD-short-slug/index.qmd` +- Projects: `content/projects/short-slug/index.qmd` +- Services: `content/services/short-slug/index.qmd` + +### Frontmatter patterns + +Every content page needs `title` and `categories` for listings to work. + +**Post:** + +```yaml +title: 'Post Title' +author: 'Author Name' +date: '2025.04.02' +categories: [Post] +``` + +**Event:** + +```yaml +title: 'Event Title' +subtitle: 'Optional subtitle' +event-date: '2025-04-30' +date: '2025-04-25' +categories: [Event] +location: 'Room, Building, City' +author: 'Organizer' +``` + +**Project:** + +```yaml +title: 'Project Name' +subtitle: 'Short description' +image: image.png +author: + - name: 'Researcher' + orcid: '0000-0000-0000-0000' +categories: [Project] +``` + +**Service:** + +```yaml +title: 'Service Name' +author: 'Team' +categories: [Services] +``` + +Note: Services category is `Services` (plural), while others are singular (`Post`, `Event`, `Project`). + +### Author field + +Can be a plain string or a structured object with `name`, `orcid`, `email`, `affiliations`, `role`. + +### Links + +Use `other-links` list for external resources: + +```yaml +other-links: + - text: 'GitHub Repository' + icon: github + href: https://github.com/example/repo +``` + +## Git Conventions + +- **Commit messages**: Conventional Commits — `feat:`, `fix:`, `doc:`, `refactor:`, `style:`, `test:`, `chore:`, `perf:` +- **Versioning**: SemVer. Changelog auto-generated by `git-cliff` +- **PRs**: Require discussion before opening; need 2 approvals. See [CONTRIBUTING.md](../CONTRIBUTING.md) + +## Key Files + +| File | Purpose | +| ---------------------------- | --------------------------------------- | +| `_quarto.yml` | Site config, navbar, sidebar, listings | +| `_brand.yml` | Brand colors and typography tokens | +| `custom.scss` | SCSS overrides (layout, navbar, footer) | +| `styles.css` | Font-face declarations, utility classes | +| `index.qmd` | Homepage with three listing sections | +| `content/projects/index.qmd` | Projects listing page | +| `content/services/index.qmd` | Services listing page | + +## Gotchas + +- `content/intro-lecture/` is **synced from an external repo** — edits here will be overwritten +- Date format varies: posts use `YYYY.MM.DD`, events use ISO `YYYY-MM-DD` for `event-date` +- The `freeze: auto` setting caches computed outputs — delete `_freeze/` if outputs seem stale +- Rendered site goes to `_site/` (gitignored) — do not commit build artifacts +- Primary brand color is `#d6002b` (University of Bern red) From eab3123872c7c41cbd33d468383d4c66984eed8b Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:21:45 +0000 Subject: [PATCH 03/11] fix: wrong date format --- .../index.qmd | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd b/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd index bf6c9ce..349d18c 100644 --- a/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd +++ b/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd @@ -1,19 +1,19 @@ --- title: "Linked Open Data in Dialogue (2023)" subtitle: "…in Dialogue — Digital Humanities, University of Bern" -date: 2023-11-15 -lang: en +date: "2023-11-15" +lang: "en" --- # Linked Open Data in Dialogue (2023) The event **Linked Open Data in Dialogue** took place on **15 November 2023** at the University of Bern. It was part of the *…in Dialogue* series and focused on the use, publication, and sustainability of Linked Open Data (LOD) in the Humanities and Social Sciences. -**Location:** Room 501 (Kuppelraum), Hochschulstrasse 4, 3012 Bern -**Format:** On‑site and online (Zoom) +**Location:** Room 501 (Kuppelraum), Hochschulstrasse 4, 3012 Bern\ +**Format:** On‑site and online (Zoom)\ **Language:** English ---- +------------------------------------------------------------------------ ## About the Event @@ -21,58 +21,57 @@ The event was jointly organized by the **Digital Humanities Unit** and the **Uni Special emphasis was placed on practical applications, interoperability, and the integration of research data into sustainable infrastructures such as **Geovistory** and **OntoME**. ---- +------------------------------------------------------------------------ ## Program ### Morning Session -**09:00 – Welcome** -Ursula Loosli, Stephen Hart, Tobias Hodel +**09:00 – Welcome**\ +Ursula Loosli, Stephen Hart, Tobias Hodel -**09:15 – 10:00** -*Linked Open Data for Research: Towards a Paradigm Shift in the Humanities and Social Sciences* -Francesco Beretta +**09:15 – 10:00**\ +*Linked Open Data for Research: Towards a Paradigm Shift in the Humanities and Social Sciences*\ +Francesco Beretta -**10:15 – 11:25 – Geovistory Workshops** -Parallel sessions for beginners and advanced users +**10:15 – 11:25 – Geovistory Workshops**\ +Parallel sessions for beginners and advanced users -**11:30 – 12:30 – Project Presentations** -- *The MURELCO Seminar – A Teaching Tool* — Matthieu Gillabert & Stephen Hart -- *The Processetti Inquiries (16th–17th c.)* — David Knecht -- *Switzerland and Beyond* — Tobias Hodel -- *Diaries of Anna Maria Preiswerk-Iselin* — Morgane Pica -- *OntoME – Ontology Management Environment* — Vincent Alamercery +**11:30 – 12:30 – Project Presentations** - *The MURELCO Seminar – A Teaching Tool* — Matthieu Gillabert & Stephen Hart\ +- *The Processetti Inquiries (16th–17th c.)* — David Knecht\ +- *Switzerland and Beyond* — Tobias Hodel\ +- *Diaries of Anna Maria Preiswerk-Iselin* — Morgane Pica\ +- *OntoME – Ontology Management Environment* — Vincent Alamercery ---- +------------------------------------------------------------------------ ### Afternoon Session -**14:00 – 15:15** -*Archival Descriptions as Linked Open Data: Why, How, and Where To* -Oliver Schihin +**14:00 – 15:15**\ +*Archival Descriptions as Linked Open Data: Why, How, and Where To*\ +Oliver Schihin -*Linked Open Data in Numismatics – nomisma.org and beyond* -Rahel C. Ackermann +*Linked Open Data in Numismatics – nomisma.org and beyond*\ +Rahel C. Ackermann -*LOD Pilot Project “Berner Ortsgeschichten”* -René Frei & Thomas Hayoz +*LOD Pilot Project “Berner Ortsgeschichten”*\ +René Frei & Thomas Hayoz -**15:45 – 17:00** -*Wikidata Hands-on: Introduction, Analysis and Visualization* -Benedikt Hitz-Gamper +**15:45 – 17:00**\ +*Wikidata Hands-on: Introduction, Analysis and Visualization*\ +Benedikt Hitz-Gamper -**17:00 – 17:15** -Closing remarks & Apéro -Tobias Hodel & Gero Schreier +**17:00 – 17:15**\ +Closing remarks & Apéro\ +Tobias Hodel & Gero Schreier ---- +------------------------------------------------------------------------ ## Contact -For further information, please contact: -**imdialog@ub.unibe.ch** +For further information, please contact:\ +**imdialog\@ub.unibe.ch** ---- +------------------------------------------------------------------------ -*This event was part of the “im Dialog” series by the Digital Humanities initiative at the University of Bern.* +*This event was part of the “im Dialog” series by the Digital Humanities initiative at the University of Bern.* \ No newline at end of file From 43e686ce642a67c6c9656fcb253715b7a375db03 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:42:11 +0000 Subject: [PATCH 04/11] add split of current and past events --- .gitignore | 4 ++ _quarto.yml | 1 + index.qmd | 27 ++++++++++-- pyproject.toml | 2 +- scripts/split-events.py | 98 +++++++++++++++++++++++++++++++++++++++++ uv.lock | 44 +++++++++++++++++- 6 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 scripts/split-events.py diff --git a/.gitignore b/.gitignore index 856ed52..0764901 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,10 @@ _site/ _freeze/ .venv/ +# Generated by pre-render script +upcoming-events.yml +past-events.yml + # Exclude example.env !example.env diff --git a/_quarto.yml b/_quarto.yml index 97af962..3ec67ea 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -1,5 +1,6 @@ project: type: website + pre-render: python scripts/split-events.py resources: - content/intro-lecture/quiz/questions.json - content/intro-lecture/quiz/exam-questions.h5p diff --git a/index.qmd b/index.qmd index 3e2e4ad..bac3976 100644 --- a/index.qmd +++ b/index.qmd @@ -10,12 +10,11 @@ listing: include: categories: Post - id: events - contents: content - include: - categories: Event + contents: + - upcoming-events.yml type: table categories: false - sort: "event-date desc" + sort: "event-date asc" sort-ui: false filter-ui: false fields: [event-date, title, location, author] @@ -24,6 +23,18 @@ listing: title: 'Title' location: 'Location' author: 'Organizer' + - id: past-events + contents: + - past-events.yml + type: table + categories: false + sort: "event-date desc" + fields: [event-date, title, location, author] + field-display-names: + event-date: 'Date' + title: 'Title' + location: 'Location' + author: 'Organizer' - id: projects contents: content type: grid @@ -55,6 +66,14 @@ We are a research and teaching unit at the University of Bern, connecting humani ::: {#events} ::: + +
+Past Events + +::: {#past-events} +::: + +
::: ::: {.home-section} diff --git a/pyproject.toml b/pyproject.toml index a9ce483..54a6e82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,4 +4,4 @@ version = "0.1.0" description = "This repository contains Digital Humanities at the University of Bern." readme = "README.md" requires-python = ">=3.13" -dependencies = [] +dependencies = ["pyyaml"] diff --git a/scripts/split-events.py b/scripts/split-events.py new file mode 100644 index 0000000..f71620d --- /dev/null +++ b/scripts/split-events.py @@ -0,0 +1,98 @@ +"""Pre-render script: split events into upcoming and past YAML listing files.""" + +from datetime import date +from pathlib import Path + +import yaml + +CONTENT_DIR = Path("content") +OUTPUT_DIR = Path(".") +TODAY = date.today() + + +def parse_frontmatter(path: Path) -> dict | None: + """Extract YAML frontmatter from a .qmd file.""" + text = path.read_text(encoding="utf-8") + if not text.startswith("---"): + return None + end = text.index("---", 3) + return yaml.safe_load(text[3:end]) + + +def _flatten_author(author) -> str: + """Convert author field (string, dict, or list) to a plain string.""" + if isinstance(author, str): + return author + if isinstance(author, dict): + return author.get("name", "") + if isinstance(author, list): + names = [a.get("name", "") if isinstance(a, dict) else str(a) for a in author] + return ", ".join(n for n in names if n) + return str(author) + + +def collect_events() -> list[dict]: + """Walk content/ for .qmd files with categories containing 'Event'.""" + events = [] + for qmd in CONTENT_DIR.rglob("*.qmd"): + fm = parse_frontmatter(qmd) + if fm is None: + continue + categories = fm.get("categories", []) + if isinstance(categories, str): + categories = [categories] + if "Event" not in categories: + continue + + event_date = fm.get("event-date") or fm.get("date") + if event_date is None: + continue + + # Normalize to date object + if isinstance(event_date, str): + event_date = date.fromisoformat(event_date) + + # Build path relative to project root (Quarto expects .html output path) + rel_path = str(qmd).replace(".qmd", ".html") + + item = { + "title": fm.get("title", ""), + "event-date": event_date.isoformat(), + "date": str(fm.get("date", event_date.isoformat())), + "author": _flatten_author(fm.get("author", "")), + "location": fm.get("location", ""), + "categories": categories, + "path": rel_path, + } + if fm.get("subtitle"): + item["subtitle"] = fm["subtitle"] + + events.append((event_date, item)) + + return events + + +def main() -> None: + events = collect_events() + + upcoming = sorted( + [item for d, item in events if d >= TODAY], + key=lambda x: x["event-date"], + ) + past = sorted( + [item for d, item in events if d < TODAY], + key=lambda x: x["event-date"], + reverse=True, + ) + + with open(OUTPUT_DIR / "upcoming-events.yml", "w", encoding="utf-8") as f: + yaml.dump(upcoming, f, default_flow_style=False, allow_unicode=True) + + with open(OUTPUT_DIR / "past-events.yml", "w", encoding="utf-8") as f: + yaml.dump(past, f, default_flow_style=False, allow_unicode=True) + + print(f"Events split: {len(upcoming)} upcoming, {len(past)} past (as of {TODAY})") + + +if __name__ == "__main__": + main() diff --git a/uv.lock b/uv.lock index 7b7ee18..f094d1e 100644 --- a/uv.lock +++ b/uv.lock @@ -1,8 +1,50 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.13" [[package]] name = "dhbern-github-io" version = "0.1.0" source = { virtual = "." } +dependencies = [ + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [{ name = "pyyaml" }] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] From fa80ed2f5bcf9a37cd36fa320226a16ca5ca5f7e Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:44:38 +0000 Subject: [PATCH 05/11] add daily build to keep the list correct --- .github/workflows/quarto-publish.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/quarto-publish.yml b/.github/workflows/quarto-publish.yml index 542fdc2..74e6f99 100644 --- a/.github/workflows/quarto-publish.yml +++ b/.github/workflows/quarto-publish.yml @@ -1,4 +1,6 @@ on: + schedule: + - cron: "0 6 * * *" push: branches: - main @@ -31,7 +33,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v5 with: - node-version: '22' + node-version: "22" - name: Configure npm registry run: | @@ -75,7 +77,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version-file: '.python-version' + python-version-file: ".python-version" - name: Create and activate virtual environment run: | From 6e92468eeae907d6b1e33ecdaeb2629cebc08010 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:16:17 +0200 Subject: [PATCH 06/11] add missing metadata Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../im_dialog/2023-linked-open-data-in-dialogue/index.qmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd b/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd index 349d18c..e6521f9 100644 --- a/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd +++ b/content/events/im_dialog/2023-linked-open-data-in-dialogue/index.qmd @@ -2,6 +2,8 @@ title: "Linked Open Data in Dialogue (2023)" subtitle: "…in Dialogue — Digital Humanities, University of Bern" date: "2023-11-15" +event-date: "2023-11-15" +categories: [Event] lang: "en" --- From a55bdfdc3c8fb7afdc58b2bb754109939b9e3210 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:20:28 +0200 Subject: [PATCH 07/11] Update scripts/split-events.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/split-events.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/split-events.py b/scripts/split-events.py index f71620d..9757aa2 100644 --- a/scripts/split-events.py +++ b/scripts/split-events.py @@ -31,9 +31,9 @@ def _flatten_author(author) -> str: return str(author) -def collect_events() -> list[dict]: - """Walk content/ for .qmd files with categories containing 'Event'.""" - events = [] +def collect_events() -> list[tuple[date, dict]]: + """Walk content/ for event .qmd files and return (event_date, item) tuples.""" + events: list[tuple[date, dict]] = [] for qmd in CONTENT_DIR.rglob("*.qmd"): fm = parse_frontmatter(qmd) if fm is None: From 0991b54e4116c2ea3ec549ee0930a8b33e66c0f9 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:21:12 +0200 Subject: [PATCH 08/11] Update scripts/split-events.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/split-events.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/split-events.py b/scripts/split-events.py index 9757aa2..f4d281e 100644 --- a/scripts/split-events.py +++ b/scripts/split-events.py @@ -52,8 +52,8 @@ def collect_events() -> list[tuple[date, dict]]: if isinstance(event_date, str): event_date = date.fromisoformat(event_date) - # Build path relative to project root (Quarto expects .html output path) - rel_path = str(qmd).replace(".qmd", ".html") + # Build path relative to content/ with a POSIX-style .html output path + rel_path = qmd.relative_to(CONTENT_DIR.parent).with_suffix(".html").as_posix() item = { "title": fm.get("title", ""), From 503617f9eafce8ee45ddf942c271489c439cb5c5 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:22:36 +0200 Subject: [PATCH 09/11] Update scripts/split-events.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- scripts/split-events.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/split-events.py b/scripts/split-events.py index f4d281e..262a430 100644 --- a/scripts/split-events.py +++ b/scripts/split-events.py @@ -50,7 +50,10 @@ def collect_events() -> list[tuple[date, dict]]: # Normalize to date object if isinstance(event_date, str): - event_date = date.fromisoformat(event_date) + try: + event_date = date.fromisoformat(event_date) + except ValueError: + continue # Skip events with invalid date format # Build path relative to content/ with a POSIX-style .html output path rel_path = qmd.relative_to(CONTENT_DIR.parent).with_suffix(".html").as_posix() From e0575ffad6e9773ded646ed5e8e481f53fac4143 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:23:59 +0200 Subject: [PATCH 10/11] Update scripts/split-events.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/split-events.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/split-events.py b/scripts/split-events.py index 262a430..2f4f40f 100644 --- a/scripts/split-events.py +++ b/scripts/split-events.py @@ -13,12 +13,15 @@ def parse_frontmatter(path: Path) -> dict | None: """Extract YAML frontmatter from a .qmd file.""" text = path.read_text(encoding="utf-8") - if not text.startswith("---"): + lines = text.splitlines(keepends=True) + if not lines or lines[0].strip() != "---": return None - end = text.index("---", 3) - return yaml.safe_load(text[3:end]) + for i in range(1, len(lines)): + if lines[i].strip() == "---": + return yaml.safe_load("".join(lines[1:i])) + return None def _flatten_author(author) -> str: """Convert author field (string, dict, or list) to a plain string.""" if isinstance(author, str): From b8a972cfa071748568ab756ff29c55296dd214b2 Mon Sep 17 00:00:00 2001 From: Sebastian Flick <33655122+flicksolutions@users.noreply.github.com> Date: Wed, 15 Apr 2026 12:42:31 +0000 Subject: [PATCH 11/11] lint --- .github/workflows/quarto-publish.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/quarto-publish.yml b/.github/workflows/quarto-publish.yml index 74e6f99..85adb87 100644 --- a/.github/workflows/quarto-publish.yml +++ b/.github/workflows/quarto-publish.yml @@ -1,6 +1,6 @@ on: schedule: - - cron: "0 6 * * *" + - cron: '0 6 * * *' push: branches: - main @@ -33,7 +33,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v5 with: - node-version: "22" + node-version: '22' - name: Configure npm registry run: | @@ -45,7 +45,7 @@ jobs: run: npm install - name: Check for linting errors - run: npm run check + run: npm run format build-optimize: name: Build, Optimize, and Upload Artifacts @@ -77,7 +77,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version-file: ".python-version" + python-version-file: '.python-version' - name: Create and activate virtual environment run: |