// ==UserScript== // @name assess_userscript // @description Adds a calendar view to Assess // @namespace http://tampermonkey.net/ // @version 0.1 // @match https://sys-sideshow.cs.tu-dortmund.de/ASSESS/* // ==/UserScript== const timetable = ` <table class="calendar"> <thead class="days-week"> <tr> <th></th> <th style="width:70px">Mo</th> <th style="width:70px">Di</th> <th style="width:70px">Mi</th> <th style="width:70px">Do</th> <th style="width:70px">Fr</th> </tr> </thead> <tbody> <tr style="height:4px;"><td>8:00</td><td id="mo_800"></td><td id="di_800"></td><td id="mi_800"></td><td id="do_800"></td><td id="fr_800"></td></tr> <tr style="height:4px;"><td>8:15</td><td id="mo_815"></td><td id="di_815"></td><td id="mi_815"></td><td id="do_815"></td><td id="fr_815"></td></tr> <tr style="height:4px;"><td>8:30</td><td id="mo_830"></td><td id="di_830"></td><td id="mi_830"></td><td id="do_830"></td><td id="fr_830"></td></tr> <tr style="height:4px;"><td>8:45</td><td id="mo_845"></td><td id="di_845"></td><td id="mi_845"></td><td id="do_845"></td><td id="fr_845"></td></tr> <tr style="height:4px;"><td>9:00</td><td id="mo_900"></td><td id="di_900"></td><td id="mi_900"></td><td id="do_900"></td><td id="fr_900"></td></tr> <tr style="height:4px;"><td>9:15</td><td id="mo_915"></td><td id="di_915"></td><td id="mi_915"></td><td id="do_915"></td><td id="fr_915"></td></tr> <tr style="height:4px;"><td>9:30</td><td id="mo_930"></td><td id="di_930"></td><td id="mi_930"></td><td id="do_930"></td><td id="fr_930"></td></tr> <tr style="height:4px;"><td>9:45</td><td id="mo_945"></td><td id="di_945"></td><td id="mi_945"></td><td id="do_945"></td><td id="fr_945"></td></tr> <tr style="height:4px;"><td>10:00</td><td id="mo_1000"></td><td id="di_1000"></td><td id="mi_1000"></td><td id="do_1000"></td><td id="fr_1000"></td></tr> <tr style="height:4px;"><td>10:15</td><td id="mo_1015"></td><td id="di_1015"></td><td id="mi_1015"></td><td id="do_1015"></td><td id="fr_1015"></td></tr> <tr style="height:4px;"><td>10:30</td><td id="mo_1030"></td><td id="di_1030"></td><td id="mi_1030"></td><td id="do_1030"></td><td id="fr_1030"></td></tr> <tr style="height:4px;"><td>10:45</td><td id="mo_1045"></td><td id="di_1045"></td><td id="mi_1045"></td><td id="do_1045"></td><td id="fr_1045"></td></tr> <tr style="height:4px;"><td>11:00</td><td id="mo_1100"></td><td id="di_1100"></td><td id="mi_1100"></td><td id="do_1100"></td><td id="fr_1100"></td></tr> <tr style="height:4px;"><td>11:15</td><td id="mo_1115"></td><td id="di_1115"></td><td id="mi_1115"></td><td id="do_1115"></td><td id="fr_1115"></td></tr> <tr style="height:4px;"><td>11:30</td><td id="mo_1130"></td><td id="di_1130"></td><td id="mi_1130"></td><td id="do_1130"></td><td id="fr_1130"></td></tr> <tr style="height:4px;"><td>11:45</td><td id="mo_1145"></td><td id="di_1145"></td><td id="mi_1145"></td><td id="do_1145"></td><td id="fr_1145"></td></tr> <tr style="height:4px;"><td>12:00</td><td id="mo_1200"></td><td id="di_1200"></td><td id="mi_1200"></td><td id="do_1200"></td><td id="fr_1200"></td></tr> <tr style="height:4px;"><td>12:15</td><td id="mo_1215"></td><td id="di_1215"></td><td id="mi_1215"></td><td id="do_1215"></td><td id="fr_1215"></td></tr> <tr style="height:4px;"><td>12:30</td><td id="mo_1230"></td><td id="di_1230"></td><td id="mi_1230"></td><td id="do_1230"></td><td id="fr_1230"></td></tr> <tr style="height:4px;"><td>12:45</td><td id="mo_1245"></td><td id="di_1245"></td><td id="mi_1245"></td><td id="do_1245"></td><td id="fr_1245"></td></tr> <tr style="height:4px;"><td>13:00</td><td id="mo_1300"></td><td id="di_1300"></td><td id="mi_1300"></td><td id="do_1300"></td><td id="fr_1300"></td></tr> <tr style="height:4px;"><td>13:15</td><td id="mo_1315"></td><td id="di_1315"></td><td id="mi_1315"></td><td id="do_1315"></td><td id="fr_1315"></td></tr> <tr style="height:4px;"><td>13:30</td><td id="mo_1330"></td><td id="di_1330"></td><td id="mi_1330"></td><td id="do_1330"></td><td id="fr_1330"></td></tr> <tr style="height:4px;"><td>13:45</td><td id="mo_1345"></td><td id="di_1345"></td><td id="mi_1345"></td><td id="do_1345"></td><td id="fr_1345"></td></tr> <tr style="height:4px;"><td>14:00</td><td id="mo_1400"></td><td id="di_1400"></td><td id="mi_1400"></td><td id="do_1400"></td><td id="fr_1400"></td></tr> <tr style="height:4px;"><td>14:15</td><td id="mo_1415"></td><td id="di_1415"></td><td id="mi_1415"></td><td id="do_1415"></td><td id="fr_1415"></td></tr> <tr style="height:4px;"><td>14:30</td><td id="mo_1430"></td><td id="di_1430"></td><td id="mi_1430"></td><td id="do_1430"></td><td id="fr_1430"></td></tr> <tr style="height:4px;"><td>14:45</td><td id="mo_1445"></td><td id="di_1445"></td><td id="mi_1445"></td><td id="do_1445"></td><td id="fr_1445"></td></tr> <tr style="height:4px;"><td>15:00</td><td id="mo_1500"></td><td id="di_1500"></td><td id="mi_1500"></td><td id="do_1500"></td><td id="fr_1500"></td></tr> <tr style="height:4px;"><td>15:15</td><td id="mo_1515"></td><td id="di_1515"></td><td id="mi_1515"></td><td id="do_1515"></td><td id="fr_1515"></td></tr> <tr style="height:4px;"><td>15:30</td><td id="mo_1530"></td><td id="di_1530"></td><td id="mi_1530"></td><td id="do_1530"></td><td id="fr_1530"></td></tr> <tr style="height:4px;"><td>15:45</td><td id="mo_1545"></td><td id="di_1545"></td><td id="mi_1545"></td><td id="do_1545"></td><td id="fr_1545"></td></tr> <tr style="height:4px;"><td>16:00</td><td id="mo_1600"></td><td id="di_1600"></td><td id="mi_1600"></td><td id="do_1600"></td><td id="fr_1600"></td></tr> <tr style="height:4px;"><td>16:15</td><td id="mo_1615"></td><td id="di_1615"></td><td id="mi_1615"></td><td id="do_1615"></td><td id="fr_1615"></td></tr> <tr style="height:4px;"><td>16:30</td><td id="mo_1630"></td><td id="di_1630"></td><td id="mi_1630"></td><td id="do_1630"></td><td id="fr_1630"></td></tr> <tr style="height:4px;"><td>16:45</td><td id="mo_1645"></td><td id="di_1645"></td><td id="mi_1645"></td><td id="do_1645"></td><td id="fr_1645"></td></tr> <tr style="height:4px;"><td>17:00</td><td id="mo_1700"></td><td id="di_1700"></td><td id="mi_1700"></td><td id="do_1700"></td><td id="fr_1700"></td></tr> <tr style="height:4px;"><td>17:15</td><td id="mo_1715"></td><td id="di_1715"></td><td id="mi_1715"></td><td id="do_1715"></td><td id="fr_1715"></td></tr> <tr style="height:4px;"><td>17:30</td><td id="mo_1730"></td><td id="di_1730"></td><td id="mi_1730"></td><td id="do_1730"></td><td id="fr_1730"></td></tr> <tr style="height:4px;"><td>17:45</td><td id="mo_1745"></td><td id="di_1745"></td><td id="mi_1745"></td><td id="do_1745"></td><td id="fr_1745"></td></tr> </tbody> </table> `; function timeSlotDiff(s, e) { return ((e%100)/15 + 4*((e-(e%100))/100)) - ((s%100)/15 + 4*((s-(s%100))/100)) } function run() { const prioTable = document.getElementsByTagName('table')[0]; const prioTableBody = prioTable.getElementsByTagName('tbody')[0]; if (!prioTableBody.innerText.includes("# Plätze")) { // no parsable table return; } const flexWrapper = document.createElement("div"); flexWrapper.style = "display: flex; flex-wrap: wrap;"; prioTable.parentElement.insertBefore(flexWrapper, prioTable) flexWrapper.appendChild(prioTable); prioTable.insertAdjacentHTML('afterend', timetable); const tableRows = prioTableBody.getElementsByTagName('tr'); const timeslots = [] for (let i = 1; i+1 < tableRows.length; i++) { let row = tableRows[i].getElementsByTagName('td'); // get time info let timeStr = row[0].textContent; const startNum = parseInt(timeStr.substr(6,2)+ timeStr.substr(9,2)) const endNum = parseInt(timeStr.substr(14,2)+ timeStr.substr(17,2)) const slotLen = timeSlotDiff(startNum, endNum) const slotStartId = timeStr.substr(1,2).toLowerCase()+'_'+ startNum const isFull = tableRows[i].innerText.includes("VOLL") // get prio info const rankText = row[row.length-1]?.getElementsByTagName('div')?.[0]?.getElementsByTagName('div')?.[2]?.textContent ?? "" try { // enter into timetable const slotElem = document.getElementById(slotStartId) slotElem.setAttribute("rowspan", slotLen) slotElem.innerHTML = rankText + '<br>' + row[row.length-3].textContent if (isFull) { slotElem.setAttribute("style","background-color: #FFCCCC;") } else { slotElem.setAttribute("style","background-color: #726a6a;") } console.log(slotStartId + ' -> '+slotLen) } catch (e) {console.error(e)} } } (function() { 'use strict'; run() })();