nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (319) hide show
  1. data/.autotest +18 -7
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +297 -3
  4. data/CHANGELOG.rdoc +289 -0
  5. data/Manifest.txt +148 -37
  6. data/README.ja.rdoc +20 -20
  7. data/README.rdoc +53 -22
  8. data/Rakefile +127 -211
  9. data/bin/nokogiri +54 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +89 -54
  12. data/ext/nokogiri/html_document.c +34 -27
  13. data/ext/nokogiri/html_document.h +1 -1
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +7 -5
  17. data/ext/nokogiri/html_entity_lookup.h +1 -1
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
  21. data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
  22. data/ext/nokogiri/xml_attr.c +20 -9
  23. data/ext/nokogiri/xml_attr.h +1 -1
  24. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  25. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +21 -9
  27. data/ext/nokogiri/xml_cdata.h +1 -1
  28. data/ext/nokogiri/xml_comment.c +18 -6
  29. data/ext/nokogiri/xml_comment.h +1 -1
  30. data/ext/nokogiri/xml_document.c +247 -68
  31. data/ext/nokogiri/xml_document.h +5 -3
  32. data/ext/nokogiri/xml_document_fragment.c +15 -7
  33. data/ext/nokogiri/xml_document_fragment.h +1 -1
  34. data/ext/nokogiri/xml_dtd.c +110 -10
  35. data/ext/nokogiri/xml_dtd.h +3 -1
  36. data/ext/nokogiri/xml_element_content.c +123 -0
  37. data/ext/nokogiri/xml_element_content.h +10 -0
  38. data/ext/nokogiri/xml_element_decl.c +69 -0
  39. data/ext/nokogiri/xml_element_decl.h +9 -0
  40. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  41. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  42. data/ext/nokogiri/xml_entity_decl.c +110 -0
  43. data/ext/nokogiri/xml_entity_decl.h +10 -0
  44. data/ext/nokogiri/xml_entity_reference.c +16 -5
  45. data/ext/nokogiri/xml_entity_reference.h +1 -1
  46. data/ext/nokogiri/xml_io.c +40 -8
  47. data/ext/nokogiri/xml_io.h +2 -1
  48. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  50. data/ext/nokogiri/xml_namespace.c +84 -0
  51. data/ext/nokogiri/xml_namespace.h +13 -0
  52. data/ext/nokogiri/xml_node.c +782 -225
  53. data/ext/nokogiri/xml_node.h +2 -4
  54. data/ext/nokogiri/xml_node_set.c +253 -34
  55. data/ext/nokogiri/xml_node_set.h +2 -2
  56. data/ext/nokogiri/xml_processing_instruction.c +17 -5
  57. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  58. data/ext/nokogiri/xml_reader.c +277 -85
  59. data/ext/nokogiri/xml_reader.h +1 -1
  60. data/ext/nokogiri/xml_relax_ng.c +168 -0
  61. data/ext/nokogiri/xml_relax_ng.h +9 -0
  62. data/ext/nokogiri/xml_sax_parser.c +183 -111
  63. data/ext/nokogiri/xml_sax_parser.h +30 -1
  64. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  65. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  66. data/ext/nokogiri/xml_sax_push_parser.c +42 -12
  67. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  68. data/ext/nokogiri/xml_schema.c +205 -0
  69. data/ext/nokogiri/xml_schema.h +9 -0
  70. data/ext/nokogiri/xml_syntax_error.c +28 -173
  71. data/ext/nokogiri/xml_syntax_error.h +2 -1
  72. data/ext/nokogiri/xml_text.c +16 -6
  73. data/ext/nokogiri/xml_text.h +1 -1
  74. data/ext/nokogiri/xml_xpath_context.c +104 -47
  75. data/ext/nokogiri/xml_xpath_context.h +1 -1
  76. data/ext/nokogiri/xslt_stylesheet.c +161 -19
  77. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  78. data/lib/nokogiri.rb +47 -8
  79. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  80. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  81. data/lib/nokogiri/css.rb +6 -3
  82. data/lib/nokogiri/css/node.rb +14 -12
  83. data/lib/nokogiri/css/parser.rb +665 -62
  84. data/lib/nokogiri/css/parser.y +20 -10
  85. data/lib/nokogiri/css/parser_extras.rb +91 -0
  86. data/lib/nokogiri/css/tokenizer.rb +148 -5
  87. data/lib/nokogiri/css/tokenizer.rex +10 -9
  88. data/lib/nokogiri/css/xpath_visitor.rb +47 -44
  89. data/lib/nokogiri/decorators/slop.rb +8 -4
  90. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  91. data/lib/nokogiri/ffi/html/document.rb +28 -0
  92. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  93. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  94. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  95. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  96. data/lib/nokogiri/ffi/libxml.rb +420 -0
  97. data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
  98. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  99. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  100. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
  102. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  103. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  105. data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
  106. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  107. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  108. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  109. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  110. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  111. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  112. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  113. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  114. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  115. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
  117. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  118. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  119. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  120. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  121. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  122. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  123. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
  124. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  126. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  127. data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
  128. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  129. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  132. data/lib/nokogiri/ffi/xml/document.rb +174 -0
  133. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  134. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  135. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  136. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  137. data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
  138. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  139. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  140. data/lib/nokogiri/ffi/xml/node.rb +559 -0
  141. data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
  142. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  143. data/lib/nokogiri/ffi/xml/reader.rb +236 -0
  144. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  145. data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
  147. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
  148. data/lib/nokogiri/ffi/xml/schema.rb +109 -0
  149. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  150. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  151. data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
  152. data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
  153. data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
  154. data/lib/nokogiri/html.rb +13 -47
  155. data/lib/nokogiri/html/builder.rb +27 -1
  156. data/lib/nokogiri/html/document.rb +201 -7
  157. data/lib/nokogiri/html/document_fragment.rb +41 -0
  158. data/lib/nokogiri/html/element_description.rb +23 -0
  159. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  160. data/lib/nokogiri/html/sax/parser.rb +34 -3
  161. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  162. data/lib/nokogiri/nokogiri.rb +1 -0
  163. data/lib/nokogiri/version.rb +40 -1
  164. data/lib/nokogiri/version_warning.rb +14 -0
  165. data/lib/nokogiri/xml.rb +32 -53
  166. data/lib/nokogiri/xml/attr.rb +5 -0
  167. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  168. data/lib/nokogiri/xml/builder.rb +349 -29
  169. data/lib/nokogiri/xml/cdata.rb +3 -1
  170. data/lib/nokogiri/xml/character_data.rb +7 -0
  171. data/lib/nokogiri/xml/document.rb +166 -14
  172. data/lib/nokogiri/xml/document_fragment.rb +76 -1
  173. data/lib/nokogiri/xml/dtd.rb +16 -3
  174. data/lib/nokogiri/xml/element_content.rb +36 -0
  175. data/lib/nokogiri/xml/element_decl.rb +13 -0
  176. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  177. data/lib/nokogiri/xml/namespace.rb +13 -0
  178. data/lib/nokogiri/xml/node.rb +561 -166
  179. data/lib/nokogiri/xml/node/save_options.rb +22 -2
  180. data/lib/nokogiri/xml/node_set.rb +202 -40
  181. data/lib/nokogiri/xml/parse_options.rb +93 -0
  182. data/lib/nokogiri/xml/pp.rb +2 -0
  183. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  184. data/lib/nokogiri/xml/pp/node.rb +56 -0
  185. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  186. data/lib/nokogiri/xml/reader.rb +93 -8
  187. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  188. data/lib/nokogiri/xml/sax.rb +1 -7
  189. data/lib/nokogiri/xml/sax/document.rb +107 -2
  190. data/lib/nokogiri/xml/sax/parser.rb +57 -7
  191. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  192. data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
  193. data/lib/nokogiri/xml/schema.rb +63 -0
  194. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  195. data/lib/nokogiri/xml/text.rb +4 -1
  196. data/lib/nokogiri/xml/xpath.rb +1 -1
  197. data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
  198. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  199. data/lib/nokogiri/xslt.rb +26 -2
  200. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  201. data/lib/xsd/xmlparser/nokogiri.rb +45 -9
  202. data/tasks/cross_compile.rb +173 -0
  203. data/tasks/test.rb +25 -69
  204. data/test/css/test_nthiness.rb +3 -4
  205. data/test/css/test_parser.rb +75 -20
  206. data/test/css/test_tokenizer.rb +23 -1
  207. data/test/css/test_xpath_visitor.rb +10 -1
  208. data/test/decorators/test_slop.rb +16 -0
  209. data/test/ffi/test_document.rb +35 -0
  210. data/test/files/2ch.html +108 -0
  211. data/test/files/address_book.rlx +12 -0
  212. data/test/files/address_book.xml +10 -0
  213. data/test/files/bar/bar.xsd +4 -0
  214. data/test/files/encoding.html +82 -0
  215. data/test/files/encoding.xhtml +84 -0
  216. data/test/files/foo/foo.xsd +4 -0
  217. data/test/files/po.xml +32 -0
  218. data/test/files/po.xsd +66 -0
  219. data/test/files/shift_jis.html +10 -0
  220. data/test/files/shift_jis.xml +5 -0
  221. data/test/files/snuggles.xml +3 -0
  222. data/test/files/staff.dtd +10 -0
  223. data/test/files/valid_bar.xml +2 -0
  224. data/test/helper.rb +101 -23
  225. data/test/html/sax/test_parser.rb +81 -2
  226. data/test/html/sax/test_parser_context.rb +48 -0
  227. data/test/html/test_builder.rb +39 -8
  228. data/test/html/test_document.rb +186 -23
  229. data/test/html/test_document_encoding.rb +78 -1
  230. data/test/html/test_document_fragment.rb +253 -0
  231. data/test/html/test_element_description.rb +98 -0
  232. data/test/html/test_named_characters.rb +1 -1
  233. data/test/html/test_node.rb +124 -36
  234. data/test/html/test_node_encoding.rb +27 -0
  235. data/test/test_convert_xpath.rb +1 -52
  236. data/test/test_css_cache.rb +2 -13
  237. data/test/test_encoding_handler.rb +46 -0
  238. data/test/test_memory_leak.rb +88 -19
  239. data/test/test_nokogiri.rb +38 -5
  240. data/test/test_reader.rb +188 -6
  241. data/test/test_soap4r_sax.rb +52 -0
  242. data/test/test_xslt_transforms.rb +183 -83
  243. data/test/xml/node/test_save_options.rb +1 -1
  244. data/test/xml/node/test_subclass.rb +44 -0
  245. data/test/xml/sax/test_parser.rb +175 -4
  246. data/test/xml/sax/test_parser_context.rb +113 -0
  247. data/test/xml/sax/test_push_parser.rb +90 -2
  248. data/test/xml/test_attr.rb +35 -1
  249. data/test/xml/test_attribute_decl.rb +82 -0
  250. data/test/xml/test_builder.rb +186 -1
  251. data/test/xml/test_cdata.rb +32 -1
  252. data/test/xml/test_comment.rb +13 -1
  253. data/test/xml/test_document.rb +415 -43
  254. data/test/xml/test_document_encoding.rb +1 -1
  255. data/test/xml/test_document_fragment.rb +173 -5
  256. data/test/xml/test_dtd.rb +61 -6
  257. data/test/xml/test_dtd_encoding.rb +3 -1
  258. data/test/xml/test_element_content.rb +56 -0
  259. data/test/xml/test_element_decl.rb +73 -0
  260. data/test/xml/test_entity_decl.rb +120 -0
  261. data/test/xml/test_entity_reference.rb +5 -1
  262. data/test/xml/test_namespace.rb +68 -0
  263. data/test/xml/test_node.rb +546 -201
  264. data/test/xml/test_node_attributes.rb +34 -0
  265. data/test/xml/test_node_encoding.rb +33 -3
  266. data/test/xml/test_node_reparenting.rb +321 -0
  267. data/test/xml/test_node_set.rb +538 -2
  268. data/test/xml/test_parse_options.rb +52 -0
  269. data/test/xml/test_processing_instruction.rb +6 -1
  270. data/test/xml/test_reader_encoding.rb +1 -1
  271. data/test/xml/test_relax_ng.rb +60 -0
  272. data/test/xml/test_schema.rb +94 -0
  273. data/test/xml/test_syntax_error.rb +12 -0
  274. data/test/xml/test_text.rb +35 -1
  275. data/test/xml/test_unparented_node.rb +5 -5
  276. data/test/xml/test_xpath.rb +142 -11
  277. data/test/xslt/test_custom_functions.rb +94 -0
  278. metadata +328 -92
  279. data/ext/nokogiri/html_sax_parser.c +0 -57
  280. data/ext/nokogiri/html_sax_parser.h +0 -11
  281. data/ext/nokogiri/iconv.dll +0 -0
  282. data/ext/nokogiri/libexslt.dll +0 -0
  283. data/ext/nokogiri/libxml2.dll +0 -0
  284. data/ext/nokogiri/libxslt.dll +0 -0
  285. data/ext/nokogiri/native.so +0 -0
  286. data/ext/nokogiri/xml_xpath.c +0 -53
  287. data/ext/nokogiri/xml_xpath.h +0 -11
  288. data/ext/nokogiri/zlib1.dll +0 -0
  289. data/lib/action-nokogiri.rb +0 -30
  290. data/lib/nokogiri/css/generated_parser.rb +0 -713
  291. data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
  292. data/lib/nokogiri/decorators.rb +0 -2
  293. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  294. data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
  295. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
  296. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
  297. data/lib/nokogiri/hpricot.rb +0 -51
  298. data/lib/nokogiri/xml/comment.rb +0 -6
  299. data/lib/nokogiri/xml/element.rb +0 -6
  300. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  301. data/lib/nokogiri/xml/fragment_handler.rb +0 -34
  302. data/test/hpricot/files/basic.xhtml +0 -17
  303. data/test/hpricot/files/boingboing.html +0 -2266
  304. data/test/hpricot/files/cy0.html +0 -3653
  305. data/test/hpricot/files/immob.html +0 -400
  306. data/test/hpricot/files/pace_application.html +0 -1320
  307. data/test/hpricot/files/tenderlove.html +0 -16
  308. data/test/hpricot/files/uswebgen.html +0 -220
  309. data/test/hpricot/files/utf8.html +0 -1054
  310. data/test/hpricot/files/week9.html +0 -1723
  311. data/test/hpricot/files/why.xml +0 -19
  312. data/test/hpricot/load_files.rb +0 -11
  313. data/test/hpricot/test_alter.rb +0 -68
  314. data/test/hpricot/test_builder.rb +0 -20
  315. data/test/hpricot/test_parser.rb +0 -426
  316. data/test/hpricot/test_paths.rb +0 -15
  317. data/test/hpricot/test_preserved.rb +0 -77
  318. data/test/hpricot/test_xml.rb +0 -30
  319. data/test/test_gc.rb +0 -15
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_ATTR
2
2
  #define NOKOGIRI_XML_ATTR
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_attr();
7
7
 
