You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.9 KiB
JavaScript
54 lines
1.9 KiB
JavaScript
jsonToDOM.namespaces = {
|
|
html: "http://www.w3.org/1999/xhtml",
|
|
xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
|
};
|
|
jsonToDOM.defaultNamespace = jsonToDOM.namespaces.html;
|
|
|
|
function jsonToDOM(xml, doc, nodes) {
|
|
function namespace(name) {
|
|
var reElemNameParts = /^(?:(.*):)?(.*)$/.exec(name);
|
|
return { namespace: jsonToDOM.namespaces[reElemNameParts[1]], shortName: reElemNameParts[2] };
|
|
}
|
|
|
|
function tag(elemNameOrArray, elemAttr) {
|
|
if (Array.isArray(elemNameOrArray)) {
|
|
var frag = doc.createDocumentFragment();
|
|
Array.prototype.forEach.call(arguments, function(thisElem) {
|
|
frag.appendChild(tag.apply(null, thisElem));
|
|
});
|
|
return frag;
|
|
}
|
|
|
|
var elemNs = namespace(elemNameOrArray);
|
|
var elem = doc.createElementNS(elemNs.namespace || jsonToDOM.defaultNamespace, elemNs.shortName);
|
|
|
|
for (var key in elemAttr) {
|
|
var val = elemAttr[key];
|
|
if (nodes && key == "key") {
|
|
nodes[val] = elem;
|
|
continue;
|
|
}
|
|
|
|
var attrNs = namespace(key);
|
|
if (typeof val == "function") {
|
|
elem.addEventListener(key.replace(/^on/, ""), val, false);
|
|
} else {
|
|
elem.setAttributeNS(attrNs.namespace || "", attrNs.shortName, val);
|
|
}
|
|
}
|
|
|
|
var childElems = Array.prototype.slice.call(arguments, 2);
|
|
childElems.forEach(function(childElem) {
|
|
if (childElem != null) {
|
|
elem.appendChild(
|
|
typeof childElem == "object" ? tag.apply(null, childElem) :
|
|
childElem instanceof Node ? childElem :
|
|
doc.createTextNode(childElem)
|
|
);
|
|
}
|
|
});
|
|
|
|
return elem;
|
|
}
|
|
return tag.apply(null, xml);
|
|
} |