nokogiri 1.10.3 → 1.12.5

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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/LICENSE-DEPENDENCIES.md +1173 -884
  4. data/LICENSE.md +1 -1
  5. data/README.md +176 -96
  6. data/dependencies.yml +28 -26
  7. data/ext/nokogiri/depend +38 -358
  8. data/ext/nokogiri/extconf.rb +716 -414
  9. data/ext/nokogiri/gumbo.c +584 -0
  10. data/ext/nokogiri/html4_document.c +166 -0
  11. data/ext/nokogiri/html4_element_description.c +294 -0
  12. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  13. data/ext/nokogiri/html4_sax_parser_context.c +120 -0
  14. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  15. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  16. data/ext/nokogiri/nokogiri.c +228 -91
  17. data/ext/nokogiri/nokogiri.h +191 -89
  18. data/ext/nokogiri/test_global_handlers.c +40 -0
  19. data/ext/nokogiri/xml_attr.c +15 -15
  20. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  21. data/ext/nokogiri/xml_cdata.c +13 -18
  22. data/ext/nokogiri/xml_comment.c +19 -26
  23. data/ext/nokogiri/xml_document.c +267 -195
  24. data/ext/nokogiri/xml_document_fragment.c +13 -15
  25. data/ext/nokogiri/xml_dtd.c +54 -48
  26. data/ext/nokogiri/xml_element_content.c +31 -26
  27. data/ext/nokogiri/xml_element_decl.c +22 -22
  28. data/ext/nokogiri/xml_encoding_handler.c +28 -17
  29. data/ext/nokogiri/xml_entity_decl.c +32 -30
  30. data/ext/nokogiri/xml_entity_reference.c +16 -18
  31. data/ext/nokogiri/xml_namespace.c +60 -51
  32. data/ext/nokogiri/xml_node.c +493 -407
  33. data/ext/nokogiri/xml_node_set.c +174 -162
  34. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  35. data/ext/nokogiri/xml_reader.c +197 -172
  36. data/ext/nokogiri/xml_relax_ng.c +52 -28
  37. data/ext/nokogiri/xml_sax_parser.c +112 -112
  38. data/ext/nokogiri/xml_sax_parser_context.c +105 -86
  39. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  40. data/ext/nokogiri/xml_schema.c +112 -33
  41. data/ext/nokogiri/xml_syntax_error.c +42 -21
  42. data/ext/nokogiri/xml_text.c +13 -17
  43. data/ext/nokogiri/xml_xpath_context.c +158 -73
  44. data/ext/nokogiri/xslt_stylesheet.c +158 -164
  45. data/gumbo-parser/CHANGES.md +63 -0
  46. data/gumbo-parser/Makefile +101 -0
  47. data/gumbo-parser/THANKS +27 -0
  48. data/gumbo-parser/src/Makefile +34 -0
  49. data/gumbo-parser/src/README.md +41 -0
  50. data/gumbo-parser/src/ascii.c +75 -0
  51. data/gumbo-parser/src/ascii.h +115 -0
  52. data/gumbo-parser/src/attribute.c +42 -0
  53. data/gumbo-parser/src/attribute.h +17 -0
  54. data/gumbo-parser/src/char_ref.c +22225 -0
  55. data/gumbo-parser/src/char_ref.h +29 -0
  56. data/gumbo-parser/src/char_ref.rl +2154 -0
  57. data/gumbo-parser/src/error.c +626 -0
  58. data/gumbo-parser/src/error.h +148 -0
  59. data/gumbo-parser/src/foreign_attrs.c +104 -0
  60. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  61. data/gumbo-parser/src/gumbo.h +943 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/parser.c +4886 -0
  65. data/gumbo-parser/src/parser.h +41 -0
  66. data/gumbo-parser/src/replacement.h +33 -0
  67. data/gumbo-parser/src/string_buffer.c +103 -0
  68. data/gumbo-parser/src/string_buffer.h +68 -0
  69. data/gumbo-parser/src/string_piece.c +48 -0
  70. data/gumbo-parser/src/svg_attrs.c +174 -0
  71. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  72. data/gumbo-parser/src/svg_tags.c +137 -0
  73. data/gumbo-parser/src/svg_tags.gperf +55 -0
  74. data/gumbo-parser/src/tag.c +222 -0
  75. data/gumbo-parser/src/tag_lookup.c +382 -0
  76. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  77. data/gumbo-parser/src/tag_lookup.h +13 -0
  78. data/gumbo-parser/src/token_buffer.c +79 -0
  79. data/gumbo-parser/src/token_buffer.h +71 -0
  80. data/gumbo-parser/src/token_type.h +17 -0
  81. data/gumbo-parser/src/tokenizer.c +3463 -0
  82. data/gumbo-parser/src/tokenizer.h +112 -0
  83. data/gumbo-parser/src/tokenizer_states.h +339 -0
  84. data/gumbo-parser/src/utf8.c +245 -0
  85. data/gumbo-parser/src/utf8.h +164 -0
  86. data/gumbo-parser/src/util.c +68 -0
  87. data/gumbo-parser/src/util.h +30 -0
  88. data/gumbo-parser/src/vector.c +111 -0
  89. data/gumbo-parser/src/vector.h +45 -0
  90. data/lib/nokogiri/css/node.rb +1 -0
  91. data/lib/nokogiri/css/parser.rb +64 -63
  92. data/lib/nokogiri/css/parser.y +3 -3
  93. data/lib/nokogiri/css/parser_extras.rb +39 -36
  94. data/lib/nokogiri/css/syntax_error.rb +2 -1
  95. data/lib/nokogiri/css/tokenizer.rb +105 -103
  96. data/lib/nokogiri/css/xpath_visitor.rb +73 -43
  97. data/lib/nokogiri/css.rb +15 -14
  98. data/lib/nokogiri/decorators/slop.rb +1 -0
  99. data/lib/nokogiri/extension.rb +31 -0
  100. data/lib/nokogiri/gumbo.rb +14 -0
  101. data/lib/nokogiri/html.rb +32 -27
  102. data/lib/nokogiri/{html → html4}/builder.rb +3 -2
  103. data/lib/nokogiri/{html → html4}/document.rb +17 -30
  104. data/lib/nokogiri/{html → html4}/document_fragment.rb +18 -17
  105. data/lib/nokogiri/{html → html4}/element_description.rb +2 -1
  106. data/lib/nokogiri/{html → html4}/element_description_defaults.rb +2 -1
  107. data/lib/nokogiri/{html → html4}/entity_lookup.rb +2 -1
  108. data/lib/nokogiri/{html → html4}/sax/parser.rb +12 -14
  109. data/lib/nokogiri/html4/sax/parser_context.rb +19 -0
  110. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +6 -5
  111. data/lib/nokogiri/html4.rb +40 -0
  112. data/lib/nokogiri/html5/document.rb +74 -0
  113. data/lib/nokogiri/html5/document_fragment.rb +80 -0
  114. data/lib/nokogiri/html5/node.rb +93 -0
  115. data/lib/nokogiri/html5.rb +473 -0
  116. data/lib/nokogiri/jruby/dependencies.rb +20 -0
  117. data/lib/nokogiri/syntax_error.rb +1 -0
  118. data/lib/nokogiri/version/constant.rb +5 -0
  119. data/lib/nokogiri/version/info.rb +215 -0
  120. data/lib/nokogiri/version.rb +3 -109
  121. data/lib/nokogiri/xml/attr.rb +1 -0
  122. data/lib/nokogiri/xml/attribute_decl.rb +1 -0
  123. data/lib/nokogiri/xml/builder.rb +74 -32
  124. data/lib/nokogiri/xml/cdata.rb +1 -0
  125. data/lib/nokogiri/xml/character_data.rb +1 -0
  126. data/lib/nokogiri/xml/document.rb +138 -41
  127. data/lib/nokogiri/xml/document_fragment.rb +5 -6
  128. data/lib/nokogiri/xml/dtd.rb +1 -0
  129. data/lib/nokogiri/xml/element_content.rb +1 -0
  130. data/lib/nokogiri/xml/element_decl.rb +1 -0
  131. data/lib/nokogiri/xml/entity_decl.rb +1 -0
  132. data/lib/nokogiri/xml/entity_reference.rb +1 -0
  133. data/lib/nokogiri/xml/namespace.rb +1 -0
  134. data/lib/nokogiri/xml/node/save_options.rb +2 -1
  135. data/lib/nokogiri/xml/node.rb +629 -293
  136. data/lib/nokogiri/xml/node_set.rb +1 -0
  137. data/lib/nokogiri/xml/notation.rb +1 -0
  138. data/lib/nokogiri/xml/parse_options.rb +12 -3
  139. data/lib/nokogiri/xml/pp/character_data.rb +1 -0
  140. data/lib/nokogiri/xml/pp/node.rb +1 -0
  141. data/lib/nokogiri/xml/pp.rb +3 -2
  142. data/lib/nokogiri/xml/processing_instruction.rb +1 -0
  143. data/lib/nokogiri/xml/reader.rb +9 -12
  144. data/lib/nokogiri/xml/relax_ng.rb +7 -2
  145. data/lib/nokogiri/xml/sax/document.rb +25 -30
  146. data/lib/nokogiri/xml/sax/parser.rb +1 -0
  147. data/lib/nokogiri/xml/sax/parser_context.rb +1 -0
  148. data/lib/nokogiri/xml/sax/push_parser.rb +1 -0
  149. data/lib/nokogiri/xml/sax.rb +5 -4
  150. data/lib/nokogiri/xml/schema.rb +13 -4
  151. data/lib/nokogiri/xml/searchable.rb +25 -16
  152. data/lib/nokogiri/xml/syntax_error.rb +1 -0
  153. data/lib/nokogiri/xml/text.rb +1 -0
  154. data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
  155. data/lib/nokogiri/xml/xpath.rb +4 -5
  156. data/lib/nokogiri/xml/xpath_context.rb +1 -0
  157. data/lib/nokogiri/xml.rb +36 -36
  158. data/lib/nokogiri/xslt/stylesheet.rb +2 -1
  159. data/lib/nokogiri/xslt.rb +17 -16
  160. data/lib/nokogiri.rb +32 -51
  161. data/lib/xsd/xmlparser/nokogiri.rb +1 -0
  162. data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  163. data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
  164. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  165. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  166. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  167. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
  168. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
  169. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  170. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
  171. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  172. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  173. metadata +151 -153
  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/sax/parser_context.rb +0 -16
  215. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  216. data/patches/libxslt/0001-Fix-security-framework-bypass.patch +0 -120
  217. data/ports/archives/libxml2-2.9.9.tar.gz +0 -0
  218. data/ports/archives/libxslt-1.1.33.tar.gz +0 -0
