| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.xml.Parse"); |
| dojo.require("dojo.dom"); |
| dojo.xml.Parse = function () { |
| var isIE = ((dojo.render.html.capable) && (dojo.render.html.ie)); |
| function getTagName(node) { |
| try { |
| return node.tagName.toLowerCase(); |
| } |
| catch (e) { |
| return ""; |
| } |
| } |
| function getDojoTagName(node) { |
| var tagName = getTagName(node); |
| if (!tagName) { |
| return ""; |
| } |
| if ((dojo.widget) && (dojo.widget.tags[tagName])) { |
| return tagName; |
| } |
| var p = tagName.indexOf(":"); |
| if (p >= 0) { |
| return tagName; |
| } |
| if (tagName.substr(0, 5) == "dojo:") { |
| return tagName; |
| } |
| if (dojo.render.html.capable && dojo.render.html.ie && node.scopeName != "HTML") { |
| return node.scopeName.toLowerCase() + ":" + tagName; |
| } |
| if (tagName.substr(0, 4) == "dojo") { |
| return "dojo:" + tagName.substring(4); |
| } |
| var djt = node.getAttribute("dojoType") || node.getAttribute("dojotype"); |
| if (djt) { |
| if (djt.indexOf(":") < 0) { |
| djt = "dojo:" + djt; |
| } |
| return djt.toLowerCase(); |
| } |
| djt = node.getAttributeNS && node.getAttributeNS(dojo.dom.dojoml, "type"); |
| if (djt) { |
| return "dojo:" + djt.toLowerCase(); |
| } |
| try { |
| djt = node.getAttribute("dojo:type"); |
| } |
| catch (e) { |
| } |
| if (djt) { |
| return "dojo:" + djt.toLowerCase(); |
| } |
| if ((dj_global["djConfig"]) && (!djConfig["ignoreClassNames"])) { |
| var classes = node.className || node.getAttribute("class"); |
| if ((classes) && (classes.indexOf) && (classes.indexOf("dojo-") != -1)) { |
| var aclasses = classes.split(" "); |
| for (var x = 0, c = aclasses.length; x < c; x++) { |
| if (aclasses[x].slice(0, 5) == "dojo-") { |
| return "dojo:" + aclasses[x].substr(5).toLowerCase(); |
| } |
| } |
| } |
| } |
| return ""; |
| } |
| this.parseElement = function (node, hasParentNodeSet, optimizeForDojoML, thisIdx) { |
| var tagName = getTagName(node); |
| if (isIE && tagName.indexOf("/") == 0) { |
| return null; |
| } |
| try { |
| var attr = node.getAttribute("parseWidgets"); |
| if (attr && attr.toLowerCase() == "false") { |
| return {}; |
| } |
| } |
| catch (e) { |
| } |
| var process = true; |
| if (optimizeForDojoML) { |
| var dojoTagName = getDojoTagName(node); |
| tagName = dojoTagName || tagName; |
| process = Boolean(dojoTagName); |
| } |
| var parsedNodeSet = {}; |
| parsedNodeSet[tagName] = []; |
| var pos = tagName.indexOf(":"); |
| if (pos > 0) { |
| var ns = tagName.substring(0, pos); |
| parsedNodeSet["ns"] = ns; |
| if ((dojo.ns) && (!dojo.ns.allow(ns))) { |
| process = false; |
| } |
| } |
| if (process) { |
| var attributeSet = this.parseAttributes(node); |
| for (var attr in attributeSet) { |
| if ((!parsedNodeSet[tagName][attr]) || (typeof parsedNodeSet[tagName][attr] != "array")) { |
| parsedNodeSet[tagName][attr] = []; |
| } |
| parsedNodeSet[tagName][attr].push(attributeSet[attr]); |
| } |
| parsedNodeSet[tagName].nodeRef = node; |
| parsedNodeSet.tagName = tagName; |
| parsedNodeSet.index = thisIdx || 0; |
| } |
| var count = 0; |
| for (var i = 0; i < node.childNodes.length; i++) { |
| var tcn = node.childNodes.item(i); |
| switch (tcn.nodeType) { |
| case dojo.dom.ELEMENT_NODE: |
| var ctn = getDojoTagName(tcn) || getTagName(tcn); |
| if (!parsedNodeSet[ctn]) { |
| parsedNodeSet[ctn] = []; |
| } |
| parsedNodeSet[ctn].push(this.parseElement(tcn, true, optimizeForDojoML, count)); |
| if ((tcn.childNodes.length == 1) && (tcn.childNodes.item(0).nodeType == dojo.dom.TEXT_NODE)) { |
| parsedNodeSet[ctn][parsedNodeSet[ctn].length - 1].value = tcn.childNodes.item(0).nodeValue; |
| } |
| count++; |
| break; |
| case dojo.dom.TEXT_NODE: |
| if (node.childNodes.length == 1) { |
| parsedNodeSet[tagName].push({value:node.childNodes.item(0).nodeValue}); |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| return parsedNodeSet; |
| }; |
| this.parseAttributes = function (node) { |
| var parsedAttributeSet = {}; |
| var atts = node.attributes; |
| var attnode, i = 0; |
| while ((attnode = atts[i++])) { |
| if (isIE) { |
| if (!attnode) { |
| continue; |
| } |
| if ((typeof attnode == "object") && (typeof attnode.nodeValue == "undefined") || (attnode.nodeValue == null) || (attnode.nodeValue == "")) { |
| continue; |
| } |
| } |
| var nn = attnode.nodeName.split(":"); |
| nn = (nn.length == 2) ? nn[1] : attnode.nodeName; |
| parsedAttributeSet[nn] = {value:attnode.nodeValue}; |
| } |
| return parsedAttributeSet; |
| }; |
| }; |
| |