nokogiri 1.5.10 → 1.13.0

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

Potentially problematic release.


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

Files changed (334) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +280 -0
  6. data/bin/nokogiri +84 -31
  7. data/dependencies.yml +73 -0
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +956 -100
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +120 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +232 -87
  18. data/ext/nokogiri/nokogiri.h +188 -129
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +49 -40
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +24 -23
  23. data/ext/nokogiri/xml_comment.c +29 -21
  24. data/ext/nokogiri/xml_document.c +327 -223
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +45 -20
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +74 -32
  33. data/ext/nokogiri/xml_node.c +1290 -680
  34. data/ext/nokogiri/xml_node_set.c +239 -208
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +227 -189
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +123 -125
  39. data/ext/nokogiri/xml_sax_parser_context.c +138 -79
  40. data/ext/nokogiri/xml_sax_push_parser.c +88 -35
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +50 -23
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +227 -140
  45. data/ext/nokogiri/xslt_stylesheet.c +162 -168
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +68 -0
  88. data/gumbo-parser/src/util.h +30 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -58
  93. data/lib/nokogiri/css/parser.rb +327 -288
  94. data/lib/nokogiri/css/parser.y +67 -45
  95. data/lib/nokogiri/css/parser_extras.rb +52 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +7 -6
  99. data/lib/nokogiri/css/xpath_visitor.rb +263 -75
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +17 -8
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/html4/document.rb +331 -0
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -15
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +88 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +96 -0
  118. data/lib/nokogiri/html5.rb +477 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +221 -0
  123. data/lib/nokogiri/version.rb +3 -90
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +96 -54
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +234 -95
  130. data/lib/nokogiri/xml/document_fragment.rb +86 -36
  131. data/lib/nokogiri/xml/dtd.rb +16 -4
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +8 -4
  138. data/lib/nokogiri/xml/node.rb +947 -502
  139. data/lib/nokogiri/xml/node_set.rb +168 -159
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +40 -5
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +43 -41
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +259 -0
  155. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -36
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +18 -16
  163. data/lib/nokogiri.rb +69 -69
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
  171. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
  172. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  173. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  174. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  175. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
  176. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  177. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  178. metadata +382 -460
  179. data/.autotest +0 -26
  180. data/.gemtest +0 -0
  181. data/CHANGELOG.ja.rdoc +0 -785
  182. data/CHANGELOG.rdoc +0 -783
  183. data/C_CODING_STYLE.rdoc +0 -33
  184. data/Manifest.txt +0 -303
  185. data/README.ja.rdoc +0 -106
  186. data/README.rdoc +0 -175
  187. data/ROADMAP.md +0 -90
  188. data/Rakefile +0 -228
  189. data/STANDARD_RESPONSES.md +0 -47
  190. data/Y_U_NO_GEMSPEC.md +0 -155
  191. data/build_all +0 -105
  192. data/ext/nokogiri/html_document.c +0 -170
  193. data/ext/nokogiri/html_document.h +0 -10
  194. data/ext/nokogiri/html_element_description.c +0 -279
  195. data/ext/nokogiri/html_element_description.h +0 -10
  196. data/ext/nokogiri/html_entity_lookup.c +0 -32
  197. data/ext/nokogiri/html_entity_lookup.h +0 -8
  198. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  199. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  200. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  201. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  202. data/ext/nokogiri/xml_attr.h +0 -9
  203. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  204. data/ext/nokogiri/xml_cdata.h +0 -9
  205. data/ext/nokogiri/xml_comment.h +0 -9
  206. data/ext/nokogiri/xml_document.h +0 -23
  207. data/ext/nokogiri/xml_document_fragment.h +0 -10
  208. data/ext/nokogiri/xml_dtd.h +0 -10
  209. data/ext/nokogiri/xml_element_content.h +0 -10
  210. data/ext/nokogiri/xml_element_decl.h +0 -9
  211. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  212. data/ext/nokogiri/xml_entity_decl.h +0 -10
  213. data/ext/nokogiri/xml_entity_reference.h +0 -9
  214. data/ext/nokogiri/xml_io.c +0 -56
  215. data/ext/nokogiri/xml_io.h +0 -11
  216. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  217. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  218. data/ext/nokogiri/xml_namespace.h +0 -13
  219. data/ext/nokogiri/xml_node.h +0 -13
  220. data/ext/nokogiri/xml_node_set.h +0 -14
  221. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  222. data/ext/nokogiri/xml_reader.h +0 -10
  223. data/ext/nokogiri/xml_relax_ng.h +0 -9
  224. data/ext/nokogiri/xml_sax_parser.h +0 -39
  225. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  226. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  227. data/ext/nokogiri/xml_schema.h +0 -9
  228. data/ext/nokogiri/xml_syntax_error.h +0 -13
  229. data/ext/nokogiri/xml_text.h +0 -9
  230. data/ext/nokogiri/xml_xpath_context.h +0 -10
  231. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  232. data/lib/nokogiri/html/document.rb +0 -254
  233. data/lib/nokogiri/html/document_fragment.rb +0 -41
  234. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  235. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  236. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  237. data/tasks/cross_compile.rb +0 -150
  238. data/tasks/nokogiri.org.rb +0 -24
  239. data/tasks/test.rb +0 -95
  240. data/test/css/test_nthiness.rb +0 -159
  241. data/test/css/test_parser.rb +0 -341
  242. data/test/css/test_tokenizer.rb +0 -198
  243. data/test/css/test_xpath_visitor.rb +0 -91
  244. data/test/decorators/test_slop.rb +0 -16
  245. data/test/files/2ch.html +0 -108
  246. data/test/files/address_book.rlx +0 -12
  247. data/test/files/address_book.xml +0 -10
  248. data/test/files/bar/bar.xsd +0 -4
  249. data/test/files/dont_hurt_em_why.xml +0 -422
  250. data/test/files/encoding.html +0 -82
  251. data/test/files/encoding.xhtml +0 -84
  252. data/test/files/exslt.xml +0 -8
  253. data/test/files/exslt.xslt +0 -35
  254. data/test/files/foo/foo.xsd +0 -4
  255. data/test/files/metacharset.html +0 -10
  256. data/test/files/noencoding.html +0 -47
  257. data/test/files/po.xml +0 -32
  258. data/test/files/po.xsd +0 -66
  259. data/test/files/shift_jis.html +0 -10
  260. data/test/files/shift_jis.xml +0 -5
  261. data/test/files/snuggles.xml +0 -3
  262. data/test/files/staff.dtd +0 -10
  263. data/test/files/staff.xml +0 -59
  264. data/test/files/staff.xslt +0 -32
  265. data/test/files/test_document_url/bar.xml +0 -2
  266. data/test/files/test_document_url/document.dtd +0 -4
  267. data/test/files/test_document_url/document.xml +0 -6
  268. data/test/files/tlm.html +0 -850
  269. data/test/files/to_be_xincluded.xml +0 -2
  270. data/test/files/valid_bar.xml +0 -2
  271. data/test/files/xinclude.xml +0 -4
  272. data/test/helper.rb +0 -154
  273. data/test/html/sax/test_parser.rb +0 -141
  274. data/test/html/sax/test_parser_context.rb +0 -46
  275. data/test/html/test_builder.rb +0 -164
  276. data/test/html/test_document.rb +0 -552
  277. data/test/html/test_document_encoding.rb +0 -138
  278. data/test/html/test_document_fragment.rb +0 -261
  279. data/test/html/test_element_description.rb +0 -105
  280. data/test/html/test_named_characters.rb +0 -14
  281. data/test/html/test_node.rb +0 -196
  282. data/test/html/test_node_encoding.rb +0 -27
  283. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  284. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  285. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  286. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  287. data/test/test_convert_xpath.rb +0 -135
  288. data/test/test_css_cache.rb +0 -45
  289. data/test/test_encoding_handler.rb +0 -46
  290. data/test/test_memory_leak.rb +0 -156
  291. data/test/test_nokogiri.rb +0 -132
  292. data/test/test_reader.rb +0 -555
  293. data/test/test_soap4r_sax.rb +0 -52
  294. data/test/test_xslt_transforms.rb +0 -254
  295. data/test/xml/node/test_save_options.rb +0 -28
  296. data/test/xml/node/test_subclass.rb +0 -44
  297. data/test/xml/sax/test_parser.rb +0 -366
  298. data/test/xml/sax/test_parser_context.rb +0 -106
  299. data/test/xml/sax/test_push_parser.rb +0 -157
  300. data/test/xml/test_attr.rb +0 -64
  301. data/test/xml/test_attribute_decl.rb +0 -86
  302. data/test/xml/test_builder.rb +0 -306
  303. data/test/xml/test_c14n.rb +0 -151
  304. data/test/xml/test_cdata.rb +0 -48
  305. data/test/xml/test_comment.rb +0 -29
  306. data/test/xml/test_document.rb +0 -828
  307. data/test/xml/test_document_encoding.rb +0 -28
  308. data/test/xml/test_document_fragment.rb +0 -223
  309. data/test/xml/test_dtd.rb +0 -103
  310. data/test/xml/test_dtd_encoding.rb +0 -33
  311. data/test/xml/test_element_content.rb +0 -56
  312. data/test/xml/test_element_decl.rb +0 -73
  313. data/test/xml/test_entity_decl.rb +0 -122
  314. data/test/xml/test_entity_reference.rb +0 -245
  315. data/test/xml/test_namespace.rb +0 -95
  316. data/test/xml/test_node.rb +0 -1137
  317. data/test/xml/test_node_attributes.rb +0 -96
  318. data/test/xml/test_node_encoding.rb +0 -107
  319. data/test/xml/test_node_inheritance.rb +0 -32
  320. data/test/xml/test_node_reparenting.rb +0 -374
  321. data/test/xml/test_node_set.rb +0 -755
  322. data/test/xml/test_parse_options.rb +0 -64
  323. data/test/xml/test_processing_instruction.rb +0 -30
  324. data/test/xml/test_reader_encoding.rb +0 -142
  325. data/test/xml/test_relax_ng.rb +0 -60
  326. data/test/xml/test_schema.rb +0 -103
  327. data/test/xml/test_syntax_error.rb +0 -12
  328. data/test/xml/test_text.rb +0 -45
  329. data/test/xml/test_unparented_node.rb +0 -422
  330. data/test/xml/test_xinclude.rb +0 -83
  331. data/test/xml/test_xpath.rb +0 -295
  332. data/test/xslt/test_custom_functions.rb +0 -133
  333. data/test/xslt/test_exception_handling.rb +0 -37
  334. data/test_all +0 -81
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+ require "shellwords"
5
+
6
+ module Nokogiri
7
+ class VersionInfo # :nodoc:
8
+ include Singleton
9
+
10
+ def jruby?
11
+ ::JRUBY_VERSION if ::RUBY_PLATFORM == "java"
12
+ end
13
+
14
+ def windows?
15
+ ::RUBY_PLATFORM =~ /mingw|mswin/
16
+ end
17
+
18
+ def ruby_minor
19
+ Gem::Version.new(::RUBY_VERSION).segments[0..1].join(".")
20
+ end
21
+
22
+ def engine
23
+ defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "mri"
24
+ end
25
+
26
+ def loaded_libxml_version
27
+ Gem::Version.new(Nokogiri::LIBXML_LOADED_VERSION
28
+ .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first
29
+ .collect(&:to_i)
30
+ .join("."))
31
+ end
32
+
33
+ def compiled_libxml_version
34
+ Gem::Version.new(Nokogiri::LIBXML_COMPILED_VERSION)
35
+ end
36
+
37
+ def loaded_libxslt_version
38
+ Gem::Version.new(Nokogiri::LIBXSLT_LOADED_VERSION
39
+ .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first
40
+ .collect(&:to_i)
41
+ .join("."))
42
+ end
43
+
44
+ def compiled_libxslt_version
45
+ Gem::Version.new(Nokogiri::LIBXSLT_COMPILED_VERSION)
46
+ end
47
+
48
+ def libxml2?
49
+ defined?(Nokogiri::LIBXML_COMPILED_VERSION)
50
+ end
51
+
52
+ def libxml2_has_iconv?
53
+ defined?(Nokogiri::LIBXML_ICONV_ENABLED) && Nokogiri::LIBXML_ICONV_ENABLED
54
+ end
55
+
56
+ def libxslt_has_datetime?
57
+ defined?(Nokogiri::LIBXSLT_DATETIME_ENABLED) && Nokogiri::LIBXSLT_DATETIME_ENABLED
58
+ end
59
+
60
+ def libxml2_using_packaged?
61
+ libxml2? && Nokogiri::PACKAGED_LIBRARIES
62
+ end
63
+
64
+ def libxml2_using_system?
65
+ libxml2? && !libxml2_using_packaged?
66
+ end
67
+
68
+ def libxml2_precompiled?
69
+ libxml2_using_packaged? && Nokogiri::PRECOMPILED_LIBRARIES
70
+ end
71
+
72
+ def warnings
73
+ warnings = []
74
+
75
+ if libxml2?
76
+ if compiled_libxml_version != loaded_libxml_version
77
+ warnings << "Nokogiri was built against libxml version #{compiled_libxml_version}, but has dynamically loaded #{loaded_libxml_version}"
78
+ end
79
+
80
+ if compiled_libxslt_version != loaded_libxslt_version
81
+ warnings << "Nokogiri was built against libxslt version #{compiled_libxslt_version}, but has dynamically loaded #{loaded_libxslt_version}"
82
+ end
83
+ end
84
+
85
+ warnings
86
+ end
87
+
88
+ def to_hash
89
+ header_directory = File.expand_path(File.join(File.dirname(__FILE__), "../../../ext/nokogiri"))
90
+
91
+ {}.tap do |vi|
92
+ vi["warnings"] = []
93
+ vi["nokogiri"] = {}.tap do |nokogiri|
94
+ nokogiri["version"] = Nokogiri::VERSION
95
+
96
+ unless jruby?
97
+ # enable gems like nokogumbo to build with the following in their extconf.rb:
98
+ #
99
+ # append_cflags(Nokogiri::VERSION_INFO["nokogiri"]["cppflags"])
100
+ # append_ldflags(Nokogiri::VERSION_INFO["nokogiri"]["ldflags"])
101
+ #
102
+ cppflags = ["-I#{header_directory.shellescape}"]
103
+ ldflags = []
104
+
105
+ if libxml2_using_packaged?
106
+ cppflags << "-I#{File.join(header_directory, "include").shellescape}"
107
+ cppflags << "-I#{File.join(header_directory, "include/libxml2").shellescape}"
108
+
109
+ if windows?
110
+ # on windows, nokogumbo needs to link against nokogiri.so to resolve symbols. see #2167
111
+ lib_directory = File.expand_path(File.join(File.dirname(__FILE__), "../#{ruby_minor}"))
112
+ unless File.exist?(lib_directory)
113
+ lib_directory = File.expand_path(File.join(File.dirname(__FILE__), ".."))
114
+ end
115
+ ldflags << "-L#{lib_directory.shellescape}"
116
+ ldflags << "-l:nokogiri.so"
117
+ end
118
+ end
119
+
120
+ nokogiri["cppflags"] = cppflags
121
+ nokogiri["ldflags"] = ldflags
122
+ end
123
+ end
124
+ vi["ruby"] = {}.tap do |ruby|
125
+ ruby["version"] = ::RUBY_VERSION
126
+ ruby["platform"] = ::RUBY_PLATFORM
127
+ ruby["gem_platform"] = ::Gem::Platform.local.to_s
128
+ ruby["description"] = ::RUBY_DESCRIPTION
129
+ ruby["engine"] = engine
130
+ ruby["jruby"] = jruby? if jruby?
131
+ end
132
+
133
+ if libxml2?
134
+ vi["libxml"] = {}.tap do |libxml|
135
+ if libxml2_using_packaged?
136
+ libxml["source"] = "packaged"
137
+ libxml["precompiled"] = libxml2_precompiled?
138
+ libxml["patches"] = Nokogiri::LIBXML2_PATCHES
139
+
140
+ # this is for nokogumbo and shouldn't be forever
141
+ libxml["libxml2_path"] = header_directory
142
+ else
143
+ libxml["source"] = "system"
144
+ end
145
+ libxml["memory_management"] = Nokogiri::LIBXML_MEMORY_MANAGEMENT
146
+ libxml["iconv_enabled"] = libxml2_has_iconv?
147
+ libxml["compiled"] = compiled_libxml_version.to_s
148
+ libxml["loaded"] = loaded_libxml_version.to_s
149
+ end
150
+
151
+ vi["libxslt"] = {}.tap do |libxslt|
152
+ if libxml2_using_packaged?
153
+ libxslt["source"] = "packaged"
154
+ libxslt["precompiled"] = libxml2_precompiled?
155
+ libxslt["patches"] = Nokogiri::LIBXSLT_PATCHES
156
+ else
157
+ libxslt["source"] = "system"
158
+ end
159
+ libxslt["datetime_enabled"] = libxslt_has_datetime?
160
+ libxslt["compiled"] = compiled_libxslt_version.to_s
161
+ libxslt["loaded"] = loaded_libxslt_version.to_s
162
+ end
163
+
164
+ vi["warnings"] = warnings
165
+ end
166
+
167
+ if defined?(Nokogiri::OTHER_LIBRARY_VERSIONS)
168
+ # see extconf for how this string is assembled: "lib1name:lib1version,lib2name:lib2version"
169
+ vi["other_libraries"] = Hash[*Nokogiri::OTHER_LIBRARY_VERSIONS.split(/[,:]/)]
170
+ elsif jruby?
171
+ vi["other_libraries"] = {}.tap do |ol|
172
+ ol["xerces"] = Nokogiri::XERCES_VERSION
173
+ ol["nekohtml"] = Nokogiri::NEKO_VERSION
174
+ end
175
+ end
176
+ end
177
+ end
178
+
179
+ def to_markdown
180
+ require "yaml"
181
+ "# Nokogiri (#{Nokogiri::VERSION})\n" +
182
+ YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join
183
+ end
184
+
185
+ instance.warnings.each do |warning|
186
+ warn "WARNING: #{warning}"
187
+ end
188
+ end
189
+
190
+ # :nodoc:
191
+ def self.uses_libxml?(requirement = nil)
192
+ return false unless VersionInfo.instance.libxml2?
193
+ return true unless requirement
194
+ Gem::Requirement.new(requirement).satisfied_by?(VersionInfo.instance.loaded_libxml_version)
195
+ end
196
+
197
+ # :nodoc:
198
+ def self.uses_gumbo?
199
+ uses_libxml? # TODO: replace with Gumbo functionality
200
+ end
201
+
202
+ # :nodoc:
203
+ def self.jruby?
204
+ VersionInfo.instance.jruby?
205
+ end
206
+
207
+ # :nodoc:
208
+ def self.libxml2_patches
209
+ if VersionInfo.instance.libxml2_using_packaged?
210
+ Nokogiri::VERSION_INFO["libxml"]["patches"]
211
+ else
212
+ []
213
+ end
214
+ end
215
+
216
+ require_relative "../jruby/dependencies" if Nokogiri.jruby?
217
+ require_relative "../extension"
218
+
219
+ # Detailed version info about Nokogiri and the installed extension dependencies.
220
+ VERSION_INFO = VersionInfo.instance.to_hash
221
+ end
@@ -1,91 +1,4 @@
1
- module Nokogiri
2
- # The version of Nokogiri you are using
3
- VERSION = '1.5.10'
1
+ # frozen_string_literal: true
4
2
 
