Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/Parse.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/Parse.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/Parse.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/Parse.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,282 @@ +/* + 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"); + +//TODO: determine dependencies +// currently has dependency on dojo.xml.DomUtil nodeTypes constants... + +// using documentFragment nomenclature to generalize in case we don't want to require passing a collection of nodes with a single parent + +dojo.xml.Parse = function(){ + // summary: + // generic class for taking a DOM node and parsing it into an object + // based on the "dojo tag name" of that node. + // + // supported dojoTagName's: + // <prefix:tag> => prefix:tag + // <dojo:tag> => dojo:tag + // <dojoTag> => dojo:tag + // <tag dojoType="type"> => dojo:type + // <tag dojoType="prefix:type"> => prefix:type + // <tag dojo:type="type"> => dojo:type + // <tag class="classa dojo-type classb"> => dojo:type + + var isIE = ((dojo.render.html.capable)&&(dojo.render.html.ie)); + + // get normalized (lowercase) tagName + // some browsers report tagNames in lowercase no matter what + function getTagName(node){ + /* + return ((node)&&(node["tagName"]) ? node.tagName.toLowerCase() : ''); + */ + try{ + return node.tagName.toLowerCase(); + }catch(e){ + return ""; + } + } + + // locate dojo qualified tag name + function getDojoTagName(node){ + var tagName = getTagName(node); + if (!tagName){ + return ''; + } + // any registered tag + if((dojo.widget)&&(dojo.widget.tags[tagName])){ + return tagName; + } + // <prefix:tag> => prefix:tag + var p = tagName.indexOf(":"); + if(p>=0){ + return tagName; + } + // <dojo:tag> => dojo:tag + 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; + } + // <dojoTag> => dojo:tag + if(tagName.substr(0,4) == "dojo"){ + // FIXME: this assumes tag names are always lower case + return "dojo:" + tagName.substring(4); + } + // <tag dojoType="prefix:type"> => prefix:type + // <tag dojoType="type"> => dojo:type + var djt = node.getAttribute("dojoType") || node.getAttribute("dojotype"); + if(djt){ + if (djt.indexOf(":")<0){ + djt = "dojo:"+djt; + } + return djt.toLowerCase(); + } + // <tag dojo:type="type"> => dojo:type + djt = node.getAttributeNS && node.getAttributeNS(dojo.dom.dojoml,"type"); + if(djt){ + return "dojo:" + djt.toLowerCase(); + } + // <tag dojo:type="type"> => dojo:type + try{ + // FIXME: IE really really doesn't like this, so we squelch errors for it + djt = node.getAttribute("dojo:type"); + }catch(e){ + // FIXME: log? + } + if(djt){ return "dojo:"+djt.toLowerCase(); } + // <tag class="classa dojo-type classb"> => dojo:type + if((dj_global["djConfig"])&&(!djConfig["ignoreClassNames"])){ + // FIXME: should we make this optionally enabled via djConfig? + var classes = node.className||node.getAttribute("class"); + // FIXME: following line, without check for existence of classes.indexOf + // breaks firefox 1.5's svg widgets + 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(); + } + } + } + } + // no dojo-qualified name + return ''; + } + + + this.parseElement = function( /*DomNode*/node, + /*Boolean*/hasParentNodeSet, + /*Boolean*/optimizeForDojoML, + /*Integer*/thisIdx ){ + // summary: + // recursively parse the passed node, returning a normalized data + // structure that represents the "attributes of interest" of said + // elements. If optimizeForDojoML is true, only nodes that contain + // a "dojo tag name" will be inspected for attributes. + // node: the DomNode to be treated as the root of inspection + // hasParentNodeSet: no-op, please pass "null" + // optimizeForDojoML: should we ignore non-Dojo nodes? Defaults to false. + // thisIdx: + // a way to specify a synthetic "index" property in the resulting + // data structure. Otherwise the index property of the top-level + // return element is always "0". + + // TODOC: document return structure of a non-trivial element set + + // run shortcuts to bail out of processing up front to save time and + // object alloc if possible. + var tagName = getTagName(node); + //There's a weird bug in IE where it counts end tags, e.g. </dojo:button> as nodes that should be parsed. Ignore these + if(isIE && tagName.indexOf("/")==0){ return null; } + + try{ + var attr = node.getAttribute("parseWidgets"); + if(attr && attr.toLowerCase() == "false"){ + return {}; + } + }catch(e){/*continue*/} + + + // look for a dojoml qualified name + // process dojoml only when optimizeForDojoML is true + 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; + // honor user namespace filters + 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]); + } + // FIXME: we might want to make this optional or provide cloning instead of + // referencing, but for now, we include a node reference to allow + // instantiated components to figure out their "roots" + 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: // element nodes, call this function recursively + 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 a single text node is the child, treat it as an attribute + if(node.childNodes.length == 1){ + parsedNodeSet[tagName].push({ value: node.childNodes.item(0).nodeValue }); + } + break; + default: break; + /* + case dojo.dom.ATTRIBUTE_NODE: // attribute node... not meaningful here + break; + case dojo.dom.CDATA_SECTION_NODE: // cdata section... not sure if this would ever be meaningful... might be... + break; + case dojo.dom.ENTITY_REFERENCE_NODE: // entity reference node... not meaningful here + break; + case dojo.dom.ENTITY_NODE: // entity node... not sure if this would ever be meaningful + break; + case dojo.dom.PROCESSING_INSTRUCTION_NODE: // processing instruction node... not meaningful here + break; + case dojo.dom.COMMENT_NODE: // comment node... not not sure if this would ever be meaningful + break; + case dojo.dom.DOCUMENT_NODE: // document node... not sure if this would ever be meaningful + break; + case dojo.dom.DOCUMENT_TYPE_NODE: // document type node... not meaningful here + break; + case dojo.dom.DOCUMENT_FRAGMENT_NODE: // document fragment node... not meaningful here + break; + case dojo.dom.NOTATION_NODE:// notation node... not meaningful here + break; + */ + } + } + //return (hasParentNodeSet) ? parsedNodeSet[node.tagName] : parsedNodeSet; + //if(parsedNodeSet.tagName)dojo.debug("parseElement: RETURNING NODE WITH TAGNAME "+parsedNodeSet.tagName); + return parsedNodeSet; + }; + + + /* parses a set of attributes on a node into an object tree */ + this.parseAttributes = function(/*DomNode*/node){ + // summary: + // creates an attribute object that maps attribute values for the + // passed node. Note that this is similar to creating a JSON + // representation of a DOM node. + // usage: + // a node with the following serialization: + // <div foo="bar" baz="thud">...</div> + // would yeild the following return structure when passed into this + // function: + // { + // "foo": { + // "value": "bar" + // }, + // "baz": { + // "value": "thud" + // } + // } + // + var parsedAttributeSet = {}; + var atts = node.attributes; + // TODO: should we allow for duplicate attributes at this point... + // would any of the relevant dom implementations even allow this? + 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; + }; +}; Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/Parse.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/Parse.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/Parse.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/XslTransform.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/XslTransform.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/XslTransform.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/XslTransform.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,249 @@ +/* + 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.XslTransform"); + +dojo.xml.XslTransform = function(/*String*/xsltUri){ + // summary: + // dojo.xml.XslTransform is a convenience object that takes the URI + // String of an XSL file as a constructor argument. After each + // transformation all parameters will be cleared. Transformation is + // supported by IE, Mozilla, and partially by Opera. Other browsers + // (notably Safari) have not yet exposed their transformation + // primtives well enough to be useful. + // xsltUri: + // Url of the xslt document to transform nodes with. Transformation is + // acheived with the transformTo* methods on instances of this class. + + dojo.debug("XslTransform is supported by Internet Explorer and Mozilla, with limited support in Opera 9 (no document function support)."); + var IS_IE = dojo.render.html.ie; + var ACTIVEX_DOMS = [ + "Msxml2.DOMDocument.5.0", + "Msxml2.DOMDocument.4.0", + "Msxml2.DOMDocument.3.0", + "MSXML2.DOMDocument", + "MSXML.DOMDocument", + "Microsoft.XMLDOM" + ]; + var ACTIVEX_FT_DOMS = [ + "Msxml2.FreeThreadedDOMDocument.5.0", + "MSXML2.FreeThreadedDOMDocument.4.0", + "MSXML2.FreeThreadedDOMDocument.3.0" + ]; + var ACTIVEX_TEMPLATES = [ + "Msxml2.XSLTemplate.5.0", + "Msxml2.XSLTemplate.4.0", + "MSXML2.XSLTemplate.3.0" + ]; + + function getActiveXImpl(activeXArray){ + for(var i=0; i < activeXArray.length; i++){ + try{ + var testObj = new ActiveXObject(activeXArray[i]); + if(testObj){ + return activeXArray[i]; + } + }catch(e){} + } + dojo.raise("Could not find an ActiveX implementation in:\n\n " + activeXArray); + } + + if(xsltUri == null || xsltUri == undefined){ + dojo.raise("You must pass the URI String for the XSL file to be used!"); + return false; + } + + var xsltDocument = null; + var xsltProcessor = null; + if(IS_IE){ + xsltDocument = new ActiveXObject(getActiveXImpl(ACTIVEX_FT_DOMS)); + xsltDocument.async = false; + }else{ + xsltProcessor = new XSLTProcessor(); + xsltDocument = document.implementation.createDocument("", "", null); + xsltDocument.addEventListener("load", onXslLoad, false); + } + xsltDocument.load(xsltUri); + + if(IS_IE){ + var xslt = new ActiveXObject(getActiveXImpl(ACTIVEX_TEMPLATES)); + xslt.stylesheet = xsltDocument; + xsltProcessor = xslt.createProcessor(); + } + + function onXslLoad(){ + xsltProcessor.importStylesheet(xsltDocument); + } + + function getResultDom(xmlDoc, params){ + if(IS_IE){ + addIeParams(params); + var result = getIeResultDom(xmlDoc); + removeIeParams(params); + return result; + }else{ + return getMozillaResultDom(xmlDoc, params); + } + } + + function addIeParams(params){ + if(!params){ return; } + for(var i=0; i<params.length; i++){ + xsltProcessor.addParameter(params[i][0], params[i][1]); + } + } + + function removeIeParams(params){ + if(!params){ return; } + for(var i=0; i<params.length; i++){ + xsltProcessor.addParameter(params[i][0], ""); + } + } + + function getIeResultDom(xmlDoc){ + xsltProcessor.input = xmlDoc; + var outDoc = new ActiveXObject(getActiveXImpl(ACTIVEX_DOMS)); + outDoc.async = false; + outDoc.validateOnParse = false; + xsltProcessor.output = outDoc; + xsltProcessor.transform(); + if(outDoc.parseError.errorCode != 0){ + var err = outDoc.parseError; + dojo.raise("err.errorCode: " + err.errorCode + "\n\nerr.reason: " + err.reason + "\n\nerr.url: " + err.url + "\n\nerr.srcText: " + err.srcText); + } + return outDoc; + } + + function getIeResultStr(xmlDoc, params){ + xsltProcessor.input = xmlDoc; + xsltProcessor.transform(); + return xsltProcessor.output; + } + + function addMozillaParams(params){ + if(!params){ return; } + for(var i=0; i<params.length; i++){ + xsltProcessor.setParameter(null, params[i][0], params[i][1]); + } + } + + function getMozillaResultDom(xmlDoc, params){ + addMozillaParams(params); + var resultDoc = xsltProcessor.transformToDocument(xmlDoc); + xsltProcessor.clearParameters(); + return resultDoc; + } + + function getMozillaResultStr(xmlDoc, params, parentDoc){ + addMozillaParams(params); + var resultDoc = xsltProcessor.transformToFragment(xmlDoc, parentDoc); + var serializer = new XMLSerializer(); + xsltProcessor.clearParameters(); + return serializer.serializeToString(resultDoc); + } + + this.getResultString = function( /*XMLDocument*/xmlDoc, + /*2 Dimensional Array*/params, + /*HTMLDocument*/parentDoc){ + // summary: + // transform the xmlDoc and return the result as a string. + // xmlDoc: an XML Document to transform + // params: + // a set of configuration parameters to pass to the transformation + // engine. + // parentDoc: The HTML docuemnt to transform the subdocument "under" + var content = null; + if(IS_IE){ + addIeParams(params); + content = getIeResultStr(xmlDoc, params); + removeIeParams(params); + }else{ + content = getMozillaResultStr(xmlDoc, params, parentDoc); + } + //dojo.debug(content); + return content; + }; + + this.transformToContentPane = function( /*XMLDocument*/xmlDoc, + /*2 Dimensional Array*/params, + /*ContentPane*/contentPane, + /*HTMLDocument*/parentDoc){ + // summary: + // transform the xmlDoc and put the result into the passed + // ContentPane instance + // xmlDoc: an XML Document to transform + // params: + // a set of configuration parameters to pass to the transformation + // engine. + // contentPane: + // instance of dojo.widget.ContentPane to assign the transform + // results to + // parentDoc: The HTML docuemnt to transform the subdocument "under" + + // FIXME: do we need this function? + var content = this.getResultString(xmlDoc, params, parentDoc); + contentPane.setContent(content); + }; + + this.transformToRegion = function( /*XMLDocument*/xmlDoc, + /*2 Dimensional Array*/params, + /*HTMLElement*/region, + /*HTMLDocument*/parentDoc){ + // summary: + // transform the xmlDoc and put the result into the passed + // DomNode using innerHTML + // xmlDoc: an XML Document to transform + // params: + // a set of configuration parameters to pass to the transformation + // engine. + // region: node to put transform results in + // parentDoc: The HTML docuemnt to transform the subdocument "under" + try{ + var content = this.getResultString(xmlDoc, params, parentDoc); + region.innerHTML = content; + }catch (e){ + dojo.raise(e.message + "\n\n xsltUri: " + xsltUri) + } + }; + + this.transformToDocument = function( /*XMLDocument*/ xmlDoc, + /*2 Dimensional Array*/params){ + // summary: + // transform the xmlDoc and return a new XML document containing + // the result + // xmlDoc: an XML Document to transform + // params: + // a set of configuration parameters to pass to the transformation + // engine. + return getResultDom(xmlDoc, params); // XMLDocument + } + + this.transformToWindow = function( /*XMLDocument*/ xmlDoc, + /*2 Dimensional Array*/params, + /*HTMLDocument*/windowDoc, + /*HTMLDocument*/parentDoc){ + // summary: + // transform the xmlDoc and put the contents in the passed + // windowDoc, blowing away any previous contents. + // xmlDoc: an XML Document to transform + // params: + // a set of configuration parameters to pass to the transformation + // engine. + // windowDoc: the HTMLDocument to assign the contents to + // parentDoc: The HTML docuemnt to transform the subdocument "under" + try{ + windowDoc.open(); + windowDoc.write(this.getResultString(xmlDoc, params, parentDoc)); + windowDoc.close(); + }catch(e){ + dojo.raise(e.message + "\n\n xsltUri: " + xsltUri) + } + }; +}; Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/XslTransform.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/XslTransform.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/__package__.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/__package__.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/__package__.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/__package__.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,17 @@ +/* + 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.require("dojo.xml.Parse"); +dojo.kwCompoundRequire({ + common: ["dojo.dom"], + browser: ["dojo.html.*"], + dashboard: ["dojo.html.*"] +}); +dojo.provide("dojo.xml.*"); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/__package__.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/__package__.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/xml/__package__.js ------------------------------------------------------------------------------ svn:mime-type = text/plain |
Free forum by Nabble | Edit this page |