-
Notifications
You must be signed in to change notification settings - Fork 2
/
cleanupListOfValues.js
133 lines (109 loc) · 3.16 KB
/
cleanupListOfValues.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { removeLeadingZero } from '../lib/svgo/tools'
const name = 'cleanupListOfValues'
const type = 'perItem'
const active = false
const description = 'rounds list of values to the fixed precision'
const params = {
floatPrecision: 3,
leadingZero: true,
defaultPx: true,
convertToPx: true
}
const regNumericValues = /^([-+]?\d*\.?\d+([eE][-+]?\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/
const regSeparator = /\s+,?\s*|,\s*/
const 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
*/
const 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) {
let num
let units
let match
let matchNew
const lists = $prop.value
const listsArr = lists.split(regSeparator)
const roundedListArr = []
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)) {
const 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)
} else if (matchNew) { // if attribute value is "new"(only enable-background).
roundedListArr.push('new')
} else if (elem) {
roundedListArr.push(elem)
}
})
const roundedList = roundedListArr.join(' ')
$prop.value = roundedList
}
}
export { name, type, active, description, params, fn }