unify formatting
This commit is contained in:
parent
6419d5defd
commit
553f764e69
240
background.js
240
background.js
@ -6,60 +6,60 @@ let gpxTrack = null;
|
||||
|
||||
/**
|
||||
* Convert the Swiss projection coordinates to WGS84 (lat/lon).
|
||||
*
|
||||
* Calculations from "Approximate formulas for the transformation between Swiss
|
||||
* projection coordinates and WGS84" by the Swiss Federal Office of Topography,
|
||||
* swisstopo
|
||||
*
|
||||
* Calculations from "Approximate formulas for the transformation between Swiss
|
||||
* projection coordinates and WGS84" by the Swiss Federal Office of Topography,
|
||||
* swisstopo
|
||||
* (https://www.swisstopo.admin.ch/en/knowledge-facts/surveying-geodesy/reference-systems/map-projections.html).
|
||||
*
|
||||
*
|
||||
* @param {*} point Array of Swiss projection coordinates, position 0 is E and 1 is N.
|
||||
* @returns Calculated lat and lon.
|
||||
*/
|
||||
function toWGS84(point) {
|
||||
// convert LV95 into the civilian system
|
||||
let y_aux = (point[0] - 2600000)/1000000;
|
||||
let x_aux = (point[1] - 1200000)/1000000;
|
||||
// convert LV95 into the civilian system
|
||||
let y_aux = (point[0] - 2600000) / 1000000;
|
||||
let x_aux = (point[1] - 1200000) / 1000000;
|
||||
|
||||
// calculate longitude and latitude in the unit 10000"
|
||||
let lat = 16.9023892 +
|
||||
3.238272 * x_aux -
|
||||
0.270978 * Math.pow(y_aux, 2) -
|
||||
0.002528 * Math.pow(x_aux, 2) -
|
||||
0.0447 * Math.pow(y_aux, 2) * x_aux -
|
||||
0.0140 * Math.pow(x_aux, 3);
|
||||
// calculate longitude and latitude in the unit 10000"
|
||||
let lat = 16.9023892 +
|
||||
3.238272 * x_aux -
|
||||
0.270978 * Math.pow(y_aux, 2) -
|
||||
0.002528 * Math.pow(x_aux, 2) -
|
||||
0.0447 * Math.pow(y_aux, 2) * x_aux -
|
||||
0.0140 * Math.pow(x_aux, 3);
|
||||
|
||||
let lon = 2.6779094 +
|
||||
4.728982 * y_aux +
|
||||
0.791484 * y_aux * x_aux +
|
||||
0.1306 * y_aux * Math.pow(x_aux, 2) -
|
||||
0.0436 * Math.pow(y_aux, 3);
|
||||
let lon = 2.6779094 +
|
||||
4.728982 * y_aux +
|
||||
0.791484 * y_aux * x_aux +
|
||||
0.1306 * y_aux * Math.pow(x_aux, 2) -
|
||||
0.0436 * Math.pow(y_aux, 3);
|
||||
|
||||
// unit 10000" to 1" and seconds to degrees (dec)
|
||||
lat = lat * 100 / 36;
|
||||
lon = lon * 100 / 36;
|
||||
// unit 10000" to 1" and seconds to degrees (dec)
|
||||
lat = lat * 100 / 36;
|
||||
lon = lon * 100 / 36;
|
||||
|
||||
return {lat: lat, lon: lon};
|
||||
return { lat: lat, lon: lon };
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the gpx trackpoint representation of a Swiss projection coordinate point.
|
||||
*
|
||||
*
|
||||
* @param {*} point Array of Swiss projection coordinates, position 0 is E and 1 is N.
|
||||
* @returns Track point xml node for gpx.
|
||||
*/
|
||||
function toTrackPoint(point) {
|
||||
let wgs84Point = toWGS84(point);
|
||||
return `<trkpt lat="${wgs84Point.lat}" lon="${wgs84Point.lon}"/>`;
|
||||
function toTrackPoint(point) {
|
||||
let wgs84Point = toWGS84(point);
|
||||
return `<trkpt lat="${wgs84Point.lat}" lon="${wgs84Point.lon}"/>`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the gpx waypoint representation of a route portal point.
|
||||
*
|
||||
*
|
||||
* @returns Way point xml node for gpx.
|
||||
*/
|
||||
function toWayPoint(point) {
|
||||
let wgs84Point = toWGS84(point.geom.coordinates);
|
||||
return `
|
||||
function toWayPoint(point) {
|
||||
let wgs84Point = toWGS84(point.geom.coordinates);
|
||||
return `
|
||||
<wpt lat="${wgs84Point.lat}" lon="${wgs84Point.lon}">
|
||||
<ele>${point.altitude}</ele>
|
||||
<name>${point.display_name}</name>
|
||||
@ -68,38 +68,42 @@ function toWGS84(point) {
|
||||
|
||||
/**
|
||||
* Create track title.
|
||||
*
|
||||
* @param {*} geoJson
|
||||
*
|
||||
* @param {*} geoJson
|
||||
* @returns Combined route number, id and route title.
|
||||
*/
|
||||
function trackTitle(geoJson) {
|
||||
const route = geoJson.segments[0];
|
||||
const book = geoJson.book_route_number ? `${geoJson.book_route_number} - ` : "";
|
||||
const route = geoJson.segments[0];
|
||||
const book = geoJson.book_route_number
|
||||
? `${geoJson.book_route_number} - `
|
||||
: "";
|
||||
|
||||
return `${book}${geoJson.title}`;
|
||||
return `${book}${geoJson.title}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a gpx representation from the sac GeoJSON data.
|
||||
*
|
||||
* @param {*} geoJson
|
||||
*
|
||||
* @param {*} geoJson
|
||||
* @returns Simple gpx string.
|
||||
*/
|
||||
function toGpx(geoJson) {
|
||||
let trackSegments = geoJson.segments.map(segment => {
|
||||
return `<trkseg>
|
||||
let trackSegments = geoJson.segments.map((segment) => {
|
||||
return `<trkseg>
|
||||
${segment.geom.coordinates.map(toTrackPoint).join("")}
|
||||
</trkseg>`;
|
||||
}).join("");
|
||||
}).join("");
|
||||
|
||||
let endPoint = geoJson.end_point ? toWayPoint(geoJson.end_point) : "";
|
||||
let waypoints = geoJson.waypoints ? geoJson.waypoints.map(wp => {
|
||||
return toWayPoint(wp.reference_poi);
|
||||
}).join("") : "";
|
||||
let endPoint = geoJson.end_point ? toWayPoint(geoJson.end_point) : "";
|
||||
let waypoints = geoJson.waypoints
|
||||
? geoJson.waypoints.map((wp) => {
|
||||
return toWayPoint(wp.reference_poi);
|
||||
}).join("")
|
||||
: "";
|
||||
|
||||
const routeTitle = trackTitle(geoJson);
|
||||
const routeTitle = trackTitle(geoJson);
|
||||
|
||||
const xmlString = `<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
const xmlString = `<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
|
||||
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://www.topografix.com/GPX/1/0"
|
||||
@ -117,120 +121,128 @@ function toGpx(geoJson) {
|
||||
</gpx>
|
||||
`;
|
||||
|
||||
const parser = new DOMParser();
|
||||
let xmlDoc = parser.parseFromString(xmlString, "text/xml");
|
||||
const parser = new DOMParser();
|
||||
let xmlDoc = parser.parseFromString(xmlString, "text/xml");
|
||||
|
||||
return new XMLSerializer().serializeToString(xmlDoc.documentElement);
|
||||
return new XMLSerializer().serializeToString(xmlDoc.documentElement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercept the download of GeoJSON data and save it for the background script.
|
||||
*/
|
||||
function listener(details) {
|
||||
let filter = browser.webRequest.filterResponseData(details.requestId);
|
||||
let decoder = new TextDecoder("utf-8");
|
||||
let encoder = new TextEncoder();
|
||||
let filter = browser.webRequest.filterResponseData(details.requestId);
|
||||
let decoder = new TextDecoder("utf-8");
|
||||
let encoder = new TextEncoder();
|
||||
|
||||
let data = [];
|
||||
filter.ondata = event => {
|
||||
data.push(event.data);
|
||||
};
|
||||
let data = [];
|
||||
filter.ondata = (event) => {
|
||||
data.push(event.data);
|
||||
};
|
||||
|
||||
filter.onstop = async event => {
|
||||
let blob = new Blob(data, {type: 'text/html'});
|
||||
let buffer = await blob.arrayBuffer();
|
||||
let str = decoder.decode(buffer);
|
||||
filter.onstop = async (event) => {
|
||||
let blob = new Blob(data, { type: "text/html" });
|
||||
let buffer = await blob.arrayBuffer();
|
||||
let str = decoder.decode(buffer);
|
||||
|
||||
updateActiveTab(browser.tabs);
|
||||
updateActiveTab(browser.tabs);
|
||||
|
||||
filter.write(encoder.encode(str));
|
||||
filter.close();
|
||||
filter.write(encoder.encode(str));
|
||||
filter.close();
|
||||
|
||||
let geoJson = JSON.parse(str);
|
||||
const routeTitle = trackTitle(geoJson);
|
||||
gpxTrack = {title: routeTitle, data: toGpx(geoJson)};
|
||||
};
|
||||
let geoJson = JSON.parse(str);
|
||||
const routeTitle = trackTitle(geoJson);
|
||||
gpxTrack = { title: routeTitle, data: toGpx(geoJson) };
|
||||
};
|
||||
|
||||
return {};
|
||||
return {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a url should be intercepted.
|
||||
*
|
||||
* @param {*} tab
|
||||
*
|
||||
* @param {*} tab
|
||||
* @returns True if the active tab is an sac website, false otherwise.
|
||||
*/
|
||||
function checkTrack(tab) {
|
||||
if (!tab.url) {
|
||||
return false;
|
||||
}
|
||||
if (!tab.url) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return tab.url.match("https://www.sac-cas.ch/.*") && gpxTrack;
|
||||
return tab.url.match("https://www.sac-cas.ch/.*") && gpxTrack;
|
||||
}
|
||||
|
||||
/**
|
||||
* If a valid tack was selected, download it as a gpx file.
|
||||
*/
|
||||
function handleClick(tab) {
|
||||
const hasTrack = checkTrack(tab);
|
||||
if (!hasTrack) {
|
||||
return;
|
||||
}
|
||||
const hasTrack = checkTrack(tab);
|
||||
if (!hasTrack) {
|
||||
return;
|
||||
}
|
||||
|
||||
let blob = new Blob([gpxTrack.data], {type: "application/gpx+xml"});
|
||||
let objectURL = URL.createObjectURL(blob);
|
||||
let blob = new Blob([gpxTrack.data], { type: "application/gpx+xml" });
|
||||
let objectURL = URL.createObjectURL(blob);
|
||||
|
||||
let downloading = browser.downloads.download({
|
||||
url : objectURL,
|
||||
filename : `${gpxTrack.title}.gpx`,
|
||||
saveAs: true,
|
||||
conflictAction : 'uniquify'
|
||||
});
|
||||
|
||||
downloading.then(
|
||||
(id) => console.log(`Started downloading: ${id}`),
|
||||
(error) => console.log(`Download failed: ${error}`));
|
||||
gpxTrack = null;
|
||||
let downloading = browser.downloads.download({
|
||||
url: objectURL,
|
||||
filename: `${gpxTrack.title}.gpx`,
|
||||
saveAs: true,
|
||||
conflictAction: "uniquify",
|
||||
});
|
||||
|
||||
downloading.then(
|
||||
(id) => console.log(`Started downloading: ${id}`),
|
||||
(error) => console.log(`Download failed: ${error}`),
|
||||
);
|
||||
gpxTrack = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the download icon and text.
|
||||
*/
|
||||
function updateActiveTab(tabs) {
|
||||
function updateTab(tabs) {
|
||||
if (tabs[0]) {
|
||||
updateIcon(tabs[0]);
|
||||
}
|
||||
function updateTab(tabs) {
|
||||
if (tabs[0]) {
|
||||
updateIcon(tabs[0]);
|
||||
}
|
||||
|
||||
let gettingActiveTab = browser.tabs.query({active: true, currentWindow: true});
|
||||
gettingActiveTab.then(updateTab);
|
||||
}
|
||||
|
||||
let gettingActiveTab = browser.tabs.query({
|
||||
active: true,
|
||||
currentWindow: true,
|
||||
});
|
||||
gettingActiveTab.then(updateTab);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the download icon.
|
||||
*/
|
||||
function updateIcon(tab) {
|
||||
const hasTrack = checkTrack(tab);
|
||||
const hasTrack = checkTrack(tab);
|
||||
|
||||
browser.browserAction.setIcon({
|
||||
path: hasTrack ? {
|
||||
browser.browserAction.setIcon({
|
||||
path: hasTrack
|
||||
? {
|
||||
48: "icons/map.png",
|
||||
} : {
|
||||
}
|
||||
: {
|
||||
48: "icons/map-disabled.png",
|
||||
},
|
||||
tabId: tab.id
|
||||
});
|
||||
browser.browserAction.setTitle({
|
||||
title: hasTrack ? `Download track "${gpxTrack.title}"` : 'No track selected',
|
||||
tabId: tab.id
|
||||
});
|
||||
tabId: tab.id,
|
||||
});
|
||||
browser.browserAction.setTitle({
|
||||
title: hasTrack
|
||||
? `Download track "${gpxTrack.title}"`
|
||||
: "No track selected",
|
||||
tabId: tab.id,
|
||||
});
|
||||
}
|
||||
|
||||
browser.webRequest.onBeforeRequest.addListener(
|
||||
listener,
|
||||
{urls: ["https://www.sac-cas.ch/*[routeId]*"]},
|
||||
["blocking"]
|
||||
listener,
|
||||
{ urls: ["https://www.sac-cas.ch/*[routeId]*"] },
|
||||
["blocking"],
|
||||
);
|
||||
|
||||
browser.browserAction.onClicked.addListener(handleClick);
|
||||
@ -238,5 +250,5 @@ browser.browserAction.onClicked.addListener(handleClick);
|
||||
browser.tabs.onUpdated.addListener(updateActiveTab);
|
||||
browser.tabs.onActivated.addListener(updateActiveTab);
|
||||
browser.windows.onFocusChanged.addListener(updateActiveTab);
|
||||
|
||||
|
||||
updateActiveTab();
|
||||
|
Loading…
Reference in New Issue
Block a user