nokogiri 1.8.5 → 1.13.6

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 (356) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -21
  3. data/LICENSE-DEPENDENCIES.md +1159 -868
  4. data/LICENSE.md +5 -28
  5. data/README.md +196 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -59
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +750 -420
  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 +119 -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 +228 -91
  18. data/ext/nokogiri/nokogiri.h +191 -89
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +41 -36
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +13 -18
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -216
  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 +43 -18
  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 +61 -52
  33. data/ext/nokogiri/xml_node.c +1044 -616
  34. data/ext/nokogiri/xml_node_set.c +174 -162
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +226 -175
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +112 -112
  39. data/ext/nokogiri/xml_sax_parser_context.c +112 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +13 -17
  44. data/ext/nokogiri/xml_xpath_context.c +223 -115
  45. data/ext/nokogiri/xslt_stylesheet.c +265 -173
  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 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -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 +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +218 -91
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  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/{html → html4}/document.rb +103 -105
  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 +17 -16
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +91 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +100 -0
  118. data/lib/nokogiri/html5.rb +478 -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 +222 -0
  123. data/lib/nokogiri/version.rb +3 -108
  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 +97 -53
  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 +224 -86
  130. data/lib/nokogiri/xml/document_fragment.rb +57 -44
  131. data/lib/nokogiri/xml/dtd.rb +4 -2
  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 +2 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +10 -5
  138. data/lib/nokogiri/xml/node.rb +895 -377
  139. data/lib/nokogiri/xml/node_set.rb +92 -65
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +22 -8
  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 +38 -34
  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 +112 -72
  155. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  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 -37
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +49 -65
  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.14.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +220 -266
  177. data/.autotest +0 -22
  178. data/.cross_rubies +0 -8
  179. data/.editorconfig +0 -17
  180. data/.gemtest +0 -0
  181. data/.travis.yml +0 -63
  182. data/CHANGELOG.md +0 -1368
  183. data/CONTRIBUTING.md +0 -42
  184. data/C_CODING_STYLE.rdoc +0 -33
  185. data/Gemfile-libxml-ruby +0 -3
  186. data/Manifest.txt +0 -370
  187. data/ROADMAP.md +0 -111
  188. data/Rakefile +0 -348
  189. data/SECURITY.md +0 -19
  190. data/STANDARD_RESPONSES.md +0 -47
  191. data/Y_U_NO_GEMSPEC.md +0 -155
  192. data/appveyor.yml +0 -29
  193. data/build_all +0 -44
  194. data/ext/nokogiri/html_document.c +0 -170
  195. data/ext/nokogiri/html_document.h +0 -10
  196. data/ext/nokogiri/html_element_description.c +0 -279
  197. data/ext/nokogiri/html_element_description.h +0 -10
  198. data/ext/nokogiri/html_entity_lookup.c +0 -32
  199. data/ext/nokogiri/html_entity_lookup.h +0 -8
  200. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  201. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  202. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  203. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  204. data/ext/nokogiri/xml_attr.h +0 -9
  205. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  206. data/ext/nokogiri/xml_cdata.h +0 -9
  207. data/ext/nokogiri/xml_comment.h +0 -9
  208. data/ext/nokogiri/xml_document.h +0 -23
  209. data/ext/nokogiri/xml_document_fragment.h +0 -10
  210. data/ext/nokogiri/xml_dtd.h +0 -10
  211. data/ext/nokogiri/xml_element_content.h +0 -10
  212. data/ext/nokogiri/xml_element_decl.h +0 -9
  213. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  214. data/ext/nokogiri/xml_entity_decl.h +0 -10
  215. data/ext/nokogiri/xml_entity_reference.h +0 -9
  216. data/ext/nokogiri/xml_io.c +0 -61
  217. data/ext/nokogiri/xml_io.h +0 -11
  218. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  219. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  220. data/ext/nokogiri/xml_namespace.h +0 -15
  221. data/ext/nokogiri/xml_node.h +0 -13
  222. data/ext/nokogiri/xml_node_set.h +0 -12
  223. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  224. data/ext/nokogiri/xml_reader.h +0 -10
  225. data/ext/nokogiri/xml_relax_ng.h +0 -9
  226. data/ext/nokogiri/xml_sax_parser.h +0 -39
  227. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  228. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  229. data/ext/nokogiri/xml_schema.h +0 -9
  230. data/ext/nokogiri/xml_syntax_error.h +0 -13
  231. data/ext/nokogiri/xml_text.h +0 -9
  232. data/ext/nokogiri/xml_xpath_context.h +0 -10
  233. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  234. data/lib/nokogiri/html/document_fragment.rb +0 -49
  235. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  236. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  237. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  238. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  239. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  240. data/patches/sort-patches-by-date +0 -25
  241. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  242. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  243. data/suppressions/README.txt +0 -1
  244. data/suppressions/nokogiri_ruby-2.supp +0 -10
  245. data/tasks/test.rb +0 -100
  246. data/test/css/test_nthiness.rb +0 -226
  247. data/test/css/test_parser.rb +0 -386
  248. data/test/css/test_tokenizer.rb +0 -215
  249. data/test/css/test_xpath_visitor.rb +0 -96
  250. data/test/decorators/test_slop.rb +0 -23
  251. data/test/files/2ch.html +0 -108
  252. data/test/files/GH_1042.html +0 -18
  253. data/test/files/address_book.rlx +0 -12
  254. data/test/files/address_book.xml +0 -10
  255. data/test/files/atom.xml +0 -344
  256. data/test/files/bar/bar.xsd +0 -4
  257. data/test/files/bogus.xml +0 -0
  258. data/test/files/dont_hurt_em_why.xml +0 -422
  259. data/test/files/encoding.html +0 -82
  260. data/test/files/encoding.xhtml +0 -84
  261. data/test/files/exslt.xml +0 -8
  262. data/test/files/exslt.xslt +0 -35
  263. data/test/files/foo/foo.xsd +0 -4
  264. data/test/files/metacharset.html +0 -10
  265. data/test/files/namespace_pressure_test.xml +0 -1684
  266. data/test/files/noencoding.html +0 -47
  267. data/test/files/po.xml +0 -32
  268. data/test/files/po.xsd +0 -66
  269. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  270. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  271. data/test/files/saml/xenc_schema.xsd +0 -146
  272. data/test/files/saml/xmldsig_schema.xsd +0 -318
  273. data/test/files/shift_jis.html +0 -10
  274. data/test/files/shift_jis.xml +0 -5
  275. data/test/files/shift_jis_no_charset.html +0 -9
  276. data/test/files/slow-xpath.xml +0 -25509
  277. data/test/files/snuggles.xml +0 -3
  278. data/test/files/staff.dtd +0 -10
  279. data/test/files/staff.xml +0 -59
  280. data/test/files/staff.xslt +0 -32
  281. data/test/files/test_document_url/bar.xml +0 -2
  282. data/test/files/test_document_url/document.dtd +0 -4
  283. data/test/files/test_document_url/document.xml +0 -6
  284. data/test/files/tlm.html +0 -851
  285. data/test/files/to_be_xincluded.xml +0 -2
  286. data/test/files/valid_bar.xml +0 -2
  287. data/test/files/xinclude.xml +0 -4
  288. data/test/helper.rb +0 -271
  289. data/test/html/sax/test_parser.rb +0 -168
  290. data/test/html/sax/test_parser_context.rb +0 -46
  291. data/test/html/sax/test_parser_text.rb +0 -163
  292. data/test/html/sax/test_push_parser.rb +0 -87
  293. data/test/html/test_attributes.rb +0 -85
  294. data/test/html/test_builder.rb +0 -164
  295. data/test/html/test_document.rb +0 -712
  296. data/test/html/test_document_encoding.rb +0 -143
  297. data/test/html/test_document_fragment.rb +0 -310
  298. data/test/html/test_element_description.rb +0 -105
  299. data/test/html/test_named_characters.rb +0 -14
  300. data/test/html/test_node.rb +0 -212
  301. data/test/html/test_node_encoding.rb +0 -91
  302. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  303. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  304. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  305. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  306. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  308. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  309. data/test/test_convert_xpath.rb +0 -135
  310. data/test/test_css_cache.rb +0 -47
  311. data/test/test_encoding_handler.rb +0 -48
  312. data/test/test_memory_leak.rb +0 -156
  313. data/test/test_nokogiri.rb +0 -138
  314. data/test/test_soap4r_sax.rb +0 -52
  315. data/test/test_xslt_transforms.rb +0 -314
  316. data/test/xml/node/test_save_options.rb +0 -28
  317. data/test/xml/node/test_subclass.rb +0 -44
  318. data/test/xml/sax/test_parser.rb +0 -402
  319. data/test/xml/sax/test_parser_context.rb +0 -115
  320. data/test/xml/sax/test_parser_text.rb +0 -202
  321. data/test/xml/sax/test_push_parser.rb +0 -265
  322. data/test/xml/test_attr.rb +0 -74
  323. data/test/xml/test_attribute_decl.rb +0 -86
  324. data/test/xml/test_builder.rb +0 -341
  325. data/test/xml/test_c14n.rb +0 -180
  326. data/test/xml/test_cdata.rb +0 -54
  327. data/test/xml/test_comment.rb +0 -40
  328. data/test/xml/test_document.rb +0 -982
  329. data/test/xml/test_document_encoding.rb +0 -31
  330. data/test/xml/test_document_fragment.rb +0 -298
  331. data/test/xml/test_dtd.rb +0 -187
  332. data/test/xml/test_dtd_encoding.rb +0 -31
  333. data/test/xml/test_element_content.rb +0 -56
  334. data/test/xml/test_element_decl.rb +0 -73
  335. data/test/xml/test_entity_decl.rb +0 -122
  336. data/test/xml/test_entity_reference.rb +0 -262
  337. data/test/xml/test_namespace.rb +0 -96
  338. data/test/xml/test_node.rb +0 -1325
  339. data/test/xml/test_node_attributes.rb +0 -115
  340. data/test/xml/test_node_encoding.rb +0 -75
  341. data/test/xml/test_node_inheritance.rb +0 -32
  342. data/test/xml/test_node_reparenting.rb +0 -592
  343. data/test/xml/test_node_set.rb +0 -809
  344. data/test/xml/test_parse_options.rb +0 -64
  345. data/test/xml/test_processing_instruction.rb +0 -30
  346. data/test/xml/test_reader.rb +0 -620
  347. data/test/xml/test_reader_encoding.rb +0 -134
  348. data/test/xml/test_relax_ng.rb +0 -60
  349. data/test/xml/test_schema.rb +0 -142
  350. data/test/xml/test_syntax_error.rb +0 -36
  351. data/test/xml/test_text.rb +0 -60
  352. data/test/xml/test_unparented_node.rb +0 -483
  353. data/test/xml/test_xinclude.rb +0 -83
  354. data/test/xml/test_xpath.rb +0 -470
  355. data/test/xslt/test_custom_functions.rb +0 -133
  356. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,13 +1,17 @@