@@ -0,0 +1,70 @@
1
+ #include <xml_attribute_decl.h>
2
+
3
+ /*
4
+ * call-seq:
5
+ * attribute_type
6
+ *
7
+ * The attribute_type for this AttributeDecl
8
+ */
9
+ static VALUE attribute_type(VALUE self)
10
+ {
11
+ xmlAttributePtr node;
12
+ Data_Get_Struct(self, xmlAttribute, node);
13
+ return INT2NUM((long)node->atype);
14
+ }
15
+
16
+ /*
17
+ * call-seq:
18
+ * default
19
+ *
20
+ * The default value
21
+ */
22
+ static VALUE default_value(VALUE self)
23
+ {
24
+ xmlAttributePtr node;
25
+ Data_Get_Struct(self, xmlAttribute, node);
26
+
27
+ if(node->defaultValue) return NOKOGIRI_STR_NEW2(node->defaultValue);
28
+ return Qnil;
29
+ }
30
+
31
+ /*
32
+ * call-seq:
33
+ * enumeration
34
+ *
35
+ * An enumeration of possible values
36
+ */
37
+ static VALUE enumeration(VALUE self)
38
+ {
39
+ xmlAttributePtr node;
40
+ xmlEnumerationPtr enm;
41
+ VALUE list;
42
+
43
+ Data_Get_Struct(self, xmlAttribute, node);
44
+
45
+ list = rb_ary_new();
46
+ enm = node->tree;
47
+
48
+ while(enm) {
49
+ rb_ary_push(list, NOKOGIRI_STR_NEW2(enm->name));
50
+ enm = enm->next;
51
+ }
52
+
53
+ return list;
54
+ }
55
+
56
+ VALUE cNokogiriXmlAttributeDecl;
57
+
58
+ void init_xml_attribute_decl()
59
+ {
60
+ VALUE nokogiri = rb_define_module("Nokogiri");
61
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
62
+ VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
63
+ VALUE klass = rb_define_class_under(xml, "AttributeDecl", node);
64
+
65
+ cNokogiriXmlAttributeDecl = klass;
66
+
67
+ rb_define_method(klass, "attribute_type", attribute_type, 0);
68
+ rb_define_method(klass, "default", default_value, 0);
69
+ rb_define_method(klass, "enumeration", enumeration, 0);
70
+ }
@@ -0,0 +1,9 @@
1
+ #ifndef NOKOGIRI_XML_ATTRIBUTE_DECL
2
+ #define NOKOGIRI_XML_ATTRIBUTE_DECL
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_attribute_decl();
7
+
8
+ extern VALUE cNokogiriXmlAttributeDecl;
9
+ #endif
@@ -4,20 +4,31 @@
4
4
  * call-seq:
5
5
  * new(document, content)
6
6
  *
7
- * Create a new CData element on the +document+ with +content+
7
+ * Create a new CDATA element on the +document+ with +content+
8
8
  */
9
- static VALUE new(VALUE klass, VALUE doc, VALUE content)
9
+ static VALUE new(int argc, VALUE *argv, VALUE klass)
10
10
  {
11
11
  xmlDocPtr xml_doc;
12
+ xmlNodePtr node;
13
+ VALUE doc;
14
+ VALUE content;
15
+ VALUE rest;
16
+ VALUE rb_node;
17
+
18
+ rb_scan_args(argc, argv, "2*", &doc, &content, &rest);
19
+
12
20
  Data_Get_Struct(doc, xmlDoc, xml_doc);
13
21
 
14
- xmlNodePtr node = xmlNewCDataBlock(
15
- xml_doc,
16
- (const xmlChar *)StringValuePtr(content),
17
- RSTRING_LEN(content)
22
+ node = xmlNewCDataBlock(
23
+ xml_doc->doc,
24
+ NIL_P(content) ? NULL : (const xmlChar *)StringValuePtr(content),
25
+ NIL_P(content) ? 0 : (int)RSTRING_LEN(content)
18
26
  );
19
27
 
20
- VALUE rb_node = Nokogiri_wrap_xml_node(node);
28
+ NOKOGIRI_ROOT_NODE(node);
29
+
30
+ rb_node = Nokogiri_wrap_xml_node(klass, node);
31
+ rb_obj_call_init(rb_node, argc, argv);
21
32
 
22
33
  if(rb_block_given_p()) rb_yield(rb_node);
23
34
 
@@ -30,7 +41,8 @@ void init_xml_cdata()
30
41
  VALUE nokogiri = rb_define_module("Nokogiri");
31
42
  VALUE xml = rb_define_module_under(nokogiri, "XML");
32
43
  VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
33
- VALUE text = rb_define_class_under(xml, "Text", node);
44
+ VALUE char_data = rb_define_class_under(xml, "CharacterData", node);
45
+ VALUE text = rb_define_class_under(xml, "Text", char_data);
34
46
 
35
47
  /*
36
48
  * CData represents a CData node in an xml document.
@@ -40,5 +52,5 @@ void init_xml_cdata()
40
52
 
41
53
  cNokogiriXmlCData = klass;
42
54
 
43
- rb_define_singleton_method(klass, "new", new, 2);
55
+ rb_define_singleton_method(klass, "new", new, -1);
44
56
  }
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_CDATA
2
2
  #define NOKOGIRI_XML_CDATA
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_cdata();
7
7
 
@@ -6,17 +6,28 @@
6
6
  *
7
7
  * Create a new Comment element on the +document+ with +content+
8
8
  */
9
- static VALUE new(VALUE klass, VALUE doc, VALUE content)
9
+ static VALUE new(int argc, VALUE *argv, VALUE klass)
10
10
  {
11
11
  xmlDocPtr xml_doc;
12
- Data_Get_Struct(doc, xmlDoc, xml_doc);
12
+ xmlNodePtr node;
13
+ VALUE document;
14
+ VALUE content;
15
+ VALUE rest;
16
+ VALUE rb_node;
13
17
 
14
- xmlNodePtr node = xmlNewDocComment(
18
+ rb_scan_args(argc, argv, "2*", &document, &content, &rest);
19
+
20
+ Data_Get_Struct(document, xmlDoc, xml_doc);
21
+
22
+ node = xmlNewDocComment(
15
23
  xml_doc,
16
24
  (const xmlChar *)StringValuePtr(content)
17
25
  );
18
26
 
19
- VALUE rb_node = Nokogiri_wrap_xml_node(node);
27
+ rb_node = Nokogiri_wrap_xml_node(klass, node);
28
+ rb_obj_call_init(rb_node, argc, argv);
29
+
30
+ NOKOGIRI_ROOT_NODE(node);
20
31
 
21
32
  if(rb_block_given_p()) rb_yield(rb_node);
22
33
 
@@ -29,14 +40,15 @@ void init_xml_comment()
29
40
  VALUE nokogiri = rb_define_module("Nokogiri");
30
41
  VALUE xml = rb_define_module_under(nokogiri, "XML");
31
42
  VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
43
+ VALUE char_data = rb_define_class_under(xml, "CharacterData", node);
32
44
 
33
45
  /*
34
46
  * Comment represents a comment node in an xml document.
35
47
  */
36
- VALUE klass = rb_define_class_under(xml, "Comment", node);
48
+ VALUE klass = rb_define_class_under(xml, "Comment", char_data);
37
49
 
38
50
 
39
51
  cNokogiriXmlComment = klass;
40
52
 
41
- rb_define_singleton_method(klass, "new", new, 2);
53
+ rb_define_singleton_method(klass, "new", new, -1);
42
54
  }
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_COMMENT
2
2
  #define NOKOGIRI_XML_COMMENT
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_comment();
7
7
 
@@ -1,28 +1,67 @@
1
1
  #include <xml_document.h>
2
2
 
3
+ static int dealloc_node_i(xmlNodePtr key, xmlNodePtr node, xmlDocPtr doc)
4
+ {
5
+ switch(node->type) {
6
+ case XML_ATTRIBUTE_NODE:
7
+ xmlFreePropList((xmlAttrPtr)node);
8
+ break;
9
+ case XML_NAMESPACE_DECL:
10
+ xmlFree(node);
11
+ break;
12
+ default:
13
+ if(node->parent == NULL) {
14
+ xmlAddChild((xmlNodePtr)doc, node);
15
+ }
16
+ }
17
+ return ST_CONTINUE;
18
+ }
19
+
3
20
  static void dealloc(xmlDocPtr doc)
4
21
  {
22
+ xmlDeregisterNodeFunc func;
23
+ st_table *node_hash;
24
+
5
25
  NOKOGIRI_DEBUG_START(doc);
26
+ func = xmlDeregisterNodeDefault(NULL);
6
27
 
7
- nokogiriTuplePtr tuple = doc->_private;
8
- xmlNodeSetPtr node_set = tuple->unlinkedNodes;
28
+ node_hash = DOC_UNLINKED_NODE_HASH(doc);
9
29
 
10
- int i;
11
- for(i = 0; i < node_set->nodeNr; i++) {
12
- xmlAddChild((xmlNodePtr)doc, node_set->nodeTab[i]);
13
- }
14
-
15
- if (node_set->nodeTab != NULL)
16
- xmlFree(node_set->nodeTab);
17
- xmlFree(node_set);
30
+ st_foreach(node_hash, dealloc_node_i, (st_data_t)doc);
31
+ st_free_table(node_hash);
18
32
 
19
33
  free(doc->_private);
20
34
  doc->_private = NULL;
21
35
  xmlFreeDoc(doc);
22
36
 
37
+ xmlDeregisterNodeDefault(func);
23
38
  NOKOGIRI_DEBUG_END(doc);
24
39
  }
25
40
 
41
+ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
42
+ {
43
+ xmlNodePtr child ;
44
+ xmlAttrPtr property ;
45
+
46
+ xmlSetNs(node, NULL);
47
+
48
+ for (child = node->children ; child ; child = child->next)
49
+ recursively_remove_namespaces_from_node(child);
50
+
51
+ if (node->nsDef) {
52
+ xmlFreeNsList(node->nsDef);
53
+ node->nsDef = NULL;
54
+ }
55
+
56
+ if (node->properties != NULL) {
57
+ property = node->properties ;
58
+ while (property != NULL) {
59
+ if (property->ns) property->ns = NULL ;
60
+ property = property->next ;
61
+ }
62
+ }
63
+ }
64
+
26
65
  /*
27
66
  * call-seq:
28
67
  * url
@@ -34,8 +73,7 @@ static VALUE url(VALUE self)
34
73
  xmlDocPtr doc;
35
74
  Data_Get_Struct(self, xmlDoc, doc);
36
75
 
37
- if(doc->URL)
38
- return NOKOGIRI_STR_NEW2(doc->URL, doc->encoding);
76
+ if(doc->URL) return NOKOGIRI_STR_NEW2(doc->URL);
39
77
 
40
78
  return Qnil;
41
79
  }
@@ -50,11 +88,37 @@ static VALUE set_root(VALUE self, VALUE root)
50
88
  {
51
89
  xmlDocPtr doc;
52
90
  xmlNodePtr new_root;
91
+ xmlNodePtr old_root;
53
92
 
54
93
  Data_Get_Struct(self, xmlDoc, doc);
94
+
95
+ old_root = NULL;
96
+
97
+ if(NIL_P(root)) {
98
+ old_root = xmlDocGetRootElement(doc);
99
+
100
+ if(old_root) {
101
+ xmlUnlinkNode(old_root);
102
+ NOKOGIRI_ROOT_NODE(old_root);
103
+ }
104
+
105
+ return root;
106
+ }
107
+
55
108
  Data_Get_Struct(root, xmlNode, new_root);
56
109
 
110
+
111
+ /* If the new root's document is not the same as the current document,
112
+ * then we need to dup the node in to this document. */
113
+ if(new_root->doc != doc) {
114
+ old_root = xmlDocGetRootElement(doc);
115
+ if (!(new_root = xmlDocCopyNode(new_root, doc, 1))) {
116
+ rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)");
117
+ }
118
+ }
119
+
57
120
  xmlDocSetRootElement(doc, new_root);
121
+ if(old_root) NOKOGIRI_ROOT_NODE(old_root);
58
122
  return root;
59
123
  }
60
124
 
@@ -67,12 +131,30 @@ static VALUE set_root(VALUE self, VALUE root)
67
131
  static VALUE root(VALUE self)
68
132
  {
69
133
  xmlDocPtr doc;
134
+ xmlNodePtr root;
135
+
70
136
  Data_Get_Struct(self, xmlDoc, doc);
71
137
 
72
- xmlNodePtr root = xmlDocGetRootElement(doc);
138
+ root = xmlDocGetRootElement(doc);
73
139
 
74
140
  if(!root) return Qnil;
75
- return Nokogiri_wrap_xml_node(root) ;
141
+ return Nokogiri_wrap_xml_node(Qnil, root) ;
142
+ }
143
+
144
+ /*
145
+ * call-seq:
146
+ * encoding= encoding
147
+ *
148
+ * Set the encoding string for this Document
149
+ */
150
+ static VALUE set_encoding(VALUE self, VALUE encoding)
151
+ {
152
+ xmlDocPtr doc;
153
+ Data_Get_Struct(self, xmlDoc, doc);
154
+
155
+ doc->encoding = xmlStrdup((xmlChar *)StringValuePtr(encoding));
156
+
157
+ return encoding;
76
158
  }
77
159
 
78
160
  /*
@@ -87,7 +169,22 @@ static VALUE encoding(VALUE self)
87
169
  Data_Get_Struct(self, xmlDoc, doc);
88
170
 
89
171
  if(!doc->encoding) return Qnil;
90
- return NOKOGIRI_STR_NEW2(doc->encoding, doc->encoding);
172
+ return NOKOGIRI_STR_NEW2(doc->encoding);
173
+ }
174
+
175
+ /*
176
+ * call-seq:
177
+ * version
178
+ *
179
+ * Get the XML version for this Document
180
+ */
181
+ static VALUE version(VALUE self)
182
+ {
183
+ xmlDocPtr doc;
184
+ Data_Get_Struct(self, xmlDoc, doc);
185
+
186
+ if(!doc->version) return Qnil;
187
+ return NOKOGIRI_STR_NEW2(doc->version);
91
188
  }
92
189
 
93
190
  /*
@@ -102,40 +199,41 @@ static VALUE read_io( VALUE klass,
102
199
  VALUE encoding,
103
200
  VALUE options )
104
201
  {
105
- const char * c_url = (url == Qnil) ? NULL : StringValuePtr(url);
106
- const char * c_enc = (encoding == Qnil) ? NULL : StringValuePtr(encoding);
202
+ const char * c_url = NIL_P(url) ? NULL : StringValuePtr(url);
203
+ const char * c_enc = NIL_P(encoding) ? NULL : StringValuePtr(encoding);
107
204
  VALUE error_list = rb_ary_new();
205
+ VALUE document;
206
+ xmlDocPtr doc;
108
207
 
109
- xmlInitParser();
110
208
  xmlResetLastError();
111
209
  xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
112
210
 
113
- xmlDocPtr doc = xmlReadIO(
211
+ doc = xmlReadIO(
114
212
  (xmlInputReadCallback)io_read_callback,
115
213
  (xmlInputCloseCallback)io_close_callback,
116
214
  (void *)io,
117
215
  c_url,
118
216
  c_enc,
119
- NUM2INT(options)
217
+ (int)NUM2INT(options)
120
218
  );
121
219
  xmlSetStructuredErrorFunc(NULL, NULL);
122
220
 
123
221
  if(doc == NULL) {
222
+ xmlErrorPtr error;
223
+
124
224
  xmlFreeDoc(doc);
125
225
 
126
- xmlErrorPtr error = xmlGetLastError();
226
+ error = xmlGetLastError();
127
227
  if(error)
128
- rb_funcall(rb_mKernel, rb_intern("raise"), 1,
129
- Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error)
130
- );
228
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
131
229
  else
132
230
  rb_raise(rb_eRuntimeError, "Could not parse document");
133
231
 
134
232
  return Qnil;
135
233
  }
136
234
 
137
- VALUE document = Nokogiri_wrap_xml_document(klass, doc);
138
- rb_funcall(document, rb_intern("errors="), 1, error_list);
235
+ document = Nokogiri_wrap_xml_document(klass, doc);
236
+ rb_iv_set(document, "@errors", error_list);
139
237
  return document;
140
238
  }
141
239
 
@@ -152,33 +250,34 @@ static VALUE read_memory( VALUE klass,
152
250
  VALUE options )
153
251
  {
154
252
  const char * c_buffer = StringValuePtr(string);
155
- const char * c_url = (url == Qnil) ? NULL : StringValuePtr(url);
156
- const char * c_enc = (encoding == Qnil) ? NULL : StringValuePtr(encoding);
157
- int len = RSTRING_LEN(string);
253
+ const char * c_url = NIL_P(url) ? NULL : StringValuePtr(url);
254
+ const char * c_enc = NIL_P(encoding) ? NULL : StringValuePtr(encoding);
255
+ int len = (int)RSTRING_LEN(string);
158
256
  VALUE error_list = rb_ary_new();
257
+ VALUE document;
258
+ xmlDocPtr doc;
159
259
 
160
- xmlInitParser();
161
260
  xmlResetLastError();
162
261
  xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
163
- xmlDocPtr doc = xmlReadMemory(c_buffer, len, c_url, c_enc, NUM2INT(options));
262
+ doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options));
164
263
  xmlSetStructuredErrorFunc(NULL, NULL);
165
264
 
166
265
  if(doc == NULL) {
266
+ xmlErrorPtr error;
267
+
167
268
  xmlFreeDoc(doc);
168
269
 
169
- xmlErrorPtr error = xmlGetLastError();
270
+ error = xmlGetLastError();
170
271
  if(error)
171
- rb_funcall(rb_mKernel, rb_intern("raise"), 1,
172
- Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error)
173
- );
272
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
174
273
  else
175
274
  rb_raise(rb_eRuntimeError, "Could not parse document");
176
275
 
177
276
  return Qnil;
178
277
  }
179
278
 
180
- VALUE document = Nokogiri_wrap_xml_document(klass, doc);
181
- rb_funcall(document, rb_intern("errors="), 1, error_list);
279
+ document = Nokogiri_wrap_xml_document(klass, doc);
280
+ rb_iv_set(document, "@errors", error_list);
182
281
  return document;
183
282
  }
184
283
 
@@ -191,62 +290,135 @@ static VALUE read_memory( VALUE klass,
191
290
  */
192
291
  static VALUE duplicate_node(int argc, VALUE *argv, VALUE self)
193
292
  {
293
+ xmlDocPtr doc, dup;
194
294
  VALUE level;
195
295
 
196
296
  if(rb_scan_args(argc, argv, "01", &level) == 0)
197
- level = INT2NUM(1);
297
+ level = INT2NUM((long)1);
198
298
 
199
- xmlDocPtr doc, dup;
200
299
  Data_Get_Struct(self, xmlDoc, doc);
201
300
 
202
- dup = xmlCopyDoc(doc, NUM2INT(level));
301
+ dup = xmlCopyDoc(doc, (int)NUM2INT(level));
203
302
  if(dup == NULL) return Qnil;
204
303
 
205
304
  dup->type = doc->type;
206
- if(dup->type == XML_DOCUMENT_NODE)
207
- return Nokogiri_wrap_xml_document(cNokogiriXmlDocument, dup);
208
- else
209
- return Nokogiri_wrap_xml_document(cNokogiriHtmlDocument, dup);
305
+ return Nokogiri_wrap_xml_document(rb_obj_class(self), dup);
210
306
  }
211
307
 
212
308
  /*
213
309
  * call-seq:
214
- * new
310
+ * new(version = default)
215
311
  *
216
- * Create a new document
312
+ * Create a new document with +version+ (defaults to "1.0")
217
313
  */
218
314
  static VALUE new(int argc, VALUE *argv, VALUE klass)
219
315
  {
220
- VALUE version;
221
- if(rb_scan_args(argc, argv, "01", &version) == 0)
222
- version = rb_str_new2("1.0");
316
+ xmlDocPtr doc;
317
+ VALUE version, rest, rb_doc ;
318
+
319
+ rb_scan_args(argc, argv, "0*", &rest);
320
+ version = rb_ary_entry(rest, (long)0);
321
+ if (NIL_P(version)) version = rb_str_new2("1.0");
223
322
 
224
- xmlDocPtr doc = xmlNewDoc((xmlChar *)StringValuePtr(version));
225
- return Nokogiri_wrap_xml_document(klass, doc);
323
+ doc = xmlNewDoc((xmlChar *)StringValuePtr(version));
324
+ rb_doc = Nokogiri_wrap_xml_document(klass, doc);
325
+ rb_obj_call_init(rb_doc, argc, argv);
326
+ return rb_doc ;
226
327
  }
227
328
 
228
329
  /*
229
330
  * call-seq:
230
- * substitute_entities=(boolean)
331
+ * remove_namespaces!
332
+ *
333
+ * Remove all namespaces from all nodes in the document.
334
+ *
335
+ * This could be useful for developers who either don't understand namespaces
336
+ * or don't care about them.
337
+ *
338
+ * The following example shows a use case, and you can decide for yourself
339
+ * whether this is a good thing or not:
340
+ *
341
+ * doc = Nokogiri::XML <<-EOXML
342
+ * <root>
343
+ * <car xmlns:part="http://general-motors.com/">
344
+ * <part:tire>Michelin Model XGV</part:tire>
345
+ * </car>
346
+ * <bicycle xmlns:part="http://schwinn.com/">
347
+ * <part:tire>I'm a bicycle tire!</part:tire>
348
+ * </bicycle>
349
+ * </root>
350
+ * EOXML
351
+ *
352
+ * doc.xpath("//tire").to_s # => ""
353
+ * doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => "<part:tire>Michelin Model XGV</part:tire>"
354
+ * doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => "<part:tire>I'm a bicycle tire!</part:tire>"
355
+ *
356
+ * doc.remove_namespaces!
357
+ *
358
+ * doc.xpath("//tire").to_s # => "<tire>Michelin Model XGV</tire><tire>I'm a bicycle tire!</tire>"
359
+ * doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => ""
360
+ * doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => ""
231
361
  *
232
- * Set the global XML default for substitute entities.
362
+ * For more information on why this probably is *not* a good thing in general,
363
+ * please direct your browser to
364
+ * http://tenderlovemaking.com/2009/04/23/namespaces-in-xml/
233
365
  */
234
- static VALUE substitute_entities_set(VALUE klass, VALUE value)
366
+ VALUE remove_namespaces_bang(VALUE self)
235
367
  {
236
- xmlSubstituteEntitiesDefault(NUM2INT(value));
237
- return Qnil ;
368
+ xmlDocPtr doc ;
369
+ Data_Get_Struct(self, xmlDoc, doc);
370
+
371
+ recursively_remove_namespaces_from_node((xmlNodePtr)doc);
372
+ return self;
238
373
  }
239
374
 
240
- /*
241
- * call-seq:
242
- * load_external_subsets=(boolean)
375
+ /* call-seq: doc.create_entity(name, type, external_id, system_id, content)
376
+ *
377
+ * Create a new entity named +name+.
243
378
  *
244
- * Set the global XML default for load external subsets.
379
+ * +type+ is an integer representing the type of entity to be created, and it
380
+ * defaults to Nokogiri::XML::EntityDecl::INTERNAL_GENERAL. See
381
+ * the constants on Nokogiri::XML::EntityDecl for more information.
382
+ *
383
+ * +external_id+, +system_id+, and +content+ set the External ID, System ID,
384
+ * and content respectively. All of these parameters are optional.
245
385
  */
246
- static VALUE load_external_subsets_set(VALUE klass, VALUE value)
386
+ static VALUE create_entity(int argc, VALUE *argv, VALUE self)
247
387
  {
248
- xmlLoadExtDtdDefaultValue = NUM2INT(value);
249
- return Qnil ;
388
+ VALUE name;
389
+ VALUE type;
390
+ VALUE external_id;
391
+ VALUE system_id;
392
+ VALUE content;
393
+ xmlEntityPtr ptr;
394
+ xmlDocPtr doc ;
395
+
396
+ Data_Get_Struct(self, xmlDoc, doc);
397
+
398
+ rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id,
399
+ &content);
400
+
401
+ xmlResetLastError();
402
+ ptr = xmlAddDocEntity(
403
+ doc,
404
+ (xmlChar *)(NIL_P(name) ? NULL : StringValuePtr(name)),
405
+ (int) (NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)),
406
+ (xmlChar *)(NIL_P(external_id) ? NULL : StringValuePtr(external_id)),
407
+ (xmlChar *)(NIL_P(system_id) ? NULL : StringValuePtr(system_id)),
408
+ (xmlChar *)(NIL_P(content) ? NULL : StringValuePtr(content))
409
+ );
410
+
411
+ if(NULL == ptr) {
412
+ xmlErrorPtr error = xmlGetLastError();
413
+ if(error)
414
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
415
+ else
416
+ rb_raise(rb_eRuntimeError, "Could not create entity");
417
+
418
+ return Qnil;
419
+ }
420
+
421
+ return Nokogiri_wrap_xml_node(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
250
422
  }
