nokogiri 1.0.0 → 1.6.8.1

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 (309) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +26 -0
  3. data/.cross_rubies +9 -0
  4. data/.editorconfig +17 -0
  5. data/.gemtest +0 -0
  6. data/.travis.yml +51 -0
  7. data/CHANGELOG.rdoc +1160 -0
  8. data/CONTRIBUTING.md +42 -0
  9. data/C_CODING_STYLE.rdoc +33 -0
  10. data/Gemfile +22 -0
  11. data/LICENSE.txt +31 -0
  12. data/Manifest.txt +284 -40
  13. data/README.md +166 -0
  14. data/ROADMAP.md +111 -0
  15. data/Rakefile +310 -199
  16. data/STANDARD_RESPONSES.md +47 -0
  17. data/Y_U_NO_GEMSPEC.md +155 -0
  18. data/appveyor.yml +22 -0
  19. data/bin/nokogiri +118 -0
  20. data/build_all +45 -0
  21. data/dependencies.yml +29 -0
  22. data/ext/nokogiri/depend +358 -0
  23. data/ext/nokogiri/extconf.rb +664 -34
  24. data/ext/nokogiri/html_document.c +120 -33
  25. data/ext/nokogiri/html_document.h +1 -1
  26. data/ext/nokogiri/html_element_description.c +279 -0
  27. data/ext/nokogiri/html_element_description.h +10 -0
  28. data/ext/nokogiri/html_entity_lookup.c +32 -0
  29. data/ext/nokogiri/html_entity_lookup.h +8 -0
  30. data/ext/nokogiri/html_sax_parser_context.c +116 -0
  31. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  32. data/ext/nokogiri/html_sax_push_parser.c +87 -0
  33. data/ext/nokogiri/html_sax_push_parser.h +9 -0
  34. data/ext/nokogiri/nokogiri.c +145 -0
  35. data/ext/nokogiri/nokogiri.h +131 -0
  36. data/ext/nokogiri/xml_attr.c +94 -0
  37. data/ext/nokogiri/xml_attr.h +9 -0
  38. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  39. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  40. data/ext/nokogiri/xml_cdata.c +23 -19
  41. data/ext/nokogiri/xml_cdata.h +1 -1
  42. data/ext/nokogiri/xml_comment.c +69 -0
  43. data/ext/nokogiri/xml_comment.h +9 -0
  44. data/ext/nokogiri/xml_document.c +501 -54
  45. data/ext/nokogiri/xml_document.h +14 -1
  46. data/ext/nokogiri/xml_document_fragment.c +48 -0
  47. data/ext/nokogiri/xml_document_fragment.h +10 -0
  48. data/ext/nokogiri/xml_dtd.c +109 -24
  49. data/ext/nokogiri/xml_dtd.h +3 -1
  50. data/ext/nokogiri/xml_element_content.c +123 -0
  51. data/ext/nokogiri/xml_element_content.h +10 -0
  52. data/ext/nokogiri/xml_element_decl.c +69 -0
  53. data/ext/nokogiri/xml_element_decl.h +9 -0
  54. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  55. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  56. data/ext/nokogiri/xml_entity_decl.c +110 -0
  57. data/ext/nokogiri/xml_entity_decl.h +10 -0
  58. data/ext/nokogiri/xml_entity_reference.c +52 -0
  59. data/ext/nokogiri/xml_entity_reference.h +9 -0
  60. data/ext/nokogiri/xml_io.c +60 -0
  61. data/ext/nokogiri/xml_io.h +11 -0
  62. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  63. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  64. data/ext/nokogiri/xml_namespace.c +117 -0
  65. data/ext/nokogiri/xml_namespace.h +13 -0
  66. data/ext/nokogiri/xml_node.c +1285 -315
  67. data/ext/nokogiri/xml_node.h +4 -6
  68. data/ext/nokogiri/xml_node_set.c +415 -54
  69. data/ext/nokogiri/xml_node_set.h +6 -2
  70. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  71. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  72. data/ext/nokogiri/xml_reader.c +316 -77
  73. data/ext/nokogiri/xml_reader.h +1 -1
  74. data/ext/nokogiri/xml_relax_ng.c +161 -0
  75. data/ext/nokogiri/xml_relax_ng.h +9 -0
  76. data/ext/nokogiri/xml_sax_parser.c +215 -80
  77. data/ext/nokogiri/xml_sax_parser.h +30 -1
  78. data/ext/nokogiri/xml_sax_parser_context.c +262 -0
  79. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  80. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  81. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  82. data/ext/nokogiri/xml_schema.c +205 -0
  83. data/ext/nokogiri/xml_schema.h +9 -0
  84. data/ext/nokogiri/xml_syntax_error.c +45 -175
  85. data/ext/nokogiri/xml_syntax_error.h +4 -2
  86. data/ext/nokogiri/xml_text.c +37 -14
  87. data/ext/nokogiri/xml_text.h +1 -1
  88. data/ext/nokogiri/xml_xpath_context.c +230 -13
  89. data/ext/nokogiri/xml_xpath_context.h +2 -1
  90. data/ext/nokogiri/xslt_stylesheet.c +196 -34
  91. data/ext/nokogiri/xslt_stylesheet.h +6 -1
  92. data/lib/nokogiri/css/node.rb +18 -61
  93. data/lib/nokogiri/css/parser.rb +725 -17
  94. data/lib/nokogiri/css/parser.y +126 -63
  95. data/lib/nokogiri/css/parser_extras.rb +91 -0
  96. data/lib/nokogiri/css/syntax_error.rb +7 -0
  97. data/lib/nokogiri/css/tokenizer.rb +148 -5
  98. data/lib/nokogiri/css/tokenizer.rex +31 -39
  99. data/lib/nokogiri/css/xpath_visitor.rb +109 -51
  100. data/lib/nokogiri/css.rb +24 -3
  101. data/lib/nokogiri/decorators/slop.rb +42 -0
  102. data/lib/nokogiri/html/builder.rb +27 -1
  103. data/lib/nokogiri/html/document.rb +329 -3
  104. data/lib/nokogiri/html/document_fragment.rb +39 -0
  105. data/lib/nokogiri/html/element_description.rb +23 -0
  106. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  107. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  108. data/lib/nokogiri/html/sax/parser.rb +35 -4
  109. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  110. data/lib/nokogiri/html/sax/push_parser.rb +36 -0
  111. data/lib/nokogiri/html.rb +18 -76
  112. data/lib/nokogiri/syntax_error.rb +4 -0
  113. data/lib/nokogiri/version.rb +106 -1
  114. data/lib/nokogiri/xml/attr.rb +14 -0
  115. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  116. data/lib/nokogiri/xml/builder.rb +395 -31
  117. data/lib/nokogiri/xml/cdata.rb +4 -2
  118. data/lib/nokogiri/xml/character_data.rb +7 -0
  119. data/lib/nokogiri/xml/document.rb +267 -12
  120. data/lib/nokogiri/xml/document_fragment.rb +149 -0
  121. data/lib/nokogiri/xml/dtd.rb +27 -1
  122. data/lib/nokogiri/xml/element_content.rb +36 -0
  123. data/lib/nokogiri/xml/element_decl.rb +13 -0
  124. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  125. data/lib/nokogiri/xml/namespace.rb +13 -0
  126. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  127. data/lib/nokogiri/xml/node.rb +748 -109
  128. data/lib/nokogiri/xml/node_set.rb +200 -72
  129. data/lib/nokogiri/xml/parse_options.rb +120 -0
  130. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  131. data/lib/nokogiri/xml/pp/node.rb +56 -0
  132. data/lib/nokogiri/xml/pp.rb +2 -0
  133. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  134. data/lib/nokogiri/xml/reader.rb +102 -4
  135. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  136. data/lib/nokogiri/xml/sax/document.rb +114 -2
  137. data/lib/nokogiri/xml/sax/parser.rb +97 -7
  138. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  139. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  140. data/lib/nokogiri/xml/sax.rb +2 -7
  141. data/lib/nokogiri/xml/schema.rb +63 -0
  142. data/lib/nokogiri/xml/searchable.rb +221 -0
  143. data/lib/nokogiri/xml/syntax_error.rb +27 -1
  144. data/lib/nokogiri/xml/text.rb +4 -1
  145. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  146. data/lib/nokogiri/xml/xpath.rb +4 -0
  147. data/lib/nokogiri/xml/xpath_context.rb +3 -1
  148. data/lib/nokogiri/xml.rb +45 -38
  149. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  150. data/lib/nokogiri/xslt.rb +47 -2
  151. data/lib/nokogiri.rb +117 -24
  152. data/lib/xsd/xmlparser/nokogiri.rb +102 -0
  153. data/patches/sort-patches-by-date +25 -0
  154. data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
  155. data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
  156. data/suppressions/README.txt +1 -0
  157. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  158. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  159. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  160. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  161. data/tasks/test.rb +100 -0
  162. data/test/css/test_nthiness.rb +73 -6
  163. data/test/css/test_parser.rb +184 -39
  164. data/test/css/test_tokenizer.rb +72 -19
  165. data/test/css/test_xpath_visitor.rb +44 -2
  166. data/test/decorators/test_slop.rb +20 -0
  167. data/test/files/2ch.html +108 -0
  168. data/test/files/GH_1042.html +18 -0
  169. data/test/files/address_book.rlx +12 -0
  170. data/test/files/address_book.xml +10 -0
  171. data/test/files/atom.xml +344 -0
  172. data/test/files/bar/bar.xsd +4 -0
  173. data/test/files/bogus.xml +0 -0
  174. data/test/files/dont_hurt_em_why.xml +422 -0
  175. data/test/files/encoding.html +82 -0
  176. data/test/files/encoding.xhtml +84 -0
  177. data/test/files/exslt.xml +8 -0
  178. data/test/files/exslt.xslt +35 -0
  179. data/test/files/foo/foo.xsd +4 -0
  180. data/test/files/metacharset.html +10 -0
  181. data/test/files/namespace_pressure_test.xml +1684 -0
  182. data/test/files/noencoding.html +47 -0
  183. data/test/files/po.xml +32 -0
  184. data/test/files/po.xsd +66 -0
  185. data/test/files/saml/saml20assertion_schema.xsd +283 -0
  186. data/test/files/saml/saml20protocol_schema.xsd +302 -0
  187. data/test/files/saml/xenc_schema.xsd +146 -0
  188. data/test/files/saml/xmldsig_schema.xsd +318 -0
  189. data/test/files/shift_jis.html +10 -0
  190. data/test/files/shift_jis.xml +5 -0
  191. data/test/files/shift_jis_no_charset.html +9 -0
  192. data/test/files/slow-xpath.xml +25509 -0
  193. data/test/files/snuggles.xml +3 -0
  194. data/test/files/staff.dtd +10 -0
  195. data/test/files/test_document_url/bar.xml +2 -0
  196. data/test/files/test_document_url/document.dtd +4 -0
  197. data/test/files/test_document_url/document.xml +6 -0
  198. data/test/files/tlm.html +2 -1
  199. data/test/files/to_be_xincluded.xml +2 -0
  200. data/test/files/valid_bar.xml +2 -0
  201. data/test/files/xinclude.xml +4 -0
  202. data/test/helper.rb +124 -13
  203. data/test/html/sax/test_parser.rb +118 -4
  204. data/test/html/sax/test_parser_context.rb +46 -0
  205. data/test/html/sax/test_push_parser.rb +87 -0
  206. data/test/html/test_builder.rb +94 -8
  207. data/test/html/test_document.rb +626 -11
  208. data/test/html/test_document_encoding.rb +145 -0
  209. data/test/html/test_document_fragment.rb +301 -0
  210. data/test/html/test_element_description.rb +105 -0
  211. data/test/html/test_named_characters.rb +14 -0
  212. data/test/html/test_node.rb +212 -0
  213. data/test/html/test_node_encoding.rb +85 -0
  214. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
  215. data/test/namespaces/test_namespaces_aliased_default.rb +24 -0
  216. data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
  217. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  218. data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
  219. data/test/namespaces/test_namespaces_in_parsed_doc.rb +80 -0
  220. data/test/namespaces/test_namespaces_preservation.rb +31 -0
  221. data/test/test_convert_xpath.rb +2 -47
  222. data/test/test_css_cache.rb +45 -0
  223. data/test/test_encoding_handler.rb +48 -0
  224. data/test/test_memory_leak.rb +156 -0
  225. data/test/test_nokogiri.rb +103 -1
  226. data/test/test_soap4r_sax.rb +52 -0
  227. data/test/test_xslt_transforms.rb +293 -8
  228. data/test/xml/node/test_save_options.rb +28 -0
  229. data/test/xml/node/test_subclass.rb +44 -0
  230. data/test/xml/sax/test_parser.rb +309 -8
  231. data/test/xml/sax/test_parser_context.rb +115 -0
  232. data/test/xml/sax/test_push_parser.rb +157 -0
  233. data/test/xml/test_attr.rb +67 -0
  234. data/test/xml/test_attribute_decl.rb +86 -0
  235. data/test/xml/test_builder.rb +327 -2
  236. data/test/xml/test_c14n.rb +180 -0
  237. data/test/xml/test_cdata.rb +32 -2
  238. data/test/xml/test_comment.rb +40 -0
  239. data/test/xml/test_document.rb +846 -35
  240. data/test/xml/test_document_encoding.rb +31 -0
  241. data/test/xml/test_document_fragment.rb +271 -0
  242. data/test/xml/test_dtd.rb +153 -9
  243. data/test/xml/test_dtd_encoding.rb +31 -0
  244. data/test/xml/test_element_content.rb +56 -0
  245. data/test/xml/test_element_decl.rb +73 -0
  246. data/test/xml/test_entity_decl.rb +122 -0
  247. data/test/xml/test_entity_reference.rb +251 -0
  248. data/test/xml/test_namespace.rb +96 -0
  249. data/test/xml/test_node.rb +1126 -105
  250. data/test/xml/test_node_attributes.rb +115 -0
  251. data/test/xml/test_node_encoding.rb +69 -0
  252. data/test/xml/test_node_inheritance.rb +32 -0
  253. data/test/xml/test_node_reparenting.rb +549 -0
  254. data/test/xml/test_node_set.rb +668 -9
  255. data/test/xml/test_parse_options.rb +64 -0
  256. data/test/xml/test_processing_instruction.rb +30 -0
  257. data/test/xml/test_reader.rb +589 -0
  258. data/test/xml/test_reader_encoding.rb +134 -0
  259. data/test/xml/test_relax_ng.rb +60 -0
  260. data/test/xml/test_schema.rb +142 -0
  261. data/test/xml/test_syntax_error.rb +30 -0
  262. data/test/xml/test_text.rb +49 -2
  263. data/test/xml/test_unparented_node.rb +440 -0
  264. data/test/xml/test_xinclude.rb +83 -0
  265. data/test/xml/test_xpath.rb +445 -0
  266. data/test/xslt/test_custom_functions.rb +133 -0
  267. data/test/xslt/test_exception_handling.rb +37 -0
  268. data/test_all +107 -0
  269. metadata +459 -115
  270. data/History.txt +0 -6
  271. data/README.ja.txt +0 -86
  272. data/README.txt +0 -87
  273. data/ext/nokogiri/html_sax_parser.c +0 -32
  274. data/ext/nokogiri/html_sax_parser.h +0 -11
  275. data/ext/nokogiri/native.c +0 -40
  276. data/ext/nokogiri/native.h +0 -51
  277. data/ext/nokogiri/xml_xpath.c +0 -46
  278. data/ext/nokogiri/xml_xpath.h +0 -11
  279. data/lib/nokogiri/css/generated_parser.rb +0 -653
  280. data/lib/nokogiri/css/generated_tokenizer.rb +0 -159
  281. data/lib/nokogiri/decorators/hpricot/node.rb +0 -58
  282. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -14
  283. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -17
  284. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  285. data/lib/nokogiri/decorators.rb +0 -1
  286. data/lib/nokogiri/hpricot.rb +0 -47
  287. data/lib/nokogiri/xml/after_handler.rb +0 -18
  288. data/lib/nokogiri/xml/before_handler.rb +0 -32
  289. data/lib/nokogiri/xml/element.rb +0 -6
  290. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  291. data/nokogiri.gemspec +0 -34
  292. data/test/hpricot/files/basic.xhtml +0 -17
  293. data/test/hpricot/files/boingboing.html +0 -2266
  294. data/test/hpricot/files/cy0.html +0 -3653
  295. data/test/hpricot/files/immob.html +0 -400
  296. data/test/hpricot/files/pace_application.html +0 -1320
  297. data/test/hpricot/files/tenderlove.html +0 -16
  298. data/test/hpricot/files/uswebgen.html +0 -220
  299. data/test/hpricot/files/utf8.html +0 -1054
  300. data/test/hpricot/files/week9.html +0 -1723
  301. data/test/hpricot/files/why.xml +0 -19
  302. data/test/hpricot/load_files.rb +0 -7
  303. data/test/hpricot/test_alter.rb +0 -67
  304. data/test/hpricot/test_builder.rb +0 -27
  305. data/test/hpricot/test_parser.rb +0 -423
  306. data/test/hpricot/test_paths.rb +0 -15
  307. data/test/hpricot/test_preserved.rb +0 -78
  308. data/test/hpricot/test_xml.rb +0 -30
  309. data/test/test_reader.rb +0 -222
