envjs19 0.3.8.20101029121421
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.jslintrbrc +30 -0
- data/.project +17 -0
- data/CHANGELOG.rdoc +57 -0
- data/DTD/xhtml-lat1.ent +196 -0
- data/DTD/xhtml-special.ent +80 -0
- data/DTD/xhtml-symbol.ent +237 -0
- data/DTD/xhtml.soc +14 -0
- data/DTD/xhtml1-frameset.dtd +1235 -0
- data/DTD/xhtml1-strict.dtd +978 -0
- data/DTD/xhtml1-transitional.dtd +1201 -0
- data/DTD/xhtml1.dcl +192 -0
- data/Makefile +7 -0
- data/Manifest.txt +280 -0
- data/README.rdoc +65 -0
- data/Rakefile +196 -0
- data/Wakefile +11 -0
- data/bin/envjsrb +257 -0
- data/build.properties +9 -0
- data/build.xml +247 -0
- data/gm/jquery.js +6002 -0
- data/gm/mainx.js +2648 -0
- data/gm/sensx.js +135 -0
- data/gm/t.js +6 -0
- data/gm/x.html +76 -0
- data/htmlparser/BrowserTreeBuilder.java +456 -0
- data/htmlparser/README +34 -0
- data/htmlparser/build.sh +38 -0
- data/jsl/jsl +0 -0
- data/jsl/jsl.default.conf +129 -0
- data/jsl/jsl.exe +0 -0
- data/lib/envjs.rb +35 -0
- data/lib/envjs/event_loop.js +206 -0
- data/lib/envjs/net.rb +3 -0
- data/lib/envjs/net/cgi.rb +94 -0
- data/lib/envjs/net/file.rb +69 -0
- data/lib/envjs/options.rb +11 -0
- data/lib/envjs/runtime.rb +346 -0
- data/lib/envjs/tempfile.rb +24 -0
- data/licenses/GPL-LICENSE.txt +278 -0
- data/licenses/MIT-LICENSE.txt +20 -0
- data/src/base64.js +80 -0
- data/src/build.js +6 -0
- data/src/cruft/bad.html +24 -0
- data/src/cruft/dom.js +606 -0
- data/src/cruft/element.js +297 -0
- data/src/cruft/good.html +30 -0
- data/src/cruft/good.js +32 -0
- data/src/cruft/internal.js +81 -0
- data/src/cruft/parser.js +458 -0
- data/src/css/properties.js +293 -0
- data/src/css/rule.js +22 -0
- data/src/css/sizzle.js +717 -0
- data/src/css/stylesheet.js +52 -0
- data/src/dom/attr.js +55 -0
- data/src/dom/cdatasection.js +31 -0
- data/src/dom/characterdata.js +119 -0
- data/src/dom/comment.js +30 -0
- data/src/dom/doctype.js +9 -0
- data/src/dom/document.js +1023 -0
- data/src/dom/dom.js +134 -0
- data/src/dom/element.js +217 -0
- data/src/dom/entities.js +273 -0
- data/src/dom/exception.js +28 -0
- data/src/dom/fragment.js +37 -0
- data/src/dom/implementation.js +140 -0
- data/src/dom/instruction.js +51 -0
- data/src/dom/namednodemap.js +374 -0
- data/src/dom/namespace.js +50 -0
- data/src/dom/node.js +618 -0
- data/src/dom/nodelist.js +195 -0
- data/src/dom/parser.js +1207 -0
- data/src/dom/text.js +73 -0
- data/src/event/event.js +47 -0
- data/src/event/mouseevent.js +4 -0
- data/src/event/uievent.js +8 -0
- data/src/html/a.js +110 -0
- data/src/html/anchor.js +80 -0
- data/src/html/area.js +57 -0
- data/src/html/base.js +26 -0
- data/src/html/blockquote-q.js +19 -0
- data/src/html/body.js +19 -0
- data/src/html/button.js +21 -0
- data/src/html/canvas.js +14 -0
- data/src/html/col-colgroup.js +49 -0
- data/src/html/collection.js +72 -0
- data/src/html/cookie.js +153 -0
- data/src/html/del-ins.js +25 -0
- data/src/html/div.js +28 -0
- data/src/html/document.js +364 -0
- data/src/html/element.js +382 -0
- data/src/html/fieldset.js +19 -0
- data/src/html/form.js +484 -0
- data/src/html/frame.js +89 -0
- data/src/html/frameset.js +25 -0
- data/src/html/head.js +44 -0
- data/src/html/html.js +0 -0
- data/src/html/htmlparser.js +340 -0
- data/src/html/iframe.js +26 -0
- data/src/html/image.js +0 -0
- data/src/html/img.js +62 -0
- data/src/html/input-elements.js +307 -0
- data/src/html/input.js +65 -0
- data/src/html/label.js +26 -0
- data/src/html/legend.js +19 -0
- data/src/html/link.js +82 -0
- data/src/html/map.js +22 -0
- data/src/html/meta.js +37 -0
- data/src/html/object.js +89 -0
- data/src/html/optgroup.js +25 -0
- data/src/html/option.js +103 -0
- data/src/html/param.js +38 -0
- data/src/html/script.js +122 -0
- data/src/html/select.js +132 -0
- data/src/html/style.js +31 -0
- data/src/html/table.js +199 -0
- data/src/html/tbody-thead-tfoot.js +92 -0
- data/src/html/td-th.js +18 -0
- data/src/html/textarea.js +31 -0
- data/src/html/title.js +20 -0
- data/src/html/tr.js +114 -0
- data/src/intro.js +141 -0
- data/src/outro.js +70 -0
- data/src/parser/html5.detailed.js +10762 -0
- data/src/parser/html5.min.js +503 -0
- data/src/parser/html5.pretty.js +10815 -0
- data/src/parser/intro.js +42 -0
- data/src/parser/outro.js +9 -0
- data/src/platform/core.js +323 -0
- data/src/platform/johnson.js +484 -0
- data/src/platform/rhino.js +327 -0
- data/src/platform/static/intro.js +41 -0
- data/src/platform/static/outro.js +30 -0
- data/src/profile/aop.js +238 -0
- data/src/profile/profile.js +402 -0
- data/src/serializer/xml.js +21 -0
- data/src/svg/animatedstring.js +25 -0
- data/src/svg/document.js +25 -0
- data/src/svg/element.js +22 -0
- data/src/svg/locatable.js +17 -0
- data/src/svg/rect.js +18 -0
- data/src/svg/rectelement.js +24 -0
- data/src/svg/stylable.js +49 -0
- data/src/svg/svgelement.js +22 -0
- data/src/svg/transformable.js +15 -0
- data/src/window/css.js +15 -0
- data/src/window/dialog.js +16 -0
- data/src/window/document.js +28 -0
- data/src/window/event.js +265 -0
- data/src/window/history.js +62 -0
- data/src/window/location.js +156 -0
- data/src/window/navigator.js +48 -0
- data/src/window/screen.js +53 -0
- data/src/window/timer.js +21 -0
- data/src/window/window.js +284 -0
- data/src/window/xhr.js +135 -0
- data/src/xpath/expression.js +49 -0
- data/src/xpath/implementation.js +2505 -0
- data/src/xpath/result.js +67 -0
- data/src/xpath/util.js +551 -0
- data/src/xpath/xmltoken.js +149 -0
- data/src/xslt/COPYING +34 -0
- data/src/xslt/ajaxslt-0.8.1/AUTHORS +1 -0
- data/src/xslt/ajaxslt-0.8.1/ChangeLog +136 -0
- data/src/xslt/ajaxslt-0.8.1/Makefile +49 -0
- data/src/xslt/ajaxslt-0.8.1/README +102 -0
- data/src/xslt/ajaxslt-0.8.1/TODO +15 -0
- data/src/xslt/ajaxslt-0.8.1/dom.js +566 -0
- data/src/xslt/ajaxslt-0.8.1/dom_unittest.html +24 -0
- data/src/xslt/ajaxslt-0.8.1/dom_unittest.js +131 -0
- data/src/xslt/ajaxslt-0.8.1/simplelog.js +79 -0
- data/src/xslt/ajaxslt-0.8.1/test/xpath.html +18 -0
- data/src/xslt/ajaxslt-0.8.1/test/xpath_script.js +45 -0
- data/src/xslt/ajaxslt-0.8.1/test/xslt.html +58 -0
- data/src/xslt/ajaxslt-0.8.1/test/xslt_script.js +33 -0
- data/src/xslt/ajaxslt-0.8.1/unittestsuite.html +26 -0
- data/src/xslt/ajaxslt-0.8.1/xmltoken.js +149 -0
- data/src/xslt/ajaxslt-0.8.1/xmltoken_unittest.html +18 -0
- data/src/xslt/ajaxslt-0.8.1/xmltoken_unittest.js +811 -0
- data/src/xslt/ajaxslt-0.8.1/xpath_unittest.html +39 -0
- data/src/xslt/ajaxslt-0.8.1/xpath_unittest.js +557 -0
- data/src/xslt/ajaxslt-0.8.1/xpathdebug.js +234 -0
- data/src/xslt/ajaxslt-0.8.1/xslt_unittest.html +138 -0
- data/src/xslt/ajaxslt-0.8.1/xslt_unittest.js +68 -0
- data/src/xslt/implementation.js +625 -0
- data/src/xslt/processor.js +37 -0
- data/src/xslt/util.js +449 -0
- data/test/base64.js +80 -0
- data/test/call-load-test.js +15 -0
- data/test/data.js +45 -0
- data/test/debug.js +53 -0
- data/test/firebug/errorIcon.png +0 -0
- data/test/firebug/firebug.css +209 -0
- data/test/firebug/firebug.html +23 -0
- data/test/firebug/firebug.js +672 -0
- data/test/firebug/firebugx.js +10 -0
- data/test/firebug/infoIcon.png +0 -0
- data/test/firebug/warningIcon.png +0 -0
- data/test/fixtures/html/events.html +171 -0
- data/test/fixtures/html/iframe1.html +46 -0
- data/test/fixtures/html/iframe1a.html +46 -0
- data/test/fixtures/html/iframe2.html +45 -0
- data/test/fixtures/html/iframe3.html +28 -0
- data/test/fixtures/html/iframeN.html +57 -0
- data/test/fixtures/html/malformed.html +181 -0
- data/test/fixtures/html/scope.html +81 -0
- data/test/fixtures/html/trivial.html +19 -0
- data/test/fixtures/html/with_js.html +26 -0
- data/test/fixtures/images/icon-blue.png +0 -0
- data/test/fixtures/js/external_script.js +1 -0
- data/test/fixtures/js/script.js +1 -0
- data/test/fixtures/js/script_error.js +2 -0
- data/test/foo.html +8 -0
- data/test/foo.js +40 -0
- data/test/html/events.html +171 -0
- data/test/html/iframe1.html +46 -0
- data/test/html/iframe1a.html +46 -0
- data/test/html/iframe2.html +45 -0
- data/test/html/iframe3.html +30 -0
- data/test/html/iframeN.html +57 -0
- data/test/html/malformed.html +181 -0
- data/test/html/scope.html +87 -0
- data/test/html/script.js +1 -0
- data/test/html/trivial.html +19 -0
- data/test/html/with_js.html +26 -0
- data/test/index.html +328 -0
- data/test/java-prototype.js +9 -0
- data/test/jquery.js +6002 -0
- data/test/primary-tests.js +26 -0
- data/test/prototype-test.js +13 -0
- data/test/qunit.js +61 -0
- data/test/qunit/qunit/qunit.css +17 -0
- data/test/qunit/qunit/qunit.js +997 -0
- data/test/scope.html +19 -0
- data/test/scope.rb +24 -0
- data/test/smp/dmathieu/index.html +8 -0
- data/test/specs/dist/env.spec.js +1534 -0
- data/test/specs/envjs.spec.css +46 -0
- data/test/specs/parser/html.js +31 -0
- data/test/specs/parser/spec.html +40 -0
- data/test/specs/parser/xml.js +31 -0
- data/test/specs/qunit.bdd.js +210 -0
- data/test/specs/qunit.css +17 -0
- data/test/specs/qunit.js +997 -0
- data/test/specs/template/spec-0.js +31 -0
- data/test/specs/template/spec-1.js +31 -0
- data/test/specs/template/spec.html +40 -0
- data/test/specs/window/css.js +23 -0
- data/test/specs/window/dialog.js +25 -0
- data/test/specs/window/document.js +23 -0
- data/test/specs/window/event.js +25 -0
- data/test/specs/window/history.js +34 -0
- data/test/specs/window/location.js +34 -0
- data/test/specs/window/navigator.js +71 -0
- data/test/specs/window/screen.js +42 -0
- data/test/specs/window/spec.html +48 -0
- data/test/specs/window/timer.js +26 -0
- data/test/specs/window/window.js +53 -0
- data/test/specs/xhr/spec.html +47 -0
- data/test/specs/xhr/xhr.js +31 -0
- data/test/test.js +10 -0
- data/test/unit/dom.js +44 -0
- data/test/unit/elementmembers.js +92 -0
- data/test/unit/events.js +195 -0
- data/test/unit/fixtures/external_script.js +1 -0
- data/test/unit/form.js +40 -0
- data/test/unit/iframe.js +234 -0
- data/test/unit/insertion.js +23 -0
- data/test/unit/multi-window.js +212 -0
- data/test/unit/nu.validator.js +34 -0
- data/test/unit/onload.js +90 -0
- data/test/unit/parser.js +122 -0
- data/test/unit/prototypecompat.js +22 -0
- data/test/unit/proxy.js +6 -0
- data/test/unit/scope.js +209 -0
- data/test/unit/timer.js +115 -0
- data/test/unit/window.js +57 -0
- data/test/x.js +1 -0
- data/test/y.js +1 -0
- metadata +367 -0
data/src/dom/nodelist.js
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
$debug("Defining NodeList");
|
2
|
+
/*
|
3
|
+
* NodeList - DOM Level 2
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* @class DOMNodeList - provides the abstraction of an ordered collection of nodes
|
7
|
+
*
|
8
|
+
* @author Jon van Noort (jon@webarcana.com.au)
|
9
|
+
*
|
10
|
+
* @param ownerDocument : DOMDocument - the ownerDocument
|
11
|
+
* @param parentNode : DOMNode - the node that the DOMNodeList is attached to (or null)
|
12
|
+
*/
|
13
|
+
var DOMNodeList = function(ownerDocument, parentNode) {
|
14
|
+
this.length = 0;
|
15
|
+
this.parentNode = parentNode;
|
16
|
+
this.ownerDocument = ownerDocument;
|
17
|
+
|
18
|
+
this._readonly = false;
|
19
|
+
|
20
|
+
__setArray__(this, []);
|
21
|
+
};
|
22
|
+
__extend__(DOMNodeList.prototype, {
|
23
|
+
item : function(index) {
|
24
|
+
var ret = null;
|
25
|
+
//$log("NodeList item("+index+") = " + this[index]);
|
26
|
+
if ((index >= 0) && (index < this.length)) { // bounds check
|
27
|
+
ret = this[index]; // return selected Node
|
28
|
+
}
|
29
|
+
|
30
|
+
return ret; // if the index is out of bounds, default value null is returned
|
31
|
+
},
|
32
|
+
get xml() {
|
33
|
+
var ret = "";
|
34
|
+
|
35
|
+
// create string containing the concatenation of the string values of each child
|
36
|
+
for (var i=0; i < this.length; i++) {
|
37
|
+
if(this[i]){
|
38
|
+
if(this[i].nodeType == DOMNode.TEXT_NODE && i>0 && this[i-1].nodeType == DOMNode.TEXT_NODE){
|
39
|
+
//add a single space between adjacent text nodes
|
40
|
+
ret += " "+this[i].xml;
|
41
|
+
}else{
|
42
|
+
ret += this[i].xml;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
return ret;
|
48
|
+
},
|
49
|
+
toArray: function () {
|
50
|
+
var children = [];
|
51
|
+
for ( var i=0; i < this.length; i++) {
|
52
|
+
children.push (this[i]);
|
53
|
+
}
|
54
|
+
return children;
|
55
|
+
},
|
56
|
+
toString: function(){
|
57
|
+
return "[ "+(this.length > 0?Array.prototype.join.apply(this, [", "]):"Empty NodeList")+" ]";
|
58
|
+
}
|
59
|
+
});
|
60
|
+
|
61
|
+
|
62
|
+
/**
|
63
|
+
* @method DOMNodeList._findItemIndex - find the item index of the node with the specified internal id
|
64
|
+
* @author Jon van Noort (jon@webarcana.com.au)
|
65
|
+
* @param id : int - unique internal id
|
66
|
+
* @return : int
|
67
|
+
*/
|
68
|
+
var __findItemIndex__ = function (nodelist, id) {
|
69
|
+
var ret = -1;
|
70
|
+
|
71
|
+
// test that id is valid
|
72
|
+
if (id > -1) {
|
73
|
+
for (var i=0; i<nodelist.length; i++) {
|
74
|
+
// compare id to each node's _id
|
75
|
+
if (nodelist[i]._id == id) { // found it!
|
76
|
+
ret = i;
|
77
|
+
break;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
return ret; // if node is not found, default value -1 is returned
|
83
|
+
};
|
84
|
+
|
85
|
+
/**
|
86
|
+
* @method DOMNodeList._insertBefore - insert the specified Node into the NodeList before the specified index
|
87
|
+
* Used by DOMNode.insertBefore(). Note: DOMNode.insertBefore() is responsible for Node Pointer surgery
|
88
|
+
* DOMNodeList._insertBefore() simply modifies the internal data structure (Array).
|
89
|
+
*
|
90
|
+
* @author Jon van Noort (jon@webarcana.com.au)
|
91
|
+
* @param newChild : DOMNode - the Node to be inserted
|
92
|
+
* @param refChildIndex : int - the array index to insert the Node before
|
93
|
+
*/
|
94
|
+
var __insertBefore__ = function(nodelist, newChild, refChildIndex) {
|
95
|
+
if ((refChildIndex >= 0) && (refChildIndex <= nodelist.length)) { // bounds check
|
96
|
+
if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { // node is a DocumentFragment
|
97
|
+
// append the children of DocumentFragment
|
98
|
+
Array.prototype.splice.apply(nodelist,[refChildIndex, 0].concat(newChild.childNodes.toArray()));
|
99
|
+
}
|
100
|
+
else {
|
101
|
+
// append the newChild
|
102
|
+
Array.prototype.splice.apply(nodelist,[refChildIndex, 0, newChild]);
|
103
|
+
}
|
104
|
+
}
|
105
|
+
};
|
106
|
+
|
107
|
+
/**
|
108
|
+
* @method DOMNodeList._replaceChild - replace the specified Node in the NodeList at the specified index
|
109
|
+
* Used by DOMNode.replaceChild(). Note: DOMNode.replaceChild() is responsible for Node Pointer surgery
|
110
|
+
* DOMNodeList._replaceChild() simply modifies the internal data structure (Array).
|
111
|
+
*
|
112
|
+
* @author Jon van Noort (jon@webarcana.com.au)
|
113
|
+
* @param newChild : DOMNode - the Node to be inserted
|
114
|
+
* @param refChildIndex : int - the array index to hold the Node
|
115
|
+
*/
|
116
|
+
var __replaceChild__ = function(nodelist, newChild, refChildIndex) {
|
117
|
+
var ret = null;
|
118
|
+
|
119
|
+
if ((refChildIndex >= 0) && (refChildIndex < nodelist.length)) { // bounds check
|
120
|
+
ret = nodelist[refChildIndex]; // preserve old child for return
|
121
|
+
|
122
|
+
if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { // node is a DocumentFragment
|
123
|
+
// get array containing children prior to refChild
|
124
|
+
Array.prototype.splice.apply(nodelist,[refChildIndex, 1].concat(newChild.childNodes.toArray()));
|
125
|
+
}
|
126
|
+
else {
|
127
|
+
// simply replace node in array (links between Nodes are made at higher level)
|
128
|
+
nodelist[refChildIndex] = newChild;
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
return ret; // return replaced node
|
133
|
+
};
|
134
|
+
|
135
|
+
/**
|
136
|
+
* @method DOMNodeList._removeChild - remove the specified Node in the NodeList at the specified index
|
137
|
+
* Used by DOMNode.removeChild(). Note: DOMNode.removeChild() is responsible for Node Pointer surgery
|
138
|
+
* DOMNodeList._replaceChild() simply modifies the internal data structure (Array).
|
139
|
+
*
|
140
|
+
* @author Jon van Noort (jon@webarcana.com.au)
|
141
|
+
* @param refChildIndex : int - the array index holding the Node to be removed
|
142
|
+
*/
|
143
|
+
var __removeChild__ = function(nodelist, refChildIndex) {
|
144
|
+
var ret = null;
|
145
|
+
|
146
|
+
if (refChildIndex > -1) { // found it!
|
147
|
+
ret = nodelist[refChildIndex]; // return removed node
|
148
|
+
|
149
|
+
// rebuild array without removed child
|
150
|
+
Array.prototype.splice.apply(nodelist,[refChildIndex, 1]);
|
151
|
+
}
|
152
|
+
|
153
|
+
return ret; // return removed node
|
154
|
+
};
|
155
|
+
|
156
|
+
/**
|
157
|
+
* @method DOMNodeList._appendChild - append the specified Node to the NodeList
|
158
|
+
* Used by DOMNode.appendChild(). Note: DOMNode.appendChild() is responsible for Node Pointer surgery
|
159
|
+
* DOMNodeList._appendChild() simply modifies the internal data structure (Array).
|
160
|
+
*
|
161
|
+
* @author Jon van Noort (jon@webarcana.com.au)
|
162
|
+
* @param newChild : DOMNode - the Node to be inserted
|
163
|
+
*/
|
164
|
+
var __appendChild__ = function(nodelist, newChild) {
|
165
|
+
if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { // node is a DocumentFragment
|
166
|
+
// append the children of DocumentFragment
|
167
|
+
Array.prototype.push.apply(nodelist, newChild.childNodes.toArray() );
|
168
|
+
} else {
|
169
|
+
// simply add node to array (links between Nodes are made at higher level)
|
170
|
+
Array.prototype.push.apply(nodelist, [newChild]);
|
171
|
+
}
|
172
|
+
|
173
|
+
};
|
174
|
+
|
175
|
+
/**
|
176
|
+
* @method DOMNodeList._cloneNodes - Returns a NodeList containing clones of the Nodes in this NodeList
|
177
|
+
*
|
178
|
+
* @author Jon van Noort (jon@webarcana.com.au)
|
179
|
+
* @param deep : boolean - If true, recursively clone the subtree under each of the nodes;
|
180
|
+
* if false, clone only the nodes themselves (and their attributes, if it is an Element).
|
181
|
+
* @param parentNode : DOMNode - the new parent of the cloned NodeList
|
182
|
+
* @return : DOMNodeList - NodeList containing clones of the Nodes in this NodeList
|
183
|
+
*/
|
184
|
+
var __cloneNodes__ = function(nodelist, deep, parentNode) {
|
185
|
+
var cloneNodeList = new DOMNodeList(nodelist.ownerDocument, parentNode);
|
186
|
+
|
187
|
+
// create list containing clones of each child
|
188
|
+
for (var i=0; i < nodelist.length; i++) {
|
189
|
+
__appendChild__(cloneNodeList, nodelist[i].cloneNode(deep));
|
190
|
+
}
|
191
|
+
|
192
|
+
return cloneNodeList;
|
193
|
+
};
|
194
|
+
|
195
|
+
// $w.NodeList = DOMNodeList;
|
data/src/dom/parser.js
ADDED
@@ -0,0 +1,1207 @@
|
|
1
|
+
$debug("Defining DOMParser");
|
2
|
+
/*
|
3
|
+
* DOMParser
|
4
|
+
*/
|
5
|
+
|
6
|
+
var DOMParser = function(){};
|
7
|
+
__extend__(DOMParser.prototype,{
|
8
|
+
parseFromString: function(xmlString){
|
9
|
+
$debug("Parsing XML String: " +xmlString);
|
10
|
+
throw new Error("implement when testable");
|
11
|
+
return document.implementation.createDocument().loadXML(xmlString);
|
12
|
+
}
|
13
|
+
});
|
14
|
+
|
15
|
+
$debug("Initializing Internal DOMParser.");
|
16
|
+
//keep one around for internal use
|
17
|
+
var $domparser = new DOMParser();
|
18
|
+
|
19
|
+
// $w.DOMParser = DOMParser;
|
20
|
+
// =========================================================================
|
21
|
+
//
|
22
|
+
// xmlsax.js - an XML SAX parser in JavaScript.
|
23
|
+
//
|
24
|
+
// version 3.1
|
25
|
+
//
|
26
|
+
// =========================================================================
|
27
|
+
//
|
28
|
+
// Copyright (C) 2001 - 2002 David Joham (djoham@yahoo.com) and Scott Severtson
|
29
|
+
//
|
30
|
+
// This library is free software; you can redistribute it and/or
|
31
|
+
// modify it under the terms of the GNU Lesser General Public
|
32
|
+
// License as published by the Free Software Foundation; either
|
33
|
+
// version 2.1 of the License, or (at your option) any later version.
|
34
|
+
|
35
|
+
// This library is distributed in the hope that it will be useful,
|
36
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
37
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
38
|
+
// Lesser General Public License for more details.
|
39
|
+
|
40
|
+
// You should have received a copy of the GNU Lesser General Public
|
41
|
+
// License along with this library; if not, write to the Free Software
|
42
|
+
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
43
|
+
//
|
44
|
+
//
|
45
|
+
// Visit the XML for <SCRIPT> home page at http://xmljs.sourceforge.net
|
46
|
+
//
|
47
|
+
|
48
|
+
// CONSTANTS
|
49
|
+
var whitespace = "\n\r\t ";
|
50
|
+
|
51
|
+
|
52
|
+
/**
|
53
|
+
* function: this is the constructor to the XMLP Object
|
54
|
+
* Author: Scott Severtson
|
55
|
+
* Description:XMLP is a pull-based parser. The calling application passes in a XML string
|
56
|
+
* to the constructor, then repeatedly calls .next() to parse the next segment.
|
57
|
+
* .next() returns a flag indicating what type of segment was found, and stores
|
58
|
+
* data temporarily in couple member variables (name, content, array of
|
59
|
+
* attributes), which can be accessed by several .get____() methods.
|
60
|
+
*
|
61
|
+
* Basically, XMLP is the lowest common denominator parser - an very simple
|
62
|
+
* API which other wrappers can be built against.
|
63
|
+
**/
|
64
|
+
|
65
|
+
|
66
|
+
var XMLP = function(strXML) {
|
67
|
+
// Normalize line breaks
|
68
|
+
strXML = SAXStrings.replace(strXML, null, null, "\r\n", "\n");
|
69
|
+
strXML = SAXStrings.replace(strXML, null, null, "\r", "\n");
|
70
|
+
|
71
|
+
this.m_xml = strXML;
|
72
|
+
this.m_iP = 0;
|
73
|
+
this.m_iState = XMLP._STATE_PROLOG;
|
74
|
+
this.m_stack = new Stack();
|
75
|
+
this._clearAttributes();
|
76
|
+
this.replaceEntities = true;
|
77
|
+
};
|
78
|
+
|
79
|
+
|
80
|
+
// CONSTANTS (these must be below the constructor)
|
81
|
+
|
82
|
+
|
83
|
+
XMLP._NONE = 0;
|
84
|
+
XMLP._ELM_B = 1;
|
85
|
+
XMLP._ELM_E = 2;
|
86
|
+
XMLP._ELM_EMP = 3;
|
87
|
+
XMLP._ATT = 4;
|
88
|
+
XMLP._TEXT = 5;
|
89
|
+
XMLP._ENTITY = 6;
|
90
|
+
XMLP._PI = 7;
|
91
|
+
XMLP._CDATA = 8;
|
92
|
+
XMLP._COMMENT = 9;
|
93
|
+
XMLP._DTD = 10;
|
94
|
+
XMLP._ERROR = 11;
|
95
|
+
|
96
|
+
XMLP._CONT_XML = 0;
|
97
|
+
XMLP._CONT_ALT = 1;
|
98
|
+
|
99
|
+
XMLP._ATT_NAME = 0;
|
100
|
+
XMLP._ATT_VAL = 1;
|
101
|
+
|
102
|
+
XMLP._STATE_PROLOG = 1;
|
103
|
+
XMLP._STATE_DOCUMENT = 2;
|
104
|
+
XMLP._STATE_MISC = 3;
|
105
|
+
|
106
|
+
XMLP._errs = new Array();
|
107
|
+
XMLP._errs[XMLP.ERR_CLOSE_PI = 0 ] = "PI: missing closing sequence";
|
108
|
+
XMLP._errs[XMLP.ERR_CLOSE_DTD = 1 ] = "DTD: missing closing sequence";
|
109
|
+
XMLP._errs[XMLP.ERR_CLOSE_COMMENT = 2 ] = "Comment: missing closing sequence";
|
110
|
+
XMLP._errs[XMLP.ERR_CLOSE_CDATA = 3 ] = "CDATA: missing closing sequence";
|
111
|
+
XMLP._errs[XMLP.ERR_CLOSE_ELM = 4 ] = "Element: missing closing sequence";
|
112
|
+
XMLP._errs[XMLP.ERR_CLOSE_ENTITY = 5 ] = "Entity: missing closing sequence";
|
113
|
+
XMLP._errs[XMLP.ERR_PI_TARGET = 6 ] = "PI: target is required";
|
114
|
+
XMLP._errs[XMLP.ERR_ELM_EMPTY = 7 ] = "Element: cannot be both empty and closing";
|
115
|
+
XMLP._errs[XMLP.ERR_ELM_NAME = 8 ] = "Element: name must immediatly follow \"<\"";
|
116
|
+
XMLP._errs[XMLP.ERR_ELM_LT_NAME = 9 ] = "Element: \"<\" not allowed in element names";
|
117
|
+
XMLP._errs[XMLP.ERR_ATT_VALUES = 10] = "Attribute: values are required and must be in quotes";
|
118
|
+
XMLP._errs[XMLP.ERR_ATT_LT_NAME = 11] = "Element: \"<\" not allowed in attribute names";
|
119
|
+
XMLP._errs[XMLP.ERR_ATT_LT_VALUE = 12] = "Attribute: \"<\" not allowed in attribute values";
|
120
|
+
XMLP._errs[XMLP.ERR_ATT_DUP = 13] = "Attribute: duplicate attributes not allowed";
|
121
|
+
XMLP._errs[XMLP.ERR_ENTITY_UNKNOWN = 14] = "Entity: unknown entity";
|
122
|
+
XMLP._errs[XMLP.ERR_INFINITELOOP = 15] = "Infininte loop";
|
123
|
+
XMLP._errs[XMLP.ERR_DOC_STRUCTURE = 16] = "Document: only comments, processing instructions, or whitespace allowed outside of document element";
|
124
|
+
XMLP._errs[XMLP.ERR_ELM_NESTING = 17] = "Element: must be nested correctly";
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
XMLP.prototype._addAttribute = function(name, value) {
|
129
|
+
this.m_atts[this.m_atts.length] = new Array(name, value);
|
130
|
+
}
|
131
|
+
|
132
|
+
|
133
|
+
XMLP.prototype._checkStructure = function(iEvent) {
|
134
|
+
|
135
|
+
if(XMLP._STATE_PROLOG == this.m_iState) {
|
136
|
+
|
137
|
+
//The prolog is initial state of the document before parsing
|
138
|
+
//has really begun. A rigid xml parsing implementation would not
|
139
|
+
//allow anything but '<' as the first non-whitespace character
|
140
|
+
if((XMLP._TEXT == iEvent) || (XMLP._ENTITY == iEvent)) {
|
141
|
+
if(SAXStrings.indexOfNonWhitespace(this.getContent(),
|
142
|
+
this.getContentBegin(), this.getContentEnd()) != -1) {
|
143
|
+
//TODO: HTML Helper here.
|
144
|
+
return this._setErr(XMLP.ERR_DOC_STRUCTURE);
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
if((XMLP._ELM_B == iEvent) || (XMLP._ELM_EMP == iEvent)) {
|
149
|
+
this.m_iState = XMLP._STATE_DOCUMENT;
|
150
|
+
// Don't return - fall through to next state
|
151
|
+
}
|
152
|
+
|
153
|
+
}
|
154
|
+
|
155
|
+
|
156
|
+
if(XMLP._STATE_DOCUMENT == this.m_iState) {
|
157
|
+
//The document is the state that the parser is in after the
|
158
|
+
//first element event, and remains in that state until
|
159
|
+
//the initial element is closed
|
160
|
+
if((XMLP._ELM_B == iEvent) || (XMLP._ELM_EMP == iEvent)) {
|
161
|
+
this.m_stack.push(this.getName());
|
162
|
+
}
|
163
|
+
|
164
|
+
if((XMLP._ELM_E == iEvent) || (XMLP._ELM_EMP == iEvent)) {
|
165
|
+
var strTop = this.m_stack.pop();
|
166
|
+
if((strTop == null) || (strTop != this.getName())) {
|
167
|
+
return this._setErr(XMLP.ERR_ELM_NESTING);
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
if(this.m_stack.count() == 0) {
|
172
|
+
this.m_iState = XMLP._STATE_MISC;
|
173
|
+
return iEvent;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
|
178
|
+
if(XMLP._STATE_MISC == this.m_iState) {
|
179
|
+
//The misc parser state occurs after the root element has been
|
180
|
+
//closed. basically a rigid xml parser would throw an error
|
181
|
+
//for any element or text found after this
|
182
|
+
if((XMLP._ELM_B == iEvent) ||
|
183
|
+
(XMLP._ELM_E == iEvent) ||
|
184
|
+
(XMLP._ELM_EMP == iEvent) ||
|
185
|
+
(XMLP.EVT_DTD == iEvent)) {
|
186
|
+
//TODO: HTML Helper here.
|
187
|
+
return this._setErr(XMLP.ERR_DOC_STRUCTURE);
|
188
|
+
}
|
189
|
+
|
190
|
+
if((XMLP._TEXT == iEvent) || (XMLP._ENTITY == iEvent)) {
|
191
|
+
if(SAXStrings.indexOfNonWhitespace(this.getContent(),
|
192
|
+
this.getContentBegin(), this.getContentEnd()) != -1) {
|
193
|
+
//TODO: HTML Helper here.
|
194
|
+
return this._setErr(XMLP.ERR_DOC_STRUCTURE);
|
195
|
+
}
|
196
|
+
}
|
197
|
+
}
|
198
|
+
|
199
|
+
return iEvent;
|
200
|
+
|
201
|
+
};
|
202
|
+
|
203
|
+
|
204
|
+
XMLP.prototype._clearAttributes = function() {
|
205
|
+
this.m_atts = new Array();
|
206
|
+
};
|
207
|
+
|
208
|
+
|
209
|
+
XMLP.prototype._findAttributeIndex = function(name) {
|
210
|
+
for(var i = 0; i < this.m_atts.length; i++) {
|
211
|
+
if(this.m_atts[i][XMLP._ATT_NAME] == name) {
|
212
|
+
return i;
|
213
|
+
}
|
214
|
+
}
|
215
|
+
return -1;
|
216
|
+
|
217
|
+
};
|
218
|
+
|
219
|
+
|
220
|
+
XMLP.prototype.getAttributeCount = function() {
|
221
|
+
|
222
|
+
return this.m_atts ? this.m_atts.length : 0;
|
223
|
+
|
224
|
+
};
|
225
|
+
|
226
|
+
|
227
|
+
XMLP.prototype.getAttributeName = function(index) {
|
228
|
+
|
229
|
+
return ((index < 0) || (index >= this.m_atts.length)) ?
|
230
|
+
null :
|
231
|
+
this.m_atts[index][XMLP._ATT_NAME];
|
232
|
+
|
233
|
+
};
|
234
|
+
|
235
|
+
|
236
|
+
XMLP.prototype.getAttributeValue = function(index) {
|
237
|
+
|
238
|
+
return ((index < 0) || (index >= this.m_atts.length)) ?
|
239
|
+
null :
|
240
|
+
__unescapeXML__(this.m_atts[index][XMLP._ATT_VAL]);
|
241
|
+
|
242
|
+
};
|
243
|
+
|
244
|
+
|
245
|
+
XMLP.prototype.getAttributeValueByName = function(name) {
|
246
|
+
|
247
|
+
return this.getAttributeValue(this._findAttributeIndex(name));
|
248
|
+
|
249
|
+
};
|
250
|
+
|
251
|
+
|
252
|
+
XMLP.prototype.getColumnNumber = function() {
|
253
|
+
|
254
|
+
return SAXStrings.getColumnNumber(this.m_xml, this.m_iP);
|
255
|
+
|
256
|
+
};
|
257
|
+
|
258
|
+
|
259
|
+
XMLP.prototype.getContent = function() {
|
260
|
+
|
261
|
+
return (this.m_cSrc == XMLP._CONT_XML) ?
|
262
|
+
this.m_xml :
|
263
|
+
this.m_cAlt;
|
264
|
+
|
265
|
+
};
|
266
|
+
|
267
|
+
|
268
|
+
XMLP.prototype.getContentBegin = function() {
|
269
|
+
|
270
|
+
return this.m_cB;
|
271
|
+
|
272
|
+
};
|
273
|
+
|
274
|
+
|
275
|
+
XMLP.prototype.getContentEnd = function() {
|
276
|
+
|
277
|
+
return this.m_cE;
|
278
|
+
|
279
|
+
};
|
280
|
+
|
281
|
+
|
282
|
+
XMLP.prototype.getLineNumber = function() {
|
283
|
+
|
284
|
+
return SAXStrings.getLineNumber(this.m_xml, this.m_iP);
|
285
|
+
|
286
|
+
};
|
287
|
+
|
288
|
+
|
289
|
+
XMLP.prototype.getName = function() {
|
290
|
+
|
291
|
+
return this.m_name;
|
292
|
+
|
293
|
+
};
|
294
|
+
|
295
|
+
|
296
|
+
XMLP.prototype.next = function() {
|
297
|
+
|
298
|
+
return this._checkStructure(this._parse());
|
299
|
+
|
300
|
+
};
|
301
|
+
|
302
|
+
XMLP.prototype.appendFragment = function(xmlfragment) {
|
303
|
+
|
304
|
+
var start = this.m_xml.slice(0,this.m_iP);
|
305
|
+
var end = this.m_xml.slice(this.m_iP);
|
306
|
+
this.m_xml = start+xmlfragment+end;
|
307
|
+
|
308
|
+
};
|
309
|
+
|
310
|
+
|
311
|
+
XMLP.prototype._parse = function() {
|
312
|
+
|
313
|
+
if(this.m_iP == this.m_xml.length) {
|
314
|
+
return XMLP._NONE;
|
315
|
+
}
|
316
|
+
|
317
|
+
if(this.m_iP == this.m_xml.indexOf("<", this.m_iP)){
|
318
|
+
if(this.m_xml.charAt(this.m_iP+1) == "?") {
|
319
|
+
return this._parsePI(this.m_iP + 2);
|
320
|
+
}
|
321
|
+
else if(this.m_xml.charAt(this.m_iP+1) == "!") {
|
322
|
+
if(this.m_xml.charAt(this.m_iP+2) == "D") {
|
323
|
+
return this._parseDTD(this.m_iP + 9);
|
324
|
+
}
|
325
|
+
else if(this.m_xml.charAt(this.m_iP+2) == "-") {
|
326
|
+
return this._parseComment(this.m_iP + 4);
|
327
|
+
}
|
328
|
+
else if(this.m_xml.charAt(this.m_iP+2) == "[") {
|
329
|
+
return this._parseCDATA(this.m_iP + 9);
|
330
|
+
}
|
331
|
+
}
|
332
|
+
else{
|
333
|
+
|
334
|
+
return this._parseElement(this.m_iP + 1);
|
335
|
+
}
|
336
|
+
}
|
337
|
+
else if(this.m_iP == this.m_xml.indexOf("&", this.m_iP)) {
|
338
|
+
return this._parseEntity(this.m_iP + 1);
|
339
|
+
}
|
340
|
+
else{
|
341
|
+
|
342
|
+
return this._parseText(this.m_iP);
|
343
|
+
}
|
344
|
+
|
345
|
+
|
346
|
+
}
|
347
|
+
|
348
|
+
|
349
|
+
XMLP.prototype._parseAttribute = function(iB, iE) {
|
350
|
+
var iNB, iNE, iEq, iVB, iVE;
|
351
|
+
var cQuote, strN, strV;
|
352
|
+
|
353
|
+
//resets the value so we don't use an old one by
|
354
|
+
//accident (see testAttribute7 in the test suite)
|
355
|
+
this.m_cAlt = "";
|
356
|
+
|
357
|
+
iNB = SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iE);
|
358
|
+
if((iNB == -1) ||(iNB >= iE)) {
|
359
|
+
return iNB;
|
360
|
+
}
|
361
|
+
|
362
|
+
iEq = this.m_xml.indexOf("=", iNB);
|
363
|
+
if((iEq == -1) || (iEq > iE)) {
|
364
|
+
return this._setErr(XMLP.ERR_ATT_VALUES);
|
365
|
+
}
|
366
|
+
|
367
|
+
iNE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iNB, iEq);
|
368
|
+
|
369
|
+
iVB = SAXStrings.indexOfNonWhitespace(this.m_xml, iEq + 1, iE);
|
370
|
+
if((iVB == -1) ||(iVB > iE)) {
|
371
|
+
return this._setErr(XMLP.ERR_ATT_VALUES);
|
372
|
+
}
|
373
|
+
|
374
|
+
cQuote = this.m_xml.charAt(iVB);
|
375
|
+
if(_SAXStrings.QUOTES.indexOf(cQuote) == -1) {
|
376
|
+
return this._setErr(XMLP.ERR_ATT_VALUES);
|
377
|
+
}
|
378
|
+
|
379
|
+
iVE = this.m_xml.indexOf(cQuote, iVB + 1);
|
380
|
+
if((iVE == -1) ||(iVE > iE)) {
|
381
|
+
return this._setErr(XMLP.ERR_ATT_VALUES);
|
382
|
+
}
|
383
|
+
|
384
|
+
strN = this.m_xml.substring(iNB, iNE + 1);
|
385
|
+
strV = this.m_xml.substring(iVB + 1, iVE);
|
386
|
+
|
387
|
+
if(strN.indexOf("<") != -1) {
|
388
|
+
return this._setErr(XMLP.ERR_ATT_LT_NAME);
|
389
|
+
}
|
390
|
+
|
391
|
+
if(strV.indexOf("<") != -1) {
|
392
|
+
return this._setErr(XMLP.ERR_ATT_LT_VALUE);
|
393
|
+
}
|
394
|
+
|
395
|
+
strV = SAXStrings.replace(strV, null, null, "\n", " ");
|
396
|
+
strV = SAXStrings.replace(strV, null, null, "\t", " ");
|
397
|
+
iRet = this._replaceEntities(strV);
|
398
|
+
if(iRet == XMLP._ERROR) {
|
399
|
+
return iRet;
|
400
|
+
}
|
401
|
+
|
402
|
+
strV = this.m_cAlt;
|
403
|
+
|
404
|
+
if(this._findAttributeIndex(strN) == -1) {
|
405
|
+
this._addAttribute(strN, strV);
|
406
|
+
}else {
|
407
|
+
return this._setErr(XMLP.ERR_ATT_DUP);
|
408
|
+
}
|
409
|
+
|
410
|
+
this.m_iP = iVE + 2;
|
411
|
+
|
412
|
+
return XMLP._ATT;
|
413
|
+
|
414
|
+
}
|
415
|
+
|
416
|
+
|
417
|
+
XMLP.prototype._parseCDATA = function(iB) {
|
418
|
+
var iE = this.m_xml.indexOf("]]>", iB);
|
419
|
+
if (iE == -1) {
|
420
|
+
return this._setErr(XMLP.ERR_CLOSE_CDATA);
|
421
|
+
}
|
422
|
+
|
423
|
+
this._setContent(XMLP._CONT_XML, iB, iE);
|
424
|
+
|
425
|
+
this.m_iP = iE + 3;
|
426
|
+
|
427
|
+
return XMLP._CDATA;
|
428
|
+
|
429
|
+
}
|
430
|
+
|
431
|
+
|
432
|
+
XMLP.prototype._parseComment = function(iB) {
|
433
|
+
var iE = this.m_xml.indexOf("-" + "->", iB);
|
434
|
+
if (iE == -1) {
|
435
|
+
return this._setErr(XMLP.ERR_CLOSE_COMMENT);
|
436
|
+
}
|
437
|
+
|
438
|
+
this._setContent(XMLP._CONT_XML, iB, iE);
|
439
|
+
|
440
|
+
this.m_iP = iE + 3;
|
441
|
+
|
442
|
+
return XMLP._COMMENT;
|
443
|
+
|
444
|
+
}
|
445
|
+
|
446
|
+
|
447
|
+
XMLP.prototype._parseDTD = function(iB) {
|
448
|
+
|
449
|
+
// Eat DTD
|
450
|
+
|
451
|
+
var iE, strClose, iInt, iLast;
|
452
|
+
|
453
|
+
iE = this.m_xml.indexOf(">", iB);
|
454
|
+
if(iE == -1) {
|
455
|
+
return this._setErr(XMLP.ERR_CLOSE_DTD);
|
456
|
+
}
|
457
|
+
|
458
|
+
iInt = this.m_xml.indexOf("[", iB);
|
459
|
+
strClose = ((iInt != -1) && (iInt < iE)) ? "]>" : ">";
|
460
|
+
|
461
|
+
while(true) {
|
462
|
+
|
463
|
+
iE = this.m_xml.indexOf(strClose, iB);
|
464
|
+
if(iE == -1) {
|
465
|
+
return this._setErr(XMLP.ERR_CLOSE_DTD);
|
466
|
+
}
|
467
|
+
|
468
|
+
// Make sure it is not the end of a CDATA section
|
469
|
+
if (this.m_xml.substring(iE - 1, iE + 2) != "]]>") {
|
470
|
+
break;
|
471
|
+
}
|
472
|
+
}
|
473
|
+
|
474
|
+
this.m_iP = iE + strClose.length;
|
475
|
+
|
476
|
+
return XMLP._DTD;
|
477
|
+
|
478
|
+
}
|
479
|
+
|
480
|
+
|
481
|
+
XMLP.prototype._parseElement = function(iB) {
|
482
|
+
var iE, iDE, iNE, iRet;
|
483
|
+
var iType, strN, iLast;
|
484
|
+
|
485
|
+
iDE = iE = this.m_xml.indexOf(">", iB);
|
486
|
+
if(iE == -1) {
|
487
|
+
return this._setErr(XMLP.ERR_CLOSE_ELM);
|
488
|
+
}
|
489
|
+
|
490
|
+
if(this.m_xml.charAt(iB) == "/") {
|
491
|
+
iType = XMLP._ELM_E;
|
492
|
+
iB++;
|
493
|
+
} else {
|
494
|
+
iType = XMLP._ELM_B;
|
495
|
+
}
|
496
|
+
|
497
|
+
if(this.m_xml.charAt(iE - 1) == "/") {
|
498
|
+
if(iType == XMLP._ELM_E) {
|
499
|
+
return this._setErr(XMLP.ERR_ELM_EMPTY);
|
500
|
+
}
|
501
|
+
iType = XMLP._ELM_EMP;
|
502
|
+
iDE--;
|
503
|
+
}
|
504
|
+
|
505
|
+
iDE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iB, iDE);
|
506
|
+
|
507
|
+
//djohack
|
508
|
+
//hack to allow for elements with single character names to be recognized
|
509
|
+
|
510
|
+
///if (iE - iB != 1 ) {
|
511
|
+
/// if(SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iDE) != iB) {
|
512
|
+
/// return this._setErr(XMLP.ERR_ELM_NAME);
|
513
|
+
/// }
|
514
|
+
///}
|
515
|
+
|
516
|
+
// end hack -- original code below
|
517
|
+
|
518
|
+
|
519
|
+
///if(SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iDE) != iB)
|
520
|
+
/// return this._setErr(XMLP.ERR_ELM_NAME);
|
521
|
+
///
|
522
|
+
this._clearAttributes();
|
523
|
+
|
524
|
+
iNE = SAXStrings.indexOfWhitespace(this.m_xml, iB, iDE);
|
525
|
+
if(iNE == -1) {
|
526
|
+
iNE = iDE + 1;
|
527
|
+
}
|
528
|
+
else {
|
529
|
+
this.m_iP = iNE;
|
530
|
+
while(this.m_iP < iDE) {
|
531
|
+
// DEBUG: Remove
|
532
|
+
//if(this.m_iP == iLast) return this._setErr(XMLP.ERR_INFINITELOOP);
|
533
|
+
//iLast = this.m_iP;
|
534
|
+
// DEBUG: Remove End
|
535
|
+
|
536
|
+
|
537
|
+
iRet = this._parseAttribute(this.m_iP, iDE);
|
538
|
+
if(iRet == XMLP._ERROR) return iRet;
|
539
|
+
}
|
540
|
+
}
|
541
|
+
|
542
|
+
strN = this.m_xml.substring(iB, iNE);
|
543
|
+
|
544
|
+
///if(strN.indexOf("<") != -1) {
|
545
|
+
/// return this._setErr(XMLP.ERR_ELM_LT_NAME);
|
546
|
+
///}s
|
547
|
+
|
548
|
+
this.m_name = strN;
|
549
|
+
this.m_iP = iE + 1;
|
550
|
+
|
551
|
+
return iType;
|
552
|
+
|
553
|
+
}
|
554
|
+
|
555
|
+
|
556
|
+
XMLP.prototype._parseEntity = function(iB) {
|
557
|
+
var iE = this.m_xml.indexOf(";", iB);
|
558
|
+
if(iE == -1) {
|
559
|
+
return this._setErr(XMLP.ERR_CLOSE_ENTITY);
|
560
|
+
}
|
561
|
+
|
562
|
+
this.m_iP = iE + 1;
|
563
|
+
|
564
|
+
return this._replaceEntity(this.m_xml, iB, iE);
|
565
|
+
|
566
|
+
}
|
567
|
+
|
568
|
+
|
569
|
+
XMLP.prototype._parsePI = function(iB) {
|
570
|
+
|
571
|
+
var iE, iTB, iTE, iCB, iCE;
|
572
|
+
|
573
|
+
iE = this.m_xml.indexOf("?>", iB);
|
574
|
+
if(iE == -1) {
|
575
|
+
return this._setErr(XMLP.ERR_CLOSE_PI);
|
576
|
+
}
|
577
|
+
|
578
|
+
iTB = SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iE);
|
579
|
+
if(iTB == -1) {
|
580
|
+
return this._setErr(XMLP.ERR_PI_TARGET);
|
581
|
+
}
|
582
|
+
|
583
|
+
iTE = SAXStrings.indexOfWhitespace(this.m_xml, iTB, iE);
|
584
|
+
if(iTE == -1) {
|
585
|
+
iTE = iE;
|
586
|
+
}
|
587
|
+
|
588
|
+
iCB = SAXStrings.indexOfNonWhitespace(this.m_xml, iTE, iE);
|
589
|
+
if(iCB == -1) {
|
590
|
+
iCB = iE;
|
591
|
+
}
|
592
|
+
|
593
|
+
iCE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iCB, iE);
|
594
|
+
if(iCE == -1) {
|
595
|
+
iCE = iE - 1;
|
596
|
+
}
|
597
|
+
|
598
|
+
this.m_name = this.m_xml.substring(iTB, iTE);
|
599
|
+
this._setContent(XMLP._CONT_XML, iCB, iCE + 1);
|
600
|
+
this.m_iP = iE + 2;
|
601
|
+
|
602
|
+
return XMLP._PI;
|
603
|
+
|
604
|
+
}
|
605
|
+
|
606
|
+
|
607
|
+
XMLP.prototype._parseText = function(iB) {
|
608
|
+
var iE, iEE;
|
609
|
+
|
610
|
+
iE = this.m_xml.indexOf("<", iB);
|
611
|
+
if(iE == -1) {
|
612
|
+
iE = this.m_xml.length;
|
613
|
+
}
|
614
|
+
|
615
|
+
if(this.replaceEntities) {
|
616
|
+
iEE = this.m_xml.indexOf("&", iB);
|
617
|
+
if((iEE != -1) && (iEE <= iE)) {
|
618
|
+
iE = iEE;
|
619
|
+
}
|
620
|
+
}
|
621
|
+
|
622
|
+
this._setContent(XMLP._CONT_XML, iB, iE);
|
623
|
+
|
624
|
+
this.m_iP = iE;
|
625
|
+
|
626
|
+
return XMLP._TEXT;
|
627
|
+
|
628
|
+
}
|
629
|
+
|
630
|
+
|
631
|
+
XMLP.prototype._replaceEntities = function(strD, iB, iE) {
|
632
|
+
if(SAXStrings.isEmpty(strD)) return "";
|
633
|
+
iB = iB || 0;
|
634
|
+
iE = iE || strD.length;
|
635
|
+
|
636
|
+
|
637
|
+
var iEB, iEE, strRet = "";
|
638
|
+
|
639
|
+
iEB = strD.indexOf("&", iB);
|
640
|
+
iEE = iB;
|
641
|
+
|
642
|
+
while((iEB > 0) && (iEB < iE)) {
|
643
|
+
strRet += strD.substring(iEE, iEB);
|
644
|
+
|
645
|
+
iEE = strD.indexOf(";", iEB) + 1;
|
646
|
+
|
647
|
+
if((iEE == 0) || (iEE > iE)) {
|
648
|
+
return this._setErr(XMLP.ERR_CLOSE_ENTITY);
|
649
|
+
}
|
650
|
+
|
651
|
+
iRet = this._replaceEntity(strD, iEB + 1, iEE - 1);
|
652
|
+
if(iRet == XMLP._ERROR) {
|
653
|
+
return iRet;
|
654
|
+
}
|
655
|
+
|
656
|
+
strRet += this.m_cAlt;
|
657
|
+
|
658
|
+
iEB = strD.indexOf("&", iEE);
|
659
|
+
}
|
660
|
+
|
661
|
+
if(iEE != iE) {
|
662
|
+
strRet += strD.substring(iEE, iE);
|
663
|
+
}
|
664
|
+
|
665
|
+
this._setContent(XMLP._CONT_ALT, strRet);
|
666
|
+
|
667
|
+
return XMLP._ENTITY;
|
668
|
+
|
669
|
+
}
|
670
|
+
|
671
|
+
|
672
|
+
XMLP.prototype._replaceEntity = function(strD, iB, iE) {
|
673
|
+
if(SAXStrings.isEmpty(strD)) return -1;
|
674
|
+
iB = iB || 0;
|
675
|
+
iE = iE || strD.length;
|
676
|
+
|
677
|
+
|
678
|
+
ent = strD.substring(iB, iE);
|
679
|
+
strEnt = $w.$entityDefinitions[ent];
|
680
|
+
if (!strEnt) // special case for entity name==JS reserved keyword
|
681
|
+
strEnt = $w.$entityDefinitions[ent+"XX"];
|
682
|
+
if (!strEnt) {
|
683
|
+
if(strD.charAt(iB) == "#")
|
684
|
+
strEnt = String.fromCharCode(
|
685
|
+
parseInt(strD.substring(iB + 1, iE)))+'';
|
686
|
+
else
|
687
|
+
return this._setErr(XMLP.ERR_ENTITY_UNKNOWN);
|
688
|
+
}
|
689
|
+
|
690
|
+
this._setContent(XMLP._CONT_ALT, strEnt);
|
691
|
+
return XMLP._ENTITY;
|
692
|
+
}
|
693
|
+
|
694
|
+
|
695
|
+
XMLP.prototype._setContent = function(iSrc) {
|
696
|
+
var args = arguments;
|
697
|
+
|
698
|
+
if(XMLP._CONT_XML == iSrc) {
|
699
|
+
this.m_cAlt = null;
|
700
|
+
this.m_cB = args[1];
|
701
|
+
this.m_cE = args[2];
|
702
|
+
} else {
|
703
|
+
this.m_cAlt = args[1];
|
704
|
+
this.m_cB = 0;
|
705
|
+
this.m_cE = args[1].length;
|
706
|
+
}
|
707
|
+
this.m_cSrc = iSrc;
|
708
|
+
|
709
|
+
}
|
710
|
+
|
711
|
+
|
712
|
+
XMLP.prototype._setErr = function(iErr) {
|
713
|
+
var strErr = XMLP._errs[iErr];
|
714
|
+
|
715
|
+
this.m_cAlt = strErr;
|
716
|
+
this.m_cB = 0;
|
717
|
+
this.m_cE = strErr.length;
|
718
|
+
this.m_cSrc = XMLP._CONT_ALT;
|
719
|
+
|
720
|
+
return XMLP._ERROR;
|
721
|
+
|
722
|
+
}
|
723
|
+
|
724
|
+
/**
|
725
|
+
* function: SAXDriver
|
726
|
+
* Author: Scott Severtson
|
727
|
+
* Description:
|
728
|
+
* SAXDriver is an object that basically wraps an XMLP instance, and provides an
|
729
|
+
* event-based interface for parsing. This is the object users interact with when coding
|
730
|
+
* with XML for <SCRIPT>
|
731
|
+
**/
|
732
|
+
|
733
|
+
var SAXDriver = function() {
|
734
|
+
this.m_hndDoc = null;
|
735
|
+
this.m_hndErr = null;
|
736
|
+
this.m_hndLex = null;
|
737
|
+
}
|
738
|
+
|
739
|
+
|
740
|
+
// CONSTANTS
|
741
|
+
SAXDriver.DOC_B = 1;
|
742
|
+
SAXDriver.DOC_E = 2;
|
743
|
+
SAXDriver.ELM_B = 3;
|
744
|
+
SAXDriver.ELM_E = 4;
|
745
|
+
SAXDriver.CHARS = 5;
|
746
|
+
SAXDriver.PI = 6;
|
747
|
+
SAXDriver.CD_B = 7;
|
748
|
+
SAXDriver.CD_E = 8;
|
749
|
+
SAXDriver.CMNT = 9;
|
750
|
+
SAXDriver.DTD_B = 10;
|
751
|
+
SAXDriver.DTD_E = 11;
|
752
|
+
|
753
|
+
|
754
|
+
|
755
|
+
SAXDriver.prototype.parse = function(strD) {
|
756
|
+
var parser = new XMLP(strD);
|
757
|
+
|
758
|
+
if(this.m_hndDoc && this.m_hndDoc.setDocumentLocator) {
|
759
|
+
this.m_hndDoc.setDocumentLocator(this);
|
760
|
+
}
|
761
|
+
|
762
|
+
this.m_parser = parser;
|
763
|
+
this.m_bErr = false;
|
764
|
+
|
765
|
+
if(!this.m_bErr) {
|
766
|
+
this._fireEvent(SAXDriver.DOC_B);
|
767
|
+
}
|
768
|
+
this._parseLoop();
|
769
|
+
if(!this.m_bErr) {
|
770
|
+
this._fireEvent(SAXDriver.DOC_E);
|
771
|
+
}
|
772
|
+
|
773
|
+
this.m_xml = null;
|
774
|
+
this.m_iP = 0;
|
775
|
+
|
776
|
+
}
|
777
|
+
|
778
|
+
|
779
|
+
SAXDriver.prototype.setDocumentHandler = function(hnd) {
|
780
|
+
|
781
|
+
this.m_hndDoc = hnd;
|
782
|
+
|
783
|
+
}
|
784
|
+
|
785
|
+
|
786
|
+
SAXDriver.prototype.setErrorHandler = function(hnd) {
|
787
|
+
|
788
|
+
this.m_hndErr = hnd;
|
789
|
+
|
790
|
+
}
|
791
|
+
|
792
|
+
|
793
|
+
SAXDriver.prototype.setLexicalHandler = function(hnd) {
|
794
|
+
|
795
|
+
this.m_hndLex = hnd;
|
796
|
+
|
797
|
+
}
|
798
|
+
|
799
|
+
|
800
|
+
|
801
|
+
/// LOCATOR/PARSE EXCEPTION INTERFACE
|
802
|
+
|
803
|
+
|
804
|
+
SAXDriver.prototype.getColumnNumber = function() {
|
805
|
+
|
806
|
+
return this.m_parser.getColumnNumber();
|
807
|
+
|
808
|
+
}
|
809
|
+
|
810
|
+
|
811
|
+
SAXDriver.prototype.getLineNumber = function() {
|
812
|
+
|
813
|
+
return this.m_parser.getLineNumber();
|
814
|
+
|
815
|
+
}
|
816
|
+
|
817
|
+
|
818
|
+
SAXDriver.prototype.getMessage = function() {
|
819
|
+
|
820
|
+
return this.m_strErrMsg;
|
821
|
+
|
822
|
+
}
|
823
|
+
|
824
|
+
|
825
|
+
SAXDriver.prototype.getPublicId = function() {
|
826
|
+
|
827
|
+
return null;
|
828
|
+
|
829
|
+
}
|
830
|
+
|
831
|
+
|
832
|
+
SAXDriver.prototype.getSystemId = function() {
|
833
|
+
|
834
|
+
return null;
|
835
|
+
|
836
|
+
}
|
837
|
+
|
838
|
+
|
839
|
+
|
840
|
+
/// Attribute List Interface
|
841
|
+
|
842
|
+
|
843
|
+
SAXDriver.prototype.getLength = function() {
|
844
|
+
|
845
|
+
return this.m_parser.getAttributeCount();
|
846
|
+
|
847
|
+
}
|
848
|
+
|
849
|
+
|
850
|
+
SAXDriver.prototype.getName = function(index) {
|
851
|
+
|
852
|
+
return this.m_parser.getAttributeName(index);
|
853
|
+
|
854
|
+
}
|
855
|
+
|
856
|
+
|
857
|
+
SAXDriver.prototype.getValue = function(index) {
|
858
|
+
|
859
|
+
return this.m_parser.getAttributeValue(index);
|
860
|
+
|
861
|
+
}
|
862
|
+
|
863
|
+
|
864
|
+
SAXDriver.prototype.getValueByName = function(name) {
|
865
|
+
|
866
|
+
return this.m_parser.getAttributeValueByName(name);
|
867
|
+
|
868
|
+
}
|
869
|
+
|
870
|
+
|
871
|
+
/// Private functions
|
872
|
+
|
873
|
+
SAXDriver.prototype._fireError = function(strMsg) {
|
874
|
+
this.m_strErrMsg = strMsg;
|
875
|
+
this.m_bErr = true;
|
876
|
+
|
877
|
+
if(this.m_hndErr && this.m_hndErr.fatalError) {
|
878
|
+
this.m_hndErr.fatalError(this);
|
879
|
+
}
|
880
|
+
|
881
|
+
} // end function _fireError
|
882
|
+
|
883
|
+
|
884
|
+
SAXDriver.prototype._fireEvent = function(iEvt) {
|
885
|
+
var hnd, func, args = arguments, iLen = args.length - 1;
|
886
|
+
|
887
|
+
if(this.m_bErr) return;
|
888
|
+
|
889
|
+
if(SAXDriver.DOC_B == iEvt) {
|
890
|
+
func = "startDocument"; hnd = this.m_hndDoc;
|
891
|
+
}
|
892
|
+
else if (SAXDriver.DOC_E == iEvt) {
|
893
|
+
func = "endDocument"; hnd = this.m_hndDoc;
|
894
|
+
}
|
895
|
+
else if (SAXDriver.ELM_B == iEvt) {
|
896
|
+
func = "startElement"; hnd = this.m_hndDoc;
|
897
|
+
}
|
898
|
+
else if (SAXDriver.ELM_E == iEvt) {
|
899
|
+
func = "endElement"; hnd = this.m_hndDoc;
|
900
|
+
}
|
901
|
+
else if (SAXDriver.CHARS == iEvt) {
|
902
|
+
func = "characters"; hnd = this.m_hndDoc;
|
903
|
+
}
|
904
|
+
else if (SAXDriver.PI == iEvt) {
|
905
|
+
func = "processingInstruction"; hnd = this.m_hndDoc;
|
906
|
+
}
|
907
|
+
else if (SAXDriver.CD_B == iEvt) {
|
908
|
+
func = "startCDATA"; hnd = this.m_hndLex;
|
909
|
+
}
|
910
|
+
else if (SAXDriver.CD_E == iEvt) {
|
911
|
+
func = "endCDATA"; hnd = this.m_hndLex;
|
912
|
+
}
|
913
|
+
else if (SAXDriver.CMNT == iEvt) {
|
914
|
+
func = "comment"; hnd = this.m_hndLex;
|
915
|
+
}
|
916
|
+
|
917
|
+
if(hnd && hnd[func]) {
|
918
|
+
if(0 == iLen) {
|
919
|
+
hnd[func]();
|
920
|
+
}
|
921
|
+
else if (1 == iLen) {
|
922
|
+
hnd[func](args[1]);
|
923
|
+
}
|
924
|
+
else if (2 == iLen) {
|
925
|
+
hnd[func](args[1], args[2]);
|
926
|
+
}
|
927
|
+
else if (3 == iLen) {
|
928
|
+
hnd[func](args[1], args[2], args[3]);
|
929
|
+
}
|
930
|
+
}
|
931
|
+
|
932
|
+
} // end function _fireEvent
|
933
|
+
|
934
|
+
|
935
|
+
SAXDriver.prototype._parseLoop = function(parser) {
|
936
|
+
var iEvent, parser;
|
937
|
+
|
938
|
+
parser = this.m_parser;
|
939
|
+
while(!this.m_bErr) {
|
940
|
+
iEvent = parser.next();
|
941
|
+
|
942
|
+
if(iEvent == XMLP._ELM_B) {
|
943
|
+
this._fireEvent(SAXDriver.ELM_B, parser.getName(), this);
|
944
|
+
}
|
945
|
+
else if(iEvent == XMLP._ELM_E) {
|
946
|
+
this._fireEvent(SAXDriver.ELM_E, parser.getName());
|
947
|
+
}
|
948
|
+
else if(iEvent == XMLP._ELM_EMP) {
|
949
|
+
this._fireEvent(SAXDriver.ELM_B, parser.getName(), this);
|
950
|
+
this._fireEvent(SAXDriver.ELM_E, parser.getName());
|
951
|
+
}
|
952
|
+
else if(iEvent == XMLP._TEXT) {
|
953
|
+
this._fireEvent(SAXDriver.CHARS, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
|
954
|
+
}
|
955
|
+
else if(iEvent == XMLP._ENTITY) {
|
956
|
+
this._fireEvent(SAXDriver.CHARS, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
|
957
|
+
}
|
958
|
+
else if(iEvent == XMLP._PI) {
|
959
|
+
this._fireEvent(SAXDriver.PI, parser.getName(), parser.getContent().substring(parser.getContentBegin(), parser.getContentEnd()));
|
960
|
+
}
|
961
|
+
else if(iEvent == XMLP._CDATA) {
|
962
|
+
this._fireEvent(SAXDriver.CD_B);
|
963
|
+
this._fireEvent(SAXDriver.CHARS, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
|
964
|
+
this._fireEvent(SAXDriver.CD_E);
|
965
|
+
}
|
966
|
+
else if(iEvent == XMLP._COMMENT) {
|
967
|
+
this._fireEvent(SAXDriver.CMNT, parser.getContent(), parser.getContentBegin(), parser.getContentEnd() - parser.getContentBegin());
|
968
|
+
}
|
969
|
+
else if(iEvent == XMLP._DTD) {
|
970
|
+
}
|
971
|
+
else if(iEvent == XMLP._ERROR) {
|
972
|
+
this._fireError(parser.getContent());
|
973
|
+
}
|
974
|
+
else if(iEvent == XMLP._NONE) {
|
975
|
+
return;
|
976
|
+
}
|
977
|
+
}
|
978
|
+
|
979
|
+
} // end function _parseLoop
|
980
|
+
|
981
|
+
///
|
982
|
+
/// function: SAXStrings
|
983
|
+
/// Author: Scott Severtson
|
984
|
+
/// Description: a useful object containing string manipulation functions
|
985
|
+
///
|
986
|
+
|
987
|
+
var _SAXStrings = function() {};
|
988
|
+
|
989
|
+
|
990
|
+
_SAXStrings.WHITESPACE = " \t\n\r";
|
991
|
+
_SAXStrings.NONWHITESPACE = /\S/;
|
992
|
+
_SAXStrings.QUOTES = "\"'";
|
993
|
+
|
994
|
+
|
995
|
+
_SAXStrings.prototype.getColumnNumber = function(strD, iP) {
|
996
|
+
if((strD === null) || (strD.length === 0)) {
|
997
|
+
return -1;
|
998
|
+
}
|
999
|
+
iP = iP || strD.length;
|
1000
|
+
|
1001
|
+
var arrD = strD.substring(0, iP).split("\n");
|
1002
|
+
var strLine = arrD[arrD.length - 1];
|
1003
|
+
arrD.length--;
|
1004
|
+
var iLinePos = arrD.join("\n").length;
|
1005
|
+
|
1006
|
+
return iP - iLinePos;
|
1007
|
+
|
1008
|
+
} // end function getColumnNumber
|
1009
|
+
|
1010
|
+
|
1011
|
+
_SAXStrings.prototype.getLineNumber = function(strD, iP) {
|
1012
|
+
if((strD === null) || (strD.length === 0)) {
|
1013
|
+
return -1;
|
1014
|
+
}
|
1015
|
+
iP = iP || strD.length;
|
1016
|
+
|
1017
|
+
return strD.substring(0, iP).split("\n").length
|
1018
|
+
} // end function getLineNumber
|
1019
|
+
|
1020
|
+
|
1021
|
+
_SAXStrings.prototype.indexOfNonWhitespace = function(strD, iB, iE) {
|
1022
|
+
if((strD === null) || (strD.length === 0)) {
|
1023
|
+
return -1;
|
1024
|
+
}
|
1025
|
+
iB = iB || 0;
|
1026
|
+
iE = iE || strD.length;
|
1027
|
+
|
1028
|
+
//var i = strD.substring(iB, iE).search(_SAXStrings.NONWHITESPACE);
|
1029
|
+
//return i < 0 ? i : iB + i;
|
1030
|
+
|
1031
|
+
while( strD.charCodeAt(iB++) < 33 );
|
1032
|
+
return (iB > iE)?-1:iB-1;
|
1033
|
+
///for(var i = iB; i < iE; i++){
|
1034
|
+
/// if(_SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) == -1) {
|
1035
|
+
/// return i;
|
1036
|
+
/// }
|
1037
|
+
///}
|
1038
|
+
///return -1;
|
1039
|
+
|
1040
|
+
} // end function indexOfNonWhitespace
|
1041
|
+
|
1042
|
+
|
1043
|
+
_SAXStrings.prototype.indexOfWhitespace = function(strD, iB, iE) {
|
1044
|
+
if((strD === null) || (strD.length === 0)) {
|
1045
|
+
return -1;
|
1046
|
+
}
|
1047
|
+
iB = iB || 0;
|
1048
|
+
iE = iE || strD.length;
|
1049
|
+
|
1050
|
+
|
1051
|
+
while( strD.charCodeAt(iB++) >= 33 );
|
1052
|
+
return (iB > iE)?-1:iB-1;
|
1053
|
+
|
1054
|
+
///for(var i = iB; i < iE; i++) {
|
1055
|
+
/// if(_SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) != -1) {
|
1056
|
+
/// return i;
|
1057
|
+
/// }
|
1058
|
+
///}
|
1059
|
+
///return -1;
|
1060
|
+
} // end function indexOfWhitespace
|
1061
|
+
|
1062
|
+
|
1063
|
+
_SAXStrings.prototype.isEmpty = function(strD) {
|
1064
|
+
|
1065
|
+
return (strD == null) || (strD.length == 0);
|
1066
|
+
|
1067
|
+
}
|
1068
|
+
|
1069
|
+
|
1070
|
+
_SAXStrings.prototype.lastIndexOfNonWhitespace = function(strD, iB, iE) {
|
1071
|
+
if((strD === null) || (strD.length === 0)) {
|
1072
|
+
return -1;
|
1073
|
+
}
|
1074
|
+
iB = iB || 0;
|
1075
|
+
iE = iE || strD.length;
|
1076
|
+
|
1077
|
+
while( (iE >= iB) && strD.charCodeAt(--iE) < 33 );
|
1078
|
+
return (iE < iB)?-1:iE;
|
1079
|
+
|
1080
|
+
///for(var i = iE - 1; i >= iB; i--){
|
1081
|
+
/// if(_SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) == -1){
|
1082
|
+
/// return i;
|
1083
|
+
/// }
|
1084
|
+
///}
|
1085
|
+
///return -1;
|
1086
|
+
}
|
1087
|
+
|
1088
|
+
|
1089
|
+
_SAXStrings.prototype.replace = function(strD, iB, iE, strF, strR) {
|
1090
|
+
if((strD == null) || (strD.length == 0)) {
|
1091
|
+
return "";
|
1092
|
+
}
|
1093
|
+
iB = iB || 0;
|
1094
|
+
iE = iE || strD.length;
|
1095
|
+
|
1096
|
+
return strD.substring(iB, iE).split(strF).join(strR);
|
1097
|
+
|
1098
|
+
};
|
1099
|
+
|
1100
|
+
var SAXStrings = new _SAXStrings();
|
1101
|
+
|
1102
|
+
|
1103
|
+
|
1104
|
+
/***************************************************************************************************************
|
1105
|
+
Stack: A simple stack class, used for verifying document structure.
|
1106
|
+
|
1107
|
+
Author: Scott Severtson
|
1108
|
+
*****************************************************************************************************************/
|
1109
|
+
var Stack = function() {
|
1110
|
+
this.m_arr = new Array();
|
1111
|
+
};
|
1112
|
+
__extend__(Stack.prototype, {
|
1113
|
+
clear : function() {
|
1114
|
+
this.m_arr = new Array();
|
1115
|
+
},
|
1116
|
+
count : function() {
|
1117
|
+
return this.m_arr.length;
|
1118
|
+
},
|
1119
|
+
destroy : function() {
|
1120
|
+
this.m_arr = null;
|
1121
|
+
},
|
1122
|
+
peek : function() {
|
1123
|
+
if(this.m_arr.length == 0) {
|
1124
|
+
return null;
|
1125
|
+
}
|
1126
|
+
return this.m_arr[this.m_arr.length - 1];
|
1127
|
+
},
|
1128
|
+
pop : function() {
|
1129
|
+
if(this.m_arr.length == 0) {
|
1130
|
+
return null;
|
1131
|
+
}
|
1132
|
+
var o = this.m_arr[this.m_arr.length - 1];
|
1133
|
+
this.m_arr.length--;
|
1134
|
+
return o;
|
1135
|
+
},
|
1136
|
+
push : function(o) {
|
1137
|
+
this.m_arr[this.m_arr.length] = o;
|
1138
|
+
}
|
1139
|
+
});
|
1140
|
+
|
1141
|
+
|
1142
|
+
///
|
1143
|
+
/// function: isEmpty
|
1144
|
+
/// Author: mike@idle.org
|
1145
|
+
/// Description: convenience function to identify an empty string
|
1146
|
+
///
|
1147
|
+
function isEmpty(str) {
|
1148
|
+
return (str==null) || (str.length==0);
|
1149
|
+
};
|
1150
|
+
|
1151
|
+
/**
|
1152
|
+
* function __escapeXML__
|
1153
|
+
* author: David Joham djoham@yahoo.com
|
1154
|
+
* @param str : string - The string to be escaped
|
1155
|
+
* @return : string - The escaped string
|
1156
|
+
*/
|
1157
|
+
var escAmpRegEx = /&(?!(amp;|lt;|gt;|quot|apos;))/g;
|
1158
|
+
var escLtRegEx = /</g;
|
1159
|
+
var escGtRegEx = />/g;
|
1160
|
+
var quotRegEx = /"/g;
|
1161
|
+
var aposRegEx = /'/g;
|
1162
|
+
function __escapeXML__(str) {
|
1163
|
+
str = str.replace(escAmpRegEx, "&").
|
1164
|
+
replace(escLtRegEx, "<").
|
1165
|
+
replace(escGtRegEx, ">").
|
1166
|
+
replace(quotRegEx, """).
|
1167
|
+
replace(aposRegEx, "'");
|
1168
|
+
|
1169
|
+
return str;
|
1170
|
+
};
|
1171
|
+
function __escapeHTML5__(str) {
|
1172
|
+
str = str.replace(escAmpRegEx, "&").
|
1173
|
+
replace(escLtRegEx, "<").
|
1174
|
+
replace(escGtRegEx, ">");
|
1175
|
+
|
1176
|
+
return str;
|
1177
|
+
};
|
1178
|
+
function __escapeHTML5Atribute__(str) {
|
1179
|
+
str = str.replace(escAmpRegEx, "&").
|
1180
|
+
replace(escLtRegEx, "<").
|
1181
|
+
replace(escGtRegEx, ">").
|
1182
|
+
replace(quotRegEx, """).
|
1183
|
+
replace(aposRegEx, "'");
|
1184
|
+
|
1185
|
+
return str;
|
1186
|
+
};
|
1187
|
+
/**
|
1188
|
+
* function __unescapeXML__
|
1189
|
+
* author: David Joham djoham@yahoo.com
|
1190
|
+
* @param str : string - The string to be unescaped
|
1191
|
+
* @return : string - The unescaped string
|
1192
|
+
*/
|
1193
|
+
var unescAmpRegEx = /&/g;
|
1194
|
+
var unescLtRegEx = /</g;
|
1195
|
+
var unescGtRegEx = />/g;
|
1196
|
+
var unquotRegEx = /"/g;
|
1197
|
+
var unaposRegEx = /'/g;
|
1198
|
+
function __unescapeXML__(str) {
|
1199
|
+
str = str.replace(unescAmpRegEx, "&").
|
1200
|
+
replace(unescLtRegEx, "<").
|
1201
|
+
replace(unescGtRegEx, ">").
|
1202
|
+
replace(unquotRegEx, "\"").
|
1203
|
+
replace(unaposRegEx, "'");
|
1204
|
+
|
1205
|
+
return str;
|
1206
|
+
};
|
1207
|
+
|