import * as fs from "fs"
import * as html_to_pdf from "html-pdf-node"
import * as v from './variables.js'
let hinweise = "
";
for (let hinweis of v.hinweise) {
hinweise += `- ${hinweis}
`;
}
hinweise += `
`;
let date = new Date();
date = date.toLocaleDateString("de-DE", {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
});
const ctage = {
"Mo": [],
"Di": [],
"Mi": [],
"Do": [],
"Fr": []
}
const 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;
}
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}.
Uhrzeit |
Montag |
Dienstag |
Mittwoch |
Donnerstag |
Freitag |
${main()}
Hinweise:
${hinweise}
`;
html_to_pdf.generatePdf({content: html}, options).then(pdfBuffer => {
// fs.writeFileSync("test.html", html)
fs.writeFileSync(v.filename, pdfBuffer);
});