UNPKG

3.64 kBJavaScriptView Raw
1const K = window.K;
2
3// -----------------------------------------------------------------------------
4// SVG Prototypes
5// -----------------------------------------------------------------------------
6
7K.NateSvgDomProto = Object.assign({}, K.NateAbstractDomProto, K.BSC.NateSvgProto,
8{
9 init(parentOrElem, namespace)
10 {
11 K.NateAbstractDomProto.init.call(this, parentOrElem, namespace);
12
13 // Check the type of parentOrElem.
14 const isInstanceOfSvgDom = (parentOrElem instanceof K.NateSvgDom);
15 const isElemOrText = K.Elem.isElem(parentOrElem) || K.Elem.isText(parentOrElem);
16
17 if ((!isInstanceOfSvgDom) && (!isElemOrText))
18 {
19 throw 'parentOrElem should be Nate object or html-element';
20 }
21 },
22
23 _getDefaultNamespace()
24 {
25 return K.nateSvgDomNamespace;
26 },
27
28 newSVGElement(tag, params)
29 {
30 const elem = document.createElementNS('http://www.w3.org/2000/svg', tag);
31 const newNate = new K.NateSvgDom(elem);
32
33 this.addNateChild(newNate);
34
35 if (K.Object.isNotNull(params))
36 {
37 for (const k in params)
38 {
39 newNate.set(k, params[k]);
40 }
41 }
42
43 return newNate;
44 },
45
46 clear()
47 {
48 this.deleteAllChildren();
49 }
50});
51
52// -----------------------------------------------------------------------------
53// SVG namespace
54// -----------------------------------------------------------------------------
55
56K.nateSvgDomNamespace =
57 K.BSC.NateNamespace('SvgDom', {nateProto: K.NateSvgDomProto})
58
59// -----------------------------------------------------------------------------
60// SVG tags
61// -----------------------------------------------------------------------------
62
63K.BSC.nateSvgCommonOpenCloseAtOnceTags.forEach((tagName) => {
64 K.nateSvgDomNamespace.addCreateFunction(tagName, K.NateSvgDomProto.newSVGElement);
65})
66
67K.BSC.nateSvgCommonTags.forEach((tagName) => {
68 K.nateSvgDomNamespace.addCreateFunction(tagName, K.NateSvgDomProto.newSVGElement);
69})
70
71// -----------------------------------------------------------------------------
72// SVG property setters
73// -----------------------------------------------------------------------------
74
75K.BSC.nateSvgAttributes.forEach((key) => {
76 K.nateSvgDomNamespace.addSetter(key, K.NateHtmlDomProto.commonAttributeSetter)
77})
78
79// Special case: overload default handler for xlink:href.
80K.nateSvgDomNamespace.addSetter('xlink:href', (nNode, key, value) => {
81 nNode.elem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', value);
82})
83
84// Href should works too.
85// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
86// "Note: SVG 2 removed the need for the xlink namespace, so instead of xlink:href you
87// should use href."
88K.nateSvgDomNamespace.addSetter('href', (nNode, key, value) => {
89 nNode.elem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', value);
90})
91
92// This is not a standard, but Firefox and Chrome implement it in theirs DOMs,
93// so we keep this call for compatibility.
94K.nateSvgDomNamespace.addSetter('textContent', K.NateAbstractDomProto.commonInnerContentSetter)
95K.nateSvgDomNamespace.addSetter('innerHTML' , K.NateAbstractDomProto.commonInnerContentSetter)
96
97// -----------------------------------------------------------------------------
98// SVG factory functions
99// -----------------------------------------------------------------------------
100
101K.NateSvgDom = K.nateSvgDomNamespace.createFactoryFunction(K.NateSvgDomProto);