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

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

Potentially problematic release.


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

Files changed (319) hide show
  1. data/.autotest +18 -7
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +297 -3
  4. data/CHANGELOG.rdoc +289 -0
  5. data/Manifest.txt +148 -37
  6. data/README.ja.rdoc +20 -20
  7. data/README.rdoc +53 -22
  8. data/Rakefile +127 -211
  9. data/bin/nokogiri +54 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +89 -54
  12. data/ext/nokogiri/html_document.c +34 -27
  13. data/ext/nokogiri/html_document.h +1 -1
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +7 -5
  17. data/ext/nokogiri/html_entity_lookup.h +1 -1
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
  21. data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
  22. data/ext/nokogiri/xml_attr.c +20 -9
  23. data/ext/nokogiri/xml_attr.h +1 -1
  24. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  25. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +21 -9
  27. data/ext/nokogiri/xml_cdata.h +1 -1
  28. data/ext/nokogiri/xml_comment.c +18 -6
  29. data/ext/nokogiri/xml_comment.h +1 -1
  30. data/ext/nokogiri/xml_document.c +247 -68
  31. data/ext/nokogiri/xml_document.h +5 -3
  32. data/ext/nokogiri/xml_document_fragment.c +15 -7
  33. data/ext/nokogiri/xml_document_fragment.h +1 -1
  34. data/ext/nokogiri/xml_dtd.c +110 -10
  35. data/ext/nokogiri/xml_dtd.h +3 -1
  36. data/ext/nokogiri/xml_element_content.c +123 -0
  37. data/ext/nokogiri/xml_element_content.h +10 -0
  38. data/ext/nokogiri/xml_element_decl.c +69 -0
  39. data/ext/nokogiri/xml_element_decl.h +9 -0
  40. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  41. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  42. data/ext/nokogiri/xml_entity_decl.c +110 -0
  43. data/ext/nokogiri/xml_entity_decl.h +10 -0
  44. data/ext/nokogiri/xml_entity_reference.c +16 -5
  45. data/ext/nokogiri/xml_entity_reference.h +1 -1
  46. data/ext/nokogiri/xml_io.c +40 -8
  47. data/ext/nokogiri/xml_io.h +2 -1
  48. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  50. data/ext/nokogiri/xml_namespace.c +84 -0
  51. data/ext/nokogiri/xml_namespace.h +13 -0
  52. data/ext/nokogiri/xml_node.c +782 -225
  53. data/ext/nokogiri/xml_node.h +2 -4
  54. data/ext/nokogiri/xml_node_set.c +253 -34
  55. data/ext/nokogiri/xml_node_set.h +2 -2
  56. data/ext/nokogiri/xml_processing_instruction.c +17 -5
  57. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  58. data/ext/nokogiri/xml_reader.c +277 -85
  59. data/ext/nokogiri/xml_reader.h +1 -1
  60. data/ext/nokogiri/xml_relax_ng.c +168 -0
  61. data/ext/nokogiri/xml_relax_ng.h +9 -0
  62. data/ext/nokogiri/xml_sax_parser.c +183 -111
  63. data/ext/nokogiri/xml_sax_parser.h +30 -1
  64. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  65. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  66. data/ext/nokogiri/xml_sax_push_parser.c +42 -12
  67. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  68. data/ext/nokogiri/xml_schema.c +205 -0
  69. data/ext/nokogiri/xml_schema.h +9 -0
  70. data/ext/nokogiri/xml_syntax_error.c +28 -173
  71. data/ext/nokogiri/xml_syntax_error.h +2 -1
  72. data/ext/nokogiri/xml_text.c +16 -6
  73. data/ext/nokogiri/xml_text.h +1 -1
  74. data/ext/nokogiri/xml_xpath_context.c +104 -47
  75. data/ext/nokogiri/xml_xpath_context.h +1 -1
  76. data/ext/nokogiri/xslt_stylesheet.c +161 -19
  77. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  78. data/lib/nokogiri.rb +47 -8
  79. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  80. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  81. data/lib/nokogiri/css.rb +6 -3
  82. data/lib/nokogiri/css/node.rb +14 -12
  83. data/lib/nokogiri/css/parser.rb +665 -62
  84. data/lib/nokogiri/css/parser.y +20 -10
  85. data/lib/nokogiri/css/parser_extras.rb +91 -0
  86. data/lib/nokogiri/css/tokenizer.rb +148 -5
  87. data/lib/nokogiri/css/tokenizer.rex +10 -9
  88. data/lib/nokogiri/css/xpath_visitor.rb +47 -44
  89. data/lib/nokogiri/decorators/slop.rb +8 -4
  90. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  91. data/lib/nokogiri/ffi/html/document.rb +28 -0
  92. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  93. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  94. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  95. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  96. data/lib/nokogiri/ffi/libxml.rb +420 -0
  97. data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
  98. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  99. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  100. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
  102. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  103. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  105. data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
  106. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  107. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  108. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  109. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  110. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  111. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  112. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  113. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  114. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  115. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
  117. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  118. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  119. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  120. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  121. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  122. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  123. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
  124. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  126. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  127. data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
  128. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  129. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  132. data/lib/nokogiri/ffi/xml/document.rb +174 -0
  133. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  134. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  135. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  136. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  137. data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
  138. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  139. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  140. data/lib/nokogiri/ffi/xml/node.rb +559 -0
  141. data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
  142. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  143. data/lib/nokogiri/ffi/xml/reader.rb +236 -0
  144. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  145. data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
  147. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
  148. data/lib/nokogiri/ffi/xml/schema.rb +109 -0
  149. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  150. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  151. data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
  152. data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
  153. data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
  154. data/lib/nokogiri/html.rb +13 -47
  155. data/lib/nokogiri/html/builder.rb +27 -1
  156. data/lib/nokogiri/html/document.rb +201 -7
  157. data/lib/nokogiri/html/document_fragment.rb +41 -0
  158. data/lib/nokogiri/html/element_description.rb +23 -0
  159. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  160. data/lib/nokogiri/html/sax/parser.rb +34 -3
  161. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  162. data/lib/nokogiri/nokogiri.rb +1 -0
  163. data/lib/nokogiri/version.rb +40 -1
  164. data/lib/nokogiri/version_warning.rb +14 -0
  165. data/lib/nokogiri/xml.rb +32 -53
  166. data/lib/nokogiri/xml/attr.rb +5 -0
  167. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  168. data/lib/nokogiri/xml/builder.rb +349 -29
  169. data/lib/nokogiri/xml/cdata.rb +3 -1
  170. data/lib/nokogiri/xml/character_data.rb +7 -0
  171. data/lib/nokogiri/xml/document.rb +166 -14
  172. data/lib/nokogiri/xml/document_fragment.rb +76 -1
  173. data/lib/nokogiri/xml/dtd.rb +16 -3
  174. data/lib/nokogiri/xml/element_content.rb +36 -0
  175. data/lib/nokogiri/xml/element_decl.rb +13 -0
  176. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  177. data/lib/nokogiri/xml/namespace.rb +13 -0
  178. data/lib/nokogiri/xml/node.rb +561 -166
  179. data/lib/nokogiri/xml/node/save_options.rb +22 -2
  180. data/lib/nokogiri/xml/node_set.rb +202 -40
  181. data/lib/nokogiri/xml/parse_options.rb +93 -0
  182. data/lib/nokogiri/xml/pp.rb +2 -0
  183. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  184. data/lib/nokogiri/xml/pp/node.rb +56 -0
  185. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  186. data/lib/nokogiri/xml/reader.rb +93 -8
  187. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  188. data/lib/nokogiri/xml/sax.rb +1 -7
  189. data/lib/nokogiri/xml/sax/document.rb +107 -2
  190. data/lib/nokogiri/xml/sax/parser.rb +57 -7
  191. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  192. data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
  193. data/lib/nokogiri/xml/schema.rb +63 -0
  194. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  195. data/lib/nokogiri/xml/text.rb +4 -1
  196. data/lib/nokogiri/xml/xpath.rb +1 -1
  197. data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
  198. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  199. data/lib/nokogiri/xslt.rb +26 -2
  200. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  201. data/lib/xsd/xmlparser/nokogiri.rb +45 -9
  202. data/tasks/cross_compile.rb +173 -0
  203. data/tasks/test.rb +25 -69
  204. data/test/css/test_nthiness.rb +3 -4
  205. data/test/css/test_parser.rb +75 -20
  206. data/test/css/test_tokenizer.rb +23 -1
  207. data/test/css/test_xpath_visitor.rb +10 -1
  208. data/test/decorators/test_slop.rb +16 -0
  209. data/test/ffi/test_document.rb +35 -0
  210. data/test/files/2ch.html +108 -0
  211. data/test/files/address_book.rlx +12 -0
  212. data/test/files/address_book.xml +10 -0
  213. data/test/files/bar/bar.xsd +4 -0
  214. data/test/files/encoding.html +82 -0
  215. data/test/files/encoding.xhtml +84 -0
  216. data/test/files/foo/foo.xsd +4 -0
  217. data/test/files/po.xml +32 -0
  218. data/test/files/po.xsd +66 -0
  219. data/test/files/shift_jis.html +10 -0
  220. data/test/files/shift_jis.xml +5 -0
  221. data/test/files/snuggles.xml +3 -0
  222. data/test/files/staff.dtd +10 -0
  223. data/test/files/valid_bar.xml +2 -0
  224. data/test/helper.rb +101 -23
  225. data/test/html/sax/test_parser.rb +81 -2
  226. data/test/html/sax/test_parser_context.rb +48 -0
  227. data/test/html/test_builder.rb +39 -8
  228. data/test/html/test_document.rb +186 -23
  229. data/test/html/test_document_encoding.rb +78 -1
  230. data/test/html/test_document_fragment.rb +253 -0
  231. data/test/html/test_element_description.rb +98 -0
  232. data/test/html/test_named_characters.rb +1 -1
  233. data/test/html/test_node.rb +124 -36
  234. data/test/html/test_node_encoding.rb +27 -0
  235. data/test/test_convert_xpath.rb +1 -52
  236. data/test/test_css_cache.rb +2 -13
  237. data/test/test_encoding_handler.rb +46 -0
  238. data/test/test_memory_leak.rb +88 -19
  239. data/test/test_nokogiri.rb +38 -5
  240. data/test/test_reader.rb +188 -6
  241. data/test/test_soap4r_sax.rb +52 -0
  242. data/test/test_xslt_transforms.rb +183 -83
  243. data/test/xml/node/test_save_options.rb +1 -1
  244. data/test/xml/node/test_subclass.rb +44 -0
  245. data/test/xml/sax/test_parser.rb +175 -4
  246. data/test/xml/sax/test_parser_context.rb +113 -0
  247. data/test/xml/sax/test_push_parser.rb +90 -2
  248. data/test/xml/test_attr.rb +35 -1
  249. data/test/xml/test_attribute_decl.rb +82 -0
  250. data/test/xml/test_builder.rb +186 -1
  251. data/test/xml/test_cdata.rb +32 -1
  252. data/test/xml/test_comment.rb +13 -1
  253. data/test/xml/test_document.rb +415 -43
  254. data/test/xml/test_document_encoding.rb +1 -1
  255. data/test/xml/test_document_fragment.rb +173 -5
  256. data/test/xml/test_dtd.rb +61 -6
  257. data/test/xml/test_dtd_encoding.rb +3 -1
  258. data/test/xml/test_element_content.rb +56 -0
  259. data/test/xml/test_element_decl.rb +73 -0
  260. data/test/xml/test_entity_decl.rb +120 -0
  261. data/test/xml/test_entity_reference.rb +5 -1
  262. data/test/xml/test_namespace.rb +68 -0
  263. data/test/xml/test_node.rb +546 -201
  264. data/test/xml/test_node_attributes.rb +34 -0
  265. data/test/xml/test_node_encoding.rb +33 -3
  266. data/test/xml/test_node_reparenting.rb +321 -0
  267. data/test/xml/test_node_set.rb +538 -2
  268. data/test/xml/test_parse_options.rb +52 -0
  269. data/test/xml/test_processing_instruction.rb +6 -1
  270. data/test/xml/test_reader_encoding.rb +1 -1
  271. data/test/xml/test_relax_ng.rb +60 -0
  272. data/test/xml/test_schema.rb +94 -0
  273. data/test/xml/test_syntax_error.rb +12 -0
  274. data/test/xml/test_text.rb +35 -1
  275. data/test/xml/test_unparented_node.rb +5 -5
  276. data/test/xml/test_xpath.rb +142 -11
  277. data/test/xslt/test_custom_functions.rb +94 -0
  278. metadata +328 -92
  279. data/ext/nokogiri/html_sax_parser.c +0 -57
  280. data/ext/nokogiri/html_sax_parser.h +0 -11
  281. data/ext/nokogiri/iconv.dll +0 -0
  282. data/ext/nokogiri/libexslt.dll +0 -0
  283. data/ext/nokogiri/libxml2.dll +0 -0
  284. data/ext/nokogiri/libxslt.dll +0 -0
  285. data/ext/nokogiri/native.so +0 -0
  286. data/ext/nokogiri/xml_xpath.c +0 -53
  287. data/ext/nokogiri/xml_xpath.h +0 -11
  288. data/ext/nokogiri/zlib1.dll +0 -0
  289. data/lib/action-nokogiri.rb +0 -30
  290. data/lib/nokogiri/css/generated_parser.rb +0 -713
  291. data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
  292. data/lib/nokogiri/decorators.rb +0 -2
  293. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  294. data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
  295. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
  296. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
  297. data/lib/nokogiri/hpricot.rb +0 -51
  298. data/lib/nokogiri/xml/comment.rb +0 -6
  299. data/lib/nokogiri/xml/element.rb +0 -6
  300. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  301. data/lib/nokogiri/xml/fragment_handler.rb +0 -34
  302. data/test/hpricot/files/basic.xhtml +0 -17
  303. data/test/hpricot/files/boingboing.html +0 -2266
  304. data/test/hpricot/files/cy0.html +0 -3653
  305. data/test/hpricot/files/immob.html +0 -400
  306. data/test/hpricot/files/pace_application.html +0 -1320
  307. data/test/hpricot/files/tenderlove.html +0 -16
  308. data/test/hpricot/files/uswebgen.html +0 -220
  309. data/test/hpricot/files/utf8.html +0 -1054
  310. data/test/hpricot/files/week9.html +0 -1723
  311. data/test/hpricot/files/why.xml +0 -19
  312. data/test/hpricot/load_files.rb +0 -11
  313. data/test/hpricot/test_alter.rb +0 -68
  314. data/test/hpricot/test_builder.rb +0 -20
  315. data/test/hpricot/test_parser.rb +0 -426
  316. data/test/hpricot/test_paths.rb +0 -15
  317. data/test/hpricot/test_preserved.rb +0 -77
  318. data/test/hpricot/test_xml.rb +0 -30
  319. data/test/test_gc.rb +0 -15
