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.
Files changed (279) hide show
  1. data/.jslintrbrc +30 -0
  2. data/.project +17 -0
  3. data/CHANGELOG.rdoc +57 -0
  4. data/DTD/xhtml-lat1.ent +196 -0
  5. data/DTD/xhtml-special.ent +80 -0
  6. data/DTD/xhtml-symbol.ent +237 -0
  7. data/DTD/xhtml.soc +14 -0
  8. data/DTD/xhtml1-frameset.dtd +1235 -0
  9. data/DTD/xhtml1-strict.dtd +978 -0
  10. data/DTD/xhtml1-transitional.dtd +1201 -0
  11. data/DTD/xhtml1.dcl +192 -0
  12. data/Makefile +7 -0
  13. data/Manifest.txt +280 -0
  14. data/README.rdoc +65 -0
  15. data/Rakefile +196 -0
  16. data/Wakefile +11 -0
  17. data/bin/envjsrb +257 -0
  18. data/build.properties +9 -0
  19. data/build.xml +247 -0
  20. data/gm/jquery.js +6002 -0
  21. data/gm/mainx.js +2648 -0
  22. data/gm/sensx.js +135 -0
  23. data/gm/t.js +6 -0
  24. data/gm/x.html +76 -0
  25. data/htmlparser/BrowserTreeBuilder.java +456 -0
  26. data/htmlparser/README +34 -0
  27. data/htmlparser/build.sh +38 -0
  28. data/jsl/jsl +0 -0
  29. data/jsl/jsl.default.conf +129 -0
  30. data/jsl/jsl.exe +0 -0
  31. data/lib/envjs.rb +35 -0
  32. data/lib/envjs/event_loop.js +206 -0
  33. data/lib/envjs/net.rb +3 -0
  34. data/lib/envjs/net/cgi.rb +94 -0
  35. data/lib/envjs/net/file.rb +69 -0
  36. data/lib/envjs/options.rb +11 -0
  37. data/lib/envjs/runtime.rb +346 -0
  38. data/lib/envjs/tempfile.rb +24 -0
  39. data/licenses/GPL-LICENSE.txt +278 -0
  40. data/licenses/MIT-LICENSE.txt +20 -0
  41. data/src/base64.js +80 -0
  42. data/src/build.js +6 -0
  43. data/src/cruft/bad.html +24 -0
  44. data/src/cruft/dom.js +606 -0
  45. data/src/cruft/element.js +297 -0
  46. data/src/cruft/good.html +30 -0
  47. data/src/cruft/good.js +32 -0
  48. data/src/cruft/internal.js +81 -0
  49. data/src/cruft/parser.js +458 -0
  50. data/src/css/properties.js +293 -0
  51. data/src/css/rule.js +22 -0
  52. data/src/css/sizzle.js +717 -0
  53. data/src/css/stylesheet.js +52 -0
  54. data/src/dom/attr.js +55 -0
  55. data/src/dom/cdatasection.js +31 -0
  56. data/src/dom/characterdata.js +119 -0
  57. data/src/dom/comment.js +30 -0
  58. data/src/dom/doctype.js +9 -0
  59. data/src/dom/document.js +1023 -0
  60. data/src/dom/dom.js +134 -0
  61. data/src/dom/element.js +217 -0
  62. data/src/dom/entities.js +273 -0
  63. data/src/dom/exception.js +28 -0
  64. data/src/dom/fragment.js +37 -0
  65. data/src/dom/implementation.js +140 -0
  66. data/src/dom/instruction.js +51 -0
  67. data/src/dom/namednodemap.js +374 -0
  68. data/src/dom/namespace.js +50 -0
  69. data/src/dom/node.js +618 -0
  70. data/src/dom/nodelist.js +195 -0
  71. data/src/dom/parser.js +1207 -0
  72. data/src/dom/text.js +73 -0
  73. data/src/event/event.js +47 -0
  74. data/src/event/mouseevent.js +4 -0
  75. data/src/event/uievent.js +8 -0
  76. data/src/html/a.js +110 -0
  77. data/src/html/anchor.js +80 -0
  78. data/src/html/area.js +57 -0
  79. data/src/html/base.js +26 -0
  80. data/src/html/blockquote-q.js +19 -0
  81. data/src/html/body.js +19 -0
  82. data/src/html/button.js +21 -0
  83. data/src/html/canvas.js +14 -0
  84. data/src/html/col-colgroup.js +49 -0
  85. data/src/html/collection.js +72 -0
  86. data/src/html/cookie.js +153 -0
  87. data/src/html/del-ins.js +25 -0
  88. data/src/html/div.js +28 -0
  89. data/src/html/document.js +364 -0
  90. data/src/html/element.js +382 -0
  91. data/src/html/fieldset.js +19 -0
  92. data/src/html/form.js +484 -0
  93. data/src/html/frame.js +89 -0
  94. data/src/html/frameset.js +25 -0
  95. data/src/html/head.js +44 -0
  96. data/src/html/html.js +0 -0
  97. data/src/html/htmlparser.js +340 -0
  98. data/src/html/iframe.js +26 -0
  99. data/src/html/image.js +0 -0
  100. data/src/html/img.js +62 -0
  101. data/src/html/input-elements.js +307 -0
  102. data/src/html/input.js +65 -0
  103. data/src/html/label.js +26 -0
  104. data/src/html/legend.js +19 -0
  105. data/src/html/link.js +82 -0
  106. data/src/html/map.js +22 -0
  107. data/src/html/meta.js +37 -0
  108. data/src/html/object.js +89 -0
  109. data/src/html/optgroup.js +25 -0
  110. data/src/html/option.js +103 -0
  111. data/src/html/param.js +38 -0
  112. data/src/html/script.js +122 -0
  113. data/src/html/select.js +132 -0
  114. data/src/html/style.js +31 -0
  115. data/src/html/table.js +199 -0
  116. data/src/html/tbody-thead-tfoot.js +92 -0
  117. data/src/html/td-th.js +18 -0
  118. data/src/html/textarea.js +31 -0
  119. data/src/html/title.js +20 -0
  120. data/src/html/tr.js +114 -0
  121. data/src/intro.js +141 -0
  122. data/src/outro.js +70 -0
  123. data/src/parser/html5.detailed.js +10762 -0
  124. data/src/parser/html5.min.js +503 -0
  125. data/src/parser/html5.pretty.js +10815 -0
  126. data/src/parser/intro.js +42 -0
  127. data/src/parser/outro.js +9 -0
  128. data/src/platform/core.js +323 -0
  129. data/src/platform/johnson.js +484 -0
  130. data/src/platform/rhino.js +327 -0
  131. data/src/platform/static/intro.js +41 -0
  132. data/src/platform/static/outro.js +30 -0
  133. data/src/profile/aop.js +238 -0
  134. data/src/profile/profile.js +402 -0
  135. data/src/serializer/xml.js +21 -0
  136. data/src/svg/animatedstring.js +25 -0
  137. data/src/svg/document.js +25 -0
  138. data/src/svg/element.js +22 -0
  139. data/src/svg/locatable.js +17 -0
  140. data/src/svg/rect.js +18 -0
  141. data/src/svg/rectelement.js +24 -0
  142. data/src/svg/stylable.js +49 -0
  143. data/src/svg/svgelement.js +22 -0
  144. data/src/svg/transformable.js +15 -0
  145. data/src/window/css.js +15 -0
  146. data/src/window/dialog.js +16 -0
  147. data/src/window/document.js +28 -0
  148. data/src/window/event.js +265 -0
  149. data/src/window/history.js +62 -0
  150. data/src/window/location.js +156 -0
  151. data/src/window/navigator.js +48 -0
  152. data/src/window/screen.js +53 -0
  153. data/src/window/timer.js +21 -0
  154. data/src/window/window.js +284 -0
  155. data/src/window/xhr.js +135 -0
  156. data/src/xpath/expression.js +49 -0
  157. data/src/xpath/implementation.js +2505 -0
  158. data/src/xpath/result.js +67 -0
  159. data/src/xpath/util.js +551 -0
  160. data/src/xpath/xmltoken.js +149 -0
  161. data/src/xslt/COPYING +34 -0
  162. data/src/xslt/ajaxslt-0.8.1/AUTHORS +1 -0
  163. data/src/xslt/ajaxslt-0.8.1/ChangeLog +136 -0
  164. data/src/xslt/ajaxslt-0.8.1/Makefile +49 -0
  165. data/src/xslt/ajaxslt-0.8.1/README +102 -0
  166. data/src/xslt/ajaxslt-0.8.1/TODO +15 -0
  167. data/src/xslt/ajaxslt-0.8.1/dom.js +566 -0
  168. data/src/xslt/ajaxslt-0.8.1/dom_unittest.html +24 -0
  169. data/src/xslt/ajaxslt-0.8.1/dom_unittest.js +131 -0
  170. data/src/xslt/ajaxslt-0.8.1/simplelog.js +79 -0
  171. data/src/xslt/ajaxslt-0.8.1/test/xpath.html +18 -0
  172. data/src/xslt/ajaxslt-0.8.1/test/xpath_script.js +45 -0
  173. data/src/xslt/ajaxslt-0.8.1/test/xslt.html +58 -0
  174. data/src/xslt/ajaxslt-0.8.1/test/xslt_script.js +33 -0
  175. data/src/xslt/ajaxslt-0.8.1/unittestsuite.html +26 -0
  176. data/src/xslt/ajaxslt-0.8.1/xmltoken.js +149 -0
  177. data/src/xslt/ajaxslt-0.8.1/xmltoken_unittest.html +18 -0
  178. data/src/xslt/ajaxslt-0.8.1/xmltoken_unittest.js +811 -0
  179. data/src/xslt/ajaxslt-0.8.1/xpath_unittest.html +39 -0
  180. data/src/xslt/ajaxslt-0.8.1/xpath_unittest.js +557 -0
  181. data/src/xslt/ajaxslt-0.8.1/xpathdebug.js +234 -0
  182. data/src/xslt/ajaxslt-0.8.1/xslt_unittest.html +138 -0
  183. data/src/xslt/ajaxslt-0.8.1/xslt_unittest.js +68 -0
  184. data/src/xslt/implementation.js +625 -0
  185. data/src/xslt/processor.js +37 -0
  186. data/src/xslt/util.js +449 -0
  187. data/test/base64.js +80 -0
  188. data/test/call-load-test.js +15 -0
  189. data/test/data.js +45 -0
  190. data/test/debug.js +53 -0
  191. data/test/firebug/errorIcon.png +0 -0
  192. data/test/firebug/firebug.css +209 -0
  193. data/test/firebug/firebug.html +23 -0
  194. data/test/firebug/firebug.js +672 -0
  195. data/test/firebug/firebugx.js +10 -0
  196. data/test/firebug/infoIcon.png +0 -0
  197. data/test/firebug/warningIcon.png +0 -0
  198. data/test/fixtures/html/events.html +171 -0
  199. data/test/fixtures/html/iframe1.html +46 -0
  200. data/test/fixtures/html/iframe1a.html +46 -0
  201. data/test/fixtures/html/iframe2.html +45 -0
  202. data/test/fixtures/html/iframe3.html +28 -0
  203. data/test/fixtures/html/iframeN.html +57 -0
  204. data/test/fixtures/html/malformed.html +181 -0
  205. data/test/fixtures/html/scope.html +81 -0
  206. data/test/fixtures/html/trivial.html +19 -0
  207. data/test/fixtures/html/with_js.html +26 -0
  208. data/test/fixtures/images/icon-blue.png +0 -0
  209. data/test/fixtures/js/external_script.js +1 -0
  210. data/test/fixtures/js/script.js +1 -0
  211. data/test/fixtures/js/script_error.js +2 -0
  212. data/test/foo.html +8 -0
  213. data/test/foo.js +40 -0
  214. data/test/html/events.html +171 -0
  215. data/test/html/iframe1.html +46 -0
  216. data/test/html/iframe1a.html +46 -0
  217. data/test/html/iframe2.html +45 -0
  218. data/test/html/iframe3.html +30 -0
  219. data/test/html/iframeN.html +57 -0
  220. data/test/html/malformed.html +181 -0
  221. data/test/html/scope.html +87 -0
  222. data/test/html/script.js +1 -0
  223. data/test/html/trivial.html +19 -0
  224. data/test/html/with_js.html +26 -0
  225. data/test/index.html +328 -0
  226. data/test/java-prototype.js +9 -0
  227. data/test/jquery.js +6002 -0
  228. data/test/primary-tests.js +26 -0
  229. data/test/prototype-test.js +13 -0
  230. data/test/qunit.js +61 -0
  231. data/test/qunit/qunit/qunit.css +17 -0
  232. data/test/qunit/qunit/qunit.js +997 -0
  233. data/test/scope.html +19 -0
  234. data/test/scope.rb +24 -0
  235. data/test/smp/dmathieu/index.html +8 -0
  236. data/test/specs/dist/env.spec.js +1534 -0
  237. data/test/specs/envjs.spec.css +46 -0
  238. data/test/specs/parser/html.js +31 -0
  239. data/test/specs/parser/spec.html +40 -0
  240. data/test/specs/parser/xml.js +31 -0
  241. data/test/specs/qunit.bdd.js +210 -0
  242. data/test/specs/qunit.css +17 -0
  243. data/test/specs/qunit.js +997 -0
  244. data/test/specs/template/spec-0.js +31 -0
  245. data/test/specs/template/spec-1.js +31 -0
  246. data/test/specs/template/spec.html +40 -0
  247. data/test/specs/window/css.js +23 -0
  248. data/test/specs/window/dialog.js +25 -0
  249. data/test/specs/window/document.js +23 -0
  250. data/test/specs/window/event.js +25 -0
  251. data/test/specs/window/history.js +34 -0
  252. data/test/specs/window/location.js +34 -0
  253. data/test/specs/window/navigator.js +71 -0
  254. data/test/specs/window/screen.js +42 -0
  255. data/test/specs/window/spec.html +48 -0
  256. data/test/specs/window/timer.js +26 -0
  257. data/test/specs/window/window.js +53 -0
  258. data/test/specs/xhr/spec.html +47 -0
  259. data/test/specs/xhr/xhr.js +31 -0
  260. data/test/test.js +10 -0
  261. data/test/unit/dom.js +44 -0
  262. data/test/unit/elementmembers.js +92 -0
  263. data/test/unit/events.js +195 -0
  264. data/test/unit/fixtures/external_script.js +1 -0
  265. data/test/unit/form.js +40 -0
  266. data/test/unit/iframe.js +234 -0
  267. data/test/unit/insertion.js +23 -0
  268. data/test/unit/multi-window.js +212 -0
  269. data/test/unit/nu.validator.js +34 -0
  270. data/test/unit/onload.js +90 -0
  271. data/test/unit/parser.js +122 -0
  272. data/test/unit/prototypecompat.js +22 -0
  273. data/test/unit/proxy.js +6 -0
  274. data/test/unit/scope.js +209 -0
  275. data/test/unit/timer.js +115 -0
  276. data/test/unit/window.js +57 -0
  277. data/test/x.js +1 -0
  278. data/test/y.js +1 -0
  279. metadata +367 -0
