nokogiri 1.5.10 → 1.13.0

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 (334) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  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 +73 -0
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +956 -100
  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 +232 -87
  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 +162 -168
  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 +327 -288
  94. data/lib/nokogiri/css/parser.y +67 -45
  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 +7 -6
  99. data/lib/nokogiri/css/xpath_visitor.rb +263 -75
  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 -90
  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 +259 -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 +18 -16
  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 +2511 -0
  171. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
  172. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  173. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  174. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  175. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
  176. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  177. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  178. metadata +382 -460
  179. data/.autotest +0 -26
  180. data/.gemtest +0 -0
  181. data/CHANGELOG.ja.rdoc +0 -785
  182. data/CHANGELOG.rdoc +0 -783
  183. data/C_CODING_STYLE.rdoc +0 -33
  184. data/Manifest.txt +0 -303
  185. data/README.ja.rdoc +0 -106
  186. data/README.rdoc +0 -175
  187. data/ROADMAP.md +0 -90
  188. data/Rakefile +0 -228
  189. data/STANDARD_RESPONSES.md +0 -47
  190. data/Y_U_NO_GEMSPEC.md +0 -155
  191. data/build_all +0 -105
  192. data/ext/nokogiri/html_document.c +0 -170
  193. data/ext/nokogiri/html_document.h +0 -10
  194. data/ext/nokogiri/html_element_description.c +0 -279
  195. data/ext/nokogiri/html_element_description.h +0 -10
  196. data/ext/nokogiri/html_entity_lookup.c +0 -32
  197. data/ext/nokogiri/html_entity_lookup.h +0 -8
  198. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  199. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  200. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  201. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  202. data/ext/nokogiri/xml_attr.h +0 -9
  203. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  204. data/ext/nokogiri/xml_cdata.h +0 -9
  205. data/ext/nokogiri/xml_comment.h +0 -9
  206. data/ext/nokogiri/xml_document.h +0 -23
  207. data/ext/nokogiri/xml_document_fragment.h +0 -10
  208. data/ext/nokogiri/xml_dtd.h +0 -10
  209. data/ext/nokogiri/xml_element_content.h +0 -10
  210. data/ext/nokogiri/xml_element_decl.h +0 -9
  211. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  212. data/ext/nokogiri/xml_entity_decl.h +0 -10
  213. data/ext/nokogiri/xml_entity_reference.h +0 -9
  214. data/ext/nokogiri/xml_io.c +0 -56
  215. data/ext/nokogiri/xml_io.h +0 -11
  216. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  217. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  218. data/ext/nokogiri/xml_namespace.h +0 -13
  219. data/ext/nokogiri/xml_node.h +0 -13
  220. data/ext/nokogiri/xml_node_set.h +0 -14
  221. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  222. data/ext/nokogiri/xml_reader.h +0 -10
  223. data/ext/nokogiri/xml_relax_ng.h +0 -9
  224. data/ext/nokogiri/xml_sax_parser.h +0 -39
  225. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  226. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  227. data/ext/nokogiri/xml_schema.h +0 -9
  228. data/ext/nokogiri/xml_syntax_error.h +0 -13
  229. data/ext/nokogiri/xml_text.h +0 -9
  230. data/ext/nokogiri/xml_xpath_context.h +0 -10
  231. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  232. data/lib/nokogiri/html/document.rb +0 -254
  233. data/lib/nokogiri/html/document_fragment.rb +0 -41
  234. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  235. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  236. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  237. data/tasks/cross_compile.rb +0 -150
  238. data/tasks/nokogiri.org.rb +0 -24
  239. data/tasks/test.rb +0 -95
  240. data/test/css/test_nthiness.rb +0 -159
  241. data/test/css/test_parser.rb +0 -341
  242. data/test/css/test_tokenizer.rb +0 -198
  243. data/test/css/test_xpath_visitor.rb +0 -91
  244. data/test/decorators/test_slop.rb +0 -16
  245. data/test/files/2ch.html +0 -108
  246. data/test/files/address_book.rlx +0 -12
  247. data/test/files/address_book.xml +0 -10
  248. data/test/files/bar/bar.xsd +0 -4
  249. data/test/files/dont_hurt_em_why.xml +0 -422
  250. data/test/files/encoding.html +0 -82
  251. data/test/files/encoding.xhtml +0 -84
  252. data/test/files/exslt.xml +0 -8
  253. data/test/files/exslt.xslt +0 -35
  254. data/test/files/foo/foo.xsd +0 -4
  255. data/test/files/metacharset.html +0 -10
  256. data/test/files/noencoding.html +0 -47
  257. data/test/files/po.xml +0 -32
  258. data/test/files/po.xsd +0 -66
  259. data/test/files/shift_jis.html +0 -10
  260. data/test/files/shift_jis.xml +0 -5
  261. data/test/files/snuggles.xml +0 -3
  262. data/test/files/staff.dtd +0 -10
  263. data/test/files/staff.xml +0 -59
  264. data/test/files/staff.xslt +0 -32
  265. data/test/files/test_document_url/bar.xml +0 -2
  266. data/test/files/test_document_url/document.dtd +0 -4
  267. data/test/files/test_document_url/document.xml +0 -6
  268. data/test/files/tlm.html +0 -850
  269. data/test/files/to_be_xincluded.xml +0 -2
  270. data/test/files/valid_bar.xml +0 -2
  271. data/test/files/xinclude.xml +0 -4
  272. data/test/helper.rb +0 -154
  273. data/test/html/sax/test_parser.rb +0 -141
  274. data/test/html/sax/test_parser_context.rb +0 -46
  275. data/test/html/test_builder.rb +0 -164
  276. data/test/html/test_document.rb +0 -552
  277. data/test/html/test_document_encoding.rb +0 -138
  278. data/test/html/test_document_fragment.rb +0 -261
  279. data/test/html/test_element_description.rb +0 -105
  280. data/test/html/test_named_characters.rb +0 -14
  281. data/test/html/test_node.rb +0 -196
  282. data/test/html/test_node_encoding.rb +0 -27
  283. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  284. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  285. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  286. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  287. data/test/test_convert_xpath.rb +0 -135
  288. data/test/test_css_cache.rb +0 -45
  289. data/test/test_encoding_handler.rb +0 -46
  290. data/test/test_memory_leak.rb +0 -156
  291. data/test/test_nokogiri.rb +0 -132
  292. data/test/test_reader.rb +0 -555
  293. data/test/test_soap4r_sax.rb +0 -52
  294. data/test/test_xslt_transforms.rb +0 -254
  295. data/test/xml/node/test_save_options.rb +0 -28
  296. data/test/xml/node/test_subclass.rb +0 -44
  297. data/test/xml/sax/test_parser.rb +0 -366
  298. data/test/xml/sax/test_parser_context.rb +0 -106
  299. data/test/xml/sax/test_push_parser.rb +0 -157
  300. data/test/xml/test_attr.rb +0 -64
  301. data/test/xml/test_attribute_decl.rb +0 -86
  302. data/test/xml/test_builder.rb +0 -306
  303. data/test/xml/test_c14n.rb +0 -151
  304. data/test/xml/test_cdata.rb +0 -48
  305. data/test/xml/test_comment.rb +0 -29
  306. data/test/xml/test_document.rb +0 -828
  307. data/test/xml/test_document_encoding.rb +0 -28
  308. data/test/xml/test_document_fragment.rb +0 -223
  309. data/test/xml/test_dtd.rb +0 -103
  310. data/test/xml/test_dtd_encoding.rb +0 -33
  311. data/test/xml/test_element_content.rb +0 -56
  312. data/test/xml/test_element_decl.rb +0 -73
  313. data/test/xml/test_entity_decl.rb +0 -122
  314. data/test/xml/test_entity_reference.rb +0 -245
  315. data/test/xml/test_namespace.rb +0 -95
  316. data/test/xml/test_node.rb +0 -1137
  317. data/test/xml/test_node_attributes.rb +0 -96
  318. data/test/xml/test_node_encoding.rb +0 -107
  319. data/test/xml/test_node_inheritance.rb +0 -32
  320. data/test/xml/test_node_reparenting.rb +0 -374
  321. data/test/xml/test_node_set.rb +0 -755
  322. data/test/xml/test_parse_options.rb +0 -64
  323. data/test/xml/test_processing_instruction.rb +0 -30
  324. data/test/xml/test_reader_encoding.rb +0 -142
  325. data/test/xml/test_relax_ng.rb +0 -60
  326. data/test/xml/test_schema.rb +0 -103
  327. data/test/xml/test_syntax_error.rb +0 -12
  328. data/test/xml/test_text.rb +0 -45
  329. data/test/xml/test_unparented_node.rb +0 -422
  330. data/test/xml/test_xinclude.rb +0 -83
  331. data/test/xml/test_xpath.rb +0 -295
  332. data/test/xslt/test_custom_functions.rb +0 -133
  333. data/test/xslt/test_exception_handling.rb +0 -37
  334. data/test_all +0 -81