@@ -1,10 +1,39 @@
1
1
  #ifndef NOKOGIRI_XML_SAX_PARSER
2
2
  #define NOKOGIRI_XML_SAX_PARSER
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_sax_parser();
7
7
 
8
8
  extern VALUE cNokogiriXmlSaxParser ;
9
+
10
+ typedef struct _nokogiriSAXTuple {
11
+ xmlParserCtxtPtr ctxt;
12
+ VALUE self;
13
+ } nokogiriSAXTuple;
14
+
15
+ typedef nokogiriSAXTuple * nokogiriSAXTuplePtr;
16
+
17
+ #define NOKOGIRI_SAX_SELF(_ctxt) \
18
+ ((nokogiriSAXTuplePtr)(_ctxt))->self
19
+
20
+ #define NOKOGIRI_SAX_CTXT(_ctxt) \
21
+ ((nokogiriSAXTuplePtr)(_ctxt))->ctxt
22
+
23
+ #define NOKOGIRI_SAX_TUPLE_NEW(_ctxt, _self) \
24
+ nokogiri_sax_tuple_new(_ctxt, _self)
25
+
26
+ static inline nokogiriSAXTuplePtr
27
+ nokogiri_sax_tuple_new(xmlParserCtxtPtr ctxt, VALUE self)
28
+ {
29
+ nokogiriSAXTuplePtr tuple = malloc(sizeof(nokogiriSAXTuple));
30
+ tuple->self = self;
31
+ tuple->ctxt = ctxt;
32
+ return tuple;
33
+ }
34
+
35
+ #define NOKOGIRI_SAX_TUPLE_DESTROY(_tuple) \
36
+ free(_tuple) \
37
+
9
38
  #endif