5
- class VersionInfo # :nodoc:
6
- def jruby?
7
- ::JRUBY_VERSION if RUBY_PLATFORM == "java"
8
- end
9
-
10
- def engine
11
- defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'mri'
12
- end
13
-
14
- def loaded_parser_version
15
- LIBXML_PARSER_VERSION.scan(/^(.*)(..)(..)$/).first.collect{ |j|
16
- j.to_i
17
- }.join(".")
18
- end
19
-
20
- def compiled_parser_version
21
- LIBXML_VERSION
22
- end
23
-
24
- def libxml2?
25
- defined?(LIBXML_VERSION)
26
- end
27
-
28
- def warnings
29
- return [] unless libxml2?
30
-
31
- if compiled_parser_version != loaded_parser_version
32
- ["Nokogiri was built against LibXML version #{compiled_parser_version}, but has dynamically loaded #{loaded_parser_version}"]
33
- else
34
- []
35
- end
36
- end
37
-
38
- def to_hash
39
- hash_info = {}
40
- hash_info['warnings'] = []
41
- hash_info['nokogiri'] = Nokogiri::VERSION
42
- hash_info['ruby'] = {}
43
- hash_info['ruby']['version'] = ::RUBY_VERSION
44
- hash_info['ruby']['platform'] = ::RUBY_PLATFORM
45
- hash_info['ruby']['description'] = ::RUBY_DESCRIPTION
46
- hash_info['ruby']['engine'] = engine
47
- hash_info['ruby']['jruby'] = jruby? if jruby?
48
-
49
- if libxml2?
50
- hash_info['libxml'] = {}
51
- hash_info['libxml']['binding'] = 'extension'
52
- hash_info['libxml']['compiled'] = compiled_parser_version
53
- hash_info['libxml']['loaded'] = loaded_parser_version
54
- hash_info['warnings'] = warnings
55
- elsif jruby?
56
- hash_info['xerces'] = Nokogiri::XERCES_VERSION
57
- hash_info['nekohtml'] = Nokogiri::NEKO_VERSION
58
- end
59
-
60
- hash_info
61
- end
62
-
63
- def to_markdown
64
- begin
65
- require 'psych'
66
- rescue LoadError
67
- end
68
- require 'yaml'
69
- "# Nokogiri (#{Nokogiri::VERSION})\n" +
70
- YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join
71
- end
72
-
73
- # FIXME: maybe switch to singleton?
74
- @@instance = new
75
- @@instance.warnings.each do |warning|
76
- warn "WARNING: #{warning}"
77
- end
78
- def self.instance; @@instance; end
79
- end
80
-
81
- # More complete version information about libxml
82
- VERSION_INFO = VersionInfo.instance.to_hash
83
-
84
- def self.uses_libxml? # :nodoc:
85
- VersionInfo.instance.libxml2?
86
- end
87
-
88
- def self.jruby? # :nodoc:
89
- VersionInfo.instance.jruby?
90
- end
91
- end
3
+ require_relative "version/constant"
4
+ require_relative "version/info"
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class Attr < Node
4
- alias :value :content
5
- alias :to_s :content
6
- alias :content= :value=
6
+ alias_method :value, :content
7
+ alias_method :to_s, :content
8
+ alias_method :content=, :value=
7
9
 
