UNPKG

gpx-builder

Version:
74 lines (70 loc) 1.78 kB
'use strict'; var xmlbuilder2 = require('xmlbuilder2'); /* eslint-disable @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-explicit-any */ class XMLCreator { constructor(settings = {}) { this.settings = settings; } processXmlItem(dir, key, value) { if (key === 'attributes') { Object.keys(value).forEach(attribute => { dir.att(attribute, value[attribute]); }); return; } if (key === 'email') { const email = value.split('@'); dir.ele(key, { domain: email[1], id: email[0] }); return; } if (value instanceof Date) { dir.ele(key).txt(value.toISOString()); return; } if (Array.isArray(value) && typeof value[0] === 'object') { value.forEach(item => { this.generateXmlData(dir.ele(key), item); }); return; } if (Array.isArray(value)) { dir.ele(key).txt(value.join(',')); return; } if (typeof value === 'object') { this.generateXmlData(dir.ele(key), value); return; } dir.ele(key).txt(value); } generateXmlData(dir, object) { Object.keys(object).map(key => { return { key, value: object[key] }; }).forEach(({ key, value }) => { this.processXmlItem(dir, key, value); }); } toString(data) { const root = xmlbuilder2.create({ encoding: 'UTF-8' }, 'gpx'); this.generateXmlData(root.first(), data); return root.end({ allowEmptyTags: true, indent: ' ', newline: '\n', prettyPrint: true, ...this.settings }); } } module.exports = XMLCreator;