diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/svgo/plugins/cleanupListOfValues.js | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/svgo/plugins/cleanupListOfValues.js')
| -rw-r--r-- | node_modules/svgo/plugins/cleanupListOfValues.js | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/node_modules/svgo/plugins/cleanupListOfValues.js b/node_modules/svgo/plugins/cleanupListOfValues.js new file mode 100644 index 00000000..e75944da --- /dev/null +++ b/node_modules/svgo/plugins/cleanupListOfValues.js @@ -0,0 +1,141 @@ +'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'); + + } + + }); + + roundedList = roundedListArr.join(' '); + $prop.value = roundedList; + + } + +}; |
