From 385d6534d2de5c6337aa3e619d22e21218fd0ce2 Mon Sep 17 00:00:00 2001 From: Kiyohiko Heima Date: Sun, 7 Dec 2014 19:31:43 +0900 Subject: [PATCH] add cleanupListOfValues --- .svgo.yml | 1 + plugins/cleanupListOfValues.js | 122 +++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 plugins/cleanupListOfValues.js diff --git a/.svgo.yml b/.svgo.yml index c497291e..4a13b153 100644 --- a/.svgo.yml +++ b/.svgo.yml @@ -23,6 +23,7 @@ plugins: - convertStyleToAttrs - removeRasterImages - cleanupNumericValues + - cleanupListOfValues - convertColors - removeUnknownsAndDefaults - removeNonInheritableGroupAttrs diff --git a/plugins/cleanupListOfValues.js b/plugins/cleanupListOfValues.js new file mode 100644 index 00000000..f6478241 --- /dev/null +++ b/plugins/cleanupListOfValues.js @@ -0,0 +1,122 @@ +'use strict'; + +exports.type = 'perItem'; + +exports.active = false; + +exports.params = { + floatPrecision: 3, + leadingZero: true, + defaultPx: 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; + +/** + * Round list of values to the fixed precision. + * + * @example + * + * ⬇ + * + * + * + * + * ⬇ + * + * + * + * @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 = new Array(), + 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] || ''; + + // and remove leading zero + if (params.leadingZero) { + num = removeLeadingZero(num); + } + + // remove default 'px' units + if (params.defaultPx && units === 'px') { + units = ''; + } + + roundedListArr.push(num); + + } + // if attribute value is "new"(only enable-background). + else if(matchNew){ + + roundedListArr.push("new"); + + } + + }); + + roundedList = roundedListArr.join(" "); + $prop.value = roundedList; + + } + +};