@jscad/svg-deserializer 2.5.9 → 2.5.10

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 CHANGED
@@ -3,6 +3,14 @@
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.10](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/svg-deserializer@2.5.9...@jscad/svg-deserializer@2.5.10) (2024-11-10)
7
+
8
+ **Note:** Version bump only for package @jscad/svg-deserializer
9
+
10
+
11
+
12
+
13
+
6
14
  ## [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
15
 
8
16
  **Note:** Version bump only for package @jscad/svg-deserializer
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jscad/svg-deserializer",
3
- "version": "2.5.9",
3
+ "version": "2.5.10",
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/modeling": "2.12.3",
36
+ "@jscad/io-utils": "2.0.29",
37
+ "@jscad/modeling": "2.12.4",
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": "4627312c2337120447a607ff3ac3da10056ce132"
44
+ "gitHead": "ce4978ee40c30803cba05d1c96ba8b6aaf3abc61"
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
- // TBD apply presentation attributes from the group
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
@@ -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
- segments, controlPoints: [
425
- svg2cag([x1, y1], svgUnitsPmm),
426
- svg2cag([bx, by], svgUnitsPmm),
427
- svg2cag([cx, cy], svgUnitsPmm)
428
- ]
429
- }, paths[pathName])
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
  }
@@ -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]
@@ -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 = `<svg><g><path d="M0 0 L10 10L10 0L0 0" id="path4544" /></g></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
+ })