Annotation of kupuMPIWG/common/sarissa.js, revision 1.1.1.1
1.1 dwinter 1: /*****************************************************************************
2: *
3: * Sarissa XML library version 0.9.6
4: * Copyright (c) 2003 Manos Batsis,
5: * mailto: mbatsis at users full stop sourceforge full stop net
6: * This software is distributed under the Kupu License. See
7: * LICENSE.txt for license text. See the Sarissa homepage at
8: * http://sarissa.sourceforge.net for more information.
9: *
10: *****************************************************************************
11:
12: * ====================================================================
13: * About
14: * ====================================================================
15: * Sarissa cross browser XML library
16: * @version 0.9.6
17: * @author: Manos Batsis, mailto: mbatsis at users full stop sourceforge full stop net
18: *
19: * Sarissa is an ECMAScript library acting as a cross-browser wrapper for native XML APIs.
20: * The library supports Gecko based browsers like Mozilla and Firefox,
21: * Internet Explorer (5.5+ with MSXML3.0+) and, last but not least, KHTML based browsers like
22: * Konqueror and Safari.
23: *
24: */
25: /**
26: * <p>Sarissa is a utility class. Provides static methods for DOMDocument and
27: * XMLHTTP objects, DOM Node serializatrion to XML strings and other goodies.</p>
28: * @constructor
29: */
30: function Sarissa(){};
31: /** @private */
32: Sarissa.PARSED_OK = "Document contains no parsing errors";
33: /**
34: * Tells you whether transformNode and transformNodeToObject are available. This functionality
35: * is contained in sarissa_ieemu_xslt.js and is deprecated. If you want to control XSLT transformations
36: * use the XSLTProcessor
37: * @deprecated
38: * @type boolean
39: */
40: Sarissa.IS_ENABLED_TRANSFORM_NODE = false;
41: /**
42: * tells you whether XMLHttpRequest (or equivalent) is available
43: * @type boolean
44: */
45: Sarissa.IS_ENABLED_XMLHTTP = false;
46: /**
47: * tells you whether selectNodes/selectSingleNode is available
48: * @type boolean
49: */
50: Sarissa.IS_ENABLED_SELECT_NODES = false;
51: var _sarissa_iNsCounter = 0;
52: var _SARISSA_IEPREFIX4XSLPARAM = "";
53: var _SARISSA_HAS_DOM_IMPLEMENTATION = document.implementation && true;
54: var _SARISSA_HAS_DOM_CREATE_DOCUMENT = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.createDocument;
55: var _SARISSA_HAS_DOM_FEATURE = _SARISSA_HAS_DOM_IMPLEMENTATION && document.implementation.hasFeature;
56: var _SARISSA_IS_MOZ = _SARISSA_HAS_DOM_CREATE_DOCUMENT && _SARISSA_HAS_DOM_FEATURE;
57: var _SARISSA_IS_SAFARI = navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1;
58: var _SARISSA_IS_IE = document.all && window.ActiveXObject && navigator.userAgent.toLowerCase().indexOf("msie") > -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1;
59:
60: if(!window.Node || !window.Node.ELEMENT_NODE){
61: var Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};
62: };
63:
64: // IE initialization
65: if(_SARISSA_IS_IE){
66: // for XSLT parameter names, prefix needed by IE
67: _SARISSA_IEPREFIX4XSLPARAM = "xsl:";
68: // used to store the most recent ProgID available out of the above
69: var _SARISSA_DOM_PROGID = "";
70: var _SARISSA_XMLHTTP_PROGID = "";
71: /**
72: * Called when the Sarissa_xx.js file is parsed, to pick most recent
73: * ProgIDs for IE, then gets destroyed.
74: * @param idList an array of MSXML PROGIDs from which the most recent will be picked for a given object
75: * @param enabledList an array of arrays where each array has two items; the index of the PROGID for which a certain feature is enabled
76: */
77: pickRecentProgID = function (idList, enabledList){
78: // found progID flag
79: var bFound = false;
80: for(var i=0; i < idList.length && !bFound; i++){
81: try{
82: var oDoc = new ActiveXObject(idList[i]);
83: o2Store = idList[i];
84: bFound = true;
85: for(var j=0;j<enabledList.length;j++)
86: if(i <= enabledList[j][1])
87: Sarissa["IS_ENABLED_"+enabledList[j][0]] = true;
88: }catch (objException){
89: // trap; try next progID
90: };
91: };
92: if (!bFound)
93: throw "Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";
94: idList = null;
95: return o2Store;
96: };
97: // pick best available MSXML progIDs
98: _SARISSA_DOM_PROGID = pickRecentProgID(["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"], [["SELECT_NODES", 2],["TRANSFORM_NODE", 2]]);
99: _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"], [["XMLHTTP", 4]]);
100: _SARISSA_THREADEDDOM_PROGID = pickRecentProgID(["Msxml2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0"]);
101: _SARISSA_XSLTEMPLATE_PROGID = pickRecentProgID(["Msxml2.XSLTemplate.5.0", "Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0"], [["XSLTPROC", 2]]);
102: // we dont need this anymore
103: pickRecentProgID = null;
104: //============================================
105: // Factory methods (IE)
106: //============================================
107: // see non-IE version
108: Sarissa.getDomDocument = function(sUri, sName){
109: var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
110: // if a root tag name was provided, we need to load it in the DOM
111: // object
112: if (sName){
113: // if needed, create an artifical namespace prefix the way Moz
114: // does
115: if (sUri){
116: oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\"" + sUri + "\" />");
117: // don't use the same prefix again
118: ++_sarissa_iNsCounter;
119: }
120: else
121: oDoc.loadXML("<" + sName + "/>");
122: };
123: return oDoc;
124: };
125: // see non-IE version
126: Sarissa.getParseErrorText = function (oDoc) {
127: var parseErrorText = Sarissa.PARSED_OK;
128: if(oDoc.parseError != 0){
129: parseErrorText = "XML Parsing Error: " + oDoc.parseError.reason +
130: "\nLocation: " + oDoc.parseError.url +
131: "\nLine Number " + oDoc.parseError.line + ", Column " +
132: oDoc.parseError.linepos +
133: ":\n" + oDoc.parseError.srcText +
134: "\n";
135: for(var i = 0; i < oDoc.parseError.linepos;i++){
136: parseErrorText += "-";
137: };
138: parseErrorText += "^\n";
139: };
140: return parseErrorText;
141: };
142: // see non-IE version
143: Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
144: oDoc.setProperty("SelectionLanguage", "XPath");
145: oDoc.setProperty("SelectionNamespaces", sNsSet);
146: };
147: /**
148: * Basic implementation of Mozilla's XSLTProcessor for IE.
149: * Reuses the same XSLT stylesheet for multiple transforms
150: * @constructor
151: */
152: XSLTProcessor = function(){
153: this.template = new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);
154: this.processor = null;
155: };
156: /**
157: * Impoprts the given XSLT DOM and compiles it to a reusable transform
158: * @argument xslDoc The XSLT DOMDocument to import
159: */
160: XSLTProcessor.prototype.importStylesheet = function(xslDoc){
161: // convert stylesheet to free threaded
162: var converted = new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);
163: converted.loadXML(xslDoc.xml);
164: this.template.stylesheet = converted;
165: this.processor = this.template.createProcessor();
166: // (re)set default param values
167: this.paramsSet = new Array();
168: };
169: /**
170: * Transform the given XML DOM
171: * @argument sourceDoc The XML DOMDocument to transform
172: * @return The transformation result as a DOM Document
173: */
174: XSLTProcessor.prototype.transformToDocument = function(sourceDoc){
175: this.processor.input = sourceDoc;
176: var outDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
177: this.processor.output = outDoc;
178: this.processor.transform();
179: return outDoc;
180: };
181: /**
182: * Not sure if this works in IE. Maybe this will allow non-well-formed
183: * transformation results (i.e. with no single root element)
184: * @argument sourceDoc The XML DOMDocument to transform
185: * @return The transformation result as a DOM Fragment
186: */
187: XSLTProcessor.prototype.transformToFragment = function(sourceDoc, ownerDocument){
188: return this.transformToDocument(sourceDoc);
189: };
190: /**
191: * Set global XSLT parameter of the imported stylesheet
192: * @argument nsURI The parameter namespace URI
193: * @argument name The parameter base name
194: * @argument value The new parameter value
195: */
196: XSLTProcessor.prototype.setParameter = function(nsURI, name, value){
197: /* nsURI is optional but cannot be null */
198: if(nsURI){
199: this.processor.addParameter(name, value, nsURI);
200: }else{
201: this.processor.addParameter(name, value);
202: };
203: /* update updated params for getParameter */
204: if(!this.paramsSet[""+nsURI]){
205: this.paramsSet[""+nsURI] = new Array();
206: };
207: this.paramsSet[""+nsURI][name] = value;
208: };
209: /**
210: * Gets a parameter if previously set by setParameter. Returns null
211: * otherwise
212: * @argument name The parameter base name
213: * @argument value The new parameter value
214: * @return The parameter value if reviously set by setParameter, null otherwise
215: */
216: XSLTProcessor.prototype.getParameter = function(nsURI, name){
217: if(this.paramsSet[""+nsURI] && this.paramsSet[""+nsURI][name])
218: return this.paramsSet[""+nsURI][name];
219: else
220: return null;
221: };
222: }
223: else{ /* end IE initialization, try to deal with real browsers now ;-) */
224: if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){
225: if(window.XMLDocument){
226: /**
227: * <p>Emulate IE's onreadystatechange attribute</p>
228: */
229: XMLDocument.prototype.onreadystatechange = null;
230: /**
231: * <p>Emulates IE's readyState property, which always gives an integer from 0 to 4:</p>
232: * <ul><li>1 == LOADING,</li>
233: * <li>2 == LOADED,</li>
234: * <li>3 == INTERACTIVE,</li>
235: * <li>4 == COMPLETED</li></ul>
236: */
237: XMLDocument.prototype.readyState = 0;
238: /**
239: * <p>Emulate IE's parseError attribute</p>
240: */
241: XMLDocument.prototype.parseError = 0;
242:
243: // NOTE: setting async to false will only work with documents
244: // called over HTTP (meaning a server), not the local file system,
245: // unless you are using Moz 1.4+.
246: // BTW the try>catch block is for 1.4; I haven't found a way to check if
247: // the property is implemented without
248: // causing an error and I dont want to use user agent stuff for that...
249: var _SARISSA_SYNC_NON_IMPLEMENTED = false;
250: try{
251: /**
252: * <p>Emulates IE's async property for Moz versions prior to 1.4.
253: * It controls whether loading of remote XML files works
254: * synchronously or asynchronously.</p>
255: */
256: XMLDocument.prototype.async = true;
257: _SARISSA_SYNC_NON_IMPLEMENTED = true;
258: }catch(e){/* trap */};
259: /**
260: * <p>Keeps a handle to the original load() method. Internal use and only
261: * if Mozilla version is lower than 1.4</p>
262: * @private
263: */
264: XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;
265:
266: /**
267: * <p>Overrides the original load method to provide synchronous loading for
268: * Mozilla versions prior to 1.4, using an XMLHttpRequest object (if
269: * async is set to false)</p>
270: * @returns the DOM Object as it was before the load() call (may be empty)
271: */
272: XMLDocument.prototype.load = function(sURI) {
273: var oDoc = document.implementation.createDocument("", "", null);
274: Sarissa.copyChildNodes(this, oDoc);
275: this.parseError = 0;
276: Sarissa.__setReadyState__(this, 1);
277: try {
278: if(this.async == false && _SARISSA_SYNC_NON_IMPLEMENTED) {
279: var tmp = new XMLHttpRequest();
280: tmp.open("GET", sURI, false);
281: tmp.send(null);
282: Sarissa.__setReadyState__(this, 2);
283: Sarissa.copyChildNodes(tmp.responseXML, this);
284: Sarissa.__setReadyState__(this, 3);
285: }
286: else {
287: this._sarissa_load(sURI);
288: };
289: }
290: catch (objException) {
291: this.parseError = -1;
292: }
293: finally {
294: if(this.async == false){
295: Sarissa.__handleLoad__(this);
296: };
297: };
298: return oDoc;
299: };
300: };//if(window.XMLDocument)
301:
302: /**
303: * <p>Ensures the document was loaded correctly, otherwise sets the
304: * parseError to -1 to indicate something went wrong. Internal use</p>
305: * @private
306: */
307: Sarissa.__handleLoad__ = function(oDoc){
308: if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")
309: oDoc.parseError = -1;
310: Sarissa.__setReadyState__(oDoc, 4);
311: };
312:
313: /**
314: * <p>Attached by an event handler to the load event. Internal use.</p>
315: * @private
316: */
317: _sarissa_XMLDocument_onload = function(){
318: Sarissa.__handleLoad__(this);
319: };
320:
321: /**
322: * <p>Sets the readyState property of the given DOM Document object.
323: * Internal use.</p>
324: * @private
325: * @argument oDoc the DOM Document object to fire the
326: * readystatechange event
327: * @argument iReadyState the number to change the readystate property to
328: */
329: Sarissa.__setReadyState__ = function(oDoc, iReadyState){
330: oDoc.readyState = iReadyState;
331: if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")
332: oDoc.onreadystatechange();
333: };
334: /**
335: * <p>Factory method to obtain a new DOM Document object</p>
336: * @argument sUri the namespace of the root node (if any)
337: * @argument sUri the local name of the root node (if any)
338: * @returns a new DOM Document
339: */
340: Sarissa.getDomDocument = function(sUri, sName){
341: var oDoc = document.implementation.createDocument(sUri?sUri:"", sName?sName:"", null);
342: oDoc.addEventListener("load", _sarissa_XMLDocument_onload, false);
343: return oDoc;
344: };
345: };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)
346: };
347: //==========================================
348: // Common stuff
349: //==========================================
350: if(!window.DOMParser){
351: /**
352: * DOMParser is a utility class, used to construct DOMDocuments from XML strings
353: * @constructor
354: */
355: DOMParser = function() {
356: };
357: /**
358: * Construct a new DOM Document from the given XMLstring
359: * @param sXml the given XML string
360: * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml).
361: * @return a new DOM Document from the given XML string
362: */
363: DOMParser.prototype.parseFromString = function(sXml, contentType){
364: var doc = Sarissa.getDomDocument();
365: doc.loadXML(sXml);
366: return doc;
367: };
368:
369: };
370:
371: if(window.XMLHttpRequest){
372: Sarissa.IS_ENABLED_XMLHTTP = true;
373: }
374: else if(_SARISSA_IS_IE){
375: /**
376: * Emulate XMLHttpRequest
377: * @constructor
378: */
379: XMLHttpRequest = function() {
380: return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
381: };
382: Sarissa.IS_ENABLED_XMLHTTP = true;
383: };
384:
385: if(!window.document.importNode && _SARISSA_IS_IE){
386: try{
387: /**
388: * Implements importNode for the current window document in IE using innerHTML.
389: * Testing showed that DOM was multiple times slower than innerHTML for this,
390: * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML)
391: * please gimme a call.
392: * @param oNode the Node to import
393: * @param bChildren whether to include the children of oNode
394: * @returns the imported node for further use
395: */
396: window.document.importNode = function(oNode, bChildren){
397: var importNode = document.createElement("div");
398: if(bChildren)
399: importNode.innerHTML = Sarissa.serialize(oNode);
400: else
401: importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false));
402: return importNode.firstChild;
403: };
404: }catch(e){};
405: };
406: if(!Sarissa.getParseErrorText){
407: /**
408: * <p>Returns a human readable description of the parsing error. Usefull
409: * for debugging. Tip: append the returned error string in a <pre>
410: * element if you want to render it.</p>
411: * <p>Many thanks to Christian Stocker for the initial patch.</p>
412: * @argument oDoc The target DOM document
413: * @returns The parsing error description of the target Document in
414: * human readable form (preformated text)
415: */
416: Sarissa.getParseErrorText = function (oDoc){
417: var parseErrorText = Sarissa.PARSED_OK;
418: if(oDoc.parseError != 0){
419: /*moz*/
420: if(oDoc.documentElement.tagName == "parsererror"){
421: parseErrorText = oDoc.documentElement.firstChild.data;
422: parseErrorText += "\n" + oDoc.documentElement.firstChild.nextSibling.firstChild.data;
423: }/*konq*/
424: else if(oDoc.documentElement.tagName == "html"){
425: parseErrorText = Sarissa.getText(oDoc.documentElement.getElementsByTagName("h1")[0], false) + "\n";
426: parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\n";
427: parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);
428: };
429: };
430: return parseErrorText;
431: };
432: };
433: Sarissa.getText = function(oNode, deep){
434: var s = "";
435: var nodes = oNode.childNodes;
436: for(var i=0; i < nodes.length; i++){
437: var node = nodes[i];
438: var nodeType = node.nodeType;
439: if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){
440: s += node.data;
441: }
442: else if(deep == true
443: && (nodeType == Node.ELEMENT_NODE
444: || nodeType == Node.DOCUMENT_NODE
445: || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){
446: s += Sarissa.getText(node, true);
447: };
448: };
449: return s;
450: };
451: if(window.XMLSerializer){
452: /**
453: * <p>Factory method to obtain the serialization of a DOM Node</p>
454: * @returns the serialized Node as an XML string
455: */
456: Sarissa.serialize = function(oDoc){
457: return (new XMLSerializer()).serializeToString(oDoc);
458: };
459: }else{
460: if((Sarissa.getDomDocument("","foo", null)).xml){
461: // see non-IE version
462: Sarissa.serialize = function(oDoc) {
463: // TODO: check for HTML document and return innerHTML instead
464: return oDoc.xml;
465: };
466: /**
467: * Utility class to serialize DOM Node objects to XML strings
468: * @constructor
469: */
470: XMLSerializer = function(){};
471: /**
472: * Serialize the given DOM Node to an XML string
473: * @param oNode the DOM Node to serialize
474: */
475: XMLSerializer.prototype.serializeToString = function(oNode) {
476: return oNode.xml;
477: };
478: };
479: };
480:
481: /**
482: * strips tags from a markup string
483: */
484: Sarissa.stripTags = function (s) {
485: return s.replace(/<[^>]+>/g,"");
486: };
487: /**
488: * <p>Deletes all child nodes of the given node</p>
489: * @argument oNode the Node to empty
490: */
491: Sarissa.clearChildNodes = function(oNode) {
492: while(oNode.hasChildNodes()){
493: oNode.removeChild(oNode.firstChild);
494: };
495: };
496: /**
497: * <p> Copies the childNodes of nodeFrom to nodeTo</p>
498: * <p> <b>Note:</b> The second object's original content is deleted before
499: * the copy operation, unless you supply a true third parameter</p>
500: * @argument nodeFrom the Node to copy the childNodes from
501: * @argument nodeTo the Node to copy the childNodes to
502: * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false
503: */
504: Sarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
505: if(!bPreserveExisting){
506: Sarissa.clearChildNodes(nodeTo);
507: };
508: var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
509: var nodes = nodeFrom.childNodes;
510: if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {
511: for(var i=0;i < nodes.length;i++) {
512: nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
513: };
514: }
515: else{
516: for(var i=0;i < nodes.length;i++) {
517: nodeTo.appendChild(nodes[i].cloneNode(true));
518: };
519: };
520: };
521:
522: /**
523: * <p> Moves the childNodes of nodeFrom to nodeTo</p>
524: * <p> <b>Note:</b> The second object's original content is deleted before
525: * the move operation, unless you supply a true third parameter</p>
526: * @argument nodeFrom the Node to copy the childNodes from
527: * @argument nodeTo the Node to copy the childNodes to
528: * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false
529: */
530: Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) {
531: if(!bPreserveExisting){
532: Sarissa.clearChildNodes(nodeTo);
533: };
534:
535: var nodes = nodeFrom.childNodes;
536: // if within the same doc, just move, else copy and delete
537: if(nodeFrom.ownerDocument == nodeTo.ownerDocument){
538: nodeTo.appendChild(nodes[i]);
539: }else{
540: var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
541: if(ownerDoc.importNode && (!_SARISSA_IS_IE)) {
542: for(var i=0;i < nodes.length;i++) {
543: nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
544: };
545: }
546: else{
547: for(var i=0;i < nodes.length;i++) {
548: nodeTo.appendChild(nodes[i].cloneNode(true));
549: };
550: };
551: Sarissa.clearChildNodes(nodeFrom);
552: };
553:
554: };
555:
556: /**
557: * <p>Serialize any object to an XML string. All properties are serialized using the property name
558: * as the XML element name. Array elements are rendered as <code>array-item</code> elements,
559: * using their index/key as the value of the <code>key</code> attribute.</p>
560: * @argument anyObject the object to serialize
561: * @argument objectName a name for that object
562: * @return the XML serializationj of the given object as a string
563: */
564: Sarissa.xmlize = function(anyObject, objectName, indentSpace){
565: indentSpace = indentSpace?indentSpace:'';
566: var s = indentSpace + '<' + objectName + '>';
567: var isLeaf = false;
568: if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String
569: || anyObject instanceof Boolean || anyObject instanceof Date){
570: s += Sarissa.escape(""+anyObject);
571: isLeaf = true;
572: }else{
573: s += "\n";
574: var itemKey = '';
575: var isArrayItem = anyObject instanceof Array;
576: for(var name in anyObject){
577: s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\""+name+"\"":name), indentSpace + " ");
578: };
579: s += indentSpace;
580: };
581: return s += (objectName.indexOf(' ')!=-1?"</array-item>\n":"</" + objectName + ">\n");
582: };
583:
584: /**
585: * Escape the given string chacters that correspond to the five predefined XML entities
586: * @param sXml the string to escape
587: */
588: Sarissa.escape = function(sXml){
589: return sXml.replace(/&/g, "&")
590: .replace(/</g, "<")
591: .replace(/>/g, ">")
592: .replace(/"/g, """)
593: .replace(/'/g, "'");
594: };
595:
596: /**
597: * Unescape the given string. This turns the occurences of the predefined XML
598: * entities to become the characters they represent correspond to the five predefined XML entities
599: * @param sXml the string to unescape
600: */
601: Sarissa.unescape = function(sXml){
602: return sXml.replace(/'/g,"'")
603: .replace(/"/g,"\"")
604: .replace(/>/g,">")
605: .replace(/</g,"<")
606: .replace(/&/g,"&");
607: };
608: // EOF
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>