Nokogiri_precompiled_aarch64_dedshit 1.14.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (263) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +44 -0
  3. data/LICENSE-DEPENDENCIES.md +2224 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +287 -0
  6. data/bin/nokogiri +131 -0
  7. data/dependencies.yml +41 -0
  8. data/ext/java/nokogiri/Html4Document.java +157 -0
  9. data/ext/java/nokogiri/Html4ElementDescription.java +133 -0
  10. data/ext/java/nokogiri/Html4EntityLookup.java +63 -0
  11. data/ext/java/nokogiri/Html4SaxParserContext.java +289 -0
  12. data/ext/java/nokogiri/Html4SaxPushParser.java +213 -0
  13. data/ext/java/nokogiri/NokogiriService.java +613 -0
  14. data/ext/java/nokogiri/XmlAttr.java +154 -0
  15. data/ext/java/nokogiri/XmlAttributeDecl.java +119 -0
  16. data/ext/java/nokogiri/XmlCdata.java +60 -0
  17. data/ext/java/nokogiri/XmlComment.java +77 -0
  18. data/ext/java/nokogiri/XmlDocument.java +705 -0
  19. data/ext/java/nokogiri/XmlDocumentFragment.java +163 -0
  20. data/ext/java/nokogiri/XmlDtd.java +516 -0
  21. data/ext/java/nokogiri/XmlElement.java +44 -0
  22. data/ext/java/nokogiri/XmlElementContent.java +412 -0
  23. data/ext/java/nokogiri/XmlElementDecl.java +148 -0
  24. data/ext/java/nokogiri/XmlEntityDecl.java +151 -0
  25. data/ext/java/nokogiri/XmlEntityReference.java +79 -0
  26. data/ext/java/nokogiri/XmlNamespace.java +193 -0
  27. data/ext/java/nokogiri/XmlNode.java +1938 -0
  28. data/ext/java/nokogiri/XmlNodeSet.java +463 -0
  29. data/ext/java/nokogiri/XmlProcessingInstruction.java +79 -0
  30. data/ext/java/nokogiri/XmlReader.java +615 -0
  31. data/ext/java/nokogiri/XmlRelaxng.java +133 -0
  32. data/ext/java/nokogiri/XmlSaxParserContext.java +329 -0
  33. data/ext/java/nokogiri/XmlSaxPushParser.java +288 -0
  34. data/ext/java/nokogiri/XmlSchema.java +423 -0
  35. data/ext/java/nokogiri/XmlSyntaxError.java +137 -0
  36. data/ext/java/nokogiri/XmlText.java +90 -0
  37. data/ext/java/nokogiri/XmlXpathContext.java +305 -0
  38. data/ext/java/nokogiri/XsltStylesheet.java +368 -0
  39. data/ext/java/nokogiri/internals/ClosedStreamException.java +13 -0
  40. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +252 -0
  41. data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +27 -0
  42. data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +178 -0
  43. data/ext/java/nokogiri/internals/NokogiriDomParser.java +99 -0
  44. data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +140 -0
  45. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +65 -0
  46. data/ext/java/nokogiri/internals/NokogiriHandler.java +339 -0
  47. data/ext/java/nokogiri/internals/NokogiriHelpers.java +817 -0
  48. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +228 -0
  49. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +110 -0
  50. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +86 -0
  51. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +107 -0
  52. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +62 -0
  53. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +165 -0
  54. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +50 -0
  55. data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +37 -0
  56. data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +70 -0
  57. data/ext/java/nokogiri/internals/ParserContext.java +262 -0
  58. data/ext/java/nokogiri/internals/ReaderNode.java +564 -0
  59. data/ext/java/nokogiri/internals/SaveContextVisitor.java +865 -0
  60. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +50 -0
  61. data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +174 -0
  62. data/ext/java/nokogiri/internals/XmlDeclHandler.java +11 -0
  63. data/ext/java/nokogiri/internals/XmlDomParserContext.java +265 -0
  64. data/ext/java/nokogiri/internals/XmlSaxParser.java +40 -0
  65. data/ext/java/nokogiri/internals/c14n/AttrCompare.java +122 -0
  66. data/ext/java/nokogiri/internals/c14n/C14nHelper.java +178 -0
  67. data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +43 -0
  68. data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +106 -0
  69. data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +278 -0
  70. data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +664 -0
  71. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +45 -0
  72. data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +45 -0
  73. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +388 -0
  74. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +308 -0
  75. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +47 -0
  76. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +51 -0
  77. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +51 -0
  78. data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +50 -0
  79. data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +660 -0
  80. data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +194 -0
  81. data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +77 -0
  82. data/ext/java/nokogiri/internals/c14n/Constants.java +45 -0
  83. data/ext/java/nokogiri/internals/c14n/ElementProxy.java +325 -0
  84. data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +106 -0
  85. data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +86 -0
  86. data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +181 -0
  87. data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +87 -0
  88. data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +452 -0
  89. data/ext/java/nokogiri/internals/c14n/NodeFilter.java +52 -0
  90. data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +190 -0
  91. data/ext/java/nokogiri/internals/c14n/XMLUtils.java +540 -0
  92. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1712 -0
  93. data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +737 -0
  94. data/ext/nokogiri/depend +38 -0
  95. data/ext/nokogiri/extconf.rb +1086 -0
  96. data/ext/nokogiri/gumbo.c +594 -0
  97. data/ext/nokogiri/html4_document.c +167 -0
  98. data/ext/nokogiri/html4_element_description.c +294 -0
  99. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  100. data/ext/nokogiri/html4_sax_parser_context.c +116 -0
  101. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  102. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  103. data/ext/nokogiri/nokogiri.c +265 -0
  104. data/ext/nokogiri/nokogiri.h +235 -0
  105. data/ext/nokogiri/test_global_handlers.c +42 -0
  106. data/ext/nokogiri/xml_attr.c +103 -0
  107. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  108. data/ext/nokogiri/xml_cdata.c +57 -0
  109. data/ext/nokogiri/xml_comment.c +62 -0
  110. data/ext/nokogiri/xml_document.c +689 -0
  111. data/ext/nokogiri/xml_document_fragment.c +44 -0
  112. data/ext/nokogiri/xml_dtd.c +210 -0
  113. data/ext/nokogiri/xml_element_content.c +128 -0
  114. data/ext/nokogiri/xml_element_decl.c +69 -0
  115. data/ext/nokogiri/xml_encoding_handler.c +104 -0
  116. data/ext/nokogiri/xml_entity_decl.c +112 -0
  117. data/ext/nokogiri/xml_entity_reference.c +50 -0
  118. data/ext/nokogiri/xml_namespace.c +186 -0
  119. data/ext/nokogiri/xml_node.c +2426 -0
  120. data/ext/nokogiri/xml_node_set.c +496 -0
  121. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  122. data/ext/nokogiri/xml_reader.c +794 -0
  123. data/ext/nokogiri/xml_relax_ng.c +164 -0
  124. data/ext/nokogiri/xml_sax_parser.c +316 -0
  125. data/ext/nokogiri/xml_sax_parser_context.c +283 -0
  126. data/ext/nokogiri/xml_sax_push_parser.c +166 -0
  127. data/ext/nokogiri/xml_schema.c +260 -0
  128. data/ext/nokogiri/xml_syntax_error.c +85 -0
  129. data/ext/nokogiri/xml_text.c +48 -0
  130. data/ext/nokogiri/xml_xpath_context.c +415 -0
  131. data/ext/nokogiri/xslt_stylesheet.c +363 -0
  132. data/gumbo-parser/CHANGES.md +63 -0
  133. data/gumbo-parser/Makefile +111 -0
  134. data/gumbo-parser/THANKS +27 -0
  135. data/gumbo-parser/src/Makefile +34 -0
  136. data/gumbo-parser/src/README.md +41 -0
  137. data/gumbo-parser/src/ascii.c +75 -0
  138. data/gumbo-parser/src/ascii.h +115 -0
  139. data/gumbo-parser/src/attribute.c +42 -0
  140. data/gumbo-parser/src/attribute.h +17 -0
  141. data/gumbo-parser/src/char_ref.c +22225 -0
  142. data/gumbo-parser/src/char_ref.h +29 -0
  143. data/gumbo-parser/src/char_ref.rl +2154 -0
  144. data/gumbo-parser/src/error.c +626 -0
  145. data/gumbo-parser/src/error.h +148 -0
  146. data/gumbo-parser/src/foreign_attrs.c +104 -0
  147. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  148. data/gumbo-parser/src/insertion_mode.h +33 -0
  149. data/gumbo-parser/src/macros.h +91 -0
  150. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  151. data/gumbo-parser/src/parser.c +4878 -0
  152. data/gumbo-parser/src/parser.h +41 -0
  153. data/gumbo-parser/src/replacement.h +33 -0
  154. data/gumbo-parser/src/string_buffer.c +103 -0
  155. data/gumbo-parser/src/string_buffer.h +68 -0
  156. data/gumbo-parser/src/string_piece.c +48 -0
  157. data/gumbo-parser/src/svg_attrs.c +174 -0
  158. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  159. data/gumbo-parser/src/svg_tags.c +137 -0
  160. data/gumbo-parser/src/svg_tags.gperf +55 -0
  161. data/gumbo-parser/src/tag.c +223 -0
  162. data/gumbo-parser/src/tag_lookup.c +382 -0
  163. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  164. data/gumbo-parser/src/tag_lookup.h +13 -0
  165. data/gumbo-parser/src/token_buffer.c +79 -0
  166. data/gumbo-parser/src/token_buffer.h +71 -0
  167. data/gumbo-parser/src/token_type.h +17 -0
  168. data/gumbo-parser/src/tokenizer.c +3463 -0
  169. data/gumbo-parser/src/tokenizer.h +112 -0
  170. data/gumbo-parser/src/tokenizer_states.h +339 -0
  171. data/gumbo-parser/src/utf8.c +245 -0
  172. data/gumbo-parser/src/utf8.h +164 -0
  173. data/gumbo-parser/src/util.c +66 -0
  174. data/gumbo-parser/src/util.h +34 -0
  175. data/gumbo-parser/src/vector.c +111 -0
  176. data/gumbo-parser/src/vector.h +45 -0
  177. data/lib/nokogiri/class_resolver.rb +67 -0
  178. data/lib/nokogiri/css/node.rb +54 -0
  179. data/lib/nokogiri/css/parser.rb +770 -0
  180. data/lib/nokogiri/css/parser.y +277 -0
  181. data/lib/nokogiri/css/parser_extras.rb +96 -0
  182. data/lib/nokogiri/css/syntax_error.rb +9 -0
  183. data/lib/nokogiri/css/tokenizer.rb +155 -0
  184. data/lib/nokogiri/css/tokenizer.rex +56 -0
  185. data/lib/nokogiri/css/xpath_visitor.rb +359 -0
  186. data/lib/nokogiri/css.rb +66 -0
  187. data/lib/nokogiri/decorators/slop.rb +44 -0
  188. data/lib/nokogiri/encoding_handler.rb +57 -0
  189. data/lib/nokogiri/extension.rb +32 -0
  190. data/lib/nokogiri/gumbo.rb +15 -0
  191. data/lib/nokogiri/html.rb +48 -0
  192. data/lib/nokogiri/html4/builder.rb +37 -0
  193. data/lib/nokogiri/html4/document.rb +214 -0
  194. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  195. data/lib/nokogiri/html4/element_description.rb +25 -0
  196. data/lib/nokogiri/html4/element_description_defaults.rb +572 -0
  197. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  198. data/lib/nokogiri/html4/entity_lookup.rb +15 -0
  199. data/lib/nokogiri/html4/sax/parser.rb +63 -0
  200. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  201. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  202. data/lib/nokogiri/html4.rb +47 -0
  203. data/lib/nokogiri/html5/document.rb +168 -0
  204. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  205. data/lib/nokogiri/html5/node.rb +98 -0
  206. data/lib/nokogiri/html5.rb +389 -0
  207. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  208. data/lib/nokogiri/jruby/isorelax/isorelax/20030108/isorelax-20030108.jar +0 -0
  209. data/lib/nokogiri/jruby/net/sf/saxon/Saxon-HE/9.6.0-4/Saxon-HE-9.6.0-4.jar +0 -0
  210. data/lib/nokogiri/jruby/net/sourceforge/htmlunit/neko-htmlunit/2.63.0/neko-htmlunit-2.63.0.jar +0 -0
  211. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  212. data/lib/nokogiri/jruby/nu/validator/jing/20200702VNU/jing-20200702VNU.jar +0 -0
  213. data/lib/nokogiri/jruby/org/nokogiri/nekodtd/0.1.11.noko2/nekodtd-0.1.11.noko2.jar +0 -0
  214. data/lib/nokogiri/jruby/xalan/serializer/2.7.3/serializer-2.7.3.jar +0 -0
  215. data/lib/nokogiri/jruby/xalan/xalan/2.7.3/xalan-2.7.3.jar +0 -0
  216. data/lib/nokogiri/jruby/xerces/xercesImpl/2.12.2/xercesImpl-2.12.2.jar +0 -0
  217. data/lib/nokogiri/jruby/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar +0 -0
  218. data/lib/nokogiri/syntax_error.rb +6 -0
  219. data/lib/nokogiri/version/constant.rb +6 -0
  220. data/lib/nokogiri/version/info.rb +223 -0
  221. data/lib/nokogiri/version.rb +4 -0
  222. data/lib/nokogiri/xml/attr.rb +66 -0
  223. data/lib/nokogiri/xml/attribute_decl.rb +20 -0
  224. data/lib/nokogiri/xml/builder.rb +487 -0
  225. data/lib/nokogiri/xml/cdata.rb +13 -0
  226. data/lib/nokogiri/xml/character_data.rb +9 -0
  227. data/lib/nokogiri/xml/document.rb +471 -0
  228. data/lib/nokogiri/xml/document_fragment.rb +205 -0
  229. data/lib/nokogiri/xml/dtd.rb +34 -0
  230. data/lib/nokogiri/xml/element_content.rb +38 -0
  231. data/lib/nokogiri/xml/element_decl.rb +15 -0
  232. data/lib/nokogiri/xml/entity_decl.rb +21 -0
  233. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  234. data/lib/nokogiri/xml/namespace.rb +58 -0
  235. data/lib/nokogiri/xml/node/save_options.rb +68 -0
  236. data/lib/nokogiri/xml/node.rb +1563 -0
  237. data/lib/nokogiri/xml/node_set.rb +447 -0
  238. data/lib/nokogiri/xml/notation.rb +19 -0
  239. data/lib/nokogiri/xml/parse_options.rb +213 -0
  240. data/lib/nokogiri/xml/pp/character_data.rb +21 -0
  241. data/lib/nokogiri/xml/pp/node.rb +57 -0
  242. data/lib/nokogiri/xml/pp.rb +4 -0
  243. data/lib/nokogiri/xml/processing_instruction.rb +11 -0
  244. data/lib/nokogiri/xml/reader.rb +105 -0
  245. data/lib/nokogiri/xml/relax_ng.rb +38 -0
  246. data/lib/nokogiri/xml/sax/document.rb +167 -0
  247. data/lib/nokogiri/xml/sax/parser.rb +125 -0
  248. data/lib/nokogiri/xml/sax/parser_context.rb +21 -0
  249. data/lib/nokogiri/xml/sax/push_parser.rb +61 -0
  250. data/lib/nokogiri/xml/sax.rb +6 -0
  251. data/lib/nokogiri/xml/schema.rb +73 -0
  252. data/lib/nokogiri/xml/searchable.rb +270 -0
  253. data/lib/nokogiri/xml/syntax_error.rb +72 -0
  254. data/lib/nokogiri/xml/text.rb +11 -0
  255. data/lib/nokogiri/xml/xpath/syntax_error.rb +13 -0
  256. data/lib/nokogiri/xml/xpath.rb +21 -0
  257. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  258. data/lib/nokogiri/xml.rb +76 -0
  259. data/lib/nokogiri/xslt/stylesheet.rb +27 -0
  260. data/lib/nokogiri/xslt.rb +65 -0
  261. data/lib/nokogiri.rb +120 -0
  262. data/lib/xsd/xmlparser/nokogiri.rb +106 -0
  263. metadata +391 -0
