From 6bbdea1908e71a0e04fe6bcba9076a8a6b461d92 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 21 Mar 2021 15:04:18 +0200 Subject: [PATCH] Generate tags in ZWO - When range-interval at start: generate - When range-interval at end: generate - Otherwise use --- README.md | 1 - examples/ramps.txt | 14 +++++++++ src/generateZwo.ts | 14 ++++++--- test/__snapshots__/cli.test.ts.snap | 46 +++++++++++++++++++++++++++++ test/cli.test.ts | 1 + 5 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 examples/ramps.txt diff --git a/README.md b/README.md index dd48924..108cc35 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,6 @@ console.log(stats(workout)); - More restricted syntax for text (with quotes) - Concatenate similar intervals - Distinguish between terrain-sensitive and insensitive free-ride. -- Use `` in addition to `` and `` [zwift]: https://zwift.com/ [zwofactory]: https://zwofactory.com/ diff --git a/examples/ramps.txt b/examples/ramps.txt new file mode 100644 index 0000000..0ab8c82 --- /dev/null +++ b/examples/ramps.txt @@ -0,0 +1,14 @@ +Name: Ramps +Author: R.Saarsoo +Description: + Various kinds of ramp intervals. + +Ramp: 5:00 40%..75% + +Ramp: 10:00 80%..90% +Ramp: 10:00 90%..80% + +Warmup: 10:00 80%..90% +Cooldown: 10:00 90%..80% + +Ramp: 5:00 75%..40% diff --git a/src/generateZwo.ts b/src/generateZwo.ts index cbdb357..3864505 100644 --- a/src/generateZwo.ts +++ b/src/generateZwo.ts @@ -11,7 +11,7 @@ const generateTextEvents = (comments: Comment[]): xml.XmlObject[] => { }; const generateRangeInterval = ( - tagName: "Warmup" | "Cooldown", + tagName: "Warmup" | "Cooldown" | "Ramp", { duration, intensity, cadence, comments }: Interval, ): xml.XmlObject => { return { @@ -79,16 +79,22 @@ const generateRepeatInterval = (repInterval: RepeatedInterval): xml.XmlObject => }; }; -const generateInterval = (interval: Interval | RepeatedInterval): xml.XmlObject => { +const generateInterval = ( + interval: Interval | RepeatedInterval, + index: number, + allIntervals: (Interval | RepeatedInterval)[], +): xml.XmlObject => { if (interval.type === "repeat") { return generateRepeatInterval(interval); } const { intensity } = interval; - if (intensity.start < intensity.end) { + if (index === 0 && intensity.start < intensity.end) { return generateRangeInterval("Warmup", interval); - } else if (intensity.start > intensity.end) { + } else if (index === allIntervals.length - 1 && intensity.start > intensity.end) { return generateRangeInterval("Cooldown", interval); + } else if (intensity.start !== intensity.end) { + return generateRangeInterval("Ramp", interval); } else if (intensity.zone === "free") { return generateFreeRideInterval(interval); } else { diff --git a/test/__snapshots__/cli.test.ts.snap b/test/__snapshots__/cli.test.ts.snap index d0093c5..ebe627d 100644 --- a/test/__snapshots__/cli.test.ts.snap +++ b/test/__snapshots__/cli.test.ts.snap @@ -226,6 +226,31 @@ The workouts are alphabetically ordered from easiest to hardest, so enjoy the mi " `; +exports[`Generate ZWO examples/ramps.txt 1`] = ` +" + Ramps + R.Saarsoo + Various kinds of ramp intervals. + + + bike + + + + + + + + + + + + + + +" +`; + exports[`Generate ZWO examples/threshold-pushing.txt 1`] = ` " Threshold pushing @@ -338,6 +363,27 @@ Zone Distribution: " `; +exports[`Generate stats examples/ramps.txt 1`] = ` +" +Total duration: 50 minutes + +Average intensity: 80% +Normalized intensity: 82% + +TSS: 56 +XP: 300 + +Zone Distribution: + 6 min - Z1: Recovery + 4 min - Z2: Endurance + 40 min - Z3: Tempo + 0 min - Z4: Threshold + 0 min - Z5: VO2 Max + 0 min - Z6: Anaerobic + 0 min - Freeride +" +`; + exports[`Generate stats examples/threshold-pushing.txt 1`] = ` " Total duration: 79 minutes diff --git a/test/cli.test.ts b/test/cli.test.ts index 1f84125..03abdfc 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -12,6 +12,7 @@ const filenames = [ "examples/ftp-test.txt", "examples/halvfems.txt", "examples/threshold-pushing.txt", + "examples/ramps.txt", ]; describe("Generate ZWO", () => {