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 } } return this } 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) } convert (unit) { return new SVGNumber(this.value, unit) } }