1
0
Fork 0
bahn-insight/js/reiseauskunft.js

194 lines
6.9 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");
/*
* COLLECT DATA
*/
var data = [];
var relations = timetable.querySelectorAll("tr.first");
relations.forEach((relation, i) => {
var relationend = relation.nextElementSibling;
data[i] = {};
data[i]["from"] = {}
data[i]["to"] = {}
var relation_from = relation.querySelector("td.station");
data[i]["from"]["station"] = relation_from.innerText;
var relation_to = relationend.querySelector("td.station");
data[i]["to"]["station"] = relation_to.innerText;
var relation_departure = relation.querySelector("td.time");
var relation_departure_list = relation_departure.firstChild.textContent.trim().split(" ");
data[i]["from"]["time"] = relation_departure_list[1];
data[i]["from"]["time_current"] = null;
var relation_departure_current = relation_departure.querySelector("span.delay, span.delayOnTime");
if(typeof relation_departure_list !== 'undfined') {
data[i]["from"]["time_current"] = relation_departure_current.innerText.trim();
}
var relation_arrival = relationend.querySelector("td.time");
var relation_arrival_list = relation_arrival.firstChild.textContent.trim().split(" ");
data[i]["to"]["time"] = relation_arrival_list[1];
data[i]["to"]["time_current"] = null;
var relation_arrival_current = relation_arrival.querySelector("span.delay, span.delayOnTime");
if(typeof relation_arrival_list !== 'undfined') {
data[i]["to"]["time_current"] = relation_arrival_current.innerText.trim();
}
var relation_platform = relation.querySelector("td.platform");
data[i]["from"]["platform"] = relation_platform.innerText;
var relation_to_platform = relationend.querySelector("td.platform");
data[i]["to"]["platform"] = relation_to_platform.innerText;
var relation_products = relation.querySelector("td.products");
data[i]["products"] = [];
var relation_trains = relation_products.querySelectorAll("span a");
relation_trains.forEach((train, j) => {
data[i]["products"][j] = {};
data[i]["products"][j]["product"] = null;
data[i]["products"][j]["train_number"] = null;
data[i]["products"][j]["line_name"] = null;
var name_list = train.innerText.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) == ')') {
data[i]["products"][j]["product"] = name_list[0];
data[i]["products"][j]["train_number"] = name_list[0] + " " + name_list[2].substring(1, name_list[2].length-1);
data[i]["products"][j]["line_name"] = name_list[0] + " " + name_list[1];
}
else {
data[i]["products"][j]["product"] = name_list[0];
data[i]["products"][j]["train_number"] = name_list[0] + " " + name_list[1];
}
});
var relation_items = relation.querySelectorAll("td");
var relation_info = relation_items[relation_items.length-1];
data[i]["info"] = relation_info.innerText;
});
console.log(data);
/*
* INJECT CUSTOM UI
*/
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
});
}