"""Erzeugt die sieben HTML-Seiten aus gemeinsamen Bausteinen (Header, Footer, Leistungen). 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_pages.py (braucht Pillow: pip install pillow) """ import json from datetime import date from pathlib import Path from PIL import Image OUT = Path(__file__).resolve().parent.parent IMG = OUT / "assets/img" YEARS = date.today().year - 2003 # motion.js aktualisiert zur Laufzeit SITE = "https://www.kirschner-service.de" TEL = "0871 / 14 26 91 01" TEL_HREF = "tel:+4987114269101" SOS = "0160 / 836 57 53" SOS_HREF = "tel:+491608365753" MAIL = "info@kirschner-service.de" GEO = (12.1740033, 48.5646225) # Etzstraße 45, Ergolding (OpenStreetMap) MAPS = "https://www.google.com/maps/search/?api=1&query=Etzstra%C3%9Fe+45%2C+84030+Ergolding" def mailto(subject, body=""): from urllib.parse import quote q = "subject=" + quote(subject) if body: q += "&body=" + quote(body) return f"mailto:{MAIL}?{q}" ANFRAGE = mailto("Angebotsanfrage", "Guten Tag,\n\nich interessiere mich für Ihre Leistungen.\n\nObjekt / Adresse:\nGewünschte Leistungen:\nTelefon für Rückruf:\n\nViele Grüße\n") # ---------- Icons ---------- I_ARROW = '' I_ARROW_S = '' I_PHONE = '' I_DOWN = '' I_PLUS = '' I_DRAG = '' def chev_mark(cls="chev-mark"): return (f'') HERO_CHEVRONS = ('') BAND_CHEV = ('') def pic(name, alt, sizes="100vw", eager=False, cls=""): w, h = Image.open(IMG / f"{name}-1600.webp").size if (IMG / f"{name}-1600.webp").exists() else Image.open(IMG / f"{name}-1400.webp").size big = 1600 if (IMG / f"{name}-1600.webp").exists() else 1400 load = 'fetchpriority="high"' if eager else 'loading="lazy" decoding="async"' c = f' class="{cls}"' if cls else "" return (f'' f'' f'' f'{alt}') NAV = [("index.html", "Start"), ("leistungen.html", "Leistungen"), ("unternehmen.html", "Unternehmen"), ("karriere.html", "Karriere"), ("kontakt.html", "Kontakt")] HEAD_SCRIPT = ("(function(r){r.classList.add('js');try{if(r.hasAttribute('data-intro')&&!sessionStorage.getItem('kk-intro')" "&&matchMedia('(prefers-reduced-motion: no-preference)').matches)r.classList.add('has-intro')}catch(e){}" "setTimeout(function(){if(!r.classList.contains('motion-ready'))r.classList.remove('js','has-intro')},3000)})(document.documentElement)") LD = { "@context": "https://schema.org", "@type": "LocalBusiness", "name": "Kirschner Gebäudeservice", "description": "Hausmeisterservice und Gebäudedienstleistungen in Landshut und Ergolding seit 2003.", "url": SITE + "/", "telephone": "+49 871 14269101", "email": MAIL, "foundingDate": "2003", "founder": {"@type": "Person", "name": "Thomas Kirschner"}, "address": {"@type": "PostalAddress", "streetAddress": "Etzstraße 45", "postalCode": "84030", "addressLocality": "Ergolding", "addressRegion": "Bayern", "addressCountry": "DE"}, "areaServed": ["Landshut", "Ergolding"], "slogan": "persönlich, zuverlässig, erstklassig", "image": SITE + "/assets/img/og.jpg", } def head(title, desc, file, intro=False): ld = f'' if file == "index.html" else "" canonical = SITE + "/" + ("" if file == "index.html" else file) return f''' {title} {ld} ''' def header(active): def cur(f): return ' aria-current="page"' if f == active else "" links = "".join(f'{n}' for f, n in NAV if f != "index.html") mlinks = "".join(f'
  • {n}
  • ' for f, n in NAV) return f'''
    ''' FOOTER = f''' Notruf 24/7{SOS} ''' def page(file, title, desc, body, intro=False): h = head(title, desc, file, intro) if "data-map" in body: h = h.replace("", '\n') html = h + "\n" + header(file) + f'\n
    \n{body}\n
    ' + FOOTER + "\n\n\n" (OUT / file).write_text(html, encoding="utf-8") print("geschrieben:", file, len(html)) def page_hero(h1, lead="", img=None, extra="", small=False): media = f'
    {pic(img, "", "100vw", eager=True)}
    ' if img else "" cls = "page-hero" + (" page-hero--image" if img else "") + (" page-hero--small" if small else "") lead_html = f'

    {lead}

    ' if lead else "" return f'''
    {media} {HERO_CHEVRONS}

    {h1}

    {lead_html} {extra}
    ''' # ====================================================================== # Leistungen (eine Quelle für Start und Leistungsseite) # ====================================================================== SERVICES = [ ("reinigung", "Reinigung", "Treppenhäuser, Innen- und Außenflächen nach festem Plan. Tiefgaragen mit modernen Maschinen.", "Treppenhaus in einem modernen Wohngebäude"), ("glas", "Glas- & PV-Reinigung", "Mit eigener Osmoseanlage und reinem Wasser — meist sogar ohne Hebebühne.", "Fensterreinigung mit Teleskopstange an einem Wohnhaus"), ("garten", "Garten- & Grünpflege", "Rasen, Hecken, Beete und Grünanlagen, das ganze Jahr über.", "Heckenschnitt in einer Gartenanlage"), ("technik", "Technische Hausbetreuung", "Kontrolle und Wartung technischer Anlagen.", "Rohrleitungen einer Haustechnikanlage"), ("reparatur", "Reparaturen & Renovierungen", "Handwerk im eigenen Team — vom Servicetechniker bis zum Schreiner.", "Handwerker bei der Arbeit mit einem Akkuschrauber"), ("winter", "Winterdienst", "Räumen und Streuen mit eigenen Fahrzeugen.", "Schneeräumung vor einem Gebäude"), ("bereitschaft", "24/7-Bereitschaft", "Auf Wunsch rund um die Uhr erreichbar — Notruf 0160 / 836 57 53.", "Reinigung einer Glasfassade am Abend"), ] MAP_SVG = '''''' def map_section(theme=""): return f'''

    Anfahrt

    Kirschner Gebäudeservice
    Etzstraße 45
    84030 Ergolding

    ''' # ====================================================================== # Startseite # ====================================================================== panels = "".join(f'''
    {pic(n, alt, "(min-width: 1024px) 38vw, (min-width: 700px) 50vw, 100vw")}{i:02d}

    {t}

    {d}

    ''' for i, (n, t, d, alt) in enumerate(SERVICES, 1)) INDEX = f'''
    {pic("hero", "", "100vw", eager=True)}
    {HERO_CHEVRONS}

    Ihr Gebäude.
    In besten Händen.

    Hausmeisterservice in Landshut und Ergolding — seit 2003.

    {panels}

    Glas- & PV-Reinigung mit Osmose.

    Eigene Osmoseanlage, reines Wasser, keine Rückstände — meist sogar ohne Hebebühne.

    Reinigung anfragen {I_ARROW}

    {pic("pv-nachher", "Photovoltaik-Modul nach der Reinigung, klar und glänzend", "(min-width: 960px) 55vw, 100vw")}
    {pic("pv-vorher", "Photovoltaik-Modul vor der Reinigung, mit Staub und Kalkflecken", "(min-width: 960px) 55vw, 100vw")}
    Symbolbild
    {pic("fassade", "", "100vw")}

    Persönlich. Zuverlässig. Erstklassig.

    {map_section("theme-deep")}
    {BAND_CHEV}

    Wir stellen ein.

    Hausmeister, Ga-La-Bauer, Glas- und Solarreiniger, Reinigungskräfte.

    Offene Stellen {I_ARROW}
    ''' page("index.html", "Kirschner Gebäudeservice — Hausmeisterservice in Landshut & Ergolding seit 2003", "Hausmeisterservice, Reinigung, Glas- & PV-Reinigung mit Osmose, Grünpflege, Winterdienst und 24/7-Bereitschaft in Landshut und Ergolding. Persönlich, zuverlässig, erstklassig — seit 2003.", INDEX, intro=True) # ====================================================================== # Leistungen # ====================================================================== rows = "".join(f'''
    {pic(n, alt, "(min-width: 960px) 52vw, 100vw")}
    {i:02d}

    {t}

    {d}

    ''' for i, (n, t, d, alt) in enumerate(SERVICES, 1)) LEISTUNGEN = page_hero("Leistungen", "Für Privat, Eigentümergemeinschaften, Gewerbe und die öffentliche Hand.", "seil", f'
    Angebot anfragen {I_ARROW}
    ') + f'''
    {rows}

    Zum Download

    Referenzobjekte in Landshut nennen wir Ihnen gern auf Anfrage.

    ''' page("leistungen.html", "Leistungen — Hausmeisterservice, Reinigung, Winterdienst | Kirschner Gebäudeservice", "Reinigung, Glas- & PV-Reinigung mit Osmoseanlage, Garten- & Grünpflege, technische Hausbetreuung, Reparaturen, Winterdienst und 24/7-Bereitschaft in Landshut und Ergolding.", LEISTUNGEN) # ====================================================================== # Unternehmen # ====================================================================== TIMELINE = [ ("2003", "Gründung in Ergolding", "Kirschner Gebäudeservice startet mit Dienstleistungen rund um Immobilien."), ("2013", "10 Jahre", "Zehn Jahre Kirschner Gebäudeservice."), ("2015", "Servicetechnik & Schreinerei", "Herr Listl verstärkt Servicetechnik und Hausmeisterei — mit langjähriger Erfahrung als Schreiner."), ("2018", "15 Jahre", "Jubiläumsfeier mit Geschäftspartnern. Die Spenden des Abends versorgen über 120 Kinder in Nepal ein Jahr lang mit Schulessen."), ("2019", "Das Team wächst", "Herr Gerhart und Herr Ponath kommen ins Team."), ("2020", "FC Ergolding", "Ein neuer Trikotsatz für die U8 des FC Ergolding 1932 e.V."), ] tl = "".join(f'''
    {y}

    {h}

    {p}

    ''' for y, h, p in TIMELINE) TEAM = [("TK", "Thomas Kirschner", "Geschäftsführung"), ("MP", "Marcel Pilsner", "Stellvertretende Geschäftsführung"), ("CK", "Christine Kirschner", "Assistenz Büro"), ("EM", "Elena Miller", "Qualitätsmanagement"), ("HL", "Harald Listl", "Hausmeister, technische Betreuung, Schreiner")] team = "".join(f'''
    {chev_mark("")}Foto folgt
    {n}{r}
    ''' for ini, n, r in TEAM) + '''
    und viele mehrKolleginnen und Kollegen
    ''' UNTERNEHMEN = page_hero("Das Original seit 2003.", "Persönlich, zuverlässig, erstklassig — aus Ergolding für Landshut und Umgebung.", "werkzeug") + f'''

    Geschichte

    {tl}

    Unser Team

    {team}
    {map_section()} ''' page("unternehmen.html", "Unternehmen & Team — Kirschner Gebäudeservice Ergolding", "Kirschner Gebäudeservice in Ergolding — das Original seit 2003. Geschichte, Team und Anfahrt.", UNTERNEHMEN) # ====================================================================== # Karriere # ====================================================================== JOBS = [ ("Handwerker / Hausmeister", ["Teilzeit", "Vollzeit", "auch Ga-La-Bauer, Glas- & Solarreiniger"], ["Erfahrung im jeweiligen Bereich", "Blick für Sauberkeit und Qualität", "Freundlichkeit, Teamfähigkeit & Motivation", "Ambition, Verantwortung zu übernehmen"], ["Sicherer Arbeitsplatz — krisenfest und zukunftssicher", "Weit übertarifliche Bezahlung und klare Aufstiegspläne", "Hochwertige Arbeitskleidung", "Boni: Spritgeld, Urlaubs- & Weihnachtsgeld, Erfolgsbonus", "Starkes Team, das sich gegenseitig unterstützt"], ["Du betreust feste Objekte, pflegst mit Kollegen Gärten und Grünflächen, reinigst Tiefgaragen mit modernen Maschinen und sorgst im Winter mit unseren Fahrzeugen für sichere Wege. Mit handwerklichem Geschick übernimmst Du auch Reparaturen.", "Die Arbeit ist über unsere eigene App strukturiert — ohne permanente Überstunden, ohne Freitagnachmittag und Samstag."], "Bewerbung: Handwerker / Hausmeister (TZ/VZ)"), ("Reinigungskraft", ["Minijob", "m/w/d"], ["Pünktlichkeit, Ehrlichkeit, Fleiß und Zuverlässigkeit", "Sauberes, gepflegtes Erscheinungsbild und gute Umgangsformen", "Blick für Sauberkeit", "Gutes Deutsch", "Idealerweise Erfahrung im Reinigungsbereich"], ["Tarifliche Vergütung sowie Gutscheine (z. B. Tanken)", "Flexible Zeiteinteilung", "30 Arbeitstage bezahlter Urlaub", "Lohnfortzahlung im Krankheitsfall", "Feste eigene Objekte statt Springer", "Arbeitszeit per App am Handy erfassen"], [], "Bewerbung: Reinigungskraft (Minijob)"), ("Hausmeister", ["Minijob", "m/w/d"], ["Pünktlichkeit, Ehrlichkeit, Fleiß und Zuverlässigkeit", "Sauberes, gepflegtes Erscheinungsbild und gute Umgangsformen", "Blick für Sauberkeit", "Gutes Deutsch", "Idealerweise Erfahrung im Garten oder handwerklich"], ["Übertarifliche Vergütung", "Prämien wie Gutscheine (z. B. Tanken)", "Flexible Zeiteinteilung", "30 Arbeitstage bezahlter Urlaub", "Lohnfortzahlung im Krankheitsfall", "Moderne Maschinen und Fuhrpark", "Arbeitszeit per App erfassen"], [], "Bewerbung: Hausmeister (Minijob)"), ] def job_text(text): return ('
    ' + "".join(f"

    {p}

    " for p in text) + "
    ") if text else "" APPLY_BODY = "Hallo Herr Kirschner,\n\nich interessiere mich für die Stelle und möchte mich kurz vorstellen:\n\nName:\nTelefon:\nErfahrung:\nFrühester Start:\n\nViele Grüße\n" jobs = "".join(f'''

    {t}

    {"".join(f"{m}" for m in meta)}
    {job_text(text)}

    Das bringst Du mit

      {"".join(f"
    • {x}
    • " for x in need)}

    Das bekommst Du

      {"".join(f"
    • {x}
    • " for x in give)}
    ''' for i, (t, meta, need, give, text, subj) in enumerate(JOBS)) KARRIERE = page_hero("Wir stellen ein.", "Hausmeister, Ga-La-Bauer, Glas- und Solarreiniger und Reinigungskräfte für Landshut und Ergolding.", "rasen", f'
    Offene Stellen {I_ARROW}
    ') + f'''

    Offene Stellen

    {jobs}
    ''' page("karriere.html", "Karriere — Hausmeister, Handwerker & Reinigungskräfte gesucht | Kirschner Gebäudeservice", "Wir stellen ein: Hausmeister, Handwerker, Ga-La-Bauer, Glas- & Solarreiniger und Reinigungskräfte in Landshut und Ergolding.", KARRIERE) # ====================================================================== # Kontakt # ====================================================================== KONTAKT = page_hero("Kontakt", "", "balkone") + f'''
    {map_section("theme-deep")} ''' page("kontakt.html", "Kontakt — Kirschner Gebäudeservice Ergolding", "Kirschner Gebäudeservice, Etzstraße 45, 84030 Ergolding. Telefon 0871 / 14 26 91 01, Notruf 0160 / 836 57 53, info@kirschner-service.de.", KONTAKT) # ====================================================================== # Impressum & Datenschutz # ====================================================================== CREDITS = [("Titelbild (Wohngebäude)", "Tobias Wilden"), ("Treppenhaus", "Payam Moin Afshari"), ("Fensterreinigung", "Joshua Bowers"), ("PV-Reinigung", "Florida Solar Fix"), ("Heckenschnitt", "Mustafa Turhan"), ("Haustechnik", "Peter Herrmann"), ("Reparatur", "Theme Photos"), ("Winterdienst", "Bradley Andrews"), ("Glasfassade", "Priscilla Du Preez"), ("Fassadenreinigung am Seil", "Nuno Silva"), ("Fassade", "Luke van Zyl"), ("Werkzeugwand", "Barn Images"), ("Rasenmähen", "Carl Tronders"), ("Balkone", "Waldemar Brandt")] IMPRESSUM = page_hero("Impressum", "Angaben gemäß § 5 Digitale-Dienste-Gesetz (DDG).", small=True) + f'''
    ''' page("impressum.html", "Impressum — Kirschner Gebäudeservice", "Impressum von Kirschner Gebäudeservice, Etzstraße 45, 84030 Ergolding.", IMPRESSUM) DATENSCHUTZ = page_hero("Datenschutz", "Diese Website setzt keine Cookies und verwendet kein Tracking.", small=True) + f'''
    ''' page("datenschutz.html", "Datenschutz — Kirschner Gebäudeservice", "Datenschutzerklärung von Kirschner Gebäudeservice: keine Cookies, kein Tracking.", DATENSCHUTZ)