@@ -1,175 +1,51 @@
1
1
  #include <xml_syntax_error.h>
2
2
 
3
- static void dealloc(xmlErrorPtr ptr)
3
+ void Nokogiri_error_array_pusher(void * ctx, xmlErrorPtr error)
4
4
  {
5
- NOKOGIRI_DEBUG_START(ptr);
6
- free(ptr);
7
- NOKOGIRI_DEBUG_END(ptr);
5
+ VALUE list = (VALUE)ctx;
6
+ Check_Type(list, T_ARRAY);
7
+ rb_ary_push(list, Nokogiri_wrap_xml_syntax_error(error));
8
8
  }
9
9
 
10
- /*
11
- * call-seq:
12
- * column
13
- *
14
- * Column number or 0 if not available
15
- */
16
- static VALUE column(VALUE self)
10
+ void Nokogiri_error_raise(void * ctx, xmlErrorPtr error)
17
11
  {
18
- xmlErrorPtr error;
19
- Data_Get_Struct(self, xmlError, error);
20
- return INT2NUM(error->int2);
12
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
21
13
  }
22
14
 
23
- /*
24
- * call-seq:
25
- * int1
26
- *
27
- * Extra number information
28
- */
29
- static VALUE int1(VALUE self)
15
+ VALUE Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
30
16
  {
31
- xmlErrorPtr error;
32
- Data_Get_Struct(self, xmlError, error);
33
- return INT2NUM(error->int1);
34
- }
35
-
36
- /*
37
- * call-seq:
38
- * str3
39
- *
40
- * Extra string information
41
- */
42
- static VALUE str3(VALUE self)
43
- {
44
- xmlErrorPtr error;
45
- Data_Get_Struct(self, xmlError, error);
46
- if(error->str3)
47
- return rb_str_new2(error->str3);
48
- return Qnil;
49
- }
50
-
51
- /*
52
- * call-seq:
53
- * str2
54
- *
55
- * Extra string information
56
- */
57
- static VALUE str2(VALUE self)
58
- {
59
- xmlErrorPtr error;
60
- Data_Get_Struct(self, xmlError, error);
61
- if(error->str2)
62
- return rb_str_new2(error->str2);
63
- return Qnil;
64
- }
65
-
66
- /*
67
- * call-seq:
68
- * str1
69
- *
70
- * Extra string information
71
- */
72
- static VALUE str1(VALUE self)
73
- {
74
- xmlErrorPtr error;
75
- Data_Get_Struct(self, xmlError, error);
76
- if(error->str1)
77
- return rb_str_new2(error->str1);
78
- return Qnil;
79
- }
80
-
81
- /*
82
- * call-seq:
83
- * line
84
- *
85
- * Get the line number of the error
86
- */
87
- static VALUE line(VALUE self)
88
- {
89
- xmlErrorPtr error;
90
- Data_Get_Struct(self, xmlError, error);
91
- return INT2NUM(error->line);
92
- }
93
-
94
- /*
95
- * call-seq:
96
- * file
97
- *
98
- * Get the filename for the error
99
- */
100
- static VALUE file(VALUE self)
101
- {
102
- xmlErrorPtr error;
103
- Data_Get_Struct(self, xmlError, error);
104
- if(error->file)
105
- return rb_str_new2(error->file);
106
-
107
- return Qnil;
108
- }
109
-
110
- /*
111
- * call-seq:
112
- * level
113
- *
114
- * Get the error level
115
- */
116
- static VALUE level(VALUE self)
117
- {
118
- xmlErrorPtr error;
119
- Data_Get_Struct(self, xmlError, error);
120
- return INT2NUM((short)error->level);
121
- }
122
-
123
- /*
124
- * call-seq:
125
- * code
126
- *
127
- * Get the error code
128
- */
129
- static VALUE code(VALUE self)
130
- {
131
- xmlErrorPtr error;
132
- Data_Get_Struct(self, xmlError, error);
133
- return INT2NUM(error->code);
134
- }
135
-
136
- /*
137
- * call-seq:
138
- * domain
139
- *
140
- * Get the part of the library that raised this exception
141
- */
142
- static VALUE domain(VALUE self)
143
- {
144
- xmlErrorPtr error;
145
- Data_Get_Struct(self, xmlError, error);
146
- return INT2NUM(error->domain);
147
- }
148
-
149
- /*
150
- * call-seq:
151
- * message
152
- *
153
- * Get the human readable message.
154
- */
155
- static VALUE message(VALUE self)
156
- {
157
- xmlErrorPtr error;
158
- Data_Get_Struct(self, xmlError, error);
159
- return rb_str_new2(error->message);
160
- }
161
-
162
- void Nokogiri_error_handler(void * ctx, xmlErrorPtr error)
163
- {
164
- // FIXME: I'm interneting this. I *think* the pointer passed in here gets
165
- // freed on its own, thats why I copy it.
166
- // The files are *in* the computer.
167
- xmlErrorPtr ptr = calloc(1, sizeof(xmlError));
168
- xmlCopyError(error, ptr);
169
-
170
- VALUE err = Data_Wrap_Struct(cNokogiriXmlSyntaxError, NULL, dealloc, ptr);
171
- VALUE block = rb_funcall(mNokogiri, rb_intern("error_handler"), 0);
172
- rb_funcall(block, rb_intern("call"), 1, err);
17
+ VALUE msg, e, klass;
18
+
19
+ klass = cNokogiriXmlSyntaxError;
20
+
21
+ if (error && error->domain == XML_FROM_XPATH) {
22
+ VALUE xpath = rb_const_get(mNokogiriXml, rb_intern("XPath"));
23
+ klass = rb_const_get(xpath, rb_intern("SyntaxError"));
24
+ }
25
+
26
+ msg = (error && error->message) ? NOKOGIRI_STR_NEW2(error->message) : Qnil;
27
+
28
+ e = rb_class_new_instance(
29
+ 1,
30
+ &msg,
31
+ klass
32
+ );
33
+
34
+ if (error)
35
+ {
36
+ rb_iv_set(e, "@domain", INT2NUM(error->domain));
37
+ rb_iv_set(e, "@code", INT2NUM(error->code));
38
+ rb_iv_set(e, "@level", INT2NUM((short)error->level));
39
+ rb_iv_set(e, "@file", RBSTR_OR_QNIL(error->file));
40
+ rb_iv_set(e, "@line", INT2NUM(error->line));
41
+ rb_iv_set(e, "@str1", RBSTR_OR_QNIL(error->str1));
42
+ rb_iv_set(e, "@str2", RBSTR_OR_QNIL(error->str2));
43
+ rb_iv_set(e, "@str3", RBSTR_OR_QNIL(error->str3));
44
+ rb_iv_set(e, "@int1", INT2NUM(error->int1));
45
+ rb_iv_set(e, "@column", INT2NUM(error->int2));
46
+ }
47
+
48
+ return e;
173
49
  }
