function log(msg) { console.log("[Bahn Insight] " + msg); } function getMediaURL(path) { path = "media/" + path; return chrome.runtime.getURL(path) || browser.runtime.getURL(path); } /** * Return train name in format "PRODUCT TRAIN_NUMER" * i.e. "ICE 112", "RE 12734" * Sometimes train name is in format "PRODUCT LINE_NUMER (TRAIN_NUMER)" * i.e. "STB 12 (62371)" * Sometimes 'trains' are not trains or we can't find an unique id for them * i.e. busses, ferrys, trams * they will also be cleaned up and returned as undefined, because we can't link to them correctly */ function bahnParseTrainName(dirty_train_name) { var name_list = dirty_train_name.trim().replace(/ +/g, ' ').split(" "); // Train name in format "STB 12 (23561)" if(name_list.length == 3 && name_list[2].charAt(0) == '(' && name_list[2].charAt(name_list[2].length-1) == ')') { return name_list[0] + " " + name_list[2].substring(1, name_list[2].length-1); } // Exclude linking to specific products if(["bus", "fäh", "str"].indexOf(name_list[0].toLowerCase()) !== -1) { return undefined; } return dirty_train_name; } function domCreateLink(href) { var link = document.createElement("a"); link.setAttribute("href", href); return link; } function domCreateImage(src) { var image = document.createElement("img"); image.setAttribute("src", src); return image; } function domCreateLinebreak() { var linebreak = document.createElement("br"); return linebreak; } function domCreateButton(href, image_src) { var link = domCreateLink(href); link.setAttribute("target", "_blank"); var image = domCreateImage(image_src); image.setAttribute("style", "height: 2em; vertical-align:middle;") link.append(image); return link; } function domCreateButtonMarudor(path) { var button = domCreateButton("https://marudor.de" + path, getMediaURL("marudor.svg")); return button; } var connection_result_observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'childList') { var target = mutation.target; if (target.tagName === 'TD') { var timetable = target.querySelector("td div.detailContainer table.result tbody"); var trains = timetable.querySelectorAll("tr.first td.products"); trains.forEach((train) => { var train_names = train.querySelectorAll("span a"); train_names.forEach((train_name) => { train_name_text = bahnParseTrainName(train_name.innerText); if(typeof train_name_text !== 'undefined') { var marudor_button = domCreateButtonMarudor("/details/" + train_name_text); train_name.after(marudor_button); // Move linebreaks from link inner, after our button linebreaks = train_name.querySelectorAll("br"); if(linebreaks.length != 0) { linebreaks.forEach((linebreak) => { train_name.removeChild(linebreak); }); marudor_button.after(domCreateLinebreak()); } } }); }); var stations = timetable.querySelectorAll("tr td.station"); stations.forEach((station) => { var station_name = station.innerText; var marudor_button = domCreateButtonMarudor("/" + station_name); station.append(marudor_button); }); } } }); }); var target = document.getElementById('resultsOverview'); if(typeof target !== 'undefined') { connection_result_observer.observe(target, { subtree: true, childList: true }); }