magic_xml 0.1.0

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 (287) hide show
  1. data/README +22 -0
  2. data/Rakefile +52 -0
  3. data/VERSION +1 -0
  4. data/doc/classes/Array.html +148 -0
  5. data/doc/classes/File.html +113 -0
  6. data/doc/classes/Hash.html +117 -0
  7. data/doc/classes/Patterns_all.html +145 -0
  8. data/doc/classes/Patterns_any.html +145 -0
  9. data/doc/classes/String.html +470 -0
  10. data/doc/classes/Symbol.html +145 -0
  11. data/doc/classes/XML.html +1881 -0
  12. data/doc/classes/XML_Comment.html +148 -0
  13. data/doc/classes/XML_PI.html +145 -0
  14. data/doc/classes/XML_Tests.html +1727 -0
  15. data/doc/files/magic_xml_rb.html +186 -0
  16. data/doc/files/simple_examples/xml_hello_f_rb.html +88 -0
  17. data/doc/files/simple_examples/xml_hello_m_rb.html +88 -0
  18. data/doc/files/simple_examples/xml_list_f_rb.html +88 -0
  19. data/doc/files/simple_examples/xml_list_m_rb.html +88 -0
  20. data/doc/files/tests_rb.html +94 -0
  21. data/doc/files/xquery_use_cases/parts/q1_rb.html +117 -0
  22. data/doc/files/xquery_use_cases/rdb/q10_rb.html +88 -0
  23. data/doc/files/xquery_use_cases/rdb/q11_rb.html +88 -0
  24. data/doc/files/xquery_use_cases/rdb/q12_rb.html +88 -0
  25. data/doc/files/xquery_use_cases/rdb/q13_rb.html +88 -0
  26. data/doc/files/xquery_use_cases/rdb/q14_rb.html +88 -0
  27. data/doc/files/xquery_use_cases/rdb/q15_rb.html +88 -0
  28. data/doc/files/xquery_use_cases/rdb/q16_rb.html +88 -0
  29. data/doc/files/xquery_use_cases/rdb/q17_rb.html +88 -0
  30. data/doc/files/xquery_use_cases/rdb/q18_rb.html +88 -0
  31. data/doc/files/xquery_use_cases/rdb/q1_rb.html +88 -0
  32. data/doc/files/xquery_use_cases/rdb/q2_rb.html +88 -0
  33. data/doc/files/xquery_use_cases/rdb/q3_rb.html +88 -0
  34. data/doc/files/xquery_use_cases/rdb/q4_rb.html +88 -0
  35. data/doc/files/xquery_use_cases/rdb/q5_rb.html +88 -0
  36. data/doc/files/xquery_use_cases/rdb/q6_rb.html +88 -0
  37. data/doc/files/xquery_use_cases/rdb/q7_rb.html +88 -0
  38. data/doc/files/xquery_use_cases/rdb/q8_rb.html +88 -0
  39. data/doc/files/xquery_use_cases/rdb/q9_rb.html +88 -0
  40. data/doc/files/xquery_use_cases/seq/q1_rb.html +88 -0
  41. data/doc/files/xquery_use_cases/seq/q2_rb.html +88 -0
  42. data/doc/files/xquery_use_cases/seq/q3_rb.html +88 -0
  43. data/doc/files/xquery_use_cases/seq/q4_rb.html +88 -0
  44. data/doc/files/xquery_use_cases/seq/q5_rb.html +88 -0
  45. data/doc/files/xquery_use_cases/sgml/q10_rb.html +88 -0
  46. data/doc/files/xquery_use_cases/sgml/q1_rb.html +88 -0
  47. data/doc/files/xquery_use_cases/sgml/q2_rb.html +88 -0
  48. data/doc/files/xquery_use_cases/sgml/q3_rb.html +88 -0
  49. data/doc/files/xquery_use_cases/sgml/q4_rb.html +88 -0
  50. data/doc/files/xquery_use_cases/sgml/q5_rb.html +88 -0
  51. data/doc/files/xquery_use_cases/sgml/q6_rb.html +88 -0
  52. data/doc/files/xquery_use_cases/sgml/q7_rb.html +88 -0
  53. data/doc/files/xquery_use_cases/sgml/q8a_rb.html +88 -0
  54. data/doc/files/xquery_use_cases/sgml/q8b_rb.html +88 -0
  55. data/doc/files/xquery_use_cases/sgml/q9_rb.html +88 -0
  56. data/doc/files/xquery_use_cases/solution_sizes_rb.html +88 -0
  57. data/doc/files/xquery_use_cases/string/q1_rb.html +88 -0
  58. data/doc/files/xquery_use_cases/string/q2_rb.html +93 -0
  59. data/doc/files/xquery_use_cases/string/q4_rb.html +88 -0
  60. data/doc/files/xquery_use_cases/string/q5_rb.html +88 -0
  61. data/doc/files/xquery_use_cases/test_driver_rb.html +92 -0
  62. data/doc/files/xquery_use_cases/tree/q1_rb.html +111 -0
  63. data/doc/files/xquery_use_cases/tree/q2_rb.html +88 -0
  64. data/doc/files/xquery_use_cases/tree/q3_rb.html +88 -0
  65. data/doc/files/xquery_use_cases/tree/q4_rb.html +88 -0
  66. data/doc/files/xquery_use_cases/tree/q5_rb.html +88 -0
  67. data/doc/files/xquery_use_cases/tree/q6_rb.html +113 -0
  68. data/doc/files/xquery_use_cases/xmp/q10_rb.html +88 -0
  69. data/doc/files/xquery_use_cases/xmp/q11_rb.html +88 -0
  70. data/doc/files/xquery_use_cases/xmp/q12_rb.html +88 -0
  71. data/doc/files/xquery_use_cases/xmp/q1_rb.html +88 -0
  72. data/doc/files/xquery_use_cases/xmp/q2_rb.html +88 -0
  73. data/doc/files/xquery_use_cases/xmp/q3_rb.html +88 -0
  74. data/doc/files/xquery_use_cases/xmp/q4_rb.html +88 -0
  75. data/doc/files/xquery_use_cases/xmp/q5_rb.html +92 -0
  76. data/doc/files/xquery_use_cases/xmp/q6_rb.html +88 -0
  77. data/doc/files/xquery_use_cases/xmp/q7_rb.html +88 -0
  78. data/doc/files/xquery_use_cases/xmp/q8_rb.html +88 -0
  79. data/doc/files/xquery_use_cases/xmp/q9_rb.html +88 -0
  80. data/doc/fr_class_index.html +56 -0
  81. data/doc/fr_file_index.html +110 -0
  82. data/doc/fr_method_index.html +159 -0
  83. data/doc/index.html +26 -0
  84. data/doc/rdoc-style.css +175 -0
  85. data/lib/magic_xml.rb +1400 -0
  86. data/simple_examples/README +14 -0
  87. data/simple_examples/xml_hello_f.rb +32 -0
  88. data/simple_examples/xml_hello_m.rb +32 -0
  89. data/simple_examples/xml_list_f.rb +36 -0
  90. data/simple_examples/xml_list_m.rb +36 -0
  91. data/test/helper.rb +9 -0
  92. data/test/test_magic_xml.rb +855 -0
  93. data/xquery_use_cases/README +17 -0
  94. data/xquery_use_cases/parts/README +12 -0
  95. data/xquery_use_cases/parts/partlist.xml +13 -0
  96. data/xquery_use_cases/parts/q1.out +16 -0
  97. data/xquery_use_cases/parts/q1.rb +38 -0
  98. data/xquery_use_cases/parts/q1.xquery +18 -0
  99. data/xquery_use_cases/rdb/README +50 -0
  100. data/xquery_use_cases/rdb/bids.xml +81 -0
  101. data/xquery_use_cases/rdb/items.xml +57 -0
  102. data/xquery_use_cases/rdb/q1.out +10 -0
  103. data/xquery_use_cases/rdb/q1.rb +31 -0
  104. data/xquery_use_cases/rdb/q1.xquery +14 -0
  105. data/xquery_use_cases/rdb/q10.out +27 -0
  106. data/xquery_use_cases/rdb/q10.rb +37 -0
  107. data/xquery_use_cases/rdb/q10.xquery +15 -0
  108. data/xquery_use_cases/rdb/q11.out +7 -0
  109. data/xquery_use_cases/rdb/q11.rb +38 -0
  110. data/xquery_use_cases/rdb/q11.xquery +15 -0
  111. data/xquery_use_cases/rdb/q12.out +12 -0
  112. data/xquery_use_cases/rdb/q12.rb +42 -0
  113. data/xquery_use_cases/rdb/q12.xquery +28 -0
  114. data/xquery_use_cases/rdb/q13.out +32 -0
  115. data/xquery_use_cases/rdb/q13.rb +45 -0
  116. data/xquery_use_cases/rdb/q13.xquery +15 -0
  117. data/xquery_use_cases/rdb/q14.out +14 -0
  118. data/xquery_use_cases/rdb/q14.rb +42 -0
  119. data/xquery_use_cases/rdb/q14.xquery +14 -0
  120. data/xquery_use_cases/rdb/q15.out +5 -0
  121. data/xquery_use_cases/rdb/q15.rb +31 -0
  122. data/xquery_use_cases/rdb/q15.xquery +9 -0
  123. data/xquery_use_cases/rdb/q16.out +35 -0
  124. data/xquery_use_cases/rdb/q16.rb +35 -0
  125. data/xquery_use_cases/rdb/q16.xquery +17 -0
  126. data/xquery_use_cases/rdb/q17.out +1 -0
  127. data/xquery_use_cases/rdb/q17.rb +35 -0
  128. data/xquery_use_cases/rdb/q17.xquery +11 -0
  129. data/xquery_use_cases/rdb/q18.out +32 -0
  130. data/xquery_use_cases/rdb/q18.rb +40 -0
  131. data/xquery_use_cases/rdb/q18.xquery +19 -0
  132. data/xquery_use_cases/rdb/q2.out +22 -0
  133. data/xquery_use_cases/rdb/q2.rb +36 -0
  134. data/xquery_use_cases/rdb/q2.xquery +14 -0
  135. data/xquery_use_cases/rdb/q3.out +8 -0
  136. data/xquery_use_cases/rdb/q3.rb +34 -0
  137. data/xquery_use_cases/rdb/q3.xquery +16 -0
  138. data/xquery_use_cases/rdb/q4.out +14 -0
  139. data/xquery_use_cases/rdb/q4.rb +31 -0
  140. data/xquery_use_cases/rdb/q4.xquery +11 -0
  141. data/xquery_use_cases/rdb/q5.out +12 -0
  142. data/xquery_use_cases/rdb/q5.rb +46 -0
  143. data/xquery_use_cases/rdb/q5.xquery +25 -0
  144. data/xquery_use_cases/rdb/q6.out +14 -0
  145. data/xquery_use_cases/rdb/q6.rb +38 -0
  146. data/xquery_use_cases/rdb/q6.xquery +15 -0
  147. data/xquery_use_cases/rdb/q7.out +1 -0
  148. data/xquery_use_cases/rdb/q7.rb +30 -0
  149. data/xquery_use_cases/rdb/q7.xquery +10 -0
  150. data/xquery_use_cases/rdb/q8.out +1 -0
  151. data/xquery_use_cases/rdb/q8.rb +23 -0
  152. data/xquery_use_cases/rdb/q8.xquery +8 -0
  153. data/xquery_use_cases/rdb/q9.out +22 -0
  154. data/xquery_use_cases/rdb/q9.rb +32 -0
  155. data/xquery_use_cases/rdb/q9.xquery +16 -0
  156. data/xquery_use_cases/rdb/users.xml +25 -0
  157. data/xquery_use_cases/seq/README +12 -0
  158. data/xquery_use_cases/seq/q1.out +1 -0
  159. data/xquery_use_cases/seq/q1.rb +25 -0
  160. data/xquery_use_cases/seq/q1.xquery +2 -0
  161. data/xquery_use_cases/seq/q2.out +2 -0
  162. data/xquery_use_cases/seq/q2.rb +25 -0
  163. data/xquery_use_cases/seq/q2.xquery +2 -0
  164. data/xquery_use_cases/seq/q3.out +2 -0
  165. data/xquery_use_cases/seq/q3.rb +26 -0
  166. data/xquery_use_cases/seq/q3.xquery +3 -0
  167. data/xquery_use_cases/seq/q4.out +0 -0
  168. data/xquery_use_cases/seq/q4.rb +27 -0
  169. data/xquery_use_cases/seq/q4.xquery +4 -0
  170. data/xquery_use_cases/seq/q5.out +5 -0
  171. data/xquery_use_cases/seq/q5.rb +29 -0
  172. data/xquery_use_cases/seq/q5.xquery +10 -0
  173. data/xquery_use_cases/seq/report1.xml +40 -0
  174. data/xquery_use_cases/sgml/README +53 -0
  175. data/xquery_use_cases/sgml/q1.out +44 -0
  176. data/xquery_use_cases/sgml/q1.rb +23 -0
  177. data/xquery_use_cases/sgml/q1.xquery +5 -0
  178. data/xquery_use_cases/sgml/q10.out +1 -0
  179. data/xquery_use_cases/sgml/q10.rb +28 -0
  180. data/xquery_use_cases/sgml/q10.xquery +7 -0
  181. data/xquery_use_cases/sgml/q2.out +26 -0
  182. data/xquery_use_cases/sgml/q2.rb +23 -0
  183. data/xquery_use_cases/sgml/q2.xquery +5 -0
  184. data/xquery_use_cases/sgml/q3.out +6 -0
  185. data/xquery_use_cases/sgml/q3.rb +28 -0
  186. data/xquery_use_cases/sgml/q3.xquery +7 -0
  187. data/xquery_use_cases/sgml/q4.out +4 -0
  188. data/xquery_use_cases/sgml/q4.rb +25 -0
  189. data/xquery_use_cases/sgml/q4.xquery +5 -0
  190. data/xquery_use_cases/sgml/q5.out +3 -0
  191. data/xquery_use_cases/sgml/q5.rb +23 -0
  192. data/xquery_use_cases/sgml/q5.xquery +5 -0
  193. data/xquery_use_cases/sgml/q6.out +1 -0
  194. data/xquery_use_cases/sgml/q6.rb +27 -0
  195. data/xquery_use_cases/sgml/q6.xquery +6 -0
  196. data/xquery_use_cases/sgml/q7.out +1 -0
  197. data/xquery_use_cases/sgml/q7.rb +27 -0
  198. data/xquery_use_cases/sgml/q7.xquery +7 -0
  199. data/xquery_use_cases/sgml/q8a.out +34 -0
  200. data/xquery_use_cases/sgml/q8a.rb +27 -0
  201. data/xquery_use_cases/sgml/q8a.xquery +5 -0
  202. data/xquery_use_cases/sgml/q8b.out +26 -0
  203. data/xquery_use_cases/sgml/q8b.rb +32 -0
  204. data/xquery_use_cases/sgml/q8b.xquery +5 -0
  205. data/xquery_use_cases/sgml/q9.out +9 -0
  206. data/xquery_use_cases/sgml/q9.rb +29 -0
  207. data/xquery_use_cases/sgml/q9.xquery +6 -0
  208. data/xquery_use_cases/sgml/sgml.xml +101 -0
  209. data/xquery_use_cases/solution_sizes.rb +48 -0
  210. data/xquery_use_cases/string/README +29 -0
  211. data/xquery_use_cases/string/company-data.xml +20 -0
  212. data/xquery_use_cases/string/q1.out +4 -0
  213. data/xquery_use_cases/string/q1.rb +25 -0
  214. data/xquery_use_cases/string/q1.xquery +1 -0
  215. data/xquery_use_cases/string/q2.out +13 -0
  216. data/xquery_use_cases/string/q2.rb +32 -0
  217. data/xquery_use_cases/string/q2.xquery +23 -0
  218. data/xquery_use_cases/string/q4.out +50 -0
  219. data/xquery_use_cases/string/q4.rb +34 -0
  220. data/xquery_use_cases/string/q4.xquery +14 -0
  221. data/xquery_use_cases/string/q5.out +12 -0
  222. data/xquery_use_cases/string/q5.rb +33 -0
  223. data/xquery_use_cases/string/q5.xquery +8 -0
  224. data/xquery_use_cases/string/string.xml +82 -0
  225. data/xquery_use_cases/test_driver.rb +60 -0
  226. data/xquery_use_cases/tree/README +23 -0
  227. data/xquery_use_cases/tree/book.xml +50 -0
  228. data/xquery_use_cases/tree/q1.out +23 -0
  229. data/xquery_use_cases/tree/q1.rb +31 -0
  230. data/xquery_use_cases/tree/q1.xquery +14 -0
  231. data/xquery_use_cases/tree/q2.out +11 -0
  232. data/xquery_use_cases/tree/q2.rb +27 -0
  233. data/xquery_use_cases/tree/q2.xquery +10 -0
  234. data/xquery_use_cases/tree/q3.out +2 -0
  235. data/xquery_use_cases/tree/q3.rb +26 -0
  236. data/xquery_use_cases/tree/q3.xquery +2 -0
  237. data/xquery_use_cases/tree/q4.out +1 -0
  238. data/xquery_use_cases/tree/q4.rb +23 -0
  239. data/xquery_use_cases/tree/q4.xquery +5 -0
  240. data/xquery_use_cases/tree/q5.out +9 -0
  241. data/xquery_use_cases/tree/q5.rb +30 -0
  242. data/xquery_use_cases/tree/q5.xquery +8 -0
  243. data/xquery_use_cases/tree/q6.out +30 -0
  244. data/xquery_use_cases/tree/q6.rb +35 -0
  245. data/xquery_use_cases/tree/q6.xquery +21 -0
  246. data/xquery_use_cases/xmp/README +41 -0
  247. data/xquery_use_cases/xmp/bib.xml +35 -0
  248. data/xquery_use_cases/xmp/books.xml +15 -0
  249. data/xquery_use_cases/xmp/prices.xml +32 -0
  250. data/xquery_use_cases/xmp/q1.out +8 -0
  251. data/xquery_use_cases/xmp/q1.rb +29 -0
  252. data/xquery_use_cases/xmp/q1.xquery +10 -0
  253. data/xquery_use_cases/xmp/q10.out +11 -0
  254. data/xquery_use_cases/xmp/q10.rb +36 -0
  255. data/xquery_use_cases/xmp/q10.xquery +11 -0
  256. data/xquery_use_cases/xmp/q11.out +35 -0
  257. data/xquery_use_cases/xmp/q11.rb +37 -0
  258. data/xquery_use_cases/xmp/q11.xquery +18 -0
  259. data/xquery_use_cases/xmp/q12.out +6 -0
  260. data/xquery_use_cases/xmp/q12.rb +35 -0
  261. data/xquery_use_cases/xmp/q12.xquery +20 -0
  262. data/xquery_use_cases/xmp/q2.out +37 -0
  263. data/xquery_use_cases/xmp/q2.rb +30 -0
  264. data/xquery_use_cases/xmp/q2.xquery +12 -0
  265. data/xquery_use_cases/xmp/q3.out +34 -0
  266. data/xquery_use_cases/xmp/q3.rb +27 -0
  267. data/xquery_use_cases/xmp/q3.xquery +10 -0
  268. data/xquery_use_cases/xmp/q4.out +31 -0
  269. data/xquery_use_cases/xmp/q4.rb +44 -0
  270. data/xquery_use_cases/xmp/q4.xquery +21 -0
  271. data/xquery_use_cases/xmp/q5.out +17 -0
  272. data/xquery_use_cases/xmp/q5.rb +38 -0
  273. data/xquery_use_cases/xmp/q5.xquery +13 -0
  274. data/xquery_use_cases/xmp/q6.out +28 -0
  275. data/xquery_use_cases/xmp/q6.rb +33 -0
  276. data/xquery_use_cases/xmp/q6.xquery +19 -0
  277. data/xquery_use_cases/xmp/q7.out +8 -0
  278. data/xquery_use_cases/xmp/q7.rb +30 -0
  279. data/xquery_use_cases/xmp/q7.xquery +12 -0
  280. data/xquery_use_cases/xmp/q8.out +7 -0
  281. data/xquery_use_cases/xmp/q8.rb +29 -0
  282. data/xquery_use_cases/xmp/q8.xquery +9 -0
  283. data/xquery_use_cases/xmp/q9.out +4 -0
  284. data/xquery_use_cases/xmp/q9.rb +29 -0
  285. data/xquery_use_cases/xmp/q9.xquery +7 -0
  286. data/xquery_use_cases/xmp/reviews.xml +24 -0
  287. metadata +342 -0
