89 lines
1.9 KiB
JavaScript
89 lines
1.9 KiB
JavaScript
var override = require('../utils/override');
|
|
|
|
var INTEGER_PATTERN = /^\d+$/;
|
|
|
|
var ALL_UNITS = ['*', 'all'];
|
|
var DEFAULT_PRECISION = 'off'; // all precision changes are disabled
|
|
var DIRECTIVES_SEPARATOR = ','; // e.g. *=5,px=3
|
|
var DIRECTIVE_VALUE_SEPARATOR = '='; // e.g. *=5
|
|
|
|
function roundingPrecisionFrom(source) {
|
|
return override(defaults(DEFAULT_PRECISION), buildPrecisionFrom(source));
|
|
}
|
|
|
|
function defaults(value) {
|
|
return {
|
|
ch: value,
|
|
cm: value,
|
|
em: value,
|
|
ex: value,
|
|
in: value,
|
|
mm: value,
|
|
pc: value,
|
|
pt: value,
|
|
px: value,
|
|
q: value,
|
|
rem: value,
|
|
vh: value,
|
|
vmax: value,
|
|
vmin: value,
|
|
vw: value,
|
|
'%': value
|
|
};
|
|
}
|
|
|
|
function buildPrecisionFrom(source) {
|
|
if (source === null || source === undefined) {
|
|
return {};
|
|
}
|
|
|
|
if (typeof source == 'boolean') {
|
|
return {};
|
|
}
|
|
|
|
if (typeof source == 'number' && source == -1) {
|
|
return defaults(DEFAULT_PRECISION);
|
|
}
|
|
|
|
if (typeof source == 'number') {
|
|
return defaults(source);
|
|
}
|
|
|
|
if (typeof source == 'string' && INTEGER_PATTERN.test(source)) {
|
|
return defaults(parseInt(source));
|
|
}
|
|
|
|
if (typeof source == 'string' && source == DEFAULT_PRECISION) {
|
|
return defaults(DEFAULT_PRECISION);
|
|
}
|
|
|
|
if (typeof source == 'object') {
|
|
return source;
|
|
}
|
|
|
|
return source
|
|
.split(DIRECTIVES_SEPARATOR)
|
|
.reduce(function(accumulator, directive) {
|
|
var directiveParts = directive.split(DIRECTIVE_VALUE_SEPARATOR);
|
|
var name = directiveParts[0];
|
|
var value = parseInt(directiveParts[1]);
|
|
|
|
if (Number.isNaN(value) || value == -1) {
|
|
value = DEFAULT_PRECISION;
|
|
}
|
|
|
|
if (ALL_UNITS.indexOf(name) > -1) {
|
|
accumulator = override(accumulator, defaults(value));
|
|
} else {
|
|
accumulator[name] = value;
|
|
}
|
|
|
|
return accumulator;
|
|
}, {});
|
|
}
|
|
|
|
module.exports = {
|
|
DEFAULT: DEFAULT_PRECISION,
|
|
roundingPrecisionFrom: roundingPrecisionFrom
|
|
};
|