]> source.dussan.org Git - svg.js.git/commitdiff
fix css, dont throw when screenCtm fails (fixes #968)
authorUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Sun, 3 Sep 2023 10:20:46 +0000 (12:20 +0200)
committerUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Sun, 3 Sep 2023 10:20:46 +0000 (12:20 +0200)
spec/spec/types/Matrix.js
spec/spec/utils/utils.js
src/modules/optional/css.js
src/types/Matrix.js
src/utils/utils.js
svg.js.d.ts

index f395c43c1e09e5fa87e2fdde3c9d6f90d87ca713..36882a9016b5b18c42ead05df0e0b36f3743dc29 100644 (file)
@@ -594,6 +594,11 @@ describe('Matrix.js', () => {
         svg.screenCTM()
         expect(spy).toHaveBeenCalled()
       })
+
+      it('does not throw and returns identity matrix if element is not rendered', () => {
+        const canvas = SVG().viewbox(0, 0, 0, 0)
+        expect(canvas.screenCTM()).toEqual(new Matrix())
+      })
     })
   })
 })
index 0b3015e5bb250ef6f317c875e199d04c6efa8cb5..314c757840e63264742e0cc9044d01bc0ac411ad 100644 (file)
@@ -5,7 +5,6 @@ import {
   filter,
   radians,
   degrees,
-  camelCase,
   unCamelCase,
   capitalize,
   proportionalSize,
@@ -81,22 +80,6 @@ describe('utils.js', function () {
     })
   })
 
-  describe('camelCase()', function () {
-    it('converts dash-case and PascalCase to camelCase', function () {
-      var dash1 = 'dash-1'
-      var dashTwo = 'dash-two'
-      var camelOne = 'camelOne'
-      var pascalOne = 'PascalOne'
-      var mixOne = 'mix-One'
-
-      expect(camelCase(dash1)).toBe('dash1')
-      expect(camelCase(dashTwo)).toBe('dashTwo')
-      expect(camelCase(camelOne)).toBe('camelone')
-      expect(camelCase(pascalOne)).toBe('pascalone')
-      expect(camelCase(mixOne)).toBe('mixOne')
-    })
-  })
-
   describe('unCamelCase()', function () {
     it('converts camelCase to dash-case', function () {
       var dash1 = 'dash-1'
index 49a467bdf63bdf779d7295b9c7cb0f9b93147467..1c5ed40902ffe0df1b7db788169f8840918822ff 100644 (file)
@@ -1,9 +1,6 @@
-import { camelCase } from '../../utils/utils.js'
 import { isBlank } from '../core/regex.js'
 import { registerMethods } from '../../utils/methods.js'
 
-const camelCaseWithVars = (str) => (str.startsWith('--') ? str : camelCase(str))
-
 // Dynamic style generator
 export function css(style, val) {
   const ret = {}
@@ -25,7 +22,7 @@ export function css(style, val) {
     // get style properties as array
     if (Array.isArray(style)) {
       for (const name of style) {
-        const cased = camelCaseWithVars(name)
+        const cased = name
         ret[name] = this.node.style.getPropertyValue(cased)
       }
       return ret
@@ -33,7 +30,7 @@ export function css(style, val) {
 
     // get style for property
     if (typeof style === 'string') {
-      return this.node.style.getPropertyValue(camelCaseWithVars(style))
+      return this.node.style.getPropertyValue(style)
     }
 
     // set styles in object
@@ -41,7 +38,7 @@ export function css(style, val) {
       for (const name in style) {
         // set empty string if null/undefined/'' was given
         this.node.style.setProperty(
-          camelCaseWithVars(name),
+          name,
           style[name] == null || isBlank.test(style[name]) ? '' : style[name]
         )
       }
@@ -51,7 +48,7 @@ export function css(style, val) {
   // set style for property
   if (arguments.length === 2) {
     this.node.style.setProperty(
-      camelCaseWithVars(style),
+      style,
       val == null || isBlank.test(val) ? '' : val
     )
   }
index 760f002ac0fcac09fbec35ef16ae9d16e7c93eda..f409a50de8ec437789b6749746f3e4cb9857f06c 100644 (file)
@@ -520,17 +520,24 @@ export function ctm() {
 }
 
 export function screenCTM() {
-  /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537
-     This is needed because FF does not return the transformation matrix
-     for the inner coordinate system when getScreenCTM() is called on nested svgs.
-     However all other Browsers do that */
-  if (typeof this.isRoot === 'function' && !this.isRoot()) {
-    const rect = this.rect(1, 1)
-    const m = rect.node.getScreenCTM()
-    rect.remove()
-    return new Matrix(m)
-  }
-  return new Matrix(this.node.getScreenCTM())
+  try {
+    /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537
+       This is needed because FF does not return the transformation matrix
+       for the inner coordinate system when getScreenCTM() is called on nested svgs.
+       However all other Browsers do that */
+    if (typeof this.isRoot === 'function' && !this.isRoot()) {
+      const rect = this.rect(1, 1)
+      const m = rect.node.getScreenCTM()
+      rect.remove()
+      return new Matrix(m)
+    }
+    return new Matrix(this.node.getScreenCTM())
+  } catch (e) {
+    console.warn(
+      `Cannot get CTM from SVG node ${this.node.nodeName}. Is the element rendered?`
+    )
+    return new Matrix()
+  }
 }
 
 register(Matrix, 'Matrix')
index 90ef548355c58a11eaf1307354ed972531b2c935..edd98b627b0c28d8df2bb65fe2f79f39f635a54f 100644 (file)
@@ -36,13 +36,6 @@ export function degrees(r) {
   return ((r * 180) / Math.PI) % 360
 }
 
-// Convert dash-separated-string to camelCase
-export function camelCase(s) {
-  return s.toLowerCase().replace(/-(.)/g, function (m, g) {
-    return g.toUpperCase()
-  })
-}
-
 // Convert camel cased string to dash separated
 export function unCamelCase(s) {
   return s.replace(/([A-Z])/g, function (m, g) {
index a91629e5490c6f6c678d43a0e786b85f12a06063..d941fedb6b8575bafa0f00d6228673237b7d7fb4 100644 (file)
@@ -1340,35 +1340,29 @@ declare module '@svgdotjs/svg.js' {
   }
 
   interface Sugar {
-    fill(): any
+    fill(): string
     fill(fill: FillData): this
     fill(color: string): this
     fill(pattern: Element): this
     fill(image: Image): this
-    stroke(): any
+    stroke(): string
     stroke(stroke: StrokeData): this
     stroke(color: string): this
+    matrix(): Matrix
     matrix(
-      a?: number,
-      b?: number,
-      c?: number,
-      d?: number,
-      e?: number,
-      f?: number
-    ): this
-    matrix(
-      mat: MatrixAlias,
-      b?: number,
-      c?: number,
-      d?: number,
-      e?: number,
-      f?: number
+      a: number,
+      b: number,
+      c: number,
+      d: number,
+      e: number,
+      f: number
     ): this
+    matrix(mat: MatrixAlias): this
     rotate(degrees: number, cx?: number, cy?: number): this
     skew(skewX?: number, skewY?: number, cx?: number, cy?: number): this
     scale(scaleX?: number, scaleY?: number, cx?: number, cy?: number): this
     translate(x: number, y: number): this
-    shear(lam: Matrix, cx: number, cy: number): this
+    shear(lam: number, cx: number, cy: number): this
     relative(x: number, y: number): this
     flip(direction?: string, around?: number): this
     flip(around: number): this