WTHB-TOC-Language-Pipeline
Überblick
Das Paket linkenhancer-wthb-toc-lang stellt das Inhaltsverzeichnis (TOC) des deutschen webtrees-Handbuchs — samt Übersetzungen — der WTHB-Hilfefunktion zur Verfügung. Die Produktion ist ein Rundlauf, der komplett außerhalb der webtrees-Installation läuft: Er liest das Handbuch von GenWiki, erzeugt das TOC neu, schreibt das Ergebnis als MediaWiki-Template zurück nach GenWiki und — parallel — die strukturierten Daten in ein externes Codeberg-Repo, das Codeberg Pages, Weblate (Übersetzungen) und schließlich das Modul versorgt. Diese Seite dokumentiert die Produktionsseite; die Konsumenten-Seite (Cache, CLI, Rendering) steht auf der WTHB-Funktionsseite und der Seite CLI-Skripte.
Ressourcen
- GenWiki Webtrees Handbuch: https://wiki.genealogy.net/Webtrees_Handbuch
- Code-Repositories:
- Weblate-Übersetzungskomponente: https://translate.codeberg.org/projects/wt-modules/linkenhancer-wthb-toc
- GenWiki Bot-Projekt: https://gitlab.genealogy.net/genwiki/wikibots (gw-skripte / pywikibot Dokumentation)
Pipeline
Der Rundlauf hat zwei Hälften: den GenWiki-Rundlauf (Handbuch lesen → generieren → TOC-Template zurück schreiben) und die Delivery-Pipeline (strukturierte Daten → externes Repo → Pages / Weblate → Modul).
Der GenWiki-Rundlauf:
flowchart TB
subgraph HOST["🖥️ Host · gw-skripte/"]
ORCH["`🚦 **wt-maintain.sh**<br/>*Orchestrierung*`"]
PREAD["`🤖 **pywikibot** · *wt-maintain.py*<br/>SectionsExportBot — *READ*`"]
GEN["`⚙️ **wt-gen-toc.py** *(pandas)*`"]
PREP["`📄 *pagefromfile-Datei*<br/>vorlage_wt-verzeichnis-toc.txt`"]
PWRITE["`🤖 **pywikibot** · *pagefromfile*<br/>*WRITE* — Bot-Zusammenfassung`"]
end
GW["`📖 **GenWiki** · wiki.genealogy.net<br/>*Webtrees-Handbuch-Seiten*`"]
CSV["`📄 *3 CSV*<br/>pageinfo · sections · images`"]
OUT["`📦 *Ausgaben*<br/>wthb-toc.wiki · .html · .json · de.json`"]
TPL["`📖 **Vorlage:WT-Verzeichnis-TOC**<br/>*noinclude + includeonly TOC*`"]
API["`🔍 *API action=parse* → HTML<br/>(curl + jq)`"]
GW -->|"allpages prefix 'Webtrees Handbuch'<br/>API parse/sections + imagelinks"| PREAD
ORCH -.->|"drives"| PREAD
PREAD --> CSV
CSV -->|"+ wthb-pageinfo_ext.csv (target)"| GEN
GEN --> OUT
OUT --> PREP
PREP --> PWRITE
PWRITE -->|"pagefromfile -force"| TPL
TPL -->|"curl API parse"| API
classDef srcStyle fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
classDef coreStyle fill:#ede7f6,stroke:#5e35b1,stroke-width:2px
classDef okStyle fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
classDef pwbStyle fill:#fff8e1,stroke:#f57f17,stroke-width:2px
classDef targetStyle fill:#fce4ec,stroke:#ad1457,stroke-width:2px
class GW srcStyle
class ORCH,GEN coreStyle
class CSV,OUT,API okStyle
class PREAD,PWRITE pwbStyle
class TPL targetStyle
Orchestrierung — wt-maintain.sh
Alles läuft von einem Host-Skript (in gw-skripte/):
wt-maintain.sh <wthb-pageinfo_ext.csv> <DATADIR>
Es benötigt setenv.sh, das PWB_PY, PWB_CONF und SCRIPTDIR exportiert, und steuert diese Schritte der Reihe nach:
- GenWiki-Daten abfragen (pywikibot READ)
- TOC generieren
pagefromfile-Wrapper-Datei bauen- Template zurück nach GenWiki schreiben (pywikibot WRITE)
- gerendertes Template per Parse-Check prüfen (curl + jq)
- JSON in das externe Repo deployen
- nachgelagert: Repo-CI, Weblate und Modul holen die Daten
GenWiki-Datenabfrage (pywikibot READ)
Schritt 1 ist wt-maintain.py, ein pywikibot-Bot (SectionsExportBot, erbt von ExistingPageBot). Er ruft site.login() auf, iteriert allpages(prefix="Webtrees Handbuch") und fragt pro Seite die MediaWiki-API (action=parse&prop=sections) plus imagelinks() (FilePage-Info) ab.
Ergebnis sind drei CSV-Dateien:
wthb-pageinfo.csv,wthb-sections.csvundwthb-images.csv.
Zwei manuelle Nacharbeiten bleiben (laut Skript-Header): (b) das Bilderverzeichnis pflegen und (c) die Bilder in die Kategorie:Webtrees legen — von Hand (Helfer: wt-webtrees-cat-files.sh).
TOC-Generierung — wt-gen-toc.py
Schritt 2 ist ein pandas-Skript, das den IST-Zustand (die drei CSVs) mit der SOLL-Zielstruktur in wthb-pageinfo_ext.csv kombiniert. classify_prefix() vergibt Kapitel-/Abschnitts-Präfixe. Es schreibt vier Outputs:
wthb-toc.wiki— die MediaWiki-TOC-Quellewthb-toc.json— die strukturierten Daten, die das Modul verbrauchtde.json— die deutsche Sprachdatei für Weblatewthb-toc.html— eine gerenderte HTML-Kopie (legacy/parallel — der aktuelle Konsument rendert aus JSON)
GenWiki-Template (pywikibot WRITE)
Schritte 3–4 wickeln das generierte TOC im MediaWiki-Template Vorlage:WT-Verzeichnis-TOC ein und schreiben es zurück:
- die
pagefromfile-Datei kombiniert einen<noinclude>-Teil ({{Dokumentation}}+[[Kategorie:Webtrees]]) mit einem<includeonly>-Teil (Stand: <datum>+<div class="wthbtoc">…</div>). pywikibot pagefromfile -force -pt:1 -summary:"Bot: Webtrees Handbuch Inhaltsverzeichnis aktualisiert"führt den Write aus.
Schritt 5 verifiziert das Ergebnis, indem es das Template über die GenWiki-API (action=parse&format=json) neu parst und das HTML mit jq -r '.parse.text["*"]' extrahiert.
Externes Repo, CI & Pages
Die zweite Hälfte der Pipeline (ab Schritt 6) befördert die strukturierten Daten aus dem Host heraus:
flowchart TB
OUT["`📦 *Ausgaben*<br/>wthb-toc.json + de.json`"]
DEP["`🚀 **wt-deploy-toc-lang.sh**`"]
subgraph EXTERNAL["🌐 Externe Infrastruktur"]
REPO["`📦 **linkenhancer-wthb-toc-lang**<br/>(Codeberg)`"]
META["`🔧 *tools/gen_meta.py*<br/>languages.json + version.json`"]
CI["`⚙️ *CI regen-meta.yml*<br/>gen_toc_html.py`"]
PG["`🌐 **Codeberg Pages**`"]
WLB["`🌐 **Weblate** · linkenhancer/wthb-toc`"]
TNG["🗝 en.json · fr.json · …"]
end
subgraph MODULE["📦 Modul (linkenhancer)"]
SVC["`**WthbTocService**`"]
DS["`💾 *data/…/wthb-toc-lang/*<br/>2-Layer-Cache`"]
RDR["`📄 **help-wthb-toc.phtml**<br/>TOC-Modal`"]
end
OUT -->|"cp wthb-toc.json + de.json"| DEP
DEP -->|"git add / commit / push"| REPO
REPO -->|"regen meta"| META
REPO --> CI --> PG
REPO -->|"de.json (Source)"| WLB
WLB --> TNG
TNG -->|"[lang].json"| REPO
PG -->|"fetch JSON"| MODULE
SVC --> DS --> RDR
classDef coreStyle fill:#ede7f6,stroke:#5e35b1,stroke-width:2px
classDef okStyle fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
classDef queueStyle fill:#fff3e0,stroke:#e65100,stroke-width:2px
class OUT okStyle
class DEP,REPO,META,CI,SVC coreStyle
class PG,TNG,DS,RDR okStyle
class WLB queueStyle
wt-deploy-toc-lang.shkopiertwthb-toc.jsonundde.jsonin das Repolinkenhancer-wthb-toc-lang, führttools/gen_meta.pyaus (regeneriertlanguages.json+version.json) und machtgit add/commit/push. Es ist standalone aufrufbar und skippt weich (Warnung +exit 0), wenn Repo oder JSON fehlen, sodass es denset -e-Orchestrator nie abbricht.- Repo-CI (
regen-meta.yml) führtgen_toc_html.pyaus und veröffentlicht auf Codeberg Pages.
Weblate
Die de.json im Repo ist die Quelle der Weblate-Komponente wt-modules/linkenhancer-wthb-toc; die übrigen [lang].json-Dateien sind deren Übersetzungs-Ziele. Die Übersetzungen fließen zurück ins Repo und werden über Codeberg Pages ausgeliefert.
Konsument (Modul)
Knapp — Details auf der WTHB-Funktionsseite und der Seite CLI-Skripte:
WthbTocService.phpholt die Sprach-JSON von Codeberg Pages und stellt sie über einen zwei-Schichten-Cache bereit.refresh-wthb-toc.php(undcli/validate-wthb-toc.php) aktualisiert bzw. prüft diesen Cache, typischerweise per Cron.help-wthb-toc.phtmlrendert das TOC im Hilfe-Dialog.
Konfiguration & Voraussetzungen
setenv.sh— exportiertPWB_PY,PWB_CONF,SCRIPTDIR.- pywikibot-Config —
user-config-test.py/user-config-prod.py. wthb-toc-lang.env—TOC_LANG_REPO=$HOME/dev/linkenhancer-wthb-toc-lang,TOC_LANG_DATADIR=$HOME/dev/wthb-toc-datadir.- Voraussetzungen: pywikibot, pandas, jq, python3.
Ops & Caveats
- Manuelle Bild-Nacharbeit — Bilderverzeichnis und
Kategorie:Webtreesmüssen von Hand gepflegt werden. pagefromfile-Login — laut Code-Kommentar muss ggf.site.login()inpagefromfile.pyeingefügt werden.- Soft-Skip im Deploy — fehlendes Repo oder JSON ist eine Warnung, kein Fehler (hält
set -esicher).