diff inkscape/firefox/jqXMLUtils.js @ 272:01439f28d0bd

Check-in primitive integrated madbuilder code.
author wycc
date Mon, 26 Jan 2009 01:36:04 +0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inkscape/firefox/jqXMLUtils.js	Mon Jan 26 01:36:04 2009 +0800
@@ -0,0 +1,250 @@
+/*
+	This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+(function($) {
+	//Converts XML DOM to JSON
+	$.extend ({
+		xmlToJSON: function(xdoc) {
+		try {
+			if(!xdoc){ return null; }
+			var tmpObj = {};
+				tmpObj.typeOf = "JSXBObject";
+			var xroot = (xdoc.nodeType == 9)?xdoc.documentElement:xdoc;
+				tmpObj.RootName = xroot.nodeName || "";
+			if(xdoc.nodeType == 3 || xdoc.nodeType == 4) {
+				return xdoc.nodeValue;
+			}
+			var isNumeric = function(s) {
+				var testStr = "";
+				if(s && typeof s == "string") { testStr = s; }
+				var pattern = /^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/;
+				return pattern.test(testStr);
+			};
+			//Alters attribute and collection names to comply with JS
+			function formatName(name) {
+				var regEx = /-/g;
+				var tName = String(name).replace(regEx,"_");
+				return tName;
+			}			
+			//Set Attributes of an object
+			function setAttributes(obj, node) {
+				if(node.attributes.length > 0) {
+					var a = node.attributes.length-1;
+					var attName;
+					obj._attributes = [];
+					do { //Order is irrelevant (speed-up)
+						attName = String(formatName(node.attributes[a].name));
+						obj._attributes.push(attName);				
+						obj[attName] = $.trim(node.attributes[a].value);
+					} while(a--);
+				}
+			}
+			//Set collections
+			function setHelpers(grpObj) {
+				//Selects a node withing array where attribute = value
+				grpObj.getNodeByAttribute = function(attr, obj) {
+					if(this.length > 0) {
+						var cNode;
+						var maxLen = this.length -1;
+						try {
+							do {
+								cNode = this[maxLen];
+								if(cNode[attr] == obj) {
+									return cNode;
+								}
+							} while(maxLen--);
+						} catch(e) {return false;}
+						return false;
+					}
+				};
+				
+				grpObj.contains = function(attr, obj) {
+					if(this.length > 0) {
+						var maxLen = this.length -1;
+						try {
+							do {
+								if(this[maxLen][attr] == obj) {
+									return true;
+								}
+							} while(maxLen--);
+						} catch(e) {return false;}
+						return false;
+					}
+				};
+				
+				grpObj.indexOf = function(attr, obj) {
+					var pos = -1;
+					if(this.length > 0) {
+						var maxLen = this.length -1;
+						try {
+							do {
+								if(this[maxLen][attr] == obj) {
+									pos = maxLen;
+								}
+							} while(maxLen--);
+						} catch(e) {return -1;}
+						return pos;
+					}
+				};
+				
+				grpObj.SortByAttribute = function(col, dir) {
+					if(this.length) {				
+						function getValue(pair, idx) {
+							var out = pair[idx];
+							out = (isNumeric(out))?parseFloat(out):out;
+							return out;
+						}
+						function sortFn(a, b) {
+							var res = 0;
+							var tA, tB;						
+							tA = getValue(a, col);
+							tB = getValue(b, col);
+							if(tA < tB) { res = -1;	} else if(tB < tA) { res = 1; }
+							if(dir) {
+								res = (dir.toUpperCase() == "DESC")?(0 - res):res;
+							}
+							return res;
+						}
+						this.sort(sortFn);
+					}
+				};
+				
+				grpObj.SortByValue = function(dir) {
+					if(this.length) {
+						function getValue(pair) {
+							var out = pair.Text;
+							out = (isNumeric(out))?parseFloat(out):out;
+							return out;
+						}
+						function sortFn(a, b) {
+							var res = 0;
+							var tA, tB;
+							tA = getValue(a);
+							tB = getValue(b);
+							if(tA < tB) { res = -1;	} else if(tB < tA) { res = 1; }
+							if(dir) {
+								res = (dir.toUpperCase() == "DESC")?(0 - res):res;
+							}
+							return res;
+						}
+						this.sort(sortFn);
+					}
+				};
+				grpObj.SortByNode = function(node, dir) {
+					if(this.length) {
+						function getValue(pair, node) {
+							var out = pair[node][0].Text;
+							out = (isNumeric(out))?parseFloat(out):out;
+							return out;
+						}
+						function sortFn(a, b) {
+							var res = 0;
+							var tA, tB;
+							tA = getValue(a, node);
+							tB = getValue(b, node);
+							if(tA < tB) { res = -1;	} else if(tB < tA) { res = 1; }
+							if(dir) {
+								res = (dir.toUpperCase() == "DESC")?(0 - res):res;
+							}
+							return res;
+						}
+						this.sort(sortFn);
+					}
+				};
+			}
+			//Recursive JSON Assembler
+			//Set Object Nodes
+			function setObjects(obj, node) {
+				var elemName;	//Element name
+				var cnode;	//Current Node
+				var tObj;	//New subnode
+				var cName = "";
+				if(!node) { return null; }				
+				//Set node attributes if any
+				if(node.attributes.length > 0){setAttributes(obj, node);}				
+				obj.Text = "";
+				if(node.hasChildNodes()) {
+					var nodeCount = node.childNodes.length - 1;	
+					var n = 0;
+					do { //Order is irrelevant (speed-up)
+						cnode = node.childNodes[n];
+						switch(cnode.nodeType) {
+							case 1: //Node
+							//Process child nodes
+							obj._children = [];
+							//SOAP XML FIX to remove namespaces (i.e. soapenv:)
+							elemName = (cnode.localName)?cnode.localName:cnode.baseName;
+							elemName = formatName(elemName);
+							if(cName != elemName) { obj._children.push(elemName); }
+								//Create sub elemns array
+								if(!obj[elemName]) {
+									obj[elemName] = []; //Create Collection
+								}
+								tObj = {};
+								obj[elemName].push(tObj);
+								if(cnode.attributes.length > 0) {
+									setAttributes(tObj, cnode);
+								}
+								//Set Helper functions (contains, indexOf, sort, etc);
+								if(!obj[elemName].contains) {
+									setHelpers(obj[elemName]);
+								}	
+							cName = elemName;
+							if(cnode.hasChildNodes()) {
+								setObjects(tObj, cnode); //Recursive Call
+							}
+							break;
+							case 3: //Text Value
+							obj.Text += $.trim(cnode.nodeValue);
+							break;
+							case 4: //CDATA
+							obj.Text += (cnode.text)?$.trim(cnode.text):$.trim(cnode.nodeValue);
+							break;
+						}
+					} while(n++ < nodeCount);
+				}
+			}						
+			//RUN
+			setObjects(tmpObj, xroot);
+			//Clean-up memmory
+			xdoc = null;
+			xroot = null;
+			return tmpObj;
+			
+			} catch(e) {
+				return null;	
+			}
+		}		
+	});
+	
+	//Converts Text to XML DOM
+	$.extend({
+		textToXML: function(strXML) {
+			var xmlDoc = null;
+			try {
+				xmlDoc = ($.browser.msie)?new ActiveXObject("Microsoft.XMLDOM"):new DOMParser();
+				xmlDoc.async = false;
+			} catch(e) {throw new Error("XML Parser could not be instantiated");}
+			var out;
+			try {
+				if($.browser.msie) {
+					out = (xmlDoc.loadXML(strXML))?xmlDoc:false;
+				} else {		
+					out = xmlDoc.parseFromString(strXML, "text/xml");
+				}
+			} catch(e) { throw new Error("Error parsing XML string"); }
+			return out;
+		}
+	});
+})(jQuery);
\ No newline at end of file