2017-05-26 14:06:09 +00:00
|
|
|
const ejs = require("ejs");
|
|
|
|
const fs = require("fs");
|
|
|
|
const Promise = require("bluebird");
|
|
|
|
|
2017-03-01 23:41:16 +00:00
|
|
|
var utils = require("../utils");
|
2017-12-25 17:24:15 +00:00
|
|
|
const commonFilter = require("facilmap-frontend/common/filter");
|
2016-09-28 12:10:08 +00:00
|
|
|
|
2017-05-26 15:36:51 +00:00
|
|
|
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);
|
|
|
|
});
|
2016-09-28 12:10:08 +00:00
|
|
|
|
2017-05-26 14:06:09 +00:00
|
|
|
let lineTemplate;
|
|
|
|
Promise.promisify(fs.readFile)(`${__dirname}/gpx-line.ejs`).then((t) => {
|
|
|
|
lineTemplate = ejs.compile(t.toString());
|
|
|
|
}).catch((err) => {
|
|
|
|
console.error("Error reading GPX line template", err.stack || err);
|
|
|
|
});
|
|
|
|
|
2016-09-28 12:10:08 +00:00
|
|
|
function _dataToText(fields, data) {
|
2017-02-10 11:55:04 +00:00
|
|
|
if(fields.length == 1 && fields[0].name == "Description")
|
|
|
|
return data["Description"] || "";
|
|
|
|
|
2016-09-28 12:10:08 +00:00
|
|
|
var text = [ ];
|
|
|
|
for(var i=0; i<fields.length; i++) {
|
2017-02-10 11:55:04 +00:00
|
|
|
text.push(fields[i].name + ": " + (data[fields[i].name] || ""));
|
2016-09-28 12:10:08 +00:00
|
|
|
}
|
|
|
|
return text.join('\n\n');
|
|
|
|
}
|
|
|
|
|
2017-12-25 17:24:15 +00:00
|
|
|
function exportGpx(database, padId, useTracks, filter) {
|
|
|
|
const filterFunc = commonFilter.compileExpression(filter);
|
|
|
|
|
|
|
|
return utils.promiseAuto({
|
|
|
|
padData: database.getPadData(padId),
|
|
|
|
|
|
|
|
types: () => {
|
2016-10-30 14:01:21 +00:00
|
|
|
var typesObj = { };
|
|
|
|
return utils.streamEachPromise(database.getTypes(padId), function(type) {
|
|
|
|
typesObj[type.id] = type;
|
|
|
|
}).then(() => typesObj);
|
2017-12-25 17:24:15 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
markers: (types) => {
|
|
|
|
const markers = [];
|
|
|
|
return utils.streamEachPromise(database.getPadMarkers(padId), (marker) => {
|
|
|
|
if(filterFunc(commonFilter.prepareObject(marker, types[marker.typeId]))) {
|
|
|
|
markers.push(marker);
|
|
|
|
}
|
|
|
|
}).then(() => (markers));
|
|
|
|
},
|
|
|
|
|
|
|
|
lines: (types) => {
|
|
|
|
const lines = [];
|
|
|
|
return utils.streamEachPromise(database.getPadLinesWithPoints(padId), (line) => {
|
|
|
|
if(filterFunc(commonFilter.prepareObject(line, types[line.typeId]))) {
|
|
|
|
lines.push(line);
|
|
|
|
}
|
|
|
|
}).then(() => (lines));
|
|
|
|
}
|
|
|
|
}).then(({padData, types, markers, lines}) => {
|
2017-05-26 15:36:51 +00:00
|
|
|
return padTemplate({
|
|
|
|
time: utils.isoDate(),
|
|
|
|
padData,
|
|
|
|
types,
|
|
|
|
markers,
|
|
|
|
lines,
|
|
|
|
dataToText: _dataToText,
|
|
|
|
useTracks
|
|
|
|
});
|
|
|
|
});
|
2016-09-28 12:10:08 +00:00
|
|
|
}
|
|
|
|
|
2017-05-26 14:06:09 +00:00
|
|
|
function exportLine(line, type, useTracks) {
|
|
|
|
return lineTemplate({
|
|
|
|
useTracks: (useTracks || line.mode == "track"),
|
|
|
|
time: utils.isoDate(),
|
|
|
|
desc: type && _dataToText(type.fields, line.data),
|
|
|
|
line
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-09-28 12:10:08 +00:00
|
|
|
module.exports = {
|
2017-05-26 14:06:09 +00:00
|
|
|
exportGpx : exportGpx,
|
|
|
|
exportLine: exportLine
|
2016-09-28 12:10:08 +00:00
|
|
|
};
|