88 lines
2.5 KiB
JavaScript
88 lines
2.5 KiB
JavaScript
'use strict';
|
||
|
||
exports.type = 'perItem';
|
||
|
||
exports.active = true;
|
||
|
||
exports.description = 'rounds numeric values to the fixed precision, removes default ‘px’ units';
|
||
|
||
exports.params = {
|
||
floatPrecision: 3,
|
||
leadingZero: true,
|
||
defaultPx: true,
|
||
convertToPx: true
|
||
};
|
||
|
||
var regNumericValues = /^([\-+]?\d*\.?\d+([eE][\-+]?\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/,
|
||
removeLeadingZero = require('../lib/svgo/tools').removeLeadingZero,
|
||
absoluteLengths = { // relative to px
|
||
cm: 96/2.54,
|
||
mm: 96/25.4,
|
||
in: 96,
|
||
pt: 4/3,
|
||
pc: 16
|
||
};
|
||
|
||
/**
|
||
* Round numeric values to the fixed precision,
|
||
* remove default 'px' units.
|
||
*
|
||
* @param {Object} item current iteration item
|
||
* @param {Object} params plugin params
|
||
* @return {Boolean} if false, item will be filtered out
|
||
*
|
||
* @author Kir Belevich
|
||
*/
|
||
exports.fn = function(item, params) {
|
||
|
||
if (item.isElem()) {
|
||
|
||
var floatPrecision = params.floatPrecision;
|
||
|
||
if (item.hasAttr('viewBox')) {
|
||
var nums = item.attr('viewBox').value.split(/\s,?\s*|,\s*/g);
|
||
item.attr('viewBox').value = nums.map(function(value) {
|
||
var num = +value;
|
||
return isNaN(num) ? value : +num.toFixed(floatPrecision);
|
||
}).join(' ');
|
||
}
|
||
|
||
item.eachAttr(function(attr) {
|
||
// The `version` attribute is a text string and cannot be rounded
|
||
if (attr.name === 'version') { return }
|
||
|
||
var match = attr.value.match(regNumericValues);
|
||
|
||
// if attribute value matches regNumericValues
|
||
if (match) {
|
||
// round it to the fixed precision
|
||
var num = +(+match[1]).toFixed(floatPrecision),
|
||
units = match[3] || '';
|
||
|
||
// convert absolute values to pixels
|
||
if (params.convertToPx && units && (units in absoluteLengths)) {
|
||
var pxNum = +(absoluteLengths[units] * match[1]).toFixed(floatPrecision);
|
||
|
||
if (String(pxNum).length < match[0].length) {
|
||
num = pxNum;
|
||
units = 'px';
|
||
}
|
||
}
|
||
|
||
// and remove leading zero
|
||
if (params.leadingZero) {
|
||
num = removeLeadingZero(num);
|
||
}
|
||
|
||
// remove default 'px' units
|
||
if (params.defaultPx && units === 'px') {
|
||
units = '';
|
||
}
|
||
|
||
attr.value = num + units;
|
||
}
|
||
});
|
||
|
||
}
|
||
|
||
};
|