BR.Gpx = {
format: function (geoJson, turnInstructionMode = 0, transportMode = 'bike') {
if (!geoJson?.features) return '';
const trkNameTransform = {
trk: function (trk, feature, coordsList) {
// name as first tag, by using assign and in this order
return Object.assign(
{
name: feature.properties.name,
},
trk
);
},
};
let gpxTransform = trkNameTransform;
if (turnInstructionMode > 0) {
const voiceHints = BR.voiceHints(geoJson, turnInstructionMode, transportMode);
gpxTransform = voiceHints.getGpxTransform();
}
let gpx = togpx(geoJson, {
featureTitle: function () {},
featureDescription: function () {},
transform: gpxTransform,
});
const statsComment = BR.Gpx._statsComment(geoJson);
gpx = '' + statsComment + gpx;
gpx = BR.Gpx.pretty(gpx);
return gpx;
},
//
_statsComment: function (geoJson) {
const props = geoJson.features?.[0].properties;
if (!props) return '';
let comment = '';
return comment;
},
// modified version of
// https://gist.github.com/sente/1083506#gistcomment-2254622
// MIT License, Copyright (c) 2016 Stuart Powers, ES6 version by Jonathan Gruber
pretty: function (xml, indentSize = 1) {
const PADDING = ' '.repeat(indentSize);
const newline = '\n';
// Remove all the newlines and then remove all the spaces between tags
xml = xml.replace(/\s*(\r\n|\n|\r)\s*/gm, ' ').replace(/>\s+<');
// break into lines
const reg = /(>)(<)(\/?)/g;
let pad = 0;
xml = xml.replace('', '');
xml = xml.replace(reg, `$1${newline}$2$3`);
let lines = xml.split(newline);
lines = lines.map((node, index) => {
let indent = 0;
if (node.match(/.+<\/\w[^>]*>$/)) {
indent = 0;
} else if (node.match(/^<\/\w/) && pad > 0) {
pad -= 1;
} else if (node.match(/^<\w[^>]*[^\/]>.*$/)) {
indent = 1;
} else {
indent = 0;
}
pad += indent;
return PADDING.repeat(pad - indent) + node;
});
for (const [i, line] of lines.entries()) {
// break gpx attributes into separate lines
if (line.includes('