1
- #include <xml_reader.h>
1
+ #include <nokogiri.h>
2
2
 
3
- static void dealloc(xmlTextReaderPtr reader)
3
+ VALUE cNokogiriXmlReader;
4
+
5
+ static void
6
+ dealloc(xmlTextReaderPtr reader)
4
7
  {
5
8
  NOKOGIRI_DEBUG_START(reader);
6
9
  xmlFreeTextReader(reader);
7
10
  NOKOGIRI_DEBUG_END(reader);
8
11
  }
9
12
 
10
- static int has_attributes(xmlTextReaderPtr reader)
13
+ static int
14
+ has_attributes(xmlTextReaderPtr reader)
11
15
  {
12
16
  /*
13
17
  * this implementation of xmlTextReaderHasAttributes explicitly includes
@@ -16,47 +20,39 @@ static int has_attributes(xmlTextReaderPtr reader)
16
20
  */
17
21
  xmlNodePtr node ;
18
22
  node = xmlTextReaderCurrentNode(reader);
19
- if (node == NULL)
20
- return(0);
23
+ if (node == NULL) {
24
+ return (0);
25
+ }
21
26
 
22
27
  if ((node->type == XML_ELEMENT_NODE) &&
23
- ((node->properties != NULL) || (node->nsDef != NULL)))
24
- return(1);
25
- return(0);
28
+ ((node->properties != NULL) || (node->nsDef != NULL))) {
29
+ return (1);
30
+ }
31
+ return (0);
26
32
  }
