You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.9 KiB
88 lines
1.9 KiB
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 |
|
};
|
|
|