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> |
||
|---|---|---|
| .. | ||
| __pycache__ | ||
| git-hooks | ||
| tests | ||
| README.md | ||
| build_blog.py | ||
| build_botlinks.py | ||
| build_listings.py | ||
| build_search_index.py | ||
| migrate_pages_to_content.py | ||
| seo_inject.py | ||
README.md
tools/
seo_inject.py
Injects a technical-SEO block into every language page (en|mk|si/**/index.html)
and regenerates sitemap.xml + robots.txt. Safe to re-run — the block lives
between <!-- SEO:START --> and <!-- SEO:END --> and is replaced in place.
The block adds: meta description (auto-extracted from the page's lead/subtitle
where available), canonical, hreflang alternates (en / mk / sl / x-default),
Open Graph, Twitter Card, and an Organization JSON-LD.
All absolute URLs point at the final domain https://msosorg.com (not the
temporary host), so nothing needs rewriting at launch. Note: the Slovene folder
is /si/ but the ISO code is sl — the script maps si → sl for hreflang/locale.
Usage
python tools/seo_inject.py # dry run: print the block for pilot pages
python tools/seo_inject.py --all # write the block into every page
python tools/seo_inject.py --all --sitemap # also rebuild sitemap.xml + robots.txt
Run --all --sitemap after adding, renaming, or deleting any page so canonical
tags, hreflang alternates, and the sitemap stay in sync.