Infozettel-Generator Nachbarschaftsraum Mitte-West

Infozettel-Generator

Nachbarschaftsraum Frankfurt Mitte-West

Version 1.2.8
Build: 01.08.2026

Einstellungen

Regeln: Gemeinde auswählen; Kollekten, Kurzinfos und Termin-Regeln werden automatisch aus dem aktuellen Online-Kollektenplan geladen. Wochenspruch aus fester Kirchenjahr-Liste. ChurchDesk-Termine ab dem ausgewählten Sonntag 12:00 Uhr für 14 Tage. Ausgabe: formatiert kopieren oder als Word-Datei speichern.

Der aktuelle Online-Kollektenplan wird geladen …

Bereit.

Infozettel

Bitte Gemeinde wählen und „Infozettel erstellen“ klicken.

${innerHtml}`; } function sichererDateiname(text) { return String(text || '') .replace(/[\/:*?"<>|]+/g, '') .replace(/s+/g, ' ') .trim() || 'Infozettel'; } function wordDateiname(gemeinde, datum) { const name = sichererDateiname(gemeinde.kurzname || gemeinde.name || 'Gemeinde'); return `${datum} ${name} Infos.docx`; } function escapeXml(s) { return String(s || '').replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); } function textToRuns(text, opts = {}) { if (!text) return ''; const rPr = []; if (opts.bold) rPr.push(''); if (opts.italic) rPr.push(''); if (opts.size) rPr.push(``); const prop = rPr.length ? `${rPr.join('')}` : ''; return `${prop}${escapeXml(text)}`; } function runsAusKnoten(node, inherited = {}) { if (node.nodeType === Node.TEXT_NODE) return textToRuns(node.nodeValue || '', inherited); if (node.nodeType !== Node.ELEMENT_NODE) return ''; const tag = node.tagName.toLowerCase(); const opts = { ...inherited, bold: inherited.bold || tag === 'strong' || tag === 'b', italic: inherited.italic || tag === 'em' || tag === 'i'; }; if (tag === 'br') return ''; return Array.from(node.childNodes).map(child => runsAusKnoten(child, opts)).join(''); } function absatzXmlAusElement(el, style = 'Normal') { let runs = Array.from(el.childNodes).map(runsAusKnoten).join(''); if (!runs) runs = ''; return `${runs}`; } function leerAbsatz() { return ''; } function htmlZuWordXml(innerHtml) { const tmp = document.createElement('div'); tmp.innerHTML = innerHtml; let out = ''; function walk(el) { if (el.nodeType !== Node.ELEMENT_NODE) return; const tag = el.tagName.toLowerCase(); if (tag === 'h1') out += absatzXmlAusElement(el, 'Title'); else if (tag === 'h2') { out += leerAbsatz() + absatzXmlAusElement(el, 'Heading2'); }; else if (tag === 'h3') out += absatzXmlAusElement(el, 'Heading3'); else if (tag === 'p') out += absatzXmlAusElement(el, 'Normal'); else if (tag === 'div' && el.classList.contains('kurztext')) out += absatzXmlAusElement(el, 'Quote'); else if (tag === 'div' && el.classList.contains('termin')) { out += leerAbsatz(); Array.from(el.children).forEach(walk); }; else Array.from(el.children).forEach(walk); } Array.from(tmp.children).forEach(walk); return out; } function docxContentTypesXml() { return `; ; ; ; ; ; ; ; `; } function docxRelsXml() { return `; ; ; ; ; `; } function wordRelsXml() { return `; ; ; `; } function stylesXml() { return `; ; ; ; ; ; ; ; ; `; } function documentXml(innerHtml) { const body = htmlZuWordXml(innerHtml); return `; ; ${body} ; `; } function coreXml() { const now = new Date().toISOString(); return `; ; InfozettelInfozettel-GeneratorInfozettel-Generator ${now}${now}; `; } function appXml() { return `; Infozettel-Generator`; } async function erstelleDocxBlob(innerHtml) { if (typeof JSZip === 'undefined') throw new Error('JSZip konnte nicht geladen werden. Bitte Internetverbindung prüfen oder Seite neu laden.'); const zip = new JSZip(); zip.file('[Content_Types].xml', docxContentTypesXml()); zip.folder('_rels').file('.rels', docxRelsXml()); zip.folder('word').file('document.xml', documentXml(innerHtml)); zip.folder('word').file('styles.xml', stylesXml()); zip.folder('word').folder('_rels').file('document.xml.rels', wordRelsXml()); zip.folder('docProps').file('core.xml', coreXml()); zip.folder('docProps').file('app.xml', appXml()); return await zip.generateAsync({ type: 'blob', mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }); } function ladeBlobHerunter(blob, filename) { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } async function speichereAlsWord() { const ausgabe = document.getElementById('ausgabe'); const html = ausgabe.innerHTML.trim(); if (!ausgabe.innerText.trim()) { status('Es gibt noch keinen Infozettel zum Speichern. Bitte zuerst „Infozettel erstellen“ klicken.'); return; } const gemeinde = ausgewaehlteGemeinde(); const datum = document.getElementById('sonntag').value || formatInputDateLocal(naechsterSonntag()); const blob = await erstelleDocxBlob(html); ladeBlobHerunter(blob, wordDateiname(gemeinde, datum)); status('DOCX-Datei wurde erstellt. Falls der Browser nachfragt: bitte Speichern bestätigen.'); } async function erstelleInfozettelHtmlFuerGemeinde(gemeindeKey, rows, sonntag) { const gemeinde = GEMEINDEN[gemeindeKey] || GEMEINDEN.ho; const vergangenerSonntag = addDays(sonntag, -7); const terminStart = new Date(sonntag); terminStart.setHours(12, 0, 0, 0); const ende14 = addDays(sonntag, 14); const spruch = wochenspruchFuer(sonntag); const kollVergangen = findeKollekten(rows, vergangenerSonntag, gemeinde.spalten); const kollKommend = findeKollekten(rows, sonntag, gemeinde.spalten); const ergebnisVergangen = kollVergangen.ergebnis || '__________________ €'; const kurzKommend = findeKurzinfo(kollKommend, gemeinde); let termine = []; let terminHinweis = ''; try { termine = await ladeTermine(gemeinde.feed, terminStart, ende14, gemeindeKey); } catch (e) { terminHinweis = `

