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 };