@svgedit/svgcanvas 7.2.1 → 7.2.3

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.
@@ -11,7 +11,7 @@ import { BatchCommand, ChangeElementCommand } from './history.js'
11
11
  import { remapElement } from './coords.js'
12
12
  import {
13
13
  isIdentity, matrixMultiply, transformPoint, transformListToTransform,
14
- hasMatrixTransform
14
+ hasMatrixTransform, getTransformList
15
15
  } from './math.js'
16
16
  import {
17
17
  mergeDeep
@@ -55,7 +55,7 @@ export const init = (canvas) => {
55
55
  */
56
56
  export const updateClipPath = (attr, tx, ty) => {
57
57
  const path = getRefElem(attr).firstChild
58
- const cpXform = path.transform.baseVal
58
+ const cpXform = getTransformList(path)
59
59
  const newxlate = svgCanvas.getSvgRoot().createSVGTransform()
60
60
  newxlate.setTranslate(tx, ty)
61
61
 
@@ -75,7 +75,7 @@ export const recalculateDimensions = (selected) => {
75
75
  if (!selected) return null
76
76
  const svgroot = svgCanvas.getSvgRoot()
77
77
  const dataStorage = svgCanvas.getDataStorage()
78
- const tlist = selected.transform?.baseVal
78
+ const tlist = getTransformList(selected)
79
79
  // remove any unnecessary transforms
80
80
  if (tlist?.numberOfItems > 0) {
81
81
  let k = tlist.numberOfItems
@@ -113,7 +113,6 @@ export const recalculateDimensions = (selected) => {
113
113
  selected.setAttribute('transform', '')
114
114
  // However, this still next line currently doesn't work at all in Chrome
115
115
  selected.removeAttribute('transform')
116
- // selected.transform.baseVal.clear(); // Didn't help for Chrome bug
117
116
  return null
118
117
  }
119
118
 
@@ -296,7 +295,7 @@ export const recalculateDimensions = (selected) => {
296
295
  tx = 0
297
296
  ty = 0
298
297
  if (child.nodeType === 1) {
299
- const childTlist = child.transform.baseVal
298
+ const childTlist = getTransformList(child)
300
299
 
301
300
  // some children might not have a transform (<metadata>, <defs>, etc)
302
301
  if (!childTlist) { continue }
@@ -413,7 +412,7 @@ export const recalculateDimensions = (selected) => {
413
412
  oldStartTransform = svgCanvas.getStartTransform()
414
413
  svgCanvas.setStartTransform(child.getAttribute('transform'))
415
414
 
416
- const childTlist = child.transform?.baseVal
415
+ const childTlist = getTransformList(child)
417
416
  // some children might not have a transform (<metadata>, <defs>, etc)
418
417
  if (childTlist) {
419
418
  const newxlate = svgroot.createSVGTransform()
@@ -460,7 +459,7 @@ export const recalculateDimensions = (selected) => {
460
459
  if (child.nodeType === 1) {
461
460
  oldStartTransform = svgCanvas.getStartTransform()
462
461
  svgCanvas.setStartTransform(child.getAttribute('transform'))
463
- const childTlist = child.transform?.baseVal
462
+ const childTlist = getTransformList(child)
464
463
 
465
464
  if (!childTlist) { continue }
466
465
 
@@ -544,7 +543,7 @@ export const recalculateDimensions = (selected) => {
544
543
  if (child.nodeType === 1) {
545
544
  oldStartTransform = svgCanvas.getStartTransform()
546
545
  svgCanvas.setStartTransform(child.getAttribute('transform'))
547
- const childTlist = child.transform?.baseVal
546
+ const childTlist = getTransformList(child)
548
547
  const newxlate = svgroot.createSVGTransform()
549
548
  newxlate.setTranslate(tx, ty)
550
549
  if (childTlist.numberOfItems) {
@@ -629,7 +628,7 @@ export const recalculateDimensions = (selected) => {
629
628
  if (attrVal === 'userSpaceOnUse') {
630
629
  // Update the userSpaceOnUse element
631
630
  m = transformListToTransform(tlist).matrix
632
- const gtlist = paint.transform.baseVal
631
+ const gtlist = getTransformList(paint)
633
632
  const gmatrix = transformListToTransform(gtlist).matrix
634
633
  m = matrixMultiply(m, gmatrix)
635
634
  const mStr = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')'
package/core/select.js CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  import { isWebkit } from '../common/browser.js'
10
10
  import { getRotationAngle, getBBox, getStrokedBBox } from './utilities.js'
11
- import { transformListToTransform, transformBox, transformPoint, matrixMultiply } from './math.js'
11
+ import { transformListToTransform, transformBox, transformPoint, matrixMultiply, getTransformList } from './math.js'
12
12
  import { NS } from './namespaces'
13
13
 
14
14
  let svgCanvas
@@ -130,14 +130,14 @@ export class Selector {
130
130
  while (currentElt.parentNode) {
131
131
  if (currentElt.parentNode && currentElt.parentNode.tagName === 'g' && currentElt.parentNode.transform) {
132
132
  if (currentElt.parentNode.transform.baseVal.numberOfItems) {
133
- parentTransformationMatrix = matrixMultiply(transformListToTransform(selected.parentNode.transform.baseVal).matrix, parentTransformationMatrix)
133
+ parentTransformationMatrix = matrixMultiply(transformListToTransform(getTransformList(selected.parentNode)).matrix, parentTransformationMatrix)
134
134
  }
135
135
  }
136
136
  currentElt = currentElt.parentNode
137
137
  }
138
138
 
139
139
  // loop and transform our bounding box until we reach our first rotation
140
- const tlist = selected.transform.baseVal
140
+ const tlist = getTransformList(selected)
141
141
 
142
142
  // combines the parent transformation with that of the selected element if necessary
143
143
  const m = parentTransformationMatrix ? matrixMultiply(parentTransformationMatrix, transformListToTransform(tlist).matrix) : transformListToTransform(tlist).matrix
@@ -26,7 +26,8 @@ import {
26
26
  import {
27
27
  transformPoint,
28
28
  matrixMultiply,
29
- transformListToTransform
29
+ transformListToTransform,
30
+ getTransformList
30
31
  } from './math.js'
31
32
  import { recalculateDimensions } from './recalculate.js'
32
33
  import { isGecko } from '../common/browser.js'
@@ -207,7 +208,7 @@ const moveSelectedElements = (dx, dy, undoable = true) => {
207
208
  selectedElements.forEach((selected, i) => {
208
209
  if (selected) {
209
210
  const xform = svgCanvas.getSvgRoot().createSVGTransform()
210
- const tlist = selected.transform?.baseVal
211
+ const tlist = getTransformList(selected)
211
212
 
212
213
  // dx and dy could be arrays
213
214
  if (Array.isArray(dx)) {
@@ -724,7 +725,7 @@ const pushGroupProperty = (g, undoable) => {
724
725
  const len = children.length
725
726
  const xform = g.getAttribute('transform')
726
727
 
727
- const glist = g.transform.baseVal
728
+ const glist = getTransformList(g)
728
729
  const m = transformListToTransform(glist).matrix
729
730
 
730
731
  const batchCmd = new BatchCommand('Push group properties')
@@ -810,7 +811,7 @@ const pushGroupProperty = (g, undoable) => {
810
811
  }
811
812
  }
812
813
 
813
- let chtlist = elem.transform?.baseVal
814
+ let chtlist = getTransformList(elem)
814
815
 
815
816
  // Don't process gradient transforms
816
817
  if (elem.tagName.includes('Gradient')) {
@@ -963,7 +964,7 @@ const convertToGroup = elem => {
963
964
  }
964
965
  dataStorage.remove(elem, 'gsvg')
965
966
 
966
- const tlist = elem.transform.baseVal
967
+ const tlist = getTransformList(elem)
967
968
  const xform = svgCanvas.getSvgRoot().createSVGTransform()
968
969
  xform.setTranslate(pt.x, pt.y)
969
970
  tlist.appendItem(xform)
package/core/selection.js CHANGED
@@ -13,7 +13,8 @@ import {
13
13
  import {
14
14
  transformPoint,
15
15
  transformListToTransform,
16
- rectsIntersect
16
+ rectsIntersect,
17
+ getTransformList
17
18
  } from './math.js'
18
19
  import * as hstry from './history.js'
19
20
  import { getClosest } from '../common/util.js'
@@ -392,7 +393,7 @@ const setRotationAngle = (val, preventUndo) => {
392
393
  const bbox = getBBox(elem)
393
394
  const cx = bbox.x + bbox.width / 2
394
395
  const cy = bbox.y + bbox.height / 2
395
- const tlist = elem.transform.baseVal
396
+ const tlist = getTransformList(elem)
396
397
 
397
398
  // only remove the real rotational transform if present (i.e. at index=0)
398
399
  if (tlist.numberOfItems > 0) {
package/core/svg-exec.js CHANGED
@@ -5,8 +5,8 @@
5
5
  * @copyright 2011 Jeff Schiller
6
6
  */
7
7
 
8
- import { jsPDF as JsPDF } from 'jspdf/dist/jspdf.es.min.js'
9
- import 'svg2pdf.js/dist/svg2pdf.es.js'
8
+ import { jsPDF as JsPDF } from 'jspdf'
9
+ import 'svg2pdf.js'
10
10
  import html2canvas from 'html2canvas'
11
11
  import * as hstry from './history.js'
12
12
  import {
@@ -23,7 +23,11 @@ import {
23
23
  getBBox as utilsGetBBox,
24
24
  hashCode
25
25
  } from './utilities.js'
26
- import { transformPoint, transformListToTransform } from './math.js'
26
+ import {
27
+ transformPoint,
28
+ transformListToTransform,
29
+ getTransformList
30
+ } from './math.js'
27
31
  import { convertUnit, shortFloat, convertToNum } from './units.js'
28
32
  import { isGecko, isChrome, isWebkit } from '../common/browser.js'
29
33
  import * as pathModule from './path.js'
@@ -90,7 +94,7 @@ const svgCanvasToString = () => {
90
94
 
91
95
  // Unwrap gsvg if it has no special attributes (only id and style)
92
96
  const gsvgElems = svgCanvas.getSvgContent().querySelectorAll('g[data-gsvg]')
93
- Array.prototype.forEach.call(gsvgElems, (element) => {
97
+ Array.prototype.forEach.call(gsvgElems, element => {
94
98
  const attrs = element.attributes
95
99
  let len = attrs.length
96
100
  for (let i = 0; i < len; i++) {
@@ -109,7 +113,7 @@ const svgCanvasToString = () => {
109
113
 
110
114
  // Rewrap gsvg
111
115
  if (nakedSvgs.length) {
112
- Array.prototype.forEach.call(nakedSvgs, (el) => {
116
+ Array.prototype.forEach.call(nakedSvgs, el => {
113
117
  svgCanvas.groupSvgElem(el)
114
118
  })
115
119
  }
@@ -162,26 +166,14 @@ const svgToString = (elem, indent) => {
162
166
  // }
163
167
  if (curConfig.dynamicOutput) {
164
168
  vb = elem.getAttribute('viewBox')
165
- out.push(
166
- ' viewBox="' +
167
- vb +
168
- '" xmlns="' +
169
- NS.SVG +
170
- '"'
171
- )
169
+ out.push(' viewBox="' + vb + '" xmlns="' + NS.SVG + '"')
172
170
  } else {
173
171
  if (unit !== 'px') {
174
172
  res.w = convertUnit(res.w, unit) + unit
175
173
  res.h = convertUnit(res.h, unit) + unit
176
174
  }
177
175
  out.push(
178
- ' width="' +
179
- res.w +
180
- '" height="' +
181
- res.h +
182
- '" xmlns="' +
183
- NS.SVG +
184
- '"'
176
+ ' width="' + res.w + '" height="' + res.h + '" xmlns="' + NS.SVG + '"'
185
177
  )
186
178
  }
187
179
 
@@ -191,7 +183,7 @@ const svgToString = (elem, indent) => {
191
183
  const csElements = elem.querySelectorAll('*')
192
184
  const cElements = Array.prototype.slice.call(csElements)
193
185
  cElements.push(elem)
194
- Array.prototype.forEach.call(cElements, (el) => {
186
+ Array.prototype.forEach.call(cElements, el => {
195
187
  // const el = this;
196
188
  // for some elements have no attribute
197
189
  const uri = el.namespaceURI
@@ -441,7 +433,7 @@ const setSvgString = (xmlString, preventUndo) => {
441
433
 
442
434
  // change image href vals if possible
443
435
  const elements = content.querySelectorAll('image')
444
- Array.prototype.forEach.call(elements, (image) => {
436
+ Array.prototype.forEach.call(elements, image => {
445
437
  preventClickDefault(image)
446
438
  const val = svgCanvas.getHref(image)
447
439
  if (val) {
@@ -487,7 +479,7 @@ const setSvgString = (xmlString, preventUndo) => {
487
479
 
488
480
  // Wrap child SVGs in group elements
489
481
  const svgElements = content.querySelectorAll('svg')
490
- Array.prototype.forEach.call(svgElements, (element) => {
482
+ Array.prototype.forEach.call(svgElements, element => {
491
483
  // Skip if it's in a <defs>
492
484
  if (getClosest(element.parentNode, 'defs')) {
493
485
  return
@@ -511,7 +503,7 @@ const setSvgString = (xmlString, preventUndo) => {
511
503
  const findElems = content.querySelectorAll(
512
504
  'linearGradient, radialGradient, pattern'
513
505
  )
514
- Array.prototype.forEach.call(findElems, (ele) => {
506
+ Array.prototype.forEach.call(findElems, ele => {
515
507
  svgDefs.appendChild(ele)
516
508
  })
517
509
  }
@@ -538,7 +530,7 @@ const setSvgString = (xmlString, preventUndo) => {
538
530
  attrs.height = vb[3]
539
531
  // handle content that doesn't have a viewBox
540
532
  } else {
541
- ;['width', 'height'].forEach((dim) => {
533
+ ;['width', 'height'].forEach(dim => {
542
534
  // Set to 100 if not given
543
535
  const val = content.getAttribute(dim) || '100%'
544
536
  if (String(val).substr(-1) === '%') {
@@ -555,9 +547,9 @@ const setSvgString = (xmlString, preventUndo) => {
555
547
 
556
548
  // Give ID for any visible layer children missing one
557
549
  const chiElems = content.children
558
- Array.prototype.forEach.call(chiElems, (chiElem) => {
550
+ Array.prototype.forEach.call(chiElems, chiElem => {
559
551
  const visElems = chiElem.querySelectorAll(svgCanvas.getVisElems())
560
- Array.prototype.forEach.call(visElems, (elem) => {
552
+ Array.prototype.forEach.call(visElems, elem => {
561
553
  if (!elem.id) {
562
554
  elem.id = svgCanvas.getNextId()
563
555
  }
@@ -696,7 +688,7 @@ const importSvgString = (xmlString, preserveDimension) => {
696
688
  const elements = svg.querySelectorAll(
697
689
  'linearGradient, radialGradient, pattern'
698
690
  )
699
- Array.prototype.forEach.call(elements, (el) => {
691
+ Array.prototype.forEach.call(elements, el => {
700
692
  defs.appendChild(el)
701
693
  })
702
694
  }
@@ -766,7 +758,7 @@ const importSvgString = (xmlString, preserveDimension) => {
766
758
  * @param {string} src - The path/URL of the image
767
759
  * @returns {Promise<string|false>} Resolves to a Data URL (string|false)
768
760
  */
769
- const embedImage = (src) => {
761
+ const embedImage = src => {
770
762
  // Todo: Remove this Promise in favor of making an async/await `Image.load` utility
771
763
  return new Promise((resolve, reject) => {
772
764
  // load in the image and once it's loaded, get the dimensions
@@ -904,7 +896,7 @@ const rasterExport = async (imgType, quality, WindowName, opts = {}) => {
904
896
  WindowName
905
897
  }
906
898
  if (!opts.avoidEvent) {
907
- svgCanvas.call('ed', obj)
899
+ svgCanvas.call('exported', obj)
908
900
  }
909
901
  resolve(obj)
910
902
  }
@@ -1011,7 +1003,7 @@ const exportPDF = async (
1011
1003
  * @param {Element} g - The parent element of the tree to give unique IDs
1012
1004
  * @returns {void}
1013
1005
  */
1014
- const uniquifyElemsMethod = (g) => {
1006
+ const uniquifyElemsMethod = g => {
1015
1007
  const ids = {}
1016
1008
  // TODO: Handle markers and connectors. These are not yet re-identified properly
1017
1009
  // as their referring elements do not get remapped.
@@ -1031,7 +1023,7 @@ const uniquifyElemsMethod = (g) => {
1031
1023
  'use'
1032
1024
  ]
1033
1025
 
1034
- walkTree(g, (n) => {
1026
+ walkTree(g, n => {
1035
1027
  // if it's an element node
1036
1028
  if (n.nodeType === 1) {
1037
1029
  // and the element has an ID
@@ -1046,7 +1038,7 @@ const uniquifyElemsMethod = (g) => {
1046
1038
 
1047
1039
  // now search for all attributes on this element that might refer
1048
1040
  // to other elements
1049
- svgCanvas.getrefAttrs().forEach((attr) => {
1041
+ svgCanvas.getrefAttrs().forEach(attr => {
1050
1042
  const attrnode = n.getAttributeNode(attr)
1051
1043
  if (attrnode) {
1052
1044
  // the incoming file has been sanitized, so we should be able to safely just strip off the leading #
@@ -1115,7 +1107,7 @@ const uniquifyElemsMethod = (g) => {
1115
1107
  * @param {Element} parent
1116
1108
  * @returns {void}
1117
1109
  */
1118
- const setUseDataMethod = (parent) => {
1110
+ const setUseDataMethod = parent => {
1119
1111
  let elems = parent
1120
1112
 
1121
1113
  if (parent.tagName !== 'use') {
@@ -1210,17 +1202,15 @@ const removeUnusedDefElemsMethod = () => {
1210
1202
  * @param {Element} elem
1211
1203
  * @returns {void}
1212
1204
  */
1213
- const convertGradientsMethod = (elem) => {
1205
+ const convertGradientsMethod = elem => {
1214
1206
  let elems = elem.querySelectorAll('linearGradient, radialGradient')
1215
1207
  if (!elems.length && isWebkit()) {
1216
1208
  // Bug in webkit prevents regular *Gradient selector search
1217
- elems = Array.prototype.filter.call(elem.querySelectorAll('*'), (
1218
- curThis
1219
- ) => {
1209
+ elems = Array.prototype.filter.call(elem.querySelectorAll('*'), curThis => {
1220
1210
  return curThis.tagName.includes('Gradient')
1221
1211
  })
1222
1212
  }
1223
- Array.prototype.forEach.call(elems, (grad) => {
1213
+ Array.prototype.forEach.call(elems, grad => {
1224
1214
  if (grad.getAttribute('gradientUnits') === 'userSpaceOnUse') {
1225
1215
  const svgContent = svgCanvas.getSvgContent()
1226
1216
  // TODO: Support more than one element with this ref by duplicating parent grad
@@ -1269,7 +1259,7 @@ const convertGradientsMethod = (elem) => {
1269
1259
  }
1270
1260
 
1271
1261
  // If has transform, convert
1272
- const tlist = grad.gradientTransform.baseVal
1262
+ const tlist = getTransformList(grad)
1273
1263
  if (tlist?.numberOfItems > 0) {
1274
1264
  const m = transformListToTransform(tlist).matrix
1275
1265
  const pt1 = transformPoint(gCoords.x1, gCoords.y1, m)
package/core/undo.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  isGecko
14
14
  } from '../common/browser.js'
15
15
  import {
16
- transformPoint, transformListToTransform
16
+ transformPoint, transformListToTransform, getTransformList
17
17
  } from './math.js'
18
18
 
19
19
  const {
@@ -167,8 +167,8 @@ export const changeSelectedAttributeNoUndoMethod = (attr, newValue, elems) => {
167
167
  // Set x,y vals on elements that don't have them
168
168
  if ((attr === 'x' || attr === 'y') && noXYElems.includes(elem.tagName)) {
169
169
  const bbox = getStrokedBBoxDefaultVisible([elem])
170
- const diffX = attr === 'x' ? newValue - bbox.x : 0
171
- const diffY = attr === 'y' ? newValue - bbox.y : 0
170
+ const diffX = attr === 'x' ? parseFloat(newValue) - bbox.x : 0
171
+ const diffY = attr === 'y' ? parseFloat(newValue) - bbox.y : 0
172
172
  svgCanvas.moveSelectedElements(diffX * zoom, diffY * zoom, true)
173
173
  continue
174
174
  }
@@ -189,7 +189,7 @@ export const changeSelectedAttributeNoUndoMethod = (attr, newValue, elems) => {
189
189
  } else if (attr === '#href') {
190
190
  setHref(elem, newValue)
191
191
  } else if (newValue) {
192
- elem.setAttribute(attr, newValue)
192
+ elem.setAttribute(attr, isNaN(parseFloat(newValue)) ? newValue : parseFloat(newValue))
193
193
  } else if (typeof newValue === 'number') {
194
194
  elem.setAttribute(attr, newValue)
195
195
  } else {
@@ -228,7 +228,7 @@ export const changeSelectedAttributeNoUndoMethod = (attr, newValue, elems) => {
228
228
  // we need to update the rotational transform attribute
229
229
  const angle = getRotationAngle(elem)
230
230
  if (angle !== 0 && attr !== 'transform') {
231
- const tlist = elem.transform?.baseVal
231
+ const tlist = getTransformList(elem)
232
232
  let n = tlist.numberOfItems
233
233
  while (n--) {
234
234
  const xform = tlist.getItem(n)