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.
|
|
'use strict';
exports.type = 'perItem';
exports.active = false;
exports.description = 'rounds list of values to the fixed precision';
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|%)?$/, regSeparator = /\s+,?\s*|,\s*/, 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 list of values to the fixed precision. * * @example * <svg viewBox="0 0 200.28423 200.28423" enable-background="new 0 0 200.28423 200.28423"> * ⬇ * <svg viewBox="0 0 200.284 200.284" enable-background="new 0 0 200.284 200.284"> * * * <polygon points="208.250977 77.1308594 223.069336 ... "/> * ⬇ * <polygon points="208.251 77.131 223.069 ... "/> * * * @param {Object} item current iteration item * @param {Object} params plugin params * @return {Boolean} if false, item will be filtered out * * @author kiyopikko */ exports.fn = function(item, params) {
if ( item.hasAttr('points') ) { roundValues(item.attrs.points); }
if ( item.hasAttr('enable-background') ) { roundValues(item.attrs['enable-background']); }
if ( item.hasAttr('viewBox') ) { roundValues(item.attrs.viewBox); }
if ( item.hasAttr('stroke-dasharray') ) { roundValues(item.attrs['stroke-dasharray']); }
if ( item.hasAttr('dx') ) { roundValues(item.attrs.dx); }
if ( item.hasAttr('dy') ) { roundValues(item.attrs.dy); }
if ( item.hasAttr('x') ) { roundValues(item.attrs.x); }
if ( item.hasAttr('y') ) { roundValues(item.attrs.y); }
function roundValues($prop){
var num, units, match, matchNew, lists = $prop.value, listsArr = lists.split(regSeparator), roundedListArr = [], roundedList;
listsArr.forEach(function(elem){
match = elem.match(regNumericValues); matchNew = elem.match(/new/);
// if attribute value matches regNumericValues
if (match) { // round it to the fixed precision
num = +(+match[1]).toFixed(params.floatPrecision), units = match[3] || '';
// convert absolute values to pixels
if (params.convertToPx && units && (units in absoluteLengths)) { var pxNum = +(absoluteLengths[units] * match[1]).toFixed(params.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 = ''; }
roundedListArr.push(num+units); } // if attribute value is "new"(only enable-background).
else if (matchNew) { roundedListArr.push('new'); } else if (elem) { roundedListArr.push(elem); }
});
roundedList = roundedListArr.join(' '); $prop.value = roundedList;
}
};
|