feat(cms): U1 content model + migration scaffold for blog/news/events

Establish content/ as the source of truth for editable content and
back-fill it from the existing detail pages, per U1 of the no-code CMS
plan.

- docs/content-model.md: front-matter schema (EN/MK/SI), body_format
  html-vs-markdown, content/events -> projects/ output mapping.
- tools/migrate_pages_to_content.py: bs4/yaml extractor; pulls title,
  subtitle, category, ISO date (from ARTICLE_DATES), hero image+caption;
  preserves the article body PLUS trailing sibling sections (event
  galleries) verbatim as body_format: html. Reports unparseable pages
  instead of emitting half-formed files.
- content/**: 51 files (17 entries x EN/MK/SI), 0 skips.
- tools/tests/test_migrate_roundtrip.py: 12 characterization tests
  (structured fields, news-has-no-subtitle, event gallery/lightbox
  preserved, Cyrillic UTF-8 round-trip, every page parses).
- .gitignore: ignore __pycache__/ and *.pyc.

U1 is unblocked and standalone. U2 (render content -> pages) is next;
U5/U6 remain blocked on Open Question Q1 (Gitea<->GitHub topology).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
popovskikandClaude Opus 4.8 committed 2026-08-08 16:18:29 +02:00
1 parent 6204db5f0c
commit 9ddd0f88ef
55 files changed
+4572

No files matched your search

@@ -0,0 +1,62 @@
---
type: event
slug: watching-handball-together-in-slovenia
lang: si
source_folder: projects
title: Navijanje za Makedonijo, skupno gledanje rokometa v Sloveniji
subtitle: Od Ljubljane do Maribora so makedonski študenti napolnili kavarne z navijaškimi vzkliki, zastavami in smehom med gledanjem rokometne reprezentance.
date: '2025-01-25'
date_line: Objavljeno 25. januarja 2025
hero:
src: /images/handball-2025-1.webp
alt: Navijaško vzdušje med gledanjem rokometa v Mariboru
width: '720'
height: '480'
body_format: html
---
<div class="article-body">
<p>Januarja 2025 so makedonski študenti v Ljubljani in Mariboru kavarne spremenili v navijaške cone, kjer so se zbrali, da bi navijali, peli in delili vznemirjenje ob rokometu, s čimer so dokazali, da tudi daleč od doma makedonski duh živi glasno.</p>
<figure class="article-inline-image">
<img alt="Utrinek navijaškega vzdušja v Mariboru." decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-2.webp" width="720"/>
<figcaption>Utrinek navijaškega vzdušja v Mariboru.</figcaption>
</figure>
<h2 id="section-1">Dve mesti, en duh</h2>
<p>To zimo je svetovno prvenstvo v rokometu prineslo več kot le tekme na zaslonu. Povezalo je makedonske študente. V Ljubljani je pobuda prišla od študenta Ljubena Najdovskega, ki je predlagal, naj MŠOS pripravi skupinski ogled tekme proti Gvineji 19. januarja 2025. S hitro organizacijo in podporo lokalne kavarne Lepa Žoga je bil rezerviran prostor, zbrane so bile prijave in kmalu je 25 študentov napolnilo prostor z zastavami, vzkliki in smehom.</p>
<figure class="article-inline-image">
<img alt="Navijači, zbrani na ljubljanski bazi, skupaj navijajo za Makedonijo." decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-3.webp" width="720"/>
<figcaption>Navijači, zbrani na ljubljanski bazi, skupaj navijajo za Makedonijo.</figcaption>
</figure>
<p>Le teden dni pozneje se je energija prenesla v Maribor, kjer je lokalna ekipa MŠOS pripravila svoje navijaško srečanje za tekmo proti Franciji 25. januarja 2025. V kavarni CLC v središču mesta se je zbralo 35 študentov in prijateljev, s prigrizki, glasbo in pravim navijaškim vzdušjem. Čeprav rezultat na semaforju ni bil naklonjen Makedoniji, se je večer končal s praznovanjem, novimi prijateljstvi in celo druženjem po dogodku, ki je trajalo še dolgo po zadnjem žvižgu.</p>
<figure class="article-inline-image">
<img alt="Navijači, zbrani na mariborski bazi, skupaj navijajo za Makedonijo." decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-4.webp" width="720"/>
<figcaption>Navijači, zbrani na mariborski bazi, skupaj navijajo za Makedonijo.</figcaption>
</figure>
<h2 id="section-2">Več kot le gledanje tekme</h2>
<p>Tisto, kar je te dogodke naredilo posebne, ni bil le šport. Bil je način, kako so študenti v tujini ustvarili košček doma: mahanje z zastavami, deljenje pijače, vzkliki »Ајде Македонија!« proti zaslonu in skupen smeh ob zgrešenih strelih ali izjemnih obrambah. Za novince je bila to priložnost, da se v hipu počutijo del skupnosti. Za druge je bil to opomnik, da tudi na stotine kilometrov od doma niso navijali sami.</p>
<figure class="article-inline-image">
<img alt="Dva naša organizatorja MŠOS Maribor uživata na navijaškem večeru." decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-5.webp" width="720"/>
<figcaption>Dva naša organizatorja MŠOS Maribor uživata na navijaškem večeru.</figcaption>
</figure>
<h2 id="section-3">Nastajajoča nova tradicija</h2>
<p>Od Ljubljane do Maribora so ta navijaška srečanja pokazala, da je podpiranje reprezentance lahko več kot šport. Je način za sklepanje prijateljstev, krepitev skupnosti in nošenje koščka Makedonije, kamor koli gremo. Z vsako tekmo energija raste in eno je gotovo: ta srečanja bodo še naprej del zgodbe MŠOS.</p>
<figure class="article-inline-image">
<img alt="Utrinek naše ekipe v Mariboru." decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-6.webp" width="720"/>
<figcaption>Utrinek naše ekipe v Mariboru.</figcaption>
</figure>
<figure class="article-inline-image">
<img alt="Utrinek naše ekipe v Ljubljani." decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-7.webp" width="720"/>
<figcaption>Utrinek naše ekipe v Ljubljani.</figcaption>
</figure>
</div>
<section class="event-gallery">
<h2 class="event-gallery-title">Fotografije z dogodka</h2>
<div class="event-gallery-grid js-lightbox">
<button class="eg-thumb" data-caption="Skupno gledanje rokometa v Sloveniji" data-full="../../../images/handball-2025-1.webp" type="button"><img alt="Skupno gledanje rokometa v Sloveniji, photo 1" decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-1.webp" width="720"/></button>
<button class="eg-thumb" data-caption="Skupno gledanje rokometa v Sloveniji" data-full="../../../images/handball-2025-2.webp" type="button"><img alt="Skupno gledanje rokometa v Sloveniji, photo 2" decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-2.webp" width="720"/></button>
<button class="eg-thumb" data-caption="Skupno gledanje rokometa v Sloveniji" data-full="../../../images/handball-2025-3.webp" type="button"><img alt="Skupno gledanje rokometa v Sloveniji, photo 3" decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-3.webp" width="720"/></button>
<button class="eg-thumb" data-caption="Skupno gledanje rokometa v Sloveniji" data-full="../../../images/handball-2025-4.webp" type="button"><img alt="Skupno gledanje rokometa v Sloveniji, photo 4" decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-4.webp" width="720"/></button>
<button class="eg-thumb" data-caption="Skupno gledanje rokometa v Sloveniji" data-full="../../../images/handball-2025-5.webp" type="button"><img alt="Skupno gledanje rokometa v Sloveniji, photo 5" decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-5.webp" width="720"/><span class="eg-more">+2</span></button>
<button class="eg-thumb is-hidden" data-caption="Skupno gledanje rokometa v Sloveniji" data-full="../../../images/handball-2025-6.webp" type="button"><img alt="Skupno gledanje rokometa v Sloveniji, photo 6" decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-6.webp" width="720"/></button>
<button class="eg-thumb is-hidden" data-caption="Skupno gledanje rokometa v Sloveniji" data-full="../../../images/handball-2025-7.webp" type="button"><img alt="Skupno gledanje rokometa v Sloveniji, photo 7" decoding="async" height="480" loading="lazy" src="../../../images/handball-2025-7.webp" width="720"/></button>
</div>
</section>