"""Quelle aller Seiten. Inhalte hier ändern, dann: python3 tools/build_pages.py """ import hashlib, os, re from PIL import Image OUT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SITE = "https://schmacko-napf.de" def version(path): # Prüfsumme als ?v=… – Browser laden CSS/JS nach jeder Änderung neu statt aus dem Cache return hashlib.md5(open(os.path.join(OUT, path), "rb").read()).hexdigest()[:8] CSS_V, JS_V = version("assets/site.css"), version("assets/site.js") LOGO = "assets/img/logo.webp" CERT = "assets/img/gh-siegel.webp" CERT_ALT = "Zertifiziert nach G&H Tierernährung – Gesund gefüttert Heidi Herrmann" # Buchungsportal (PetWorkers) – & als & für HTML-Attribute. # Direkt die Seiten-IDs verlinken: Die seite.php?name=…-Adressen leiten um bzw. landen bei # Ernährungs- und Kaufberatung nur auf der Portal-Startseite. Für Kaufberatung gibt es im # Portal (Stand Okt. 2026) keine eigene Seite – sobald es eine gibt, hier wieder aufnehmen. PW = "https://schmacko-napf.petworkers.app/" BOOK = { "coach": ("Einzelcoaching", PW + "index.php?id=11"), "groups": ("Gruppenstunden", PW + "index.php?id=12"), "courses": ("Kurse & Workshops", PW + "index.php?id=13"), "food": ("Ernährungs­beratung", PW + "index.php?id=107"), "cal": ("Stundenplan", PW + "index.php?view=kalender"), } EXT = ' target="_blank" rel="noopener"' BARF = "assets/img/barf-teller.webp" def img(name, alt, sizes="(max-width: 980px) 100vw, 55vw", lazy=True): """Foto aus assets/img mit kleiner (-900) und großer Variante.""" big, small = f"assets/img/{name}.webp", f"assets/img/{name}-900.webp" wb = Image.open(os.path.join(OUT, big)).width ws = Image.open(os.path.join(OUT, small)).width load = ' loading="lazy"' if lazy else "" return f'{alt}' PHONE, PHONE_HREF = "+49 176 569 329 42", "tel:+4917656932942" MAIL = "info@schmacko-napf.de" WA = "https://wa.me/4917656932942" def ic(d, sw="1.8"): return f'' I = { "arrow": ic('', "2"), "down": ic('', "2"), "menu": ic('', "2"), "phone": ic(''), "mail": ic(''), "chat": ic(''), "bowl": ic(''), "bone": ic(''), "leash": ic(''), "car": ic(''), "shield": ic(''), "wind": ic(''), "ext": ic('', "2"), "cal": ic(''), } ARROW_BADGE = f'{I["arrow"]}' NAV = [("hundeschule.html", "Hundetraining"), ("ernaehrung.html", "Ernährung"), ("shop.html", "Shop"), ("transportboxen.html", "Transportboxen"), ("ueber-mich.html", "Über mich"), ("index.html#kontakt", "Kontakt")] def head(title, desc, path, robots=""): url = f"{SITE}/{'' if path == 'index.html' else path}" meta_robots = f'\n ' if robots else "" return f''' {title} {meta_robots} ''' def header(current=None): cur = ' aria-current="page"' links = "\n".join(f' {t}' for h, t in NAV) return f''' ''' def booking(keys, title="Termin buchen.", text="Freie Termine, Kurse und der Stundenplan – direkt in meinem Buchungsportal."): links = "\n".join(f' {BOOK[k][0]}{I["ext"]}' for k in keys) return f'''
Online buchen

{title}

{text}

''' def contact(photo="hund-wald", alt="Schwarze Schäferhündin steht aufmerksam im Wald"): go = f'{I["arrow"]}' return f'''
{img(photo, alt, "(max-width: 980px) 100vw, 45vw")}
''' def footer(): return f''' ''' def page_hero(photo, kicker, title, text, alt): return f'''
{img(photo, alt, "100vw", lazy=False)} {kicker}

{title}

{text}

