nokogiri 1.6.0 → 1.13.2

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 (340) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -19
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +280 -0
  6. data/bin/nokogiri +84 -31
  7. data/dependencies.yml +23 -4
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +952 -132
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +120 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +231 -96
  18. data/ext/nokogiri/nokogiri.h +188 -129
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +49 -40
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +24 -23
  23. data/ext/nokogiri/xml_comment.c +29 -21
  24. data/ext/nokogiri/xml_document.c +327 -223
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +45 -20
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +74 -32
  33. data/ext/nokogiri/xml_node.c +1290 -680
  34. data/ext/nokogiri/xml_node_set.c +239 -208
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +227 -189
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +123 -125
  39. data/ext/nokogiri/xml_sax_parser_context.c +138 -79
  40. data/ext/nokogiri/xml_sax_push_parser.c +88 -35
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +50 -23
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +227 -140
  45. data/ext/nokogiri/xslt_stylesheet.c +269 -177
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +68 -0
  88. data/gumbo-parser/src/util.h +30 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -58
  93. data/lib/nokogiri/css/parser.rb +407 -357
  94. data/lib/nokogiri/css/parser.y +265 -246
  95. data/lib/nokogiri/css/parser_extras.rb +52 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +8 -7
  99. data/lib/nokogiri/css/xpath_visitor.rb +266 -80
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +17 -8
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/html4/document.rb +331 -0
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -15
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +88 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +96 -0
  118. data/lib/nokogiri/html5.rb +477 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +221 -0
  123. data/lib/nokogiri/version.rb +3 -105
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +96 -54
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +234 -95
  130. data/lib/nokogiri/xml/document_fragment.rb +86 -36
  131. data/lib/nokogiri/xml/dtd.rb +16 -4
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +8 -4
  138. data/lib/nokogiri/xml/node.rb +947 -502
  139. data/lib/nokogiri/xml/node_set.rb +168 -159
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +40 -5
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +43 -41
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +270 -0
  155. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -36
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +69 -69
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.13.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +278 -362
  177. data/.autotest +0 -26
  178. data/.gemtest +0 -0
  179. data/.travis.yml +0 -27
  180. data/CHANGELOG.ja.rdoc +0 -819
  181. data/CHANGELOG.rdoc +0 -819
  182. data/C_CODING_STYLE.rdoc +0 -33
  183. data/Manifest.txt +0 -315
  184. data/README.ja.rdoc +0 -106
  185. data/README.rdoc +0 -175
  186. data/ROADMAP.md +0 -90
  187. data/Rakefile +0 -246
  188. data/STANDARD_RESPONSES.md +0 -47
  189. data/Y_U_NO_GEMSPEC.md +0 -155
  190. data/build_all +0 -105
  191. data/ext/nokogiri/html_document.c +0 -170
  192. data/ext/nokogiri/html_document.h +0 -10
  193. data/ext/nokogiri/html_element_description.c +0 -279
  194. data/ext/nokogiri/html_element_description.h +0 -10
  195. data/ext/nokogiri/html_entity_lookup.c +0 -32
  196. data/ext/nokogiri/html_entity_lookup.h +0 -8
  197. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  198. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  199. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  200. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  201. data/ext/nokogiri/xml_attr.h +0 -9
  202. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  203. data/ext/nokogiri/xml_cdata.h +0 -9
  204. data/ext/nokogiri/xml_comment.h +0 -9
  205. data/ext/nokogiri/xml_document.h +0 -23
  206. data/ext/nokogiri/xml_document_fragment.h +0 -10
  207. data/ext/nokogiri/xml_dtd.h +0 -10
  208. data/ext/nokogiri/xml_element_content.h +0 -10
  209. data/ext/nokogiri/xml_element_decl.h +0 -9
  210. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  211. data/ext/nokogiri/xml_entity_decl.h +0 -10
  212. data/ext/nokogiri/xml_entity_reference.h +0 -9
  213. data/ext/nokogiri/xml_io.c +0 -56
  214. data/ext/nokogiri/xml_io.h +0 -11
  215. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  216. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  217. data/ext/nokogiri/xml_namespace.h +0 -13
  218. data/ext/nokogiri/xml_node.h +0 -13
  219. data/ext/nokogiri/xml_node_set.h +0 -14
  220. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  221. data/ext/nokogiri/xml_reader.h +0 -10
  222. data/ext/nokogiri/xml_relax_ng.h +0 -9
  223. data/ext/nokogiri/xml_sax_parser.h +0 -39
  224. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  225. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  226. data/ext/nokogiri/xml_schema.h +0 -9
  227. data/ext/nokogiri/xml_syntax_error.h +0 -13
  228. data/ext/nokogiri/xml_text.h +0 -9
  229. data/ext/nokogiri/xml_xpath_context.h +0 -10
  230. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  231. data/lib/nokogiri/html/document.rb +0 -254
  232. data/lib/nokogiri/html/document_fragment.rb +0 -41
  233. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  234. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  235. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  236. data/ports/archives/libxml2-2.8.0.tar.gz +0 -0
  237. data/ports/archives/libxslt-1.1.26.tar.gz +0 -0
  238. data/tasks/cross_compile.rb +0 -132
  239. data/tasks/nokogiri.org.rb +0 -24
  240. data/tasks/test.rb +0 -95
  241. data/test/css/test_nthiness.rb +0 -159
  242. data/test/css/test_parser.rb +0 -341
  243. data/test/css/test_tokenizer.rb +0 -198
  244. data/test/css/test_xpath_visitor.rb +0 -91
  245. data/test/decorators/test_slop.rb +0 -16
  246. data/test/files/2ch.html +0 -108
  247. data/test/files/address_book.rlx +0 -12
  248. data/test/files/address_book.xml +0 -10
  249. data/test/files/bar/bar.xsd +0 -4
  250. data/test/files/bogus.xml +0 -0
  251. data/test/files/dont_hurt_em_why.xml +0 -422
  252. data/test/files/encoding.html +0 -82
  253. data/test/files/encoding.xhtml +0 -84
  254. data/test/files/exslt.xml +0 -8
  255. data/test/files/exslt.xslt +0 -35
  256. data/test/files/foo/foo.xsd +0 -4
  257. data/test/files/metacharset.html +0 -10
  258. data/test/files/noencoding.html +0 -47
  259. data/test/files/po.xml +0 -32
  260. data/test/files/po.xsd +0 -66
  261. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  262. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  263. data/test/files/saml/xenc_schema.xsd +0 -146
  264. data/test/files/saml/xmldsig_schema.xsd +0 -318
  265. data/test/files/shift_jis.html +0 -10
  266. data/test/files/shift_jis.xml +0 -5
  267. data/test/files/snuggles.xml +0 -3
  268. data/test/files/staff.dtd +0 -10
  269. data/test/files/staff.xml +0 -59
  270. data/test/files/staff.xslt +0 -32
  271. data/test/files/test_document_url/bar.xml +0 -2
  272. data/test/files/test_document_url/document.dtd +0 -4
  273. data/test/files/test_document_url/document.xml +0 -6
  274. data/test/files/tlm.html +0 -850
  275. data/test/files/to_be_xincluded.xml +0 -2
  276. data/test/files/valid_bar.xml +0 -2
  277. data/test/files/xinclude.xml +0 -4
  278. data/test/helper.rb +0 -154
  279. data/test/html/sax/test_parser.rb +0 -141
  280. data/test/html/sax/test_parser_context.rb +0 -46
  281. data/test/html/test_builder.rb +0 -164
  282. data/test/html/test_document.rb +0 -552
  283. data/test/html/test_document_encoding.rb +0 -138
  284. data/test/html/test_document_fragment.rb +0 -261
  285. data/test/html/test_element_description.rb +0 -105
  286. data/test/html/test_named_characters.rb +0 -14
  287. data/test/html/test_node.rb +0 -196
  288. data/test/html/test_node_encoding.rb +0 -27
  289. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  290. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  291. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  292. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  293. data/test/test_convert_xpath.rb +0 -135
  294. data/test/test_css_cache.rb +0 -45
  295. data/test/test_encoding_handler.rb +0 -46
  296. data/test/test_memory_leak.rb +0 -156
  297. data/test/test_nokogiri.rb +0 -132
  298. data/test/test_reader.rb +0 -555
  299. data/test/test_soap4r_sax.rb +0 -52
  300. data/test/test_xslt_transforms.rb +0 -254
  301. data/test/xml/node/test_save_options.rb +0 -28
  302. data/test/xml/node/test_subclass.rb +0 -44
  303. data/test/xml/sax/test_parser.rb +0 -366
  304. data/test/xml/sax/test_parser_context.rb +0 -106
  305. data/test/xml/sax/test_push_parser.rb +0 -157
  306. data/test/xml/test_attr.rb +0 -64
  307. data/test/xml/test_attribute_decl.rb +0 -86
  308. data/test/xml/test_builder.rb +0 -306
  309. data/test/xml/test_c14n.rb +0 -151
  310. data/test/xml/test_cdata.rb +0 -48
  311. data/test/xml/test_comment.rb +0 -29
  312. data/test/xml/test_document.rb +0 -828
  313. data/test/xml/test_document_encoding.rb +0 -28
  314. data/test/xml/test_document_fragment.rb +0 -223
  315. data/test/xml/test_dtd.rb +0 -103
  316. data/test/xml/test_dtd_encoding.rb +0 -33
  317. data/test/xml/test_element_content.rb +0 -56
  318. data/test/xml/test_element_decl.rb +0 -73
  319. data/test/xml/test_entity_decl.rb +0 -122
  320. data/test/xml/test_entity_reference.rb +0 -245
  321. data/test/xml/test_namespace.rb +0 -95
  322. data/test/xml/test_node.rb +0 -1137
  323. data/test/xml/test_node_attributes.rb +0 -96
  324. data/test/xml/test_node_encoding.rb +0 -107
  325. data/test/xml/test_node_inheritance.rb +0 -32
  326. data/test/xml/test_node_reparenting.rb +0 -374
  327. data/test/xml/test_node_set.rb +0 -755
  328. data/test/xml/test_parse_options.rb +0 -64
  329. data/test/xml/test_processing_instruction.rb +0 -30
  330. data/test/xml/test_reader_encoding.rb +0 -142
  331. data/test/xml/test_relax_ng.rb +0 -60
  332. data/test/xml/test_schema.rb +0 -103
  333. data/test/xml/test_syntax_error.rb +0 -12
  334. data/test/xml/test_text.rb +0 -45
  335. data/test/xml/test_unparented_node.rb +0 -422
  336. data/test/xml/test_xinclude.rb +0 -83
  337. data/test/xml/test_xpath.rb +0 -295
  338. data/test/xslt/test_custom_functions.rb +0 -133
  339. data/test/xslt/test_exception_handling.rb +0 -37
  340. data/test_all +0 -81
