| 'use strict'; |
| const lengthConv = new Map([ |
| ['in', 96], |
| ['px', 1], |
| ['pt', 4 / 3], |
| ['pc', 16], |
| ]); |
| |
| const timeConv = new Map([ |
| ['s', 1000], |
| ['ms', 1], |
| ]); |
| |
| const angleConv = new Map([ |
| ['turn', 360], |
| ['deg', 1], |
| ]); |
| /** |
| * @param {number} number |
| * @return {string} |
| */ |
| function dropLeadingZero(number) { |
| const value = String(number); |
| |
| if (number % 1) { |
| if (value[0] === '0') { |
| return value.slice(1); |
| } |
| |
| if (value[0] === '-' && value[1] === '0') { |
| return '-' + value.slice(2); |
| } |
| } |
| |
| return value; |
| } |
| /** |
| * @param {number} number |
| * @param {string} originalUnit |
| * @param {lengthConv | timeConv | angleConv} conversions |
| * @return {string} |
| */ |
| function transform(number, originalUnit, conversions) { |
| let conversionUnits = [...conversions.keys()].filter((u) => { |
| return originalUnit !== u; |
| }); |
| |
| const base = number * /** @type {number} */ (conversions.get(originalUnit)); |
| |
| return conversionUnits |
| .map( |
| (u) => |
| dropLeadingZero(base / /** @type {number} */ (conversions.get(u))) + u |
| ) |
| .reduce((a, b) => (a.length < b.length ? a : b)); |
| } |
| |
| /** |
| * @param {number} number |
| * @param {string} unit |
| * @param {{time?: boolean, length?: boolean, angle?: boolean}} options |
| * @return {string} |
| */ |
| module.exports = function (number, unit, { time, length, angle }) { |
| let value = dropLeadingZero(number) + (unit ? unit : ''); |
| let converted; |
| const lowerCaseUnit = unit.toLowerCase(); |
| if (length !== false && lengthConv.has(lowerCaseUnit)) { |
| converted = transform(number, lowerCaseUnit, lengthConv); |
| } |
| |
| if (time !== false && timeConv.has(lowerCaseUnit)) { |
| converted = transform(number, lowerCaseUnit, timeConv); |
| } |
| |
| if (angle !== false && angleConv.has(lowerCaseUnit)) { |
| converted = transform(number, lowerCaseUnit, angleConv); |
| } |
| |
| if (converted && converted.length < value.length) { |
| value = converted; |
| } |
| |
| return value; |
| }; |