aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordavidpkj <davidpenkow1@gmail.com>2024-04-11 19:33:03 +0200
committerdavidpkj <davidpenkow1@gmail.com>2024-04-11 19:33:03 +0200
commit0d8b9c462ea24a4569fec30cde3366153ab4b378 (patch)
tree59c65855d3c61c417bf7e0b78ff29096f1ad19e0 /src
parente10addbe36bc248b297cc19a943356fa9fd0f955 (diff)
making things a little more friendly
Diffstat (limited to 'src')
-rw-r--r--src/main.js327
-rw-r--r--src/stunden.js227
-rw-r--r--src/variables.js143
3 files changed, 299 insertions, 398 deletions
diff --git a/src/main.js b/src/main.js
index 53323f3..cedd21d 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,10 +1,15 @@
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();
+import * as v from './variables.js'
+
+let hinweise = "<ul>";
+for (let hinweis of v.hinweise) {
+ hinweise += `<li>${hinweis}</li>`;
+}
+hinweise += `</ul>`;
+
+let date = new Date();
date = date.toLocaleDateString("de-DE", {
weekday: 'long',
year: 'numeric',
@@ -23,184 +28,169 @@ let options = {
},
};
-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>
+// 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,
+ })
+ }
- <tr>
- <th rowspan="4"> 09:00 </th>
- <td></td>
- </tr>
- <tr>
- <td></td>
- </tr>
- <tr>
- <td></td>
- </tr>
- <tr>
- <td></td>
- <td></td>
- </tr>
+ 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",
+ })
+ }
+ }
- <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>
+ for (let tag in tage) {
+ for (let eintrag in tage[tag]) {
+ if (eintrag == tage[tag].length - 1) break;
- <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>
+ let a = tage[tag][eintrag];
+ let b = tage[tag][eintrag - -1];
- <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>
+ let runtime = timediff(b.von, a.bis)
- <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>
-`;
+ 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,
+ })
+ }
+ }
-table = stu.main();
+ tage = bufferUp(tage, ctage);
+ tage = sortTage(tage);
+ tage_runtimes = runtimes(tage, tage_runtimes)
-var html = `
-<style>
- * {
- font-weight: 300;
- font-family: "Abel", sans-serif;
- -webkit-print-color-adjust: exact;
+ let timeout = {}
- --entries-b: #ccc;
- --entries-f: #111;
- --headers-b: #333;
- --headers-f: #fff;
+ // 1h has 4 15 minute intervalls: 08 to 19 means 44 intervalls
+ for (let i = 0; i < 44; i++) {
+ let mensa = "";
- --block: #ccc;
- }
+ if (11 < i && i < 25) mensa = "mensa1";
+ if (25 < i && i < 27) mensa = "mensa2";
- table {
- width: 100%;
- }
+ res += `<tr class="${mensa}">` + gettimefromintervalls(i)
- table td, table tr {
- background: var(--headers-f);
- height: 4px;
- }
+ for (let day in tage_runtimes) {
+ if (timeout[day] > 0) {
+ timeout[day]--;
+ continue;
+ }
- table th, table td:not(:empty) {
- background-color: var(--entries-b);
- color: var(--entries-f);
- padding: 0.5em 1em;
- position: relative
- }
+ let el = tage_runtimes[day][0];
- table th {
- background-color: var(--headers-b);
- color: var(--headers-f);
- }
+ 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>`;
- table th.tag {
- width: 20%;
- }
+ res += `<td rowspan="${el.runtime}">${name}${raum}</td>`;
+ }
- table td {
- font-size: 12px;
+ timeout[day] = el.runtime - 1;
+ tage_runtimes[day].splice(0, 1);
}
- 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);
- }
+ res += "</tr>"
+ }
- div {
- position: absolute;
- display: flex;
+ // console.log(res)
- 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>
+ return res
+}
+
+let html = `
+${v.style}
+<p>Persönlicher Stundenplan von ${v.student} für das ${v.semester}. Stand: ${date}.</p>
<table>
<tr>
<th> Uhrzeit </th>
@@ -210,20 +200,15 @@ var html = `
<th class="tag"> Donnerstag </th>
<th class="tag"> Freitag </th>
</tr>
- ${table}
+ ${main()}
</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>
+${hinweise}
`;
fs.writeFileSync("test.html", html)
html_to_pdf.generatePdf({content: html}, options).then(pdfBuffer => {
- fs.writeFileSync('test.pdf', pdfBuffer);
+ fs.writeFileSync(v.filename, pdfBuffer);
});
diff --git a/src/stunden.js b/src/stunden.js
deleted file mode 100644
index 0bf3024..0000000
--- a/src/stunden.js
+++ /dev/null
@@ -1,227 +0,0 @@
-// 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
-}
diff --git a/src/variables.js b/src/variables.js
new file mode 100644
index 0000000..bf98ca1
--- /dev/null
+++ b/src/variables.js
@@ -0,0 +1,143 @@
+// Dont touch this
+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;
+ }
+}
+
+// You may touch this
+export const student = "David Penkowoj";
+export const semester = "Sommersemester 2024";
+export const filename = `Stundenplan-${semester.replace(" ", "-")}.pdf`;
+
+export const hinweise = [
+ "Mensabetrieb: 11:15 - 14:15 Uhr + 00:15 min",
+ "GET 2 / V am 23.05. & 04.07. im V1",
+ "GET 2 / Ü am 24.05. im T S2",
+ "FuQ / V am 24.05. im T S1",
+];
+
+export 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")
+ ])
+];
+
+// You may touch this, if you know what you are doing
+export const style = `
+<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>
+`;