@@ -0,0 +1,215 @@
1
+ # frozen_string_literal: true
2
+ require "singleton"
3
+ require "shellwords"
4
+
5
+ module Nokogiri
6
+ class VersionInfo # :nodoc:
7
+ include Singleton
8
+
9
+ def jruby?
10
+ ::JRUBY_VERSION if ::RUBY_PLATFORM == "java"
11
+ end
12
+
13
+ def windows?
14
+ ::RUBY_PLATFORM =~ /mingw|mswin/
15
+ end
16
+
17
+ def ruby_minor
18
+ Gem::Version.new(::RUBY_VERSION).segments[0..1].join(".")
19
+ end
20
+
21
+ def engine
22
+ defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "mri"
23
+ end
24
+
25
+ def loaded_libxml_version
26
+ Gem::Version.new(Nokogiri::LIBXML_LOADED_VERSION
27
+ .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first
28
+ .collect(&:to_i)
29
+ .join("."))
30
+ end
31
+
32
+ def compiled_libxml_version
33
+ Gem::Version.new(Nokogiri::LIBXML_COMPILED_VERSION)
34
+ end
35
+
36
+ def loaded_libxslt_version
37
+ Gem::Version.new(Nokogiri::LIBXSLT_LOADED_VERSION
38
+ .scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first
39
+ .collect(&:to_i)
40
+ .join("."))
41
+ end
42
+
43
+ def compiled_libxslt_version
44
+ Gem::Version.new(Nokogiri::LIBXSLT_COMPILED_VERSION)
45
+ end
46
+
47
+ def libxml2?
48
+ defined?(Nokogiri::LIBXML_COMPILED_VERSION)
49
+ end
50
+
51
+ def libxml2_has_iconv?
52
+ defined?(Nokogiri::LIBXML_ICONV_ENABLED) && Nokogiri::LIBXML_ICONV_ENABLED
53
+ end
54
+
55
+ def libxslt_has_datetime?
56
+ defined?(Nokogiri::LIBXSLT_DATETIME_ENABLED) && Nokogiri::LIBXSLT_DATETIME_ENABLED
57
+ end
58
+
59
+ def libxml2_using_packaged?
60
+ libxml2? && Nokogiri::PACKAGED_LIBRARIES
61
+ end
62
+
63
+ def libxml2_using_system?
64
+ libxml2? && !libxml2_using_packaged?
65
+ end
66
+
67
+ def libxml2_precompiled?
68
+ libxml2_using_packaged? && Nokogiri::PRECOMPILED_LIBRARIES
69
+ end
70
+
71
+ def warnings
72
+ warnings = []
73
+
74
+ if libxml2?
75
+ if compiled_libxml_version != loaded_libxml_version
76
+ warnings << "Nokogiri was built against libxml version #{compiled_libxml_version}, but has dynamically loaded #{loaded_libxml_version}"
77
+ end
78
+
79
+ if compiled_libxslt_version != loaded_libxslt_version
80
+ warnings << "Nokogiri was built against libxslt version #{compiled_libxslt_version}, but has dynamically loaded #{loaded_libxslt_version}"
81
+ end
82
+ end
83
+
84
+ warnings
85
+ end
86
+
87
+ def to_hash
88
+ header_directory = File.expand_path(File.join(File.dirname(__FILE__), "../../../ext/nokogiri"))
89
+
90
+ {}.tap do |vi|
91
+ vi["warnings"] = []
92
+ vi["nokogiri"] = {}.tap do |nokogiri|
93
+ nokogiri["version"] = Nokogiri::VERSION
94
+
95
+ unless jruby?
96
+ # enable gems like nokogumbo to build with the following in their extconf.rb:
97
+ #
98
+ # append_cflags(Nokogiri::VERSION_INFO["nokogiri"]["cppflags"])
99
+ # append_ldflags(Nokogiri::VERSION_INFO["nokogiri"]["ldflags"])
100
+ #
101
+ cppflags = ["-I#{header_directory.shellescape}"]
102
+ ldflags = []
103
+
104
+ if libxml2_using_packaged?
105
+ cppflags << "-I#{File.join(header_directory, 'include').shellescape}"
106
+ cppflags << "-I#{File.join(header_directory, 'include/libxml2').shellescape}"
107
+
108
+ if windows?
109
+ # on windows, nokogumbo needs to link against nokogiri.so to resolve symbols. see #2167
110
+ lib_directory = File.expand_path(File.join(File.dirname(__FILE__), "../#{ruby_minor}"))
111
+ unless File.exist?(lib_directory)
112
+ lib_directory = File.expand_path(File.join(File.dirname(__FILE__), ".."))
113
+ end
114
+ ldflags << "-L#{lib_directory.shellescape}"
115
+ ldflags << "-l:nokogiri.so"
116
+ end
117
+ end
118
+
119
+ nokogiri["cppflags"] = cppflags
120
+ nokogiri["ldflags"] = ldflags
121
+ end
122
+ end
123
+ vi["ruby"] = {}.tap do |ruby|
124
+ ruby["version"] = ::RUBY_VERSION
125
+ ruby["platform"] = ::RUBY_PLATFORM
126
+ ruby["gem_platform"] = ::Gem::Platform.local.to_s
127
+ ruby["description"] = ::RUBY_DESCRIPTION
128
+ ruby["engine"] = engine
129
+ ruby["jruby"] = jruby? if jruby?
130
+ end
131
+
132
+ if libxml2?
133
+ vi["libxml"] = {}.tap do |libxml|
134
+ if libxml2_using_packaged?
135
+ libxml["source"] = "packaged"
136
+ libxml["precompiled"] = libxml2_precompiled?
137
+ libxml["patches"] = Nokogiri::LIBXML2_PATCHES
138
+
139
+ # this is for nokogumbo and shouldn't be forever
140
+ libxml["libxml2_path"] = header_directory
141
+ else
142
+ libxml["source"] = "system"
143
+ end
144
+ libxml["memory_management"] = Nokogiri::LIBXML_MEMORY_MANAGEMENT
145
+ libxml["iconv_enabled"] = libxml2_has_iconv?
146
+ libxml["compiled"] = compiled_libxml_version.to_s
147
+ libxml["loaded"] = loaded_libxml_version.to_s
148
+ end
149
+
150
+ vi["libxslt"] = {}.tap do |libxslt|
151
+ if libxml2_using_packaged?
152
+ libxslt["source"] = "packaged"
153
+ libxslt["precompiled"] = libxml2_precompiled?
154
+ libxslt["patches"] = Nokogiri::LIBXSLT_PATCHES
155
+ else
156
+ libxslt["source"] = "system"
157
+ end
158
+ libxslt["datetime_enabled"] = libxslt_has_datetime?
159
+ libxslt["compiled"] = compiled_libxslt_version.to_s
160
+ libxslt["loaded"] = loaded_libxslt_version.to_s
161
+ end
162
+
163
+ vi["warnings"] = warnings
164
+ end
165
+
166
+ if defined?(Nokogiri::OTHER_LIBRARY_VERSIONS)
167
+ # see extconf for how this string is assembled: "lib1name:lib1version,lib2name:lib2version"
168
+ vi["other_libraries"] = Hash[*Nokogiri::OTHER_LIBRARY_VERSIONS.split(/[,:]/)]
169
+ elsif jruby?
170
+ vi["other_libraries"] = {}.tap do |ol|
171
+ ol["xerces"] = Nokogiri::XERCES_VERSION
172
+ ol["nekohtml"] = Nokogiri::NEKO_VERSION
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+ def to_markdown
179
+ begin
180
+ require "psych"
181
+ rescue LoadError
182
+ end
183
+ require "yaml"
184
+ "# Nokogiri (#{Nokogiri::VERSION})\n" +
185
+ YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join
186
+ end
187
+
188
+ instance.warnings.each do |warning|
189
+ warn "WARNING: #{warning}"
190
+ end
191
+ end
192
+
193
+ def self.uses_libxml?(requirement = nil) # :nodoc:
194
+ return false unless VersionInfo.instance.libxml2?
195
+ return true unless requirement
196
+ Gem::Requirement.new(requirement).satisfied_by?(VersionInfo.instance.loaded_libxml_version)
197
+ end
198
+
199
+ def self.uses_gumbo?
200
+ uses_libxml? # TODO: replace with Gumbo functionality
201
+ end
202
+
203
+ def self.jruby? # :nodoc:
204
+ VersionInfo.instance.jruby?
205
+ end
206
+
207
+ # Ensure constants used in this file are loaded - see #1896
208
+ if Nokogiri.jruby?
209
+ require_relative "../jruby/dependencies"
210
+ end
211
+ require_relative "../extension"
212
+
213
+ # More complete version information about libxml
214
+ VERSION_INFO = VersionInfo.instance.to_hash
215
+ end
@@ -1,109 +1,3 @@
1
- module Nokogiri
2
- # The version of Nokogiri you are using
3
- VERSION = "1.10.3"
4
-
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
1
+ # frozen_string_literal: true
2
+ require_relative "version/constant"
3
+ require_relative "version/info"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Nokogiri
2
3
  module XML