8
10
  private
11
+
9
12
  def inspect_attributes
10
13
  [:name, :namespace, :value]
11
14
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -11,7 +13,7 @@ module Nokogiri
11
13
  undef_method :line if method_defined?(:line)
12
14
 
13
15
  def inspect
14
- "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>"
16
+ "#<#{self.class.name}:#{format("0x%x", object_id)} #{to_s.inspect}>"
15
17
  end
16
18
  end
17
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -195,6 +197,41 @@ module Nokogiri
195
197
  #
196
198
  # Note the "foo:object" tag.
197
199
  #
200
+ # === Namespace inheritance
201
+ #
202
+ # In the Builder context, children will inherit their parent's namespace. This is the same
203
+ # behavior as if the underlying {XML::Document} set +namespace_inheritance+ to +true+:
204
+ #
205
+ # result = Nokogiri::XML::Builder.new do |xml|
206
+ # xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
207
+ # xml.Header
208
+ # end
209
+ # end
210
+ # result.doc.to_xml
211
+ # # => <?xml version="1.0" encoding="utf-8"?>
212
+ # # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
213
+ # # <soapenv:Header/>
214
+ # # </soapenv:Envelope>
215
+ #
216
+ # Users may turn this behavior off by passing a keyword argument +namespace_inheritance:false+
217
+ # to the initializer:
218
+ #
219
+ # result = Nokogiri::XML::Builder.new(namespace_inheritance: false) do |xml|
220
+ # xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
221
+ # xml.Header
222
+ # xml["soapenv"].Body # users may explicitly opt into the namespace
223
+ # end
224
+ # end
225
+ # result.doc.to_xml
226
+ # # => <?xml version="1.0" encoding="utf-8"?>
227
+ # # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
228
+ # # <Header/>
229
+ # # <soapenv:Body/>
230
+ # # </soapenv:Envelope>
231
+ #
232
+ # For more information on namespace inheritance, please see {XML::Document#namespace_inheritance}
233
+ #
234
+ #
198
235
  # == Document Types
