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