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