3
4
  class Attr < Node
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Nokogiri
2
3
  module XML
3
4
  ###
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Nokogiri
2
3
  module XML
3
4
  ###
@@ -195,6 +196,41 @@ module Nokogiri
195
196
  #
196
197
  # Note the "foo:object" tag.
197
198
  #
199
+ # === Namespace inheritance
200
+ #
201
+ # In the Builder context, children will inherit their parent's namespace. This is the same
202
+ # behavior as if the underlying {XML::Document} set +namespace_inheritance+ to +true+:
203
+ #
204
+ # result = Nokogiri::XML::Builder.new do |xml|
205
+ # xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
206
+ # xml.Header
207
+ # end
208
+ # end
209
+ # result.doc.to_xml
210
+ # # => <?xml version="1.0" encoding="utf-8"?>
211
+ # # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
212
+ # # <soapenv:Header/>
213
+ # # </soapenv:Envelope>
214
+ #
215
+ # Users may turn this behavior off by passing a keyword argument +namespace_inheritance:false+
216
+ # to the initializer:
217
+ #
218
+ # result = Nokogiri::XML::Builder.new(namespace_inheritance: false) do |xml|
219
+ # xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
220
+ # xml.Header
221
+ # xml["soapenv"].Body # users may explicitly opt into the namespace
222
+ # end
223
+ # end
224
+ # result.doc.to_xml
225
+ # # => <?xml version="1.0" encoding="utf-8"?>
226
+ # # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
227
+ # # <Header/>
228
+ # # <soapenv:Body/>
229
+ # # </soapenv:Envelope>
230
+ #
231
+ # For more information on namespace inheritance, please see {XML::Document#namespace_inheritance}
232
+ #
233
+ #
198
234
  # == Document Types
