summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--spec/SpecRunner.html1
-rw-r--r--spec/spec/doc.js21
-rw-r--r--spec/spec/element.js3
-rw-r--r--spec/spec/nested.js13
-rw-r--r--spec/spec/svg.js4
-rw-r--r--src/HtmlNode.js10
-rw-r--r--src/boxes.js2
-rw-r--r--src/doc.js45
-rw-r--r--src/element.js3
-rw-r--r--src/flatten.js2
-rw-r--r--src/matrix.js2
-rw-r--r--src/parent.js6
-rw-r--r--src/parser.js2
-rw-r--r--src/svg.js8
14 files changed, 61 insertions, 61 deletions
diff --git a/spec/SpecRunner.html b/spec/SpecRunner.html
index 7461bdd..bd47626 100644
--- a/spec/SpecRunner.html
+++ b/spec/SpecRunner.html
@@ -78,7 +78,6 @@
<script src="spec/mask.js"></script>
<script src="spec/matrix.js"></script>
<script src="spec/memory.js"></script>
- <script src="spec/nested.js"></script>
<script src="spec/number.js"></script>
<script src="spec/path.js"></script>
<script src="spec/pattern.js"></script>
diff --git a/spec/spec/doc.js b/spec/spec/doc.js
index 1e1c54c..5accd5b 100644
--- a/spec/spec/doc.js
+++ b/spec/spec/doc.js
@@ -16,11 +16,11 @@ describe('Doc', function() {
expect(draw instanceof SVG.Doc).toBe(true)
})
- it('returns itself as Doc', function() {
+ it('returns itself as Doc when root', function() {
expect(draw.doc()).toBe(draw)
})
- it('has a defs element', function() {
+ it('has a defs element when root', function() {
expect(draw.defs() instanceof SVG.Defs).toBe(true)
})
@@ -33,6 +33,23 @@ describe('Doc', function() {
})
})
+ describe('isRoot()', function() {
+ it('returns true when the doc is not attached to dom', function() {
+ expect(SVG().isRoot()).toBe(true)
+ })
+ it('returns true when its outer element is not an svg element', function () {
+ expect(SVG().addTo(document.createElement('div')).isRoot()).toBe(true)
+ })
+ it('returns true when its the root element of the dom', function () {
+ if(parserInDoc) {
+ expect(draw.isRoot()).toBe(true)
+ }
+ })
+ it('returns false when parent is svg element', function () {
+ expect(SVG().addTo(SVG()).isRoot()).toBe(false)
+ })
+ })
+
describe('remove()', function() {
it('removes the doc from the dom only if doc is not root element', function() {
var cnt = window.document.querySelectorAll('svg').length
diff --git a/spec/spec/element.js b/spec/spec/element.js
index a5b26a1..53ed84f 100644
--- a/spec/spec/element.js
+++ b/spec/spec/element.js
@@ -476,11 +476,12 @@ describe('Element', function() {
it('ungroups everything to the doc root when called on SVG.Doc / does not ungroup defs/parser', function() {
draw.flatten()
+
expect(rect1.parent()).toBe(draw)
expect(rect2.parent()).toBe(draw)
expect(g1.node.parentNode).toBeFalsy()
- expect(g1.node.parentNode).toBeFalsy()
+ expect(g2.node.parentNode).toBeFalsy()
expect(nested.node.parentNode).toBeFalsy()
expect(rect1.transform()).toEqual(jasmine.objectContaining({
diff --git a/spec/spec/nested.js b/spec/spec/nested.js
deleted file mode 100644
index 3113880..0000000
--- a/spec/spec/nested.js
+++ /dev/null
@@ -1,13 +0,0 @@
-describe('Nested', function() {
-
- afterEach(function() {
- draw.clear()
- })
-
- describe('()', function() {
- it('creates a nested svg of type SVG.Nested', function() {
- expect(draw.nested() instanceof SVG.Nested).toBeTruthy()
- })
- })
-
-})
diff --git a/spec/spec/svg.js b/spec/spec/svg.js
index 2485a32..ea51703 100644
--- a/spec/spec/svg.js
+++ b/spec/spec/svg.js
@@ -52,10 +52,10 @@ describe('SVG', function() {
expect(SVG(rect).node).toBe(rect)
})
- it('creates an instanceof SVG.Nested when importing a whole svg', function() {
+ it('creates an instanceof SVG.Doc when importing a whole svg', function() {
var doc = SVG('<svg width="200"><rect></rect></svg>')
- expect(doc instanceof SVG.Nested).toBe(true)
+ expect(doc instanceof SVG.Doc).toBe(true)
expect(doc.node.nodeName).toBe('svg')
expect(doc.width()).toBe(200)
expect(doc.get(0).node.nodeName).toBe('rect')
diff --git a/src/HtmlNode.js b/src/HtmlNode.js
index 30cb4cf..e7dae10 100644
--- a/src/HtmlNode.js
+++ b/src/HtmlNode.js
@@ -8,15 +8,9 @@ SVG.HtmlNode = SVG.invent({
extend: {
add: function (element, i) {
element = createElement(element)
- if (element instanceof SVG.Nested) {
- element = new SVG.Doc(element.node)
- element.setData(JSON.parse(element.node.getAttribute('svgjs:data')) || {})
- }
- if (i === null) {
- this.node.appendChild(element.node)
- } else if (element.node !== this.node.children[i]) {
- this.node.insertBefore(element.node, this.node.children[i])
+ if (element.node !== this.node.children[i]) {
+ this.node.insertBefore(element.node, this.node.children[i] || null)
}
return this
diff --git a/src/boxes.js b/src/boxes.js
index a5ca1e8..f0154bd 100644
--- a/src/boxes.js
+++ b/src/boxes.js
@@ -127,7 +127,7 @@ SVG.Box = SVG.invent({
}
})
-SVG.extend([SVG.Doc, SVG.Nested, SVG.Symbol, SVG.Image, SVG.Pattern, SVG.Marker, SVG.ForeignObject, SVG.View], {
+SVG.extend([SVG.Doc, SVG.Symbol, SVG.Image, SVG.Pattern, SVG.Marker, SVG.ForeignObject, SVG.View], {
viewbox: function (x, y, width, height) {
// act as getter
if (x == null) return new SVG.Box(this.attr('viewBox'))
diff --git a/src/doc.js b/src/doc.js
index d4bf7e5..72ea59c 100644
--- a/src/doc.js
+++ b/src/doc.js
@@ -4,7 +4,7 @@ SVG.Doc = SVG.invent({
this.constructor(node || SVG.create('svg'))
// set svg element attributes and ensure defs node
- this.namespace().defs()
+ this.namespace()
},
// Inherit from
@@ -12,40 +12,41 @@ SVG.Doc = SVG.invent({
// Add class methods
extend: {
- isRoot: function() {
- return !this.node.parentNode || !this.node.parentNode instanceof window.SVGElement || this.node.parentNode.nodeName == '#document'
+ isRoot: function () {
+ return !this.node.parentNode || !(this.node.parentNode instanceof window.SVGElement) || this.node.parentNode.nodeName === '#document'
},
- doc: function() {
- if(this.isRoot()) return this
-
- var parent
- while(parent = this.parent(SVG.Doc)) {
- if(parent.isRoot()) return parent
- }
-
- // this can only happen when you have something like
- // <g><svg>...</svg></g>
- return null
+ // Check if this is a root svg. If not, call docs from this element
+ doc: function () {
+ if (this.isRoot()) return this
+ return SVG.Element.prototype.doc.call(this)
},
// Add namespaces
- namespace: function() {
- if(!this.isRoot()) return this.doc().namespace()
+ namespace: function () {
+ if (!this.isRoot()) return this.doc().namespace()
return this
.attr({ xmlns: SVG.ns, version: '1.1' })
.attr('xmlns:xlink', SVG.xlink, SVG.xmlns)
.attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns)
},
// Creates and returns defs element
- defs: function() {
- if(!this.isRoot()) return this.doc().defs()
+ defs: function () {
+ if (!this.isRoot()) return this.doc().defs()
return SVG.adopt(this.node.getElementsByTagName('defs')[0]) || this.put(new SVG.Defs())
},
// custom parent method
- parent: function () {
- return this.node.parentNode.nodeName === '#document' ? null : this.node.parentNode
+ parent: function (type) {
+ if (this.isRoot()) {
+ return this.node.parentNode.nodeName === '#document' ? null : this.node.parentNode
+ }
+
+ return SVG.Element.prototype.parent.call(this, type)
},
// Removes the doc from the DOM
remove: function () {
+ if (!this.isRoot()) {
+ return SVG.Element.prototype.remove.call(this)
+ }
+
if (this.parent()) {
this.parent().removeChild(this.node)
}
@@ -62,8 +63,8 @@ SVG.Doc = SVG.invent({
},
construct: {
// Create nested svg document
- nested: function() {
- return this.put(new SVG.Doc)
+ nested: function () {
+ return this.put(new SVG.Doc())
}
}
})
diff --git a/src/element.js b/src/element.js
index e7b5326..0d08579 100644
--- a/src/element.js
+++ b/src/element.js
@@ -218,7 +218,8 @@ SVG.Element = SVG.invent({
// Get parent document
doc: function () {
- return this.parent(SVG.Doc).doc()
+ var p = this.parent(SVG.Doc)
+ return p && p.doc()
},
// Get defs
diff --git a/src/flatten.js b/src/flatten.js
index 1c32a76..3ba6e22 100644
--- a/src/flatten.js
+++ b/src/flatten.js
@@ -2,7 +2,7 @@ SVG.extend(SVG.Parent, {
flatten: function (parent) {
if (this instanceof SVG.Defs) return this
- parent = parent || (this instanceof SVG.Doc ? this : this.parent(SVG.Parent))
+ parent = parent || (this instanceof SVG.Doc && this.isRoot() ? this : this.parent(SVG.Parent))
this.each(function () {
if (this instanceof SVG.Defs) return this
diff --git a/src/matrix.js b/src/matrix.js
index 6e918d8..e823a81 100644
--- a/src/matrix.js
+++ b/src/matrix.js
@@ -185,7 +185,7 @@ SVG.Matrix = SVG.invent({
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 (this instanceof SVG.Nested) {
+ if (this instanceof SVG.Doc && !this.isRoot()) {
var rect = this.rect(1, 1)
var m = rect.node.getScreenCTM()
rect.remove()
diff --git a/src/parent.js b/src/parent.js
index 0ff1765..d48e086 100644
--- a/src/parent.js
+++ b/src/parent.js
@@ -21,10 +21,8 @@ SVG.Parent = SVG.invent({
add: function (element, i) {
element = createElement(element)
- if (i == null) {
- this.node.appendChild(element.node)
- } else if (element.node !== this.node.children[i]) {
- this.node.insertBefore(element.node, this.node.children[i])
+ if (element.node !== this.node.children[i]) {
+ this.node.insertBefore(element.node, this.node.children[i] || null)
}
return this
diff --git a/src/parser.js b/src/parser.js
index c3ab7a4..84c8d77 100644
--- a/src/parser.js
+++ b/src/parser.js
@@ -11,7 +11,7 @@ SVG.parser = function () {
}
SVG.parser.nodes = {
- svg: new SVG.Nested().size(2, 0).css({
+ svg: SVG().size(2, 0).css({
opacity: 0,
position: 'absolute',
left: '-100%',
diff --git a/src/svg.js b/src/svg.js
index 4cb6f26..9b3bfd6 100644
--- a/src/svg.js
+++ b/src/svg.js
@@ -87,13 +87,15 @@ SVG.adopt = function (node) {
var element
// adopt with element-specific settings
- if (node.nodeName == 'svg')
+ if (node.nodeName === 'svg') {
element = new SVG.Doc(node)
- else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient')
+ } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') {
element = new SVG.Gradient(node)
} else if (SVG[capitalize(node.nodeName)]) {
element = new SVG[capitalize(node.nodeName)](node)
- } else { element = new SVG.Parent(node) }
+ } else {
+ element = new SVG.Parent(node)
+ }
return element
}