174
50
 
175
51
  VALUE cNokogiriXmlSyntaxError;
@@ -177,18 +53,12 @@ void init_xml_syntax_error()
177
53
  {
178
54
  VALUE nokogiri = rb_define_module("Nokogiri");
179
55
  VALUE xml = rb_define_module_under(nokogiri, "XML");
180
- VALUE klass = rb_define_class_under(xml, "SyntaxError", rb_eSyntaxError);
56
+
57
+ /*
58
+ * The XML::SyntaxError is raised on parse errors
59
+ */
60
+ VALUE syntax_error_mommy = rb_define_class_under(nokogiri, "SyntaxError", rb_eStandardError);
61
+ VALUE klass = rb_define_class_under(xml, "SyntaxError", syntax_error_mommy);
181
62
  cNokogiriXmlSyntaxError = klass;
182
63
 
183
- rb_define_method(klass, "message", message, 0);
184
- rb_define_method(klass, "domain", domain, 0);
185
- rb_define_method(klass, "code", code, 0);
186
- rb_define_method(klass, "level", level, 0);
187
- rb_define_method(klass, "file", file, 0);
188
- rb_define_method(klass, "line", line, 0);
189
- rb_define_method(klass, "str1", str1, 0);
190
- rb_define_method(klass, "str2", str2, 0);
191
- rb_define_method(klass, "str3", str3, 0);
192
- rb_define_method(klass, "int1", int1, 0);
193
- rb_define_method(klass, "column", column, 0);
194
64
  }
