brain/scripts/lib/meeting-builder.js

119 lines
2.6 KiB
JavaScript

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