199
235
  #
200
236
  # To create a document type (DTD), access use the Builder#doc method to get
@@ -213,7 +249,7 @@ module Nokogiri
213
249
  # xml.foo
214
250
  # end
215
251
  # end
216
- #
252
+ #
217
253
  # puts builder.to_xml
218
254
  #
219
255
  # Will output this xml:
@@ -225,6 +261,8 @@ module Nokogiri
225
261
  # </root>
226
262
  #
227
263
  class Builder
264
+ DEFAULT_DOCUMENT_OPTIONS = {namespace_inheritance: true}
265
+
228
266
  # The current Document object being built
229
267
  attr_accessor :doc
230
268
 
@@ -244,13 +282,13 @@ module Nokogiri
244
282
  #
245
283
  # For example:
246
284
  #
247
- # doc = Nokogiri::XML(open('somedoc.xml'))
248
- # Nokogiri::XML::Builder.with(doc.at('some_tag')) do |xml|
285
+ # doc = Nokogiri::XML(File.read('somedoc.xml'))
286
+ # Nokogiri::XML::Builder.with(doc.at_css('some_tag')) do |xml|
249
287
  # # ... Use normal builder methods here ...
250
288
  # xml.awesome # add the "awesome" tag below "some_tag"
251
289
  # end
252
290
  #