@@ -1,10 +1,12 @@
1
1
  #ifndef NOKOGIRI_XML_SYNTAX_ERROR
2
2
  #define NOKOGIRI_XML_SYNTAX_ERROR
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_syntax_error();
7
- void Nokogiri_error_handler(void * ctx, xmlErrorPtr error);
7
+ VALUE Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error);
8
+ void Nokogiri_error_array_pusher(void * ctx, xmlErrorPtr error);
9
+ NORETURN(void Nokogiri_error_raise(void * ctx, xmlErrorPtr error));
8
10
 
9
11
  extern VALUE cNokogiriXmlSyntaxError;
10
12
  #endif
@@ -1,19 +1,31 @@
1
1
  #include <xml_text.h>
2
2
 
3
- static void dealloc(xmlNodePtr node)
3
+ /*
4
+ * call-seq:
5
+ * new(content, document)
6
+ *
7
+ * Create a new Text element on the +document+ with +content+
8
+ */
9
+ static VALUE new(int argc, VALUE *argv, VALUE klass)
4
10
  {
5
- if (node->doc == NULL) {
6
- NOKOGIRI_DEBUG_START_TEXT(node);
7
- xmlFreeNode(node);
8
- NOKOGIRI_DEBUG_END(node);
9
- }
10
- }
11
+ xmlDocPtr doc;
12
+ xmlNodePtr node;
13
+ VALUE string;
14
+ VALUE document;
15
+ VALUE rest;
16
+ VALUE rb_node;
11
17
 
