12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- '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;
- }
- });
- }
- };
|