ChurchDesk-Termine konnten in diesem Browser nicht geladen werden: ${escapeHtml(e.message)}

`; } let besondereTermine = []; let besondereHinweis = ''; try { besondereTermine = await ladeTermineOhneFilter(NBR_BESONDERES_FEED, terminStart, ende14, gemeindeKey); } catch (e) { besondereHinweis = `

Termine aus „Besonderes aus dem Nachbarschaftsraum“ konnten in diesem Browser nicht geladen werden: ${escapeHtml(e.message)}

`; } return `

${escapeHtml(gemeinde.name)}

Informationen für Sonntag, den ${escapeHtml(fmtShort(sonntag))}

${escapeHtml(spruch.name)}

Wochenspruch

„${escapeHtml(spruch.text)}“

;

(${escapeHtml(spruch.ref)})

Kollekte vom vergangenen Sonntag

Vielen Dank für die Kollekte vom vergangenen Sonntag. Sie war bestimmt für „${escapeHtml(kollVergangen.zweck)}“ und ergab ${escapeHtml(ergebnisVergangen)}.

${kollVergangen.hinweis ? `

${escapeHtml(kollVergangen.hinweis)}

` : ''}

Kollekte am heutigen Sonntag

Die Kollekte am ${escapeHtml(fmtShort(sonntag))} ist bestimmt für:

${escapeHtml(kollKommend.zweck)}

${kollKommend.hinweis ? `

${escapeHtml(kollKommend.hinweis)}

` : ''} ${kurzKommend ? `
Kurzinfo: ${escapeHtml(kurzKommend)}
` : ''};

Gottesdienste und Veranstaltungen

ab ${escapeHtml(fmtShort(sonntag))}, 12:00 Uhr bis ${escapeHtml(fmtShort(ende14))}

${terminHinweis || renderTermine(termine)} ${renderBesonderesNachbarschaftsraum(besondereTermine, besondereHinweis)}

Weitere Informationen: ${escapeHtml(gemeinde.website)}

; `; } async function ladeWordDatei(innerHtml, gemeinde, datum) { const blob = await erstelleDocxBlob(innerHtml); ladeBlobHerunter(blob, wordDateiname(gemeinde, datum)); } async function speichereWordDateienAlleGemeinden() { try { status('Erstelle DOCX-Dateien für alle 5 Gemeinden. Die Termine werden live aus ChurchDesk geladen; das kann einen Moment dauern …'); const dateInput = document.getElementById('sonntag').value; const sonntag = dateInput ? startOfDay(new Date(dateInput + 'T12:00:00')) : naechsterSonntag(); const datum = formatInputDateLocal(sonntag); const rows = await holeKollektenRows(); const keys = ['bo', 'cy', 'df', 'fuv', 'ho']; for (const key of keys) { status(`Erstelle DOCX-Datei für ${GEMEINDEN[key].name} …`); const html = await erstelleInfozettelHtmlFuerGemeinde(key, rows, sonntag); await ladeWordDatei(html, GEMEINDEN[key], datum); await new Promise(resolve => setTimeout(resolve, 700)); } status('Fertig. Es wurden DOCX-Dateien für alle 5 Gemeinden erzeugt. Falls der Browser nachfragt: bitte mehrere Downloads erlauben.'); } catch (e) { status('Fehler beim Erstellen der fünf Word-Dateien: ' + e.message); } } function naechsterSonntag() { const d = startOfDay(new Date()); const daysUntilSunday = (7 - d.getDay()) % 7; return addDays(d, daysUntilSunday === 0 ? 7 : daysUntilSunday); } aktualisiereGemeindeAnzeige(); aktualisiereKollektenplanStatus(); document.getElementById('sonntag').value = formatInputDateLocal(naechsterSonntag()); ladeOnlineKollektenplan({ erzwingen: true }).catch(e => { status('Fehler beim Laden des Online-Kollektenplans: ' + e.message); }); setInterval(() => { ladeOnlineKollektenplan({ erzwingen: true, statusAnzeigen: false }).catch(e => { console.warn('Automatische Aktualisierung des Online-Kollektenplans fehlgeschlagen:', e); }); }, KOLLEKTENPLAN_AKTUALISIERUNG_MS);