253
- def self.with root, &block
291
+ def self.with(root, &block)
254
292
  new({}, root, &block)
255
293
  end
256
294
 
@@ -263,23 +301,26 @@ module Nokogiri
263
301
  # Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
264
302
  # ...
265
303
  # end
266
- def initialize options = {}, root = nil, &block
267
-
304
+ def initialize(options = {}, root = nil, &block)
268
305
  if root
269
- @doc = root.document
306
+ @doc = root.document
270
307
  @parent = root
271
308
  else
272
- namespace = self.class.name.split('::')
273
- namespace[-1] = 'Document'
274
- @doc = eval(namespace.join('::')).new
275
- @parent = @doc
309
+ klassname = "::" + (self.class.name.split("::")[0..-2] + ["Document"]).join("::")
310
+ klass = begin
311
+ Object.const_get(klassname)
312
+ rescue NameError
313
+ Nokogiri::XML::Document
314
+ end
315
+ @parent = @doc = klass.new
276
316
  end
277
317
 
278
- @context = nil
279
- @arity = nil
280
- @ns = nil
318
+ @context = nil
319
+ @arity = nil
320
+ @ns = nil
281
321
 
282
- options.each do |k,v|
322
+ options = DEFAULT_DOCUMENT_OPTIONS.merge(options)
323
+ options.each do |k, v|
283
324
  @doc.send(:"#{k}=", v)
