nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

commit 5ddb2483136de85148273a62248ea84045258be7
parent 1d8690da63106655833033f686e468d12f805fc5
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Sun, 19 Mar 2017 22:49:21 +0300

[tracks] load tracks from gpsies url

Diffstat:
Msrc/lib/leaflet.control.track-list/lib/geo_file_formats.js | 18+++++++++++++++---
Asrc/lib/leaflet.control.track-list/lib/gpsies.js | 37+++++++++++++++++++++++++++++++++++++
Msrc/lib/leaflet.control.track-list/track-list.js | 15++++++++++++---
Msrc/lib/xhr-promise/index.js | 8+++++++-
4 files changed, 71 insertions(+), 7 deletions(-)

diff --git a/src/lib/leaflet.control.track-list/lib/geo_file_formats.js b/src/lib/leaflet.control.track-list/lib/geo_file_formats.js @@ -16,7 +16,7 @@ function xmlGetNodeText(node) { } -function parseGpx(txt, name) { +function parseGpx(txt, name, preferNameFromFile) { var error; function getSegmentPoints(segment_element) { @@ -85,6 +85,18 @@ function parseGpx(txt, name) { if (dom.getElementsByTagName('gpx').length === 0) { return null; } + if (preferNameFromFile) { + for (let trk of [...dom.getElementsByTagName('trk')]) { + let trkName = trk.getElementsByTagName('name')[0]; + if (trkName) { + trkName = utf8_decode(xmlGetNodeText(trkName)); + if (trkName.length) { + name = trkName; + break; + } + } + } + } return [{ name: name, tracks: getTrackSegments(dom), @@ -670,7 +682,7 @@ function parseNakarteUrl(s) { return geodataArray; } -function parseGeoFile(name, data) { +function parseGeoFile(name, data, preferNameFromFile) { var parsers = [ parseTrackUrl, parseNakarteUrl, @@ -684,7 +696,7 @@ function parseGeoFile(name, data) { // parseYandexMap ]; for (var i = 0; i < parsers.length; i++) { - var parsed = parsers[i](data, name); + var parsed = parsers[i](data, name, preferNameFromFile); if (parsed !== null) { return parsed; } diff --git a/src/lib/leaflet.control.track-list/lib/gpsies.js b/src/lib/leaflet.control.track-list/lib/gpsies.js @@ -0,0 +1,36 @@ +import urlViaCorsProxy from 'lib/CORSProxy'; + +function urlEncode(d) { + return Object.entries(d).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join('&'); +} + +const re = /^http:\/\/www\.gpsies\.com\/map\.do\?fileId=([a-z]+)/; + +function isGpsiesUrl(url) { + return re.test(url); +} + +function gpsiesXhrOptions(url, options) { + const m = re.exec(url); + if (!m) { + throw new Error('Invalid gpsies url'); + } + const trackId = m[1]; + const newUrl = urlViaCorsProxy('http://www.gpsies.com/download.do'); + return [newUrl, { + method: 'POST', + data: urlEncode({ + fileId: trackId, + speed: '10', + dataType: '3', + filetype: 'gpxTrk', + submitButton: '', + inappropriate: '' + } + ), + headers: [["Content-type", "application/x-www-form-urlencoded"]], + responseType: 'binarystring' + }] +} + +export {gpsiesXhrOptions, isGpsiesUrl} +\ No newline at end of file diff --git a/src/lib/leaflet.control.track-list/track-list.js b/src/lib/leaflet.control.track-list/track-list.js @@ -21,6 +21,7 @@ import 'lib/leaflet.polyline-edit'; import 'lib/leaflet.polyline-measure'; import logging from 'lib/logging'; import {notify} from 'lib/notifications'; +import {isGpsiesUrl, gpsiesXhrOptions} from './lib/gpsies'; const TrackSegment = L.MeasuredLine.extend({ @@ -235,16 +236,24 @@ L.Control.TrackList = L.Control.extend({ if (geodata.length === 0 || geodata.length > 1 || geodata[0].error !== 'UNSUPPORTED') { this.addTracksFromGeodataArray(geodata); } else { - var url_for_request = urlViaCorsProxy(url); var name = url .split('#')[0] .split('?')[0] .replace(/\/*$/, '') .split('/') .pop(); - fetch(url_for_request, {responseType: 'binarystring'}) + let url_for_request, xhrOptions, preferNameFromFile; + if (isGpsiesUrl(url)) { + [url_for_request, xhrOptions] = gpsiesXhrOptions(url); + preferNameFromFile = true; + } else { + url_for_request = urlViaCorsProxy(url); + xhrOptions = {responseType: 'binarystring'}; + preferNameFromFile = false; + } + fetch(url_for_request, xhrOptions) .then(function(xhr) { - var geodata = parseGeoFile(name, xhr.responseBinaryText); + var geodata = parseGeoFile(name, xhr.responseBinaryText, preferNameFromFile); this.addTracksFromGeodataArray(geodata); }.bind(this), function() { diff --git a/src/lib/xhr-promise/index.js b/src/lib/xhr-promise/index.js @@ -21,7 +21,8 @@ class XMLHttpRequestPromiseError extends Error { class XMLHttpRequestPromise { constructor( url, {method='GET', data=null, responseType='', timeout=30000, maxTries=3, retryTimeWait=500, - isResponseSuccess=successIfStatus200, responseNeedsRetry=retryIfNetworkErrorOrServerError} = {}) { + isResponseSuccess=successIfStatus200, responseNeedsRetry=retryIfNetworkErrorOrServerError, + headers=null} = {}) { // console.log('promise constructor', url); const promise = new Promise((resolve, reject) => { this._resolve = resolve; @@ -48,6 +49,11 @@ class XMLHttpRequestPromise { } else { xhr.responseType = responseType; } + if (headers) { + for (let [k, v] of headers) { + xhr.setRequestHeader(k, v); + } + } } _open() {