GEO: Schema-Slot {{schema_jsonld}} in templates/base.html + render.sh #9
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Hintergrund
Guideline:
docs/geo-seo-guideline.md(Section 5.1).Aktuell hat onepager keinen Schema-Markup-Mechanismus. Templated Sites kommen mit Standard-Struktur, Custom Sites werden roh kopiert.
Aufgabe
1. Template-Slot
templates/base.htmlum Schema-Slot ergänzen:2. site.yaml Schema-Block
Unterstützte Types: Person, Organization, Article, Product, FAQPage, LocalBusiness.
3. render.sh
Liest
schema:Block aus site.yaml und generiert JSON-LD:Falls
schema:fehlt: leerer Slot (kein Tag).4. Defaults pro Template
Manche Templates können sinnvolle Defaults haben (z.B. person-dark.html → Person-Type). Über
templates/<name>.defaults.yamloder hard-coded — Worker entscheidet.5. Custom Sites
Für
template: custom: Schema muss manuell in index.html eingebaut werden — Template-Slot greift dort nicht. Im Issue-Body Hinweis dokumentieren.QA
Folge-Sites (separate Issues)
Nach Merge: pro kommerzieller / persönlicher Site einen Schema-Block in site.yaml einfügen — ichbinotto, mai-otto, lexsiebels, heygoldi, smartin3, martinsiebels.
Nicht im Scope
Priorität
p2 — Infrastruktur-Voraussetzung für viele weitere GEO-Schritte.
Erledigt — Schema-Slot in Templates + render.sh
Branch:
mai/hermes/issue-9-geo-schema-slot(push only, head merged)Commit:
29965c11Was umgesetzt ist
templates/base.html—{{schema_jsonld}}Slot im<head>, direkt nach{{fonts}}.site.yamlSchema-Block — optional, Form aus dem Issue:render.sh— liest.schemaviayq -o=json, transformiert mitjq(type→@type,@context: https://schema.orgautomatisch), emittiert als<script type="application/ld+json">…</script>. Fehltschema:→ leerer Slot, kein Tag.schema:da ist abertype:fehlt:person-dark,person-light→Personproduct-dark→Producteditorial→Articlefun,minimal→ kein Default (type:muss explizit gesetzt werden)index.htmlvor</head>. Im README dokumentiert.Bonus-Fix
Beim Implementieren ist ein latenter Bug in
render.shaufgetaucht:awk gsubinterpretiert&im Replacement als matched-text. Das hätte bei künftiger Template-Nutzung©inperson-dark.htmlzu{{body}}copy;korrumpiert. Habe das ganze multiline-Substitutions-Block auf eine literal-stringlreplace-Funktion umgestellt — gleiche Logik, keine Sonderzeichen-Interpretation.QA
./build.shdurchgelaufen (59 sites OK,build/clean rebuild).diff sites/<x>/index.html build/<x>/index.htmlbyte-identical für 4 stichprobenartig geprüfte Sites (lexsiebels, orakil, ichbinotto, smartin3). Keinschema_jsonld-Leak in Custom-Output.tests/fixtures/) decken: explizitestype: Person, Template-DefaultProduct, Template-DefaultArticle. Vierte Fixture (no-schema.yaml) verifiziert leeren Slot../tests/schema-test.sh→ 4/4 PASS. JSON-LD ist gültiges JSON, hat@context: https://schema.org, korrekten@type, keintype-Restkey.&(nicht escaped, JSON-LD-konform —&braucht in JSON-string keine Entity).Out of Scope (separate Issues)
template: custom, müssen handgepflegt werden bzw. erst auf Templates portiert. Folge-Issue.Files
templates/base.html(+1 Zeile)render.sh(+ Schema-Block, lreplace-Refactor)README.md(+ Schema.org-Sektion)tests/schema-test.sh+tests/fixtures/*.yaml(neu)