199
236
  #
200
237
  # To create a document type (DTD), access use the Builder#doc method to get
@@ -213,7 +250,7 @@ module Nokogiri
213
250
  # xml.foo
214
251
  # end
215
252
  # end
216
- #
253
+ #
217
254
  # puts builder.to_xml
218
255
  #
219
256
  # Will output this xml:
@@ -225,6 +262,10 @@ module Nokogiri
225
262
  # </root>
226
263
  #
227
264
  class Builder
265
+ include Nokogiri::ClassResolver
266
+
267
+ DEFAULT_DOCUMENT_OPTIONS = { namespace_inheritance: true }
268
+
228
269
  # The current Document object being built
229
270
  attr_accessor :doc
230
271
 
@@ -244,13 +285,13 @@ module Nokogiri
244
285
  #
245
286
  # For example:
246
287
  #
247
- # doc = Nokogiri::XML(open('somedoc.xml'))
248
- # Nokogiri::XML::Builder.with(doc.at('some_tag')) do |xml|
288
+ # doc = Nokogiri::XML(File.read('somedoc.xml'))
289
+ # Nokogiri::XML::Builder.with(doc.at_css('some_tag')) do |xml|
249
290
  # # ... Use normal builder methods here ...
250
291
  # xml.awesome # add the "awesome" tag below "some_tag"