@@ -1,6 +1,9 @@
1
- #include <xml_schema.h>
1
+ #include <nokogiri.h>
2
2
 
3
- static void dealloc(xmlSchemaPtr schema)
3
+ VALUE cNokogiriXmlSchema;
4
+
5
+ static void
6
+ dealloc(xmlSchemaPtr schema)
4
7
  {
5
8
  NOKOGIRI_DEBUG_START(schema);
6
9
  xmlSchemaFree(schema);
@@ -13,7 +16,8 @@ static void dealloc(xmlSchemaPtr schema)
13
16
  *
14
17
  * Validate a Nokogiri::XML::Document against this 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
  xmlSchemaPtr schema;
@@ -27,7 +31,7 @@ static VALUE validate_document(VALUE self, VALUE document)
27
31
 
28
32
  valid_ctxt = xmlSchemaNewValidCtxt(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,7 +57,8 @@ static VALUE validate_document(VALUE self, VALUE document)
53
57
  *
54
58
  * Validate a file against this Schema.
55
59
  */
56
- static VALUE validate_file(VALUE self, VALUE rb_filename)
60
+ static VALUE
61
+ validate_file(VALUE self, VALUE rb_filename)
57
62
  {
58
63
  xmlSchemaPtr schema;
59
64
  xmlSchemaValidCtxtPtr valid_ctxt;
@@ -61,13 +66,13 @@ static VALUE validate_file(VALUE self, VALUE rb_filename)
61
66
  VALUE errors;
62
67
 
63
68
  Data_Get_Struct(self, xmlSchema, schema);
64
- filename = (const char*)StringValuePtr(rb_filename) ;
69
+ filename = (const char *)StringValueCStr(rb_filename) ;
65
70
 
66
71
  errors = rb_ary_new();
67
72
 
68
73
  valid_ctxt = xmlSchemaNewValidCtxt(schema);
69
74
 
70
- if(NULL == valid_ctxt) {
75
+ if (NULL == valid_ctxt) {
71
76
  /* we have a problem */
72
77
  rb_raise(rb_eRuntimeError, "Could not create a validation context");
73
78
  }
@@ -93,15 +98,28 @@ static VALUE validate_file(VALUE self, VALUE rb_filename)
93
98
  *
94
99
  * Create a new Schema from the contents of +string+
95
100
  */
96
- static VALUE read_memory(VALUE klass, VALUE content)
101
+ static VALUE
102
+ read_memory(int argc, VALUE *argv, VALUE klass)
97
103
  {
104
+ VALUE content;
105
+ VALUE parse_options;
106
+ int parse_options_int;
107
+ xmlSchemaParserCtxtPtr ctx;
98
108
  xmlSchemaPtr schema;
99
- xmlSchemaParserCtxtPtr ctx = xmlSchemaNewMemParserCtxt(
100
- (const char *)StringValuePtr(content),
101
- (int)RSTRING_LEN(content)
102
- );
109
+ VALUE errors;
103
110
  VALUE rb_schema;
104
- VALUE errors = rb_ary_new();
111
+ int scanned_args = 0;
112
+ xmlExternalEntityLoader old_loader = 0;
113
+
114
+ scanned_args = rb_scan_args(argc, argv, "11", &content, &parse_options);
115
+ if (scanned_args == 1) {
116
+ parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
117
+ }
118
+ parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0));
119
+
120
+ ctx = xmlSchemaNewMemParserCtxt((const char *)StringValuePtr(content), (int)RSTRING_LEN(content));
121
+
122
+ errors = rb_ary_new();
105
123
  xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
106
124
 
107
125
  #ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
@@ -112,45 +130,97 @@ static VALUE read_memory(VALUE klass, VALUE content)
112
130
  );
113
131
  #endif
114
132
 
115
- schema = xmlSchemaParse(ctx);
133
+ if (parse_options_int & XML_PARSE_NONET) {
134
+ old_loader = xmlGetExternalEntityLoader();
135
+ xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
136
+ }
137
+
138
+ schema = xmlSchemaParse(ctx);
139
+
140
+ if (old_loader) {
141
+ xmlSetExternalEntityLoader(old_loader);
142
+ }
116
143
 
117
144
  xmlSetStructuredErrorFunc(NULL, NULL);
118
145
  xmlSchemaFreeParserCtxt(ctx);
119
146
 
120
- if(NULL == schema) {
147
+ if (NULL == schema) {
121
148
  xmlErrorPtr error = xmlGetLastError();
122
- if(error)
149
+ if (error) {
123
150
  Nokogiri_error_raise(NULL, error);
124
- else
151
+ } else {
125
152
  rb_raise(rb_eRuntimeError, "Could not parse document");
153
+ }
126
154
 
127
155
  return Qnil;
128
156
  }
129
157
 
130
158
  rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
131
159
  rb_iv_set(rb_schema, "@errors", errors);
160
+ rb_iv_set(rb_schema, "@parse_options", parse_options);
132
161
 
133
162
  return rb_schema;
134
163
  }
135
164
 
165
+ /* Schema creation will remove and deallocate "blank" nodes.
166
+ * If those blank nodes have been exposed to Ruby, they could get freed
167
+ * out from under the VALUE pointer. This function checks to see if any of
168
+ * those nodes have been exposed to Ruby, and if so we should raise an exception.
169
+ */
170
+ static int
171
+ has_blank_nodes_p(VALUE cache)
172
+ {
173
+ long i;
174
+
175
+ if (NIL_P(cache)) {
176
+ return 0;
177
+ }
178
+
179
+ for (i = 0; i < RARRAY_LEN(cache); i++) {
180
+ xmlNodePtr node;
181
+ VALUE element = rb_ary_entry(cache, i);
182
+ Data_Get_Struct(element, xmlNode, node);
183
+ if (xmlIsBlankNode(node)) {
184
+ return 1;
185
+ }
186
+ }
187
+
188
+ return 0;
189
+ }
190
+
136
191
  /*
137
192
  * call-seq:
138
193
  * from_document(doc)
139
194
  *
140
195
  * Create a new Schema from the Nokogiri::XML::Document +doc+
141
196
  */
142
- static VALUE from_document(VALUE klass, VALUE document)
197
+ static VALUE
198
+ from_document(int argc, VALUE *argv, VALUE klass)
143
199
  {
200
+ VALUE document;
201
+ VALUE parse_options;
202
+ int parse_options_int;
144
203
  xmlDocPtr doc;
145
204
  xmlSchemaParserCtxtPtr ctx;
146
205
  xmlSchemaPtr schema;
147
206
  VALUE errors;
148
207
  VALUE rb_schema;
208
+ int scanned_args = 0;
209
+ xmlExternalEntityLoader old_loader = 0;
210
+
211
+ scanned_args = rb_scan_args(argc, argv, "11", &document, &parse_options);
149
212
 
150
213
  Data_Get_Struct(document, xmlDoc, doc);
214
+ doc = doc->doc; /* In case someone passes us a node. ugh. */
151
215
 
152
- /* In case someone passes us a node. ugh. */
153
- doc = doc->doc;
216
+ if (scanned_args == 1) {
217
+ parse_options = rb_const_get_at(rb_const_get_at(mNokogiriXml, rb_intern("ParseOptions")), rb_intern("DEFAULT_SCHEMA"));
218
+ }
219
+ parse_options_int = (int)NUM2INT(rb_funcall(parse_options, rb_intern("to_i"), 0));
220
+
221
+ if (has_blank_nodes_p(DOC_NODE_CACHE(doc))) {
222
+ rb_raise(rb_eArgError, "Creating a schema from a document that has blank nodes exposed to Ruby is dangerous");
223
+ }
154
224
 
155
225
  ctx = xmlSchemaNewDocParserCtxt(doc);
156
226
 
@@ -165,41 +235,50 @@ static VALUE from_document(VALUE klass, VALUE document)
165
235
  );
166
236
  #endif
167
237
 
238
+ if (parse_options_int & XML_PARSE_NONET) {
239
+ old_loader = xmlGetExternalEntityLoader();
240
+ xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
241
+ }
242
+
168
243
  schema = xmlSchemaParse(ctx);
169
244
 
245
+ if (old_loader) {
246
+ xmlSetExternalEntityLoader(old_loader);
247
+ }
248
+
170
249
  xmlSetStructuredErrorFunc(NULL, NULL);
171
250
  xmlSchemaFreeParserCtxt(ctx);
172
251
 
173
- if(NULL == schema) {
252
+ if (NULL == schema) {
174
253
  xmlErrorPtr error = xmlGetLastError();
175
- if(error)
254
+ if (error) {
176
255
  Nokogiri_error_raise(NULL, error);
177
- else
256
+ } else {
178
257
  rb_raise(rb_eRuntimeError, "Could not parse document");
258
+ }
179
259
 
180
260
  return Qnil;
181
261
  }
182
262
 
183
263
  rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
184
264
  rb_iv_set(rb_schema, "@errors", errors);
265
+ rb_iv_set(rb_schema, "@parse_options", parse_options);
185
266
 
186
267
  return rb_schema;
187
268
 
188
269
  return Qnil;
189
270
  }
190
271
 
191
- VALUE cNokogiriXmlSchema;
192
- void init_xml_schema()
272
+ void
273
+ noko_init_xml_schema()
193
274
  {
194
- VALUE nokogiri = rb_define_module("Nokogiri");
195
- VALUE xml = rb_define_module_under(nokogiri, "XML");
196
- VALUE klass = rb_define_class_under(xml, "Schema", rb_cObject);
275
+ cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject);
197
276
 
198
- cNokogiriXmlSchema = klass;
277
+ rb_undef_alloc_func(cNokogiriXmlSchema);
199
278
 
200
- rb_define_singleton_method(klass, "read_memory", read_memory, 1);
201
- rb_define_singleton_method(klass, "from_document", from_document, 1);
279
+ rb_define_singleton_method(cNokogiriXmlSchema, "read_memory", read_memory, -1);
280
+ rb_define_singleton_method(cNokogiriXmlSchema, "from_document", from_document, -1);
202
281
 
203
- rb_define_private_method(klass, "validate_document", validate_document, 1);
204
- rb_define_private_method(klass, "validate_file", validate_file, 1);
282
+ rb_define_private_method(cNokogiriXmlSchema, "validate_document", validate_document, 1);
283
+ rb_define_private_method(cNokogiriXmlSchema, "validate_file", validate_file, 1);
205
284
  }
@@ -1,32 +1,64 @@
1
- #include <xml_syntax_error.h>
1
+ #include <nokogiri.h>
2
2
 
3
- void Nokogiri_error_array_pusher(void * ctx, xmlErrorPtr error)
3
+ VALUE cNokogiriXmlSyntaxError;
4
+
5
+ void
6
+ Nokogiri_structured_error_func_save(libxmlStructuredErrorHandlerState *handler_state)
7
+ {
8
+ /* this method is tightly coupled to the implementation of xmlSetStructuredErrorFunc */
9
+ handler_state->user_data = xmlStructuredErrorContext;
10
+ handler_state->handler = xmlStructuredError;
11
+ }
12
+
13
+ void
14
+ Nokogiri_structured_error_func_save_and_set(libxmlStructuredErrorHandlerState *handler_state,
15
+ void *user_data,
16
+ xmlStructuredErrorFunc handler)
17
+ {
18
+ Nokogiri_structured_error_func_save(handler_state);
19
+ xmlSetStructuredErrorFunc(user_data, handler);
20
+ }
21
+
22
+ void
23
+ Nokogiri_structured_error_func_restore(libxmlStructuredErrorHandlerState *handler_state)
24
+ {
25
+ xmlSetStructuredErrorFunc(handler_state->user_data, handler_state->handler);
26
+ }
27
+
28
+ void
29
+ Nokogiri_error_array_pusher(void *ctx, xmlErrorPtr error)
4
30
  {
5
31
  VALUE list = (VALUE)ctx;
6
- rb_ary_push(list, Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
32
+ Check_Type(list, T_ARRAY);
33
+ rb_ary_push(list, Nokogiri_wrap_xml_syntax_error(error));
7
34
  }
8
35
 
9
- void Nokogiri_error_raise(void * ctx, xmlErrorPtr error)
36
+ void
37
+ Nokogiri_error_raise(void *ctx, xmlErrorPtr error)
10
38
  {
11
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
39
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
12
40
  }
13
41
 
14
- VALUE Nokogiri_wrap_xml_syntax_error(VALUE klass, xmlErrorPtr error)
42
+ VALUE
43
+ Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
15
44
  {
16
- VALUE msg, e;
45
+ VALUE msg, e, klass;
46
+
47
+ klass = cNokogiriXmlSyntaxError;
17
48
 
18
- if(!klass) klass = cNokogiriXmlSyntaxError;
49
+ if (error && error->domain == XML_FROM_XPATH) {
50
+ klass = cNokogiriXmlXpathSyntaxError;
51
+ }
19
52
 
20
53
  msg = (error && error->message) ? NOKOGIRI_STR_NEW2(error->message) : Qnil;
21
54
 
22
55
  e = rb_class_new_instance(
23
- 1,
24
- &msg,
25
- klass
26
- );
56
+ 1,
57
+ &msg,
58
+ klass
59
+ );
27
60
 
28
- if (error)
29
- {
61
+ if (error) {
30
62
  rb_iv_set(e, "@domain", INT2NUM(error->domain));
31
63
  rb_iv_set(e, "@code", INT2NUM(error->code));
32
64
  rb_iv_set(e, "@level", INT2NUM((short)error->level));
@@ -42,17 +74,12 @@ VALUE Nokogiri_wrap_xml_syntax_error(VALUE klass, xmlErrorPtr error)
42
74
  return e;
43
75
  }
44
76
 
45
- VALUE cNokogiriXmlSyntaxError;
46
- void init_xml_syntax_error()
77
+ void
78
+ noko_init_xml_syntax_error()
47
79
  {
48
- VALUE nokogiri = rb_define_module("Nokogiri");
49
- VALUE xml = rb_define_module_under(nokogiri, "XML");
50
-
80
+ assert(cNokogiriSyntaxError);
51
81
  /*
52
82
  * The XML::SyntaxError is raised on parse errors
53
83
  */
54
- VALUE syntax_error_mommy = rb_define_class_under(nokogiri, "SyntaxError", rb_eStandardError);
55
- VALUE klass = rb_define_class_under(xml, "SyntaxError", syntax_error_mommy);
56
- cNokogiriXmlSyntaxError = klass;
57
-
84
+ cNokogiriXmlSyntaxError = rb_define_class_under(mNokogiriXml, "SyntaxError", cNokogiriSyntaxError);
58
85
  }
@@ -1,4 +1,6 @@
1
- #include <xml_text.h>
1
+ #include <nokogiri.h>
2
+
3
+ VALUE cNokogiriXmlText ;
2
4
 
3
5
  /*
4
6
  * call-seq:
@@ -6,7 +8,8 @@
6
8
  *
7
9
  * Create a new Text element on the +document+ with +content+
8
10
  */
9
- static VALUE new(int argc, VALUE *argv, VALUE klass)
11
+ static VALUE
12
+ new (int argc, VALUE *argv, VALUE klass)
10
13
  {
11
14
  xmlDocPtr doc;
12
15
  xmlNodePtr node;
@@ -19,34 +22,27 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
19
22
 
20
23
  Data_Get_Struct(document, xmlDoc, doc);
21
24
 
22
- node = xmlNewText((xmlChar *)StringValuePtr(string));
25
+ node = xmlNewText((xmlChar *)StringValueCStr(string));
23
26
  node->doc = doc->doc;
24
27
 
25
- nokogiri_root_node(node);
28
+ noko_xml_document_pin_node(node);
26
29
 
27
- rb_node = Nokogiri_wrap_xml_node(klass, node) ;
30
+ rb_node = noko_xml_node_wrap(klass, node) ;
28
31
  rb_obj_call_init(rb_node, argc, argv);
29
32
 
30
- if(rb_block_given_p()) rb_yield(rb_node);
33
+ if (rb_block_given_p()) { rb_yield(rb_node); }
31
34
 
32
35
  return rb_node;
33
36
  }
34
37
 
35
- VALUE cNokogiriXmlText ;
36
- void init_xml_text()
38
+ void
39
+ noko_init_xml_text()
37
40
  {
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
-
41
+ assert(cNokogiriXmlCharacterData);
44
42
  /*
45
43
  * Wraps Text nodes.
46
44
  */
47
- VALUE klass = rb_define_class_under(xml, "Text", char_data);
48
-
49
- cNokogiriXmlText = klass;
45
+ cNokogiriXmlText = rb_define_class_under(mNokogiriXml, "Text", cNokogiriXmlCharacterData);
50
46
 
51
- rb_define_singleton_method(klass, "new", new, -1);
47
+ rb_define_singleton_method(cNokogiriXmlText, "new", new, -1);
52
48
  }