@dcloudio/uni-cli-shared
Version:
uni-cli-shared
61 lines (51 loc) • 1.36 kB
JavaScript
const unitRE = new RegExp('"[^"]+"|\'[^\']+\'|url\\([^)]+\\)|(\\d*\\.?\\d+)[r|u]px', 'g')
function toFixed (number, precision) {
const multiplier = Math.pow(10, precision + 1)
const wholeNumber = Math.floor(number * multiplier)
return (Math.round(wholeNumber / 10) * 10) / multiplier
}
const defaultRpx2Unit = {
unit: 'rem',
unitRatio: 10 / 320,
unitPrecision: 5
}
const Rpx2Unit = Object.assign({}, defaultRpx2Unit)
function setRpx2Unit (config) {
return Object.assign(config, defaultRpx2Unit)
}
function getRpx2Unit () {
return Rpx2Unit
}
function _rpx2Unit (rpx, unit, unitRatio, unitPrecision) {
if (unitRatio === 1) {
return `${rpx}${unit}`
}
const value = toFixed(rpx * unitRatio, unitPrecision)
return value === 0 ? '0' : `${value}${unit}`
}
function createRpx2Unit (unit, unitRatio, unitPrecision) {
// ignore: rpxCalcIncludeWidth
/**
* @param {string | number} val
* @returns {string}
*/
return (val) => {
if (unitRE.test(val)) {
return val.replace(unitRE, (m, $1) => {
if (!$1) {
return m
}
return _rpx2Unit(parseFloat($1), unit, unitRatio, unitPrecision)
})
} else {
return _rpx2Unit(parseFloat(val), unit, unitRatio, unitPrecision)
}
}
}
module.exports = {
unitRE,
defaultRpx2Unit,
setRpx2Unit,
getRpx2Unit,
createRpx2Unit
}