"""Erzeugt die HTML-Seiten aus gemeinsamen Bausteinen (Header, Footer, Galerie-Daten). Quelle der Wahrheit für Inhalt und Struktur ist diese Datei — die HTML-Dateien nicht von Hand ändern, sondern hier ändern und neu erzeugen: python3 tools/build_images.py (nur wenn sich Fotos geändert haben) python3 tools/build_pages.py (braucht Pillow: pip install pillow) """ import json from html import escape from pathlib import Path from urllib.parse import quote from PIL import Image OUT = Path(__file__).resolve().parent.parent IMG = OUT / "assets/img" SITE = "https://normtor.de" DEMO = True # Entwurf: noindex + Hinweis im Formular. Vor dem Launch auf False setzen. FIRMA = "HEB Bauelemente" INHABER = "Wolfgang Haas" STRASSE = "Am Ring 20" ORT = "84051 Essenbach / Mirskofen" TEL = "08703 / 13 62" TEL_HREF = "tel:+4987031362" MAPS = "https://www.google.com/maps/search/?api=1&query=" + quote("Am Ring 20, 84051 Essenbach") FACEBOOK = "https://www.facebook.com/heb.bauelemente" # ---------- Icons ---------- I_ARROW = '' I_PHONE = '' I_PIN = '' I_MAIL = '' I_CHECK = '' I_X = '' I_PREV = '' I_NEXT = '' I_FB = '' # Logo nachgezeichnet: H und E teilen sich den Mittelstrich, wie im Original-Rasterlogo HEB_MARK = ('') def pic(name, alt, sizes="100vw", eager=False, cls=""): w, h = Image.open(IMG / f"{name}-800.webp").size big = (IMG / f"{name}-1200.webp").exists() if big: w, h = Image.open(IMG / f"{name}-1200.webp").size load = 'fetchpriority="high"' if eager else 'loading="lazy" decoding="async"' c = f' class="{cls}"' if cls else "" def srcset(ext): return f"assets/img/{name}-800.{ext} 800w" + (f", assets/img/{name}-1200.{ext} 1200w" if big else "") src = f"assets/img/{name}-{1200 if big else 800}.webp" return (f'' f'' f'' f'{escape(alt)}') # ---------- Galerie ---------- # (Bildname, Titel, Unterzeile, Kategorien) — Titel von der alten Seite übernommen, wo vorhanden. # Kategorien: dst = Deckensektionaltor, sst = Seitensektionaltor, schwing = Schwingtor, # holz = Holz & Sonderlösungen, region = Projekte aus der Region GALLERY = [ ("flair-1", "Normstahl Flair", "Farbe DB 703", "dst region"), ("garagenhof", "Garagenhof", "Alt und neu nebeneinander", "dst region"), ("condor-schraegschnitt", "Sektionaltor mit Schrägschnitt", "320 mm Gefälle ausgeglichen", "dst holz region"), ("anthrazit-iso", "Normstahl Style für Fertiggaragen", "Anthrazit, glatt", "dst region"), ("condor-ligna", "Condor Wood Ligna Light", "Mit Schlupftür und Glassektion", "holz region"), ("essenbach-ohu", "Deckensektionaltor Eurostyle", "Mit Sturzblende, Essenbach-Ohu", "dst region"), ("superior-graualu", "Superior Style", "Graualuminium", "dst"), ("doppelgarage-beige", "Doppelgarage", "Zwei Sektionaltore", "dst region"), ("sst-style", "Seitensektionaltor Style", "Anthrazitgrau", "sst"), ("condor-granit", "Condor Granit", "Sektionaltor, glatt", "dst region"), ("rustiko", "Normstahl Rustiko", "Holz mit aufgesetzter Zarge", "schwing holz region"), ("smart-trend", "Smart Trend", "Eiche dunkel, Woodgrain", "dst"), ("anthrazit-solo", "Sektionaltor in Anthrazit", "Mit Verkleidung", "dst region"), ("prominent-rottenburg", "Schwingtor Prominent", "Taubenblau, Rottenburg", "schwing region"), ("superior-linea", "Superior Linea", "Verkehrsweiß, glatt", "dst"), ("condor-schlupftuer", "Condor mit Schlupftür", "Holzoptik mit Fenstern", "holz region"), ("sst-trend", "Seitensektionaltor Trend", "Anthrazitgrau", "sst"), ("flair-2", "Normstahl Flair", "Farbe DB 703", "dst region"), ("eurostyle-iso", "Eurostyle ISO", "Weißaluminium mit Design-Motiven", "dst region"), ("smart-style", "Smart Style", "Anthrazit, glatt", "dst"), ("variant", "Normstahl Variant", "Vom Kunden selbst belegt", "schwing holz region"), ("doppelgarage-hell", "Doppelgarage", "Zwei helle Sektionaltore", "dst region"), ("superior-eiche", "Superior Style", "Eiche hell", "dst"), ("sst-design", "Seitensektionaltor", "Mit Design-Applikation", "sst region"), ("elegant", "Schwingtor Elegant", "Taubenblau mit Messinggriff", "schwing region"), ("topline-iso", "Topline ISO", "Moosgrün, links laufend", "schwing region"), ("mueller-muenster", "Sektionaltor", "Anthrazit", "dst region"), ] FILTERS = [("alle", "Alle"), ("region", "Aus der Region"), ("dst", "Deckensektionaltore"), ("sst", "Seitensektionaltore"), ("schwing", "Schwingtore"), ("holz", "Holz & Sonderlösungen")] NAV = [("index.html#leistungen", "Leistungen"), ("index.html#renovierung", "24-h-Renovierung"), ("projekte.html", "Tore & Projekte"), ("index.html#ueber-uns", "Über uns"), ("kontakt.html", "Kontakt")] HEAD_SCRIPT = ("(function(r){r.classList.add('js');try{if(r.hasAttribute('data-intro')&&!sessionStorage.getItem('heb-intro')" "&&matchMedia('(prefers-reduced-motion: no-preference)').matches)r.classList.add('has-intro')}catch(e){}" "setTimeout(function(){if(!r.classList.contains('ready'))r.classList.remove('has-intro')},3500)})(document.documentElement)") LD = { "@context": "https://schema.org", "@type": "HomeAndConstructionBusiness", "name": "HEB Bauelemente – Wolfgang Haas", "description": "Garagentore, Torantriebe, Reparatur und Garagen-Renovierung in 24 Stunden im Raum Landshut und Rottenburg.", "url": SITE + "/", "telephone": "+49 8703 1362", "founder": {"@type": "Person", "name": INHABER}, "address": {"@type": "PostalAddress", "streetAddress": STRASSE, "postalCode": "84051", "addressLocality": "Essenbach", "addressRegion": "Bayern", "addressCountry": "DE"}, "areaServed": ["Landshut", "Rottenburg an der Laaber", "Essenbach"], "brand": ["Normstahl", "Sommer", "Aperto"], "image": SITE + "/assets/img/og.jpg", "sameAs": [FACEBOOK], } def head(title, desc, file, intro=False): ld = f'' if file == "index.html" else "" canonical = SITE + "/" + ("" if file == "index.html" else file) robots = '\n' if DEMO else "" return f''' {title} {robots} {ld} ''' def brand(): return (f'{HEB_MARK}' 'BauelementeWolfgang Haas · Essenbach') def header(active): def cur(f): return ' aria-current="page"' if f == active else "" links = "".join(f'{n}' for f, n in NAV) mlinks = "".join(f'
  • {n}
  • ' for f, n in NAV) return f''' ''' FOOTER = f'''

    Fragen kostet nichts

    Rufen Sie einfach an.

    Ob neues Tor, klemmender Antrieb oder gebrochene Feder: Sie sprechen direkt mit Wolfgang Haas, ganz ohne Warteschleife und Callcenter.

    ''' def page(file, title, desc, body, intro=False, active=None): html = head(title, desc, file, intro) + "\n" + header(active or file) + \ f'\n
    \n{body}\n
    ' + FOOTER + "\n\n\n" (OUT / file).write_text(html, encoding="utf-8") print("geschrieben:", file) def page_hero(title, lead, eyebrow): return f'''

    {eyebrow}

    {title}

    {lead}

    ''' # ============================== Startseite ============================== GATE = '' LEISTUNGEN = [ ("superior-linea", "Neue Garagentore", "Schwing-, Deckensektional- und Seitensektionaltore von Normstahl, dazu Industrietore. Wir beraten bei Ihnen vor Ort, nehmen Maß und montieren selbst.", ["Schwingtore", "Sektionaltore", "Industrietore"]), ("sst-style", "Torantriebe", "Antriebe von Sommer und Aperto für Garagen- und Hoftore. Für Reihengaragen ohne Stromanschluss gibt es Akku-Antriebe mit Wechselakku, auf Wunsch mit Solarmodul.", ["Garagentor", "Hoftor", "Akku & Solar"]), ("flair-2", "Reparatur & Wartung", "Das Tor klemmt, eine Feder ist gebrochen oder der Antrieb streikt? Wir haben alle gängigen Ersatzteile und bringen auch ältere Tore wieder in Gang.", ["Ersatzteile", "Federn", "Instandhaltung"]), ] STEPS = [ ("Altes Tor ausbauen", "Wir demontieren Ihr altes Garagentor fachgerecht."), ("Neues Tor einbauen", "Das neue Normstahl-Tor wird passgenau montiert, auf Wunsch gleich mit Antrieb."), ("Beiputzen & Estrich", "Sturz und Laibung werden beigeputzt, fehlender Estrich wird eingebracht."), ("Besenrein übergeben", "Sie bekommen Ihre Garage besenrein und voll funktionsfähig zurück."), ] TEASER = ["flair-1", "anthrazit-iso", "doppelgarage-hell", "condor-granit", "doppelgarage-beige"] G = {g[0]: g for g in GALLERY} INDEX = f'''
    {pic("hero", "Weißes Einfamilienhaus mit anthrazitfarbenem Normstahl-Sektionaltor in der Doppelgarage", eager=True, cls="hero__img")} {GATE}

    Normstahl-Fachbetrieb in Essenbach

    Ihr Garagentor. In guten Händen.

    Beratung, Aufmaß, Montage und Reparatur aus einer Hand, seit über 25 Jahren im Großraum Landshut und Rottenburg.

    Leistungen

    Alles rund ums Garagentor.

    Wir verkaufen Tore nicht nur, wir bauen sie auch ein und sind danach weiter für Sie da.

    {"".join(f"""
    {pic(img, title, sizes="(min-width: 960px) 30vw, 100vw")}
    0{i + 1}

    {title}

    {text}

      {"".join(f"
    • {t}
    • " for t in tags)}
    """ for i, (img, title, text, tags) in enumerate(LEISTUNGEN))} 04 24 h

    Garagen-Renovierung

    Altes Tor raus, neues Tor rein, alles verputzt, in nur einem Tag und zum Festpreis.

    So läuft es ab {I_ARROW}

    Unser Serviceangebot

    Alt raus. Neu rein.
    In 24 Stunden.

    Wir renovieren Ihre Garage innerhalb eines Tages, zum vorher vereinbarten Festpreis. Danach ist alles sauber, und das Tor läuft.

      {"".join(f"""
    1. {i + 1}

      {t}

      {d}

    2. """ for i, ((t, d), h) in enumerate(zip(STEPS, (6, 12, 19, 24))))}
    3. {pic("garagenhof", "Garagenhof mit drei Toren: links ein altes Schwingtor, daneben zwei neue Sektionaltore", sizes="(min-width: 960px) 50vw, 100vw")}
      Alt neben neu: ein Garagenhof aus unseren Projekten.
      Festpreis anfragen {I_ARROW}

    Tore & Projekte

    Aus Essenbach, Rottenburg und Umgebung.

    Alle {len(GALLERY)} Projekte ansehen {I_ARROW}
    {pic("haas", "Porträt von Wolfgang Haas, Inhaber von HEB Bauelemente", sizes="(min-width: 960px) 40vw, 100vw")}
    Wolfgang HaasInhaber · Essenbach-Mirskofen

    Über uns

    Bei uns sprechen Sie mit dem Chef.

    „Seit mehr als 25 Jahren befasse ich mich mit Normstahl-Toren. Von der Planung bis zur Beratung, vom Aufmaß bis zur Montage bekommen Sie bei mir alles aus einer Hand.“

    Weil nicht immer alles passt, setze ich bei Antrieben auf Sommer Antriebs- und Funktechnik aus Deutschland. Auch die können keinen Kreis gerade biegen, aber sie bieten Lösungen, wo andere aufgeben müssen.

    Damit wir technisch auf dem neuesten Stand bleiben, besuchen wir regelmäßig die Servicepartner-Schulungen unserer Lieferanten.

    Ihr Wolfgang Haas

    Fachbetrieb statt Discount

    Warum nicht einfach online bestellen?

    Ein Tor aus dem Internet ist schnell gekauft. Spätestens bei der ersten Störung zeigt sich, ob jemand in der Nähe ist, der hilft.

    Tor aus dem Internet

    • {I_X}Maße nehmen Sie selbst und hoffen, dass sie stimmen
    • {I_X}Den Einbau übernehmen Sie oder jemand anderes
    • {I_X}Bei Störungen hilft nur eine Hotline in der Ferne

    HEB Bauelemente vor Ort

    • {I_CHECK}Beratung und Aufmaß bei Ihnen zu Hause
    • {I_CHECK}Fachgerechte Montage aus einer Hand
    • {I_CHECK}Im Ernstfall schnell da, mit allen gängigen Ersatzteilen

    Die Freude an der richtigen Entscheidung währt länger als die Freude am billigen Einkauf.

    Unsere Partner

    Marken, auf die wir uns verlassen.

    Wir sind Komplettanbieter für Normstahl-Tore samt Ersatzteilen und Zubehör. Bei Antrieben arbeiten wir mit Sommer und der Fachhandelsmarke Aperto. Auf Wunsch leiten wir Ihre Anfrage auch an die Vertretung weiter, die für Ihre Postleitzahl zuständig ist.

    • NormstahlGaragen- und Industrietore
    • SommerAntriebs- und Funktechnik
    • ApertoGaragen- und Hoftorantriebe
    ''' # ============================== Projekte ============================== PROJEKTE = page_hero("Tore & Projekte", "Eine Auswahl an Toren, die wir eingebaut haben, und an Modellen, die wir anbieten. Ein Klick vergrößert das Bild.", "Galerie") + f'''
    {"".join(f'' for k, n in FILTERS)}

    {len(GALLERY)} Tore

    Ihr Wunschmodell ist nicht dabei? Normstahl bietet viele weitere Oberflächen, Farben und Größen. Wir bringen Muster mit, wenn wir zu Ihnen kommen.

    ''' # ============================== Kontakt ============================== ANLIEGEN = [("tor", "Neues Garagentor"), ("antrieb", "Antrieb"), ("reparatur", "Reparatur"), ("renovierung", "24-h-Renovierung")] DEMO_NOTE = ('

    Hinweis: Dies ist ein Entwurf. Das Formular verschickt noch nichts, ' 'denn der Versand wird erst beim Launch eingerichtet.

    ') if DEMO else "" KONTAKT = page_hero("Kontakt", "Am schnellsten geht es per Telefon. Oder Sie schreiben uns kurz, worum es geht, und wir rufen zurück.", "Wir sind für Sie da") + f'''

    Anfrage senden

    Worum geht es?
    {"".join(f'' for k, n in ANLIEGEN)}
    Wann dürfen wir zurückrufen?
    {"".join(f'' for v, n in (("vormittags", "Vormittags"), ("nachmittags", "Nachmittags"), ("egal", "Egal")))}
    {DEMO_NOTE}
    ''' # ============================== Rechtliches ============================== IMPRESSUM = page_hero("Impressum", "Angaben gemäß § 5 Digitale-Dienste-Gesetz (DDG).", "Rechtliches") + f'''
    ''' DATENSCHUTZ = page_hero("Datenschutz", "Diese Website setzt keine Cookies und verwendet kein Tracking.", "Rechtliches") + f'''
    ''' page("index.html", "HEB Bauelemente – Garagentore & Antriebe in Essenbach | Wolfgang Haas", "Normstahl-Garagentore, Sommer-Antriebe, Reparatur und Garagen-Renovierung in 24 Stunden zum Festpreis. Ihr Fachbetrieb im Raum Landshut und Rottenburg.", INDEX, intro=True) page("projekte.html", "Tore & Projekte – HEB Bauelemente Essenbach", "Garagentore aus der Region Landshut und Rottenburg: Deckensektionaltore, Seitensektionaltore, Schwingtore und Holztore von Normstahl.", PROJEKTE) page("kontakt.html", "Kontakt – HEB Bauelemente, Wolfgang Haas", "Rufen Sie an unter 08703 1362 oder senden Sie eine Anfrage für Garagentor, Antrieb, Reparatur oder 24-h-Renovierung.", KONTAKT) page("impressum.html", "Impressum – HEB Bauelemente", "Impressum von HEB Bauelemente, Wolfgang Haas, Am Ring 20, 84051 Essenbach.", IMPRESSUM) page("datenschutz.html", "Datenschutz – HEB Bauelemente", "Datenschutzerklärung von HEB Bauelemente: keine Cookies, kein Tracking.", DATENSCHUTZ)