| var override = require('../utils/override'); |
|
|
| var INTEGER_PATTERN = /^\d+$/; |
|
|
| var ALL_UNITS = ['*', 'all']; |
| var DEFAULT_PRECISION = 'off'; |
| var DIRECTIVES_SEPARATOR = ','; |
| var DIRECTIVE_VALUE_SEPARATOR = '='; |
|
|
| 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 |
| }; |
|
|