@@ -0,0 +1,794 @@
1
+ #include <nokogiri.h>
2
+
3
+ VALUE cNokogiriXmlReader;
4
+ void xmlSetStructuredErrorFunc(void *jqq, void *ssf);
5
+ static void
6
+ dealloc(xmlTextReaderPtr reader)
7
+ {
8
+ xmlFreeTextReader(reader);
9
+ }
10
+
11
+ static int
12
+ has_attributes(xmlTextReaderPtr reader)
13
+ {
14
+ /*
15
+ * this implementation of xmlTextReaderHasAttributes explicitly includes
16
+ * namespaces and properties, because some earlier versions ignore
17
+ * namespaces.
18
+ */
19
+ xmlNodePtr node ;
20
+ node = xmlTextReaderCurrentNode(reader);
21
+ if (node == NULL) {
22
+ return (0);
23
+ }
24
+
25
+ if ((node->type == XML_ELEMENT_NODE) &&
26
+ ((node->properties != NULL) || (node->nsDef != NULL))) {
27
+ return (1);
28
+ }
29
+ return (0);
30
+ }
31
+
32
+ // TODO: merge this function into the `namespaces` method implementation
33
+ static void
34
+ Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash)
35
+ {
36
+ xmlNsPtr ns;
37
+ VALUE key;
38
+
39
+ if (node->type != XML_ELEMENT_NODE) { return ; }
40
+
41
+ ns = node->nsDef;
42
+ while (ns != NULL) {
43
+
44
+ key = rb_enc_str_new_cstr(XMLNS_PREFIX, rb_utf8_encoding());
45
+ if (ns->prefix) {
46
+ rb_str_cat_cstr(key, ":");
47
+ rb_str_cat_cstr(key, (const char *)ns->prefix);
48
+ }
49
+
50
+ key = rb_str_conv_enc(key, rb_utf8_encoding(), rb_default_internal_encoding());
51
+ rb_hash_aset(attr_hash,
52
+ key,
53
+ (ns->href ? NOKOGIRI_STR_NEW2(ns->href) : Qnil)
54
+ );
55
+ ns = ns->next ;
56
+ }
57
+ }
58
+
59
+
60
+ /*
61
+ * call-seq:
62
+ * default?
63
+ *
64
+ * Was an attribute generated from the default value in the DTD or schema?
65
+ */
66
+ static VALUE
67
+ default_eh(VALUE self)
68
+ {
69
+ xmlTextReaderPtr reader;
70
+ int eh;
71
+
72
+ Data_Get_Struct(self, xmlTextReader, reader);
73
+ eh = xmlTextReaderIsDefault(reader);
74
+ if (eh == 0) { return Qfalse; }
75
+ if (eh == 1) { return Qtrue; }
76
+
77
+ return Qnil;
78
+ }
79
+
80
+ /*
81
+ * call-seq:
82
+ * value?
83
+ *
84
+ * Does this node have a text value?
85
+ */
86
+ static VALUE
87
+ value_eh(VALUE self)
88
+ {
89
+ xmlTextReaderPtr reader;
90
+ int eh;
91
+
92
+ Data_Get_Struct(self, xmlTextReader, reader);
93
+ eh = xmlTextReaderHasValue(reader);
94
+ if (eh == 0) { return Qfalse; }
95
+ if (eh == 1) { return Qtrue; }
96
+
97
+ return Qnil;
98
+ }
99
+
100
+ /*
101
+ * call-seq:
102
+ * attributes?
103
+ *
104
+ * Does this node have attributes?
105
+ */
106
+ static VALUE
107
+ attributes_eh(VALUE self)
108
+ {
109
+ xmlTextReaderPtr reader;
110
+ int eh;
111
+
112
+ Data_Get_Struct(self, xmlTextReader, reader);
113
+ eh = has_attributes(reader);
114
+ if (eh == 0) { return Qfalse; }
115
+ if (eh == 1) { return Qtrue; }
116
+
117
+ return Qnil;
118
+ }
119
+
120
+ /*
121
+ * call-seq:
122
+ * namespaces
123
+ *
124
+ * Get a hash of namespaces for this Node
125
+ */
126
+ static VALUE
127
+ rb_xml_reader_namespaces(VALUE rb_reader)
128
+ {
129
+ VALUE rb_namespaces = rb_hash_new() ;
130
+ xmlTextReaderPtr c_reader;
131
+ xmlNodePtr c_node;
132
+ VALUE rb_errors;
133
+
134
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
135
+
136
+ if (! has_attributes(c_reader)) {
137
+ return rb_namespaces ;
138
+ }
139
+
140
+ rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
141
+
142
+ xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
143
+ c_node = xmlTextReaderExpand(c_reader);
144
+ xmlSetStructuredErrorFunc(NULL, NULL);
145
+
146
+ if (c_node == NULL) {
147
+ if (RARRAY_LEN(rb_errors) > 0) {
148
+ VALUE rb_error = rb_ary_entry(rb_errors, 0);
149
+ VALUE exception_message = rb_funcall(rb_error, rb_intern("to_s"), 0);
150
+ rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError));
151
+ }
152
+ return Qnil;
153
+ }
154
+
155
+ Nokogiri_xml_node_namespaces(c_node, rb_namespaces);
156
+
157
+ return rb_namespaces ;
158
+ }
159
+
160
+ /*
161
+ :call-seq: attribute_nodes() → Array<Nokogiri::XML::Attr>
162
+
163
+ Get the attributes of the current node as an Array of XML:Attr
164
+
165
+ ⚠ This method is deprecated and unsafe to use. It will be removed in a future version of Nokogiri.
166
+
167
+ See related: #attribute_hash, #attributes
168
+ */
169
+ static VALUE
170
+ rb_xml_reader_attribute_nodes(VALUE rb_reader)
171
+ {
172
+ xmlTextReaderPtr c_reader;
173
+ xmlNodePtr c_node;
174
+ VALUE attr_nodes;
175
+ int j;
176
+
177
+ // TODO: deprecated, remove in Nokogiri v1.15, see https://github.com/sparklemotion/nokogiri/issues/2598
178
+ // After removal, we can also remove all the "node_has_a_document" special handling from xml_node.c
179
+ NOKO_WARN_DEPRECATION("Reader#attribute_nodes is deprecated and will be removed in a future version of Nokogiri. Please use Reader#attribute_hash instead.");
180
+
181
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
182
+
183
+ if (! has_attributes(c_reader)) {
184
+ return rb_ary_new() ;
185
+ }
186
+
187
+ c_node = xmlTextReaderExpand(c_reader);
188
+ if (c_node == NULL) {
189
+ return Qnil;
190
+ }
191
+
192
+ attr_nodes = noko_xml_node_attrs(c_node);
193
+
194
+ /* ensure that the Reader won't be GCed as long as a node is referenced */
195
+ for (j = 0 ; j < RARRAY_LEN(attr_nodes) ; j++) {
196
+ rb_iv_set(rb_ary_entry(attr_nodes, j), "@reader", rb_reader);
197
+ }
198
+
199
+ return attr_nodes;
200
+ }
201
+
202
+ /*
203
+ :call-seq: attribute_hash() → Hash<String ⇒ String>
204
+
205
+ Get the attributes of the current node as a Hash of names and values.
206
+
207
+ See related: #attributes and #namespaces
208
+ */
209
+ static VALUE
210
+ rb_xml_reader_attribute_hash(VALUE rb_reader)
211
+ {
212
+ VALUE rb_attributes = rb_hash_new();
213
+ xmlTextReaderPtr c_reader;
214
+ xmlNodePtr c_node;
215
+ xmlAttrPtr c_property;
216
+ VALUE rb_errors;
217
+
218
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
219
+
220
+ if (!has_attributes(c_reader)) {
221
+ return rb_attributes;
222
+ }
223
+
224
+ rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
225
+
226
+ xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
227
+ c_node = xmlTextReaderExpand(c_reader);
228
+ xmlSetStructuredErrorFunc(NULL, NULL);
229
+
230
+ if (c_node == NULL) {
231
+ if (RARRAY_LEN(rb_errors) > 0) {
232
+ VALUE rb_error = rb_ary_entry(rb_errors, 0);
233
+ VALUE exception_message = rb_funcall(rb_error, rb_intern("to_s"), 0);
234
+ rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError));
235
+ }
236
+ return Qnil;
237
+ }
238
+
239
+ c_property = c_node->properties;
240
+ while (c_property != NULL) {
241
+ VALUE rb_name = NOKOGIRI_STR_NEW2(c_property->name);
242
+ VALUE rb_value = Qnil;
243
+ xmlChar *c_value = xmlNodeGetContent((xmlNode *)c_property);
244
+
245
+ if (c_value) {
246
+ rb_value = NOKOGIRI_STR_NEW2(c_value);
247
+ xmlFree(c_value);
248
+ }
249
+
250
+ rb_hash_aset(rb_attributes, rb_name, rb_value);
251
+
252
+ c_property = c_property->next;
253
+ }
254
+
255
+ return rb_attributes;
256
+ }
257
+
258
+ /*
259
+ * call-seq:
260
+ * attribute_at(index)
261
+ *
262
+ * Get the value of attribute at +index+
263
+ */
264
+ static VALUE
265
+ attribute_at(VALUE self, VALUE index)
266
+ {
267
+ xmlTextReaderPtr reader;
268
+ xmlChar *value;
269
+ VALUE rb_value;
270
+
271
+ Data_Get_Struct(self, xmlTextReader, reader);
272
+
273
+ if (NIL_P(index)) { return Qnil; }
274
+ index = rb_Integer(index);
275
+
276
+ value = xmlTextReaderGetAttributeNo(
277
+ reader,
278
+ (int)NUM2INT(index)
279
+ );
280
+ if (value == NULL) { return Qnil; }
281
+
282
+ rb_value = NOKOGIRI_STR_NEW2(value);
283
+ xmlFree(value);
284
+ return rb_value;
285
+ }
286
+
287
+ /*
288
+ * call-seq:
289
+ * attribute(name)
290
+ *
291
+ * Get the value of attribute named +name+
292
+ */
293
+ static VALUE
294
+ reader_attribute(VALUE self, VALUE name)
295
+ {
296
+ xmlTextReaderPtr reader;
297
+ xmlChar *value ;
298
+ VALUE rb_value;
299
+
300
+ Data_Get_Struct(self, xmlTextReader, reader);
301
+
302
+ if (NIL_P(name)) { return Qnil; }
303
+ name = StringValue(name) ;
304
+
305
+ value = xmlTextReaderGetAttribute(reader, (xmlChar *)StringValueCStr(name));
306
+ if (value == NULL) { return Qnil; }
307
+
308
+ rb_value = NOKOGIRI_STR_NEW2(value);
309
+ xmlFree(value);
310
+ return rb_value;
311
+ }
312
+
313
+ /*
314
+ * call-seq:
315
+ * attribute_count
316
+ *
317
+ * Get the number of attributes for the current node
318
+ */
319
+ static VALUE
320
+ attribute_count(VALUE self)
321
+ {
322
+ xmlTextReaderPtr reader;
323
+ int count;
324
+
325
+ Data_Get_Struct(self, xmlTextReader, reader);
326
+ count = xmlTextReaderAttributeCount(reader);
327
+ if (count == -1) { return Qnil; }
328
+
329
+ return INT2NUM(count);
330
+ }
331
+
332
+ /*
333
+ * call-seq:
334
+ * depth
335
+ *
336
+ * Get the depth of the node
337
+ */
338
+ static VALUE
339
+ depth(VALUE self)
340
+ {
341
+ xmlTextReaderPtr reader;
342
+ int depth;
343
+
344
+ Data_Get_Struct(self, xmlTextReader, reader);
345
+ depth = xmlTextReaderDepth(reader);
346
+ if (depth == -1) { return Qnil; }
347
+
348
+ return INT2NUM(depth);
349
+ }
350
+
351
+ /*
352
+ * call-seq:
353
+ * xml_version
354
+ *
355
+ * Get the XML version of the document being read
356
+ */
357
+ static VALUE
358
+ xml_version(VALUE self)
359
+ {
360
+ xmlTextReaderPtr reader;
361
+ const char *version;
362
+
363
+ Data_Get_Struct(self, xmlTextReader, reader);
364
+ version = (const char *)xmlTextReaderConstXmlVersion(reader);
365
+ if (version == NULL) { return Qnil; }
366
+
367
+ return NOKOGIRI_STR_NEW2(version);
368
+ }
369
+
370
+ /*
371
+ * call-seq:
372
+ * lang
373
+ *
374
+ * Get the xml:lang scope within which the node resides.
375
+ */
376
+ static VALUE
377
+ lang(VALUE self)
378
+ {
379
+ xmlTextReaderPtr reader;
380
+ const char *lang;
381
+
382
+ Data_Get_Struct(self, xmlTextReader, reader);
383
+ lang = (const char *)xmlTextReaderConstXmlLang(reader);
384
+ if (lang == NULL) { return Qnil; }
385
+
386
+ return NOKOGIRI_STR_NEW2(lang);
387
+ }
388
+
389
+ /*
390
+ * call-seq:
391
+ * value
392
+ *
393
+ * Get the text value of the node if present. Returns a utf-8 encoded string.
394
+ */
395
+ static VALUE
396
+ value(VALUE self)
397
+ {
398
+ xmlTextReaderPtr reader;
399
+ const char *value;
400
+
401
+ Data_Get_Struct(self, xmlTextReader, reader);
402
+ value = (const char *)xmlTextReaderConstValue(reader);
403
+ if (value == NULL) { return Qnil; }
404
+
405
+ return NOKOGIRI_STR_NEW2(value);
406
+ }
407
+
408
+ /*
409
+ * call-seq:
410
+ * prefix
411
+ *
412
+ * Get the shorthand reference to the namespace associated with the node.
413
+ */
414
+ static VALUE
415
+ prefix(VALUE self)
416
+ {
417
+ xmlTextReaderPtr reader;
418
+ const char *prefix;
419
+
420
+ Data_Get_Struct(self, xmlTextReader, reader);
421
+ prefix = (const char *)xmlTextReaderConstPrefix(reader);
422
+ if (prefix == NULL) { return Qnil; }
423
+
424
+ return NOKOGIRI_STR_NEW2(prefix);
425
+ }
426
+
427
+ /*
428
+ * call-seq:
429
+ * namespace_uri
430
+ *
431
+ * Get the URI defining the namespace associated with the node
432
+ */
433
+ static VALUE
434
+ namespace_uri(VALUE self)
435
+ {
436
+ xmlTextReaderPtr reader;
437
+ const char *uri;
438
+
439
+ Data_Get_Struct(self, xmlTextReader, reader);
440
+ uri = (const char *)xmlTextReaderConstNamespaceUri(reader);
441
+ if (uri == NULL) { return Qnil; }
442
+
443
+ return NOKOGIRI_STR_NEW2(uri);
444
+ }
445
+
446
+ /*
447
+ * call-seq:
448
+ * local_name
449
+ *
450
+ * Get the local name of the node
451
+ */
452
+ static VALUE
453
+ local_name(VALUE self)
454
+ {
455
+ xmlTextReaderPtr reader;
456
+ const char *name;
457
+
458
+ Data_Get_Struct(self, xmlTextReader, reader);
459
+ name = (const char *)xmlTextReaderConstLocalName(reader);
460
+ if (name == NULL) { return Qnil; }
461
+
462
+ return NOKOGIRI_STR_NEW2(name);
463
+ }
464
+
465
+ /*
466
+ * call-seq:
467
+ * name
468
+ *
469
+ * Get the name of the node. Returns a utf-8 encoded string.
470
+ */
471
+ static VALUE
472
+ name(VALUE self)
473
+ {
474
+ xmlTextReaderPtr reader;
475
+ const char *name;
476
+
477
+ Data_Get_Struct(self, xmlTextReader, reader);
478
+ name = (const char *)xmlTextReaderConstName(reader);
479
+ if (name == NULL) { return Qnil; }
480
+
481
+ return NOKOGIRI_STR_NEW2(name);
482
+ }
483
+
484
+ /*
485
+ * call-seq:
486
+ * base_uri
487
+ *
488
+ * Get the xml:base of the node
489
+ */
490
+ static VALUE
491
+ rb_xml_reader_base_uri(VALUE rb_reader)
492
+ {
493
+ VALUE rb_base_uri;
494
+ xmlTextReaderPtr c_reader;
495
+ xmlChar *c_base_uri;
496
+
497
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
498
+
499
+ c_base_uri = xmlTextReaderBaseUri(c_reader);
500
+ if (c_base_uri == NULL) {
501
+ return Qnil;
502
+ }
503
+
504
+ rb_base_uri = NOKOGIRI_STR_NEW2(c_base_uri);
505
+ xmlFree(c_base_uri);
506
+
507
+ return rb_base_uri;
508
+ }
509
+
510
+ /*
511
+ * call-seq:
512
+ * state
513
+ *
514
+ * Get the state of the reader
515
+ */
516
+ static VALUE
517
+ state(VALUE self)
518
+ {
519
+ xmlTextReaderPtr reader;
520
+ Data_Get_Struct(self, xmlTextReader, reader);
521
+ return INT2NUM(xmlTextReaderReadState(reader));
522
+ }
523
+
524
+ /*
525
+ * call-seq:
526
+ * node_type
527
+ *
528
+ * Get the type of readers current node
529
+ */
530
+ static VALUE
531
+ node_type(VALUE self)
532
+ {
533
+ xmlTextReaderPtr reader;
534
+ Data_Get_Struct(self, xmlTextReader, reader);
535
+ return INT2NUM(xmlTextReaderNodeType(reader));
536
+ }
537
+
538
+ /*
539
+ * call-seq:
540
+ * read
541
+ *
542
+ * Move the Reader forward through the XML document.
543
+ */
544
+ static VALUE
545
+ read_more(VALUE self)
546
+ {
547
+ xmlTextReaderPtr reader;
548
+ xmlErrorPtr error;
549
+ VALUE error_list;
550
+ int ret;
551
+
552
+ Data_Get_Struct(self, xmlTextReader, reader);
553
+
554
+ error_list = rb_funcall(self, rb_intern("errors"), 0);
555
+
556
+ xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
557
+ ret = xmlTextReaderRead(reader);
558
+ xmlSetStructuredErrorFunc(NULL, NULL);
559
+
560
+ if (ret == 1) { return self; }
561
+ if (ret == 0) { return Qnil; }
562
+
563
+ error = xmlGetLastError();
564
+ if (error) {
565
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
566
+ } else {
567
+ rb_raise(rb_eRuntimeError, "Error pulling: %d", ret);
568
+ }
569
+
570
+ return Qnil;
571
+ }
572
+
573
+ /*
574
+ * call-seq:
575
+ * inner_xml
576
+ *
577
+ * Read the contents of the current node, including child nodes and markup.
578
+ * Returns a utf-8 encoded string.
579
+ */
580
+ static VALUE
581
+ inner_xml(VALUE self)
582
+ {
583
+ xmlTextReaderPtr reader;
584
+ xmlChar *value;
585
+ VALUE str;
586
+
587
+ Data_Get_Struct(self, xmlTextReader, reader);
588
+
589
+ value = xmlTextReaderReadInnerXml(reader);
590
+
591
+ str = Qnil;
592
+ if (value) {
593
+ str = NOKOGIRI_STR_NEW2((char *)value);
594
+ xmlFree(value);
595
+ }
596
+
597
+ return str;
598
+ }
599
+
600
+ /*
601
+ * call-seq:
602
+ * outer_xml
603
+ *
604
+ * Read the current node and its contents, including child nodes and markup.
605
+ * Returns a utf-8 encoded string.
606
+ */
607
+ static VALUE
608
+ outer_xml(VALUE self)
609
+ {
610
+ xmlTextReaderPtr reader;
611
+ xmlChar *value;
612
+ VALUE str = Qnil;
613
+
614
+ Data_Get_Struct(self, xmlTextReader, reader);
615
+
616
+ value = xmlTextReaderReadOuterXml(reader);
617
+
618
+ if (value) {
619
+ str = NOKOGIRI_STR_NEW2((char *)value);
620
+ xmlFree(value);
621
+ }
622
+ return str;
623
+ }
624
+
625
+ /*
626
+ * call-seq:
627
+ * from_memory(string, url = nil, encoding = nil, options = 0)
628
+ *
629
+ * Create a new reader that parses +string+
630
+ */
631
+ static VALUE
632
+ from_memory(int argc, VALUE *argv, VALUE klass)
633
+ {
634
+ VALUE rb_buffer, rb_url, encoding, rb_options;
635
+ xmlTextReaderPtr reader;
636
+ const char *c_url = NULL;
637
+ const char *c_encoding = NULL;
638
+ int c_options = 0;
639
+ VALUE rb_reader, args[3];
640
+
641
+ rb_scan_args(argc, argv, "13", &rb_buffer, &rb_url, &encoding, &rb_options);
642
+
643
+ if (!RTEST(rb_buffer)) { rb_raise(rb_eArgError, "string cannot be nil"); }
644
+ if (RTEST(rb_url)) { c_url = StringValueCStr(rb_url); }
645
+ if (RTEST(encoding)) { c_encoding = StringValueCStr(encoding); }
646
+ if (RTEST(rb_options)) { c_options = (int)NUM2INT(rb_options); }
647
+
648
+ reader = xmlReaderForMemory(
649
+ StringValuePtr(rb_buffer),
650
+ (int)RSTRING_LEN(rb_buffer),
651
+ c_url,
652
+ c_encoding,
653
+ c_options
654
+ );
655
+
656
+ if (reader == NULL) {
657
+ xmlFreeTextReader(reader);
658
+ rb_raise(rb_eRuntimeError, "couldn't create a parser");
659
+ }
660
+
661
+ rb_reader = Data_Wrap_Struct(klass, NULL, dealloc, reader);
662
+ args[0] = rb_buffer;
663
+ args[1] = rb_url;
664
+ args[2] = encoding;
665
+ rb_obj_call_init(rb_reader, 3, args);
666
+
667
+ return rb_reader;
668
+ }
669
+
670
+ /*
671
+ * call-seq:
672
+ * from_io(io, url = nil, encoding = nil, options = 0)
673
+ *
674
+ * Create a new reader that parses +io+
675
+ */
676
+ static VALUE
677
+ from_io(int argc, VALUE *argv, VALUE klass)
678
+ {
679
+ VALUE rb_io, rb_url, encoding, rb_options;
680
+ xmlTextReaderPtr reader;
681
+ const char *c_url = NULL;
682
+ const char *c_encoding = NULL;
683
+ int c_options = 0;
684
+ VALUE rb_reader, args[3];
685
+
686
+ rb_scan_args(argc, argv, "13", &rb_io, &rb_url, &encoding, &rb_options);
687
+
688
+ if (!RTEST(rb_io)) { rb_raise(rb_eArgError, "io cannot be nil"); }
689
+ if (RTEST(rb_url)) { c_url = StringValueCStr(rb_url); }
690
+ if (RTEST(encoding)) { c_encoding = StringValueCStr(encoding); }
691
+ if (RTEST(rb_options)) { c_options = (int)NUM2INT(rb_options); }
692
+
693
+ reader = xmlReaderForIO(
694
+ (xmlInputReadCallback)noko_io_read,
695
+ (xmlInputCloseCallback)noko_io_close,
696
+ (void *)rb_io,
697
+ c_url,
698
+ c_encoding,
699
+ c_options
700
+ );
701
+
702
+ if (reader == NULL) {
703
+ xmlFreeTextReader(reader);
704
+ rb_raise(rb_eRuntimeError, "couldn't create a parser");
705
+ }
706
+
707
+ rb_reader = Data_Wrap_Struct(klass, NULL, dealloc, reader);
708
+ args[0] = rb_io;
709
+ args[1] = rb_url;
710
+ args[2] = encoding;
711
+ rb_obj_call_init(rb_reader, 3, args);
712
+
713
+ return rb_reader;
714
+ }
715
+
716
+ /*
717
+ * call-seq:
718
+ * reader.empty_element? # => true or false
719
+ *
720
+ * Returns true if the current node is empty, otherwise false.
721
+ */
722
+ static VALUE
723
+ empty_element_p(VALUE self)
724
+ {
725
+ xmlTextReaderPtr reader;
726
+
727
+ Data_Get_Struct(self, xmlTextReader, reader);
728
+
729
+ if (xmlTextReaderIsEmptyElement(reader)) {
730
+ return Qtrue;
731
+ }
732
+
733
+ return Qfalse;
734
+ }
735
+
736
+ static VALUE
737
+ rb_xml_reader_encoding(VALUE rb_reader)
738
+ {
739
+ xmlTextReaderPtr c_reader;
740
+ const char *parser_encoding;
741
+ VALUE constructor_encoding;
742
+
743
+ constructor_encoding = rb_iv_get(rb_reader, "@encoding");
744
+ if (RTEST(constructor_encoding)) {
745
+ return constructor_encoding;
746
+ }
747
+
748
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
749
+ parser_encoding = (const char *)xmlTextReaderConstEncoding(c_reader);
750
+ if (parser_encoding == NULL) { return Qnil; }
751
+ return NOKOGIRI_STR_NEW2(parser_encoding);
752
+ }
753
+
754
+ void
755
+ noko_init_xml_reader(void)
756
+ {
757
+ /*
758
+ * The Reader parser allows you to effectively pull parse an XML document.
759
+ * Once instantiated, call Nokogiri::XML::Reader#each to iterate over each
760
+ * node. Note that you may only iterate over the document once!
761
+ */
762
+ cNokogiriXmlReader = rb_define_class_under(mNokogiriXml, "Reader", rb_cObject);
763
+
764
+ rb_undef_alloc_func(cNokogiriXmlReader);
765
+
766
+ rb_define_singleton_method(cNokogiriXmlReader, "from_memory", from_memory, -1);
767
+ rb_define_singleton_method(cNokogiriXmlReader, "from_io", from_io, -1);
768
+
769
+ rb_define_method(cNokogiriXmlReader, "attribute", reader_attribute, 1);
770
+ rb_define_method(cNokogiriXmlReader, "attribute_at", attribute_at, 1);
771
+ rb_define_method(cNokogiriXmlReader, "attribute_count", attribute_count, 0);
772
+ rb_define_method(cNokogiriXmlReader, "attribute_nodes", rb_xml_reader_attribute_nodes, 0);
773
+ rb_define_method(cNokogiriXmlReader, "attribute_hash", rb_xml_reader_attribute_hash, 0);
774
+ rb_define_method(cNokogiriXmlReader, "attributes?", attributes_eh, 0);
775
+ rb_define_method(cNokogiriXmlReader, "base_uri", rb_xml_reader_base_uri, 0);
776
+ rb_define_method(cNokogiriXmlReader, "default?", default_eh, 0);
777
+ rb_define_method(cNokogiriXmlReader, "depth", depth, 0);
778
+ rb_define_method(cNokogiriXmlReader, "empty_element?", empty_element_p, 0);
779
+ rb_define_method(cNokogiriXmlReader, "encoding", rb_xml_reader_encoding, 0);
780
+ rb_define_method(cNokogiriXmlReader, "inner_xml", inner_xml, 0);
781
+ rb_define_method(cNokogiriXmlReader, "lang", lang, 0);
782
+ rb_define_method(cNokogiriXmlReader, "local_name", local_name, 0);
783
+ rb_define_method(cNokogiriXmlReader, "name", name, 0);
784
+ rb_define_method(cNokogiriXmlReader, "namespace_uri", namespace_uri, 0);
785
+ rb_define_method(cNokogiriXmlReader, "namespaces", rb_xml_reader_namespaces, 0);
786
+ rb_define_method(cNokogiriXmlReader, "node_type", node_type, 0);
787
+ rb_define_method(cNokogiriXmlReader, "outer_xml", outer_xml, 0);
788
+ rb_define_method(cNokogiriXmlReader, "prefix", prefix, 0);
789
+ rb_define_method(cNokogiriXmlReader, "read", read_more, 0);
790
+ rb_define_method(cNokogiriXmlReader, "state", state, 0);
791
+ rb_define_method(cNokogiriXmlReader, "value", value, 0);
792
+ rb_define_method(cNokogiriXmlReader, "value?", value_eh, 0);
793
+ rb_define_method(cNokogiriXmlReader, "xml_version", xml_version, 0);
794
+ }