svg-path-simplify 0.3.6 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +38 -85
- package/dist/svg-path-simplify.esm.js +1405 -528
- package/dist/svg-path-simplify.esm.min.js +2 -2
- package/dist/svg-path-simplify.js +1405 -528
- package/dist/svg-path-simplify.min.js +2 -2
- package/dist/svg-path-simplify.pathdata.esm.js +76 -15
- package/dist/svg-path-simplify.pathdata.esm.min.js +2 -2
- package/docs/api.md +127 -0
- package/index.html +216 -277
- package/package.json +1 -1
- package/src/constants.js +8 -1
- package/src/pathData_simplify_cubic.js +0 -8
- package/src/pathSimplify-main.js +25 -9
- package/src/svg_flatten_transforms.js +1 -1
- package/src/svgii/convert_colors.js +52 -5
- package/src/svgii/convert_units.js +25 -10
- package/src/svgii/pathData_analyze.js +33 -13
- package/src/svgii/pathData_convert.js +62 -6
- package/src/svgii/pathData_parse_els.js +21 -5
- package/src/svgii/pathData_toPolygon.js +3 -1
- package/src/svgii/pathData_transform.js +307 -0
- package/src/svgii/svg-styles-getTransforms.js +119 -8
- package/src/svgii/svg-styles-to-attributes-const.js +19 -4
- package/src/svgii/svg_cleanup.js +319 -97
- package/src/svgii/svg_el_parse_style_props.js +218 -76
- package/src/svgii/transform_qr_decompose.js +74 -0
- package/src/svgii/pathData_scale.js +0 -42
- package/src/svgii/svg-styles-to-attributes.js +0 -236
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { getMatrix, parseCSSTransform, parseTransform } from './svg-styles-getTransforms';
|
|
2
|
-
import { attLookup } from './svg-styles-to-attributes-const';
|
|
3
|
-
|
|
4
|
-
/*
|
|
5
|
-
export function parseStyleProperty(propName='', value=''){
|
|
6
|
-
|
|
7
|
-
let propObj = {}
|
|
8
|
-
//console.log(propName, value);
|
|
9
|
-
|
|
10
|
-
// check for numbers or units
|
|
11
|
-
if(propName==='transform'){
|
|
12
|
-
|
|
13
|
-
//let trans = parseCSSTransform()
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
else if(propName==='d'){
|
|
17
|
-
propObj = {name:propName, value}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return propObj
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export function getElementProps(el, {
|
|
27
|
-
removeNameSpaced = true,
|
|
28
|
-
decimals = -1
|
|
29
|
-
} = {}) {
|
|
30
|
-
|
|
31
|
-
let nodeName = el.nodeName.toLowerCase();
|
|
32
|
-
let attProps = getElAttributes(el)
|
|
33
|
-
let cssProps = getElStyleProps(el)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// normalize transform attributes
|
|
37
|
-
if (attProps['transform']) {
|
|
38
|
-
|
|
39
|
-
let transAtt = attProps['transform']
|
|
40
|
-
let transArr = transAtt.match(/[a-z]+\([^)]*\)/gi);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
//console.log(`attProps['transform']`, transAtt);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
let transforms = [];
|
|
47
|
-
transArr.forEach(trans => {
|
|
48
|
-
let [prop, vals] = trans.split(/\(|\)/).filter(Boolean)
|
|
49
|
-
//let prop = vals[0];
|
|
50
|
-
vals = vals.split(/,| /).filter(Boolean).map(Number)
|
|
51
|
-
console.log('trans', prop, vals);
|
|
52
|
-
|
|
53
|
-
let cssTrans = '';
|
|
54
|
-
|
|
55
|
-
// rotate has origin
|
|
56
|
-
if (prop === 'rotate' && vals.length === 3) {
|
|
57
|
-
|
|
58
|
-
cssTrans = `
|
|
59
|
-
translate(${vals[1]}px, ${vals[2]}px)
|
|
60
|
-
rotate(${vals[0]}deg)
|
|
61
|
-
translate(${-vals[1]}px, ${-vals[2]}px)
|
|
62
|
-
`
|
|
63
|
-
/*
|
|
64
|
-
transforms.push({ prop: 'translate', values: [vals[1], vals[2]] })
|
|
65
|
-
transforms.push({ prop: 'rotate', values: [vals[0]] })
|
|
66
|
-
transforms.push({ prop: 'translate', values: [-vals[1], -vals[2]] })
|
|
67
|
-
*/
|
|
68
|
-
} else {
|
|
69
|
-
cssTrans = `
|
|
70
|
-
${prop}(${vals[1]}px, ${vals[2]}px)
|
|
71
|
-
rotate(${vals[0]}deg)
|
|
72
|
-
translate(${-vals[1]}px, ${-vals[2]}px)
|
|
73
|
-
`
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
//transforms.push({ prop, values: [vals[0]] })
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
console.log('transforms', transforms);
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// merge properties
|
|
88
|
-
let props = {
|
|
89
|
-
...attProps,
|
|
90
|
-
...cssProps
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
export function svgStylesToAttributes(el, {
|
|
98
|
-
removeNameSpaced = true,
|
|
99
|
-
decimals = -1
|
|
100
|
-
} = {}) {
|
|
101
|
-
|
|
102
|
-
let nodeName = el.nodeName.toLowerCase();
|
|
103
|
-
let attProps = getElAttributes(el)
|
|
104
|
-
let cssProps = getElStyleProps(el)
|
|
105
|
-
|
|
106
|
-
// normalize transform attributes
|
|
107
|
-
/*
|
|
108
|
-
if (attProps['transform']) {
|
|
109
|
-
console.log(`attProps['transform']`, attProps['transform']);
|
|
110
|
-
}
|
|
111
|
-
*/
|
|
112
|
-
|
|
113
|
-
// merge properties
|
|
114
|
-
let props = {
|
|
115
|
-
...attProps,
|
|
116
|
-
...cssProps
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// filter out obsolete properties
|
|
120
|
-
let propsFiltered = {}
|
|
121
|
-
|
|
122
|
-
// parse CSS transforms
|
|
123
|
-
let cssTrans = cssProps['transform']
|
|
124
|
-
|
|
125
|
-
if (cssTrans) {
|
|
126
|
-
let transStr = `${cssTrans}`
|
|
127
|
-
let transformObj = parseCSSTransform(transStr)
|
|
128
|
-
let matrix = getMatrix(transformObj)
|
|
129
|
-
|
|
130
|
-
// apply as SVG matrix transform
|
|
131
|
-
props['transform'] = `matrix(${Object.values(matrix).join(',')})`
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// can't be replaced with attributes
|
|
136
|
-
let cssOnlyProps = ['inline-size']
|
|
137
|
-
let styleProps = [];
|
|
138
|
-
|
|
139
|
-
for (let prop in props) {
|
|
140
|
-
|
|
141
|
-
let value = props[prop];
|
|
142
|
-
|
|
143
|
-
// CSS variable
|
|
144
|
-
if (value && prop.startsWith('--') || cssOnlyProps.includes(prop) ||
|
|
145
|
-
(!removeNameSpaced && prop.startsWith('-'))) {
|
|
146
|
-
styleProps.push(`${prop}:${value}`)
|
|
147
|
-
continue
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// check if property is valid
|
|
151
|
-
if (value && attLookup.atts[prop] &&
|
|
152
|
-
(attLookup.atts[prop] === '*' ||
|
|
153
|
-
attLookup.atts[prop].includes(nodeName) ||
|
|
154
|
-
!removeNameSpaced && (prop.includes(':'))
|
|
155
|
-
)
|
|
156
|
-
) {
|
|
157
|
-
propsFiltered[prop] = value
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// remove property
|
|
161
|
-
el.removeAttribute(prop)
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// apply filtered attributes
|
|
166
|
-
for (let prop in propsFiltered) {
|
|
167
|
-
let value = propsFiltered[prop]
|
|
168
|
-
el.setAttribute(prop, value)
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (styleProps.length) {
|
|
172
|
-
el.setAttribute('style', styleProps.join(';'));
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
//console.log('propsFiltered', propsFiltered);
|
|
176
|
-
|
|
177
|
-
return propsFiltered;
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
function parseInlineStyle(styleAtt = '') {
|
|
183
|
-
|
|
184
|
-
let props = {}
|
|
185
|
-
if (!styleAtt) return props;
|
|
186
|
-
|
|
187
|
-
let styleArr = styleAtt.split(';').filter(Boolean).map(prop => prop.trim());
|
|
188
|
-
let l = styleArr.length
|
|
189
|
-
if (!l) return props;
|
|
190
|
-
|
|
191
|
-
for (let i = 0; l && i < l; i++) {
|
|
192
|
-
let style = styleArr[i]
|
|
193
|
-
let [prop, value] = style.split(':').filter(Boolean)
|
|
194
|
-
props[prop] = value;
|
|
195
|
-
//props.push(`${prop}:${value}`)
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return props
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export function getElStyleProps(el) {
|
|
202
|
-
let styleAtt = el.getAttribute('style')
|
|
203
|
-
let props = styleAtt ? parseInlineStyle(styleAtt) : {}
|
|
204
|
-
return props
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export function getElAttributes(el) {
|
|
208
|
-
let props = {}
|
|
209
|
-
let atts = [...el.attributes].map((att) => att.name);
|
|
210
|
-
let l = atts.length;
|
|
211
|
-
if (!l) return props;
|
|
212
|
-
|
|
213
|
-
for (let i = 0; i < l; i++) {
|
|
214
|
-
let att = atts[i];
|
|
215
|
-
let value = el.getAttribute(att);
|
|
216
|
-
props[att] = value
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return props;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
/*
|
|
224
|
-
function roundValue(value = '', decimals = -1) {
|
|
225
|
-
if (decimals < 0) return value;
|
|
226
|
-
value = value.replace(/["]/g, '').trim()
|
|
227
|
-
let valueNum = parseFloat(value);
|
|
228
|
-
let valueHasNumber = !isNaN(valueNum);
|
|
229
|
-
if (!valueHasNumber) return value;
|
|
230
|
-
|
|
231
|
-
let unit = valueHasNumber ? getUnit(value) : '';
|
|
232
|
-
if (valueHasNumber) value = `${valueNum.toFixed(decimals)}${unit}`;
|
|
233
|
-
//console.log('rounded', value)
|
|
234
|
-
return value;
|
|
235
|
-
}
|
|
236
|
-
*/
|