// ==UserScript== // @name VoWi and Mattermost links in TISS // @description Add links to VoWi pages and Mattermost channels to TISS courses. // @namespace https://fsinf.at/ // @match https://tiss.tuwien.ac.at/course/educationDetails.xhtml* // @match https://tiss.tuwien.ac.at/course/courseDetails.xhtml* // @match https://tiss.tuwien.ac.at/education/favorites.xhtml* // @grant none // @version 1.12 // @downloadURL https://fsinf.at/userscripts/tiss-enhancement.user.js // @updateURL https://fsinf.at/userscripts/tiss-enhancement.user.js // ==/UserScript== // Inspired by https://greasyfork.org/de/scripts/9914-tiss-enhancer/ if (document.getElementsByClassName("loading").length > 0) { // Don't run the script on sites which only contain the loading animation. return; } function vowi_link(tissID) { return "https://vowi.fsinf.at/wiki/Spezial:CourseById?ns=TU_Wien&id=" + tissID; } function mm_link(lvaTitle) { var channame = lvaTitle.toLowerCase().replace('ä','ae').replace('ö','oe').replace('ü','ue'); channame = channame.replace(/[^a-zA-Z0-9_]/g,'-'); channame = channame.replace(/-+/g,'-'); channame = channame.substring(0,63); channame = channame.replace(/-$/, ''); return "https://mattermost.fsinf.at/w-inf-tuwien/channels/" + encodeURIComponent(channame); } var page = window.location.href.match(/tiss.tuwien.ac.at\/([\w\/]+)\.xhtml/i)[1]; var locale = document.cookie.match(/TISS_LANG=([\w-]+)/); locale = locale ? locale[1] : "de"; // course overview: add VoWi link if (page == "course/educationDetails" || page == "course/courseDetails") { var header = document.getElementById("subHeader").innerText; var heading = document.getElementById("contentInner").getElementsByTagName("h1")[0].innerText; var lvaTitle = /^\s*[A-Z0-9\.]{7} (.*)$/gm.exec(heading)[1]; var tissID = /^\s*([A-Z0-9.]{7})\s+(.*)$/gm.exec(heading)[1].replace(".", ""); var ul = document.getElementById("contentInner").getElementsByClassName("bulletList")[0]; var li = document.createElement("li"); li.innerHTML = '' + (locale == "de" ? "Zum" : "To") + ' VoWi'; ul.appendChild(li); li = document.createElement("li"); li.innerHTML = '' + (locale == "de" ? "Zum" : "To") + ' Mattermost-Channel'; ul.appendChild(li); } // favorites page: add VoWi link icon if (page == "education/favorites") { // Creating the node once and cloning it is noticeably faster than modifying the original // image element in place and overwriting the src attribute with the base64 string. var tuwelTemplate = document.createElement("img"); tuwelTemplate.src = ` data:image/png;base64, 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 `; tuwelTemplate.alt = "TUWEL"; tuwelTemplate.title = "TUWEL"; tuwelTemplate.style = "margin-right: 5px"; var dlTemplate = document.createElement("img"); dlTemplate.src = ` data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAC4jAAAuIwF4pT92AAABXUlEQVQ4y+2Tv0tCURzFP+/1VEoypCHCSAeJECGMpppaJHFpF6Kx SWgQ+gcCh4aamiUborEIJCKMIIrAUpFCLLUfDipiIijos0HUTIJKh4bOdO/l8Ll8z7lXwHlQowcS 6ZH+HkhqLFwmLSpRIJgqYhxWcZosECi1x+cyaVGKMuvhfAdIaISddVvRKCT2jiM4bGYq1QpX4Tgr u3eEynVz1m1lUFFGuervmEX6uKlRwhdKU6mFmbOMMTtlxKMSmd6O/DSjKjtPRZZ9ceY3L8gUy1gm 9SzphN+H/VyqEnvJAX3MGIa6a02W62GLotgdSDeiASCayn+//laPAouj/TjtE4xr1SRTKbaiVRDa rzdI9YOCXCMrfwIJqPHa9DhsZgBe01nWPLdtEAE13gVD03N0HsS+n2yB/NcJBiSRUCLP4dk9wccM Gzc5cnIL0vQk85xcPgAQiL21P8j/3/+l3gFrvHeTUEQuDAAAAABJRU5ErkJggg== `; dlTemplate.alt = "Distance Learning"; dlTemplate.style = "vertical-align: bottom"; Array.from(document.querySelectorAll("tr.ui-widget-content")).forEach(function(row, index) { var titleCol = row.getElementsByClassName("favoritesTitleCol")[0]; var lvaTitle = titleCol.getElementsByTagName("a")[0].text.trim(); var tissID = titleCol.querySelector("span[title='LVA Nr.'],span[title='Course Nr.']").textContent.replace(".", ""); var a = document.createElement("a"); a.href = mm_link(lvaTitle); a.target = "_blank"; var img = document.createElement("img"); img.src = "https://mattermost.fsinf.at/static/images/favicon/favicon-32x32.png"; img.title = "Mattermost"; img.alt = "Mattermost"; img.width = 16; img.height = 16; img.style = "margin-right: 5px"; a.appendChild(img); var favoritesLinks = row.getElementsByClassName("favoritesLinks")[0]; favoritesLinks.insertBefore(a, favoritesLinks.childNodes[0]); a = document.createElement("a"); a.href = vowi_link(tissID); a.target = "_blank"; img = document.createElement("img"); img.src = "https://vowi.fsinf.at/favicon.ico"; img.title = "VoWi"; img.alt = "VoWi"; img.width = 16; img.height = 16; img.style = "margin-right: 5px"; a.appendChild(img); favoritesLinks = row.getElementsByClassName("favoritesLinks")[0]; favoritesLinks.insertBefore(a, favoritesLinks.childNodes[0]); favoritesLinks.style = "width: 120px !important"; var tuwel = row.querySelector("img[title='TUWEL']"); if (tuwel !== null) { tuwel.parentElement.target = "_blank"; tuwel.replaceWith(tuwelTemplate.cloneNode(false)); } var dl = row.querySelector("img[alt='Distance Learning']"); if (dl !== null) { dl.replaceWith(dlTemplate.cloneNode(false)); } }); }