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:
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'));