nakarte

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

commit 40e9553d03a8ce395d8d65acf52933c24c5b7d86
parent cec5b9d0a03cd680dc7892f9ebb8f7a903e80504
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Tue, 13 Feb 2018 09:48:09 +0300

[tracks] refactoring: moved files retreiving to geo_file_formats

Diffstat:
Msrc/lib/leaflet.control.track-list/lib/geo_file_formats.js | 66+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Msrc/lib/leaflet.control.track-list/track-list.js | 87+++++++++++++++++--------------------------------------------------------------
2 files changed, 83 insertions(+), 70 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 @@ -3,6 +3,12 @@ import RawDeflate from 'vendored/github.com/dankogai/js-deflate/rawinflate'; import stripBom from 'lib/stripBom'; import {decode as utf8_decode} from 'utf8'; +import {fetch} from 'lib/xhr-promise'; +import urlViaCorsProxy from 'lib/CORSProxy'; +import {isGpsiesUrl, gpsiesXhrOptions, gpsiesParser} from './gpsies'; +import {isStravaUrl, stravaXhrOptions, stravaParser} from './strava'; +import {isEndomondoUrl, endomonXhrOptions, endomondoParser} from './endomondo'; + function xmlGetNodeText(node) { if (node) { @@ -759,6 +765,64 @@ function parseNakarteUrl(s) { return geodataArray; } + +function simpleTrackFetchOptions(url) { + return [{ + url: urlViaCorsProxy(url), + options: {responseType: 'binarystring'} + }]; +} + + +function simpleTrackParser(name, responses) { + if (responses.length !== 1) { + throw new Error(`Invalid responses array length ${responses.length}`); + } + return parseGeoFile(name, responses[0].responseBinaryText); +} + + +function loadFromUrl(url) { + try { + url = decodeURIComponent(url); + } catch (e) { + } + let geodata; + geodata = parseGeoFile('', url); + if (geodata.length === 0 || geodata.length > 1 || geodata[0].error !== 'UNSUPPORTED') { + return Promise.resolve(geodata); + } else { + var name = url + .split('#')[0] + .split('?')[0] + .replace(/\/*$/, '') + .split('/') + .pop(); + + let urlToRequest = simpleTrackFetchOptions; + let parser = simpleTrackParser; + + + if (isGpsiesUrl(url)) { + urlToRequest = gpsiesXhrOptions; + parser = gpsiesParser; + } else if (isEndomondoUrl(url)) { + urlToRequest = endomonXhrOptions; + parser = endomondoParser; + } else if (isStravaUrl(url)) { + urlToRequest = stravaXhrOptions; + parser = stravaParser; + } + const requests = urlToRequest(url); + return Promise.all(requests.map((request) => fetch(request.url, request.options))) + .then( + (responses) => parser(name, responses), + () => [{name: url, error: 'NETWORK'}] + ); + } +} + + function parseGeoFile(name, data) { var parsers = [ parseTrackUrl, @@ -782,4 +846,4 @@ function parseGeoFile(name, data) { return [{name: name, error: 'UNSUPPORTED'}]; } -export {parseGeoFile, parseGpx}; +export {parseGeoFile, parseGpx, loadFromUrl}; diff --git a/src/lib/leaflet.control.track-list/track-list.js b/src/lib/leaflet.control.track-list/track-list.js @@ -4,9 +4,8 @@ import Contextmenu from 'lib/contextmenu'; import 'lib/knockout.component.progress/progress'; import './track-list.css'; import {selectFiles, readFiles} from 'lib/file-read'; -import {parseGeoFile} from './lib/geo_file_formats'; -import urlViaCorsProxy from 'lib/CORSProxy'; -import {fetch} from 'lib/xhr-promise'; +import {parseGeoFile, loadFromUrl} from './lib/geo_file_formats'; + import geoExporters from './lib/geo_file_exporters'; import copyToClipboard from 'lib/clipboardCopy'; import {saveAs} from 'file-saver'; @@ -21,9 +20,6 @@ import 'lib/leaflet.polyline-edit'; import 'lib/leaflet.polyline-measure'; import logging from 'lib/logging'; import {notify} from 'lib/notifications'; -import {isGpsiesUrl, gpsiesXhrOptions, gpsiesParser} from './lib/gpsies'; -import {isStravaUrl, stravaXhrOptions, stravaParser} from './lib/strava'; -import {isEndomondoUrl, endomonXhrOptions, endomondoParser} from './lib/endomondo'; const TrackSegment = L.MeasuredLine.extend({ includes: L.Polyline.EditMixin, @@ -38,21 +34,6 @@ const TrackSegment = L.MeasuredLine.extend({ TrackSegment.mergeOptions(L.Polyline.EditMixinOptions); -function simpleTrackFetchOptions(url) { - return [{ - url: urlViaCorsProxy(url), - options: {responseType: 'binarystring'} - }]; -} - - -function simpleTrackParser(name, responses) { - if (responses.length !== 1) { - throw new Error(`Invalid responses array length ${responses.length}`); - } - return parseGeoFile(name, responses[0].responseBinaryText); -} - L.Control.TrackList = L.Control.extend({ options: {position: 'bottomright'}, includes: L.Mixin.Events, @@ -234,12 +215,11 @@ L.Control.TrackList = L.Control.extend({ size: fileData.data.length, content: fileData.data.length <= 7500 ? btoa(fileData.data) : null }); - } - + } + this.readingFiles(false); - this.addTracksFromGeodataArray(geodataArray, debugFileData); - }.bind(this) - ); + this.addTracksFromGeodataArray(geodataArray, debugFileData); + }.bind(this)); }, loadFilesFromDisk: function() { @@ -249,50 +229,20 @@ L.Control.TrackList = L.Control.extend({ loadFilesFromUrl: function() { var url = this.url().trim(); - logging.captureBreadcrumb({message: 'load track from url', data: {url: url}}); - try { - url = decodeURIComponent(url); - } catch (e) { + if (!url) { + return; } - let geodata; - if (url.length > 0) { - this.readingFiles(true); - this.readProgressDone(undefined); - this.readProgressRange(1); - geodata = parseGeoFile('', url); - if (geodata.length === 0 || geodata.length > 1 || geodata[0].error !== 'UNSUPPORTED') { + + this.readingFiles(true); + this.readProgressDone(undefined); + this.readProgressRange(1); + + logging.captureBreadcrumb({message: 'load track from url', data: {url: url}}); + loadFromUrl(url) + .then((geodata) => { this.addTracksFromGeodataArray(geodata); - } else { - var name = url - .split('#')[0] - .split('?')[0] - .replace(/\/*$/, '') - .split('/') - .pop(); - - let urlToRequest = simpleTrackFetchOptions; - let parser = simpleTrackParser; - - - if (isGpsiesUrl(url)) { - urlToRequest = gpsiesXhrOptions; - parser = gpsiesParser; - } else if (isEndomondoUrl(url)) { - urlToRequest = endomonXhrOptions; - parser = endomondoParser; - } else if (isStravaUrl(url)) { - urlToRequest = stravaXhrOptions; - parser = stravaParser; - } - const requests = urlToRequest(url); - Promise.all(requests.map((request) => fetch(request.url, request.options))) - .then( - (responses) => parser(name, responses), - () => [{name: url, error: 'NETWORK'}] - ) - .then((geodata) => this.addTracksFromGeodataArray(geodata)); - } - } + this.readingFiles(false) + }); this.url(''); }, @@ -335,7 +285,6 @@ L.Control.TrackList = L.Control.extend({ } }.bind(this) ); - this.readingFiles(false); if (messages.length) { logging.captureMessage('errors in loaded tracks', {extra: {message: messages.join('\n'), debugData}}); notify(messages.join('\n'));