10
39
 
@@ -0,0 +1,199 @@
1
+ #include <xml_sax_parser_context.h>
2
+
3
+ VALUE cNokogiriXmlSaxParserContext ;
4
+
5
+ static void deallocate(xmlParserCtxtPtr ctxt)
6
+ {
7
+ NOKOGIRI_DEBUG_START(handler);
8
+
9
+ ctxt->sax = NULL;
10
+
11
+ xmlFreeParserCtxt(ctxt);
12
+
13
+ NOKOGIRI_DEBUG_END(handler);
14
+ }
15
+
16
+ /*
17
+ * call-seq:
18
+ * parse_io(io, encoding)
19
+ *
20
+ * Parse +io+ object with +encoding+
21
+ */
22
+ static VALUE parse_io(VALUE klass, VALUE io, VALUE encoding)
23
+ {
24
+ xmlCharEncoding enc = (xmlCharEncoding)NUM2INT(encoding);
25
+
26
+ xmlParserCtxtPtr ctxt = xmlCreateIOParserCtxt(
27
+ NULL,
28
+ NULL,
29
+ (xmlInputReadCallback)io_read_callback,
30
+ (xmlInputCloseCallback)io_close_callback,
31
+ (void *)io,
32
+ enc
33
+ );
34
+
35
+ return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
36
+ }
37
+
38
+ /*
39
+ * call-seq:
40
+ * parse_file(filename)
41
+ *
42
+ * Parse file given +filename+
43
+ */
44
+ static VALUE parse_file(VALUE klass, VALUE filename)
45
+ {
46
+ xmlParserCtxtPtr ctxt = xmlCreateFileParserCtxt(StringValuePtr(filename));
47
+ return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
48
+ }
49
+
50
+ /*
51
+ * call-seq:
52
+ * parse_memory(data)
53
+ *
54
+ * Parse the XML stored in memory in +data+
55
+ */
56
+ static VALUE parse_memory(VALUE klass, VALUE data)
57
+ {
58
+ xmlParserCtxtPtr ctxt;
59
+
60
+ if(NIL_P(data)) rb_raise(rb_eArgError, "data cannot be nil");
61
+ if(!(int)RSTRING_LEN(data))
62
+ rb_raise(rb_eRuntimeError, "data cannot be empty");
63
+
64
+ ctxt = xmlCreateMemoryParserCtxt(
65
+ StringValuePtr(data),
66
+ (int)RSTRING_LEN(data)
67
+ );
68
+
69
+ return Data_Wrap_Struct(klass, NULL, deallocate, ctxt);
70
+ }
71
+
72
+ /*
73
+ * call-seq:
74
+ * parse_with(sax_handler)
75
+ *
76
+ * Use +sax_handler+ and parse the current document
77
+ */
78
+ static VALUE parse_with(VALUE self, VALUE sax_handler)
79
+ {
80
+ xmlParserCtxtPtr ctxt;
81
+ xmlSAXHandlerPtr sax;
82
+
83
+ if(!rb_obj_is_kind_of(sax_handler, cNokogiriXmlSaxParser))
84
+ rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::SAX::Parser");
85
+
86
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
87
+ Data_Get_Struct(sax_handler, xmlSAXHandler, sax);
88
+
89
+ /* Free the sax handler since we'll assign our own */
90
+ if(ctxt->sax && ctxt->sax != (xmlSAXHandlerPtr)&xmlDefaultSAXHandler)
91
+ xmlFree(ctxt->sax);
92
+
93
+ ctxt->sax = sax;
94
+ ctxt->userData = (void *)NOKOGIRI_SAX_TUPLE_NEW(ctxt, sax_handler);
95
+
96
+ xmlParseDocument(ctxt);
97
+
98
+ if(NULL != ctxt->myDoc) xmlFreeDoc(ctxt->myDoc);
99
+
100
+ NOKOGIRI_SAX_TUPLE_DESTROY(ctxt->userData);
101
+
102
+ return Qnil ;
103
+ }
104
+
105
+ /*
106
+ * call-seq:
107
+ * replace_entities=(boolean)
108
+ *
109
+ * Should this parser replace entities? &amp; will get converted to '&' if
110
+ * set to true
111
+ */
112
+ static VALUE set_replace_entities(VALUE self, VALUE value)
113
+ {
114
+ xmlParserCtxtPtr ctxt;
115
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
116
+
117
+ if(Qfalse == value)
118
+ ctxt->replaceEntities = 0;
119
+ else
120
+ ctxt->replaceEntities = 1;
121
+
122
+ return value;
123
+ }
124
+
125
+ /*
126
+ * call-seq:
127
+ * replace_entities
128
+ *
129
+ * Should this parser replace entities? &amp; will get converted to '&' if
130
+ * set to true
131
+ */
132
+ static VALUE get_replace_entities(VALUE self)
133
+ {
134
+ xmlParserCtxtPtr ctxt;
135
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
136
+
137
+ if(0 == ctxt->replaceEntities)
138
+ return Qfalse;
139
+ else
140
+ return Qtrue;
141
+ }
142
+
143
+ /*
144
+ * call-seq: line
145
+ *
146
+ * Get the current line the parser context is processing.
147
+ */
148
+ static VALUE line(VALUE self)
149
+ {
150
+ xmlParserCtxtPtr ctxt;
151
+ xmlParserInputPtr io;
152
+
153
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
154
+
155
+ io = ctxt->input;
156
+ if(io)
157
+ return INT2NUM(io->line);
158
+
159
+ return Qnil;
160
+ }
161
+
162
+ /*
163
+ * call-seq: column
164
+ *
165
+ * Get the current column the parser context is processing.
166
+ */
167
+ static VALUE column(VALUE self)
168
+ {
169
+ xmlParserCtxtPtr ctxt;
170
+ xmlParserInputPtr io;
171
+
172
+ Data_Get_Struct(self, xmlParserCtxt, ctxt);
173
+
174
+ io = ctxt->input;
175
+ if(io)
176
+ return INT2NUM(io->col);
177
+
178
+ return Qnil;
179
+ }
180
+
181
+ void init_xml_sax_parser_context()
182
+ {
183
+ VALUE nokogiri = rb_define_module("Nokogiri");
184
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
185
+ VALUE sax = rb_define_module_under(xml, "SAX");
186
+ VALUE klass = rb_define_class_under(sax, "ParserContext", rb_cObject);
187
+
188
+ cNokogiriXmlSaxParserContext = klass;
189
+
190
+ rb_define_singleton_method(klass, "io", parse_io, 2);
191
+ rb_define_singleton_method(klass, "memory", parse_memory, 1);
192
+ rb_define_singleton_method(klass, "file", parse_file, 1);
193
+
194
+ rb_define_method(klass, "parse_with", parse_with, 1);
195
+ rb_define_method(klass, "replace_entities=", set_replace_entities, 1);
196
+ rb_define_method(klass, "replace_entities", get_replace_entities, 0);
197
+ rb_define_method(klass, "line", line, 0);
198
+ rb_define_method(klass, "column", column, 0);
199
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef NOKOGIRI_XML_SAX_PARSER_CONTEXT
2
+ #define NOKOGIRI_XML_SAX_PARSER_CONTEXT
3
+
4
+ #include <nokogiri.h>
5
+
6
+ extern VALUE cNokogiriXmlSaxParserContext;
7
+
8
+ void init_xml_sax_parser_context();
9
+
10
+ #endif
@@ -3,7 +3,10 @@
3
3
  static void deallocate(xmlParserCtxtPtr ctx)
4
4
  {
5
5
  NOKOGIRI_DEBUG_START(ctx);
6
- if(ctx != NULL) xmlFreeParserCtxt(ctx);
6
+ if(ctx != NULL) {
7
+ NOKOGIRI_SAX_TUPLE_DESTROY(ctx->userData);
8
+ xmlFreeParserCtxt(ctx);
9
+ }
7
10
  NOKOGIRI_DEBUG_END(ctx);
8
11
  }
9
12
 
@@ -21,20 +24,23 @@ static VALUE allocate(VALUE klass)
21
24
  static VALUE native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
22
25
  {
23
26
  xmlParserCtxtPtr ctx;
24
- Data_Get_Struct(self, xmlParserCtxt, ctx);
25
-
26
27
  const char * chunk = NULL;
27
- int last_chunk = 0;
28
28
  int size = 0;
29
29
 
30
+
31
+ Data_Get_Struct(self, xmlParserCtxt, ctx);
32
+
30
33
  if(Qnil != _chunk) {
31
34
  chunk = StringValuePtr(_chunk);
32
- size = RSTRING_LEN(_chunk);
35
+ size = (int)RSTRING_LEN(_chunk);
33
36
  }
34
- if(Qtrue == _last_chunk) last_chunk = 1;
35
37
 
36
- if(xmlParseChunk(ctx, chunk, size, last_chunk))
37
- rb_raise(rb_eRuntimeError, "Couldn't parse chunk");
38
+ if(xmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0)) {
39
+ if (!(ctx->options & XML_PARSE_RECOVER)) {
40
+ xmlErrorPtr e = xmlCtxtGetLastError(ctx);
41
+ Nokogiri_error_raise(NULL, e);
42
+ }
43
+ }
38
44
 
39
45
  return self;
40
46
  }
