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
@@ -0,0 +1,143 @@
1
+ module Nokogiri
2
+ module XML
3
+ module SAX
4
+ class Parser
5
+ # :stopdoc:
6
+
7
+ attr_accessor :cstruct
8
+
9
+ def self.new(doc = XML::SAX::Document.new, encoding = 'UTF-8')
10
+ parser = allocate
11
+ parser.document = doc
12
+ parser.encoding = encoding
13
+ parser.cstruct = LibXML::XmlSaxHandler.allocate
14
+ parser.send(:setup_lambdas)
15
+ parser.instance_variable_set(:@ctxt, nil)
16
+ parser
17
+ end
18
+
19
+ private
20
+
21
+ def setup_lambdas
22
+ @closures = {} # we need to keep references to the closures to avoid GC
23
+
24
+ [ :startDocument, :endDocument, :startElement, :endElement, :characters,
25
+ :comment, :warning, :error, :cdataBlock, :startElementNs, :endElementNs ].each do |sym|
26
+ @closures[sym] = lambda { |*args| send("__internal__#{sym}", *args) } # "i'm your private dancer", etc.
27
+ end
28
+
29
+ @closures.each { |k,v| cstruct[k] = v }
30
+
31
+ cstruct[:initialized] = Nokogiri::LibXML::XmlSaxHandler::XML_SAX2_MAGIC
32
+ end
33
+
34
+ def __internal__startDocument(_)
35
+ if @ctxt && @ctxt[:html] == 0 && @ctxt[:standalone] != -1
36
+ standalone = {
37
+ 0 => 'no',
38
+ 1 => 'yes',
39
+ }[@ctxt[:standalone]]
40
+
41
+ @document.xmldecl @ctxt[:version], @ctxt[:encoding], standalone
42
+ end
43
+ @document.start_document
44
+ end
45
+
46
+ def __internal__endDocument(_)
47
+ @document.end_document
48
+ end
49
+
50
+ def __internal__startElement(_, name, attributes)
51
+ attrs = []
52
+ offset = 0
53
+ if ! attributes.null?
54
+ while ! attributes.get_pointer(LibXML.pointer_offset(offset)).null? do
55
+ cons = attributes.get_array_of_string(LibXML.pointer_offset(offset), 2)
56
+ attrs << cons
57
+ offset += 2
58
+ end
59
+ end
60
+ @document.start_element name, attrs
61
+ end
62
+
63
+ def __internal__endElement(_, name)
64
+ @document.end_element name
65
+ end
66
+
67
+ def __internal__characters(_, data, data_length)
68
+ @document.characters data.slice(0, data_length)
69
+ end
70
+
71
+ def __internal__comment(_, data)
72
+ @document.comment data
73
+ end
74
+
75
+ def __internal__warning(_, msg)
76
+ # TODO: vasprintf here
77
+ @document.warning(msg)
78
+ end
79
+
80
+ def __internal__error(_, msg)
81
+ # TODO: vasprintf here
82
+ @document.error(msg)
83
+ end
84
+
85
+ def __internal__cdataBlock(_, data, data_length)
86
+ @document.cdata_block data.slice(0, data_length)
87
+ end
88
+
89
+ def __internal__startElementNs(_, localname, prefix, uri, nb_namespaces, namespaces, nb_attributes, nb_defaulted, attributes)
90
+ localname = localname.null? ? nil : localname.read_string
91
+ prefix = prefix .null? ? nil : prefix .read_string
92
+ uri = uri .null? ? nil : uri .read_string
93
+
94
+ attr_list = []
95
+ ns_list = []
96
+
97
+ if ! attributes.null?
98
+ # Each attribute is an array of [localname, prefix, URI, value, end]
99
+ (0..(nb_attributes-1)*5).step(5) do |j|
100
+ key = attributes.get_pointer(LibXML.pointer_offset(j)).read_string
101
+ attr_prefix = attributes.get_pointer(LibXML.pointer_offset(j + 1))
102
+ attr_prefix = attr_prefix.null? ? nil : attr_prefix.read_string
103
+ attr_uri = attributes.get_pointer(LibXML.pointer_offset(j + 2))
104
+ attr_uri = attr_uri.null? ? nil : attr_uri.read_string
105
+ value_length = attributes.get_pointer(LibXML.pointer_offset(j+4)).address \
106
+ - attributes.get_pointer(LibXML.pointer_offset(j+3)).address
107
+ value = attributes.get_pointer(LibXML.pointer_offset(j+3)).get_string(0, value_length)
108
+ attr_list << Attribute.new(key, attr_prefix, attr_uri, value)
109
+ end
110
+ end
111
+
112
+ if ! namespaces.null?
113
+ (0..(nb_namespaces-1)*2).step(2) do |j|
114
+ key = namespaces.get_pointer(LibXML.pointer_offset(j))
115
+ key = key.null? ? nil : key.read_string
116
+ value = namespaces.get_pointer(LibXML.pointer_offset(j+1))
117
+ value = value.null? ? nil : value.read_string
118
+ ns_list << [key, value]
119
+ end
120
+ end
121
+
122
+ @document.start_element_namespace(
123
+ localname,
124
+ attr_list,
125
+ prefix,
126
+ uri,
127
+ ns_list
128
+ )
129
+ end
130
+
131
+ def __internal__endElementNs(_, localname, prefix, uri)
132
+ localname = localname.null? ? nil : localname.read_string
133
+ prefix = prefix .null? ? nil : prefix .read_string
134
+ uri = uri .null? ? nil : uri .read_string
135
+
136
+ @document.end_element_namespace(localname, prefix, uri)
137
+ end
138
+
139
+ # :startdoc:
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,79 @@
1
+ # :stopdoc:
2
+ module Nokogiri
3
+ module XML
4
+ module SAX
5
+ class ParserContext
6
+ attr_accessor :cstruct
7
+ attr_accessor :reader_callback
8
+
9
+ def self.memory data
10
+ raise(ArgumentError, 'data cannot be nil') if data.nil?
11
+ raise('data cannot be empty') if data.length == 0
12
+ ctx = LibXML::XmlParserContext.new(
13
+ LibXML.xmlCreateMemoryParserCtxt data, data.length
14
+ )
15
+ pc = allocate
16
+ pc.cstruct = ctx
17
+ pc
18
+ end
19
+
20
+ def self.io io, encoding
21
+ reader_callback = IoCallbacks.reader(io) # keep a reference to prevent it from being GC'd
22
+ sax_ctx = LibXML.xmlCreateIOParserCtxt(
23
+ nil,
24
+ nil,
25
+ reader_callback,
26
+ nil,
27
+ nil,
28
+ encoding
29
+ )
30
+ pc = allocate
31
+ pc.cstruct = LibXML::XmlParserContext.new sax_ctx
32
+ pc.reader_callback = reader_callback
33
+ pc
34
+ end
35
+
36
+ def self.file filename
37
+ ctx = LibXML.xmlCreateFileParserCtxt filename
38
+ pc = allocate
39
+ pc.cstruct = LibXML::XmlParserContext.new ctx
40
+ pc
41
+ end
42
+
43
+ def line
44
+ return nil if cstruct[:input].null?
45
+ input = LibXML::XmlParserInput.new cstruct[:input]
46
+ input[:line]
47
+ end
48
+
49
+ def column
50
+ return nil if cstruct[:input].null?
51
+ input = LibXML::XmlParserInput.new cstruct[:input]
52
+ input[:col]
53
+ end
54
+
55
+ def parse_with sax_handler, type = :xml
56
+ raise ArgumentError unless XML::SAX::Parser === sax_handler
57
+ sax = sax_handler.cstruct
58
+ cstruct[:sax] = sax
59
+
60
+ sax_handler.instance_variable_set(:@ctxt, cstruct)
61
+
62
+ LibXML.send(:"#{type}ParseDocument", cstruct)
63
+
64
+ cstruct[:sax] = nil
65
+ LibXML.xmlFreeDoc cstruct[:myDoc] unless cstruct[:myDoc].null?
66
+ end
67
+
68
+ def replace_entities=(value)
69
+ self.cstruct[:replaceEntities] = value ? 1 : 0
70
+ end
71
+
72
+ def replace_entities
73
+ self.cstruct[:replaceEntities] == 0 ? false : true
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ # :startdoc:
@@ -0,0 +1,51 @@
1
+ module Nokogiri
2
+ module XML
3
+ module SAX
4
+ class PushParser
5
+
6
+ attr_accessor :cstruct # :nodoc:
7
+
8
+ def options
9
+ cstruct[:options]
10
+ end
11
+
12
+ def options=(user_options)
13
+ if LibXML.xmlCtxtUseOptions(cstruct, user_options) != 0
14
+ raise RuntimeError, "Cannot set XML parser context options"
15
+ end
16
+ nil
17
+ end
18
+
19
+ private
20
+
21
+ def native_write(chunk, last_chunk) # :nodoc:
22
+ size = 0
23
+ unless chunk.nil?
24
+ chunk = chunk.to_s
25
+ size = chunk.length
26
+ end
27
+
28
+ if LibXML.xmlParseChunk(cstruct, chunk, size, last_chunk ? 1 : 0) != 0
29
+ if (cstruct[:options] & XML::ParseOptions::RECOVER) == 0
30
+ error = LibXML.xmlCtxtGetLastError(cstruct)
31
+ raise Nokogiri::XML::SyntaxError.wrap(error)
32
+ end
33
+ end
34
+
35
+ self
36
+ end
37
+
38
+ def initialize_native(sax, filename) # :nodoc:
39
+ filename = filename.to_s unless filename.nil?
40
+ ctx_ptr = LibXML.xmlCreatePushParserCtxt(
41
+ sax.cstruct, nil, nil, 0, filename
42
+ )
43
+ raise(RuntimeError, "Could not create a parser context") if ctx_ptr.null?
44
+ self.cstruct = LibXML::XmlSaxPushParserContext.new(ctx_ptr) ;
45
+ self
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,109 @@
1
+ module Nokogiri
2
+ module XML
3
+ class Schema
4
+ # :stopdoc:
5
+
6
+ attr_accessor :cstruct
7
+
8
+ def validate_document document
9
+ errors = []
10
+
11
+ ctx = LibXML.xmlSchemaNewValidCtxt(cstruct)
12
+ raise RuntimeError.new("Could not create a validation context") if ctx.null?
13
+
14
+ LibXML.xmlSchemaSetValidStructuredErrors(ctx,
15
+ SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
16
+
17
+ LibXML.xmlSchemaValidateDoc(ctx, document.cstruct)
18
+
19
+ LibXML.xmlSchemaFreeValidCtxt(ctx)
20
+
21
+ errors
22
+ end
23
+ private :validate_document
24
+
25
+ def validate_file filename
26
+ errors = []
27
+
28
+ ctx = LibXML.xmlSchemaNewValidCtxt(cstruct)
29
+ raise RuntimeError.new("Could not create a validation context") if ctx.null?
30
+
31
+ LibXML.xmlSchemaSetValidStructuredErrors(ctx,
32
+ SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
33
+
34
+ LibXML.xmlSchemaValidateFile(ctx, filename, 0)
35
+
36
+ LibXML.xmlSchemaFreeValidCtxt(ctx)
37
+
38
+ errors
39
+ end
40
+ private :validate_document
41
+
42
+ def self.read_memory content
43
+ content_copy = FFI::MemoryPointer.from_string(content)
44
+ ctx = LibXML.xmlSchemaNewMemParserCtxt(content_copy, content.length)
45
+
46
+ errors = []
47
+
48
+ LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(errors))
49
+ LibXML.xmlSchemaSetParserStructuredErrors(ctx, SyntaxError.error_array_pusher(errors), nil) unless Nokogiri.is_2_6_16?
50
+
51
+ schema_ptr = LibXML.xmlSchemaParse(ctx)
52
+
53
+ LibXML.xmlSetStructuredErrorFunc(nil, nil)
54
+ LibXML.xmlSchemaFreeParserCtxt(ctx)
55
+
56
+ if schema_ptr.null?
57
+ error = LibXML.xmlGetLastError
58
+ if error
59
+ raise SyntaxError.wrap(error)
60
+ else
61
+ raise RuntimeError, "Could not parse document"
62
+ end
63
+ end
64
+
65
+ schema = allocate
66
+ schema.cstruct = LibXML::XmlSchema.new schema_ptr
67
+ schema.errors = errors
68
+ schema
69
+ end
70
+
71
+ def self.from_document document
72
+ ctx = LibXML.xmlSchemaNewDocParserCtxt(document.document.cstruct)
73
+
74
+ errors = []
75
+
76
+ LibXML.xmlSetStructuredErrorFunc(nil, SyntaxError.error_array_pusher(errors))
77
+ unless Nokogiri.is_2_6_16?
78
+ LibXML.xmlSchemaSetParserStructuredErrors(
79
+ ctx,
80
+ SyntaxError.error_array_pusher(errors),
81
+ nil
82
+ )
83
+ end
84
+
85
+ schema_ptr = LibXML.xmlSchemaParse(ctx)
86
+
87
+ LibXML.xmlSetStructuredErrorFunc(nil, nil)
88
+ LibXML.xmlSchemaFreeParserCtxt(ctx)
89
+
90
+ if schema_ptr.null?
91
+ error = LibXML.xmlGetLastError
92
+ if error
93
+ raise SyntaxError.wrap(error)
94
+ else
95
+ raise RuntimeError, "Could not parse document"
96
+ end
97
+ end
98
+
99
+ schema = allocate
100
+ schema.cstruct = LibXML::XmlSchema.new schema_ptr
101
+ schema.errors = errors
102
+ schema
103
+ end
104
+
105
+ # :startdoc:
106
+ end
107
+ end
108
+ end
109
+
@@ -0,0 +1,98 @@
1
+ # :stopdoc:
2
+ module Nokogiri
3
+ module XML
4
+ class SyntaxError < ::Nokogiri::SyntaxError
5
+
6
+ attr_accessor :cstruct
7
+
8
+ def initialize(message)
9
+ self.cstruct = LibXML::XmlSyntaxError.new(LibXML::XmlSyntaxError.allocate())
10
+ self.cstruct[:message] = LibXML.xmlStrdup(message)
11
+ end
12
+
13
+ def domain
14
+ cstruct[:domain]
15
+ end
16
+
17
+ def code
18
+ cstruct[:code]
19
+ end
20
+
21
+ def message
22
+ val = cstruct[:message]
23
+ val.null? ? nil : val.read_string.chomp
24
+ end
25
+ undef_method :inspect
26
+ alias_method :inspect, :message
27
+ undef_method :to_s
28
+ alias_method :to_s, :message
29
+
30
+ def message=(string)
31
+ unless cstruct[:message].null?
32
+ LibXML.xmlFree(cstruct[:message])
33
+ end
34
+ cstruct[:message] = LibXML.xmlStrdup(string)
35
+ string
36
+ end
37
+
38
+ def initialize_copy(other)
39
+ raise ArgumentError, "node must be a Nokogiri::XML::SyntaxError" unless other.is_a?(Nokogiri::XML::SyntaxError)
40
+ LibXML.xmlCopyError(other.cstruct, cstruct)
41
+ self
42
+ end
43
+
44
+ def level
45
+ cstruct[:level]
46
+ end
47
+
48
+ def file
49
+ cstruct[:file].null? ? nil : cstruct[:file]
50
+ end
51
+
52
+ def line
53
+ cstruct[:line]
54
+ end
55
+
56
+ def str1
57
+ cstruct[:str1]
58
+ end
59
+
60
+ def str2
61
+ cstruct[:str]
62
+ end
63
+
64
+ def str3
65
+ cstruct[:str3]
66
+ end
67
+
68
+ def int1
69
+ cstruct[:int1]
70
+ end
71
+
72
+ def column
73
+ cstruct[:int2]
74
+ end
75
+ alias_method :int2, :column
76
+
77
+ class << self
78
+ def error_array_pusher(array)
79
+ Proc.new do |_ignored_, error|
80
+ array << wrap(error) if array
81
+ end
82
+ end
83
+
84
+ def wrap(error_ptr)
85
+ error_struct = LibXML::XmlSyntaxError.allocate
86
+ LibXML.xmlCopyError(error_ptr, error_struct)
87
+ error_cstruct = LibXML::XmlSyntaxError.new(error_struct)
88
+ error = self.allocate # will generate XML::XPath::SyntaxError or XML::SyntaxError
89
+ error.cstruct = error_cstruct
90
+ error
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+
97
+ end
98
+ # :startdoc: