summaryrefslogtreecommitdiffstats
path: root/src/utils/adopter.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/adopter.js')
-rw-r--r--src/utils/adopter.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/utils/adopter.js b/src/utils/adopter.js
new file mode 100644
index 0000000..8017359
--- /dev/null
+++ b/src/utils/adopter.js
@@ -0,0 +1,115 @@
+import { capitalize } from './utils.js'
+import { ns } from '../modules/core/namespaces.js'
+import Base from '../types/Base.js'
+
+const elements = {}
+export const root = Symbol('root')
+
+// Method for element creation
+export function makeNode (name) {
+ // create element
+ return document.createElementNS(ns, name)
+}
+
+export function makeInstance (element) {
+ if (element instanceof Base) return element
+
+ if (typeof element === 'object') {
+ return adopt(element)
+ }
+
+ if (element == null) {
+ return new elements[root]()
+ }
+
+ if (typeof element === 'string' && element.charAt(0) !== '<') {
+ return adopt(document.querySelector(element))
+ }
+
+ var node = makeNode('svg')
+ node.innerHTML = element
+
+ // We can use firstChild here because we know,
+ // that the first char is < and thus an element
+ element = adopt(node.firstChild)
+
+ return element
+}
+
+export function nodeOrNew (name, node) {
+ return node || makeNode(name)
+}
+
+// Adopt existing svg elements
+export function adopt (node) {
+ // check for presence of node
+ if (!node) return null
+
+ // make sure a node isn't already adopted
+ if (node.instance instanceof Base) return node.instance
+
+ if (!(node instanceof window.SVGElement)) {
+ return new elements.HtmlNode(node)
+ }
+
+ // initialize variables
+ var element
+
+ // adopt with element-specific settings
+ if (node.nodeName === 'svg') {
+ element = new elements[root](node)
+ } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') {
+ element = new elements.Gradient(node)
+ } else if (elements[capitalize(node.nodeName)]) {
+ element = new elements[capitalize(node.nodeName)](node)
+ } else {
+ element = new elements.Bare(node)
+ }
+
+ return element
+}
+
+export function register (element, name = element.name, asRoot = false) {
+ elements[name] = element
+ if (asRoot) elements[root] = element
+ return element
+}
+
+export function getClass (name) {
+ return elements[name]
+}
+
+// Element id sequence
+let did = 1000
+
+// Get next named element id
+export function eid (name) {
+ return 'Svgjs' + capitalize(name) + (did++)
+}
+
+// Deep new id assignment
+export function assignNewId (node) {
+ // do the same for SVG child nodes as well
+ for (var i = node.children.length - 1; i >= 0; i--) {
+ assignNewId(node.children[i])
+ }
+
+ if (node.id) {
+ return adopt(node).id(eid(node.nodeName))
+ }
+
+ return adopt(node)
+}
+
+// Method for extending objects
+export function extend (modules, methods) {
+ var key, i
+
+ modules = Array.isArray(modules) ? modules : [modules]
+
+ for (i = modules.length - 1; i >= 0; i--) {
+ for (key in methods) {
+ modules[i].prototype[key] = methods[key]
+ }
+ }
+}