const { readFileSync, readdirSync, existsSync } = require('node:fs'); const { resolve } = require('node:path'); const VAULT_ROOT = resolve(__dirname, '..', '..'); const JOUR_FIXE_DIR = resolve(VAULT_ROOT, '03 Bereiche/Jour Fixe'); function getJourFixeFolders() { if (!existsSync(JOUR_FIXE_DIR)) return []; return readdirSync(JOUR_FIXE_DIR, { withFileTypes: true }) .filter(d => d.isDirectory()) .map(d => d.name); } function detectSeries(eventTitle, jourFixeFolders) { const titleLower = eventTitle.toLowerCase(); const exact = jourFixeFolders.find(f => f.toLowerCase() === titleLower); if (exact) return exact; const contained = jourFixeFolders.find(f => titleLower.includes(f.toLowerCase())); if (contained) return contained; return ''; } function loadJourFixeAgenda(serie) { const agendaPath = resolve(JOUR_FIXE_DIR, serie, 'Agenda.md'); if (!existsSync(agendaPath)) return ''; const content = readFileSync(agendaPath, 'utf-8'); const openMatch = content.match(/## 🔴 Offen\n([\s\S]*?)(?=\n## |$)/); if (!openMatch) return ''; const items = openMatch[1].trim(); return items || ''; } function buildFileName(date, title) { const sanitized = title .replace(/:/g, ' -') .replace(/[\/\\]/g, '-') .replace(/[<>"|?*]/g, '') .trim(); return `${date} ${sanitized}.md`; } function buildMeetingNote(data) { const teilnehmerYaml = data.teilnehmer .map(t => ` - "${t.wikilink}"`) .join('\n'); const teilnehmerList = data.teilnehmer .map(t => `- ${t.wikilink}${t.isNew ? ' *(neu angelegt)*' : ''}`) .join('\n'); const agenda = data.agenda || ''; return `--- tags: [meeting] date: ${data.date} start: "${data.start}" end: "${data.end}" serie: "${data.serie}" projekt: teilnehmer: ${teilnehmerYaml} status: offen o365_id: "${data.o365_id}" --- # ${data.title} ## Teilnehmer ${teilnehmerList} ## Agenda ${agenda} ## Notizen ## Entscheidungen ## Aufgaben `; } function buildMeetingFromEvent(meeting, resolvedAttendees) { const jourFixeFolders = getJourFixeFolders(); const serie = meeting.isRecurring ? detectSeries(meeting.title, jourFixeFolders) : ''; let agenda = ''; if (serie) { agenda = loadJourFixeAgenda(serie); } if (!agenda && meeting.bodyText) { agenda = meeting.bodyText; } return { title: meeting.title, date: meeting.date, start: meeting.start, end: meeting.end, serie, o365_id: meeting.id, teilnehmer: resolvedAttendees, agenda }; } module.exports = { getJourFixeFolders, detectSeries, loadJourFixeAgenda, buildFileName, buildMeetingNote, buildMeetingFromEvent };