27
33
 
28
- static void Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash)
34
+ static void
35
+ Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash)
29
36
  {
30
37
  xmlNsPtr ns;
31
- static char buffer[XMLNS_BUFFER_LEN] ;
32
- char *key ;
33
- size_t keylen ;
38
+ VALUE key;
34
39
 
35
- if (node->type != XML_ELEMENT_NODE) return ;
40
+ if (node->type != XML_ELEMENT_NODE) { return ; }
36
41
 
37
42
  ns = node->nsDef;
38
43
  while (ns != NULL) {
39
44
 
40
- keylen = XMLNS_PREFIX_LEN + (ns->prefix ? (strlen((const char*)ns->prefix) + 1) : 0) ;
41
- if (keylen > XMLNS_BUFFER_LEN) {
42
- key = (char*)malloc(keylen) ;
43
- } else {
44
- key = buffer ;
45
- }
46
-
45
+ key = rb_enc_str_new_cstr(XMLNS_PREFIX, rb_utf8_encoding());
47
46
  if (ns->prefix) {
48
- sprintf(key, "%s:%s", XMLNS_PREFIX, ns->prefix);
49
- } else {
50
- sprintf(key, "%s", XMLNS_PREFIX);
47
+ rb_str_cat_cstr(key, ":");
48
+ rb_str_cat_cstr(key, (const char *)ns->prefix);
51
49
  }
52
50
 
51
+ key = rb_str_conv_enc(key, rb_utf8_encoding(), rb_default_internal_encoding());
53
52
  rb_hash_aset(attr_hash,
54
- NOKOGIRI_STR_NEW2(key),
55
- (ns->href ? NOKOGIRI_STR_NEW2(ns->href) : Qnil)
56
- );
57
- if (key != buffer) {
58
- free(key);
59
- }
53
+ key,
54
+ (ns->href ? NOKOGIRI_STR_NEW2(ns->href) : Qnil)
55
+ );
60
56
  ns = ns->next ;
61
57
  }
62
58
  }
@@ -68,15 +64,16 @@ static void Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash)
68
64
  *
69
65
  * Was an attribute generated from the default value in the DTD or schema?
70
66
  */
71
- static VALUE default_eh(VALUE self)
67
+ static VALUE
68
+ default_eh(VALUE self)
72
69
  {
73
70
  xmlTextReaderPtr reader;
74
71
  int eh;
75
72
 
76
73
  Data_Get_Struct(self, xmlTextReader, reader);
77
74
  eh = xmlTextReaderIsDefault(reader);
78
- if(eh == 0) return Qfalse;
79
- if(eh == 1) return Qtrue;
75
+ if (eh == 0) { return Qfalse; }
76
+ if (eh == 1) { return Qtrue; }
80
77
 
81
78
  return Qnil;
82
79
  }
@@ -87,15 +84,16 @@ static VALUE default_eh(VALUE self)
87
84
  *
88
85
  * Does this node have a text value?
89
86
  */
90
- static VALUE value_eh(VALUE self)
87
+ static VALUE
88
+ value_eh(VALUE self)
91
89
  {
92
90
  xmlTextReaderPtr reader;
93
91
  int eh;
94
92
 
95
93
  Data_Get_Struct(self, xmlTextReader, reader);
96
94
  eh = xmlTextReaderHasValue(reader);
97
- if(eh == 0) return Qfalse;
98
- if(eh == 1) return Qtrue;
95
+ if (eh == 0) { return Qfalse; }
96
+ if (eh == 1) { return Qtrue; }
99
97
 
100
98
  return Qnil;
101
99
  }
@@ -106,15 +104,16 @@ static VALUE value_eh(VALUE self)
106
104
  *
107
105
  * Does this node have attributes?
108
106
  */
109
- static VALUE attributes_eh(VALUE self)
107
+ static VALUE
108
+ attributes_eh(VALUE self)
110
109
  {
111
110
  xmlTextReaderPtr reader;
112
111
  int eh;
113
112
 
114
113
  Data_Get_Struct(self, xmlTextReader, reader);
115
114
  eh = has_attributes(reader);
116
- if(eh == 0) return Qfalse;
117
- if(eh == 1) return Qtrue;
115
+ if (eh == 0) { return Qfalse; }
116
+ if (eh == 1) { return Qtrue; }
118
117
 
119
118
  return Qnil;
120
119
  }
@@ -125,7 +124,8 @@ static VALUE attributes_eh(VALUE self)
125
124
  *
126
125
  * Get a hash of namespaces for this Node
127
126
  */
