mirror of
https://github.com/Sevichecc/Urara-Blog.git
synced 2025-05-03 19:29:30 +08:00
85 lines
1.9 KiB
Text
85 lines
1.9 KiB
Text
'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;
|
|
};
|