251
292
  # end
252
293
  #
253
- def self.with root, &block
294
+ def self.with(root, &block)
254
295
  new({}, root, &block)
255
296
  end
256
297
 
@@ -263,31 +304,28 @@ module Nokogiri
263
304
  # Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
264
305
  # ...
265
306
  # end
266
- def initialize options = {}, root = nil, &block
267
-
307
+ def initialize(options = {}, root = nil, &block)
268
308
  if root
269
- @doc = root.document
309
+ @doc = root.document
270
310
  @parent = root
271
311
  else
272
- namespace = self.class.name.split('::')
273
- namespace[-1] = 'Document'
274
- @doc = eval(namespace.join('::')).new
275
- @parent = @doc
312
+ @parent = @doc = related_class("Document").new
276
313
  end
277
314
 
278
- @context = nil
279
- @arity = nil
280
- @ns = nil
315
+ @context = nil
316
+ @arity = nil
317
+ @ns = nil
281
318
 
282
- options.each do |k,v|
319
+ options = DEFAULT_DOCUMENT_OPTIONS.merge(options)
320
+ options.each do |k, v|
283
321
  @doc.send(:"#{k}=", v)
284
322
  end
285
323
 
286
- return unless block_given?
324
+ return unless block
287
325
 
288
326
  @arity = block.arity
