diff options
Diffstat (limited to 'node_modules/postcss-convert-values/src/lib/convert.js')
| -rw-r--r-- | node_modules/postcss-convert-values/src/lib/convert.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/node_modules/postcss-convert-values/src/lib/convert.js b/node_modules/postcss-convert-values/src/lib/convert.js new file mode 100644 index 00000000..aa6555cf --- /dev/null +++ b/node_modules/postcss-convert-values/src/lib/convert.js @@ -0,0 +1,85 @@ +'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; +}; |
