import * as fs from "fs" import * as html_to_pdf from "html-pdf-node" import * as v from './variables.js' let hinweise = "`; let date = new Date(); date = date.toLocaleDateString("de-DE", { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', }); let options = { format: 'A4', landscape: true, margin: { top: "0.5cm", right: "1cm", bottom: "1cm", left: "2cm", }, }; // returns time difference in 15-minute intervalls function timediff(a, b) { const time = "1970-01-01 "; return (new Date(time + a) - new Date(time + b)) / 1000 / 60 / 15; } function gettimefromintervalls(x) { let y = 15 * x / 60 + 8 let z = y.toString().padStart(2, '0'); if (Math.round(y) == y) return `${z}:00`; return "" } function sortTage(tage) { for (let tag in tage) { tage[tag].sort((a, b) => { return timediff(a.von, b.von) }); } return tage; } function runtimes(tage, tage_runtimes) { for (let tag in tage) { for (let eintrag in tage[tag]) { // could be redundant if (eintrag == tage[tag].length) break; let a = tage[tag][eintrag]; let runtime = timediff(a.bis, a.von) tage_runtimes[tag].push({ "name": a.name, "raum": a.raum, "runtime": runtime, }); } } return tage_runtimes; } function bufferUp(tage) { tage = sortTage(tage); for (let tag in tage) { if (tage[tag][0].von != "08:00") { tage[tag].splice(0, 0, { "name": "BUFFER", "raum": "BUFFER", "von": "08:00", "bis": tage[tag][0].von, }) } if (tage[tag][tage[tag].length - 1].bis != "19:00") { tage[tag].push({ "name": "BUFFER", "raum": "BUFFER", "von": tage[tag][tage[tag].length - 1].bis, "bis": "19:00", }) } } for (let tag in tage) { for (let eintrag in tage[tag]) { if (eintrag == tage[tag].length - 1) break; let a = tage[tag][eintrag]; let b = tage[tag][eintrag - -1]; let runtime = timediff(b.von, a.bis) if (runtime > 0) { tage[tag].push({ "name": "BUFFER", "raum": "BUFFER", "von": a.bis, "bis": b.von, }); } } } return tage; } const ctage = { "Mo": [], "Di": [], "Mi": [], "Do": [], "Fr": [] } function main() { let res = ""; let tage = structuredClone(ctage); let tage_runtimes = structuredClone(ctage); for (let eintrag of v.eintraege) { for (let termin of eintrag.termine) { tage[termin.wochentag].push({ "name": eintrag.name, "raum": termin.raum, "von": termin.von, "bis": termin.bis, }) } } tage = bufferUp(tage, ctage); tage = sortTage(tage); tage_runtimes = runtimes(tage, tage_runtimes) let timeout = {} // 1h has 4 15 minute intervalls: 08 to 19 means 44 intervalls for (let i = 0; i < 44; i++) { let mensa = ""; if (11 < i && i < 25) mensa = "mensa1"; if (25 < i && i < 27) mensa = "mensa2"; res += `` + gettimefromintervalls(i) for (let day in tage_runtimes) { if (timeout[day] > 0) { timeout[day]--; continue; } let el = tage_runtimes[day][0]; if (el.name == "BLOCKED" && el.raum == "BLOCKED") { res += ``; } else { let name = el.name == "BUFFER" ? "" : `
${el.name}`; let raum = el.raum == "BUFFER" ? "" : `${el.raum}`; res += `${name}${raum}`; } timeout[day] = el.runtime - 1; tage_runtimes[day].splice(0, 1); } res += "" } // console.log(res) return res } let html = ` ${v.style}

Persönlicher Stundenplan von ${v.student} für das ${v.semester}. Stand: ${date}.

${main()}
Uhrzeit Montag Dienstag Mittwoch Donnerstag Freitag

Hinweise: ${hinweise} `; fs.writeFileSync("test.html", html) html_to_pdf.generatePdf({content: html}, options).then(pdfBuffer => { fs.writeFileSync(v.filename, pdfBuffer); });