''' def page(name, title, desc, current, body, robots=""): write(name, head(title, desc, name, robots) + "\n" + header(current) + '
\n' + body + footer()) def write(name, html): open(os.path.join(OUT, name), "w").write(html) PAGES = [] # für die Sitemap # ================================================================ Startseite tiles = [ ("hundeschule.html", "Hundeschule", "", "katha-abendlicht", "Katha mit ihrem Hund auf einer Wiese im Abendlicht"), ("ernaehrung.html", "Ernährungs­beratung", "", "futternapf", "Hund schnuppert an einem Napf mit Trockenfutter"), ("shop.html", "Shop", "", "laden", "Hund in einem Laden mit Hundezubehör"), ("transportboxen.html", "Transportboxen", "Maßanfertigung fürs Auto", "kofferraum", "Hund sitzt im offenen Kofferraum hinter einem Trenngitter"), ] tile_html = "" for href, name, sub, photo, alt in tiles: small = f"{sub}" if sub else "" tile_html += f''' {img(photo, alt, "(max-width: 767px) 100vw, 50vw", lazy=False)} {name}{small} {I["arrow"]} ''' index = head("Schmacko Napf & Hundetraining by Katha", "Hundetraining, Ernährungs- und Gesundheitsberatung, Shop und maßgefertigte Transportboxen – Schmacko Napf by Katha in Wörth a.d. Isar.", "index.html") + '\n' + header() + f'''
{img("hund-rennt", "Schwarzer Schäferhund rennt freudig über einen Feldweg", "100vw")} {ARROW_BADGE} Hundetraining

Entspannt durch
den Alltag.

Einzeltraining, Hausbesuch und Außentraining in der Gruppe.

Einzeltraining 60 € / Std. Gruppe 18 € 10er-Karte 165 €

„Futter ist mehr als nur Nahrung – es ist Fürsorge in Napfform.“

— Katha
Meine Philosophie · die 5 Säulen
  • 01RespektDen Hund als eigenständiges Wesen ernst nehmen.
  • 02EhrlichkeitKlare Signale schaffen Vertrauen.
  • 03GeduldJeder Hund lernt in seinem Tempo.
  • 04KonsequenzKlare Regeln – fair und ohne Druck.
  • 05VerständnisBedürfnisse und Gefühle verstehen.
{booking(["coach", "groups", "courses", "food", "cal"])}{contact()}''' + footer() write("index.html", index) PAGES.append("index.html") # ================================================================ Hundetraining page("hundeschule.html", "Hundetraining – Schmacko Napf", "Einzeltraining, Hausbesuche und Gruppentraining im Außenbereich mit Katha, zertifizierte Hundetrainerin nach § 11 TierSchG.", "hundeschule.html", page_hero("katha-abendlicht", "Hundetraining", "Für beide Seiten
der Leine.", "Vertrauen, klare Kommunikation und Training, das im Alltag funktioniert.", "Katha mit ihrem Hund auf einer Wiese im Abendlicht") + f'''
Einzeltraining & Hausbesuch

Individuell.
Bei dir zu Hause.

Für Grundgehorsam, Unsicherheit, Leinenführigkeit oder einen neuen Hund im Haus.

60 €pro Stunde · nach dem Erstgespräch (120 €, ca. 2 Std.)
{img("hund-wald", "Schwarze Schäferhündin steht aufmerksam im Wald")}
{img("hund-rennt", "Schwarzer Schäferhund rennt über einen Feldweg")}
Gruppe & Außentraining

Training da, wo
das Leben ist.

In der Stadt, im Grünen, in Geschäften – mit max. 6 Mensch-Hund-Teams.

18 €pro Mensch-Hund-Team
Die 5 Säulen
  • 01RespektHunde wollen ernst genommen werden.
  • 02EhrlichkeitHunde lesen unsere Körpersprache sofort.
  • 03GeduldLernen braucht Zeit und Wiederholung.
  • 04KonsequenzKlare Regeln, ganz ohne Gewalt.
  • 05VerständnisRealistische Erwartungen an jeden Hund.
Preise

Fair und klar.

