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