diff --git a/server/export/gpx-line.ejs b/server/export/gpx-line.ejs index 745bb78b..c8fd59e2 100644 --- a/server/export/gpx-line.ejs +++ b/server/export/gpx-line.ejs @@ -6,19 +6,19 @@ <<%=useTracks ? 'trk' : 'rte'%>> <%=line.name || 'FacilMap route'%> -<% if(desc) { %> +<% if(desc) { -%> <%=desc%> -<% } %> -<% if(useTracks) { %> +<% } -%> +<% if(useTracks) { -%> -<% for(let trackPoint of line.trackPoints) { %> +<% for(let trackPoint of line.trackPoints) { -%> ele="<%=trackPoint.ele%>"<% } %> /> -<% } %> +<% } -%> -<% } else { %> -<% for(let routePoint of line.routePoints) { %> +<% } else { -%> +<% for(let routePoint of line.routePoints) { -%> -<% } %> -<% } %> +<% } -%> +<% } -%> > \ No newline at end of file diff --git a/server/export/gpx-pad.ejs b/server/export/gpx-pad.ejs new file mode 100644 index 00000000..91e7441b --- /dev/null +++ b/server/export/gpx-pad.ejs @@ -0,0 +1,31 @@ + + + + <%=padData.name%> + + +<% for(let marker of markers) { -%> + ele="<%=marker.ele%>"<% } %>> + <%=marker.name%> + <%=dataToText(types[marker.typeId].fields, marker.data)%> + +<% } -%> +<% for(let line of lines) { -%> +<% let t = (useTracks || line.mode == "track"); -%> + <<%=t ? 'trk' : 'rte'%>> + <%=line.name%> + <%=dataToText(types[line.typeId].fields, line.data)%> +<% if(t) { -%> + +<% for(let trackPoint of line.trackPoints) { -%> + ele="<%=trackPoint.ele%>"<% } %> /> +<% } -%> + +<% } else { -%> +<% for(let routePoint of line.routePoints) { %> + +<% } -%> +<% } -%> + > +<% } -%> + \ No newline at end of file diff --git a/server/export/gpx.js b/server/export/gpx.js index a8a6e24b..9cf311b4 100644 --- a/server/export/gpx.js +++ b/server/export/gpx.js @@ -4,7 +4,12 @@ const Promise = require("bluebird"); var utils = require("../utils"); -var _e = utils.escapeXml; +let padTemplate; +Promise.promisify(fs.readFile)(`${__dirname}/gpx-pad.ejs`).then((t) => { + padTemplate = ejs.compile(t.toString()); +}).catch((err) => { + console.error("Error reading GPX pad template", err.stack || err); +}); let lineTemplate; Promise.promisify(fs.readFile)(`${__dirname}/gpx-line.ejs`).then((t) => { @@ -24,94 +29,28 @@ function _dataToText(fields, data) { return text.join('\n\n'); } -function _textToData(fields, text) { - function hasField(fieldName) { - for(var i=0; i { + return Promise.all([ + database.getPadData(padId), + Promise.resolve().then(() => { var typesObj = { }; return utils.streamEachPromise(database.getTypes(padId), function(type) { typesObj[type.id] = type; }).then(() => typesObj); - }, - - markers: (typesObj) => { - var markers = ''; - return utils.streamEachPromise(database.getPadMarkers(padId), function(marker) { - markers += '\n' + - '\t' + _e(marker.name) + '\n' + - '\t' + _e(_dataToText(typesObj[marker.typeId].fields, marker.data)) + '\n' + - '\n'; - }).then(() => markers); - }, - - lines: (typesObj) => { - var lines = ''; - return utils.streamEachPromise(database.getPadLinesWithPoints(padId), function(line) { - var t = (useTracks || line.mode == "track"); - - lines += '<' + (t ? 'trk' : 'rte') + '>\n' + - '\t' + _e(line.name) + '\n' + - '\t' + _e(_dataToText(typesObj[line.typeId].fields, line.data)) + '\n'; - - if(t) { - lines += '\t\n'; - for(var i=0; i\n'; - } - lines += '\t\n'; - } else { - for(var i=0; i\n'; - } - } - - lines += '\n'; - }).then(() => lines); - } - }).then((res) => '\n' + - '\n' + - '\t\n' + - '\t\t' + _e(res.padData.name) + '\n' + - '\t\t\n' + - '\t\n' + - res.markers.replace(/^(.)/gm, '\t$1') + - res.lines.replace(/^(.)/gm, '\t$1') + - '' - ); + }), + utils.streamToArrayPromise(database.getPadMarkers(padId)), + utils.streamToArrayPromise(database.getPadLinesWithPoints(padId)) + ]).then(([padData, types, markers, lines]) => { + return padTemplate({ + time: utils.isoDate(), + padData, + types, + markers, + lines, + dataToText: _dataToText, + useTracks + }); + }); } function exportLine(line, type, useTracks) {