From a0b13ebcacfd74b9f521110c7225bb404325bcd3 Mon Sep 17 00:00:00 2001 From: Ulrich-Matthias Schäfer Date: Tue, 6 Nov 2018 13:48:05 +0100 Subject: reordered modules, add es6 build --- src/types/SVGNumber.js | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/types/SVGNumber.js (limited to 'src/types/SVGNumber.js') diff --git a/src/types/SVGNumber.js b/src/types/SVGNumber.js new file mode 100644 index 0000000..bba9741 --- /dev/null +++ b/src/types/SVGNumber.js @@ -0,0 +1,87 @@ +import { numberAndUnit } from '../modules/core/regex.js' + +// Module for unit convertions +export default class SVGNumber { + // Initialize + constructor (...args) { + this.init(...args) + } + + init (value, unit) { + unit = Array.isArray(value) ? value[1] : unit + value = Array.isArray(value) ? value[0] : value + + // initialize defaults + this.value = 0 + this.unit = unit || '' + + // parse value + if (typeof value === 'number') { + // ensure a valid numeric value + this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value + } else if (typeof value === 'string') { + unit = value.match(numberAndUnit) + + if (unit) { + // make value numeric + this.value = parseFloat(unit[1]) + + // normalize + if (unit[5] === '%') { this.value /= 100 } else if (unit[5] === 's') { + this.value *= 1000 + } + + // store unit + this.unit = unit[5] + } + } else { + if (value instanceof SVGNumber) { + this.value = value.valueOf() + this.unit = value.unit + } + } + } + + toString () { + return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6 + : this.unit === 's' ? this.value / 1e3 + : this.value + ) + this.unit + } + + toJSON () { + return this.toString() + } + + toArray () { + return [this.value, this.unit] + } + + valueOf () { + return this.value + } + + // Add number + plus (number) { + number = new SVGNumber(number) + return new SVGNumber(this + number, this.unit || number.unit) + } + + // Subtract number + minus (number) { + number = new SVGNumber(number) + return new SVGNumber(this - number, this.unit || number.unit) + } + + // Multiply number + times (number) { + number = new SVGNumber(number) + return new SVGNumber(this * number, this.unit || number.unit) + } + + // Divide number + divide (number) { + number = new SVGNumber(number) + return new SVGNumber(this / number, this.unit || number.unit) + } +} -- cgit v1.2.3