@@ -48,16 +54,16 @@ static VALUE native_write(VALUE self, VALUE _chunk, VALUE _last_chunk)
48
54
  static VALUE initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
49
55
  {
50
56
  xmlSAXHandlerPtr sax;
57
+ const char * filename = NULL;
58
+ xmlParserCtxtPtr ctx;
51
59
 
52
60
  Data_Get_Struct(_xml_sax, xmlSAXHandler, sax);
53
-
54
- const char * filename = NULL;
55
61
 
56
62
  if(_filename != Qnil) filename = StringValuePtr(_filename);
57
63
 
58
- xmlParserCtxtPtr ctx = xmlCreatePushParserCtxt(
64
+ ctx = xmlCreatePushParserCtxt(
59
65
  sax,
60
- (void *)self,
66
+ NULL,
61
67
  NULL,
62
68
  0,
63
69
  filename
@@ -65,10 +71,32 @@ static VALUE initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename)
65
71
  if(ctx == NULL)
66
72
  rb_raise(rb_eRuntimeError, "Could not create a parser context");
67
73
 
74
+ ctx->userData = NOKOGIRI_SAX_TUPLE_NEW(ctx, self);
75
+
76
+ ctx->sax2 = 1;
68
77
  DATA_PTR(self) = ctx;
69
78
  return self;
70
79
  }
71
80
 
81
+ static VALUE get_options(VALUE self)
82
+ {
83
+ xmlParserCtxtPtr ctx;
84
+ Data_Get_Struct(self, xmlParserCtxt, ctx);
85
+
86
+ return INT2NUM(ctx->options);
87
+ }
88
+
89
+ static VALUE set_options(VALUE self, VALUE options)
90
+ {
91
+ xmlParserCtxtPtr ctx;
92
+ Data_Get_Struct(self, xmlParserCtxt, ctx);
93
+
94
+ if (xmlCtxtUseOptions(ctx, (int)NUM2INT(options)) != 0)
95
+ rb_raise(rb_eRuntimeError, "Cannot set XML parser context options");
96
+
97
+ return Qnil;
98
+ }
99
+
72
100
  VALUE cNokogiriXmlSaxPushParser ;
73
101
  void init_xml_sax_push_parser()
74
102
  {
@@ -82,4 +110,6 @@ void init_xml_sax_push_parser()
82
110
  rb_define_alloc_func(klass, allocate);
83
111
  rb_define_private_method(klass, "initialize_native", initialize_native, 2);
84
112
  rb_define_private_method(klass, "native_write", native_write, 2);
113
+ rb_define_method(klass, "options", get_options, 0);
114
+ rb_define_method(klass, "options=", set_options, 1);
85
115
  }
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_SAX_PUSH_PARSER
2
2
  #define NOKOGIRI_XML_SAX_PUSH_PARSER
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_sax_push_parser();
7
7
 
@@ -0,0 +1,205 @@
1
+ #include <xml_schema.h>
2
+
3
+ static void dealloc(xmlSchemaPtr schema)
4
+ {
5
+ NOKOGIRI_DEBUG_START(schema);
6
+ xmlSchemaFree(schema);
7
+ NOKOGIRI_DEBUG_END(schema);
8
+ }
9
+
10
+ /*
11
+ * call-seq:
12
+ * validate_document(document)
13
+ *
14
+ * Validate a Nokogiri::XML::Document against this Schema.
15
+ */
16
+ static VALUE validate_document(VALUE self, VALUE document)
17
+ {
18
+ xmlDocPtr doc;
19
+ xmlSchemaPtr schema;
20
+ xmlSchemaValidCtxtPtr valid_ctxt;
21
+ VALUE errors;
22
+
23
+ Data_Get_Struct(self, xmlSchema, schema);
24
+ Data_Get_Struct(document, xmlDoc, doc);
25
+
26
+ errors = rb_ary_new();
27
+
28
+ valid_ctxt = xmlSchemaNewValidCtxt(schema);
29
+
30
+ if(NULL == valid_ctxt) {
31
+ /* we have a problem */
32
+ rb_raise(rb_eRuntimeError, "Could not create a validation context");
33
+ }
34
+
35
+ #ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS
36
+ xmlSchemaSetValidStructuredErrors(
37
+ valid_ctxt,
38
+ Nokogiri_error_array_pusher,
39
+ (void *)errors
40
+ );
41
+ #endif
42
+
43
+ xmlSchemaValidateDoc(valid_ctxt, doc);
44
+
45
+ xmlSchemaFreeValidCtxt(valid_ctxt);
46
+
47
+ return errors;
48
+ }
49
+
50
+ /*
51
+ * call-seq:
52
+ * validate_file(filename)
53
+ *
54
+ * Validate a file against this Schema.
55
+ */
56
+ static VALUE validate_file(VALUE self, VALUE rb_filename)
57
+ {
58
+ xmlSchemaPtr schema;
59
+ xmlSchemaValidCtxtPtr valid_ctxt;
60
+ const char *filename ;
61
+ VALUE errors;
62
+
63
+ Data_Get_Struct(self, xmlSchema, schema);
64
+ filename = (const char*)StringValuePtr(rb_filename) ;
65
+
66
+ errors = rb_ary_new();
67
+
68
+ valid_ctxt = xmlSchemaNewValidCtxt(schema);
69
+
70
+ if(NULL == valid_ctxt) {
71
+ /* we have a problem */
72
+ rb_raise(rb_eRuntimeError, "Could not create a validation context");
73
+ }
74
+
75
+ #ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS
76
+ xmlSchemaSetValidStructuredErrors(
77
+ valid_ctxt,
78
+ Nokogiri_error_array_pusher,
79
+ (void *)errors
80
+ );
81
+ #endif
82
+
83
+ xmlSchemaValidateFile(valid_ctxt, filename, 0);
84
+
85
+ xmlSchemaFreeValidCtxt(valid_ctxt);
86
+
87
+ return errors;
88
+ }
89
+
90
+ /*
91
+ * call-seq:
92
+ * read_memory(string)
93
+ *
94
+ * Create a new Schema from the contents of +string+
95
+ */
96
+ static VALUE read_memory(VALUE klass, VALUE content)
97
+ {
98
+ xmlSchemaPtr schema;
99
+ xmlSchemaParserCtxtPtr ctx = xmlSchemaNewMemParserCtxt(
100
+ (const char *)StringValuePtr(content),
101
+ (int)RSTRING_LEN(content)
102
+ );
103
+ VALUE rb_schema;
104
+ VALUE errors = rb_ary_new();
105
+ xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
106
+
107
+ #ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
108
+ xmlSchemaSetParserStructuredErrors(
109
+ ctx,
110
+ Nokogiri_error_array_pusher,
111
+ (void *)errors
112
+ );
113
+ #endif
114
+
115
+ schema = xmlSchemaParse(ctx);
116
+
117
+ xmlSetStructuredErrorFunc(NULL, NULL);
118
+ xmlSchemaFreeParserCtxt(ctx);
119
+
120
+ if(NULL == schema) {
121
+ xmlErrorPtr error = xmlGetLastError();
122
+ if(error)
123
+ Nokogiri_error_raise(NULL, error);
124
+ else
125
+ rb_raise(rb_eRuntimeError, "Could not parse document");
126
+
127
+ return Qnil;
128
+ }
129
+
130
+ rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
131
+ rb_iv_set(rb_schema, "@errors", errors);
132
+
133
+ return rb_schema;
134
+ }
135
+
136
+ /*
137
+ * call-seq:
138
+ * from_document(doc)
139
+ *
140
+ * Create a new Schema from the Nokogiri::XML::Document +doc+
141
+ */
142
+ static VALUE from_document(VALUE klass, VALUE document)
143
+ {
144
+ xmlDocPtr doc;
145
+ xmlSchemaParserCtxtPtr ctx;
146
+ xmlSchemaPtr schema;
147
+ VALUE errors;
148
+ VALUE rb_schema;
149
+
150
+ Data_Get_Struct(document, xmlDoc, doc);
151
+
152
+ /* In case someone passes us a node. ugh. */
153
+ doc = doc->doc;
154
+
155
+ ctx = xmlSchemaNewDocParserCtxt(doc);
156
+
157
+ errors = rb_ary_new();
158
+ xmlSetStructuredErrorFunc((void *)errors, Nokogiri_error_array_pusher);
159
+
160
+ #ifdef HAVE_XMLSCHEMASETPARSERSTRUCTUREDERRORS
161
+ xmlSchemaSetParserStructuredErrors(
162
+ ctx,
163
+ Nokogiri_error_array_pusher,
164
+ (void *)errors
165
+ );
166
+ #endif
167
+
168
+ schema = xmlSchemaParse(ctx);
169
+
170
+ xmlSetStructuredErrorFunc(NULL, NULL);
171
+ xmlSchemaFreeParserCtxt(ctx);
172
+
173
+ if(NULL == schema) {
174
+ xmlErrorPtr error = xmlGetLastError();
175
+ if(error)
176
+ Nokogiri_error_raise(NULL, error);
177
+ else
178
+ rb_raise(rb_eRuntimeError, "Could not parse document");
179
+
180
+ return Qnil;
181
+ }
182
+
183
+ rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema);
184
+ rb_iv_set(rb_schema, "@errors", errors);
185
+
186
+ return rb_schema;
187
+
188
+ return Qnil;
189
+ }
190
+
191
+ VALUE cNokogiriXmlSchema;
192
+ void init_xml_schema()
193
+ {
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);
197
+
198
+ cNokogiriXmlSchema = klass;
199
+
200
+ rb_define_singleton_method(klass, "read_memory", read_memory, 1);
201
+ rb_define_singleton_method(klass, "from_document", from_document, 1);
202
+
203
+ rb_define_private_method(klass, "validate_document", validate_document, 1);
204
+ rb_define_private_method(klass, "validate_file", validate_file, 1);
205
+ }