12
- static VALUE new(VALUE klass, VALUE string)
13
- {
14
- xmlNodePtr node = xmlNewText((xmlChar *)StringValuePtr(string));
15
- VALUE rb_node = Data_Wrap_Struct(klass, NULL, dealloc, node);
16
- node->_private = (void *)rb_node;
18
+ rb_scan_args(argc, argv, "2*", &string, &document, &rest);
19
+
20
+ Data_Get_Struct(document, xmlDoc, doc);
21
+
22
+ node = xmlNewText((xmlChar *)StringValueCStr(string));
23
+ node->doc = doc->doc;
24
+
25
+ nokogiri_root_node(node);
26
+
27
+ rb_node = Nokogiri_wrap_xml_node(klass, node) ;
28
+ rb_obj_call_init(rb_node, argc, argv);
17
29
 
18
30
  if(rb_block_given_p()) rb_yield(rb_node);
19
31
 
@@ -23,7 +35,18 @@ static VALUE new(VALUE klass, VALUE string)
23
35
  VALUE cNokogiriXmlText ;
24
36
  void init_xml_text()
25
37
  {
26
- VALUE klass = cNokogiriXmlText = rb_const_get(mNokogiriXml, rb_intern("Text"));
38
+ VALUE nokogiri = rb_define_module("Nokogiri");
39
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
40
+ /* */
41
+ VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
42
+ VALUE char_data = rb_define_class_under(xml, "CharacterData", node);
43
+
44
+ /*
45
+ * Wraps Text nodes.
46
+ */
47
+ VALUE klass = rb_define_class_under(xml, "Text", char_data);
48
+
49
+ cNokogiriXmlText = klass;
27
50
 
28
- rb_define_singleton_method(klass, "new", new, 1);
51
+ rb_define_singleton_method(klass, "new", new, -1);
29
52
  }
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_TEXT
2
2
  #define NOKOGIRI_XML_TEXT
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_text();
7
7
 
@@ -1,5 +1,7 @@
1
1
  #include <xml_xpath_context.h>
2
2
 
3
+ int vasprintf (char **strp, const char *fmt, va_list ap);
4
+
3
5
  static void deallocate(xmlXPathContextPtr ctx)
4
6
  {
5
7
  NOKOGIRI_DEBUG_START(ctx);
@@ -19,29 +21,234 @@ static VALUE register_ns(VALUE self, VALUE prefix, VALUE uri)
19
21
  Data_Get_Struct(self, xmlXPathContext, ctx);
20
22
 
21
23
  xmlXPathRegisterNs( ctx,
22
- (const xmlChar *)StringValuePtr(prefix),
23
- (const xmlChar *)StringValuePtr(uri)
24
+ (const xmlChar *)StringValueCStr(prefix),
25
+ (const xmlChar *)StringValueCStr(uri)
24
26
  );
25
27
  return self;
26
28
  }
27
29
 
28
30
  /*
29
31
  * call-seq:
30
- * evaluate(search_path)
32
+ * register_variable(name, value)
33
+ *
34
+ * Register the variable +name+ with +value+.
35
+ */
36
+ static VALUE register_variable(VALUE self, VALUE name, VALUE value)
37
+ {
38
+ xmlXPathContextPtr ctx;
39
+ xmlXPathObjectPtr xmlValue;
40
+ Data_Get_Struct(self, xmlXPathContext, ctx);
41
+
42
+ xmlValue = xmlXPathNewCString(StringValueCStr(value));
43
+
44
+ xmlXPathRegisterVariable( ctx,
45
+ (const xmlChar *)StringValueCStr(name),
46
+ xmlValue
47
+ );
48
+
49
+ return self;
50
+ }
51
+
52
+ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler, const char* function_name)
53
+ {
54
+ int i;
55
+ VALUE result, doc;
56
+ VALUE *argv;
57
+ VALUE node_set = Qnil;
58
+ xmlNodeSetPtr xml_node_set = NULL;
59
+ xmlXPathObjectPtr obj;
60
+
61
+ assert(ctx->context->doc);
62
+ assert(DOC_RUBY_OBJECT_TEST(ctx->context->doc));
63
+
64
+ argv = (VALUE *)calloc((size_t)nargs, sizeof(VALUE));
65
+ for (i = 0 ; i < nargs ; ++i) {
66
+ rb_gc_register_address(&argv[i]);
67
+ }
68
+
69
+ doc = DOC_RUBY_OBJECT(ctx->context->doc);
70
+
71
+ if (nargs > 0) {
72
+ i = nargs - 1;
73
+ do {
74
+ obj = valuePop(ctx);
75
+ switch(obj->type) {
76
+ case XPATH_STRING:
77
+ argv[i] = NOKOGIRI_STR_NEW2(obj->stringval);
78
+ break;
79
+ case XPATH_BOOLEAN:
80
+ argv[i] = obj->boolval == 1 ? Qtrue : Qfalse;
81
+ break;
82
+ case XPATH_NUMBER:
83
+ argv[i] = rb_float_new(obj->floatval);
84
+ break;
85
+ case XPATH_NODESET:
86
+ argv[i] = Nokogiri_wrap_xml_node_set(obj->nodesetval, doc);
87
+ break;
88
+ default:
89
+ argv[i] = NOKOGIRI_STR_NEW2(xmlXPathCastToString(obj));
90
+ }
91
+ xmlXPathFreeNodeSetList(obj);
92
+ } while(i-- > 0);
93
+ }
94
+
95
+ result = rb_funcall2(handler, rb_intern((const char*)function_name), nargs, argv);
96
+
97
+ for (i = 0 ; i < nargs ; ++i) {
98
+ rb_gc_unregister_address(&argv[i]);
99
+ }
100
+ free(argv);
101
+
102
+ switch(TYPE(result)) {
103
+ case T_FLOAT:
104
+ case T_BIGNUM:
105
+ case T_FIXNUM:
106
+ xmlXPathReturnNumber(ctx, NUM2DBL(result));
107
+ break;
108
+ case T_STRING:
109
+ xmlXPathReturnString(
110
+ ctx,
111
+ xmlCharStrdup(StringValueCStr(result))
112
+ );
113
+ break;
114
+ case T_TRUE:
115
+ xmlXPathReturnTrue(ctx);
116
+ break;
117
+ case T_FALSE:
118
+ xmlXPathReturnFalse(ctx);
119
+ break;
120
+ case T_NIL:
121
+ break;
122
+ case T_ARRAY:
123
+ {
124
+ VALUE args[2];
125
+ args[0] = doc;
126
+ args[1] = result;
127
+ node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet);
128
+ Data_Get_Struct(node_set, xmlNodeSet, xml_node_set);
129
+ xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
130
+ }
131
+ break;
132
+ case T_DATA:
133
+ if(rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
134
+ Data_Get_Struct(result, xmlNodeSet, xml_node_set);
135
+ /* Copy the node set, otherwise it will get GC'd. */
136
+ xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
137
+ break;
138
+ }
139
+ default:
140
+ rb_raise(rb_eRuntimeError, "Invalid return type");
141
+ }
142
+ }
143
+
144
+ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
145
+ {
146
+ VALUE handler = Qnil;
147
+ const char *function = NULL ;
148
+
149
+ assert(ctx);
150
+ assert(ctx->context);
151
+ assert(ctx->context->userData);
152
+ assert(ctx->context->function);
153
+
154
+ handler = (VALUE)(ctx->context->userData);
155
+ function = (const char*)(ctx->context->function);
156
+
157
+ Nokogiri_marshal_xpath_funcall_and_return_values(ctx, nargs, handler, function);
158
+ }
159
+
160
+ static xmlXPathFunction lookup( void *ctx,
161
+ const xmlChar * name,
162
+ const xmlChar* ns_uri )
163
+ {
164
+ VALUE xpath_handler = (VALUE)ctx;
165
+ if(rb_respond_to(xpath_handler, rb_intern((const char *)name)))
166
+ return ruby_funcall;
167
+
168
+ return NULL;
169
+ }
170
+
171
+ NORETURN(static void xpath_generic_exception_handler(void * ctx, const char *msg, ...));
172
+ static void xpath_generic_exception_handler(void * ctx, const char *msg, ...)
173
+ {
174
+ char * message;
175
+
176
+ va_list args;
177
+ va_start(args, msg);
178
+ vasprintf(&message, msg, args);
179
+ va_end(args);
180
+
181
+ rb_raise(rb_eRuntimeError, "%s", message);
182
+ }
183
+
184
+ /*
185
+ * call-seq:
186
+ * evaluate(search_path, handler = nil)
31
187
  *
32
188
  * Evaluate the +search_path+ returning an XML::XPath object.
33
189
  */
