nokogiri 1.10.10 → 1.13.10

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 (220) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -0
  3. data/LICENSE-DEPENDENCIES.md +1173 -884
  4. data/LICENSE.md +1 -1
  5. data/README.md +178 -96
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -64
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +761 -424
  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 +199 -88
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +17 -17
  21. data/ext/nokogiri/xml_attribute_decl.c +21 -21
  22. data/ext/nokogiri/xml_cdata.c +14 -19
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +296 -220
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +25 -25
  29. data/ext/nokogiri/xml_encoding_handler.c +43 -18
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +98 -53
  33. data/ext/nokogiri/xml_node.c +1065 -653
  34. data/ext/nokogiri/xml_node_set.c +178 -166
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +281 -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 +98 -48
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +226 -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 +5 -3
  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 +74 -33
  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 +46 -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 +884 -378
  139. data/lib/nokogiri/xml/node_set.rb +51 -54
  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 +21 -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/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  166. data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
  167. data/patches/libxml2/{0004-libxml2.la-is-in-top_builddir.patch → 0003-libxml2.la-is-in-top_builddir.patch} +1 -1
  168. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  169. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  170. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  171. data/ports/archives/libxml2-2.10.3.tar.xz +0 -0
  172. data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
  173. metadata +201 -140
  174. data/ext/nokogiri/html_document.c +0 -170
  175. data/ext/nokogiri/html_document.h +0 -10
  176. data/ext/nokogiri/html_element_description.c +0 -279
  177. data/ext/nokogiri/html_element_description.h +0 -10
  178. data/ext/nokogiri/html_entity_lookup.c +0 -32
  179. data/ext/nokogiri/html_entity_lookup.h +0 -8
  180. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  181. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  182. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  183. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  184. data/ext/nokogiri/xml_attr.h +0 -9
  185. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  186. data/ext/nokogiri/xml_cdata.h +0 -9
  187. data/ext/nokogiri/xml_comment.h +0 -9
  188. data/ext/nokogiri/xml_document.h +0 -23
  189. data/ext/nokogiri/xml_document_fragment.h +0 -10
  190. data/ext/nokogiri/xml_dtd.h +0 -10
  191. data/ext/nokogiri/xml_element_content.h +0 -10
  192. data/ext/nokogiri/xml_element_decl.h +0 -9
  193. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  194. data/ext/nokogiri/xml_entity_decl.h +0 -10
  195. data/ext/nokogiri/xml_entity_reference.h +0 -9
  196. data/ext/nokogiri/xml_io.c +0 -61
  197. data/ext/nokogiri/xml_io.h +0 -11
  198. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  199. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  200. data/ext/nokogiri/xml_namespace.h +0 -14
  201. data/ext/nokogiri/xml_node.h +0 -13
  202. data/ext/nokogiri/xml_node_set.h +0 -12
  203. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  204. data/ext/nokogiri/xml_reader.h +0 -10
  205. data/ext/nokogiri/xml_relax_ng.h +0 -9
  206. data/ext/nokogiri/xml_sax_parser.h +0 -39
  207. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  208. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  209. data/ext/nokogiri/xml_schema.h +0 -9
  210. data/ext/nokogiri/xml_syntax_error.h +0 -13
  211. data/ext/nokogiri/xml_text.h +0 -9
  212. data/ext/nokogiri/xml_xpath_context.h +0 -10
  213. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  214. data/lib/nokogiri/html/document_fragment.rb +0 -49
  215. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  216. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  217. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  218. data/patches/libxml2/0005-Fix-infinite-loop-in-xmlStringLenDecodeEntities.patch +0 -32
  219. data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
  220. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
