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.
		
		
		
		
		
			
		
			
				
					
					
						
							139 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							139 lines
						
					
					
						
							3.5 KiB
						
					
					
				'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; | 
						|
 | 
						|
    } | 
						|
 | 
						|
};
 | 
						|
 |