34
- static VALUE evaluate(VALUE self, VALUE search_path)
190
+ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
35
191
  {
192
+ VALUE search_path, xpath_handler;
193
+ VALUE thing = Qnil;
36
194
  xmlXPathContextPtr ctx;
195
+ xmlXPathObjectPtr xpath;
196
+ xmlChar *query;
197
+
37
198
  Data_Get_Struct(self, xmlXPathContext, ctx);
38
199
 
39
- xmlChar* query = (xmlChar *)StringValuePtr(search_path);
40
- xmlXPathObjectPtr xpath = xmlXPathEvalExpression(query, ctx);
200
+ if(rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1)
201
+ xpath_handler = Qnil;
202
+
203
+ query = (xmlChar *)StringValueCStr(search_path);
204
+
205
+ if(Qnil != xpath_handler) {
206
+ /* FIXME: not sure if this is the correct place to shove private data. */
207
+ ctx->userData = (void *)xpath_handler;
208
+ xmlXPathRegisterFuncLookup(ctx, lookup, (void *)xpath_handler);
209
+ }
210
+
211
+ xmlResetLastError();
212
+ xmlSetStructuredErrorFunc(NULL, Nokogiri_error_raise);
213
+
214
+ /* For some reason, xmlXPathEvalExpression will blow up with a generic error */
215
+ /* when there is a non existent function. */
216
+ xmlSetGenericErrorFunc(NULL, xpath_generic_exception_handler);
217
+
218
+ xpath = xmlXPathEvalExpression(query, ctx);
219
+ xmlSetStructuredErrorFunc(NULL, NULL);
220
+ xmlSetGenericErrorFunc(NULL, NULL);
221
+
41
222
  if(xpath == NULL) {
42
- rb_raise(rb_eRuntimeError, "Couldn't evaluate expression '%s'", query);
223
+ xmlErrorPtr error = xmlGetLastError();
224
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
43
225
  }
44
- return Nokogiri_wrap_xml_xpath(xpath);
226
+
227
+ assert(ctx->doc);
228
+ assert(DOC_RUBY_OBJECT_TEST(ctx->doc));
229
+
230
+ switch(xpath->type) {
231
+ case XPATH_STRING:
232
+ thing = NOKOGIRI_STR_NEW2(xpath->stringval);
233
+ xmlFree(xpath->stringval);
234
+ break;
235
+ case XPATH_NODESET:
236
+ thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval,
237
+ DOC_RUBY_OBJECT(ctx->doc));
238
+ break;
239
+ case XPATH_NUMBER:
240
+ thing = rb_float_new(xpath->floatval);
241
+ break;
242
+ case XPATH_BOOLEAN:
243
+ thing = xpath->boolval == 1 ? Qtrue : Qfalse;
244
+ break;
245
+ default:
246
+ thing = Nokogiri_wrap_xml_node_set(NULL, DOC_RUBY_OBJECT(ctx->doc));
247
+ }
248
+
249
+ xmlXPathFreeNodeSetList(xpath);
250
+
251
+ return thing;
45
252
  }