251
423
 
252
424
  VALUE cNokogiriXmlDocument ;
@@ -266,34 +438,41 @@ void init_xml_document()
266
438
  rb_define_singleton_method(klass, "read_memory", read_memory, 4);
267
439
  rb_define_singleton_method(klass, "read_io", read_io, 4);
268
440
  rb_define_singleton_method(klass, "new", new, -1);
269
- rb_define_singleton_method(klass, "substitute_entities=", substitute_entities_set, 1);
270
- rb_define_singleton_method(klass, "load_external_subsets=", load_external_subsets_set, 1);
271
441
 
272
442
  rb_define_method(klass, "root", root, 0);
273
443
  rb_define_method(klass, "root=", set_root, 1);
274
444
  rb_define_method(klass, "encoding", encoding, 0);
445
+ rb_define_method(klass, "encoding=", set_encoding, 1);
446
+ rb_define_method(klass, "version", version, 0);
275
447
  rb_define_method(klass, "dup", duplicate_node, -1);
276
448
  rb_define_method(klass, "url", url, 0);
449
+ rb_define_method(klass, "create_entity", create_entity, -1);
450
+ rb_define_method(klass, "remove_namespaces!", remove_namespaces_bang, 0);
277
451
  }
278
452
 
279
453
 
280
454
  /* this takes klass as a param because it's used for HtmlDocument, too. */
281
455
  VALUE Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
282
456
  {
283
- VALUE rb_doc = Qnil;
284
457
  nokogiriTuplePtr tuple = (nokogiriTuplePtr)malloc(sizeof(nokogiriTuple));
285
458
 
286
- rb_doc = Data_Wrap_Struct(
459
+ VALUE rb_doc = Data_Wrap_Struct(
287
460
  klass ? klass : cNokogiriXmlDocument,
288
461
  0,
289
462
  dealloc,
290
463
  doc
291
464
  );
465
+
466
+ VALUE cache = rb_ary_new();
292
467
  rb_iv_set(rb_doc, "@decorators", Qnil);
468
+ rb_iv_set(rb_doc, "@node_cache", cache);
293
469
 
294
470
  tuple->doc = (void *)rb_doc;
295
- tuple->unlinkedNodes = xmlXPathNodeSetCreate(NULL);
471
+ tuple->unlinkedNodes = st_init_numtable_with_size(128);
472
+ tuple->node_cache = cache;
296
473
  doc->_private = tuple ;
297
474
 
475
+ rb_obj_call_init(rb_doc, 0, NULL);
476
+
298
477
  return rb_doc ;
299
478
  }