289
327
  if @arity <= 0
290
- @context = eval('self', block.binding)
328
+ @context = eval("self", block.binding)
291
329
  instance_eval(&block)
292
330
  else
293
331
  yield self
@@ -298,26 +336,26 @@ module Nokogiri
298
336
 
299
337
  ###
300
338
  # Create a Text Node with content of +string+
301
- def text string
302
- insert @doc.create_text_node(string)
339
+ def text(string)
340
+ insert(@doc.create_text_node(string))
303
341
  end
304
342
 
305
343
  ###
306
344
  # Create a CDATA Node with content of +string+
307
- def cdata string
308
- insert doc.create_cdata(string)
345
+ def cdata(string)
346
+ insert(doc.create_cdata(string))
309
347
  end
310
348
 
311
349
  ###
312
350
  # Create a Comment Node with content of +string+
313
- def comment string
314
- insert doc.create_comment(string)
351
+ def comment(string)
352
+ insert(doc.create_comment(string))
315
353
  end
316
354
 
317
355
  ###
318
356
  # Build a tag that is associated with namespace +ns+. Raises an
319
357
  # ArgumentError if +ns+ has not been defined higher in the tree.
320
- def [] ns
358
+ def [](ns)
321
359
  if @parent != @doc
322
360
  @ns = @parent.namespace_definitions.find { |x| x.prefix == ns.to_s }
