mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-30 11:53:57 +01:00
248 lines
8.7 KiB
JavaScript
248 lines
8.7 KiB
JavaScript
/*
|
|
Copyright (c) 2003 Jan-Klaas Kollhof
|
|
|
|
This file is part of the JavaScript o lait library(jsolait).
|
|
|
|
jsolait is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This software 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 Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
along with this software; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
/**
|
|
Provides parseXML and an importNode implementation.
|
|
*/
|
|
Module("xml","1.1.2", function(mod){
|
|
/**
|
|
Thrown if no parser could be instanciated.
|
|
*/
|
|
mod.NoXMLParser=Class("NoXMLParser", mod.Exception, function(publ, supr){
|
|
/**
|
|
Initializes the Exception.
|
|
@param trace The error causing the Exception.
|
|
*/
|
|
publ.init=function(trace){
|
|
supr(this).init("Could not create an XML parser.", trace);
|
|
}
|
|
})
|
|
/**
|
|
Thrown if a document could not be parsed.
|
|
*/
|
|
mod.ParsingFailed=Class("ParsingFailed", mod.Exception, function(publ, supr){
|
|
/**
|
|
Initializes the Exception.
|
|
@param xml The xml source which could not be parsed.
|
|
@param trace The error causing this Exception.
|
|
*/
|
|
publ.init=function(xml,trace){
|
|
supr(this).init("Failed parsing XML document.",trace);
|
|
this.xml = xml;
|
|
}
|
|
///The xml source which could not be parsed.
|
|
publ.xml;
|
|
})
|
|
/**
|
|
Parses an xml document.
|
|
@param xml The xml text.
|
|
@return A DOM of the xml document.
|
|
*/
|
|
mod.parseXML=function(xml){
|
|
var obj=null;
|
|
var isMoz=false;
|
|
var isIE=false;
|
|
var isASV=false;
|
|
|
|
try{//to get Adobe's SVG parseXML
|
|
var p=window.parseXML;
|
|
if(p==null){
|
|
throw "No ASV paseXML";
|
|
}
|
|
isASV=true;
|
|
}catch(e){
|
|
try{//to get the mozilla parser
|
|
obj = new DOMParser();
|
|
isMoz=true;
|
|
}catch(e){
|
|
try{//to get the MS XML parser
|
|
obj = new ActiveXObject("Msxml2.DomDocument.4.0");
|
|
isIE=true;
|
|
}catch(e){
|
|
try{//to get the MS XML parser
|
|
obj = new ActiveXObject("Msxml2.DomDocument");
|
|
isIE=true;
|
|
}catch(e){
|
|
try{//to get the old MS XML parser
|
|
obj = new ActiveXObject("microsoft.XMLDOM");
|
|
isIE=true;
|
|
}catch(e){
|
|
throw new mod.NoXMLParser(e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
try{
|
|
if(isMoz){
|
|
obj = obj.parseFromString(xml, "text/xml");
|
|
return obj;
|
|
}else if(isIE){
|
|
obj.loadXML(xml);
|
|
return obj;
|
|
}else if(isASV){
|
|
return window.parseXML(xml, null);
|
|
}
|
|
}catch(e){
|
|
throw new mod.ParsingFailed(xml,e);
|
|
}
|
|
}
|
|
/**
|
|
DOM2 implimentation of document.importNode().
|
|
This will import into the current document. In SVG it will create SVG nodes in HTML it will create HTML nodes....
|
|
This might become customizable in the future.
|
|
@param importedNode The node to import.
|
|
@param deep=true Import all childNodes recursively.
|
|
@return The imported Node.
|
|
*/
|
|
mod.importNode=function(importedNode, deep){
|
|
deep = (deep==null) ? true : deep;
|
|
//constants from doom2
|
|
var ELEMENT_NODE = 1;
|
|
var ATTRIBUTE_NODE = 2;
|
|
var TEXT_NODE = 3;
|
|
var CDATA_SECTION_NODE = 4;
|
|
var ENTITY_REFERENCE_NODE = 5;
|
|
var ENTITY_NODE = 6;
|
|
var PROCESSING_INSTRUCTION_NODE = 7;
|
|
var COMMENT_NODE = 8;
|
|
var DOCUMENT_NODE = 9;
|
|
var DOCUMENT_TYPE_NODE = 10;
|
|
var DOCUMENT_FRAGMENT_NODE = 11;
|
|
var NOTATION_NODE = 12;
|
|
var importChildren=function(srcNode, parent){
|
|
if(deep){
|
|
for(var i=0; i<srcNode.childNodes.length; i++){
|
|
var n=mod.importNode(srcNode.childNodes.item(i), true);
|
|
parent.appendChild(n);
|
|
}
|
|
}
|
|
}
|
|
var node=null;
|
|
switch(importedNode.nodeType){
|
|
case ATTRIBUTE_NODE:
|
|
node=document.createAttributeNS(importedNode.namespaceURI, importedNode.nodeName);
|
|
node.value=importedNode.value;
|
|
break;
|
|
case DOCUMENT_FRAGMENT_NODE:
|
|
node=document.createDocumentFragment();
|
|
importChildren(importedNode,node);
|
|
break;
|
|
case ELEMENT_NODE:
|
|
node=document.createElementNS(importedNode.namespaceURI, importedNode.tagName);
|
|
//import all attributes
|
|
for(var i=0; i<importedNode.attributes.length; i++){
|
|
var attr=this.importNode(importedNode.attributes.item(i), deep);
|
|
node.setAttributeNodeNS(attr);
|
|
}
|
|
importChildren(importedNode,node);
|
|
break;
|
|
case ENTITY_REFERENCE_NODE:
|
|
node=importedNode;
|
|
break;
|
|
case PROCESSING_INSTRUCTION_NODE:
|
|
node=document.createProcessingInstruction(importedNode.target, importedNode.data);
|
|
break;
|
|
case TEXT_NODE:
|
|
case CDATA_SECTION_NODE:
|
|
case COMMENT_NODE:
|
|
node=document.createTextNode(importedNode.nodeValue);
|
|
break;
|
|
case DOCUMENT_NODE:
|
|
//Document nodes cannot be imported.
|
|
case DOCUMENT_TYPE_NODE:
|
|
//DocumentType nodes cannot be imported.
|
|
case NOTATION_NODE:
|
|
//readonly in DOM2
|
|
case ENTITY_NODE:
|
|
//readonly in DOM2
|
|
throw "not supported in DOM2";
|
|
break;
|
|
}
|
|
return node;
|
|
}
|
|
/**
|
|
Turns an XML document into a String.
|
|
@param node The node to print.
|
|
@return A string containing the text for the XML.
|
|
*/
|
|
mod.node2XML = function(node){
|
|
var ELEMENT_NODE = 1;
|
|
var ATTRIBUTE_NODE = 2;
|
|
var TEXT_NODE = 3;
|
|
var CDATA_SECTION_NODE = 4;
|
|
var ENTITY_REFERENCE_NODE = 5;
|
|
var ENTITY_NODE = 6;
|
|
var PROCESSING_INSTRUCTION_NODE = 7;
|
|
var COMMENT_NODE = 8;
|
|
var DOCUMENT_NODE = 9;
|
|
var DOCUMENT_TYPE_NODE = 10;
|
|
var DOCUMENT_FRAGMENT_NODE = 11;
|
|
var NOTATION_NODE = 12;
|
|
var s="";
|
|
switch(node.nodeType){
|
|
case ATTRIBUTE_NODE:
|
|
s+=node.nodeName+'="' + node.value + '"';
|
|
break;
|
|
case DOCUMENT_NODE:
|
|
s+=this.node2XML(node.documentElement);
|
|
break;
|
|
case ELEMENT_NODE:
|
|
s+="<" + node.tagName;
|
|
//attributes
|
|
for(var i=0; i<node.attributes.length; i++){
|
|
s+=" " + this.node2XML(node.attributes.item(i));
|
|
}
|
|
//children
|
|
if(node.childNodes.length==0){
|
|
s+="/>\n";
|
|
}else{
|
|
s+=">";
|
|
for(var i=0; i<node.childNodes.length; i++){
|
|
s+=this.node2XML(node.childNodes.item(i));
|
|
}
|
|
s+="</" + node.tagName+ ">\n";
|
|
}
|
|
break;
|
|
case PROCESSING_INSTRUCTION_NODE:
|
|
s+="<?" + node.target + " " + node.data + " ?>";
|
|
break;
|
|
case TEXT_NODE:
|
|
s+=node.nodeValue;
|
|
break;
|
|
case CDATA_SECTION_NODE:
|
|
s+="<" +"![CDATA[" + node.nodeValue + "]" + "]>";
|
|
break;
|
|
case COMMENT_NODE:
|
|
s+="<!--" + node.nodeValue + "-->";
|
|
break;
|
|
case ENTITY_REFERENCE_NODE:
|
|
case DOCUMENT_FRAGMENT_NODE:
|
|
case DOCUMENT_TYPE_NODE:
|
|
case NOTATION_NODE:
|
|
case ENTITY_NODE:
|
|
throw new mod.Exception("Nodetype(%s) not supported.".format(node.nodeType));
|
|
break;
|
|
}
|
|
return s;
|
|
}
|
|
})
|