@@ -1,6 +1,9 @@
1
- #include <xml_relax_ng.h>
1
+ #include <nokogiri.h>
2
2
 
3
- static void dealloc(xmlRelaxNGPtr schema)
3
+ VALUE cNokogiriXmlRelaxNG;
4
+
5
+ static void
6
+ dealloc(xmlRelaxNGPtr schema)
4
7
  {
5
8
  NOKOGIRI_DEBUG_START(schema);
6
9
  xmlRelaxNGFree(schema);
@@ -13,7 +16,8 @@ static void dealloc(xmlRelaxNGPtr schema)
13
16
  *
14
17
  * Validate a Nokogiri::XML::Document against this RelaxNG schema.
15
18
  */
16
- static VALUE validate_document(VALUE self, VALUE document)
19
+ static VALUE
20
+ validate_document(VALUE self, VALUE document)
17
21
  {
18
22
  xmlDocPtr doc;
19
23
  xmlRelaxNGPtr schema;
@@ -27,7 +31,7 @@ static VALUE validate_document(VALUE self, VALUE document)
27
31
 
28
32
  valid_ctxt = xmlRelaxNGNewValidCtxt(schema);
29
33
 
30
- if(NULL == valid_ctxt) {
34
+ if (NULL == valid_ctxt) {
31
35
  /* we have a problem */
32
36
  rb_raise(rb_eRuntimeError, "Could not create a validation context");
33
37
  }
@@ -53,16 +57,25 @@ static VALUE validate_document(VALUE self, VALUE document)
53
57
  *
54
58
  * Create a new RelaxNG from the contents of +string+
55
59
  */
56
- static VALUE read_memory(VALUE klass, VALUE content)
60
+ static VALUE
61
+ read_memory(int argc, VALUE *argv, VALUE klass)
57
62
  {
58
- xmlRelaxNGParserCtxtPtr ctx = xmlRelaxNGNewMemParserCtxt(
59
- (const char *)StringValuePtr(content),
60
- (int)RSTRING_LEN(content)
61
- );
63
+ VALUE content;
64
+ VALUE parse_options;
65
+ xmlRelaxNGParserCtxtPtr ctx;
62
66
  xmlRelaxNGPtr schema;
63
- VALUE errors = rb_ary_new();
67
+ VALUE errors;
64
68
  VALUE rb_schema;
69
+ int scanned_args = 0;
70
+
71
+ scanned_args = rb_scan_args(argc, argv, "11", &content, &parse_options);
72
+ if (scanned_args == 1) {
73
+ parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
74
+ }
65
75
 
76
+ ctx = xmlRelaxNGNewMemParserCtxt((const char *)StringValuePtr(content), (int)RSTRING_LEN(content));
77
+
78
+ errors = rb_ary_new();
66
79
  xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
67
80
 
68
81
  #ifdef HAVE_XMLRELAXNGSETPARSERSTRUCTUREDERRORS
@@ -78,18 +91,20 @@ static VALUE read_memory(VALUE klass, VALUE content)
78
91
  xmlSetStructuredErrorFunc(NULL, NULL);
79
92
  xmlRelaxNGFreeParserCtxt(ctx);
80
93
 
81
- if(NULL == schema) {
94
+ if (NULL == schema) {
82
95
  xmlErrorPtr error = xmlGetLastError();
83
- if(error)
96
+ if (error) {
84
97
  Nokogiri_error_raise(NULL, error);
85
- else
98
+ } else {
86
99
  rb_raise(rb_eRuntimeError, "Could not parse document");
100
+ }
87
101
 
88
102
  return Qnil;
89
103
  }
90
104
 
91
105
  rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
92
106
  rb_iv_set(rb_schema, "@errors", errors);
107
+ rb_iv_set(rb_schema, "@parse_options", parse_options);
93
108
 
94
109
  return rb_schema;
95
110
  }
@@ -100,18 +115,26 @@ static VALUE read_memory(VALUE klass, VALUE content)
100
115
  *
101
116
  * Create a new RelaxNG schema from the Nokogiri::XML::Document +doc+
102
117
  */
103
- static VALUE from_document(VALUE klass, VALUE document)
118
+ static VALUE
119
+ from_document(int argc, VALUE *argv, VALUE klass)
104
120
  {
121
+ VALUE document;
122
+ VALUE parse_options;
105
123
  xmlDocPtr doc;
106
124
  xmlRelaxNGParserCtxtPtr ctx;
107
125
  xmlRelaxNGPtr schema;
108
126
  VALUE errors;
109
127
  VALUE rb_schema;
128
+ int scanned_args = 0;
129
+
130
+ scanned_args = rb_scan_args(argc, argv, "11", &document, &parse_options);
110
131
 
111
132
  Data_Get_Struct(document, xmlDoc, doc);
133
+ doc = doc->doc; /* In case someone passes us a node. ugh. */
112
134
 
113
- /* In case someone passes us a node. ugh. */
114
- doc = doc->doc;
135
+ if (scanned_args == 1) {
136
+ parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
137
+ }
115
138
 
116
139
  ctx = xmlRelaxNGNewDocParserCtxt(doc);
117
140
 
@@ -129,33 +152,34 @@ static VALUE from_document(VALUE klass, VALUE document)
129
152
  schema = xmlRelaxNGParse(ctx);
130
153
 
131
154
  xmlSetStructuredErrorFunc(NULL, NULL);
155
+ xmlRelaxNGFreeParserCtxt(ctx);
132
156
 
133
- if(NULL == schema) {
157
+ if (NULL == schema) {
134
158
  xmlErrorPtr error = xmlGetLastError();
135
- if(error)
159
+ if (error) {
136
160
  Nokogiri_error_raise(NULL, error);
137
- else
161
+ } else {
138
162
  rb_raise(rb_eRuntimeError, "Could not parse document");
163
+ }
139
164
 
140
165
  return Qnil;
141
166
  }
142
167
 
143
168
  rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
144
169
  rb_iv_set(rb_schema, "@errors", errors);
170
+ rb_iv_set(rb_schema, "@parse_options", parse_options);
145
171
 
146
172
  return rb_schema;
147
173
  }
148
174
 
149
- VALUE cNokogiriXmlRelaxNG;
150
- void init_xml_relax_ng()
175
+ void
176
+ noko_init_xml_relax_ng()
151
177
  {
152
- VALUE nokogiri = rb_define_module("Nokogiri");
153
- VALUE xml = rb_define_module_under(nokogiri, "XML");
154
- VALUE klass = rb_define_class_under(xml, "RelaxNG", cNokogiriXmlSchema);
178
+ assert(cNokogiriXmlSchema);
179
+ cNokogiriXmlRelaxNG = rb_define_class_under(mNokogiriXml, "RelaxNG", cNokogiriXmlSchema);
155
180
 
156
- cNokogiriXmlRelaxNG = klass;
181
+ rb_define_singleton_method(cNokogiriXmlRelaxNG, "read_memory", read_memory, -1);
182
+ rb_define_singleton_method(cNokogiriXmlRelaxNG, "from_document", from_document, -1);
157
183
 
158
- rb_define_singleton_method(klass, "read_memory", read_memory, 1);
159
- rb_define_singleton_method(klass, "from_document", from_document, 1);
160
- rb_define_private_method(klass, "validate_document", validate_document, 1);
184
+ rb_define_private_method(cNokogiriXmlRelaxNG, "validate_document", validate_document, 1);
161
185
  }
@@ -1,38 +1,35 @@
1
- #include <xml_sax_parser.h>
1
+ #include <nokogiri.h>
2
2
 
3
- int vasprintf (char **strp, const char *fmt, va_list ap);
4
- void vasprintf_free (void *p);
3
+ VALUE cNokogiriXmlSaxParser ;
5
4
 
6
5
  static ID id_start_document, id_end_document, id_start_element, id_end_element;
7
6
  static ID id_start_element_namespace, id_end_element_namespace;
8
7
  static ID id_comment, id_characters, id_xmldecl, id_error, id_warning;
9
- static ID id_cdata_block, id_cAttribute;
8
+ static ID id_cdata_block;
10
9
  static ID id_processing_instruction;
11
10
 
12
- #define STRING_OR_NULL(str) \
13
- (RTEST(str) ? StringValuePtr(str) : NULL)
14
-
15
- static void start_document(void * ctx)
11
+ static void
12
+ start_document(void *ctx)
16
13
  {
17
14
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
18
15
  VALUE doc = rb_iv_get(self, "@document");
19
16
 
20
17
  xmlParserCtxtPtr ctxt = NOKOGIRI_SAX_CTXT(ctx);
21
18
 
22
- if(NULL != ctxt && ctxt->html != 1) {
23
- if(ctxt->standalone != -1) { /* -1 means there was no declaration */
24
- VALUE encoding = ctxt->encoding ?
25
- NOKOGIRI_STR_NEW2(ctxt->encoding) :
26
- Qnil;
27
-
28
- VALUE version = ctxt->version ?
29
- NOKOGIRI_STR_NEW2(ctxt->version) :
30
- Qnil;
31
-
19
+ if (NULL != ctxt && ctxt->html != 1) {
20
+ if (ctxt->standalone != -1) { /* -1 means there was no declaration */
21
+ VALUE encoding = Qnil ;
32
22
  VALUE standalone = Qnil;
23
+ VALUE version;
24
+ if (ctxt->encoding) {
25
+ encoding = NOKOGIRI_STR_NEW2(ctxt->encoding) ;
26
+ } else if (ctxt->input && ctxt->input->encoding) {
27
+ encoding = NOKOGIRI_STR_NEW2(ctxt->input->encoding) ;
28
+ }
33
29
 
34
- switch(ctxt->standalone)
35
- {
30
+ version = ctxt->version ? NOKOGIRI_STR_NEW2(ctxt->version) : Qnil;
31
+
32
+ switch (ctxt->standalone) {
36
33
  case 0:
37
34
  standalone = NOKOGIRI_STR_NEW2("no");
38
35
  break;
@@ -48,138 +45,140 @@ static void start_document(void * ctx)
48
45
  rb_funcall(doc, id_start_document, 0);
49
46
  }
50
47
 
51
- static void end_document(void * ctx)
48
+ static void
49
+ end_document(void *ctx)
52
50
  {
53
51
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
54
52
  VALUE doc = rb_iv_get(self, "@document");
55
53
  rb_funcall(doc, id_end_document, 0);
56
54
  }
57
55
 
58
- static void start_element(void * ctx, const xmlChar *name, const xmlChar **atts)
56
+ static void
57
+ start_element(void *ctx, const xmlChar *name, const xmlChar **atts)
59
58
  {
60
59
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
61
60
  VALUE doc = rb_iv_get(self, "@document");
62
61
  VALUE attributes = rb_ary_new();
63
- const xmlChar * attr;
62
+ const xmlChar *attr;
64
63
  int i = 0;
65
- if(atts) {
66
- while((attr = atts[i]) != NULL) {
67
- const xmlChar * val = atts[i+1];
64
+ if (atts) {
65
+ while ((attr = atts[i]) != NULL) {
66
+ const xmlChar *val = atts[i + 1];
68
67
  VALUE value = val != NULL ? NOKOGIRI_STR_NEW2(val) : Qnil;
69
68
  rb_ary_push(attributes, rb_ary_new3(2, NOKOGIRI_STR_NEW2(attr), value));
70
- i+=2;
69
+ i += 2;
71
70
  }
72
71
  }
73
72
 
74
- rb_funcall( doc,
75
- id_start_element,
76
- 2,
77
- NOKOGIRI_STR_NEW2(name),
78
- attributes
79
- );
73
+ rb_funcall(doc,
74
+ id_start_element,
75
+ 2,
76
+ NOKOGIRI_STR_NEW2(name),
77
+ attributes
78
+ );
80
79
  }
81
80
 
82
- static void end_element(void * ctx, const xmlChar *name)
81
+ static void
82
+ end_element(void *ctx, const xmlChar *name)
83
83
  {
84
84
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
85
85
  VALUE doc = rb_iv_get(self, "@document");
86
86
  rb_funcall(doc, id_end_element, 1, NOKOGIRI_STR_NEW2(name));
87
87
  }
88
88
 
89
- static VALUE attributes_as_list(
90
- VALUE self,
91
- int nb_attributes,
92
- const xmlChar ** attributes)
89
+ static VALUE
90
+ attributes_as_array(int attributes_len, const xmlChar **c_attributes)
93
91
  {
94
- VALUE list = rb_ary_new2((long)nb_attributes);
92
+ VALUE rb_array = rb_ary_new2((long)attributes_len);
93
+ VALUE cNokogiriXmlSaxParserAttribute;
95
94
 
96
- VALUE attr_klass = rb_const_get(cNokogiriXmlSaxParser, id_cAttribute);
97
- if (attributes) {
95
+ cNokogiriXmlSaxParserAttribute = rb_const_get_at(cNokogiriXmlSaxParser, rb_intern("Attribute"));
96
+ if (c_attributes) {
98
97
  /* Each attribute is an array of [localname, prefix, URI, value, end] */
99
98
  int i;
100
- for (i = 0; i < nb_attributes * 5; i += 5) {
101
- VALUE argv[4], attribute;
99
+ for (i = 0; i < attributes_len * 5; i += 5) {
100
+ VALUE rb_constructor_args[4], rb_attribute;
102
101
 
103
- argv[0] = RBSTR_OR_QNIL(attributes[i + 0]); /* localname */
104
- argv[1] = RBSTR_OR_QNIL(attributes[i + 1]); /* prefix */
105
- argv[2] = RBSTR_OR_QNIL(attributes[i + 2]); /* URI */
102
+ rb_constructor_args[0] = RBSTR_OR_QNIL(c_attributes[i + 0]); /* localname */
103
+ rb_constructor_args[1] = RBSTR_OR_QNIL(c_attributes[i + 1]); /* prefix */
104
+ rb_constructor_args[2] = RBSTR_OR_QNIL(c_attributes[i + 2]); /* URI */
106
105
 
107
106
  /* value */
108
- argv[3] = NOKOGIRI_STR_NEW((const char*)attributes[i+3],
109
- (attributes[i+4] - attributes[i+3]));
107
+ rb_constructor_args[3] = NOKOGIRI_STR_NEW((const char *)c_attributes[i + 3],
108
+ (c_attributes[i + 4] - c_attributes[i + 3]));
110
109
 
111
- attribute = rb_class_new_instance(4, argv, attr_klass);
112
- rb_ary_push(list, attribute);
110
+ rb_attribute = rb_class_new_instance(4, rb_constructor_args, cNokogiriXmlSaxParserAttribute);
111
+ rb_ary_push(rb_array, rb_attribute);
113
112
  }
114
113
  }
115
114
 
116
- return list;
115
+ return rb_array;
117
116
  }
118
117
 
119
118
  static void
120
- start_element_ns (
121
- void * ctx,
122
- const xmlChar * localname,
123
- const xmlChar * prefix,
124
- const xmlChar * uri,
119
+ start_element_ns(
120
+ void *ctx,
121
+ const xmlChar *localname,
122
+ const xmlChar *prefix,
123
+ const xmlChar *uri,
125
124
  int nb_namespaces,
126
- const xmlChar ** namespaces,
125
+ const xmlChar **namespaces,
127
126
  int nb_attributes,
128
127
  int nb_defaulted,
129
- const xmlChar ** attributes)
128
+ const xmlChar **attributes)
130
129
  {
131
130
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
132
131
  VALUE doc = rb_iv_get(self, "@document");
133
132
 
134
- VALUE attribute_list = attributes_as_list(self, nb_attributes, attributes);
133
+ VALUE attribute_ary = attributes_as_array(nb_attributes, attributes);
135
134
 
136
135
  VALUE ns_list = rb_ary_new2((long)nb_namespaces);
137
136
 
138
137
  if (namespaces) {
139
138
  int i;
140
- for (i = 0; i < nb_namespaces * 2; i += 2)
141
- {
139
+ for (i = 0; i < nb_namespaces * 2; i += 2) {
142
140
  rb_ary_push(ns_list,
143
- rb_ary_new3((long)2,
144
- RBSTR_OR_QNIL(namespaces[i + 0]),
145
- RBSTR_OR_QNIL(namespaces[i + 1])
146
- )
147
- );
141
+ rb_ary_new3((long)2,
142
+ RBSTR_OR_QNIL(namespaces[i + 0]),
143
+ RBSTR_OR_QNIL(namespaces[i + 1])
144
+ )
145
+ );
148
146
  }
149
147
  }
150
148
 
151
- rb_funcall( doc,
152
- id_start_element_namespace,
153
- 5,
154
- NOKOGIRI_STR_NEW2(localname),
155
- attribute_list,
156
- RBSTR_OR_QNIL(prefix),
157
- RBSTR_OR_QNIL(uri),
158
- ns_list
159
- );
149
+ rb_funcall(doc,
150
+ id_start_element_namespace,
151
+ 5,
152
+ NOKOGIRI_STR_NEW2(localname),
153
+ attribute_ary,
154
+ RBSTR_OR_QNIL(prefix),
155
+ RBSTR_OR_QNIL(uri),
156
+ ns_list
157
+ );
160
158
  }
161
159
 
162
160
  /**
163
- * end_element_ns was borrowed heavily from libxml-ruby.
161
+ * end_element_ns was borrowed heavily from libxml-ruby.
164
162
  */
165
163
  static void
166
- end_element_ns (
167
- void * ctx,
168
- const xmlChar * localname,
169
- const xmlChar * prefix,
170
- const xmlChar * uri)
164
+ end_element_ns(
165
+ void *ctx,
166
+ const xmlChar *localname,
167
+ const xmlChar *prefix,
168
+ const xmlChar *uri)
171
169
  {
172
170
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
173
171
  VALUE doc = rb_iv_get(self, "@document");
174
172
 
175
- rb_funcall(doc, id_end_element_namespace, 3,
176
- NOKOGIRI_STR_NEW2(localname),
177
- RBSTR_OR_QNIL(prefix),
178
- RBSTR_OR_QNIL(uri)
179
- );
173
+ rb_funcall(doc, id_end_element_namespace, 3,
174
+ NOKOGIRI_STR_NEW2(localname),
175
+ RBSTR_OR_QNIL(prefix),
176
+ RBSTR_OR_QNIL(uri)
177
+ );
180
178
  }
181
179
 
182
- static void characters_func(void * ctx, const xmlChar * ch, int len)
180
+ static void
181
+ characters_func(void *ctx, const xmlChar *ch, int len)
183
182
  {
184
183
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
185
184
  VALUE doc = rb_iv_get(self, "@document");
@@ -187,7 +186,8 @@ static void characters_func(void * ctx, const xmlChar * ch, int len)
187
186
  rb_funcall(doc, id_characters, 1, str);
188
187
  }
189
188
 
190
- static void comment_func(void * ctx, const xmlChar * value)
189
+ static void
190
+ comment_func(void *ctx, const xmlChar *value)
191
191
  {
192
192
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
193
193
  VALUE doc = rb_iv_get(self, "@document");
@@ -195,11 +195,12 @@ static void comment_func(void * ctx, const xmlChar * value)
195
195
  rb_funcall(doc, id_comment, 1, str);
196
196
  }
197
197
 
198
- static void warning_func(void * ctx, const char *msg, ...)
198
+ static void
199
+ warning_func(void *ctx, const char *msg, ...)
199
200
  {
200
201
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
201
202
  VALUE doc = rb_iv_get(self, "@document");
202
- char * message;
203
+ char *message;
203
204
  VALUE ruby_message;
204
205
 
205
206
  va_list args;
@@ -208,15 +209,16 @@ static void warning_func(void * ctx, const char *msg, ...)
208
209
  va_end(args);
209
210
 
210
211
  ruby_message = NOKOGIRI_STR_NEW2(message);
211
- vasprintf_free(message);
212
+ free(message);
212
213
  rb_funcall(doc, id_warning, 1, ruby_message);
213
214
  }
214
215
 
215
- static void error_func(void * ctx, const char *msg, ...)
216
+ static void
217
+ error_func(void *ctx, const char *msg, ...)
216
218
  {
217
219
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
218
220
  VALUE doc = rb_iv_get(self, "@document");
219
- char * message;
221
+ char *message;
220
222
  VALUE ruby_message;
221
223
 
222
224
  va_list args;
@@ -225,11 +227,12 @@ static void error_func(void * ctx, const char *msg, ...)
225
227
  va_end(args);
226
228
 
227
229
  ruby_message = NOKOGIRI_STR_NEW2(message);
228
- vasprintf_free(message);
230
+ free(message);
229
231
  rb_funcall(doc, id_error, 1, ruby_message);
230
232
  }
231
233
 
232
- static void cdata_block(void * ctx, const xmlChar * value, int len)
234
+ static void
235
+ cdata_block(void *ctx, const xmlChar *value, int len)
233
236
  {
234
237
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
235
238
  VALUE doc = rb_iv_get(self, "@document");
@@ -237,7 +240,8 @@ static void cdata_block(void * ctx, const xmlChar * value, int len)
237
240
  rb_funcall(doc, id_cdata_block, 1, string);
238
241
  }
239
242
 
240
- static void processing_instruction(void * ctx, const xmlChar * name, const xmlChar * content)
243
+ static void
244
+ processing_instruction(void *ctx, const xmlChar *name, const xmlChar *content)
241
245
  {
242
246
  VALUE rb_content;
243
247
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
@@ -245,27 +249,27 @@ static void processing_instruction(void * ctx, const xmlChar * name, const xmlCh
245
249
 
246
250
  rb_content = content ? NOKOGIRI_STR_NEW2(content) : Qnil;
247
251
 
248
- rb_funcall( doc,
249
- id_processing_instruction,
250
- 2,
251
- NOKOGIRI_STR_NEW2(name),
252
- rb_content
253
- );
252
+ rb_funcall(doc,
253
+ id_processing_instruction,
254
+ 2,
255
+ NOKOGIRI_STR_NEW2(name),
256
+ rb_content
257
+ );
254
258
  }
255
259
 
256
- static void deallocate(xmlSAXHandlerPtr handler)
260
+ static void
261
+ deallocate(xmlSAXHandlerPtr handler)
257
262
  {
258
263
  NOKOGIRI_DEBUG_START(handler);
259
264
  free(handler);
260
265
  NOKOGIRI_DEBUG_END(handler);
261
266
  }
262
267
 
263
- static VALUE allocate(VALUE klass)
268
+ static VALUE
269
+ allocate(VALUE klass)
264
270
  {
265
271
  xmlSAXHandlerPtr handler = calloc((size_t)1, sizeof(xmlSAXHandler));
266
272
 
267
- xmlSetStructuredErrorFunc(NULL, NULL);
268
-
269
273
  handler->startDocument = start_document;
270
274
  handler->endDocument = end_document;
271
275
  handler->startElement = start_element;
@@ -283,29 +287,23 @@ static VALUE allocate(VALUE klass)
283
287
  return Data_Wrap_Struct(klass, NULL, deallocate, handler);
284
288
  }
285
289
 
286
- VALUE cNokogiriXmlSaxParser ;
287
- void init_xml_sax_parser()
290
+ void
291
+ noko_init_xml_sax_parser()
288
292
  {
289
- VALUE nokogiri = rb_define_module("Nokogiri");
290
- VALUE xml = rb_define_module_under(nokogiri, "XML");
291
- VALUE sax = rb_define_module_under(xml, "SAX");
292
- VALUE klass = rb_define_class_under(sax, "Parser", rb_cObject);
293
-
294
- cNokogiriXmlSaxParser = klass;
293
+ cNokogiriXmlSaxParser = rb_define_class_under(mNokogiriXmlSax, "Parser", rb_cObject);
295
294
 
296
- rb_define_alloc_func(klass, allocate);
295
+ rb_define_alloc_func(cNokogiriXmlSaxParser, allocate);
297
296
 
298
297
  id_start_document = rb_intern("start_document");
299
- id_end_document = rb_intern("end_document");
300
- id_start_element = rb_intern("start_element");
301
- id_end_element = rb_intern("end_element");
302
- id_comment = rb_intern("comment");
303
- id_characters = rb_intern("characters");
304
- id_xmldecl = rb_intern("xmldecl");
305
- id_error = rb_intern("error");
306
- id_warning = rb_intern("warning");
307
- id_cdata_block = rb_intern("cdata_block");
308
- id_cAttribute = rb_intern("Attribute");
298
+ id_end_document = rb_intern("end_document");
299
+ id_start_element = rb_intern("start_element");
300
+ id_end_element = rb_intern("end_element");
301
+ id_comment = rb_intern("comment");
302
+ id_characters = rb_intern("characters");
303
+ id_xmldecl = rb_intern("xmldecl");
304
+ id_error = rb_intern("error");
305
+ id_warning = rb_intern("warning");
306
+ id_cdata_block = rb_intern("cdata_block");
309
307
  id_start_element_namespace = rb_intern("start_element_namespace");
310
308
  id_end_element_namespace = rb_intern("end_element_namespace");
311
309
  id_processing_instruction = rb_intern("processing_instruction");