@jscad/svg-deserializer 2.5.9 → 2.5.11
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 +16 -0
- package/LICENSE +1 -1
- package/package.json +4 -3
- package/src/index.js +4 -2
- package/src/shapesMapGeometry.js +17 -17
- package/src/shapesMapJscad.js +8 -8
- package/tests/issue.1135.test.js +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [2.5.11](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/svg-deserializer@2.5.10...@jscad/svg-deserializer@2.5.11) (2024-12-29)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @jscad/svg-deserializer
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [2.5.10](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/svg-deserializer@2.5.9...@jscad/svg-deserializer@2.5.10) (2024-11-10)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @jscad/svg-deserializer
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
6
22
|
## [2.5.9](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/svg-deserializer@2.5.8...@jscad/svg-deserializer@2.5.9) (2024-10-06)
|
|
7
23
|
|
|
8
24
|
**Note:** Version bump only for package @jscad/svg-deserializer
|
package/LICENSE
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
The MIT License (MIT)
|
|
3
3
|
|
|
4
|
-
Copyright (c) 2017-
|
|
4
|
+
Copyright (c) 2017-2024 JSCAD Organization
|
|
5
5
|
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
7
|
of this software and associated documentation files (the "Software"), to deal
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jscad/svg-deserializer",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.11",
|
|
4
4
|
"description": "SVG Deserializer for JSCAD",
|
|
5
5
|
"homepage": "https://openjscad.xyz/",
|
|
6
6
|
"repository": "https://github.com/jscad/OpenJSCAD.org",
|
|
@@ -33,12 +33,13 @@
|
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@jscad/array-utils": "2.1.4",
|
|
36
|
-
"@jscad/
|
|
36
|
+
"@jscad/io-utils": "2.0.30",
|
|
37
|
+
"@jscad/modeling": "2.12.5",
|
|
37
38
|
"saxes": "5.0.1"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
41
|
"ava": "3.15.0",
|
|
41
42
|
"nyc": "15.1.0"
|
|
42
43
|
},
|
|
43
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "d8010c4f1d70685404a510d604f8b6d5c362f93a"
|
|
44
45
|
}
|
package/src/index.js
CHANGED
|
@@ -14,6 +14,7 @@ const saxes = require('saxes')
|
|
|
14
14
|
|
|
15
15
|
const { colors, transforms } = require('@jscad/modeling')
|
|
16
16
|
const { toArray } = require('@jscad/array-utils')
|
|
17
|
+
const { ensureString } = require('@jscad/io-utils')
|
|
17
18
|
|
|
18
19
|
const version = require('../package.json').version
|
|
19
20
|
|
|
@@ -58,6 +59,7 @@ const deserialize = (options, input) => {
|
|
|
58
59
|
version
|
|
59
60
|
}
|
|
60
61
|
options = Object.assign({}, defaults, options)
|
|
62
|
+
input = ensureString(input)
|
|
61
63
|
return options.output === 'script' ? translate(input, options) : instantiate(input, options)
|
|
62
64
|
}
|
|
63
65
|
|
|
@@ -395,7 +397,7 @@ const createSvgParser = (src, pxPmm) => {
|
|
|
395
397
|
if (svgGroups.length > 0) {
|
|
396
398
|
const group = svgGroups.pop()
|
|
397
399
|
if ('objects' in group) {
|
|
398
|
-
|
|
400
|
+
// TBD apply presentation attributes from the group
|
|
399
401
|
group.objects.push(obj)
|
|
400
402
|
}
|
|
401
403
|
svgGroups.push(group)
|
|
@@ -422,7 +424,7 @@ const createSvgParser = (src, pxPmm) => {
|
|
|
422
424
|
DEFS: () => { svgInDefs = false },
|
|
423
425
|
USE: popGroup,
|
|
424
426
|
G: popGroup,
|
|
425
|
-
undefined: () => {}
|
|
427
|
+
undefined: () => { }
|
|
426
428
|
}
|
|
427
429
|
const elementName = node.name.toUpperCase()
|
|
428
430
|
const obj = objMap[elementName] ? objMap[elementName]() : undefined
|
package/src/shapesMapGeometry.js
CHANGED
|
@@ -330,8 +330,8 @@ const expandPath = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups
|
|
|
330
330
|
qy = cy + parseFloat(pts[i++])
|
|
331
331
|
cx = cx + parseFloat(pts[i++])
|
|
332
332
|
cy = cy + parseFloat(pts[i++])
|
|
333
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
334
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
333
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
334
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
335
335
|
ensurePath()
|
|
336
336
|
paths[pathName] = geometries.path2.appendBezier({
|
|
337
337
|
segments,
|
|
@@ -353,8 +353,8 @@ const expandPath = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups
|
|
|
353
353
|
qy = parseFloat(pts[i++])
|
|
354
354
|
cx = parseFloat(pts[i++])
|
|
355
355
|
cy = parseFloat(pts[i++])
|
|
356
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
357
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
356
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
357
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
358
358
|
ensurePath()
|
|
359
359
|
paths[pathName] = geometries.path2.appendBezier({
|
|
360
360
|
segments,
|
|
@@ -374,8 +374,8 @@ const expandPath = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups
|
|
|
374
374
|
const p0 = [cx, cy] // previous point
|
|
375
375
|
cx = cx + parseFloat(pts[i++])
|
|
376
376
|
cy = cy + parseFloat(pts[i++])
|
|
377
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
378
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
377
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
378
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
379
379
|
ensurePath()
|
|
380
380
|
paths[pathName] = geometries.path2.appendBezier({
|
|
381
381
|
segments,
|
|
@@ -395,8 +395,8 @@ const expandPath = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups
|
|
|
395
395
|
const p0 = [cx, cy] // previous point
|
|
396
396
|
cx = parseFloat(pts[i++])
|
|
397
397
|
cy = parseFloat(pts[i++])
|
|
398
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
399
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
398
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
399
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
400
400
|
ensurePath()
|
|
401
401
|
paths[pathName] = geometries.path2.appendBezier({
|
|
402
402
|
segments,
|
|
@@ -420,13 +420,13 @@ const expandPath = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups
|
|
|
420
420
|
cx = cx + parseFloat(pts[i++])
|
|
421
421
|
cy = cy + parseFloat(pts[i++])
|
|
422
422
|
ensurePath()
|
|
423
|
-
paths[pathName] = geometries.path2.appendBezier(
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
svg2cag([bx, by], svgUnitsPmm),
|
|
427
|
-
|
|
428
|
-
]
|
|
429
|
-
|
|
423
|
+
paths[pathName] = geometries.path2.appendBezier(
|
|
424
|
+
{
|
|
425
|
+
segments,
|
|
426
|
+
controlPoints: [svg2cag([x1, y1], svgUnitsPmm), svg2cag([bx, by], svgUnitsPmm), svg2cag([cx, cy], svgUnitsPmm)]
|
|
427
|
+
},
|
|
428
|
+
paths[pathName]
|
|
429
|
+
)
|
|
430
430
|
const rf = reflect(bx, by, cx, cy)
|
|
431
431
|
bx = rf[0]
|
|
432
432
|
by = rf[1]
|
|
@@ -509,7 +509,7 @@ const expandPath = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups
|
|
|
509
509
|
if (pc !== true && paths[pathName] && paths[pathName].isClosed) {
|
|
510
510
|
let coNext = obj.commands[j + 1]
|
|
511
511
|
// allow self close in the last command #1135 (coNext is null or undefined)
|
|
512
|
-
// if do have a next command use pathSelfClosed to decide how to react to closing in the middle of a path
|
|
512
|
+
// if do have a next command use pathSelfClosed to decide how to react to closing in the middle of a path
|
|
513
513
|
if (coNext && !isCloseCmd(coNext.c)) {
|
|
514
514
|
if (pathSelfClosed === 'trim') {
|
|
515
515
|
while (coNext && !isCloseCmd(coNext.c)) {
|
|
@@ -518,7 +518,7 @@ const expandPath = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, svgGroups
|
|
|
518
518
|
}
|
|
519
519
|
} else if (pathSelfClosed === 'split') {
|
|
520
520
|
newPath()
|
|
521
|
-
}else{
|
|
521
|
+
} else {
|
|
522
522
|
throw new Error(`Malformed svg path at ${obj.position[0]}:${co.pos}. Path closed itself with command #${j} ${co.c}${pts.join(' ')}`)
|
|
523
523
|
}
|
|
524
524
|
}
|
package/src/shapesMapJscad.js
CHANGED
|
@@ -260,8 +260,8 @@ const path = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, params, svgGrou
|
|
|
260
260
|
qy = cy + parseFloat(pts.shift())
|
|
261
261
|
cx = cx + parseFloat(pts.shift()) // end point
|
|
262
262
|
cy = cy + parseFloat(pts.shift())
|
|
263
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
264
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
263
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
264
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
265
265
|
tmpCode += `${indent}${pathName} = geometries.path2.appendBezier({segments: ${segments}, controlPoints: [[${svg2cag(q1, svgUnitsPmm)}], [${svg2cag(q2, svgUnitsPmm)}], [${svg2cag([cx, cy], svgUnitsPmm)}]]}, ${pathName})\n`
|
|
266
266
|
const rf = reflect(qx, qy, cx, cy)
|
|
267
267
|
qx = rf[0]
|
|
@@ -275,8 +275,8 @@ const path = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, params, svgGrou
|
|
|
275
275
|
qy = parseFloat(pts.shift())
|
|
276
276
|
cx = parseFloat(pts.shift()) // end point
|
|
277
277
|
cy = parseFloat(pts.shift())
|
|
278
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
279
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
278
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
279
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
280
280
|
tmpCode += `${indent}${pathName} = geometries.path2.appendBezier({segments: ${segments}, controlPoints: [[${svg2cag(q1, svgUnitsPmm)}], [${svg2cag(q2, svgUnitsPmm)}], [${svg2cag([cx, cy], svgUnitsPmm)}]]}, ${pathName})\n`
|
|
281
281
|
const rf = reflect(qx, qy, cx, cy)
|
|
282
282
|
qx = rf[0]
|
|
@@ -288,8 +288,8 @@ const path = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, params, svgGrou
|
|
|
288
288
|
const p0 = [cx, cy] // previous point
|
|
289
289
|
cx = cx + parseFloat(pts.shift()) // end point
|
|
290
290
|
cy = cy + parseFloat(pts.shift())
|
|
291
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
292
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
291
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
292
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
293
293
|
tmpCode += `${indent}${pathName} = geometries.path2.appendBezier({segments: ${segments}, controlPoints: [[[${svg2cag(q1, svgUnitsPmm)}], [${svg2cag(q2, svgUnitsPmm)}], [${svg2cag([cx, cy], svgUnitsPmm)}]]}, ${pathName})\n`
|
|
294
294
|
const rf = reflect(qx, qy, cx, cy)
|
|
295
295
|
qx = rf[0]
|
|
@@ -301,8 +301,8 @@ const path = (obj, svgUnitsPmm, svgUnitsX, svgUnitsY, svgUnitsV, params, svgGrou
|
|
|
301
301
|
const p0 = [cx, cy] // previous point
|
|
302
302
|
cx = parseFloat(pts.shift()) // end point
|
|
303
303
|
cy = parseFloat(pts.shift())
|
|
304
|
-
const q1 = [p0[0] + (2/3) * (qx - p0[0]), p0[1] + (2/3) * (qy - p0[1])]
|
|
305
|
-
const q2 = [q1[0] + (1/3) * (cx - p0[0]), q1[1] + (1/3) * (cy - p0[1])]
|
|
304
|
+
const q1 = [p0[0] + (2 / 3) * (qx - p0[0]), p0[1] + (2 / 3) * (qy - p0[1])]
|
|
305
|
+
const q2 = [q1[0] + (1 / 3) * (cx - p0[0]), q1[1] + (1 / 3) * (cy - p0[1])]
|
|
306
306
|
tmpCode += `${indent}${pathName} = geometries.path2.appendBezier({segments: ${segments}, controlPoints: [[[${svg2cag(q1, svgUnitsPmm)}], [${svg2cag(q2, svgUnitsPmm)}], [${svg2cag([cx, cy], svgUnitsPmm)}]]}, ${pathName})\n`
|
|
307
307
|
const rf = reflect(qx, qy, cx, cy)
|
|
308
308
|
qx = rf[0]
|
package/tests/issue.1135.test.js
CHANGED
|
@@ -3,8 +3,8 @@ const test = require('ava')
|
|
|
3
3
|
const deserializer = require('../src/index.js')
|
|
4
4
|
|
|
5
5
|
test('deserialize issue 885 do not fail on close at the end', (t) => {
|
|
6
|
-
const svg =
|
|
6
|
+
const svg = '<svg><g><path d="M0 0 L10 10L10 0L0 0" id="path4544" /></g></svg>'
|
|
7
7
|
|
|
8
|
-
shapes = deserializer.deserialize({ output: 'geometry', pathSelfClosed: 'error' }, svg)
|
|
8
|
+
const shapes = deserializer.deserialize({ output: 'geometry', pathSelfClosed: 'error' }, svg)
|
|
9
9
|
t.is(shapes.length, 1)
|
|
10
|
-
})
|
|
10
|
+
})
|