128
- static VALUE namespaces(VALUE self)
127
+ static VALUE
128
+ namespaces(VALUE self)
129
129
  {
130
130
  xmlTextReaderPtr reader;
131
131
  xmlNodePtr ptr;
@@ -135,11 +135,12 @@ static VALUE namespaces(VALUE self)
135
135
 
136
136
  attr = rb_hash_new() ;
137
137
 
138
- if (! has_attributes(reader))
138
+ if (! has_attributes(reader)) {
139
139
  return attr ;
140
+ }
140
141
 
141
142
  ptr = xmlTextReaderExpand(reader);
142
- if(ptr == NULL) return Qnil;
143
+ if (ptr == NULL) { return Qnil; }
143
144
 
144
145
  Nokogiri_xml_node_namespaces(ptr, attr);
145
146
 
@@ -147,30 +148,37 @@ static VALUE namespaces(VALUE self)
147
148
  }
148
149
 
149
150
  /*
150
- * call-seq:
151
- * attribute_nodes
152
- *
153
- * Get a list of attributes for this Node
151
+ :call-seq: attribute_nodes() → Array<Nokogiri::XML::Attr>
152
+
153
+ Get the attributes of the current node as an Array of Attr
154
154
  */
155
- static VALUE attribute_nodes(VALUE self)
155
+ static VALUE
156
+ rb_xml_reader_attribute_nodes(VALUE rb_reader)
156
157
  {
157
- xmlTextReaderPtr reader;
158
- xmlNodePtr ptr;
159
- VALUE attr ;
158
+ xmlTextReaderPtr c_reader;
159
+ xmlNodePtr c_node;
160
+ VALUE attr_nodes;
161
+ int j;
160
162
 
161
- Data_Get_Struct(self, xmlTextReader, reader);
163
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
162
164
 
163
- attr = rb_ary_new() ;
165
+ if (! has_attributes(c_reader)) {
166
+ return rb_ary_new() ;
167
+ }
164
168
 
165
- if (! has_attributes(reader))
166
- return attr ;
169
+ c_node = xmlTextReaderExpand(c_reader);
170
+ if (c_node == NULL) {
171
+ return Qnil;
172
+ }
167
173
 
168
- ptr = xmlTextReaderExpand(reader);
169
- if(ptr == NULL) return Qnil;
174
+ attr_nodes = noko_xml_node_attrs(c_node);
170
175
 
171
- Nokogiri_xml_node_properties(ptr, attr);
176
+ /* ensure that the Reader won't be GCed as long as a node is referenced */
177
+ for (j = 0 ; j < RARRAY_LEN(attr_nodes) ; j++) {
178
+ rb_iv_set(rb_ary_entry(attr_nodes, j), "@reader", rb_reader);
179
+ }
172
180
 
173
- return attr ;
181
+ return attr_nodes;
174
182
  }
175
183
 
176
184
  /*
@@ -179,7 +187,8 @@ static VALUE attribute_nodes(VALUE self)
179
187
  *
180
188
  * Get the value of attribute at +index+
181
189
  */
182
- static VALUE attribute_at(VALUE self, VALUE index)
190
+ static VALUE
191
+ attribute_at(VALUE self, VALUE index)
183
192
  {
184
193
  xmlTextReaderPtr reader;
185
194
  xmlChar *value;
@@ -187,14 +196,14 @@ static VALUE attribute_at(VALUE self, VALUE index)
187
196
 
188
197
  Data_Get_Struct(self, xmlTextReader, reader);
189
198
 
190
- if(NIL_P(index)) return Qnil;
199
+ if (NIL_P(index)) { return Qnil; }
191
200
  index = rb_Integer(index);
192
201
 
193
202
  value = xmlTextReaderGetAttributeNo(
194
- reader,
195
- (int)NUM2INT(index)
196
- );
197
- if(value == NULL) return Qnil;
203
+ reader,
204
+ (int)NUM2INT(index)
205
+ );
206
+ if (value == NULL) { return Qnil; }
198
207
 
199
208
  rb_value = NOKOGIRI_STR_NEW2(value);
200
209
  xmlFree(value);
@@ -207,7 +216,8 @@ static VALUE attribute_at(VALUE self, VALUE index)
207
216
  *
208
217
  * Get the value of attribute named +name+
209
218
  */