data/src/html/frame.js ADDED
@@ -0,0 +1,89 @@
1
+ $debug("Defining HTMLFrameElement");
2
+ /*
3
+ * HTMLFrameElement - DOM Level 2
4
+ */
5
+ var HTMLFrameElement = function(ownerDocument) {
6
+ this.HTMLElement = HTMLElement;
7
+ this.HTMLElement(ownerDocument);
8
+ };
9
+ HTMLFrameElement.prototype = new HTMLElement;
10
+ __extend__(HTMLFrameElement.prototype, {
11
+ get frameBorder(){
12
+ return this.getAttribute('border')||"";
13
+ },
14
+ set frameBorder(value){
15
+ this.setAttribute('border', value);
16
+ },
17
+ get longDesc(){
18
+ return this.getAttribute('longdesc')||"";
19
+ },
20
+ set longDesc(value){
21
+ this.setAttribute('longdesc', value);
22
+ },
23
+ get marginHeight(){
24
+ return this.getAttribute('marginheight')||"";
25
+ },
26
+ set marginHeight(value){
27
+ this.setAttribute('marginheight', value);
28
+ },
29
+ get marginWidth(){
30
+ return this.getAttribute('marginwidth')||"";
31
+ },
32
+ set marginWidth(value){
33
+ this.setAttribute('marginwidth', value);
34
+ },
35
+ get name(){
36
+ return this.getAttribute('name')||"";
37
+ },
38
+ set name(value){
39
+ this.setAttribute('name', value);
40
+ },
41
+ get noResize(){
42
+ return this.getAttribute('noresize')||"";
43
+ },
44
+ set noResize(value){
45
+ this.setAttribute('noresize', value);
46
+ },
47
+ get scrolling(){
48
+ return this.getAttribute('scrolling')||"";
49
+ },
50
+ set scrolling(value){
51
+ this.setAttribute('scrolling', value);
52
+ },
53
+ get src(){
54
+ return this.getAttribute('src')||"";
55
+ },
56
+ set src(value){
57
+ this.setAttribute('src', value);
58
+
59
+ if (value && value.length > 0){
60
+ var save = $master.first_script_window;
61
+ try {
62
+ var $env = this.ownerDocument._parentWindow.$envx;
63
+ var $inner = this.ownerDocument._parentWindow["$inner"];
64
+ $master.first_script_window = $inner;
65
+ $env.loadFrame(this, $env.location(value));
66
+ } finally {
67
+ $master.first_script_window = save;
68
+ }
69
+
70
+
71
+ var event = this.ownerDocument.createEvent();
72
+ event.initEvent("load");
73
+ this.dispatchEvent( event, false );
74
+ }
75
+ },
76
+ get contentDocument(){
77
+ if (!this._content)
78
+ return null;
79
+ return this._content.document;
80
+ },
81
+ get contentWindow(){
82
+ return this._content;
83
+ },
84
+ onload: function(event){
85
+ return __eval__(this.getAttribute('onload')||'', this)
86
+ }
87
+ });
88
+
89
+ // $w.HTMLFrameElement = HTMLFrameElement;
@@ -0,0 +1,25 @@
1
+ $debug("Defining HTMLFrameSetElement");
2
+ /*
3
+ * HTMLFrameSetElement - DOM Level 2
4
+ */
5
+ var HTMLFrameSetElement = function(ownerDocument) {
6
+ this.HTMLElement = HTMLElement;
7
+ this.HTMLElement(ownerDocument);
8
+ };
9
+ HTMLFrameSetElement.prototype = new HTMLElement;
10
+ __extend__(HTMLFrameSetElement.prototype, {
11
+ get cols(){
12
+ return this.getAttribute('cols');
13
+ },
14
+ set cols(value){
15
+ this.setAttribute('cols', value);
16
+ },
17
+ get rows(){
18
+ return this.getAttribute('rows');
19
+ },
20
+ set rows(value){
21
+ this.setAttribute('rows', value);
22
+ }
23
+ });
24
+
25
+ // $w.HTMLFrameSetElement = HTMLFrameSetElement;
data/src/html/head.js ADDED
@@ -0,0 +1,44 @@
1
+ $debug("Defining HTMLHeadElement");
2
+ /*
3
+ * HTMLHeadElement - DOM Level 2
4
+ */
5
+ var HTMLHeadElement = function(ownerDocument) {
6
+ this.HTMLElement = HTMLElement;
7
+ this.HTMLElement(ownerDocument);
8
+ };
9
+ HTMLHeadElement.prototype = new HTMLElement;
10
+ __extend__(HTMLHeadElement.prototype, {
11
+ get profile(){
12
+ return this.getAttribute('profile');
13
+ },
14
+ set profile(value){
15
+ this.setAttribute('profile', value);
16
+ },
17
+ //we override this so we can apply browser behavior specific to head children
18
+ //like loading scripts
19
+ appendChild : function(newChild) {
20
+ var newChild = HTMLElement.prototype.appendChild.apply(this,[newChild]);
21
+ //__evalScript__(newChild);
22
+ return newChild;
23
+ },
24
+ insertBefore : function(newChild, refChild) {
25
+ var newChild = HTMLElement.prototype.insertBefore.apply(this,[newChild]);
26
+ //__evalScript__(newChild);
27
+ return newChild;
28
+ }
29
+ });
30
+
31
+ var __evalScript__ = function(newChild){
32
+ //check to see if this is a script element and apply a script loading strategy
33
+ //the check against the ownerDocument isnt really enough to support frames in
34
+ // the long run, but for now it's ok
35
+ if(newChild.nodeType == DOMNode.ELEMENT_NODE &&
36
+ newChild.ownerDocument == window.document ){
37
+ if(newChild.nodeName.toUpperCase() == "SCRIPT"){
38
+ $debug("loading script via policy. ");
39
+ $policy.loadScript(newChild);
40
+ }
41
+ }
42
+ };
43
+
44
+ // $w.HTMLHeadElement = HTMLHeadElement;
data/src/html/html.js ADDED
File without changes
@@ -0,0 +1,340 @@
1
+ /*
2
+ * parser.js
3
+ */
4
+ /*
5
+ * HTML Parser By John Resig (ejohn.org)
6
+ * Original code by Erik Arvidsson, Mozilla Public License
7
+ * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
8
+ *
9
+ * // Use like so:
10
+ * HTMLParser(htmlString, {
11
+ * start: function(tag, attrs, unary) {},
12
+ * end: function(tag) {},
13
+ * chars: function(text) {},
14
+ * comment: function(text) {}
15
+ * });
16
+ *
17
+ * // or to get an XML string:
18
+ * HTMLtoXML(htmlString);
19
+ *
20
+ * // or to get an XML DOM Document
21
+ * HTMLtoDOM(htmlString);
22
+ *
23
+ * // or to inject into an existing document/DOM node
24
+ * HTMLtoDOM(htmlString, document);
25
+ * HTMLtoDOM(htmlString, document.body);
26
+ *
27
+ */
28
+ var html2dom, html2xml;
29
+
30
+ (function(){
31
+
32
+ // Regular Expressions for parsing tags and attributes
33
+ var startTag = /^<([\w\:\-]+)((?:\s+[\w\:\-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
34
+ endTag = /^<\/([\w\:\-]+)[^>]*>/,
35
+ attr = /([\w\:\-]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
36
+ // Empty Elements - HTML 4.01
37
+ var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed");
38
+
39
+ // Block Elements - HTML 4.01
40
+ var block = makeMap("address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul");
41
+
42
+ // Inline Elements - HTML 4.01
43
+ var inline = makeMap("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");
44
+
45
+ // Elements that you can, intentionally, leave open
46
+ // (and which close themselves)
47
+ var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
48
+
49
+ // Attributes that have their values filled in disabled="disabled"
50
+ var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected");
51
+
52
+ // Special Elements (can contain anything)
53
+ var special = makeMap("script,style");
54
+
55
+ var HTMLParser = function( html, handler ) {
56
+ var index, chars, match, stack = [], last = html;
57
+ stack.last = function(){
58
+ return this[ this.length - 1 ];
59
+ };
60
+
61
+ while ( html ) {
62
+ //$log("HTMLParser: chunking... ");
63
+ chars = true;
64
+
65
+ // Make sure we're not in a script or style element
66
+ if ( !stack.last() || !special[ stack.last() ] ) {
67
+
68
+ //$log("HTMLParser: ... ");
69
+ // Comment
70
+ if ( html.indexOf("<!--") === 0 ) {
71
+ //$log("HTMLParser: comment ");
72
+ index = html.indexOf("-->");
73
+
74
+ if ( index >= 0 ) {
75
+ if ( handler.comment )
76
+ handler.comment( html.substring( 4, index ) );
77
+ html = html.substring( index + 3 );
78
+ chars = false;
79
+ }
80
+
81
+ // end tag
82
+ } else if ( html.indexOf("</") === 0 ) {
83
+ //$log("HTMLParser: endtag ");
84
+ match = html.match( endTag );
85
+
86
+ if ( match ) {
87
+ //$log("HTMLParser: endtag match : "+match[0]);
88
+ html = html.substring( match[0].length );
89
+ match[0].replace( endTag, parseEndTag );
90
+ chars = false;
91
+ }
92
+
93
+ // start tag
94
+ } else if ( html.indexOf("<") === 0 ) {
95
+ //$log("HTMLParser: starttag ");
96
+ match = html.match( startTag );
97
+
98
+ if ( match ) {
99
+ //$log("HTMLParser: starttag match : "+match[0]);
100
+ html = html.substring( match[0].length );
101
+ match[0].replace( startTag, parseStartTag );
102
+ chars = false;
103
+ }
104
+ }
105
+
106
+ if ( chars ) {
107
+ //$log("HTMLParser: other ");
108
+ index = html.indexOf("<");
109
+ var text = index < 0 ? html : html.substring( 0, index );
110
+ html = index < 0 ? "" : html.substring( index );
111
+ if ( handler.chars ){
112
+ //$log("HTMLParser: chars " + text);
113
+ handler.chars( text );
114
+ }
115
+ }
116
+ } else {
117
+ //$log("HTMLParser: special ");
118
+ html = html.replace(new RegExp("(.*)<\/" + stack.last() + "[^>]*>"), function(all, text){
119
+ text = text.replace(/<!--(.*?)-->/g, "$1").
120
+ replace(/<!\[CDATA\[(.*?)]]>/g, "$1");
121
+ if ( handler.chars ){
122
+ //$log("HTMLParser: special chars " + text);
123
+ handler.chars( text );
124
+ }
125
+ return "";
126
+ });
127
+ parseEndTag( "", stack.last() );
128
+ }
129
+ if ( html == last ){throw "Parse Error: " + html;}
130
+ last = html;
131
+ }
132
+
133
+ // Clean up any remaining tags
134
+ parseEndTag();
135
+
136
+ function parseStartTag( tag, tagName, rest, unary ) {
137
+ if ( block[ tagName ] ) {
138
+ while ( stack.last() && inline[ stack.last() ] ) {
139
+ parseEndTag( "", stack.last() );
140
+ }
141
+ }
142
+
143
+ if ( closeSelf[ tagName ] && stack.last() == tagName ) {
144
+ parseEndTag( "", tagName );
145
+ }
146
+
147
+ unary = empty[ tagName ] || !!unary;
148
+
149
+ if ( !unary )
150
+ stack.push( tagName );
151
+
152
+ if ( handler.start ) {
153
+ var attrs = [];
154
+
155
+ rest.replace(attr, function(match, name) {
156
+ var value = arguments[2] ? arguments[2] :
157
+ arguments[3] ? arguments[3] :
158
+ arguments[4] ? arguments[4] :
159
+ fillAttrs[name] ? name : "";
160
+
161
+ attrs.push({
162
+ name: name,
163
+ value: value,
164
+ escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //"
165
+ });
166
+ });
167
+
168
+ if ( handler.start ){
169
+ //$log("unary ? : "+unary);
170
+ handler.start( tagName, attrs, unary );
171
+ }
172
+ }
173
+ }
174
+
175
+ function parseEndTag( tag, tagName ) {
176
+ var pos;
177
+ // If no tag name is provided, clean shop
178
+ if ( !tagName ){
179
+ pos = 0;
180
+ }else{
181
+ // Find the closest opened tag of the same type
182
+ for ( pos = stack.length - 1; pos >= 0; pos-- ){
183
+ //$log("parseEndTag : "+stack[ pos ] );
184
+ if ( stack[ pos ] == tagName ){
185
+ break;
186
+ }
187
+ }
188
+ }
189
+ if ( pos >= 0 ) {
190
+ // Close all the open elements, up the stack
191
+ for ( var i = stack.length - 1; i >= pos; i-- ){
192
+ if ( handler.end ){
193
+ //$log("end : "+stack[ i ] );
194
+ handler.end( stack[ i ] );
195
+ }
196
+ }
197
+ // Remove the open elements from the stack
198
+ //$log("setting stack length : " + stack.length + " -> " +pos );
199
+ stack.length = pos;
200
+ }
201
+ }
202
+ };
203
+
204
+ html2xml = function( html ) {
205
+ var results = "";
206
+
207
+ HTMLParser(html, {
208
+ start: function( tag, attrs, unary ) {
209
+ results += "<" + tag;
210
+
211
+ for ( var i = 0; i < attrs.length; i++ )
212
+ results += " " + attrs[i].name + '="' + attrs[i].escaped + '"';
213
+
214
+ results += (unary ? "/" : "") + ">";
215
+ },
216
+ end: function( tag ) {
217
+ results += "</" + tag + ">";
218
+ },
219
+ chars: function( text ) {
220
+ results += text;
221
+ },
222
+ comment: function( text ) {
223
+ results += "<!--" + text + "-->";
224
+ }
225
+ });
226
+
227
+ return results;
228
+ };
229
+
230
+ html2dom = function( html, doc ) {
231
+ // There can be only one of these elements
232
+ var one = makeMap("html,head,body,title");
233
+
234
+ // Enforce a structure for the document
235
+ /*var structure = {
236
+ link: "head",
237
+ base: "head"
238
+ };*/
239
+
240
+ if ( !doc ) {
241
+ if ( typeof DOMDocument != "undefined" ){
242
+ doc = new DOMDocument();
243
+ }else if ( typeof document != "undefined" && document.implementation && document.implementation.createDocument ){
244
+ doc = document.implementation.createDocument("", "", null);
245
+ }else if ( typeof ActiveX != "undefined" ){
246
+ doc = new ActiveXObject("Msxml.DOMDocument");
247
+ }
248
+ } else {
249
+ doc = doc.ownerDocument ||
250
+ doc.getOwnerDocument && doc.getOwnerDocument() ||
251
+ doc;
252
+ }
253
+
254
+ var elems = [],
255
+ documentElement = doc.documentElement ||
256
+ doc.getDocumentElement && doc.getDocumentElement();
257
+
258
+ // If we're dealing with an empty document then we
259
+ // need to pre-populate it with the HTML document structure
260
+ /*if ( !documentElement && doc.createElement ) (function(){
261
+ //$log("HTMLtoDOM: adding structure... ");
262
+ var html = doc.createElement("html");
263
+ var head = doc.createElement("head");
264
+ head.appendChild( doc.createElement("title") );
265
+ html.appendChild( head );
266
+ html.appendChild( doc.createElement("body") );
267
+ doc.appendChild( html );
268
+ doc.documentElement = html;
269
+ })();*/
270
+
271
+ // Find all the unique elements
272
+ /*if ( doc.getElementsByTagName ){
273
+ for ( var i in one ){
274
+ one[ i ] = doc.getElementsByTagName( i )[0];
275
+ }
276
+ }*/
277
+
278
+ // If we're working with a document, inject contents into
279
+ // the body element
280
+ var curParentNode;// = one.body;
281
+
282
+ //$log("HTMLtoDOM: Parsing... ");
283
+ HTMLParser( html, {
284
+ start: function( tagName, attrs, unary ) {
285
+
286
+ var elem;
287
+ //$log("HTMLtoDOM: createElement... " + tagName);
288
+ elem = doc.createElement( tagName );
289
+
290
+
291
+ for ( var attr in attrs ){
292
+ //$log("HTMLtoDOM: setAttribute... " + attrs[ attr ].name);
293
+ elem.setAttribute( attrs[ attr ].name, attrs[ attr ].value );
294
+ }
295
+
296
+ if ( !doc.documentElement ){
297
+ //$log("HTMLtoDOM: documentElement... " + elem.nodeName);
298
+ doc.documentElement = elem;
299
+ doc.appendChild( elem );
300
+ }
301
+
302
+ else if ( curParentNode && curParentNode.appendChild ){
303
+ //$log("HTMLtoDOM: curParentNode.appendChild... " + curParentNode.nodeName + " -> " +elem.nodeName);
304
+ curParentNode.appendChild( elem );
305
+ }
306
+
307
+ if ( !unary ) {
308
+ //$log("start : push into elems[] " + tagName);
309
+ elems.push( elem );
310
+ curParentNode = elem;
311
+ }
312
+ },
313
+ end: function( tag ) {
314
+ //$log(tag + " : elems.lengths : "+elems.length);
315
+ elems.length -= 1;
316
+
317
+ // Init the new parentNode
318
+ curParentNode = elems[ elems.length - 1 ];
319
+
320
+ },
321
+ chars: function( text ) {
322
+ curParentNode.appendChild( doc.createTextNode( text ) );
323
+ },
324
+ comment: function( text ) {
325
+ curParentNode.appendChild( doc.createComment( text ) );
326
+ }
327
+ });
328
+
329
+ //$log("HTMLtoDOM: doc... " + doc);
330
+ return doc;
331
+ };
332
+
333
+ function makeMap(str){
334
+ var obj = {}, items = str.split(",");
335
+ for ( var i = 0; i < items.length; i++ )
336
+ obj[ items[i] ] = true;
337
+ return obj;
338
+ };
339
+
340
+ })( );