diff options
author | davidpkj <davidpenkow1@gmail.com> | 2024-04-11 19:33:03 +0200 |
---|---|---|
committer | davidpkj <davidpenkow1@gmail.com> | 2024-04-11 19:33:03 +0200 |
commit | 0d8b9c462ea24a4569fec30cde3366153ab4b378 (patch) | |
tree | 59c65855d3c61c417bf7e0b78ff29096f1ad19e0 /src | |
parent | e10addbe36bc248b297cc19a943356fa9fd0f955 (diff) |
making things a little more friendly
Diffstat (limited to 'src')
-rw-r--r-- | src/main.js | 327 | ||||
-rw-r--r-- | src/stunden.js | 227 | ||||
-rw-r--r-- | src/variables.js | 143 |
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> +`; |