@@ -0,0 +1,1881 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html>
6
+ <head>
7
+ <title>Class: XML</title>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
10
+
11
+ <script language="JavaScript" type="text/javascript">
12
+ // <![CDATA[
13
+
14
+ function toggleSource( id )
15
+ {
16
+ var elem
17
+ var link
18
+
19
+ if( document.getElementById )
20
+ {
21
+ elem = document.getElementById( id )
22
+ link = document.getElementById( "l_" + id )
23
+ }
24
+ else if ( document.all )
25
+ {
26
+ elem = eval( "document.all." + id )
27
+ link = eval( "document.all.l_" + id )
28
+ }
29
+ else
30
+ return false;
31
+
32
+ if( elem.style.display == "block" )
33
+ {
34
+ elem.style.display = "none"
35
+ link.innerHTML = "show source"
36
+ }
37
+ else
38
+ {
39
+ elem.style.display = "block"
40
+ link.innerHTML = "hide source"
41
+ }
42
+ }
43
+
44
+ function openCode( url )
45
+ {
46
+ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
47
+ }
48
+ // ]]>
49
+ </script>
50
+ </head>
51
+
52
+ <body>
53
+ <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
54
+ <td class="file-title"><span class="file-title-prefix">Class</span><br />XML</td>
55
+ <td align="right">
56
+ <table cellspacing=0 cellpadding=2>
57
+ <tr valign="top">
58
+ <td>In:</td>
59
+ <td>
60
+ <a href="../files/magic_xml_rb.html">magic_xml.rb</a>
61
+ </td>
62
+ </tr>
63
+ <tr>
64
+ <td>Parent:</td>
65
+ <td>
66
+ Object
67
+ </td>
68
+ </tr>
69
+ </table>
70
+ </td>
71
+ </tr>
72
+ </table>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+ <div id="content">
77
+
78
+ <div class="description"><p>
79
+ Instance methods (other than those of Enumerable)
80
+ </p>
81
+ </div>
82
+
83
+
84
+
85
+ <div class="sectiontitle">Methods</div>
86
+ <ul>
87
+ <li><a href="#M000031">&lt;&lt;</a></li>
88
+ <li><a href="#M000032">==</a></li>
89
+ <li><a href="#M000037">=~</a></li>
90
+ <li><a href="#M000029">[]</a></li>
91
+ <li><a href="#M000030">[]=</a></li>
92
+ <li><a href="#M000045">add!</a></li>
93
+ <li><a href="#M000040">add_pretty_printing!</a></li>
94
+ <li><a href="#M000048">child</a></li>
95
+ <li><a href="#M000050">children</a></li>
96
+ <li><a href="#M000014">children_sort_by</a></li>
97
+ <li><a href="#M000052">deep_map</a></li>
98
+ <li><a href="#M000049">descendant</a></li>
99
+ <li><a href="#M000051">descendants</a></li>
100
+ <li><a href="#M000042">dup</a></li>
101
+ <li><a href="#M000012">each</a></li>
102
+ <li><a href="#M000034">exec!</a></li>
103
+ <li><a href="#M000017">from_file</a></li>
104
+ <li><a href="#M000018">from_url</a></li>
105
+ <li><a href="#M000028">inspect</a></li>
106
+ <li><a href="#M000019">load</a></li>
107
+ <li><a href="#M000053">map</a></li>
108
+ <li><a href="#M000033">method_missing</a></li>
109
+ <li><a href="#M000016">method_missing</a></li>
110
+ <li><a href="#M000026">new</a></li>
111
+ <li><a href="#M000046">normalize!</a></li>
112
+ <li><a href="#M000022">parse</a></li>
113
+ <li><a href="#M000020">parse_as_twigs</a></li>
114
+ <li><a href="#M000023">parse_sequence</a></li>
115
+ <li><a href="#M000021">parse_subtree</a></li>
116
+ <li><a href="#M000035">range</a></li>
117
+ <li><a href="#M000041">real_add_pretty_printing!</a></li>
118
+ <li><a href="#M000039">real_remove_pretty_printing!</a></li>
119
+ <li><a href="#M000038">remove_pretty_printing!</a></li>
120
+ <li><a href="#M000024">renormalize</a></li>
121
+ <li><a href="#M000025">renormalize_sequence</a></li>
122
+ <li><a href="#M000015">sort</a></li>
123
+ <li><a href="#M000013">sort_by</a></li>
124
+ <li><a href="#M000036">subsequence</a></li>
125
+ <li><a href="#M000047">text</a></li>
126
+ <li><a href="#M000043">text!</a></li>
127
+ <li><a href="#M000027">to_s</a></li>
128
+ <li><a href="#M000044">xml!</a></li>
129
+ </ul>
130
+
131
+ <div class="sectiontitle">Included Modules</div>
132
+ <ul>
133
+ <li>Enumerable</li>
134
+ </ul>
135
+
136
+
137
+
138
+
139
+ <div class="sectiontitle">Attributes</div>
140
+ <table border='0' cellpadding='5'>
141
+ <tr valign='top'>
142
+ <td class='attr-rw'>
143
+ [RW]
144
+ </td>
145
+ <td class='attr-name'>attrs</td>
146
+ <td class='attr-desc'></td>
147
+ </tr>
148
+ <tr valign='top'>
149
+ <td class='attr-rw'>
150
+ [RW]
151
+ </td>
152
+ <td class='attr-name'>contents</td>
153
+ <td class='attr-desc'></td>
154
+ </tr>
155
+ <tr valign='top'>
156
+ <td class='attr-rw'>
157
+ [RW]
158
+ </td>
159
+ <td class='attr-name'>name</td>
160
+ <td class='attr-desc'></td>
161
+ </tr>
162
+ </table>
163
+
164
+ <div class="sectiontitle">Public Class methods</div>
165
+ <div class="method">
166
+ <div class="title">
167
+ <a name="M000017"></a><b>from_file</b>(file)
168
+ </div>
169
+ <div class="description">
170
+ <p>
171
+ Read file and <a href="XML.html#M000022">parse</a>
172
+ </p>
173
+ </div>
174
+ <div class="sourcecode">
175
+ <p class="source-link">[ <a href="javascript:toggleSource('M000017_source')" id="l_M000017_source">show source</a> ]</p>
176
+ <div id="M000017_source" class="dyn-source">
177
+ <pre>
178
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 442</span>
179
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">from_file</span>(<span class="ruby-identifier">file</span>)
180
+ <span class="ruby-identifier">file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">file</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">file</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
181
+ <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">file</span>)
182
+ <span class="ruby-keyword kw">end</span>
183
+ </pre>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ <div class="method">
188
+ <div class="title">
189
+ <a name="M000018"></a><b>from_url</b>(url)
190
+ </div>
191
+ <div class="description">
192
+ <p>
193
+ Fetch URL and <a href="XML.html#M000022">parse</a> Supported:
194
+ http://&#8230;/ https://&#8230;/ file:foo.xml string:&lt;foo/&gt;
195
+ </p>
196
+ </div>
197
+ <div class="sourcecode">
198
+ <p class="source-link">[ <a href="javascript:toggleSource('M000018_source')" id="l_M000018_source">show source</a> ]</p>
199
+ <div id="M000018_source" class="dyn-source">
200
+ <pre>
201
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 453</span>
202
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">from_url</span>(<span class="ruby-identifier">url</span>)
203
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">url</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^string:(.*)$/</span><span class="ruby-identifier">m</span>
204
+ <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">$1</span>)
205
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">url</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^file:(.*)$/</span><span class="ruby-identifier">m</span>
206
+ <span class="ruby-identifier">from_file</span>(<span class="ruby-identifier">$1</span>)
207
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">url</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^http(s?):/</span>
208
+ <span class="ruby-identifier">ssl</span> = (<span class="ruby-identifier">$1</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;s&quot;</span>)
209
+ <span class="ruby-comment cmt"># No, seriously - Ruby needs something better than net/http</span>
210
+ <span class="ruby-comment cmt"># Something that groks basic auth and queries and redirects automatically:</span>
211
+ <span class="ruby-comment cmt"># HTTP_LIBRARY.get_content(&quot;http://username:passwd/u.r.l/?query&quot;)</span>
212
+ <span class="ruby-comment cmt"># URI parsing must go inside the library, client programs</span>
213
+ <span class="ruby-comment cmt"># should have nothing to do with it</span>
214
+
215
+ <span class="ruby-comment cmt"># net/http is really inconvenient to use here</span>
216
+ <span class="ruby-identifier">u</span> = <span class="ruby-constant">URI</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">url</span>)
217
+ <span class="ruby-comment cmt"># You're not seeing this:</span>
218
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">u</span>.<span class="ruby-identifier">query</span> <span class="ruby-keyword kw">then</span>
219
+ <span class="ruby-identifier">path</span> = <span class="ruby-identifier">u</span>.<span class="ruby-identifier">path</span> <span class="ruby-operator">+</span> <span class="ruby-value str">&quot;?&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">u</span>.<span class="ruby-identifier">query</span>
220
+ <span class="ruby-keyword kw">else</span>
221
+ <span class="ruby-identifier">path</span> = <span class="ruby-identifier">u</span>.<span class="ruby-identifier">path</span>
222
+ <span class="ruby-keyword kw">end</span>
223
+ <span class="ruby-identifier">req</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span><span class="ruby-operator">::</span><span class="ruby-constant">Get</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">path</span>)
224
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">u</span>.<span class="ruby-identifier">userinfo</span>
225
+ <span class="ruby-identifier">username</span>, <span class="ruby-identifier">passwd</span> = <span class="ruby-identifier">u</span>.<span class="ruby-identifier">userinfo</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp re">/:/</span>,<span class="ruby-value">2</span>)
226
+ <span class="ruby-identifier">req</span>.<span class="ruby-identifier">basic_auth</span> <span class="ruby-identifier">username</span>, <span class="ruby-identifier">passwd</span>
227
+ <span class="ruby-keyword kw">end</span>
228
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">ssl</span>
229
+ <span class="ruby-comment cmt"># NOTE: You need libopenssl-ruby installed</span>
230
+ <span class="ruby-comment cmt"># if you want to use HTTPS. Ubuntu is broken</span>
231
+ <span class="ruby-comment cmt"># as it doesn't provide it in the default packages.</span>
232
+ <span class="ruby-identifier">require</span> <span class="ruby-value str">'net/https'</span>
233
+ <span class="ruby-identifier">http</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">u</span>.<span class="ruby-identifier">host</span>, <span class="ruby-identifier">u</span>.<span class="ruby-identifier">port</span>)
234
+ <span class="ruby-identifier">http</span>.<span class="ruby-identifier">use_ssl</span> = <span class="ruby-keyword kw">true</span>
235
+ <span class="ruby-identifier">http</span>.<span class="ruby-identifier">verify_mode</span> = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSL</span><span class="ruby-operator">::</span><span class="ruby-constant">VERIFY_NONE</span>
236
+ <span class="ruby-keyword kw">else</span>
237
+ <span class="ruby-identifier">http</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">u</span>.<span class="ruby-identifier">host</span>, <span class="ruby-identifier">u</span>.<span class="ruby-identifier">port</span>)
238
+ <span class="ruby-keyword kw">end</span>
239
+
240
+ <span class="ruby-identifier">res</span> = <span class="ruby-identifier">http</span>.<span class="ruby-identifier">start</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">http</span><span class="ruby-operator">|</span> <span class="ruby-identifier">http</span>.<span class="ruby-identifier">request</span>(<span class="ruby-identifier">req</span>) }
241
+ <span class="ruby-comment cmt"># TODO: Throw a more meaningful exception</span>
242
+ <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">res</span>.<span class="ruby-identifier">body</span>)
243
+ <span class="ruby-keyword kw">else</span>
244
+ <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;URL protocol #{url} not supported (http, https, file, string are supported)&quot;</span>
245
+ <span class="ruby-keyword kw">end</span>
246
+ <span class="ruby-keyword kw">end</span>
247
+ </pre>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ <div class="method">
252
+ <div class="title">
253
+ <a name="M000019"></a><b>load</b>(obj)
254
+ </div>
255
+ <div class="description">
256
+ <p>
257
+ Like CDuce load_xml The path can be:
258
+ </p>
259
+ <ul>
260
+ <li>file handler
261
+
262
+ </li>
263
+ <li>URL (a string with :)
264
+
265
+ </li>
266
+ <li>file name (a string without :)
267
+
268
+ </li>
269
+ </ul>
270
+ </div>
271
+ <div class="sourcecode">
272
+ <p class="source-link">[ <a href="javascript:toggleSource('M000019_source')" id="l_M000019_source">show source</a> ]</p>
273
+ <div id="M000019_source" class="dyn-source">
274
+ <pre>
275
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 504</span>
276
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">obj</span>)
277
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
278
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">include?</span> <span class="ruby-value str">&quot;:&quot;</span>
279
+ <span class="ruby-identifier">from_url</span>(<span class="ruby-identifier">obj</span>)
280
+ <span class="ruby-keyword kw">else</span>
281
+ <span class="ruby-identifier">from_file</span>(<span class="ruby-identifier">obj</span>)
282
+ <span class="ruby-keyword kw">end</span>
283
+ <span class="ruby-keyword kw">else</span>
284
+ <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">obj</span>)
285
+ <span class="ruby-keyword kw">end</span>
286
+ <span class="ruby-keyword kw">end</span>
287
+ </pre>
288
+ </div>
289
+ </div>
290
+ </div>
291
+ <div class="method">
292
+ <div class="title">
293
+ <a name="M000016"></a><b>method_missing</b>(meth, *args, &amp;blk)
294
+ </div>
295
+ <div class="description">
296
+ <p>
297
+ XML.foo! == <a href="XML.html#M000044">xml!</a>(:foo) XML.foo == xml(:foo)
298
+ </p>
299
+ </div>
300
+ <div class="sourcecode">
301
+ <p class="source-link">[ <a href="javascript:toggleSource('M000016_source')" id="l_M000016_source">show source</a> ]</p>
302
+ <div id="M000016_source" class="dyn-source">
303
+ <pre>
304
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 433</span>
305
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">method_missing</span>(<span class="ruby-identifier">meth</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
306
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">meth</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^(.*)!$/</span>
307
+ <span class="ruby-identifier">xml!</span>(<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
308
+ <span class="ruby-keyword kw">else</span>
309
+ <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">meth</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
310
+ <span class="ruby-keyword kw">end</span>
311
+ <span class="ruby-keyword kw">end</span>
312
+ </pre>
313
+ </div>
314
+ </div>
315
+ </div>
316
+ <div class="method">
317
+ <div class="title">
318
+ <a name="M000026"></a><b>new</b>(*args, &amp;blk)
319
+ </div>
320
+ <div class="description">
321
+ <p>
322
+ initialize can be run in many ways
323
+ </p>
324
+ <ul>
325
+ <li><a href="XML.html#M000026">XML.new</a>
326
+
327
+ </li>
328
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol)
329
+
330
+ </li>
331
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol, {attributes})
332
+
333
+ </li>
334
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol, &quot;<a
335
+ href="XML.html#M000050">children</a>&quot;, &quot;more&quot;, <a
336
+ href="XML.html#M000026">XML.new(...)</a>)
337
+
338
+ </li>
339
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol, {attributes},
340
+ &quot;and&quot;, &quot;<a href="XML.html#M000050">children</a>&quot;)
341
+
342
+ </li>
343
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol) { monadic code }
344
+
345
+ </li>
346
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol, {attributes}) { monadic
347
+ code }
348
+
349
+ </li>
350
+ </ul>
351
+ <p>
352
+ Or even:
353
+ </p>
354
+ <ul>
355
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol, &quot;<a
356
+ href="XML.html#M000050">children</a>&quot;) { and some monadic code }
357
+
358
+ </li>
359
+ <li><a href="XML.html#M000026">XML.new</a>(:tag_symbol, {attributes}, &quot;<a
360
+ href="XML.html#M000050">children</a>&quot;) { and some monadic code }
361
+
362
+ </li>
363
+ </ul>
364
+ <p>
365
+ But typically you won&#8216;t be mixing these two style
366
+ </p>
367
+ <p>
368
+ Attribute values can will be converted to strings
369
+ </p>
370
+ </div>
371
+ <div class="sourcecode">
372
+ <p class="source-link">[ <a href="javascript:toggleSource('M000026_source')" id="l_M000026_source">show source</a> ]</p>
373
+ <div id="M000026_source" class="dyn-source">
374
+ <pre>
375
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 773</span>
376
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
377
+ <span class="ruby-ivar">@name</span> = <span class="ruby-keyword kw">nil</span>
378
+ <span class="ruby-ivar">@attrs</span> = {}
379
+ <span class="ruby-ivar">@contents</span> = []
380
+ <span class="ruby-ivar">@name</span> = <span class="ruby-identifier">args</span>.<span class="ruby-identifier">shift</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">args</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
381
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">args</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">args</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Hash</span>
382
+ <span class="ruby-identifier">args</span>.<span class="ruby-identifier">shift</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
383
+ <span class="ruby-comment cmt"># Do automatic conversion here</span>
384
+ <span class="ruby-comment cmt"># This also assures that the hashes are *not* shared</span>
385
+ <span class="ruby-keyword kw">self</span>[<span class="ruby-identifier">k</span>] = <span class="ruby-identifier">v</span>
386
+ }
387
+ <span class="ruby-keyword kw">end</span>
388
+ <span class="ruby-comment cmt"># Expand Arrays passed as arguments</span>
389
+ <span class="ruby-keyword kw">self</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">args</span>
390
+ <span class="ruby-comment cmt"># FIXME: We'd rather not have people say @name = :foo there :-)</span>
391
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">blk</span>
392
+ <span class="ruby-identifier">instance_eval</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
393
+ <span class="ruby-keyword kw">end</span>
394
+ <span class="ruby-keyword kw">end</span>
395
+ </pre>
396
+ </div>
397
+ </div>
398
+ </div>
399
+ <div class="method">
400
+ <div class="title">
401
+ <a name="M000022"></a><b>parse</b>(stream, options={})
402
+ </div>
403
+ <div class="description">
404
+ <p>
405
+ Parse <a href="XML.html">XML</a> using REXML. Available options:
406
+ </p>
407
+ <ul>
408
+ <li>:extra_entities =&gt; Proc or <a href="Hash.html">Hash</a> (default = nil)
409
+
410
+ </li>
411
+ <li>:remove_pretty_printing =&gt; true/false (default = false)
412
+
413
+ </li>
414
+ <li>:comments =&gt; true/false (default = false)
415
+
416
+ </li>
417
+ <li>:pi =&gt; true/false (default = false)
418
+
419
+ </li>
420
+ <li>:normalize =&gt; true/false (default = false) - normalize
421
+
422
+ </li>
423
+ <li>:multiple_roots =&gt; true/false (default=false) - document
424
+
425
+ <pre>
426
+ can have any number of roots (instread of one).
427
+ Return all in an array instead of root/nil.
428
+ Also include non-elements (String/PI/Comment) in the return set !!!
429
+ </pre>
430
+ </li>
431
+ </ul>
432
+ <p>
433
+ FIXME: :comments/:pi will break everything if there are comments/PIs
434
+ outside document root. Now PIs are outside the document root more often
435
+ than not, so we&#8216;re pretty much screwed here.
436
+ </p>
437
+ <p>
438
+ FIXME: Integrate all kinds of <a href="XML.html#M000022">parse</a>, and
439
+ make them support extra options
440
+ </p>
441
+ <p>
442
+ FIXME: Benchmark <a href="XML.html#M000046">normalize!</a>
443
+ </p>
444
+ <p>
445
+ FIXME: Benchmark <a href="XML.html#M000042">dup</a>-based Enumerable
446
+ methods
447
+ </p>
448
+ <p>
449
+ FIXME: Make it possible to include bogus XML_Document superparent,
450
+ </p>
451
+ <pre>
452
+ and to make it support out-of-root PIs/Comments
453
+ </pre>
454
+ </div>
455
+ <div class="sourcecode">
456
+ <p class="source-link">[ <a href="javascript:toggleSource('M000022_source')" id="l_M000022_source">show source</a> ]</p>
457
+ <div id="M000022_source" class="dyn-source">
458
+ <pre>
459
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 655</span>
460
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">stream</span>, <span class="ruby-identifier">options</span>={})
461
+ <span class="ruby-identifier">extra_entities</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:extra_entities</span>]
462
+
463
+ <span class="ruby-identifier">parser</span> = <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">Parsers</span><span class="ruby-operator">::</span><span class="ruby-constant">BaseParser</span>.<span class="ruby-identifier">new</span> <span class="ruby-identifier">stream</span>
464
+ <span class="ruby-identifier">stack</span> = [[]]
465
+
466
+ <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
467
+ <span class="ruby-identifier">event</span> = <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">pull</span>
468
+ <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">event</span>[<span class="ruby-value">0</span>]
469
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:start_element</span>
470
+ <span class="ruby-identifier">attrs</span> = {}
471
+ <span class="ruby-identifier">event</span>[<span class="ruby-value">2</span>].<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">xml_unescape</span>(<span class="ruby-identifier">extra_entities</span>) }
472
+ <span class="ruby-identifier">stack</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">to_sym</span>, <span class="ruby-identifier">attrs</span>, <span class="ruby-identifier">event</span>[<span class="ruby-value">3</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>])
473
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-2</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>]
474
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:end_element</span>
475
+ <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">pop</span>
476
+ <span class="ruby-comment cmt"># Needs unescaping</span>
477
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:text</span>
478
+ <span class="ruby-identifier">e</span> = <span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">xml_unescape</span>(<span class="ruby-identifier">extra_entities</span>)
479
+ <span class="ruby-comment cmt"># Either inside root or in multi-root mode</span>
480
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:multiple_roots</span>]
481
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">e</span>
482
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">!~</span> <span class="ruby-regexp re">/\S/</span>
483
+ <span class="ruby-comment cmt"># Ignore out-of-root whitespace in single-root mode</span>
484
+ <span class="ruby-keyword kw">else</span>
485
+ <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Non-whitespace text out of document root (and not in multiroot mode): #{event[1]}&quot;</span>
486
+ <span class="ruby-keyword kw">end</span>
487
+ <span class="ruby-comment cmt"># CDATA is already unescaped</span>
488
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:cdata</span>
489
+ <span class="ruby-identifier">e</span> = <span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>]
490
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:multiple_roots</span>]
491
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">e</span>
492
+ <span class="ruby-keyword kw">else</span>
493
+ <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;CDATA out of the document root&quot;</span>
494
+ <span class="ruby-keyword kw">end</span>
495
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:comment</span>
496
+ <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:comments</span>]
497
+ <span class="ruby-identifier">e</span> = <span class="ruby-constant">XML_Comment</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>])
498
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:multiple_roots</span>]
499
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">e</span>
500
+ <span class="ruby-keyword kw">else</span>
501
+ <span class="ruby-comment cmt"># FIXME: Ugly !</span>
502
+ <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Comments out of the document root&quot;</span>
503
+ <span class="ruby-keyword kw">end</span>
504
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:processing_instruction</span>
505
+ <span class="ruby-comment cmt"># FIXME: Real PI node</span>
506
+ <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:pi</span>]
507
+ <span class="ruby-identifier">e</span> = <span class="ruby-constant">XML_PI</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>], <span class="ruby-identifier">event</span>[<span class="ruby-value">2</span>])
508
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:multiple_roots</span>]
509
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">e</span>
510
+ <span class="ruby-keyword kw">else</span>
511
+ <span class="ruby-comment cmt"># FIXME: Ugly !</span>
512
+ <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Processing instruction out of the document root&quot;</span>
513
+ <span class="ruby-keyword kw">end</span>
514
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:end_document</span>
515
+ <span class="ruby-keyword kw">break</span>
516
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:xmldecl</span>,<span class="ruby-identifier">:start_doctype</span>,<span class="ruby-identifier">:end_doctype</span>,<span class="ruby-identifier">:elementdecl</span>
517
+ <span class="ruby-comment cmt"># Positivery ignore</span>
518
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:externalentity</span>,<span class="ruby-identifier">:entity</span>,<span class="ruby-identifier">:attlistdecl</span>,<span class="ruby-identifier">:notationdecl</span>
519
+ <span class="ruby-comment cmt"># Ignore ???</span>
520
+ <span class="ruby-comment cmt">#print &quot;Ignored XML event #{event[0]} when parsing\n&quot;</span>
521
+ <span class="ruby-keyword kw">else</span>
522
+ <span class="ruby-comment cmt"># Huh ? What's that ?</span>
523
+ <span class="ruby-comment cmt">#print &quot;Unknown XML event #{event[0]} when parsing\n&quot;</span>
524
+ <span class="ruby-keyword kw">end</span>
525
+ <span class="ruby-keyword kw">end</span>
526
+ <span class="ruby-identifier">roots</span> = <span class="ruby-identifier">stack</span>[<span class="ruby-value">0</span>]
527
+
528
+ <span class="ruby-identifier">roots</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">root</span><span class="ruby-operator">|</span> <span class="ruby-identifier">root</span>.<span class="ruby-identifier">remove_pretty_printing!</span>} <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:remove_pretty_printing</span>]
529
+ <span class="ruby-comment cmt"># :remove_pretty_printing does :normalize anyway</span>
530
+ <span class="ruby-identifier">roots</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">root</span><span class="ruby-operator">|</span> <span class="ruby-identifier">root</span>.<span class="ruby-identifier">normalize!</span>} <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:normalize</span>]
531
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:multiple_roots</span>]
532
+ <span class="ruby-identifier">roots</span>
533
+ <span class="ruby-keyword kw">else</span>
534
+ <span class="ruby-identifier">roots</span>[<span class="ruby-value">0</span>]
535
+ <span class="ruby-keyword kw">end</span>
536
+ <span class="ruby-keyword kw">end</span>
537
+ </pre>
538
+ </div>
539
+ </div>
540
+ </div>
541
+ <div class="method">
542
+ <div class="title">
543
+ <a name="M000020"></a><b>parse_as_twigs</b>(stream) {|node| ...}
544
+ </div>
545
+ <div class="description">
546
+ <p>
547
+ Parse <a href="XML.html">XML</a> in mixed stream/tree mode Basically the
548
+ idea is that every time we get start element, we ask the block what to do
549
+ about it. If it wants a tree below it, it should call e.tree If a tree was
550
+ requested, elements below the current one are <b>not</b> processed. If it
551
+ wasn&#8216;t, they are.
552
+ </p>
553
+ <p>
554
+ For example:
555
+ </p>
556
+ <pre>
557
+ &lt;foo&gt;&lt;bar/&gt;&lt;/foo&gt;&lt;foo2/&gt;
558
+ yield &lt;foo&gt; ... &lt;/foo&gt;
559
+ .complete! called
560
+ process &lt;foo2&gt; next
561
+ </pre>
562
+ <p>
563
+ But:
564
+ </p>
565
+ <pre>
566
+ &lt;foo&gt;&lt;bar/&gt;&lt;/foo&gt;&lt;foo2/&gt;
567
+ yield &lt;foo&gt; ... &lt;/foo&gt;
568
+ .complete! not called
569
+ process &lt;bar&gt; next
570
+ </pre>
571
+ <p>
572
+ FIXME: yielded values are not reusable for now FIXME: make more
573
+ object-oriented
574
+ </p>
575
+ </div>
576
+ <div class="sourcecode">
577
+ <p class="source-link">[ <a href="javascript:toggleSource('M000020_source')" id="l_M000020_source">show source</a> ]</p>
578
+ <div id="M000020_source" class="dyn-source">
579
+ <pre>
580
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 537</span>
581
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parse_as_twigs</span>(<span class="ruby-identifier">stream</span>)
582
+ <span class="ruby-identifier">parser</span> = <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">Parsers</span><span class="ruby-operator">::</span><span class="ruby-constant">BaseParser</span>.<span class="ruby-identifier">new</span> <span class="ruby-identifier">stream</span>
583
+ <span class="ruby-comment cmt"># We don't really need to keep the stack ;-)</span>
584
+ <span class="ruby-identifier">stack</span> = []
585
+ <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
586
+ <span class="ruby-identifier">event</span> = <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">pull</span>
587
+ <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">event</span>[<span class="ruby-value">0</span>]
588
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:start_element</span>
589
+ <span class="ruby-comment cmt"># Now the evil part evil</span>
590
+ <span class="ruby-identifier">attrs</span> = {}
591
+ <span class="ruby-identifier">event</span>[<span class="ruby-value">2</span>].<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">xml_unescape</span>}
592
+ <span class="ruby-identifier">node</span> = <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">to_sym</span>, <span class="ruby-identifier">attrs</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">event</span>[<span class="ruby-value">3</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>])
593
+
594
+ <span class="ruby-comment cmt"># I can't say it's superelegant</span>
595
+ <span class="ruby-keyword kw">class</span> <span class="ruby-operator">&lt;&lt;</span><span class="ruby-identifier">node</span>
596
+ <span class="ruby-identifier">attr_accessor</span> <span class="ruby-identifier">:do_complete</span>
597
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">complete!</span>
598
+ <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@do_complete</span>
599
+ <span class="ruby-ivar">@do_complete</span>.<span class="ruby-identifier">call</span>
600
+ <span class="ruby-ivar">@do_complete</span> = <span class="ruby-keyword kw">nil</span>
601
+ <span class="ruby-keyword kw">end</span>
602
+ <span class="ruby-keyword kw">end</span>
603
+ <span class="ruby-keyword kw">end</span>
604
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">do_complete</span> = <span class="ruby-identifier">proc</span>{
605
+ <span class="ruby-identifier">parse_subtree</span>(<span class="ruby-identifier">node</span>, <span class="ruby-identifier">parser</span>)
606
+ }
607
+
608
+ <span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">node</span>)
609
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">do_complete</span>
610
+ <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">push</span> <span class="ruby-identifier">node</span>
611
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">do_complete</span> = <span class="ruby-keyword kw">nil</span> <span class="ruby-comment cmt"># It's too late, complete! shouldn't do anything now</span>
612
+ <span class="ruby-keyword kw">end</span>
613
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:end_element</span>
614
+ <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">pop</span>
615
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:end_document</span>
616
+ <span class="ruby-keyword kw">return</span>
617
+ <span class="ruby-keyword kw">else</span>
618
+ <span class="ruby-comment cmt"># FIXME: Do the right thing.</span>
619
+ <span class="ruby-comment cmt"># For now, ignore *everything* else</span>
620
+ <span class="ruby-comment cmt"># This is totally incorrect, user might want to </span>
621
+ <span class="ruby-comment cmt"># see text, comments and stuff like that anyway</span>
622
+ <span class="ruby-keyword kw">end</span>
623
+ <span class="ruby-keyword kw">end</span>
624
+ <span class="ruby-keyword kw">end</span>
625
+ </pre>
626
+ </div>
627
+ </div>
628
+ </div>
629
+ <div class="method">
630
+ <div class="title">
631
+ <a name="M000023"></a><b>parse_sequence</b>(stream, options={})
632
+ </div>
633
+ <div class="description">
634
+ <p>
635
+ Parse a sequence. Equivalent to <a
636
+ href="XML.html#M000022">XML.parse</a>(stream, :multiple_roots =&gt; true).
637
+ </p>
638
+ </div>
639
+ <div class="sourcecode">
640
+ <p class="source-link">[ <a href="javascript:toggleSource('M000023_source')" id="l_M000023_source">show source</a> ]</p>
641
+ <div id="M000023_source" class="dyn-source">
642
+ <pre>
643
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 734</span>
644
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parse_sequence</span>(<span class="ruby-identifier">stream</span>, <span class="ruby-identifier">options</span>={})
645
+ <span class="ruby-identifier">o</span> = <span class="ruby-identifier">options</span>.<span class="ruby-identifier">dup</span>
646
+ <span class="ruby-identifier">o</span>[<span class="ruby-identifier">:multiple_roots</span>] = <span class="ruby-keyword kw">true</span>
647
+ <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">stream</span>, <span class="ruby-identifier">o</span>)
648
+ <span class="ruby-keyword kw">end</span>
649
+ </pre>
650
+ </div>
651
+ </div>
652
+ </div>
653
+ <div class="method">
654
+ <div class="title">
655
+ <a name="M000021"></a><b>parse_subtree</b>(start_node, parser)
656
+ </div>
657
+ <div class="description">
658
+ <p>
659
+ Basically it&#8216;s a copy of self.parse, ugly &#8230;
660
+ </p>
661
+ </div>
662
+ <div class="sourcecode">
663
+ <p class="source-link">[ <a href="javascript:toggleSource('M000021_source')" id="l_M000021_source">show source</a> ]</p>
664
+ <div id="M000021_source" class="dyn-source">
665
+ <pre>
666
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 583</span>
667
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parse_subtree</span>(<span class="ruby-identifier">start_node</span>, <span class="ruby-identifier">parser</span>)
668
+ <span class="ruby-identifier">stack</span> = [<span class="ruby-identifier">start_node</span>]
669
+ <span class="ruby-identifier">res</span> = <span class="ruby-keyword kw">nil</span>
670
+ <span class="ruby-keyword kw">while</span> <span class="ruby-keyword kw">true</span>
671
+ <span class="ruby-identifier">event</span> = <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">pull</span>
672
+ <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">event</span>[<span class="ruby-value">0</span>]
673
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:start_element</span>
674
+ <span class="ruby-identifier">attrs</span> = {}
675
+ <span class="ruby-identifier">event</span>[<span class="ruby-value">2</span>].<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">k</span>.<span class="ruby-identifier">to_sym</span>] = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">xml_unescape</span>}
676
+ <span class="ruby-identifier">stack</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">to_sym</span>, <span class="ruby-identifier">attrs</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">event</span>[<span class="ruby-value">3</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>])
677
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
678
+ <span class="ruby-identifier">res</span> = <span class="ruby-identifier">stack</span>[<span class="ruby-value">0</span>]
679
+ <span class="ruby-keyword kw">else</span>
680
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-2</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>]
681
+ <span class="ruby-keyword kw">end</span>
682
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:end_element</span>
683
+ <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">pop</span>
684
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span> <span class="ruby-operator">==</span> []
685
+ <span class="ruby-comment cmt"># Needs unescaping</span>
686
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:text</span>
687
+ <span class="ruby-comment cmt"># Ignore whitespace</span>
688
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
689
+ <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">!~</span> <span class="ruby-regexp re">/\S/</span>
690
+ <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Non-whitespace text out of document root&quot;</span>
691
+ <span class="ruby-keyword kw">end</span>
692
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">xml_unescape</span>
693
+ <span class="ruby-comment cmt"># CDATA is already unescaped</span>
694
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:cdata</span>
695
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
696
+ <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;CDATA out of the document root&quot;</span>
697
+ <span class="ruby-keyword kw">end</span>
698
+ <span class="ruby-identifier">stack</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">event</span>[<span class="ruby-value">1</span>]
699
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:end_document</span>
700
+ <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Parse error: end_document inside a subtree, tags are not balanced&quot;</span>
701
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:xmldecl</span>,<span class="ruby-identifier">:start_doctype</span>,<span class="ruby-identifier">:end_doctype</span>,<span class="ruby-identifier">:elementdecl</span>,<span class="ruby-identifier">:processing_instruction</span>
702
+ <span class="ruby-comment cmt"># Positivery ignore</span>
703
+ <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:comment</span>,<span class="ruby-identifier">:externalentity</span>,<span class="ruby-identifier">:entity</span>,<span class="ruby-identifier">:attlistdecl</span>,<span class="ruby-identifier">:notationdecl</span>
704
+ <span class="ruby-comment cmt"># Ignore ???</span>
705
+ <span class="ruby-comment cmt">#print &quot;Ignored XML event #{event[0]} when parsing\n&quot;</span>
706
+ <span class="ruby-keyword kw">else</span>
707
+ <span class="ruby-comment cmt"># Huh ? What's that ?</span>
708
+ <span class="ruby-comment cmt">#print &quot;Unknown XML event #{event[0]} when parsing\n&quot;</span>
709
+ <span class="ruby-keyword kw">end</span>
710
+ <span class="ruby-keyword kw">end</span>
711
+ <span class="ruby-identifier">res</span>
712
+
713
+ <span class="ruby-keyword kw">end</span>
714
+ </pre>
715
+ </div>
716
+ </div>
717
+ </div>
718
+ <div class="method">
719
+ <div class="title">
720
+ <a name="M000024"></a><b>renormalize</b>(stream)
721
+ </div>
722
+ <div class="description">
723
+ <p>
724
+ Renormalize a string containing <a href="XML.html">XML</a> document
725
+ </p>
726
+ </div>
727
+ <div class="sourcecode">
728
+ <p class="source-link">[ <a href="javascript:toggleSource('M000024_source')" id="l_M000024_source">show source</a> ]</p>
729
+ <div id="M000024_source" class="dyn-source">
730
+ <pre>
731
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 741</span>
732
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">renormalize</span>(<span class="ruby-identifier">stream</span>)
733
+ <span class="ruby-identifier">parse</span>(<span class="ruby-identifier">stream</span>).<span class="ruby-identifier">to_s</span>
734
+ <span class="ruby-keyword kw">end</span>
735
+ </pre>
736
+ </div>
737
+ </div>
738
+ </div>
739
+ <div class="method">
740
+ <div class="title">
741
+ <a name="M000025"></a><b>renormalize_sequence</b>(stream)
742
+ </div>
743
+ <div class="description">
744
+ <p>
745
+ Renormalize a string containing a sequence of <a href="XML.html">XML</a>
746
+ documents and strings XMLrenormalize_sequence(&quot;&lt;hello /&gt;,
747
+ &lt;world&gt;&lt;/world&gt;!&quot;) =&gt; &quot;&lt;hello/&gt;,
748
+ &lt;world/&gt;!&quot;
749
+ </p>
750
+ </div>
751
+ <div class="sourcecode">
752
+ <p class="source-link">[ <a href="javascript:toggleSource('M000025_source')" id="l_M000025_source">show source</a> ]</p>
753
+ <div id="M000025_source" class="dyn-source">
754
+ <pre>
755
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 749</span>
756
+ <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">renormalize_sequence</span>(<span class="ruby-identifier">stream</span>)
757
+ <span class="ruby-identifier">parse_sequence</span>(<span class="ruby-identifier">stream</span>).<span class="ruby-identifier">to_s</span>
758
+ <span class="ruby-keyword kw">end</span>
759
+ </pre>
760
+ </div>
761
+ </div>
762
+ </div>
763
+ <div class="sectiontitle">Public Instance methods</div>
764
+ <div class="method">
765
+ <div class="title">
766
+ <a name="M000031"></a><b>&lt;&lt;</b>(cnt)
767
+ </div>
768
+ <div class="description">
769
+ <p>
770
+ Add <a href="XML.html#M000050">children</a>. Possible uses:
771
+ </p>
772
+ <ul>
773
+ <li>Add single element
774
+
775
+ </li>
776
+ </ul>
777
+ <pre>
778
+ self &lt;&lt; xml(...)
779
+ self &lt;&lt; &quot;foo&quot;
780
+ </pre>
781
+ <p>
782
+ Add nothing:
783
+ </p>
784
+ <pre>
785
+ self &lt;&lt; nil
786
+ </pre>
787
+ <p>
788
+ Add multiple elements (also works recursively):
789
+ </p>
790
+ <pre>
791
+ self &lt;&lt; [a, b, c]
792
+ self &lt;&lt; [a, [b, c], d]
793
+ </pre>
794
+ </div>
795
+ <div class="aka">
796
+ This method is also aliased as
797
+ <a href="XML.html#M000045">add!</a>
798
+ </div>
799
+ <div class="sourcecode">
800
+ <p class="source-link">[ <a href="javascript:toggleSource('M000031_source')" id="l_M000031_source">show source</a> ]</p>
801
+ <div id="M000031_source" class="dyn-source">
802
+ <pre>
803
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 863</span>
804
+ <span class="ruby-keyword kw">def</span> <span class="ruby-operator">&lt;&lt;</span>(<span class="ruby-identifier">cnt</span>)
805
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">cnt</span>.<span class="ruby-identifier">nil?</span>
806
+ <span class="ruby-comment cmt"># skip</span>
807
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">cnt</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Array</span>
808
+ <span class="ruby-identifier">cnt</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">elem</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">elem</span>}
809
+ <span class="ruby-keyword kw">else</span>
810
+ <span class="ruby-ivar">@contents</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">cnt</span>
811
+ <span class="ruby-keyword kw">end</span>
812
+ <span class="ruby-keyword kw">self</span>
813
+ <span class="ruby-keyword kw">end</span>
814
+ </pre>
815
+ </div>
816
+ </div>
817
+ </div>
818
+ <div class="method">
819
+ <div class="title">
820
+ <a name="M000032"></a><b>==</b>(x)
821
+ </div>
822
+ <div class="description">
823
+ <p>
824
+ Equality test, works as if XMLs were normalized, so:
825
+ </p>
826
+ <pre>
827
+ XML.new(:foo, &quot;Hello, &quot;, &quot;world&quot;) == XML.new(:foo, &quot;Hello, world&quot;)
828
+ </pre>
829
+ </div>
830
+ <div class="sourcecode">
831
+ <p class="source-link">[ <a href="javascript:toggleSource('M000032_source')" id="l_M000032_source">show source</a> ]</p>
832
+ <div id="M000032_source" class="dyn-source">
833
+ <pre>
834
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 876</span>
835
+ <span class="ruby-keyword kw">def</span> <span class="ruby-operator">==</span>(<span class="ruby-identifier">x</span>)
836
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
837
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">name</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">name</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">attrs</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">attrs</span>
838
+ <span class="ruby-comment cmt"># Now the hard part, strings can be split in different ways</span>
839
+ <span class="ruby-comment cmt"># empty string children are possible etc.</span>
840
+ <span class="ruby-identifier">self_i</span> = <span class="ruby-value">0</span>
841
+ <span class="ruby-identifier">othr_i</span> = <span class="ruby-value">0</span>
842
+ <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">self_i</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">contents</span>.<span class="ruby-identifier">size</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">othr_i</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>.<span class="ruby-identifier">size</span>
843
+ <span class="ruby-comment cmt"># Ignore &quot;&quot;s</span>
844
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">contents</span>[<span class="ruby-identifier">self_i</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">contents</span>[<span class="ruby-identifier">self_i</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;&quot;</span>
845
+ <span class="ruby-identifier">self_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
846
+ <span class="ruby-keyword kw">next</span>
847
+ <span class="ruby-keyword kw">end</span>
848
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>[<span class="ruby-identifier">othr_i</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>[<span class="ruby-identifier">othr_i</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;&quot;</span>
849
+ <span class="ruby-identifier">othr_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
850
+ <span class="ruby-keyword kw">next</span>
851
+ <span class="ruby-keyword kw">end</span>
852
+
853
+ <span class="ruby-comment cmt"># If one is finished and the other contains non-empty elements,</span>
854
+ <span class="ruby-comment cmt"># they are not equal</span>
855
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">self_i</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">contents</span>.<span class="ruby-identifier">size</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">othr_i</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>.<span class="ruby-identifier">size</span>
856
+
857
+ <span class="ruby-comment cmt"># Are they both Strings ?</span>
858
+ <span class="ruby-comment cmt"># Strings can be divided in different ways, and calling normalize!</span>
859
+ <span class="ruby-comment cmt"># here would be rather expensive, so let's use this complicated</span>
860
+ <span class="ruby-comment cmt"># algorithm</span>
861
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">contents</span>[<span class="ruby-identifier">self_i</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>[<span class="ruby-identifier">othr_i</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
862
+ <span class="ruby-identifier">a</span> = <span class="ruby-identifier">contents</span>[<span class="ruby-identifier">self_i</span>]
863
+ <span class="ruby-identifier">b</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>[<span class="ruby-identifier">othr_i</span>]
864
+ <span class="ruby-identifier">self_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
865
+ <span class="ruby-identifier">othr_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
866
+ <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">a</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">&quot;&quot;</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">b</span> <span class="ruby-operator">!=</span> <span class="ruby-value str">&quot;&quot;</span>
867
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">b</span>
868
+ <span class="ruby-identifier">a</span> = <span class="ruby-value str">&quot;&quot;</span>
869
+ <span class="ruby-identifier">b</span> = <span class="ruby-value str">&quot;&quot;</span>
870
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">size</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">a</span>[<span class="ruby-value">0</span>, <span class="ruby-identifier">b</span>.<span class="ruby-identifier">size</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">b</span>
871
+ <span class="ruby-identifier">a</span> = <span class="ruby-identifier">a</span>[<span class="ruby-identifier">b</span>.<span class="ruby-identifier">size</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
872
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>[<span class="ruby-identifier">othr_i</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
873
+ <span class="ruby-identifier">b</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>[<span class="ruby-identifier">othr_i</span>]
874
+ <span class="ruby-identifier">othr_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
875
+ <span class="ruby-keyword kw">next</span>
876
+ <span class="ruby-keyword kw">end</span>
877
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">b</span>[<span class="ruby-value">0</span>, <span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">a</span>
878
+ <span class="ruby-identifier">b</span> = <span class="ruby-identifier">b</span>[<span class="ruby-identifier">a</span>.<span class="ruby-identifier">size</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
879
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">contents</span>[<span class="ruby-identifier">self_i</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
880
+ <span class="ruby-identifier">a</span> = <span class="ruby-identifier">contents</span>[<span class="ruby-identifier">self_i</span>]
881
+ <span class="ruby-identifier">self_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
882
+ <span class="ruby-keyword kw">next</span>
883
+ <span class="ruby-keyword kw">end</span>
884
+ <span class="ruby-keyword kw">else</span>
885
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
886
+ <span class="ruby-keyword kw">end</span>
887
+ <span class="ruby-keyword kw">end</span>
888
+ <span class="ruby-keyword kw">next</span>
889
+ <span class="ruby-keyword kw">end</span>
890
+
891
+ <span class="ruby-comment cmt"># OK, so at least one of them is not a String.</span>
892
+ <span class="ruby-comment cmt"># Hopefully they're either both XMLs or one is an XML and the</span>
893
+ <span class="ruby-comment cmt"># other is a String. It is also possible that contents contains</span>
894
+ <span class="ruby-comment cmt"># something illegal, but we aren't catching that,</span>
895
+ <span class="ruby-comment cmt"># so xml(:foo, Garbage.new) is going to at least equal itself.</span>
896
+ <span class="ruby-comment cmt"># And we aren't, because xml(:foo, Garbage.new) == xml(:bar, Garbage.new)</span>
897
+ <span class="ruby-comment cmt"># is going to return an honest false, and incoherent sanity</span>
898
+ <span class="ruby-comment cmt"># check is worse than no sanity check.</span>
899
+ <span class="ruby-comment cmt">#</span>
900
+ <span class="ruby-comment cmt"># Oh yeah, they can be XML_PI or XML_Comment. In such case, this</span>
901
+ <span class="ruby-comment cmt"># is ok.</span>
902
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">contents</span>[<span class="ruby-identifier">self_i</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">contents</span>[<span class="ruby-identifier">othr_i</span>]
903
+ <span class="ruby-identifier">self_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
904
+ <span class="ruby-identifier">othr_i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
905
+ <span class="ruby-keyword kw">end</span>
906
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
907
+ <span class="ruby-keyword kw">end</span>
908
+ </pre>
909
+ </div>
910
+ </div>
911
+ </div>
912
+ <div class="method">
913
+ <div class="title">
914
+ <a name="M000037"></a><b>=~</b>(pattern)
915
+ </div>
916
+ <div class="description">
917
+ <h1>~ for a few reasonable patterns</h1>
918
+ </div>
919
+ <div class="sourcecode">
920
+ <p class="source-link">[ <a href="javascript:toggleSource('M000037_source')" id="l_M000037_source">show source</a> ]</p>
921
+ <div id="M000037_source" class="dyn-source">
922
+ <pre>
923
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1085</span>
924
+ <span class="ruby-keyword kw">def</span> <span class="ruby-operator">=~</span>(<span class="ruby-identifier">pattern</span>)
925
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Symbol</span>
926
+ <span class="ruby-ivar">@name</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">pattern</span>
927
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Regexp</span>
928
+ <span class="ruby-identifier">rv</span> = <span class="ruby-identifier">text</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">pattern</span>
929
+ <span class="ruby-keyword kw">else</span> <span class="ruby-comment cmt"># Hash, Pattern_any, Pattern_all</span>
930
+ <span class="ruby-identifier">pattern</span> <span class="ruby-operator">===</span> <span class="ruby-keyword kw">self</span>
931
+ <span class="ruby-keyword kw">end</span>
932
+ <span class="ruby-keyword kw">end</span>
933
+ </pre>
934
+ </div>
935
+ </div>
936
+ </div>
937
+ <div class="method">
938
+ <div class="title">
939
+ <a name="M000029"></a><b>[]</b>(key)
940
+ </div>
941
+ <div class="description">
942
+ <p>
943
+ Read attributes. Also works with pseudoattributes:
944
+ </p>
945
+ <pre>
946
+ img[:@x] == img.child(:x).text # or nil if there isn't any.
947
+ </pre>
948
+ </div>
949
+ <div class="sourcecode">
950
+ <p class="source-link">[ <a href="javascript:toggleSource('M000029_source')" id="l_M000029_source">show source</a> ]</p>
951
+ <div id="M000029_source" class="dyn-source">
952
+ <pre>
953
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 820</span>
954
+ <span class="ruby-keyword kw">def</span> <span class="ruby-operator">[]</span>(<span class="ruby-identifier">key</span>)
955
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?@</span>
956
+ <span class="ruby-identifier">tag</span> = <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>].<span class="ruby-identifier">to_sym</span>
957
+ <span class="ruby-identifier">c</span> = <span class="ruby-identifier">child</span>(<span class="ruby-identifier">tag</span>)
958
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>
959
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">text</span>
960
+ <span class="ruby-keyword kw">else</span>
961
+ <span class="ruby-keyword kw">nil</span>
962
+ <span class="ruby-keyword kw">end</span>
963
+ <span class="ruby-keyword kw">else</span>
964
+ <span class="ruby-ivar">@attrs</span>[<span class="ruby-identifier">key</span>]
965
+ <span class="ruby-keyword kw">end</span>
966
+ <span class="ruby-keyword kw">end</span>
967
+ </pre>
968
+ </div>
969
+ </div>
970
+ </div>
971
+ <div class="method">
972
+ <div class="title">
973
+ <a name="M000030"></a><b>[]=</b>(key, value)
974
+ </div>
975
+ <div class="description">
976
+ <p>
977
+ Set attributes. Value is automatically converted to <a
978
+ href="String.html">String</a>, so you can say:
979
+ </p>
980
+ <pre>
981
+ img[:x] = 200
982
+ </pre>
983
+ <p>
984
+ Also works with pseudoattributes:
985
+ </p>
986
+ <pre>
987
+ foo[:@bar] = &quot;x&quot;
988
+ </pre>
989
+ </div>
990
+ <div class="sourcecode">
991
+ <p class="source-link">[ <a href="javascript:toggleSource('M000030_source')" id="l_M000030_source">show source</a> ]</p>
992
+ <div id="M000030_source" class="dyn-source">
993
+ <pre>
994
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 839</span>
995
+ <span class="ruby-keyword kw">def</span> <span class="ruby-operator">[]=</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span>)
996
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?@</span>
997
+ <span class="ruby-identifier">tag</span> = <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>].<span class="ruby-identifier">to_sym</span>
998
+ <span class="ruby-identifier">c</span> = <span class="ruby-identifier">child</span>(<span class="ruby-identifier">tag</span>)
999
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>
1000
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">contents</span> = [<span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_s</span>]
1001
+ <span class="ruby-keyword kw">else</span>
1002
+ <span class="ruby-keyword kw">self</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">tag</span>, <span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_s</span>)
1003
+ <span class="ruby-keyword kw">end</span>
1004
+ <span class="ruby-keyword kw">else</span>
1005
+ <span class="ruby-ivar">@attrs</span>[<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">value</span>.<span class="ruby-identifier">to_s</span>
1006
+ <span class="ruby-keyword kw">end</span>
1007
+ <span class="ruby-keyword kw">end</span>
1008
+ </pre>
1009
+ </div>
1010
+ </div>
1011
+ </div>
1012
+ <div class="method">
1013
+ <div class="title">
1014
+ <a name="M000045"></a><b>add!</b>(cnt)
1015
+ </div>
1016
+ <div class="description">
1017
+ <p>
1018
+ Alias for #&lt;&lt;
1019
+ </p>
1020
+ </div>
1021
+ </div>
1022
+ <div class="method">
1023
+ <div class="title">
1024
+ <a name="M000040"></a><b>add_pretty_printing!</b>()
1025
+ </div>
1026
+ <div class="description">
1027
+ <p>
1028
+ Add pretty-printing whitespace. Also normalizes the <a
1029
+ href="XML.html">XML</a>.
1030
+ </p>
1031
+ </div>
1032
+ <div class="sourcecode">
1033
+ <p class="source-link">[ <a href="javascript:toggleSource('M000040_source')" id="l_M000040_source">show source</a> ]</p>
1034
+ <div id="M000040_source" class="dyn-source">
1035
+ <pre>
1036
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1121</span>
1037
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">add_pretty_printing!</span>
1038
+ <span class="ruby-identifier">normalize!</span>
1039
+ <span class="ruby-identifier">real_add_pretty_printing!</span>
1040
+ <span class="ruby-identifier">normalize!</span>
1041
+ <span class="ruby-keyword kw">end</span>
1042
+ </pre>
1043
+ </div>
1044
+ </div>
1045
+ </div>
1046
+ <div class="method">
1047
+ <div class="title">
1048
+ <a name="M000048"></a><b>child</b>(pat=nil, *rest)
1049
+ </div>
1050
+ <div class="description">
1051
+ <p>
1052
+ Equivalent to node.children(pat, *rest)[0] Returns nil if there
1053
+ aren&#8216;t any matching <a href="XML.html#M000050">children</a>
1054
+ </p>
1055
+ </div>
1056
+ <div class="sourcecode">
1057
+ <p class="source-link">[ <a href="javascript:toggleSource('M000048_source')" id="l_M000048_source">show source</a> ]</p>
1058
+ <div id="M000048_source" class="dyn-source">
1059
+ <pre>
1060
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1205</span>
1061
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">child</span>(<span class="ruby-identifier">pat</span>=<span class="ruby-keyword kw">nil</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>)
1062
+ <span class="ruby-identifier">children</span>(<span class="ruby-identifier">pat</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1063
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">c</span>
1064
+ }
1065
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
1066
+ <span class="ruby-keyword kw">end</span>
1067
+ </pre>
1068
+ </div>
1069
+ </div>
1070
+ </div>
1071
+ <div class="method">
1072
+ <div class="title">
1073
+ <a name="M000050"></a><b>children</b>(pat=nil, *rest) {|c if block_given?| ...}
1074
+ </div>
1075
+ <div class="description">
1076
+ <p>
1077
+ <a href="XML.html#M000050">XML#children</a>(pattern, more_patterns) Return
1078
+ all <a href="XML.html#M000050">children</a> of a node with tags matching
1079
+ tag. Also:
1080
+ </p>
1081
+ <ul>
1082
+ <li><a href="XML.html#M000050">children</a>(:a, :b) == <a
1083
+ href="XML.html#M000050">children</a>(:a).<a
1084
+ href="XML.html#M000050">children</a>(:b)
1085
+
1086
+ </li>
1087
+ <li><a href="XML.html#M000050">children</a>(:a, :*, :c) == <a
1088
+ href="XML.html#M000050">children</a>(:a).<a
1089
+ href="XML.html#M000051">descendants</a>(:c)
1090
+
1091
+ </li>
1092
+ </ul>
1093
+ </div>
1094
+ <div class="sourcecode">
1095
+ <p class="source-link">[ <a href="javascript:toggleSource('M000050_source')" id="l_M000050_source">show source</a> ]</p>
1096
+ <div id="M000050_source" class="dyn-source">
1097
+ <pre>
1098
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1226</span>
1099
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">children</span>(<span class="ruby-identifier">pat</span>=<span class="ruby-keyword kw">nil</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1100
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">descendants</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pat</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">:*</span>
1101
+ <span class="ruby-identifier">res</span> = []
1102
+ <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1103
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pat</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">pat</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">c</span>
1104
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">==</span> []
1105
+ <span class="ruby-identifier">res</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>
1106
+ <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">c</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
1107
+ <span class="ruby-keyword kw">else</span>
1108
+ <span class="ruby-identifier">res</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">children</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1109
+ <span class="ruby-keyword kw">end</span>
1110
+ <span class="ruby-keyword kw">end</span>
1111
+ }
1112
+ <span class="ruby-identifier">res</span>
1113
+ <span class="ruby-keyword kw">end</span>
1114
+ </pre>
1115
+ </div>
1116
+ </div>
1117
+ </div>
1118
+ <div class="method">
1119
+ <div class="title">
1120
+ <a name="M000014"></a><b>children_sort_by</b>(*args, &amp;blk)
1121
+ </div>
1122
+ <div class="description">
1123
+ <p>
1124
+ Sort <a href="XML.html#M000050">children</a> of <a href="XML.html">XML</a>
1125
+ element.
1126
+ </p>
1127
+ </div>
1128
+ <div class="sourcecode">
1129
+ <p class="source-link">[ <a href="javascript:toggleSource('M000014_source')" id="l_M000014_source">show source</a> ]</p>
1130
+ <div id="M000014_source" class="dyn-source">
1131
+ <pre>
1132
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 391</span>
1133
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">children_sort_by</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1134
+ <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>{ <span class="ruby-ivar">@contents</span> = <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">sort_by</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>) }
1135
+ <span class="ruby-keyword kw">end</span>
1136
+ </pre>
1137
+ </div>
1138
+ </div>
1139
+ </div>
1140
+ <div class="method">
1141
+ <div class="title">
1142
+ <a name="M000052"></a><b>deep_map</b>(pat) {|self| ...}
1143
+ </div>
1144
+ <div class="description">
1145
+ <p>
1146
+ Change elements based on pattern
1147
+ </p>
1148
+ </div>
1149
+ <div class="sourcecode">
1150
+ <p class="source-link">[ <a href="javascript:toggleSource('M000052_source')" id="l_M000052_source">show source</a> ]</p>
1151
+ <div id="M000052_source" class="dyn-source">
1152
+ <pre>
1153
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1269</span>
1154
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">deep_map</span>(<span class="ruby-identifier">pat</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1155
+ <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">pat</span>
1156
+ <span class="ruby-keyword kw">yield</span> <span class="ruby-keyword kw">self</span>
1157
+ <span class="ruby-keyword kw">else</span>
1158
+ <span class="ruby-identifier">r</span> = <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">name</span>, <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">attrs</span>)
1159
+ <span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1160
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1161
+ <span class="ruby-identifier">r</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">deep_map</span>(<span class="ruby-identifier">pat</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1162
+ <span class="ruby-keyword kw">else</span>
1163
+ <span class="ruby-identifier">r</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>
1164
+ <span class="ruby-keyword kw">end</span>
1165
+ }
1166
+ <span class="ruby-identifier">r</span>
1167
+ <span class="ruby-keyword kw">end</span>
1168
+ <span class="ruby-keyword kw">end</span>
1169
+ </pre>
1170
+ </div>
1171
+ </div>
1172
+ </div>
1173
+ <div class="method">
1174
+ <div class="title">
1175
+ <a name="M000049"></a><b>descendant</b>(pat=nil, *rest)
1176
+ </div>
1177
+ <div class="description">
1178
+ <p>
1179
+ Equivalent to node.descendants(pat, *rest)[0] Returns nil if there
1180
+ aren&#8216;t any matching <a href="XML.html#M000051">descendants</a>
1181
+ </p>
1182
+ </div>
1183
+ <div class="sourcecode">
1184
+ <p class="source-link">[ <a href="javascript:toggleSource('M000049_source')" id="l_M000049_source">show source</a> ]</p>
1185
+ <div id="M000049_source" class="dyn-source">
1186
+ <pre>
1187
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1214</span>
1188
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">descendant</span>(<span class="ruby-identifier">pat</span>=<span class="ruby-keyword kw">nil</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>)
1189
+ <span class="ruby-identifier">descendants</span>(<span class="ruby-identifier">pat</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1190
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">c</span>
1191
+ }
1192
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
1193
+ <span class="ruby-keyword kw">end</span>
1194
+ </pre>
1195
+ </div>
1196
+ </div>
1197
+ </div>
1198
+ <div class="method">
1199
+ <div class="title">
1200
+ <a name="M000051"></a><b>descendants</b>(pat=nil, *rest) {|c if block_given?| ...}
1201
+ </div>
1202
+ <div class="description">
1203
+ <ul>
1204
+ <li><a href="XML.html#M000051">XML#descendants</a>
1205
+
1206
+ </li>
1207
+ <li><a href="XML.html#M000051">XML#descendants(pattern)</a>
1208
+
1209
+ </li>
1210
+ <li><a href="XML.html#M000051">XML#descendants</a>(pattern, more_patterns)
1211
+
1212
+ </li>
1213
+ </ul>
1214
+ <p>
1215
+ Return all <a href="XML.html#M000051">descendants</a> of a node matching
1216
+ the pattern. If pattern==nil, simply return all <a
1217
+ href="XML.html#M000051">descendants</a>. Optionally run a block on <a
1218
+ href="XML.html#M000012">each</a> of them if a block was given. If
1219
+ pattern==nil, also match Strings !
1220
+ </p>
1221
+ </div>
1222
+ <div class="sourcecode">
1223
+ <p class="source-link">[ <a href="javascript:toggleSource('M000051_source')" id="l_M000051_source">show source</a> ]</p>
1224
+ <div id="M000051_source" class="dyn-source">
1225
+ <pre>
1226
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1250</span>
1227
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">descendants</span>(<span class="ruby-identifier">pat</span>=<span class="ruby-keyword kw">nil</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1228
+ <span class="ruby-identifier">res</span> = []
1229
+ <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1230
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pat</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">pat</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">c</span>
1231
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">==</span> []
1232
+ <span class="ruby-identifier">res</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>
1233
+ <span class="ruby-keyword kw">yield</span> <span class="ruby-identifier">c</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
1234
+ <span class="ruby-keyword kw">else</span>
1235
+ <span class="ruby-identifier">res</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">children</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1236
+ <span class="ruby-keyword kw">end</span>
1237
+ <span class="ruby-keyword kw">end</span>
1238
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1239
+ <span class="ruby-identifier">res</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">descendants</span>(<span class="ruby-identifier">pat</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">rest</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1240
+ <span class="ruby-keyword kw">end</span>
1241
+ }
1242
+ <span class="ruby-identifier">res</span>
1243
+ <span class="ruby-keyword kw">end</span>
1244
+ </pre>
1245
+ </div>
1246
+ </div>
1247
+ </div>
1248
+ <div class="method">
1249
+ <div class="title">
1250
+ <a name="M000042"></a><b>dup</b>(&amp;blk)
1251
+ </div>
1252
+ <div class="description">
1253
+ <p>
1254
+ This is not a trivial method - first it does a <b>deep</b> copy, second it
1255
+ takes a block which is instance_eval&#8216;ed, so you can do things like:
1256
+ </p>
1257
+ <ul>
1258
+ <li>node.dup{ @name = :foo }
1259
+
1260
+ </li>
1261
+ <li>node.dup{ self[:color] = &quot;blue&quot; }
1262
+
1263
+ </li>
1264
+ </ul>
1265
+ </div>
1266
+ <div class="sourcecode">
1267
+ <p class="source-link">[ <a href="javascript:toggleSource('M000042_source')" id="l_M000042_source">show source</a> ]</p>
1268
+ <div id="M000042_source" class="dyn-source">
1269
+ <pre>
1270
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1147</span>
1271
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">dup</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1272
+ <span class="ruby-identifier">new_obj</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">raw_dup</span>
1273
+ <span class="ruby-comment cmt"># Attr values stay shared - ugly</span>
1274
+ <span class="ruby-identifier">new_obj</span>.<span class="ruby-identifier">attrs</span> = <span class="ruby-identifier">new_obj</span>.<span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">dup</span>
1275
+ <span class="ruby-identifier">new_obj</span>.<span class="ruby-identifier">contents</span> = <span class="ruby-identifier">new_obj</span>.<span class="ruby-identifier">contents</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">dup</span>}
1276
+
1277
+ <span class="ruby-identifier">new_obj</span>.<span class="ruby-identifier">instance_eval</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">blk</span>
1278
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">new_obj</span>
1279
+ <span class="ruby-keyword kw">end</span>
1280
+ </pre>
1281
+ </div>
1282
+ </div>
1283
+ </div>
1284
+ <div class="method">
1285
+ <div class="title">
1286
+ <a name="M000012"></a><b>each</b>(*selector, &amp;blk)
1287
+ </div>
1288
+ <div class="description">
1289
+ <p>
1290
+ Iterate over <a href="XML.html#M000050">children</a>, possibly with a
1291
+ selector
1292
+ </p>
1293
+ </div>
1294
+ <div class="sourcecode">
1295
+ <p class="source-link">[ <a href="javascript:toggleSource('M000012_source')" id="l_M000012_source">show source</a> ]</p>
1296
+ <div id="M000012_source" class="dyn-source">
1297
+ <pre>
1298
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 380</span>
1299
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">each</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">selector</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1300
+ <span class="ruby-identifier">children</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">selector</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1301
+ <span class="ruby-keyword kw">self</span>
1302
+ <span class="ruby-keyword kw">end</span>
1303
+ </pre>
1304
+ </div>
1305
+ </div>
1306
+ </div>
1307
+ <div class="method">
1308
+ <div class="title">
1309
+ <a name="M000034"></a><b>exec!</b>(&amp;blk)
1310
+ </div>
1311
+ <div class="description">
1312
+ <p>
1313
+ Make monadic interface more &quot;official&quot;
1314
+ </p>
1315
+ <ul>
1316
+ <li>node.exec! { foo!; bar! }
1317
+
1318
+ </li>
1319
+ </ul>
1320
+ <p>
1321
+ is equivalent to
1322
+ </p>
1323
+ <ul>
1324
+ <li>node &lt;&lt; xml(:foo) &lt;&lt; xml(:bar)
1325
+
1326
+ </li>
1327
+ </ul>
1328
+ </div>
1329
+ <div class="sourcecode">
1330
+ <p class="source-link">[ <a href="javascript:toggleSource('M000034_source')" id="l_M000034_source">show source</a> ]</p>
1331
+ <div id="M000034_source" class="dyn-source">
1332
+ <pre>
1333
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 965</span>
1334
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">exec!</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1335
+ <span class="ruby-identifier">instance_eval</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1336
+ <span class="ruby-keyword kw">end</span>
1337
+ </pre>
1338
+ </div>
1339
+ </div>
1340
+ </div>
1341
+ <div class="method">
1342
+ <div class="title">
1343
+ <a name="M000028"></a><b>inspect</b>(include_children=0)
1344
+ </div>
1345
+ <div class="description">
1346
+ <p>
1347
+ Convert to a well-formatted <a href="XML.html">XML</a>, but without <a
1348
+ href="XML.html#M000050">children</a> information. This is a reasonable
1349
+ format for irb and debugging. If you want to see a few levels of <a
1350
+ href="XML.html#M000050">children</a>, call <a
1351
+ href="XML.html#M000028">inspect</a>(2) and so on
1352
+ </p>
1353
+ </div>
1354
+ <div class="sourcecode">
1355
+ <p class="source-link">[ <a href="javascript:toggleSource('M000028_source')" id="l_M000028_source">show source</a> ]</p>
1356
+ <div id="M000028_source" class="dyn-source">
1357
+ <pre>
1358
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 806</span>
1359
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">inspect</span>(<span class="ruby-identifier">include_children</span>=<span class="ruby-value">0</span>)
1360
+ <span class="ruby-node">&quot;&lt;#{@name}&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@attrs</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot; #{k}='#{v.xml_attr_escape}'&quot;</span>}.<span class="ruby-identifier">join</span> <span class="ruby-operator">+</span>
1361
+ <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
1362
+ <span class="ruby-value str">&quot;/&gt;&quot;</span>
1363
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">include_children</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
1364
+ <span class="ruby-node">&quot;&gt;...&lt;/#{name}&gt;&quot;</span>
1365
+ <span class="ruby-keyword kw">else</span>
1366
+ <span class="ruby-value str">&quot;&gt;&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span> <span class="ruby-keyword kw">then</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">xml_escape</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">inspect</span>(<span class="ruby-identifier">include_children</span><span class="ruby-operator">-</span><span class="ruby-value">1</span>) <span class="ruby-keyword kw">end</span>}.<span class="ruby-identifier">join</span> <span class="ruby-operator">+</span> <span class="ruby-node">&quot;&lt;/#{name}&gt;&quot;</span>
1367
+ <span class="ruby-keyword kw">end</span>
1368
+ <span class="ruby-keyword kw">end</span>
1369
+ </pre>
1370
+ </div>
1371
+ </div>
1372
+ </div>
1373
+ <div class="method">
1374
+ <div class="title">
1375
+ <a name="M000053"></a><b>map</b>(pat=nil) {|c| ...}
1376
+ </div>
1377
+ <div class="description">
1378
+ <p>
1379
+ FIXME: do we want a shallow or a deep copy here ? Map <a
1380
+ href="XML.html#M000050">children</a>, but leave the name/attributes
1381
+ </p>
1382
+ </div>
1383
+ <div class="sourcecode">
1384
+ <p class="source-link">[ <a href="javascript:toggleSource('M000053_source')" id="l_M000053_source">show source</a> ]</p>
1385
+ <div id="M000053_source" class="dyn-source">
1386
+ <pre>
1387
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1287</span>
1388
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">map</span>(<span class="ruby-identifier">pat</span>=<span class="ruby-keyword kw">nil</span>)
1389
+ <span class="ruby-identifier">r</span> = <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">name</span>, <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">attrs</span>)
1390
+ <span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1391
+ <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">pat</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">c</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">pat</span>
1392
+ <span class="ruby-identifier">r</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-keyword kw">yield</span>(<span class="ruby-identifier">c</span>)
1393
+ <span class="ruby-keyword kw">else</span>
1394
+ <span class="ruby-identifier">r</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>
1395
+ <span class="ruby-keyword kw">end</span>
1396
+ }
1397
+ <span class="ruby-identifier">r</span>
1398
+ <span class="ruby-keyword kw">end</span>
1399
+ </pre>
1400
+ </div>
1401
+ </div>
1402
+ </div>
1403
+ <div class="method">
1404
+ <div class="title">
1405
+ <a name="M000033"></a><b>method_missing</b>(meth, *args, &amp;blk)
1406
+ </div>
1407
+ <div class="description">
1408
+ <p>
1409
+ Define all foo!-methods for monadic interface, so you can write:
1410
+ </p>
1411
+ </div>
1412
+ <div class="sourcecode">
1413
+ <p class="source-link">[ <a href="javascript:toggleSource('M000033_source')" id="l_M000033_source">show source</a> ]</p>
1414
+ <div id="M000033_source" class="dyn-source">
1415
+ <pre>
1416
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 953</span>
1417
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">method_missing</span>(<span class="ruby-identifier">meth</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1418
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">meth</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/^(.*)!$/</span>
1419
+ <span class="ruby-keyword kw">self</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1420
+ <span class="ruby-keyword kw">else</span>
1421
+ <span class="ruby-identifier">real_method_missing</span>(<span class="ruby-identifier">meth</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1422
+ <span class="ruby-keyword kw">end</span>
1423
+ <span class="ruby-keyword kw">end</span>
1424
+ </pre>
1425
+ </div>
1426
+ </div>
1427
+ </div>
1428
+ <div class="method">
1429
+ <div class="title">
1430
+ <a name="M000046"></a><b>normalize!</b>()
1431
+ </div>
1432
+ <div class="description">
1433
+ <p>
1434
+ Normalization means joining strings and getting rid of &quot;&quot;s,
1435
+ recursively
1436
+ </p>
1437
+ </div>
1438
+ <div class="sourcecode">
1439
+ <p class="source-link">[ <a href="javascript:toggleSource('M000046_source')" id="l_M000046_source">show source</a> ]</p>
1440
+ <div id="M000046_source" class="dyn-source">
1441
+ <pre>
1442
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1171</span>
1443
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">normalize!</span>
1444
+ <span class="ruby-identifier">new_contents</span> = []
1445
+ <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1446
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
1447
+ <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;&quot;</span>
1448
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">new_contents</span>[<span class="ruby-value">-1</span>].<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
1449
+ <span class="ruby-identifier">new_contents</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">c</span>
1450
+ <span class="ruby-keyword kw">next</span>
1451
+ <span class="ruby-keyword kw">end</span>
1452
+ <span class="ruby-keyword kw">else</span>
1453
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">normalize!</span>
1454
+ <span class="ruby-keyword kw">end</span>
1455
+ <span class="ruby-identifier">new_contents</span>.<span class="ruby-identifier">push</span> <span class="ruby-identifier">c</span>
1456
+ }
1457
+ <span class="ruby-ivar">@contents</span> = <span class="ruby-identifier">new_contents</span>
1458
+ <span class="ruby-keyword kw">end</span>
1459
+ </pre>
1460
+ </div>
1461
+ </div>
1462
+ </div>
1463
+ <div class="method">
1464
+ <div class="title">
1465
+ <a name="M000035"></a><b>range</b>(range_start, range_end, end_reached_cb=nil)
1466
+ </div>
1467
+ <div class="description">
1468
+ <p>
1469
+ Select a subtree NOTE: Uses object_id of the start/end tags ! They have to
1470
+ be the same, not just identical !
1471
+ &lt;foo&gt;0&lt;a&gt;1&lt;/a&gt;&lt;b/&gt;&lt;c/&gt;&lt;d&gt;2&lt;/d&gt;&lt;e/&gt;3&lt;/foo&gt;.<a
1472
+ href="XML.html#M000035">range</a>(&lt;a&gt;1&lt;/a&gt;,
1473
+ &lt;d&gt;2&lt;/d&gt;) returns &lt;foo&gt;&lt;b/&gt;&lt;c/&gt;&lt;/foo&gt;
1474
+ start and end and their <a href="XML.html#M000051">descendants</a> are not
1475
+ included in the result tree. Either start or end can be nil.
1476
+ </p>
1477
+ <ul>
1478
+ <li>If both start and end are nil, return whole tree.
1479
+
1480
+ </li>
1481
+ <li>If start is nil, return subtree up to range_end.
1482
+
1483
+ </li>
1484
+ <li>If start is not inside the tree, return nil.
1485
+
1486
+ </li>
1487
+ <li>If end is nil, return subtree from start
1488
+
1489
+ </li>
1490
+ <li>If end is not inside the tree, return subtree from start.
1491
+
1492
+ </li>
1493
+ <li>If end is before or below start, or they&#8216;re the same node, the result
1494
+ is unspecified.
1495
+
1496
+ </li>
1497
+ <li>if end comes directly after start, or as first node when start==nil, return
1498
+ path reaching there.
1499
+
1500
+ </li>
1501
+ </ul>
1502
+ </div>
1503
+ <div class="sourcecode">
1504
+ <p class="source-link">[ <a href="javascript:toggleSource('M000035_source')" id="l_M000035_source">show source</a> ]</p>
1505
+ <div id="M000035_source" class="dyn-source">
1506
+ <pre>
1507
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 985</span>
1508
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">range</span>(<span class="ruby-identifier">range_start</span>, <span class="ruby-identifier">range_end</span>, <span class="ruby-identifier">end_reached_cb</span>=<span class="ruby-keyword kw">nil</span>)
1509
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">range_start</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>
1510
+ <span class="ruby-identifier">result</span> = <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">attrs</span>)
1511
+ <span class="ruby-keyword kw">else</span>
1512
+ <span class="ruby-identifier">result</span> = <span class="ruby-keyword kw">nil</span>
1513
+ <span class="ruby-keyword kw">end</span>
1514
+ <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1515
+ <span class="ruby-comment cmt"># end reached !</span>
1516
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">range_end</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">object_id</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">range_end</span>.<span class="ruby-identifier">object_id</span>
1517
+ <span class="ruby-identifier">end_reached_cb</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">end_reached_cb</span>
1518
+ <span class="ruby-keyword kw">break</span>
1519
+ <span class="ruby-keyword kw">end</span>
1520
+ <span class="ruby-comment cmt"># start reached !</span>
1521
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">range_start</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">object_id</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">range_start</span>.<span class="ruby-identifier">object_id</span>
1522
+ <span class="ruby-identifier">result</span> = <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">attrs</span>)
1523
+ <span class="ruby-keyword kw">next</span>
1524
+ <span class="ruby-keyword kw">end</span>
1525
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">result</span> <span class="ruby-comment cmt"># We already started</span>
1526
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1527
+ <span class="ruby-identifier">break_me</span> = <span class="ruby-keyword kw">false</span>
1528
+ <span class="ruby-identifier">result</span>.<span class="ruby-identifier">add!</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">range</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">range_end</span>, <span class="ruby-identifier">lambda</span>{ <span class="ruby-identifier">break_me</span> = <span class="ruby-keyword kw">true</span> })
1529
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">break_me</span>
1530
+ <span class="ruby-identifier">end_reached_cb</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">end_reached_cb</span>
1531
+ <span class="ruby-keyword kw">break</span>
1532
+ <span class="ruby-keyword kw">end</span>
1533
+ <span class="ruby-keyword kw">else</span> <span class="ruby-comment cmt"># String/XML_PI/XML_Comment</span>
1534
+ <span class="ruby-identifier">result</span>.<span class="ruby-identifier">add!</span> <span class="ruby-identifier">c</span>
1535
+ <span class="ruby-keyword kw">end</span>
1536
+ <span class="ruby-keyword kw">else</span>
1537
+ <span class="ruby-comment cmt"># Strings/XML_PI/XML_Comment obviously cannot start a range</span>
1538
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1539
+ <span class="ruby-identifier">break_me</span> = <span class="ruby-keyword kw">false</span>
1540
+ <span class="ruby-identifier">r</span> = <span class="ruby-identifier">c</span>.<span class="ruby-identifier">range</span>(<span class="ruby-identifier">range_start</span>, <span class="ruby-identifier">range_end</span>, <span class="ruby-identifier">lambda</span>{ <span class="ruby-identifier">break_me</span> = <span class="ruby-keyword kw">true</span> })
1541
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r</span>
1542
+ <span class="ruby-comment cmt"># start reached !</span>
1543
+ <span class="ruby-identifier">result</span> = <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">attrs</span>, <span class="ruby-identifier">r</span>)
1544
+ <span class="ruby-keyword kw">end</span>
1545
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">break_me</span>
1546
+ <span class="ruby-comment cmt"># end reached !</span>
1547
+ <span class="ruby-identifier">end_reached_cb</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">end_reached_cb</span>
1548
+ <span class="ruby-keyword kw">break</span>
1549
+ <span class="ruby-keyword kw">end</span>
1550
+ <span class="ruby-keyword kw">end</span>
1551
+ <span class="ruby-keyword kw">end</span>
1552
+ }
1553
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1554
+ <span class="ruby-keyword kw">end</span>
1555
+ </pre>
1556
+ </div>
1557
+ </div>
1558
+ </div>
1559
+ <div class="method">
1560
+ <div class="title">
1561
+ <a name="M000038"></a><b>remove_pretty_printing!</b>(exceptions=nil)
1562
+ </div>
1563
+ <div class="description">
1564
+ <p>
1565
+ Get rid of pretty-printing whitespace. Also normalizes the <a
1566
+ href="XML.html">XML</a>.
1567
+ </p>
1568
+ </div>
1569
+ <div class="sourcecode">
1570
+ <p class="source-link">[ <a href="javascript:toggleSource('M000038_source')" id="l_M000038_source">show source</a> ]</p>
1571
+ <div id="M000038_source" class="dyn-source">
1572
+ <pre>
1573
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1096</span>
1574
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">remove_pretty_printing!</span>(<span class="ruby-identifier">exceptions</span>=<span class="ruby-keyword kw">nil</span>)
1575
+ <span class="ruby-identifier">normalize!</span>
1576
+ <span class="ruby-identifier">real_remove_pretty_printing!</span>(<span class="ruby-identifier">exceptions</span>)
1577
+ <span class="ruby-identifier">normalize!</span>
1578
+ <span class="ruby-keyword kw">end</span>
1579
+ </pre>
1580
+ </div>
1581
+ </div>
1582
+ </div>
1583
+ <div class="method">
1584
+ <div class="title">
1585
+ <a name="M000015"></a><b>sort</b>(*args, &amp;blk)
1586
+ </div>
1587
+ <div class="description">
1588
+ <p>
1589
+ Sort <a href="XML.html#M000050">children</a> of <a href="XML.html">XML</a>
1590
+ element.
1591
+ </p>
1592
+ <p>
1593
+ Using <a href="XML.html#M000015">sort</a> is highly wrong, as <a
1594
+ href="XML.html">XML</a> (and <a href="XML.html">XML</a>-extras) is not even
1595
+ Comparable. Use <a href="XML.html#M000013">sort_by</a> instead.
1596
+ </p>
1597
+ <p>
1598
+ Unless you define your own <a href="XML.html">XML</a>#&lt;=&gt; operator,
1599
+ or do something equally weird.
1600
+ </p>
1601
+ </div>
1602
+ <div class="sourcecode">
1603
+ <p class="source-link">[ <a href="javascript:toggleSource('M000015_source')" id="l_M000015_source">show source</a> ]</p>
1604
+ <div id="M000015_source" class="dyn-source">
1605
+ <pre>
1606
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 401</span>
1607
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sort</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1608
+ <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>{ <span class="ruby-ivar">@contents</span> = <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">sort</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>) }
1609
+ <span class="ruby-keyword kw">end</span>
1610
+ </pre>
1611
+ </div>
1612
+ </div>
1613
+ </div>
1614
+ <div class="method">
1615
+ <div class="title">
1616
+ <a name="M000013"></a><b>sort_by</b>(*args, &amp;blk)
1617
+ </div>
1618
+ <div class="description">
1619
+ <p>
1620
+ Sort <a href="XML.html">XML</a> <a href="XML.html#M000050">children</a> of
1621
+ <a href="XML.html">XML</a> element.
1622
+ </p>
1623
+ </div>
1624
+ <div class="sourcecode">
1625
+ <p class="source-link">[ <a href="javascript:toggleSource('M000013_source')" id="l_M000013_source">show source</a> ]</p>
1626
+ <div id="M000013_source" class="dyn-source">
1627
+ <pre>
1628
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 386</span>
1629
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sort_by</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1630
+ <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">dup</span>{ <span class="ruby-ivar">@contents</span> = <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">select</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>}.<span class="ruby-identifier">sort_by</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>) }
1631
+ <span class="ruby-keyword kw">end</span>
1632
+ </pre>
1633
+ </div>
1634
+ </div>
1635
+ </div>
1636
+ <div class="method">
1637
+ <div class="title">
1638
+ <a name="M000036"></a><b>subsequence</b>(range_start, range_end, start_seen_cb=nil, end_seen_cb=nil)
1639
+ </div>
1640
+ <div class="description">
1641
+ <p>
1642
+ <a href="XML.html#M000036">XML#subsequence</a> is similar to <a
1643
+ href="XML.html#M000035">XML#range</a>, but instead of trimmed subtree in
1644
+ returns a list of elements The same elements are included in both cases,
1645
+ but here we do not include any parents !
1646
+ </p>
1647
+ <p>
1648
+ &lt;foo&gt;&lt;a/&gt;&lt;b/&gt;&lt;c/&gt;&lt;/foo&gt;.<a
1649
+ href="XML.html#M000035">range</a>(a,c) =&gt;
1650
+ &lt;foo&gt;&lt;b/&gt;&lt;/foo&gt;
1651
+ &lt;foo&gt;&lt;a/&gt;&lt;b/&gt;&lt;c/&gt;&lt;/foo&gt;.<a
1652
+ href="XML.html#M000036">subsequence</a>(a,c) =&gt; &lt;b/&gt;
1653
+ </p>
1654
+ <p>
1655
+ &lt;foo&gt;&lt;a&gt;&lt;a1/&gt;&lt;/a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/foo&gt;.<a
1656
+ href="XML.html#M000035">range</a>(a1,c) =&gt;
1657
+ &lt;foo&gt;&lt;a/&gt;&lt;b/&gt;&lt;/foo&gt; # Does &lt;a/&gt; make sense ?
1658
+ &lt;foo&gt;&lt;a&gt;&lt;a1/&gt;&lt;/a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/foo&gt;.<a
1659
+ href="XML.html#M000036">subsequence</a>(a1,c) =&gt; &lt;b/&gt;
1660
+ </p>
1661
+ <p>
1662
+ &lt;foo&gt;&lt;a&gt;&lt;a1/&gt;&lt;a2/&gt;&lt;/a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/foo&gt;.<a
1663
+ href="XML.html#M000035">range</a>(a1,c) =&gt;
1664
+ &lt;foo&gt;&lt;a&gt;&lt;a2/&gt;&lt;/a&gt;&lt;b/&gt;&lt;/foo&gt;
1665
+ &lt;foo&gt;&lt;a&gt;&lt;a1/&gt;&lt;a2/&gt;&lt;/a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/foo&gt;.<a
1666
+ href="XML.html#M000036">subsequence</a>(a1,c) =&gt; &lt;a2/&gt;&lt;b/&gt;
1667
+ </p>
1668
+ <p>
1669
+ And we return [], not nil if nothing matches
1670
+ </p>
1671
+ </div>
1672
+ <div class="sourcecode">
1673
+ <p class="source-link">[ <a href="javascript:toggleSource('M000036_source')" id="l_M000036_source">show source</a> ]</p>
1674
+ <div id="M000036_source" class="dyn-source">
1675
+ <pre>
1676
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1048</span>
1677
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">subsequence</span>(<span class="ruby-identifier">range_start</span>, <span class="ruby-identifier">range_end</span>, <span class="ruby-identifier">start_seen_cb</span>=<span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">end_seen_cb</span>=<span class="ruby-keyword kw">nil</span>)
1678
+ <span class="ruby-identifier">result</span> = []
1679
+ <span class="ruby-identifier">start_seen</span> = <span class="ruby-identifier">range_start</span>.<span class="ruby-identifier">nil?</span>
1680
+ <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1681
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">range_end</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">range_end</span>.<span class="ruby-identifier">object_id</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">object_id</span>
1682
+ <span class="ruby-identifier">end_seen_cb</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">end_seen_cb</span>
1683
+ <span class="ruby-keyword kw">break</span>
1684
+ <span class="ruby-keyword kw">end</span>
1685
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">range_start</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">range_start</span>.<span class="ruby-identifier">object_id</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">object_id</span>
1686
+ <span class="ruby-identifier">start_seen</span> = <span class="ruby-keyword kw">true</span>
1687
+ <span class="ruby-identifier">start_seen_cb</span>.<span class="ruby-identifier">call</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">start_seen_cb</span>
1688
+ <span class="ruby-keyword kw">next</span>
1689
+ <span class="ruby-keyword kw">end</span>
1690
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">start_seen</span>
1691
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1692
+ <span class="ruby-identifier">break_me</span> = <span class="ruby-keyword kw">false</span>
1693
+ <span class="ruby-identifier">result</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">subsequence</span>(<span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">range_end</span>, <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">lambda</span>{<span class="ruby-identifier">break_me</span>=<span class="ruby-keyword kw">true</span>})
1694
+ <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">break_me</span>
1695
+ <span class="ruby-keyword kw">else</span> <span class="ruby-comment cmt"># String/XML_PI/XML_Comment</span>
1696
+ <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>
1697
+ <span class="ruby-keyword kw">end</span>
1698
+ <span class="ruby-keyword kw">else</span>
1699
+ <span class="ruby-comment cmt"># String/XML_PI/XML_Comment cannot start a subsequence</span>
1700
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1701
+ <span class="ruby-identifier">break_me</span> = <span class="ruby-keyword kw">false</span>
1702
+ <span class="ruby-identifier">result</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">subsequence</span>(<span class="ruby-identifier">range_start</span>, <span class="ruby-identifier">range_end</span>, <span class="ruby-identifier">lambda</span>{<span class="ruby-identifier">start_seen</span>=<span class="ruby-keyword kw">true</span>}, <span class="ruby-identifier">lambda</span>{<span class="ruby-identifier">break_me</span>=<span class="ruby-keyword kw">true</span>})
1703
+ <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">break_me</span>
1704
+ <span class="ruby-keyword kw">end</span>
1705
+ <span class="ruby-keyword kw">end</span>
1706
+ }
1707
+ <span class="ruby-comment cmt"># Include starting tag if it was right from the range_start</span>
1708
+ <span class="ruby-comment cmt"># Otherwise, return just the raw sequence</span>
1709
+ <span class="ruby-identifier">result</span> = [<span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@name</span>, <span class="ruby-ivar">@attrs</span>, <span class="ruby-identifier">result</span>)] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">range_start</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>
1710
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">result</span>
1711
+ <span class="ruby-keyword kw">end</span>
1712
+ </pre>
1713
+ </div>
1714
+ </div>
1715
+ </div>
1716
+ <div class="method">
1717
+ <div class="title">
1718
+ <a name="M000047"></a><b>text</b>()
1719
+ </div>
1720
+ <div class="description">
1721
+ <p>
1722
+ Return <a href="XML.html#M000047">text</a> below the node, stripping all <a
1723
+ href="XML.html">XML</a> tags, &quot;&lt;foo&gt;Hello,
1724
+ &lt;bar&gt;world&lt;/bar&gt;!&lt;/foo&gt;&quot;.xml_parse.text returns
1725
+ &quot;Hello, world!&quot;
1726
+ </p>
1727
+ </div>
1728
+ <div class="sourcecode">
1729
+ <p class="source-link">[ <a href="javascript:toggleSource('M000047_source')" id="l_M000047_source">show source</a> ]</p>
1730
+ <div id="M000047_source" class="dyn-source">
1731
+ <pre>
1732
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1191</span>
1733
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">text</span>
1734
+ <span class="ruby-identifier">res</span> = <span class="ruby-value str">&quot;&quot;</span>
1735
+ <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1736
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1737
+ <span class="ruby-identifier">res</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">text</span>
1738
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
1739
+ <span class="ruby-identifier">res</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">c</span>
1740
+ <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># Ignore XML_PI/XML_Comment</span>
1741
+ }
1742
+ <span class="ruby-identifier">res</span>
1743
+ <span class="ruby-keyword kw">end</span>
1744
+ </pre>
1745
+ </div>
1746
+ </div>
1747
+ </div>
1748
+ <div class="method">
1749
+ <div class="title">
1750
+ <a name="M000043"></a><b>text!</b>(*args)
1751
+ </div>
1752
+ <div class="description">
1753
+ <p>
1754
+ Add some <a href="String.html">String</a> <a
1755
+ href="XML.html#M000050">children</a> (all attributes get <a
1756
+ href="XML.html#M000027">to_s</a>&#8216;ed)
1757
+ </p>
1758
+ </div>
1759
+ <div class="sourcecode">
1760
+ <p class="source-link">[ <a href="javascript:toggleSource('M000043_source')" id="l_M000043_source">show source</a> ]</p>
1761
+ <div id="M000043_source" class="dyn-source">
1762
+ <pre>
1763
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1159</span>
1764
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">text!</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>)
1765
+ <span class="ruby-identifier">args</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">to_s</span>}
1766
+ <span class="ruby-keyword kw">end</span>
1767
+ </pre>
1768
+ </div>
1769
+ </div>
1770
+ </div>
1771
+ <div class="method">
1772
+ <div class="title">
1773
+ <a name="M000027"></a><b>to_s</b>()
1774
+ </div>
1775
+ <div class="description">
1776
+ <p>
1777
+ Convert to a well-formatted <a href="XML.html">XML</a>
1778
+ </p>
1779
+ </div>
1780
+ <div class="sourcecode">
1781
+ <p class="source-link">[ <a href="javascript:toggleSource('M000027_source')" id="l_M000027_source">show source</a> ]</p>
1782
+ <div id="M000027_source" class="dyn-source">
1783
+ <pre>
1784
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 794</span>
1785
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s</span>
1786
+ <span class="ruby-node">&quot;&lt;#{@name}&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@attrs</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span>,<span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot; #{k}='#{v.xml_attr_escape}'&quot;</span>}.<span class="ruby-identifier">join</span> <span class="ruby-operator">+</span>
1787
+ <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
1788
+ <span class="ruby-value str">&quot;/&gt;&quot;</span>
1789
+ <span class="ruby-keyword kw">else</span>
1790
+ <span class="ruby-value str">&quot;&gt;&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">map</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span> <span class="ruby-keyword kw">then</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">xml_escape</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-keyword kw">end</span>}.<span class="ruby-identifier">join</span> <span class="ruby-operator">+</span> <span class="ruby-node">&quot;&lt;/#{name}&gt;&quot;</span>
1791
+ <span class="ruby-keyword kw">end</span>
1792
+ <span class="ruby-keyword kw">end</span>
1793
+ </pre>
1794
+ </div>
1795
+ </div>
1796
+ </div>
1797
+ <div class="method">
1798
+ <div class="title">
1799
+ <a name="M000044"></a><b>xml!</b>(*args, &amp;blk)
1800
+ </div>
1801
+ <div class="description">
1802
+ <p>
1803
+ Add <a href="XML.html">XML</a> <a href="XML.html#M000048">child</a>
1804
+ </p>
1805
+ </div>
1806
+ <div class="sourcecode">
1807
+ <p class="source-link">[ <a href="javascript:toggleSource('M000044_source')" id="l_M000044_source">show source</a> ]</p>
1808
+ <div id="M000044_source" class="dyn-source">
1809
+ <pre>
1810
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1163</span>
1811
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">xml!</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1812
+ <span class="ruby-ivar">@contents</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XML</span>.<span class="ruby-identifier">new</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">blk</span>)
1813
+ <span class="ruby-keyword kw">end</span>
1814
+ </pre>
1815
+ </div>
1816
+ </div>
1817
+ </div>
1818
+ <div class="sectiontitle">Protected Instance methods</div>
1819
+ <div class="method">
1820
+ <div class="title">
1821
+ <a name="M000041"></a><b>real_add_pretty_printing!</b>(indent = &quot;&quot;)
1822
+ </div>
1823
+ <div class="sourcecode">
1824
+ <p class="source-link">[ <a href="javascript:toggleSource('M000041_source')" id="l_M000041_source">show source</a> ]</p>
1825
+ <div id="M000041_source" class="dyn-source">
1826
+ <pre>
1827
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1127</span>
1828
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">real_add_pretty_printing!</span>(<span class="ruby-identifier">indent</span> = <span class="ruby-value str">&quot;&quot;</span>)
1829
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">empty?</span>
1830
+ <span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1831
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML</span>
1832
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">real_add_pretty_printing!</span>(<span class="ruby-identifier">indent</span><span class="ruby-operator">+</span><span class="ruby-value str">&quot; &quot;</span>)
1833
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
1834
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/\n\s*/</span>, <span class="ruby-node">&quot;\n#{indent} &quot;</span>)
1835
+ <span class="ruby-keyword kw">end</span>
1836
+ }
1837
+ <span class="ruby-ivar">@contents</span> = <span class="ruby-ivar">@contents</span>.<span class="ruby-identifier">inject</span>([]){<span class="ruby-operator">|</span><span class="ruby-identifier">children</span>, <span class="ruby-identifier">c</span><span class="ruby-operator">|</span> <span class="ruby-identifier">children</span> <span class="ruby-operator">+</span> [<span class="ruby-node">&quot;\n#{indent} &quot;</span>, <span class="ruby-identifier">c</span>]}<span class="ruby-operator">+</span>[<span class="ruby-node">&quot;\n#{indent}&quot;</span>]
1838
+ <span class="ruby-keyword kw">end</span>
1839
+ </pre>
1840
+ </div>
1841
+ </div>
1842
+ </div>
1843
+ <div class="method">
1844
+ <div class="title">
1845
+ <a name="M000039"></a><b>real_remove_pretty_printing!</b>(exceptions=nil)
1846
+ </div>
1847
+ <div class="description">
1848
+ <p>
1849
+ <a href="XML.html#M000046">normalize!</a> is already recursive, so only one
1850
+ call at top level is needed. This helper method lets us avoid extra calls
1851
+ to <a href="XML.html#M000046">normalize!</a>.
1852
+ </p>
1853
+ </div>
1854
+ <div class="sourcecode">
1855
+ <p class="source-link">[ <a href="javascript:toggleSource('M000039_source')" id="l_M000039_source">show source</a> ]</p>
1856
+ <div id="M000039_source" class="dyn-source">
1857
+ <pre>
1858
+ <span class="ruby-comment cmt"># File magic_xml.rb, line 1104</span>
1859
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">real_remove_pretty_printing!</span>(<span class="ruby-identifier">exceptions</span>=<span class="ruby-keyword kw">nil</span>)
1860
+ <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">exceptions</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">exceptions</span>.<span class="ruby-identifier">include?</span> <span class="ruby-ivar">@name</span>
1861
+ <span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
1862
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">String</span>
1863
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">sub!</span>(<span class="ruby-regexp re">/^\s+/</span>, <span class="ruby-value str">&quot;&quot;</span>)
1864
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">sub!</span>(<span class="ruby-regexp re">/\s+$/</span>, <span class="ruby-value str">&quot;&quot;</span>)
1865
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/\s+/</span>, <span class="ruby-value str">&quot; &quot;</span>)
1866
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML_PI</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">XML_Comment</span>
1867
+ <span class="ruby-keyword kw">else</span>
1868
+ <span class="ruby-identifier">c</span>.<span class="ruby-identifier">real_remove_pretty_printing!</span>(<span class="ruby-identifier">exceptions</span>)
1869
+ <span class="ruby-keyword kw">end</span>
1870
+ }
1871
+ <span class="ruby-keyword kw">end</span>
1872
+ </pre>
1873
+ </div>
1874
+ </div>
1875
+ </div>
1876
+ </div>
1877
+
1878
+ </div>
1879
+
1880
+ </body>
1881
+ </html>