]> source.dussan.org Git - svg.js.git/commitdiff
fix import of leading, dont write data to dom if not neccessary
authorUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Sun, 3 Sep 2023 07:36:57 +0000 (09:36 +0200)
committerUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Sun, 3 Sep 2023 07:36:57 +0000 (09:36 +0200)
spec/spec/elements/Dom.js
spec/spec/elements/Element.js
spec/spec/elements/Text.js
src/elements/Element.js
src/elements/Text.js
src/utils/utils.js

index 3325d9300bc5fcaafe25c3f2b151450fe9297ee4..11ce9e07e79d5093bf540982ead9c7e37e555a7e 100644 (file)
@@ -10,7 +10,8 @@ import {
   Fragment,
   Circle,
   Tspan,
-  create
+  create,
+  Text
 } from '../../../src/main.js'
 import { getWindow } from '../../../src/utils/window.js'
 import { svg, html } from '../../../src/modules/core/namespaces.js'
@@ -657,9 +658,24 @@ describe('Dom.js', function () {
     })
   })
 
-  // describe('writeDataToDom()', () => {
-  //   // not really testable
-  // })
+  describe('writeDataToDom()', () => {
+    it('writes the data to the dom', () => {
+      const node = new Rect()
+      node.setData({ foo: 'bar' })
+      node.writeDataToDom()
+      expect(node.node.getAttribute('svgjs:data')).toBe('{"foo":"bar"}')
+    })
+
+    it('filters out default data', () => {
+      const node1 = new Text()
+      const node2 = new Text()
+      node2.dom.foo = 'bar'
+      node1.writeDataToDom()
+      node2.writeDataToDom()
+      expect(node1.node.getAttribute('svgjs:data')).toBe(null)
+      expect(node2.node.getAttribute('svgjs:data')).toBe('{"foo":"bar"}')
+    })
+  })
 
   describe('xml()', () => {
     describe('as setter', () => {
index 53c5028e55bad8cedb4041e0c06b949508466afc..c89f7aaff0ebad5d45fce1ec80f56e3c806b89b1 100644 (file)
@@ -165,7 +165,7 @@ describe('Element.js', function () {
   describe('parents()', () => {
     it('returns array of parents until the passed element or root svg', () => {
       const canvas = SVG().addTo(container)
-      const groupA = canvas.group().addClass('test')
+      const _groupA = canvas.group().addClass('test')
       const group1 = canvas.group().addClass('test')
       const group2 = group1.group()
       const group3 = group2.group()
@@ -179,7 +179,7 @@ describe('Element.js', function () {
 
     it('returns array of parents until the closest matching parent', () => {
       const canvas = SVG().addTo(container)
-      const groupA = canvas.group().addClass('test')
+      const _groupA = canvas.group().addClass('test')
       const group1 = canvas.group().addClass('test')
       const group2 = group1.group().addClass('test').addClass('foo')
       const group3 = group2.group().addClass('foo')
index f088618206beb6f994815aab55568bfaa7113d24..28802a294324cbf46234c176c05354899dffe419 100644 (file)
@@ -6,7 +6,8 @@ import {
   SVG,
   G,
   Path,
-  TextPath
+  TextPath,
+  Svg
 } from '../../../src/main.js'
 
 const { any } = jasmine
@@ -20,6 +21,13 @@ describe('Text.js', () => {
     it('sets passed attributes on the element', () => {
       expect(new Text({ id: 'foo' }).id()).toBe('foo')
     })
+
+    it('recovers leading data from dom', () => {
+      const svg = new Svg().namespace()
+      svg.text('').leading(3)
+      const newSvg = SVG(svg.svg())
+      expect(newSvg.findOne('text').leading().valueOf()).toBe(3)
+    })
   })
 
   describe('text()', () => {
index 61db7b74678ad836f12d7c328f17da6b3c01839c..7a563d6805a8d6f4c0a17ca9e55a431afd797162 100644 (file)
@@ -9,7 +9,7 @@ import {
 } from '../utils/adopter.js'
 import { globals } from '../utils/window.js'
 import { point } from '../types/Point.js'
-import { proportionalSize } from '../utils/utils.js'
+import { proportionalSize, writeDataToDom } from '../utils/utils.js'
 import { reference } from '../modules/core/regex.js'
 import Dom from './Dom.js'
 import List from '../types/List.js'
@@ -151,13 +151,7 @@ export default class Element extends Dom {
 
   // write svgjs data to the dom
   writeDataToDom() {
-    // remove previously set data
-    this.node.removeAttribute('svgjs:data')
-
-    if (Object.keys(this.dom).length) {
-      this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428
-    }
-
+    writeDataToDom(this, this.dom)
     return super.writeDataToDom()
   }
 
index 0c5815da84239549dcb59b90169e282910582333..c703e3bd7d337ae09a970df21e8b8c798015dbbf 100644 (file)
@@ -10,14 +10,14 @@ import SVGNumber from '../types/SVGNumber.js'
 import Shape from './Shape.js'
 import { globals } from '../utils/window.js'
 import * as textable from '../modules/core/textable.js'
-import { isDescriptive } from '../utils/utils.js'
+import { isDescriptive, writeDataToDom } from '../utils/utils.js'
 
 export default class Text extends Shape {
   // Initialize node
   constructor(node, attrs = node) {
     super(nodeOrNew('text', node), attrs)
 
-    this.dom.leading = new SVGNumber(1.3) // store leading value for rebuilding
+    this.dom.leading = this.dom.leading ?? new SVGNumber(1.3) // store leading value for rebuilding
     this._rebuild = true // enable automatic updating of dy values
     this._build = false // disable build mode for adding multiple lines
   }
@@ -82,6 +82,11 @@ export default class Text extends Shape {
     return this
   }
 
+  writeDataToDom() {
+    writeDataToDom(this, this.dom, { leading: 1.3 })
+    return this
+  }
+
   // Set the text content
   text(text) {
     // act as getter
index 0d297ec4dbe684f2f8c658e83041e6145a3083ca..243843169c8dcfd88f66483726b2791010ca47b2 100644 (file)
@@ -124,3 +124,19 @@ export function getOrigin(o, element) {
 const descriptiveElements = new Set(['desc', 'metadata', 'title'])
 export const isDescriptive = (element) =>
   descriptiveElements.has(element.nodeName)
+
+export const writeDataToDom = (element, data, defaults = {}) => {
+  const cloned = { ...data }
+
+  for (const key in cloned) {
+    if (cloned[key].valueOf() === defaults[key]) {
+      delete cloned[key]
+    }
+  }
+
+  if (Object.keys(cloned).length) {
+    element.node.setAttribute('svgjs:data', JSON.stringify(cloned)) // see #428
+  } else {
+    element.node.removeAttribute('svgjs:data')
+  }
+}