From e44a7e37b6c7b5961adaffc62b9042b8d442938e Mon Sep 17 00:00:00 2001 From: mensonge Date: Thu, 13 Nov 2008 09:49:11 +0000 Subject: New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f --- includes/js/dojox/wire/XmlWire.js | 244 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 includes/js/dojox/wire/XmlWire.js (limited to 'includes/js/dojox/wire/XmlWire.js') diff --git a/includes/js/dojox/wire/XmlWire.js b/includes/js/dojox/wire/XmlWire.js new file mode 100644 index 0000000..dc5666f --- /dev/null +++ b/includes/js/dojox/wire/XmlWire.js @@ -0,0 +1,244 @@ +if(!dojo._hasResource["dojox.wire.XmlWire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.XmlWire"] = true; +dojo.provide("dojox.wire.XmlWire"); + +dojo.require("dojox.data.dom"); +dojo.require("dojox.wire.Wire"); + +dojo.declare("dojox.wire.XmlWire", dojox.wire.Wire, { + // summary: + // A Wire for XML nodes or values (element, attribute and text) + // description: + // This class accesses XML nodes or value with a simplified XPath + // specified to 'path' property. + // The root object for this class must be an DOM document or element + // node. + // "@name" accesses to an attribute value of an element and "text()" + // accesses to a text value of an element. + // The hierarchy of the elements from the root node can be specified + // with slash-separated list, such as "a/b/@c", which specifies + // the value of an attribute named "c" of an element named "b" as + // a child of another element named "a" of a child of the root node. + + _wireClass: "dojox.wire.XmlWire", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // 'args' is just mixed in with no further processing. + // args: + // Arguments to initialize properties + // path: + // A simplified XPath to an attribute, a text or elements + }, + _getValue: function(/*Node*/object){ + // summary: + // Return an attribute value, a text value or an array of elements + // description: + // This method first uses a root node passed in 'object' argument + // and 'path' property to identify an attribute, a text or + // elements. + // If 'path' starts with a slash (absolute), the first path + // segment is ignored assuming it point to the root node. + // (That is, "/a/b/@c" and "b/@c" against a root node access + // the same attribute value, assuming the root node is an element + // with a tag name, "a".) + // object: + // A root node + // returns: + // A value found, otherwise 'undefined' + if(!object || !this.path){ + return object; //Node + } + + var node = object; + var path = this.path; + if(path.charAt(0) == '/'){ // absolute + // skip the first expression (supposed to select the top node) + var i = path.indexOf('/', 1); + path = path.substring(i + 1); + } + var list = path.split('/'); + var last = list.length - 1; + for(var i = 0; i < last; i++){ + node = this._getChildNode(node, list[i]); + if(!node){ + return undefined; //undefined + } + } + var value = this._getNodeValue(node, list[last]); + return value; //String||Array + }, + + _setValue: function(/*Node*/object, /*String*/value){ + // summary: + // Set an attribute value or a child text value to an element + // description: + // This method first uses a root node passed in 'object' argument + // and 'path' property to identify an attribute, a text or + // elements. + // If an intermediate element does not exist, it creates + // an element of the tag name in the 'path' segment as a child + // node of the current node. + // Finally, 'value' argument is set to an attribute or a text + // (a child node) of the leaf element. + // object: + // A root node + // value: + // A value to set + if(!this.path){ + return object; //Node + } + + var node = object; + var doc = this._getDocument(node); + var path = this.path; + if(path.charAt(0) == '/'){ // absolute + var i = path.indexOf('/', 1); + if(!node){ + var name = path.substring(1, i); + node = doc.createElement(name); + object = node; // to be returned as a new object + } + // skip the first expression (supposed to select the top node) + path = path.substring(i + 1); + }else{ + if(!node){ + return undefined; //undefined + } + } + + var list = path.split('/'); + var last = list.length - 1; + for(var i = 0; i < last; i++){ + var child = this._getChildNode(node, list[i]); + if(!child){ + child = doc.createElement(list[i]); + node.appendChild(child); + } + node = child; + } + this._setNodeValue(node, list[last], value); + return object; //Node + }, + + _getNodeValue: function(/*Node*/node, /*String*/exp){ + // summary: + // Return an attribute value, a text value or an array of elements + // description: + // If 'exp' starts with '@', an attribute value of the specified + // attribute is returned. + // If 'exp' is "text()", a child text value is returned. + // Otherwise, an array of child elements, the tag name of which + // match 'exp', is returned. + // node: + // A node + // exp: + // An expression for attribute, text or elements + // returns: + // A value found, otherwise 'undefined' + var value = undefined; + if(exp.charAt(0) == '@'){ + var attribute = exp.substring(1); + value = node.getAttribute(attribute); + }else if(exp == "text()"){ + var text = node.firstChild; + if(text){ + value = text.nodeValue; + } + }else{ // assume elements + value = []; + for(var i = 0; i < node.childNodes.length; i++){ + var child = node.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == exp){ + value.push(child); + } + } + } + return value; //String||Array + }, + + _setNodeValue: function(/*Node*/node, /*String*/exp, /*String*/value){ + // summary: + // Set an attribute value or a child text value to an element + // description: + // If 'exp' starts with '@', 'value' is set to the specified + // attribute. + // If 'exp' is "text()", 'value' is set to a child text. + // node: + // A node + // exp: + // An expression for attribute or text + // value: + // A value to set + if(exp.charAt(0) == '@'){ + var attribute = exp.substring(1); + if(value){ + node.setAttribute(attribute, value); + }else{ + node.removeAttribute(attribute); + } + }else if(exp == "text()"){ + while(node.firstChild){ + node.removeChild(node.firstChild); + } + if(value){ + var text = this._getDocument(node).createTextNode(value); + node.appendChild(text); + } + } + // else not supported + }, + + _getChildNode: function(/*Node*/node, /*String*/name){ + // summary: + // Return a child node + // description: + // A child element of the tag name specified with 'name' is + // returned. + // If 'name' ends with an array index, it is used to pick up + // the corresponding element from multiple child elements. + // node: + // A parent node + // name: + // A tag name + // returns: + // A child node + var index = 1; + var i1 = name.indexOf('['); + if(i1 >= 0){ + var i2 = name.indexOf(']'); + index = name.substring(i1 + 1, i2); + name = name.substring(0, i1); + } + var count = 1; + for(var i = 0; i < node.childNodes.length; i++){ + var child = node.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == name){ + if(count == index){ + return child; //Node + } + count++; + } + } + return null; //null + }, + + _getDocument: function(/*Node*/node){ + // summary: + // Return a DOM document + // description: + // If 'node' is specified, a DOM document of the node is returned. + // Otherwise, a DOM document is created. + // returns: + // A DOM document + if(node){ + return (node.nodeType == 9 /* DOCUMENT_NODE */ ? node : node.ownerDocument); //Document + }else{ + return dojox.data.dom.createDocument(); //Document + } + } +}); + +} -- cgit v1.2.3