Versionierte, brand-konsistente Skelett-Vorlagen für Postkarten, Plakate und Zeitungen der Grünen NÖ. Andere Gruppierungen laden sie aus der GitHub Pages Galerie, öffnen sie in Scribus, passen Inhalte an und drucken.
templates/
├── postkarte-a6-kampagne/ # 2-seitige A6-Postkarte
│ ├── build.py # DSL-Definition (source of truth)
│ ├── template.sla # build artifact, in Scribus zu öffnen
│ ├── meta.yml # Metadaten + Slot-Hinweise
│ └── README.md
├── plakat-a1-hochformat/ # A1 Veranstaltungs-Plakat (faithful DSL reproduction)
│ ├── build.py # DSL-Definition (source of truth)
│ ├── template.sla # build artifact, in Scribus zu öffnen
│ ├── meta.yml
│ └── README.md
└── zeitung-a4/ # 9 Beispielseiten in einer Multi-Page-SLA
├── build.py
├── template.sla # 9 Pages × 6 Master-Pages
├── meta.yml
└── README.md
Drop one or more Adobe InDesign .idml files into the workspace and convert them
end-to-end into Scribus-compatible templates:
bin/idml-import path/to/template.idml
bin/idml-import path/to/incoming/ # batch — walks the directory for *.idmlbin/idml-import extracts asset links, scaffolds templates/<slug>/, runs the
converter, then iterates the audit + classify + remediation loop until the
template converges against its baseline.pdf or until a human-review issue is
surfaced. Full reference: docs/idml-import-workflow.md.
The companion skill at .claude/skills/idml-import/SKILL.md drives the same
pipeline from inside Claude Code sessions.
In Scribus öffnen, im Page-Panel die gewünschte Beispielseite duplizieren, Inhalte ersetzen, ungenutztes löschen, PDF exportieren. Pinke Beschriftungen am Seitenrand erklären, welche Variante was zeigt — werden im PDF-Export nicht gedruckt (Hilfslinien-Layer).
Die einzelnen Templates haben jeweils eine README.md mit Schritt-für-Schritt-Anleitung.
Neue Beispielseite oder Layout-Variante hinzufügen → editiere build.py der jeweiligen Vorlage:
from sla_lib.builder import Document, Color, Style, blocks, Polygon
doc = Document(title="...", template_id="...")
doc.add_master(name="rechts-3col", size="A4")
page = doc.add_page(size="A4", master="rechts-3col",
label="Beispiel: neue Layout-Variante")
page.add(blocks.Headline4Line(...))
page.add(blocks.ArticleBody(columns=3, ...))
doc.save("template.sla")build.py ausführen → SLA wird neu emittiert. Das Layout ist im Code versioniert; Brand-Stile kommen aus shared/ci.yml.
Lege ein neues templates/<id>/build.py an mit Document(...) + add_page + Blocks aus der Library. Schreibe meta.yml mit Slot-Beschreibungen und einen README.md für die Galerie. CI rendert beim nächsten Push automatisch Vorschau-PDFs und deployed die Galerie.
| Schicht | Verantwortung | Pfad |
|---|---|---|
| Brand | Single source of truth für Farben/Fonts/Stile | shared/ci.yml |
| Validator | Drift-Detection gegen die SLA | tools/check_ci.py |
| DSL | Typed Python API → valides Scribus 1.6 SLA-XML | tools/sla_lib/builder/ |
| Blocks | Wiederverwendbare Compose-Bausteine | tools/sla_lib/builder/blocks.py |
| Renderer | Headless Scribus → PDF (Xvfb) | tools/render.py |
| Galerie-Build | Templates → Astro-Content + PNG-Previews | tools/gallery_build.py |
| Galerie-Site | Astro statisch, deployed auf GitHub Pages | site/ |
| CI | Build + Validate + Deploy | .github/workflows/pages.yml |
Die drei Galerie-Vorlagen werden gegen ihre Originale (an Workspace-Root: postkarte-vorlage-original.sla, plakat-a1-hochformat-original.sla, gruene-zeitung-vorlage-original.sla) validiert — strukturell und visuell.
Vergleicht zwei SLAs nach einer 10-Schritte-Normalisierungs-Pipeline (volatile-Attrs strippen, ItemID renumbern, page-local Koordinaten, Float-Rundung, Attribut-Sortierung). Liefert dreistufige Severity (critical / warning / info), Markdown- oder JSON-Reporter.
python3 tools/sla_diff.py \
--left postkarte-vorlage-original.sla \
--right templates/postkarte-a6-kampagne/template.sla \
--strict
# Exit 0 → reproduktion strukturell faithful
# Exit 1 → critical oder warning vorhanden (mit --strict)Rendert beide SLAs zu PDF (Scribus + Xvfb), rasterisiert per Page (pdftoppm), per-pixel diff via ImageMagick compare, plus Composite (baseline | dsl | delta) zur visuellen Inspektion.
python3 tools/visual_diff.py \
templates/postkarte-a6-kampagne/template.sla \
--baseline templates/postkarte-a6-kampagne/baseline.pdf \
--tolerance templates/postkarte-a6-kampagne/diff.yml \
--dpi 96 \
--out build/postkarte/DPI: --dpi 150 lokal, --dpi 96 in CI (CONTEXT.md D4). Toleranzen pro Template in templates/<id>/diff.yml — Schema in docs/diff-tolerance.md.
bin/validateoder
make validate # falls Makefile vorhandenBeides ruft sla_diff + visual_diff für alle drei Templates auf und gibt Exit 0 wenn alles innerhalb der Toleranzen.
bin/validate prüft nur die Round-trip-Validierung. bin/ci-local führt
die komplette Schrittfolge des Build & Deploy Gallery-Build-Jobs
(.github/workflows/pages.yml) lokal aus — in genau derselben Reihenfolge:
Smoke-Templates bauen, Galerie-Content generieren, Astro-Site bauen, Unit-Tests
(tools/sla_lib/tests), sla_diff + check-stale-previews, Brand-Validator,
Structural-Check und Alignment-Audit.
bin/ci-local # vollständige Build-Job-Sequenz
bin/ci-local --no-site # ohne Astro-npm-Build (schnellere Iteration)Vor jedem Push einmal bin/ci-local laufen lassen: „grün lokal" sagt damit
zuverlässig „grün in CI" voraus. Der Gate prüft am Ende zusätzlich, dass kein
Build-Schritt eine committete templates/<id>/template.sla verändert hat — das
ist genau die „lokal grün / CI rot"-Falle, die durch eine das Working-Tree
mutierende Test-Helper-Funktion entstanden war. bin/ci-local setzt voraus,
dass die Toolchain installiert ist (Python 3.12, Node 20, Scribus 1.6.5 — siehe
pages.yml); fehlt etwas, bricht es mit einer klaren Meldung ab.
Erzeugt initial templates/<id>/build.py aus einer existierenden SLA. Nicht Teil der CI-Pipeline. Wird einmal manuell laufen gelassen, danach ist build.py die Source of Truth und wird von Hand editiert.
python3 tools/sla_to_dsl.py \
postkarte-vorlage-original.sla \
templates/postkarte-a6-kampagne/build.py \
--template-id postkarte-a6-kampagne \
--assets-dir templates/postkarte-a6-kampagne/assets/rm templates/<id>/baseline.pdf
xvfb-run -a scribus -g -ns -py tools/_export_pdf.py \
<updated-original>.sla \
templates/<id>/baseline.pdf
git add templates/<id>/baseline.pdf
git commit -m "rebaseline <id>: <reason>"Details in docs/diff-tolerance.md §"Rebaselining workflow".
.research/ enthält die initiale Tiefenrecherche:
00-synthesis.md— Architektur und Roadmap01-sla-format.md— SLA-XML-Schema-Doku (mit allen Stolperfallen)02-tooling-ecosystem.md— Stack-Vergleich Scribus / Typst / LaTeX / WeasyPrint03-validation-distribution.md— Preflight, Visual-Diff, GitHub Pages04-scribus-multipage-masters.md— Master-Pages-Mechanik
Plus die Issue-Dokumentation in .issues/1-scribus-template-authoring-pipeline/:
ISSUE.md— Scope, AkzeptanzkriterienCONTEXT.md— was im Discuss geklärt wurdeRESEARCH.md— DSL-Design-PatternsPLAN.md— die 29 TasksEXECUTION.md— was abgehakt wurde
Voraussetzungen: Scribus 1.6.x (Debian trixie oder neuer), Python 3.11+, lxml, PyYAML, Node 20+ für die Galerie.
# Eine Vorlage rendern
python3 templates/postkarte-a6-kampagne/build.py
xvfb-run -a scribus -g -ns -py tools/_export_pdf.py \
templates/postkarte-a6-kampagne/template.sla /tmp/preview.pdf
# Oder über die Sammel-Pipeline
python3 tools/gallery_build.py # rendert alle + erzeugt site/src/content/
# Galerie-Site bauen
cd site && npm install && npm run build
# Output: site/dist/Tests:
python3 -m unittest discover tools/sla_lib/tests- Templates und Brand: © Die Grünen Niederösterreich
- Print-Schriften (SIL Open Font License) — lokal im Repo gebündelt, weil
Scribus offline rendert und keine Webfonts laden kann (bewusste
Print-Pipeline-Ausnahme zur Workspace-No-Vendoring-Regel):
- Barlow Semi Condensed (Regular/Bold/Black/ExtraBold) — die durchgängige
Primärschrift aller Templates; ersetzt das frühere proprietäre Gotham Narrow
(vollständig entfernt). Liegt unter
fonts/barlow-semi-condensed/. - Vollkorn (Black Italic + Bold Italic) — die Akzent-/Zitatschrift; liegt
unter
fonts/vollkorn/. - Beide werden vom
Dockerfile.claudeinstalliert. Fehlen sie im Container, substituiert der Renderer mit DejaVu (sichtbar in der PDF-Vorschau).
- Barlow Semi Condensed (Regular/Bold/Black/ExtraBold) — die durchgängige
Primärschrift aller Templates; ersetzt das frühere proprietäre Gotham Narrow
(vollständig entfernt). Liegt unter
- Pipeline-Code: TBD-Lizenz