284
325
  end
285
326
 
@@ -287,7 +328,7 @@ module Nokogiri
287
328
 
288
329
  @arity = block.arity
289
330
  if @arity <= 0
290
- @context = eval('self', block.binding)
331
+ @context = eval("self", block.binding)
291
332
  instance_eval(&block)
292
333
  else
293
334
  yield self
@@ -298,26 +339,26 @@ module Nokogiri
298
339
 
299
340
  ###
300
341
  # Create a Text Node with content of +string+
301
- def text string
342
+ def text(string)
302
343
  insert @doc.create_text_node(string)
303
344
  end
304
345
 
305
346
  ###
306
347
  # Create a CDATA Node with content of +string+
307
- def cdata string
348
+ def cdata(string)
308
349
  insert doc.create_cdata(string)
309
350
  end
310
351
 
311
352
  ###
312
353
  # Create a Comment Node with content of +string+
313
- def comment string
354
+ def comment(string)
314
355
  insert doc.create_comment(string)
315
356
  end
316
357
 
317
358
  ###
318
359
  # Build a tag that is associated with namespace +ns+. Raises an
319
360
  # ArgumentError if +ns+ has not been defined higher in the tree.
320
- def [] ns
361
+ def [](ns)
321
362
  if @parent != @doc
322
363
  @ns = @parent.namespace_definitions.find { |x| x.prefix == ns.to_s }
