-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
executable file
·86 lines (76 loc) · 2.51 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
const fs = require('fs');
const xml2js = require('xml2js');
const util = require('util');
function getLaps(obj) {
return (
obj &&
obj.TrainingCenterDatabase &&
obj.TrainingCenterDatabase.Activities &&
obj.TrainingCenterDatabase.Activities.length &&
obj.TrainingCenterDatabase.Activities[0] &&
obj.TrainingCenterDatabase.Activities[0].Activity &&
obj.TrainingCenterDatabase.Activities[0].Activity.length &&
obj.TrainingCenterDatabase.Activities[0].Activity[0] &&
obj.TrainingCenterDatabase.Activities[0].Activity[0].Lap
) || [];
}
function parseFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
xml2js.parseString(data, (err, result) => {
const filename = path.split('/').pop();
console.log('Successfully parsed `' + filename + '`');
resolve(result);
});
});
});
}
// Normalize args
const args = process.argv.slice(2);
const activity1 = args[0];
const activity2 = args[1];
const outputFile = args[2];
let obj1, obj2;
const p = new Promise((resolve, reject) => {
parseFile(activity1)
.then((value) => obj1 = value)
.then(() => {
parseFile(activity2).then((value) => {
obj2 = value;
resolve();
});
});
})
.then(() => {
// Get the total distance from the first activity
// by summing the lap distances.
const laps1 = getLaps(obj1);
const distance1 = laps1.reduce((totalDistance, currLap) => (
totalDistance + +currLap.DistanceMeters[0]
), 0);
// Get all laps from the second activity
const laps2 = getLaps(obj2);
// Loop through each trackpoint in the second activity and add the
// total distance from the first activity.
const adjusted = laps2.map((lap) => {
let trackpoints = lap.Track[0].Trackpoint;
trackpoints = trackpoints.map((trackpoint) => {
if (trackpoint.DistanceMeters && trackpoint.DistanceMeters[0]) {
const adjustedDistance = +trackpoint.DistanceMeters[0] + distance1;
trackpoint.DistanceMeters[0] = adjustedDistance + '';
}
return trackpoint;
});
lap.Track[0].Trackpoint = trackpoints;
return lap;
});
// Append laps from second activity to first activity
obj1.TrainingCenterDatabase.Activities[0].Activity[0].Lap = laps1.concat(adjusted);
// Convert JS object back to XML and save to file.
const builder = new xml2js.Builder();
const xml = builder.buildObject(obj1);
console.log('Writing merged file...');
fs.writeFile(outputFile, xml, (err) => {
console.log('Done.');
});
});