aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.js229
-rw-r--r--src/stunden.js227
2 files changed, 456 insertions, 0 deletions
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..53323f3
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,229 @@
+import * as fs from "fs"
+import * as html_to_pdf from "html-pdf-node"
+import * as stu from './stunden.js'
+
+var student = "David Penkowoj";
+var semester = "Sommersemester 2024";
+var 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",
+ },
+};
+
+var table = `
+ <tr>
+ <th rowspan="4"> 08:00 </th>
+ <td></td>
+ <td rowspan="2"></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td rowspan="6"><div><span>TGI 1 / V</span><span>AM 1</span></div></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td rowspan="6"><div><span>GET 2 / V</span><span>H 1</span></div></td>
+ <td rowspan="6"><div><span>GET 2 / V</span><span>Z 1/2</span></div></td>
+ <td rowspan="6"><div><span>Pho / V</span><span>T 1</span></div></td>
+ </tr>
+ <tr>
+ <td></td>
+ </tr>
+
+ <tr>
+ <th rowspan="4"> 09:00 </th>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <th rowspan="4"> 10:00 </th>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td rowspan="20" class="block"></td>
+ <td rowspan="6"><div><span>FuQ / V</span><span>AM 4</span></div></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+
+ <tr>
+ <th rowspan="4"> 11:00 </th>
+ <td></td>
+ <td rowspan="4"><div><span>FuQ / Ü</span><span>SI 4 (Minsky)</span></div></td>
+ <td></td>
+ </tr>
+ <tr class="mensa1">
+ <td></td>
+ <td></td>
+ </tr>
+ <tr class="mensa1">
+ <td></td>
+ <td></td>
+ <td rowspan="6"><div><span>GET / Ü</span><span>AM S4</span></div></td>
+ </tr>
+ <tr class="mensa1">
+ <td></td>
+ <td></td>
+ </tr>
+
+ <tr class="mensa1">
+ <th rowspan="4"> 12:00 </th>
+ <td rowspan="4"><div><span>GET 2 / Ü</span><span>AM S4</span></div></td>
+ <td></td>
+ <td rowspan="4"><div><span>Pho / Ü</span><span>AM 1</span></div></td>
+ </tr>
+ <tr class="mensa1">
+ <td></td>
+ </tr>
+ <tr class="mensa1">
+ <td rowspan="6"><div><span>Ana 2 / V</span><span>AM 1</span></div></td>
+ </tr>
+ <tr class="mensa1">
+ </tr>
+
+ <tr class="mensa1">
+ <th rowspan="4"> 13:00 </th>
+ <td rowspan="20" class="block"></td>
+ <td></td>
+ </tr>
+ <tr class="mensa1">
+ <td></td>
+ </tr>
+ <tr class="mensa1">
+ <td></td>
+ </tr>
+ <tr class="mensa1">
+ <td></td>
+ </tr>
+`;
+
+table = stu.main();
+
+var html = `
+<style>
+ * {
+ font-weight: 300;
+ font-family: "Abel", sans-serif;
+ -webkit-print-color-adjust: exact;
+
+ --entries-b: #ccc;
+ --entries-f: #111;
+ --headers-b: #333;
+ --headers-f: #fff;
+
+ --block: #ccc;
+ }
+
+ table {
+ width: 100%;
+ }
+
+ table td, table tr {
+ background: var(--headers-f);
+ height: 4px;
+ }
+
+ table th, table td:not(:empty) {
+ background-color: var(--entries-b);
+ color: var(--entries-f);
+ padding: 0.5em 1em;
+ position: relative
+ }
+
+ table th {
+ background-color: var(--headers-b);
+ color: var(--headers-f);
+ }
+
+ table th.tag {
+ width: 20%;
+ }
+
+ table td {
+ font-size: 12px;
+ }
+
+ table td.block {
+ background-image: repeating-linear-gradient(314deg, var(--block), var(--block) 10px, transparent 10px, transparent 20px);
+ background-size: 99.9999999% 99.9999999%;
+ border: 2px solid var(--block);
+ }
+
+ div {
+ position: absolute;
+ display: flex;
+
+ top: 0.4em;
+ left: 0.4em;
+ width: calc(100% - 0.8em);
+ justify-content: space-between;
+ }
+</style>
+<p>Persönlicher Stundenplan von ${student} für das ${semester}. Letzter Stand: ${date}.</p>
+<table>
+ <tr>
+ <th> Uhrzeit </th>
+ <th class="tag"> Montag </th>
+ <th class="tag"> Dienstag </th>
+ <th class="tag"> Mittwoch </th>
+ <th class="tag"> Donnerstag </th>
+ <th class="tag"> Freitag </th>
+ </tr>
+ ${table}
+</table>
+<br>
+<u> Hinweise: </u>
+<ul>
+ <li>Mensabetrieb: 11:15 - 14:15 Uhr + 00:15 min</li>
+ <li>GET 2 / V am 23.05. & 04.07. im V1</li>
+ <li>GET 2 / Ü am 24.05. im T S2</li>
+ <li>FuQ / V am 24.05. im T S1</li>
+</ul>
+`;
+
+fs.writeFileSync("test.html", html)
+
+html_to_pdf.generatePdf({content: html}, options).then(pdfBuffer => {
+ fs.writeFileSync('test.pdf', pdfBuffer);
+});
diff --git a/src/stunden.js b/src/stunden.js
new file mode 100644
index 0000000..0bf3024
--- /dev/null
+++ b/src/stunden.js
@@ -0,0 +1,227 @@
+// 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 `<th rowspan="4">${z}:00</th>`;
+
+ 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;
+}
+
+class Eintrag {
+ constructor(name, termine) {
+ this.name = name;
+ this.termine = termine;
+ }
+}
+
+class Termin {
+ constructor(wochentag, raum, von, bis) {
+ this.wochentag = wochentag;
+ this.raum = raum;
+ this.von = von;
+ this.bis = bis;
+ }
+}
+
+const eintraege = [
+ new Eintrag("GET 2 / Ü", [
+ new Termin("Mo", "AM S4", "12:00", "13:00"),
+ new Termin("Fr", "AM S4", "11:30", "13:00")
+ ]),
+ new Eintrag("GET 2 / V", [
+ new Termin("Di", "H1", "08:30", "10:00"),
+ new Termin("Do", "Z 1/2", "08:30", "10:00")
+ ]),
+ new Eintrag("TGI 1 / V", [
+ new Termin("Mi", "AM 1", "08:15", "09:45"),
+ ]),
+ new Eintrag("TGI 1 / Ü", [
+ new Termin("Do", "AM 1", "15:00", "16:00"),
+ ]),
+ new Eintrag("TGI 1 / Prak. Gr. 2", [
+ new Termin("Di", "ITI 131", "14:30", "17:30"),
+ ]),
+ new Eintrag("Pho / V", [
+ new Termin("Fr", "T 1", "08:30", "10:00"),
+ ]),
+ new Eintrag("Pho / Ü", [
+ new Termin("Mi", "AM 1", "12:00", "13:00"),
+ ]),
+ new Eintrag("Ana 2 / V", [
+ new Termin("Di", "AM 1", "12:30", "14:00"),
+ ]),
+ new Eintrag("Ana 2 / Ü", [
+ new Termin("Do", "H 1", "16:15", "17:15"),
+ ]),
+ new Eintrag("Ana 2 / Helpdesk", [
+ new Termin("Di", "O-Sync", "18:00", "19:00"),
+ new Termin("Mi", "O-Sync", "18:00", "19:00")
+ ]),
+ new Eintrag("EiBMO / V", [
+ new Termin("Mi", "H 1", "14:00", "16:00"),
+ ]),
+ new Eintrag("EiBMO / Ü", [
+ new Termin("Mi", "H 1", "16:00", "17:00"),
+ ]),
+ new Eintrag("FuQ / V", [
+ new Termin("Fr", "AM 4", "10:00", "11:30"),
+ ]),
+ new Eintrag("FuQ / Ü", [
+ new Termin("Di", "SI 4 (Minsky)", "11:00", "12:00"),
+ ]),
+ new Eintrag("BLOCKED", [
+ new Termin("Mo", "BLOCKED", "13:00", "19:00"),
+ new Termin("Do", "BLOCKED", "10:00", "15:00")
+ ])
+];
+
+const ctage = {
+ "Mo": [],
+ "Di": [],
+ "Mi": [],
+ "Do": [],
+ "Fr": []
+}
+
+export function main() {
+ let res = "";
+
+ let tage = structuredClone(ctage);
+ let tage_runtimes = structuredClone(ctage);
+
+ for (let eintrag of 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 += `<tr class="${mensa}">` + 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 += `<td rowspan="${el.runtime}" class="block"></td>`;
+ } else {
+ let name = el.name == "BUFFER" ? "" : `<div><span>${el.name}</span>`;
+ let raum = el.raum == "BUFFER" ? "" : `<span>${el.raum}</span>`;
+
+ res += `<td rowspan="${el.runtime}">${name}${raum}</td>`;
+ }
+
+ timeout[day] = el.runtime - 1;
+ tage_runtimes[day].splice(0, 1);
+ }
+
+ res += "</tr>"
+ }
+
+ // console.log(res)
+
+ return res
+}