119 lines
2.6 KiB
JavaScript
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
|
|
};
|