46
253
 
47
254
  /*
@@ -52,20 +259,29 @@ static VALUE evaluate(VALUE self, VALUE search_path)
52
259
  */
53
260
  static VALUE new(VALUE klass, VALUE nodeobj)
54
261
  {
262
+ xmlNodePtr node;
263
+ xmlXPathContextPtr ctx;
264
+ VALUE self;
265
+
55
266
  xmlXPathInit();
56
267
 
57
- xmlNodePtr node ;
58
268
  Data_Get_Struct(nodeobj, xmlNode, node);
59
269
 
60
- xmlXPathContextPtr ctx = xmlXPathNewContext(node->doc);
61
- ctx->node = node ;
62
- return Data_Wrap_Struct(klass, 0, deallocate, ctx);
270
+ ctx = xmlXPathNewContext(node->doc);
271
+ ctx->node = node;
272
+ self = Data_Wrap_Struct(klass, 0, deallocate, ctx);
273
+ /*rb_iv_set(self, "@xpath_handler", Qnil); */
274
+ return self;
63
275
  }
64
276
 
65
277
  VALUE cNokogiriXmlXpathContext;
66
278
  void init_xml_xpath_context(void)
67
279
  {
68
280
  VALUE module = rb_define_module("Nokogiri");
281
+
282
+ /*
283
+ * Nokogiri::XML
284
+ */
69
285
  VALUE xml = rb_define_module_under(module, "XML");
70
286
 
71
287
  /*
@@ -76,6 +292,7 @@ void init_xml_xpath_context(void)
76
292
  cNokogiriXmlXpathContext = klass;
77
293
 
78
294
  rb_define_singleton_method(klass, "new", new, 1);
79
- rb_define_method(klass, "evaluate", evaluate, 1);
295
+ rb_define_method(klass, "evaluate", evaluate, -1);
296
+ rb_define_method(klass, "register_variable", register_variable, 2);
80
297
  rb_define_method(klass, "register_ns", register_ns, 2);
81
298
  }
@@ -1,9 +1,10 @@
1
1
  #ifndef NOKOGIRI_XML_XPATH_CONTEXT
2
2
  #define NOKOGIRI_XML_XPATH_CONTEXT
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_xpath_context();
7
+ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler, const char* function_name) ;
7
8
 
8
9
  extern VALUE cNokogiriXmlXpathContext;
9
10
  #endif