323
361
  end
@@ -329,8 +367,8 @@ module Nokogiri
329
367
  return self if @ns
330
368
  end
331
369
 
332
- @ns = { :pending => ns.to_s }
333
- return self
370
+ @ns = { pending: ns.to_s }
371
+ self
334
372
  end
335
373
 
336
374
  ###
@@ -338,7 +376,7 @@ module Nokogiri
338
376
  def to_xml(*args)
339
377
  if Nokogiri.jruby?
340
378
  options = args.first.is_a?(Hash) ? args.shift : {}
341
- if !options[:save_with]
379
+ unless options[:save_with]
342
380
  options[:save_with] = Node::SaveOptions::AS_BUILDER
343
381
  end
344
382
  args.insert(0, options)
@@ -348,23 +386,23 @@ module Nokogiri
348
386
 
349
387
  ###
350
388
  # Append the given raw XML +string+ to the document
351
- def << string
389
+ def <<(string)
352
390
  @doc.fragment(string).children.each { |x| insert(x) }
353
391
  end
354
392
 
355
- def method_missing method, *args, &block # :nodoc:
356
- if @context && @context.respond_to?(method)
393
+ def method_missing(method, *args, &block) # :nodoc:
394
+ if @context&.respond_to?(method)
357
395
  @context.send(method, *args, &block)
358
396
  else
359
- node = @doc.create_element(method.to_s.sub(/[_!]$/, ''),*args) { |n|
397
+ node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) do |n|
360
398
  # Set up the namespace
361
- if @ns.is_a? Nokogiri::XML::Namespace
399
+ if @ns.is_a?(Nokogiri::XML::Namespace)
362
400
  n.namespace = @ns
363
401
  @ns = nil
364
402
  end
365
- }
403
+ end
366
404
 
367
- if @ns.is_a? Hash
405
+ if @ns.is_a?(Hash)
368
406
  node.namespace = node.namespace_definitions.find { |x| x.prefix == @ns[:pending] }
369
407
  if node.namespace.nil?
370
408
  raise ArgumentError, "Namespace #{@ns[:pending]} has not been defined"
@@ -377,35 +415,39 @@ module Nokogiri
377
415
  end
378
416
 
379
417
  private
418
+
380
419
  ###
381
420
  # Insert +node+ as a child of the current Node
382
421
  def insert(node, &block)
383
- node.parent = @parent
384
- if block_given?
385
- old_parent = @parent
386
- @parent = node
387
- @arity ||= block.arity
388
- if @arity <= 0
389
- instance_eval(&block)
390
- else
391
- block.call(self)
422
+ node = @parent.add_child(node)
423
+ if block
424
+ begin
425
+ old_parent = @parent
426
+ @parent = node
427
+ @arity ||= block.arity
428
+ if @arity <= 0
429
+ instance_eval(&block)
430
+ else
431
+ yield(self)
432
+ end
433
+ ensure
434
+ @parent = old_parent
392
435
  end
393
- @parent = old_parent
394
436
  end
395
437
  NodeBuilder.new(node, self)
396
438
  end
397
439
 
398
440
  class NodeBuilder # :nodoc:
399
- def initialize node, doc_builder
441
+ def initialize(node, doc_builder)
400
442
  @node = node
401
443
  @doc_builder = doc_builder
402
444
  end
403
445
 
404
- def []= k, v
446
+ def []=(k, v)
405
447
  @node[k] = v
406
448
  end
407
449
 
408
- def [] k
450
+ def [](k)
409
451
  @node[k]
410
452
  end
411
453
 
@@ -413,22 +455,22 @@ module Nokogiri
413
455
  opts = args.last.is_a?(Hash) ? args.pop : {}
414
456
  case method.to_s
415
457
  when /^(.*)!$/
416
- @node['id'] = $1
458
+ @node["id"] = Regexp.last_match(1)
417
459
  @node.content = args.first if args.first
418
460
  when /^(.*)=/
419
- @node[$1] = args.first
461
+ @node[Regexp.last_match(1)] = args.first
420
462
  else
421
- @node['class'] =
422
- ((@node['class'] || '').split(/\s/) + [method.to_s]).join(' ')
463
+ @node["class"] =
464
+ ((@node["class"] || "").split(/\s/) + [method.to_s]).join(" ")
423
465
  @node.content = args.first if args.first
424
466
  end
425
467
 
426
468
  # Assign any extra options
427
- opts.each do |k,v|
428
- @node[k.to_s] = ((@node[k.to_s] || '').split(/\s/) + [v]).join(' ')
469
+ opts.each do |k, v|
470
+ @node[k.to_s] = ((@node[k.to_s] || "").split(/\s/) + [v]).join(" ")
429
471
  end
430
472
 
431
- if block_given?
473
+ if block
432
474
  old_parent = @doc_builder.parent
433
475
  @doc_builder.parent = @node
434
476
  value = @doc_builder.instance_eval(&block)
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class CDATA < Nokogiri::XML::Text
4
6
  ###
5
7
  # Get the name of this CDATA node
6
8
  def name
7
- '#cdata-section'
9
+ "#cdata-section"
8
10
  end
9
11
  end
10
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class CharacterData < Nokogiri::XML::Node