@@ -0,0 +1,222 @@
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
+
195
+ Gem::Requirement.new(requirement).satisfied_by?(VersionInfo.instance.loaded_libxml_version)
196
+ end
197
+
198
+ # :nodoc:
199
+ def self.uses_gumbo?
200
+ uses_libxml? # TODO: replace with Gumbo functionality
201
+ end
202
+
203
+ # :nodoc:
204
+ def self.jruby?
205
+ VersionInfo.instance.jruby?
206
+ end
207
+
208
+ # :nodoc:
209
+ def self.libxml2_patches
210
+ if VersionInfo.instance.libxml2_using_packaged?
211
+ Nokogiri::VERSION_INFO["libxml"]["patches"]
212
+ else
213
+ []
214
+ end
215
+ end
216
+
217
+ require_relative "../jruby/dependencies" if Nokogiri.jruby?
218
+ require_relative "../extension"
219
+
220
+ # Detailed version info about Nokogiri and the installed extension dependencies.
221
+ VERSION_INFO = VersionInfo.instance.to_hash
222
+ end
@@ -1,109 +1,4 @@
1
- module Nokogiri
2
- # The version of Nokogiri you are using
3
- VERSION = "1.10.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.
16
- scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first.
17
- collect(&:to_i).
18
- join(".")
19
- end
20
-
21
- def compiled_parser_version
22
- LIBXML_VERSION
23
- end
24
-
25
- def libxml2?
26
- defined?(LIBXML_VERSION)
27
- end
28
-
29
- def libxml2_using_system?
30
- !libxml2_using_packaged?
31
- end
32
-
33
- def libxml2_using_packaged?
34
- NOKOGIRI_USE_PACKAGED_LIBRARIES
35
- end
36
-
37
- def warnings
38
- return [] unless libxml2?
39
-
40
- if compiled_parser_version != loaded_parser_version
41
- ["Nokogiri was built against LibXML version #{compiled_parser_version}, but has dynamically loaded #{loaded_parser_version}"]
42
- else
43
- []
44
- end
45
- end
46
-
47
- def to_hash
48
- hash_info = {}
49
- hash_info["warnings"] = []
50
- hash_info["nokogiri"] = Nokogiri::VERSION
51
- hash_info["ruby"] = {}
52
- hash_info["ruby"]["version"] = ::RUBY_VERSION
53
- hash_info["ruby"]["platform"] = ::RUBY_PLATFORM
54
- hash_info["ruby"]["description"] = ::RUBY_DESCRIPTION
55
- hash_info["ruby"]["engine"] = engine
56
- hash_info["ruby"]["jruby"] = jruby? if jruby?
57
-
58
- if libxml2?
59
- hash_info["libxml"] = {}
60
- hash_info["libxml"]["binding"] = "extension"
61
- if libxml2_using_packaged?
62
- hash_info["libxml"]["source"] = "packaged"
63
- hash_info["libxml"]["libxml2_path"] = NOKOGIRI_LIBXML2_PATH
64
- hash_info["libxml"]["libxslt_path"] = NOKOGIRI_LIBXSLT_PATH
65
- hash_info["libxml"]["libxml2_patches"] = NOKOGIRI_LIBXML2_PATCHES
66
- hash_info["libxml"]["libxslt_patches"] = NOKOGIRI_LIBXSLT_PATCHES
67
- else
68
- hash_info["libxml"]["source"] = "system"
69
- end
70
- hash_info["libxml"]["compiled"] = compiled_parser_version
71
- hash_info["libxml"]["loaded"] = loaded_parser_version
72
- hash_info["warnings"] = warnings
73
- elsif jruby?
74
- hash_info["xerces"] = Nokogiri::XERCES_VERSION
75
- hash_info["nekohtml"] = Nokogiri::NEKO_VERSION
76
- end
77
-
78
- hash_info
79
- end
80
-
81
- def to_markdown
82
- begin
83
- require "psych"
84
- rescue LoadError
85
- end
86
- require "yaml"
87
- "# Nokogiri (#{Nokogiri::VERSION})\n" +
88
- YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join
89
- end
90
-
91
- # FIXME: maybe switch to singleton?
92
- @@instance = new
93
- @@instance.warnings.each do |warning|
94
- warn "WARNING: #{warning}"
95
- end
96
- def self.instance; @@instance; end
97
- end
98
-
99
- # More complete version information about libxml
100
- VERSION_INFO = VersionInfo.instance.to_hash
101
-
102
- def self.uses_libxml? # :nodoc:
103
- VersionInfo.instance.libxml2?
104
- end
105
-
106
- def self.jruby? # :nodoc:
107
- VersionInfo.instance.jruby?
108
- end
109
- 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
@@ -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,8 +285,8 @@ 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
@@ -268,24 +309,19 @@ module Nokogiri
268
309
  @doc = root.document
269
310
  @parent = root
270
311
  else
271
- klassname = "::" + (self.class.name.split("::")[0..-2] + ["Document"]).join("::")
272
- klass = begin
273
- Object.const_get(klassname)
274
- rescue NameError
275
- Nokogiri::XML::Document
276
- end
277
- @parent = @doc = klass.new
312
+ @parent = @doc = related_class("Document").new
278
313
  end
279
314
 
280
315
  @context = nil
281
316
  @arity = nil
282
317
  @ns = nil
283
318
 
319
+ options = DEFAULT_DOCUMENT_OPTIONS.merge(options)
284
320
  options.each do |k, v|
285
321
  @doc.send(:"#{k}=", v)
286
322
  end
287
323
 
288
- return unless block_given?
324
+ return unless block
289
325
 
290
326
  @arity = block.arity
