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) { -%>
-<% } %>
-<% } %>
+<% } -%>
+<% } -%>
<%=useTracks ? 'trk' : 'rte'%>>
\ 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) { %>
+
+<% } -%>
+<% } -%>
+ <%=t ? 'trk' : 'rte'%>>
+<% } -%>
+
\ 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 += '' + (t ? 'trk' : 'rte') + '>\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) {