nokogiri 1.10.3 → 1.13.9
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.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/LICENSE-DEPENDENCIES.md +1173 -884
- data/LICENSE.md +1 -1
- data/README.md +178 -96
- data/bin/nokogiri +63 -50
- data/dependencies.yml +13 -62
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +761 -424
- data/ext/nokogiri/gumbo.c +584 -0
- data/ext/nokogiri/html4_document.c +166 -0
- data/ext/nokogiri/html4_element_description.c +294 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +119 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +228 -91
- data/ext/nokogiri/nokogiri.h +199 -88
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +17 -17
- data/ext/nokogiri/xml_attribute_decl.c +21 -21
- data/ext/nokogiri/xml_cdata.c +14 -19
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +296 -220
- data/ext/nokogiri/xml_document_fragment.c +12 -16
- data/ext/nokogiri/xml_dtd.c +64 -58
- data/ext/nokogiri/xml_element_content.c +31 -26
- data/ext/nokogiri/xml_element_decl.c +25 -25
- data/ext/nokogiri/xml_encoding_handler.c +43 -18
- data/ext/nokogiri/xml_entity_decl.c +37 -35
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +98 -53
- data/ext/nokogiri/xml_node.c +1065 -653
- data/ext/nokogiri/xml_node_set.c +178 -166
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +277 -175
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +112 -112
- data/ext/nokogiri/xml_sax_parser_context.c +112 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +114 -35
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +14 -18
- data/ext/nokogiri/xml_xpath_context.c +226 -115
- data/ext/nokogiri/xslt_stylesheet.c +265 -173
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +101 -0
- data/gumbo-parser/THANKS +27 -0
- data/gumbo-parser/src/Makefile +34 -0
- data/gumbo-parser/src/README.md +41 -0
- data/gumbo-parser/src/ascii.c +75 -0
- data/gumbo-parser/src/ascii.h +115 -0
- data/gumbo-parser/src/attribute.c +42 -0
- data/gumbo-parser/src/attribute.h +17 -0
- data/gumbo-parser/src/char_ref.c +22225 -0
- data/gumbo-parser/src/char_ref.h +29 -0
- data/gumbo-parser/src/char_ref.rl +2154 -0
- data/gumbo-parser/src/error.c +626 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +104 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/gumbo.h +943 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/parser.c +4875 -0
- data/gumbo-parser/src/parser.h +41 -0
- data/gumbo-parser/src/replacement.h +33 -0
- data/gumbo-parser/src/string_buffer.c +103 -0
- data/gumbo-parser/src/string_buffer.h +68 -0
- data/gumbo-parser/src/string_piece.c +48 -0
- data/gumbo-parser/src/svg_attrs.c +174 -0
- data/gumbo-parser/src/svg_attrs.gperf +77 -0
- data/gumbo-parser/src/svg_tags.c +137 -0
- data/gumbo-parser/src/svg_tags.gperf +55 -0
- data/gumbo-parser/src/tag.c +222 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +169 -0
- data/gumbo-parser/src/tag_lookup.h +13 -0
- data/gumbo-parser/src/token_buffer.c +79 -0
- data/gumbo-parser/src/token_buffer.h +71 -0
- data/gumbo-parser/src/token_type.h +17 -0
- data/gumbo-parser/src/tokenizer.c +3463 -0
- data/gumbo-parser/src/tokenizer.h +112 -0
- data/gumbo-parser/src/tokenizer_states.h +339 -0
- data/gumbo-parser/src/utf8.c +245 -0
- data/gumbo-parser/src/utf8.h +164 -0
- data/gumbo-parser/src/util.c +68 -0
- data/gumbo-parser/src/util.h +30 -0
- data/gumbo-parser/src/vector.c +111 -0
- data/gumbo-parser/src/vector.h +45 -0
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +10 -8
- data/lib/nokogiri/css/parser.rb +397 -377
- data/lib/nokogiri/css/parser.y +250 -245
- data/lib/nokogiri/css/parser_extras.rb +54 -49
- data/lib/nokogiri/css/syntax_error.rb +3 -1
- data/lib/nokogiri/css/tokenizer.rb +107 -104
- data/lib/nokogiri/css/tokenizer.rex +3 -2
- data/lib/nokogiri/css/xpath_visitor.rb +218 -91
- data/lib/nokogiri/css.rb +50 -17
- data/lib/nokogiri/decorators/slop.rb +9 -7
- data/lib/nokogiri/extension.rb +31 -0
- data/lib/nokogiri/gumbo.rb +15 -0
- data/lib/nokogiri/html.rb +38 -27
- data/lib/nokogiri/{html → html4}/builder.rb +4 -2
- data/lib/nokogiri/{html → html4}/document.rb +103 -105
- data/lib/nokogiri/html4/document_fragment.rb +54 -0
- data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
- data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
- data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
- data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
- data/lib/nokogiri/html4.rb +46 -0
- data/lib/nokogiri/html5/document.rb +91 -0
- data/lib/nokogiri/html5/document_fragment.rb +83 -0
- data/lib/nokogiri/html5/node.rb +100 -0
- data/lib/nokogiri/html5.rb +478 -0
- data/lib/nokogiri/jruby/dependencies.rb +21 -0
- data/lib/nokogiri/syntax_error.rb +2 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +222 -0
- data/lib/nokogiri/version.rb +3 -108
- data/lib/nokogiri/xml/attr.rb +6 -3
- data/lib/nokogiri/xml/attribute_decl.rb +3 -1
- data/lib/nokogiri/xml/builder.rb +97 -53
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +224 -86
- data/lib/nokogiri/xml/document_fragment.rb +46 -44
- data/lib/nokogiri/xml/dtd.rb +4 -2
- data/lib/nokogiri/xml/element_content.rb +2 -0
- data/lib/nokogiri/xml/element_decl.rb +3 -1
- data/lib/nokogiri/xml/entity_decl.rb +4 -2
- data/lib/nokogiri/xml/entity_reference.rb +2 -0
- data/lib/nokogiri/xml/namespace.rb +3 -0
- data/lib/nokogiri/xml/node/save_options.rb +10 -5
- data/lib/nokogiri/xml/node.rb +884 -378
- data/lib/nokogiri/xml/node_set.rb +51 -54
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +22 -8
- data/lib/nokogiri/xml/pp/character_data.rb +9 -6
- data/lib/nokogiri/xml/pp/node.rb +25 -26
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +3 -1
- data/lib/nokogiri/xml/reader.rb +21 -28
- data/lib/nokogiri/xml/relax_ng.rb +8 -2
- data/lib/nokogiri/xml/sax/document.rb +45 -49
- data/lib/nokogiri/xml/sax/parser.rb +38 -34
- data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
- data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
- data/lib/nokogiri/xml/sax.rb +6 -4
- data/lib/nokogiri/xml/schema.rb +19 -9
- data/lib/nokogiri/xml/searchable.rb +112 -72
- data/lib/nokogiri/xml/syntax_error.rb +6 -4
- data/lib/nokogiri/xml/text.rb +2 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
- data/lib/nokogiri/xml/xpath.rb +15 -4
- data/lib/nokogiri/xml/xpath_context.rb +3 -3
- data/lib/nokogiri/xml.rb +38 -37
- data/lib/nokogiri/xslt/stylesheet.rb +3 -1
- data/lib/nokogiri/xslt.rb +29 -20
- data/lib/nokogiri.rb +49 -65
- data/lib/xsd/xmlparser/nokogiri.rb +26 -24
- data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
- data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
- data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
- data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
- data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
- data/ports/archives/libxml2-2.10.3.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
- metadata +205 -138
- data/ext/nokogiri/html_document.c +0 -170
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.c +0 -279
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.c +0 -32
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.c +0 -116
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.c +0 -87
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -61
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -14
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
- data/lib/nokogiri/html/document_fragment.rb +0 -49
- data/lib/nokogiri/html/element_description_defaults.rb +0 -671
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxslt/0001-Fix-security-framework-bypass.patch +0 -120
- data/ports/archives/libxml2-2.9.9.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.33.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
|
data/lib/nokogiri/version.rb
CHANGED
@@ -1,109 +1,4 @@
|
|
1
|
-
|
2
|
-
# The version of Nokogiri you are using
|
3
|
-
VERSION = "1.10.3"
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
6
|
-
|
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"
|
data/lib/nokogiri/xml/attr.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
class Attr < Node
|
4
|
-
|
5
|
-
|
6
|
-
|
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}:#{
|
16
|
+
"#<#{self.class.name}:#{format("0x%x", object_id)} #{to_s.inspect}>"
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
data/lib/nokogiri/xml/builder.rb
CHANGED
@@ -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(
|
248
|
-
# Nokogiri::XML::Builder.with(doc.
|
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
|
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
|
267
|
-
|
307
|
+
def initialize(options = {}, root = nil, &block)
|
268
308
|
if root
|
269
|
-
@doc
|
309
|
+
@doc = root.document
|
270
310
|
@parent = root
|
271
311
|
else
|
272
|
-
|
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
|
279
|
-
@arity
|
280
|
-
@ns
|
315
|
+
@context = nil
|
316
|
+
@arity = nil
|
317
|
+
@ns = nil
|
281
318
|
|
282
|
-
options
|
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
|
324
|
+
return unless block
|
287
325
|
|
288
326
|
@arity = block.arity
|
289
327
|
if @arity <= 0
|
290
|
-
@context = eval(
|
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
|
302
|
-
insert
|
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
|
308
|
-
insert
|
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
|
314
|
-
insert
|
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 []
|
358
|
+
def [](ns)
|
321
359
|
if @parent != @doc
|
322
360
|
@ns = @parent.namespace_definitions.find { |x| x.prefix == ns.to_s }
|
323
361
|
end
|
@@ -325,12 +363,13 @@ module Nokogiri
|
|
325
363
|
|
326
364
|
@parent.ancestors.each do |a|
|
327
365
|
next if a == doc
|
366
|
+
|
328
367
|
@ns = a.namespace_definitions.find { |x| x.prefix == ns.to_s }
|
329
368
|
return self if @ns
|
330
369
|
end
|
331
370
|
|
332
|
-
@ns = { :
|
333
|
-
|
371
|
+
@ns = { pending: ns.to_s }
|
372
|
+
self
|
334
373
|
end
|
335
374
|
|
336
375
|
###
|
@@ -338,7 +377,7 @@ module Nokogiri
|
|
338
377
|
def to_xml(*args)
|
339
378
|
if Nokogiri.jruby?
|
340
379
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
341
|
-
|
380
|
+
unless options[:save_with]
|
342
381
|
options[:save_with] = Node::SaveOptions::AS_BUILDER
|
343
382
|
end
|
344
383
|
args.insert(0, options)
|
@@ -348,27 +387,28 @@ module Nokogiri
|
|
348
387
|
|
349
388
|
###
|
350
389
|
# Append the given raw XML +string+ to the document
|
351
|
-
def <<
|
390
|
+
def <<(string)
|
352
391
|
@doc.fragment(string).children.each { |x| insert(x) }
|
353
392
|
end
|
354
393
|
|
355
|
-
def method_missing
|
356
|
-
if @context
|
394
|
+
def method_missing(method, *args, &block) # :nodoc:
|
395
|
+
if @context&.respond_to?(method)
|
357
396
|
@context.send(method, *args, &block)
|
358
397
|
else
|
359
|
-
node = @doc.create_element(method.to_s.sub(/[_!]$/,
|
398
|
+
node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) do |n|
|
360
399
|
# Set up the namespace
|
361
|
-
if @ns.is_a?
|
400
|
+
if @ns.is_a?(Nokogiri::XML::Namespace)
|
362
401
|
n.namespace = @ns
|
363
402
|
@ns = nil
|
364
403
|
end
|
365
|
-
|
404
|
+
end
|
366
405
|
|
367
|
-
if @ns.is_a?
|
406
|
+
if @ns.is_a?(Hash)
|
368
407
|
node.namespace = node.namespace_definitions.find { |x| x.prefix == @ns[:pending] }
|
369
408
|
if node.namespace.nil?
|
370
409
|
raise ArgumentError, "Namespace #{@ns[:pending]} has not been defined"
|
371
410
|
end
|
411
|
+
|
372
412
|
@ns = nil
|
373
413
|
end
|
374
414
|
|
@@ -377,35 +417,39 @@ module Nokogiri
|
|
377
417
|
end
|
378
418
|
|
379
419
|
private
|
420
|
+
|
380
421
|
###
|
381
422
|
# Insert +node+ as a child of the current Node
|
382
423
|
def insert(node, &block)
|
383
424
|
node = @parent.add_child(node)
|
384
|
-
if
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
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
|
392
437
|
end
|
393
|
-
@parent = old_parent
|
394
438
|
end
|
395
439
|
NodeBuilder.new(node, self)
|
396
440
|
end
|
397
441
|
|
398
442
|
class NodeBuilder # :nodoc:
|
399
|
-
def initialize
|
443
|
+
def initialize(node, doc_builder)
|
400
444
|
@node = node
|
401
445
|
@doc_builder = doc_builder
|
402
446
|
end
|
403
447
|
|
404
|
-
def []=
|
448
|
+
def []=(k, v)
|
405
449
|
@node[k] = v
|
406
450
|
end
|
407
451
|
|
408
|
-
def []
|
452
|
+
def [](k)
|
409
453
|
@node[k]
|
410
454
|
end
|
411
455
|
|
@@ -413,22 +457,22 @@ module Nokogiri
|
|
413
457
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
414
458
|
case method.to_s
|
415
459
|
when /^(.*)!$/
|
416
|
-
@node[
|
460
|
+
@node["id"] = Regexp.last_match(1)
|
417
461
|
@node.content = args.first if args.first
|
418
462
|
when /^(.*)=/
|
419
|
-
@node[
|
463
|
+
@node[Regexp.last_match(1)] = args.first
|
420
464
|
else
|
421
|
-
@node[
|
422
|
-
((@node[
|
465
|
+
@node["class"] =
|
466
|
+
((@node["class"] || "").split(/\s/) + [method.to_s]).join(" ")
|
423
467
|
@node.content = args.first if args.first
|
424
468
|
end
|
425
469
|
|
426
470
|
# Assign any extra options
|
427
|
-
opts.each do |k,v|
|
428
|
-
@node[k.to_s] = ((@node[k.to_s] ||
|
471
|
+
opts.each do |k, v|
|
472
|
+
@node[k.to_s] = ((@node[k.to_s] || "").split(/\s/) + [v]).join(" ")
|
429
473
|
end
|
430
474
|
|
431
|
-
if
|
475
|
+
if block
|
432
476
|
old_parent = @doc_builder.parent
|
433
477
|
@doc_builder.parent = @node
|
434
478
|
value = @doc_builder.instance_eval(&block)
|
data/lib/nokogiri/xml/cdata.rb
CHANGED