291
327
  if @arity <= 0
@@ -301,19 +337,19 @@ module Nokogiri
301
337
  ###
302
338
  # Create a Text Node with content of +string+
303
339
  def text(string)
304
- insert @doc.create_text_node(string)
340
+ insert(@doc.create_text_node(string))
305
341
  end
306
342
 
307
343
  ###
308
344
  # Create a CDATA Node with content of +string+
309
345
  def cdata(string)
310
- insert doc.create_cdata(string)
346
+ insert(doc.create_cdata(string))
311
347
  end
312
348
 
313
349
  ###
314
350
  # Create a Comment Node with content of +string+
315
351
  def comment(string)
316
- insert doc.create_comment(string)
352
+ insert(doc.create_comment(string))
317
353
  end
318
354
 
319
355
  ###
@@ -327,12 +363,13 @@ module Nokogiri
327
363
 
328
364
  @parent.ancestors.each do |a|
329
365
  next if a == doc
366
+
330
367
  @ns = a.namespace_definitions.find { |x| x.prefix == ns.to_s }
331
368
  return self if @ns
332
369
  end
333
370
 
334
- @ns = { :pending => ns.to_s }
335
- return self
371
+ @ns = { pending: ns.to_s }
372
+ self
336
373
  end
337
374
 
338
375
  ###
@@ -340,7 +377,7 @@ module Nokogiri
340
377
  def to_xml(*args)
341
378
  if Nokogiri.jruby?
342
379
  options = args.first.is_a?(Hash) ? args.shift : {}
343
- if !options[:save_with]
380
+ unless options[:save_with]
344
381
  options[:save_with] = Node::SaveOptions::AS_BUILDER
345
382
  end
346
383
  args.insert(0, options)
@@ -355,22 +392,23 @@ module Nokogiri
355
392
  end
356
393
 
357
394
  def method_missing(method, *args, &block) # :nodoc:
358
- if @context && @context.respond_to?(method)
395
+ if @context&.respond_to?(method)
359
396
  @context.send(method, *args, &block)
360
397
  else
361
- node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) { |n|
398
+ node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) do |n|
362
399
  # Set up the namespace
363
- if @ns.is_a? Nokogiri::XML::Namespace
400
+ if @ns.is_a?(Nokogiri::XML::Namespace)
364
401
  n.namespace = @ns
365
402
  @ns = nil
366
403
  end
367
- }
404
+ end
368
405
 
369
- if @ns.is_a? Hash
406
+ if @ns.is_a?(Hash)
370
407
  node.namespace = node.namespace_definitions.find { |x| x.prefix == @ns[:pending] }
371
408
  if node.namespace.nil?
372
409
  raise ArgumentError, "Namespace #{@ns[:pending]} has not been defined"
373
410
  end
411
+
374
412
  @ns = nil
375
413
  end
376
414
 
@@ -384,16 +422,19 @@ module Nokogiri
384
422
  # Insert +node+ as a child of the current Node
385
423
  def insert(node, &block)
386
424
  node = @parent.add_child(node)
387
- if block_given?
388
- old_parent = @parent
389
- @parent = node
390
- @arity ||= block.arity
391
- if @arity <= 0
392
- instance_eval(&block)
393
- else
394
- block.call(self)
425
+ if block
426
+ begin
427
+ old_parent = @parent
428
+ @parent = node
429
+ @arity ||= block.arity
430
+ if @arity <= 0
431
+ instance_eval(&block)
432
+ else
433
+ yield(self)
434
+ end
435
+ ensure
436
+ @parent = old_parent
395
437
  end
396
- @parent = old_parent
397
438
  end
398
439
  NodeBuilder.new(node, self)
399
440
  end
@@ -416,10 +457,10 @@ module Nokogiri
416
457
  opts = args.last.is_a?(Hash) ? args.pop : {}
417
458
  case method.to_s
418
459
  when /^(.*)!$/
419
- @node["id"] = $1
460
+ @node["id"] = Regexp.last_match(1)
420
461
  @node.content = args.first if args.first
421
462
  when /^(.*)=/
422
- @node[$1] = args.first
463
+ @node[Regexp.last_match(1)] = args.first
423
464
  else
424
465
  @node["class"] =
425
466
  ((@node["class"] || "").split(/\s/) + [method.to_s]).join(" ")
@@ -431,7 +472,7 @@ module Nokogiri
431
472
  @node[k.to_s] = ((@node[k.to_s] || "").split(/\s/) + [v]).join(" ")
432
473
  end
433
474
 
434
- if block_given?
475
+ if block
435
476
  old_parent = @doc_builder.parent
436
477
  @doc_builder.parent = @node
437
478
  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