323
364
  end
@@ -348,15 +389,15 @@ module Nokogiri
348
389
 
349
390
  ###
350
391
  # Append the given raw XML +string+ to the document
351
- def << string
392
+ def <<(string)
352
393
  @doc.fragment(string).children.each { |x| insert(x) }
353
394
  end
354
395
 
355
- def method_missing method, *args, &block # :nodoc:
396
+ def method_missing(method, *args, &block) # :nodoc:
356
397
  if @context && @context.respond_to?(method)
357
398
  @context.send(method, *args, &block)
358
399
  else
359
- node = @doc.create_element(method.to_s.sub(/[_!]$/, ''),*args) { |n|
400
+ node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) { |n|
360
401
  # Set up the namespace
361
402
  if @ns.is_a? Nokogiri::XML::Namespace
362
403
  n.namespace = @ns
@@ -377,13 +418,14 @@ module Nokogiri
377
418
  end
378
419
 
379
420
  private
421
+
380
422
  ###
381
423
  # Insert +node+ as a child of the current Node
382
424
  def insert(node, &block)
383
425
  node = @parent.add_child(node)
384
426
  if block_given?
385
427
  old_parent = @parent
386
- @parent = node
428
+ @parent = node
387
429
  @arity ||= block.arity
388
430
  if @arity <= 0
389
431
  instance_eval(&block)
@@ -396,16 +438,16 @@ module Nokogiri
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,19 +455,19 @@ 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"] = $1
417
459
  @node.content = args.first if args.first
418
460
  when /^(.*)=/
419
461
  @node[$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
473
  if block_given?
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Nokogiri
2
3
  module XML
3
4
  class CDATA < Nokogiri::XML::Text
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Nokogiri
2
3
  module XML
3
4
  class CharacterData < Nokogiri::XML::Node