210
- static VALUE reader_attribute(VALUE self, VALUE name)
219
+ static VALUE
220
+ reader_attribute(VALUE self, VALUE name)
211
221
  {
212
222
  xmlTextReaderPtr reader;
213
223
  xmlChar *value ;
@@ -215,11 +225,11 @@ static VALUE reader_attribute(VALUE self, VALUE name)
215
225
 
216
226
  Data_Get_Struct(self, xmlTextReader, reader);
217
227
 
218
- if(NIL_P(name)) return Qnil;
228
+ if (NIL_P(name)) { return Qnil; }
219
229
  name = StringValue(name) ;
220
230
 
221
- value = xmlTextReaderGetAttribute(reader, (xmlChar*)StringValueCStr(name));
222
- if(value == NULL) return Qnil;
231
+ value = xmlTextReaderGetAttribute(reader, (xmlChar *)StringValueCStr(name));
232
+ if (value == NULL) { return Qnil; }
223
233
 
224
234
  rb_value = NOKOGIRI_STR_NEW2(value);
225
235
  xmlFree(value);
@@ -232,14 +242,15 @@ static VALUE reader_attribute(VALUE self, VALUE name)
232
242
  *
233
243
  * Get the number of attributes for the current node
234
244
  */
235
- static VALUE attribute_count(VALUE self)
245
+ static VALUE
246
+ attribute_count(VALUE self)
236
247
  {
237
248
  xmlTextReaderPtr reader;
238
249
  int count;
239
250
 
240
251
  Data_Get_Struct(self, xmlTextReader, reader);
241
252
  count = xmlTextReaderAttributeCount(reader);
242
- if(count == -1) return Qnil;
253
+ if (count == -1) { return Qnil; }
243
254
 
244
255
  return INT2NUM((long)count);
245
256
  }
@@ -250,14 +261,15 @@ static VALUE attribute_count(VALUE self)
250
261
  *
251
262
  * Get the depth of the node
252
263
  */
253
- static VALUE depth(VALUE self)
264
+ static VALUE
265
+ depth(VALUE self)
254
266
  {
255
267
  xmlTextReaderPtr reader;
256
268
  int depth;
257
269
 
258
270
  Data_Get_Struct(self, xmlTextReader, reader);
259
271
  depth = xmlTextReaderDepth(reader);
260
- if(depth == -1) return Qnil;
272
+ if (depth == -1) { return Qnil; }
261
273
 
262
274
  return INT2NUM((long)depth);
263
275
  }
@@ -268,14 +280,15 @@ static VALUE depth(VALUE self)
268
280
  *
269
281
  * Get the XML version of the document being read
270
282
  */
271
- static VALUE xml_version(VALUE self)
283
+ static VALUE
284
+ xml_version(VALUE self)
272
285
  {
273
286
  xmlTextReaderPtr reader;
274
287
  const char *version;
275
288
 
276
289
  Data_Get_Struct(self, xmlTextReader, reader);
277
290
  version = (const char *)xmlTextReaderConstXmlVersion(reader);
278
- if(version == NULL) return Qnil;
291
+ if (version == NULL) { return Qnil; }
279
292
 
280
293
  return NOKOGIRI_STR_NEW2(version);
281
294
  }
@@ -286,14 +299,15 @@ static VALUE xml_version(VALUE self)
286
299
  *
287
300
  * Get the xml:lang scope within which the node resides.
288
301
  */
289
- static VALUE lang(VALUE self)
302
+ static VALUE
303
+ lang(VALUE self)
290
304
  {
291
305
  xmlTextReaderPtr reader;
292
306
  const char *lang;
293
307
 
294
308
  Data_Get_Struct(self, xmlTextReader, reader);
295
309
  lang = (const char *)xmlTextReaderConstXmlLang(reader);
296
- if(lang == NULL) return Qnil;
310
+ if (lang == NULL) { return Qnil; }
297
311
 
298
312
  return NOKOGIRI_STR_NEW2(lang);
299
313
  }
@@ -304,14 +318,15 @@ static VALUE lang(VALUE self)
304
318
  *
305
319
  * Get the text value of the node if present. Returns a utf-8 encoded string.
306
320
  */
307
- static VALUE value(VALUE self)
321
+ static VALUE
322
+ value(VALUE self)
308
323
  {
309
324
  xmlTextReaderPtr reader;
310
325
  const char *value;
311
326
 
312
327
  Data_Get_Struct(self, xmlTextReader, reader);
313
328
  value = (const char *)xmlTextReaderConstValue(reader);
314
- if(value == NULL) return Qnil;
329
+ if (value == NULL) { return Qnil; }
315
330
 
316
331
  return NOKOGIRI_STR_NEW2(value);
317
332
  }
@@ -322,14 +337,15 @@ static VALUE value(VALUE self)
322
337
  *
323
338
  * Get the shorthand reference to the namespace associated with the node.
324
339
  */
325
- static VALUE prefix(VALUE self)
340
+ static VALUE
341
+ prefix(VALUE self)
326
342
  {
327
343
  xmlTextReaderPtr reader;
328
344
  const char *prefix;
329
345
 
330
346
  Data_Get_Struct(self, xmlTextReader, reader);
331
347
  prefix = (const char *)xmlTextReaderConstPrefix(reader);
332
- if(prefix == NULL) return Qnil;
348
+ if (prefix == NULL) { return Qnil; }
333
349
 
334
350
  return NOKOGIRI_STR_NEW2(prefix);
335
351
  }
@@ -340,14 +356,15 @@ static VALUE prefix(VALUE self)
340
356
  *
341
357
  * Get the URI defining the namespace associated with the node
342
358
  */
343
- static VALUE namespace_uri(VALUE self)
359
+ static VALUE
360
+ namespace_uri(VALUE self)
344
361
  {
345
362
  xmlTextReaderPtr reader;
346
363
  const char *uri;
347
364
 
348
365
  Data_Get_Struct(self, xmlTextReader, reader);
349
366
  uri = (const char *)xmlTextReaderConstNamespaceUri(reader);
350
- if(uri == NULL) return Qnil;
367
+ if (uri == NULL) { return Qnil; }
351
368
 
352
369
  return NOKOGIRI_STR_NEW2(uri);
353
370
  }
@@ -358,14 +375,15 @@ static VALUE namespace_uri(VALUE self)
358
375
  *
359
376
  * Get the local name of the node
360
377
  */
361
- static VALUE local_name(VALUE self)
378
+ static VALUE
379
+ local_name(VALUE self)
362
380
  {
363
381
  xmlTextReaderPtr reader;
364
382
  const char *name;
365
383
 
366
384
  Data_Get_Struct(self, xmlTextReader, reader);
367
385
  name = (const char *)xmlTextReaderConstLocalName(reader);
368
- if(name == NULL) return Qnil;
386
+ if (name == NULL) { return Qnil; }
369
387
 
370
388
  return NOKOGIRI_STR_NEW2(name);
371
389
  }
@@ -376,14 +394,15 @@ static VALUE local_name(VALUE self)
376
394
  *
377
395
  * Get the name of the node. Returns a utf-8 encoded string.
378
396
  */
379
- static VALUE name(VALUE self)
397
+ static VALUE
398
+ name(VALUE self)
380
399
  {
381
400
  xmlTextReaderPtr reader;
382
401
  const char *name;
383
402
 
384
403
  Data_Get_Struct(self, xmlTextReader, reader);
385
404
  name = (const char *)xmlTextReaderConstName(reader);
386
- if(name == NULL) return Qnil;
405
+ if (name == NULL) { return Qnil; }
387
406
 
388
407
  return NOKOGIRI_STR_NEW2(name);
389
408
  }
@@ -394,16 +413,24 @@ static VALUE name(VALUE self)
394
413
  *
395
414
  * Get the xml:base of the node
396
415
  */
397
- static VALUE base_uri(VALUE self)
416
+ static VALUE
417
+ rb_xml_reader_base_uri(VALUE rb_reader)
398
418
  {
399
- xmlTextReaderPtr reader;
400
- const char * base_uri;
419
+ VALUE rb_base_uri;
420
+ xmlTextReaderPtr c_reader;
421
+ xmlChar *c_base_uri;
401
422
 
402
- Data_Get_Struct(self, xmlTextReader, reader);
403
- base_uri = (const char *)xmlTextReaderBaseUri(reader);
404
- if (base_uri == NULL) return Qnil;
423
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
405
424
 
406
- return NOKOGIRI_STR_NEW2(base_uri);
425
+ c_base_uri = xmlTextReaderBaseUri(c_reader);
426
+ if (c_base_uri == NULL) {
427
+ return Qnil;
428
+ }
429
+
430
+ rb_base_uri = NOKOGIRI_STR_NEW2(c_base_uri);
431
+ xmlFree(c_base_uri);
432
+
433
+ return rb_base_uri;
407
434
  }
408
435
 
409
436
  /*
@@ -412,7 +439,8 @@ static VALUE base_uri(VALUE self)
412
439
  *
413
440
  * Get the state of the reader
414
441
  */
415
- static VALUE state(VALUE self)
442
+ static VALUE
443
+ state(VALUE self)
416
444
  {
417
445
  xmlTextReaderPtr reader;
418
446
  Data_Get_Struct(self, xmlTextReader, reader);
@@ -425,7 +453,8 @@ static VALUE state(VALUE self)
425
453
  *
426
454
  * Get the type of readers current node
427
455
  */
428
- static VALUE node_type(VALUE self)
456
+ static VALUE
457
+ node_type(VALUE self)
429
458
  {
430
459
  xmlTextReaderPtr reader;
431
460
  Data_Get_Struct(self, xmlTextReader, reader);
@@ -438,7 +467,8 @@ static VALUE node_type(VALUE self)
438
467
  *
439
468
  * Move the Reader forward through the XML document.
440
469
  */
441
- static VALUE read_more(VALUE self)
470
+ static VALUE
471
+ read_more(VALUE self)
442
472
  {
443
473
  xmlTextReaderPtr reader;
444
474
  xmlErrorPtr error;
@@ -453,14 +483,15 @@ static VALUE read_more(VALUE self)
453
483
  ret = xmlTextReaderRead(reader);
454
484
  xmlSetStructuredErrorFunc(NULL, NULL);
455
485
 
456
- if(ret == 1) return self;
457
- if(ret == 0) return Qnil;
486
+ if (ret == 1) { return self; }
487
+ if (ret == 0) { return Qnil; }
458
488
 
459
489
  error = xmlGetLastError();
460
- if(error)
490
+ if (error) {
461
491
  rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
462
- else
492
+ } else {
463
493
  rb_raise(rb_eRuntimeError, "Error pulling: %d", ret);
494
+ }
464
495
 
465
496
  return Qnil;
466
497
  }
@@ -472,10 +503,11 @@ static VALUE read_more(VALUE self)
472
503
  * Read the contents of the current node, including child nodes and markup.
473
504
  * Returns a utf-8 encoded string.
474
505
  */
475
- static VALUE inner_xml(VALUE self)
506
+ static VALUE
507
+ inner_xml(VALUE self)
476
508
  {
477
509
  xmlTextReaderPtr reader;
478
- xmlChar* value;
510
+ xmlChar *value;
479
511
  VALUE str;
480
512
 
481
513
  Data_Get_Struct(self, xmlTextReader, reader);
@@ -483,8 +515,8 @@ static VALUE inner_xml(VALUE self)
483
515
  value = xmlTextReaderReadInnerXml(reader);
484
516
 
485
517
  str = Qnil;
486
- if(value) {
487
- str = NOKOGIRI_STR_NEW2((char*)value);
518
+ if (value) {
519
+ str = NOKOGIRI_STR_NEW2((char *)value);
488
520
  xmlFree(value);
489
521
  }
490
522
 
@@ -498,7 +530,8 @@ static VALUE inner_xml(VALUE self)
498
530
  * Read the current node and its contents, including child nodes and markup.
499
531
  * Returns a utf-8 encoded string.
500
532
  */
501
- static VALUE outer_xml(VALUE self)
533
+ static VALUE
534
+ outer_xml(VALUE self)
502
535
  {
503
536
  xmlTextReaderPtr reader;
504
537
  xmlChar *value;
@@ -508,8 +541,8 @@ static VALUE outer_xml(VALUE self)
508
541
 
509
542
  value = xmlTextReaderReadOuterXml(reader);
510
543
 
511
- if(value) {
512
- str = NOKOGIRI_STR_NEW2((char*)value);
544
+ if (value) {
545
+ str = NOKOGIRI_STR_NEW2((char *)value);
513
546
  xmlFree(value);
514
547
  }
515
548
  return str;
@@ -521,31 +554,32 @@ static VALUE outer_xml(VALUE self)
521
554
  *
522
555
  * Create a new reader that parses +string+
523
556
  */
524
- static VALUE from_memory(int argc, VALUE *argv, VALUE klass)
557
+ static VALUE
558
+ from_memory(int argc, VALUE *argv, VALUE klass)
525
559
  {
526
560
  VALUE rb_buffer, rb_url, encoding, rb_options;
527
561
  xmlTextReaderPtr reader;
528
- const char * c_url = NULL;
529
- const char * c_encoding = NULL;
562
+ const char *c_url = NULL;
563
+ const char *c_encoding = NULL;
530
564
  int c_options = 0;
531
565
  VALUE rb_reader, args[3];
532
566
 
533
567
  rb_scan_args(argc, argv, "13", &rb_buffer, &rb_url, &encoding, &rb_options);
534
568
 
535
- if (!RTEST(rb_buffer)) rb_raise(rb_eArgError, "string cannot be nil");
536
- if (RTEST(rb_url)) c_url = StringValueCStr(rb_url);
537
- if (RTEST(encoding)) c_encoding = StringValueCStr(encoding);
538
- if (RTEST(rb_options)) c_options = (int)NUM2INT(rb_options);
569
+ if (!RTEST(rb_buffer)) { rb_raise(rb_eArgError, "string cannot be nil"); }
570
+ if (RTEST(rb_url)) { c_url = StringValueCStr(rb_url); }
571
+ if (RTEST(encoding)) { c_encoding = StringValueCStr(encoding); }
572
+ if (RTEST(rb_options)) { c_options = (int)NUM2INT(rb_options); }
539
573
 
540
574
  reader = xmlReaderForMemory(
541
- StringValuePtr(rb_buffer),
542
- (int)RSTRING_LEN(rb_buffer),
543
- c_url,
544
- c_encoding,
545
- c_options
546
- );
547
-
548
- if(reader == NULL) {
575
+ StringValuePtr(rb_buffer),
576
+ (int)RSTRING_LEN(rb_buffer),
577
+ c_url,
578
+ c_encoding,
579
+ c_options
580
+ );
581
+
582
+ if (reader == NULL) {
549
583
  xmlFreeTextReader(reader);
550
584
  rb_raise(rb_eRuntimeError, "couldn't create a parser");
551
585
  }
@@ -565,32 +599,33 @@ static VALUE from_memory(int argc, VALUE *argv, VALUE klass)
565
599
  *
566
600
  * Create a new reader that parses +io+
567
601
  */
568
- static VALUE from_io(int argc, VALUE *argv, VALUE klass)
602
+ static VALUE
603
+ from_io(int argc, VALUE *argv, VALUE klass)
569
604
  {
570
605
  VALUE rb_io, rb_url, encoding, rb_options;
571
606
  xmlTextReaderPtr reader;
572
- const char * c_url = NULL;
573
- const char * c_encoding = NULL;
607
+ const char *c_url = NULL;
608
+ const char *c_encoding = NULL;
574
609
  int c_options = 0;
575
610
  VALUE rb_reader, args[3];
576
611
 
577
612
  rb_scan_args(argc, argv, "13", &rb_io, &rb_url, &encoding, &rb_options);
578
613
 
579
- if (!RTEST(rb_io)) rb_raise(rb_eArgError, "io cannot be nil");
580
- if (RTEST(rb_url)) c_url = StringValueCStr(rb_url);
581
- if (RTEST(encoding)) c_encoding = StringValueCStr(encoding);
582
- if (RTEST(rb_options)) c_options = (int)NUM2INT(rb_options);
614
+ if (!RTEST(rb_io)) { rb_raise(rb_eArgError, "io cannot be nil"); }
615
+ if (RTEST(rb_url)) { c_url = StringValueCStr(rb_url); }
616
+ if (RTEST(encoding)) { c_encoding = StringValueCStr(encoding); }
617
+ if (RTEST(rb_options)) { c_options = (int)NUM2INT(rb_options); }
583
618
 
584
619
  reader = xmlReaderForIO(
585
- (xmlInputReadCallback)io_read_callback,
586
- (xmlInputCloseCallback)io_close_callback,
587
- (void *)rb_io,
588
- c_url,
589
- c_encoding,
590
- c_options
591
- );
592
-
593
- if(reader == NULL) {
620
+ (xmlInputReadCallback)noko_io_read,
621
+ (xmlInputCloseCallback)noko_io_close,
622
+ (void *)rb_io,
623
+ c_url,
624
+ c_encoding,
625
+ c_options
626
+ );
627
+
628
+ if (reader == NULL) {
594
629
  xmlFreeTextReader(reader);
595
630
  rb_raise(rb_eRuntimeError, "couldn't create a parser");
596
631
  }
@@ -610,59 +645,75 @@ static VALUE from_io(int argc, VALUE *argv, VALUE klass)
610
645
  *
611
646
  * Returns true if the current node is empty, otherwise false.
612
647
  */
613
- static VALUE empty_element_p(VALUE self)
648
+ static VALUE
649
+ empty_element_p(VALUE self)
614
650
  {
615
651
  xmlTextReaderPtr reader;
616
652
 
617
653
  Data_Get_Struct(self, xmlTextReader, reader);
618
654
 
619
- if(xmlTextReaderIsEmptyElement(reader))
655
+ if (xmlTextReaderIsEmptyElement(reader)) {
620
656
  return Qtrue;
657
+ }
621
658
 
622
659
  return Qfalse;
623
660
  }
624
661
 
625
- VALUE cNokogiriXmlReader;
626
-
627
- void init_xml_reader()
662
+ static VALUE
663
+ rb_xml_reader_encoding(VALUE rb_reader)
628
664
  {
629
- VALUE module = rb_define_module("Nokogiri");
630
- VALUE xml = rb_define_module_under(module, "XML");
665
+ xmlTextReaderPtr c_reader;
666
+ const char *parser_encoding;
667
+ VALUE constructor_encoding;
631
668
 
669
+ constructor_encoding = rb_iv_get(rb_reader, "@encoding");
670
+ if (RTEST(constructor_encoding)) {
671
+ return constructor_encoding;
672
+ }
673
+
674
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
675
+ parser_encoding = (const char *)xmlTextReaderConstEncoding(c_reader);
676
+ if (parser_encoding == NULL) { return Qnil; }
677
+ return NOKOGIRI_STR_NEW2(parser_encoding);
678
+ }
679
+
680
+ void
681
+ noko_init_xml_reader()
682
+ {
632
683
  /*
633
684
  * The Reader parser allows you to effectively pull parse an XML document.
634
685
  * Once instantiated, call Nokogiri::XML::Reader#each to iterate over each
635
686
  * node. Note that you may only iterate over the document once!
636
687
  */
637
- VALUE klass = rb_define_class_under(xml, "Reader", rb_cObject);
638
-
639
- cNokogiriXmlReader = klass;
640
-
641
- rb_define_singleton_method(klass, "from_memory", from_memory, -1);
642
- rb_define_singleton_method(klass, "from_io", from_io, -1);
643
-
644
- rb_define_method(klass, "read", read_more, 0);
645
- rb_define_method(klass, "inner_xml", inner_xml, 0);
646
- rb_define_method(klass, "outer_xml", outer_xml, 0);
647
- rb_define_method(klass, "state", state, 0);
648
- rb_define_method(klass, "node_type", node_type, 0);
649
- rb_define_method(klass, "name", name, 0);
650
- rb_define_method(klass, "local_name", local_name, 0);
651
- rb_define_method(klass, "namespace_uri", namespace_uri, 0);
652
- rb_define_method(klass, "prefix", prefix, 0);
653
- rb_define_method(klass, "value", value, 0);
654
- rb_define_method(klass, "lang", lang, 0);
655
- rb_define_method(klass, "xml_version", xml_version, 0);
656
- rb_define_method(klass, "depth", depth, 0);
657
- rb_define_method(klass, "attribute_count", attribute_count, 0);
658
- rb_define_method(klass, "attribute", reader_attribute, 1);
659
- rb_define_method(klass, "namespaces", namespaces, 0);
660
- rb_define_method(klass, "attribute_at", attribute_at, 1);
661
- rb_define_method(klass, "empty_element?", empty_element_p, 0);
662
- rb_define_method(klass, "attributes?", attributes_eh, 0);
663
- rb_define_method(klass, "value?", value_eh, 0);
664
- rb_define_method(klass, "default?", default_eh, 0);
665
- rb_define_method(klass, "base_uri", base_uri, 0);
666
-
667
- rb_define_private_method(klass, "attr_nodes", attribute_nodes, 0);
688
+ cNokogiriXmlReader = rb_define_class_under(mNokogiriXml, "Reader", rb_cObject);
689
+
690
+ rb_undef_alloc_func(cNokogiriXmlReader);
691
+
692
+ rb_define_singleton_method(cNokogiriXmlReader, "from_memory", from_memory, -1);
693
+ rb_define_singleton_method(cNokogiriXmlReader, "from_io", from_io, -1);
694
+
695
+ rb_define_method(cNokogiriXmlReader, "attribute", reader_attribute, 1);
696
+ rb_define_method(cNokogiriXmlReader, "attribute_at", attribute_at, 1);
697
+ rb_define_method(cNokogiriXmlReader, "attribute_count", attribute_count, 0);
698
+ rb_define_method(cNokogiriXmlReader, "attribute_nodes", rb_xml_reader_attribute_nodes, 0);
699
+ rb_define_method(cNokogiriXmlReader, "attributes?", attributes_eh, 0);
700
+ rb_define_method(cNokogiriXmlReader, "base_uri", rb_xml_reader_base_uri, 0);
701
+ rb_define_method(cNokogiriXmlReader, "default?", default_eh, 0);
702
+ rb_define_method(cNokogiriXmlReader, "depth", depth, 0);
703
+ rb_define_method(cNokogiriXmlReader, "empty_element?", empty_element_p, 0);
704
+ rb_define_method(cNokogiriXmlReader, "encoding", rb_xml_reader_encoding, 0);
705
+ rb_define_method(cNokogiriXmlReader, "inner_xml", inner_xml, 0);
706
+ rb_define_method(cNokogiriXmlReader, "lang", lang, 0);
707
+ rb_define_method(cNokogiriXmlReader, "local_name", local_name, 0);
708
+ rb_define_method(cNokogiriXmlReader, "name", name, 0);
709
+ rb_define_method(cNokogiriXmlReader, "namespace_uri", namespace_uri, 0);
710
+ rb_define_method(cNokogiriXmlReader, "namespaces", namespaces, 0);
711
+ rb_define_method(cNokogiriXmlReader, "node_type", node_type, 0);
712
+ rb_define_method(cNokogiriXmlReader, "outer_xml", outer_xml, 0);
713
+ rb_define_method(cNokogiriXmlReader, "prefix", prefix, 0);
714
+ rb_define_method(cNokogiriXmlReader, "read", read_more, 0);
715
+ rb_define_method(cNokogiriXmlReader, "state", state, 0);
716
+ rb_define_method(cNokogiriXmlReader, "value", value, 0);
717
+ rb_define_method(cNokogiriXmlReader, "value?", value_eh, 0);
718
+ rb_define_method(cNokogiriXmlReader, "xml_version", xml_version, 0);
668
719
  }