Erstgespräch Einzeltrainingca. 2 Stunden · zzgl. 0,30 € / km120 €
Einzeltrainingpro Stunde · zzgl. 0,30 € / km60 €
Gruppentrainingpro Mensch-Hund-Team · max. 2 Hunde pro Halter18 €
10er-KarteGruppe & Einzel frei kombinierbar165 €
{booking(["coach", "groups", "courses", "cal"])}{contact("katha-heide", "Katha sitzt mit ihrer Schäferhündin im Grünen")}''') PAGES.append("hundeschule.html") # ================================================================ Ernährung page("ernaehrung.html", "Ernährungsberatung – Schmacko Napf", "Individuelle Futterpläne und Gesundheitsberatung für Hunde jeden Alters – BARF, Koch-BARF, Nass- und Trockenfutter.", "ernaehrung.html", page_hero("futternapf", "Ernährungs- & Gesundheits­beratung", "Fürsorge
in Napfform.", "Individuelle Futterpläne – gesund, sensibel oder mit Diagnose.", "Hund schnuppert an einem Napf mit Trockenfutter") + f'''
Kennst du das?

Jeder sagt
etwas anderes.

Ich bringe Klarheit in die Futter-Frage – und erstelle einen Plan, der zu deinem Hund passt.

BARFTeil-BARFKoch-BARFNassfutterTrockenfutter
{CERT_ALT}
Teller mit frischem Fleisch, Gemüse und Obst
Ablauf

So starten wir.

  1. 01ErstgesprächVor Ort, am Telefon oder online.
  2. 02FutterplanGenau auf deinen Hund abgestimmt.
  3. 03Fragen klärenNach 3 Tagen gehen wir alles durch.
  4. 04NachbesprechungNach 4 Wochen schauen wir gemeinsam drauf.
Rationsprüfung

Passt das
Futter?

kostenlos
Erstgespräch

Kennen­lernen

ab 45 €ca. 60 Minuten
Futterplan

Dein
Plan

ab 75 €inkl. Folgegespräch nach 4 Wochen
{booking(["food"], "Beratung buchen.", "Erstgespräch und Futterplan direkt online buchen – vor Ort, am Telefon oder online.")}{contact()}''') PAGES.append("ernaehrung.html") # ================================================================ Shop page("shop.html", "Shop – Schmacko Napf", "Ausgewähltes Futter, Snacks und Zubehör für deinen Hund.", "shop.html", page_hero("laden", "Shop", "Ausgewählt
mit Herz.", "Futter, Snacks und Zubehör, hinter denen ich stehe.", "Hund in einem Laden mit Hundezubehör") + f'''
{I["bowl"]}

Futter

Passend zu deinem Futterplan.

{I["bone"]}

Snacks

Natürlich – fürs Training und zum Belohnen.

{I["leash"]}

Zubehör

Robust und durchdacht für den Alltag.

Der Online-Shop ist bald da.
Bis dahin: schreib mir einfach.

{contact()}''') PAGES.append("shop.html") # ================================================================ Transportboxen page("transportboxen.html", "Transportboxen nach Maß – Schmacko Napf", "Maßgefertigte Hunde-Transportboxen fürs Auto – passgenau für Fahrzeug und Hund.", "transportboxen.html", page_hero("kofferraum", "Maßanfertigung", "Transportboxen
fürs Auto.", "Passgenau für dein Fahrzeug und deinen Hund.", "Hund sitzt im offenen Kofferraum hinter einem Trenngitter") + f'''
{I["car"]}

Passgenau

Exakt für deinen Kofferraum gebaut.

{I["shield"]}

Sicher

Stabil – für jede Fahrt.

{I["wind"]}

Bequem

Luftig und mit genug Platz.

Ablauf

In 4 Schritten zur eigenen Box.

  1. 01BeratungAuto, Hund und Wünsche.
  2. 02AusmessenKofferraum und Hund genau vermessen.
  3. 03FertigungDeine Box entsteht nach Maß.
  4. 04ÜbergabeEinbau – und los geht’s.
{contact()}''') PAGES.append("transportboxen.html") # ================================================================ Über mich page("ueber-mich.html", "Über mich – Schmacko Napf", "Katha – zertifizierte Hundetrainerin nach § 11 TierSchG sowie Hunde-Ernährungs- und Gesundheitsberaterin. Ausbildungen und Weiterbildungen.", "ueber-mich.html", page_hero("katha-heide", "Über mich", "Hallo,
ich bin Katha.", "Mein Herz gehört den Tieren – an meiner Seite meine Holländische Schäferhündin Elina.", "Katha sitzt mit ihrer Schäferhündin im Grünen") + f'''
Warum ich das mache

Tiere sind die
ehrlichsten Wesen.

Und trotzdem werden sie oft missverstanden. Ich möchte meine Erfahrung teilen und ihre Welt ein Stück besser machen.

{img("hund-wald", "Schwarze Schäferhündin steht aufmerksam im Wald")}
{img("hund-rennt", "Schwarzer Schäferhund rennt über einen Feldweg")}
Wie alles begann

Mit der Frage nach
dem richtigen Futter.

Für meine eigene Hündin suchte ich die beste Ernährung – daraus wurde eine Leidenschaft und schließlich mein Beruf.

Ausbildungen {CERT_ALT}
  • 2021 – 2023HundetrainerinDiane Bartlog, Hundeschule Mengkofen
  • 2022 – 2023Hunde-ErnährungsberaterinHeidi Herrmann, G&H Tierernährung
  • 2024Hunde-GesundheitsberaterinG&H Tierernährung
  • Okt. 2024Erlaubnis nach § 11 TierSchGVeterinäramt Landshut
Weiterbildungen
  • 2025Webinar „Pankreas – ein Drüsenorgan mit vielen Aufgaben“
  • 2025Roundtable der BIG FIVE – Problemverhalten richtig einschätzen
  • 2024Workshop „Einschätzen von 8 Malinois“
  • 2024Workshop „Arbeiten mit schwierigen Hunden & Selbstschutz“
  • 2023Blutbilder verstehen · Äußere Anzeichen – innere Organe
  • 2023Blickschulung – Hunde ganzheitlich betrachtet
  • 2023Zusatzqualifikation Katzen-Ernährungsberaterin
  • 2021D.O.Q.-Test 2.0 (Hundeführerschein)
{contact("katha-abendlicht", "Katha mit ihrem Hund auf einer Wiese im Abendlicht")}''') PAGES.append("ueber-mich.html") # ================================================================ Impressum page("impressum.html", "Impressum – Schmacko Napf", "Impressum von Schmacko Napf & Hundetraining by Katha.", None, f'''
Rechtliches

Impressum

''', robots="noindex") PAGES.append("impressum.html") # ================================================================ Datenschutz page("datenschutz.html", "Datenschutz – Schmacko Napf", "Datenschutzerklärung von Schmacko Napf & Hundetraining by Katha.", None, f'''
Rechtliches

Datenschutz

''', robots="noindex") PAGES.append("datenschutz.html") # ================================================================ 404 page("404.html", "Seite nicht gefunden – Schmacko Napf", "Diese Seite gibt es leider nicht.", None, f'''
Fehler 404

Hier ist leider
nichts zu finden.

Vielleicht hat ein Hund die Seite vergraben. Über die Startseite findest du alles wieder.

''', robots="noindex") # 404 wird vom Server unter beliebigen Pfaden ausgeliefert – Links und Bilder ab der Wurzel (/…) angeben. # Kein : damit würde „Zum Inhalt springen“ (#inhalt) auf die Startseite führen. p404 = os.path.join(OUT, "404.html") html404 = open(p404).read() html404 = re.sub(r'srcset="([^"]+)"', lambda m: 'srcset="' + ", ".join("/" + s.strip() for s in m.group(1).split(",")) + '"', html404) html404 = re.sub(r'\b(href|src)="(?![a-z]+:|#|/)', r'\1="/', html404) open(p404, "w").write(html404) # ================================================================ robots.txt & sitemap.xml write("robots.txt", f"User-agent: *\nAllow: /\n\nSitemap: {SITE}/sitemap.xml\n") urls = "\n".join(f" {SITE}/{'' if p == 'index.html' else p}" for p in PAGES if p not in ("impressum.html", "datenschutz.html")) write("sitemap.xml", f'\n\n{urls}\n\n') print("ok")