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)}
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))}