117 lines
3.6 KiB
JavaScript
117 lines
3.6 KiB
JavaScript
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
|
|
});
|
|
}
|