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
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
####
|
@@ -11,10 +13,10 @@ module Nokogiri
|
|
11
13
|
# The Document this NodeSet is associated with
|
12
14
|
attr_accessor :document
|
13
15
|
|
14
|
-
|
16
|
+
alias_method :clone, :dup
|
15
17
|
|
16
18
|
# Create a NodeSet with +document+ defaulting to +list+
|
17
|
-
def initialize
|
19
|
+
def initialize(document, list = [])
|
18
20
|
@document = document
|
19
21
|
document.decorate(self)
|
20
22
|
list.each { |x| self << x }
|
@@ -23,8 +25,9 @@ module Nokogiri
|
|
23
25
|
|
24
26
|
###
|
25
27
|
# Get the first element of the NodeSet.
|
26
|
-
def first
|
28
|
+
def first(n = nil)
|
27
29
|
return self[0] unless n
|
30
|
+
|
28
31
|
list = []
|
29
32
|
[n, length].min.times { |i| list << self[i] }
|
30
33
|
list
|
@@ -46,7 +49,7 @@ module Nokogiri
|
|
46
49
|
# Returns the index of the first node in self that is == to +node+ or meets the given block. Returns nil if no match is found.
|
47
50
|
def index(node = nil)
|
48
51
|
if node
|
49
|
-
warn
|
52
|
+
warn("given block not used") if block_given?
|
50
53
|
each_with_index { |member, j| return j if member == node }
|
51
54
|
elsif block_given?
|
52
55
|
each_with_index { |member, j| return j if yield(member) }
|
@@ -56,18 +59,18 @@ module Nokogiri
|
|
56
59
|
|
57
60
|
###
|
58
61
|
# Insert +datum+ before the first Node in this NodeSet
|
59
|
-
def before
|
60
|
-
first.before
|
62
|
+
def before(datum)
|
63
|
+
first.before(datum)
|
61
64
|
end
|
62
65
|
|
63
66
|
###
|
64
67
|
# Insert +datum+ after the last Node in this NodeSet
|
65
|
-
def after
|
66
|
-
last.after
|
68
|
+
def after(datum)
|
69
|
+
last.after(datum)
|
67
70
|
end
|
68
71
|
|
69
|
-
|
70
|
-
|
72
|
+
alias_method :<<, :push
|
73
|
+
alias_method :remove, :unlink
|
71
74
|
|
72
75
|
###
|
73
76
|
# call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
|
@@ -76,7 +79,7 @@ module Nokogiri
|
|
76
79
|
# selectors. For example:
|
77
80
|
#
|
78
81
|
# For more information see Nokogiri::XML::Searchable#css
|
79
|
-
def css
|
82
|
+
def css(*args)
|
80
83
|
rules, handler, ns, _ = extract_params(args)
|
81
84
|
paths = css_rules_to_xpath(rules, ns)
|
82
85
|
|
@@ -92,7 +95,7 @@ module Nokogiri
|
|
92
95
|
# queries.
|
93
96
|
#
|
94
97
|
# For more information see Nokogiri::XML::Searchable#xpath
|
95
|
-
def xpath
|
98
|
+
def xpath(*args)
|
96
99
|
paths, handler, ns, binds = extract_params(args)
|
97
100
|
|
98
101
|
inject(NodeSet.new(document)) do |set, node|
|
@@ -100,13 +103,6 @@ module Nokogiri
|
|
100
103
|
end
|
101
104
|
end
|
102
105
|
|
103
|
-
###
|
104
|
-
# Search this NodeSet's nodes' immediate children using CSS selector +selector+
|
105
|
-
def > selector
|
106
|
-
ns = document.root.namespaces
|
107
|
-
xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
|
108
|
-
end
|
109
|
-
|
110
106
|
###
|
111
107
|
# call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
|
112
108
|
#
|
@@ -119,18 +115,18 @@ module Nokogiri
|
|
119
115
|
#
|
120
116
|
# node_set.at(3) # same as node_set[3]
|
121
117
|
#
|
122
|
-
def at
|
118
|
+
def at(*args)
|
123
119
|
if args.length == 1 && args.first.is_a?(Numeric)
|
124
120
|
return self[args.first]
|
125
121
|
end
|
126
122
|
|
127
123
|
super(*args)
|
128
124
|
end
|
129
|
-
|
125
|
+
alias_method :%, :at
|
130
126
|
|
131
127
|
###
|
132
128
|
# Filter this list for nodes that match +expr+
|
133
|
-
def filter
|
129
|
+
def filter(expr)
|
134
130
|
find_all { |node| node.matches?(expr) }
|
135
131
|
end
|
136
132
|
|
@@ -139,7 +135,7 @@ module Nokogiri
|
|
139
135
|
# NodeSet.
|
140
136
|
#
|
141
137
|
# See Nokogiri::XML::Node#add_class for more information.
|
142
|
-
def add_class
|
138
|
+
def add_class(name)
|
143
139
|
each do |el|
|
144
140
|
el.add_class(name)
|
145
141
|
end
|
@@ -151,7 +147,7 @@ module Nokogiri
|
|
151
147
|
# NodeSet.
|
152
148
|
#
|
153
149
|
# See Nokogiri::XML::Node#append_class for more information.
|
154
|
-
def append_class
|
150
|
+
def append_class(name)
|
155
151
|
each do |el|
|
156
152
|
el.append_class(name)
|
157
153
|
end
|
@@ -163,7 +159,7 @@ module Nokogiri
|
|
163
159
|
# NodeSet.
|
164
160
|
#
|
165
161
|
# See Nokogiri::XML::Node#remove_class for more information.
|
166
|
-
def remove_class
|
162
|
+
def remove_class(name = nil)
|
167
163
|
each do |el|
|
168
164
|
el.remove_class(name)
|
169
165
|
end
|
@@ -203,31 +199,31 @@ module Nokogiri
|
|
203
199
|
#
|
204
200
|
# node_set.attr("class") { |node| node.name }
|
205
201
|
#
|
206
|
-
def attr
|
202
|
+
def attr(key, value = nil, &block)
|
207
203
|
unless key.is_a?(Hash) || (key && (value || block))
|
208
204
|
return first ? first.attribute(key) : nil
|
209
205
|
end
|
210
206
|
|
211
207
|
hash = key.is_a?(Hash) ? key : { key => value }
|
212
208
|
|
213
|
-
hash.each do |k,v|
|
209
|
+
hash.each do |k, v|
|
214
210
|
each do |node|
|
215
|
-
node[k] = v ||
|
211
|
+
node[k] = v || yield(node)
|
216
212
|
end
|
217
213
|
end
|
218
214
|
|
219
215
|
self
|
220
216
|
end
|
221
|
-
|
222
|
-
|
217
|
+
alias_method :set, :attr
|
218
|
+
alias_method :attribute, :attr
|
223
219
|
|
224
220
|
###
|
225
221
|
# Remove the attributed named +name+ from all Node objects in the NodeSet
|
226
|
-
def remove_attr
|
227
|
-
each { |el| el.delete
|
222
|
+
def remove_attr(name)
|
223
|
+
each { |el| el.delete(name) }
|
228
224
|
self
|
229
225
|
end
|
230
|
-
|
226
|
+
alias_method :remove_attribute, :remove_attr
|
231
227
|
|
232
228
|
###
|
233
229
|
# Iterate over each node, yielding to +block+
|
@@ -254,20 +250,20 @@ module Nokogiri
|
|
254
250
|
#
|
255
251
|
# See Nokogiri::XML::Node#content for more information.
|
256
252
|
def inner_text
|
257
|
-
collect(&:inner_text).join(
|
253
|
+
collect(&:inner_text).join("")
|
258
254
|
end
|
259
|
-
|
255
|
+
alias_method :text, :inner_text
|
260
256
|
|
261
257
|
###
|
262
258
|
# Get the inner html of all contained Node objects
|
263
|
-
def inner_html
|
264
|
-
collect{|j| j.inner_html(*args) }.join(
|
259
|
+
def inner_html(*args)
|
260
|
+
collect { |j| j.inner_html(*args) }.join("")
|
265
261
|
end
|
266
262
|
|
267
263
|
###
|
268
264
|
# Wrap this NodeSet with +html+
|
269
|
-
def wrap
|
270
|
-
map { |node| node.wrap
|
265
|
+
def wrap(html)
|
266
|
+
map { |node| node.wrap(html) }
|
271
267
|
end
|
272
268
|
|
273
269
|
###
|
@@ -278,10 +274,10 @@ module Nokogiri
|
|
278
274
|
|
279
275
|
###
|
280
276
|
# Convert this NodeSet to HTML
|
281
|
-
def to_html
|
277
|
+
def to_html(*args)
|
282
278
|
if Nokogiri.jruby?
|
283
279
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
284
|
-
|
280
|
+
unless options[:save_with]
|
285
281
|
options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
|
286
282
|
end
|
287
283
|
args.insert(0, options)
|
@@ -291,25 +287,26 @@ module Nokogiri
|
|
291
287
|
|
292
288
|
###
|
293
289
|
# Convert this NodeSet to XHTML
|
294
|
-
def to_xhtml
|
290
|
+
def to_xhtml(*args)
|
295
291
|
map { |x| x.to_xhtml(*args) }.join
|
296
292
|
end
|
297
293
|
|
298
294
|
###
|
299
295
|
# Convert this NodeSet to XML
|
300
|
-
def to_xml
|
296
|
+
def to_xml(*args)
|
301
297
|
map { |x| x.to_xml(*args) }.join
|
302
298
|
end
|
303
299
|
|
304
|
-
|
305
|
-
|
300
|
+
alias_method :size, :length
|
301
|
+
alias_method :to_ary, :to_a
|
306
302
|
|
307
303
|
###
|
308
304
|
# Removes the last element from set and returns it, or +nil+ if
|
309
305
|
# the set is empty
|
310
306
|
def pop
|
311
307
|
return nil if length == 0
|
312
|
-
|
308
|
+
|
309
|
+
delete(last)
|
313
310
|
end
|
314
311
|
|
315
312
|
###
|
@@ -317,16 +314,18 @@ module Nokogiri
|
|
317
314
|
# +nil+ if the set is empty.
|
318
315
|
def shift
|
319
316
|
return nil if length == 0
|
320
|
-
|
317
|
+
|
318
|
+
delete(first)
|
321
319
|
end
|
322
320
|
|
323
321
|
###
|
324
322
|
# Equality -- Two NodeSets are equal if the contain the same number
|
325
323
|
# of elements and if each element is equal to the corresponding
|
326
324
|
# element in the other NodeSet
|
327
|
-
def ==
|
325
|
+
def ==(other)
|
328
326
|
return false unless other.is_a?(Nokogiri::XML::NodeSet)
|
329
327
|
return false unless length == other.length
|
328
|
+
|
330
329
|
each_with_index do |node, i|
|
331
330
|
return false unless node == other[i]
|
332
331
|
end
|
@@ -350,7 +349,7 @@ module Nokogiri
|
|
350
349
|
def reverse
|
351
350
|
node_set = NodeSet.new(document)
|
352
351
|
(length - 1).downto(0) do |x|
|
353
|
-
node_set.push
|
352
|
+
node_set.push(self[x])
|
354
353
|
end
|
355
354
|
node_set
|
356
355
|
end
|
@@ -358,14 +357,12 @@ module Nokogiri
|
|
358
357
|
###
|
359
358
|
# Return a nicely formated string representation
|
360
359
|
def inspect
|
361
|
-
"[#{map(&:inspect).join
|
360
|
+
"[#{map(&:inspect).join(", ")}]"
|
362
361
|
end
|
363
362
|
|
364
|
-
|
365
|
-
|
366
|
-
# @private
|
367
|
-
IMPLIED_XPATH_CONTEXTS = [ './/'.freeze, 'self::'.freeze ].freeze # :nodoc:
|
363
|
+
alias_method :+, :|
|
368
364
|
|
365
|
+
IMPLIED_XPATH_CONTEXTS = [".//", "self::"].freeze # :nodoc:
|
369
366
|
end
|
370
367
|
end
|
371
368
|
end
|
@@ -1,6 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
5
|
+
# Struct representing an {XML Schema Notation}[https://www.w3.org/TR/xml/#Notations]
|
3
6
|
class Notation < Struct.new(:name, :public_id, :system_id)
|
7
|
+
# dead comment to ensure rdoc processing
|
8
|
+
|
9
|
+
# :attr: name (String)
|
10
|
+
# The name for the element.
|
11
|
+
|
12
|
+
# :attr: public_id (String)
|
13
|
+
# The URI corresponding to the public identifier
|
14
|
+
|
15
|
+
# :attr: system_id (String,nil)
|
16
|
+
# The URI corresponding to the system identifier
|
4
17
|
end
|
5
18
|
end
|
6
19
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
###
|
@@ -5,11 +7,11 @@ module Nokogiri
|
|
5
7
|
#
|
6
8
|
# == Building combinations of parse options
|
7
9
|
# You can build your own combinations of these parse options by using any of the following methods:
|
8
|
-
# *Note*: All examples attempt to set the +RECOVER+ & +NOENT+ options.
|
10
|
+
# *Note*: All examples attempt to set the +RECOVER+ & +NOENT+ options.
|
9
11
|
# [Ruby's bitwise operators] You can use the Ruby bitwise operators to set various combinations.
|
10
|
-
# Nokogiri.XML('<content>Chapter 1</content',
|
12
|
+
# Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new((1 << 0) | (1 << 1)))
|
11
13
|
# [Method chaining] Every option has an equivalent method in lowercase. You can chain these methods together to set various combinations.
|
12
|
-
# Nokogiri.XML('<content>Chapter 1</content',
|
14
|
+
# Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new.recover.noent)
|
13
15
|
# [Using Ruby Blocks] You can also setup parse combinations in the block passed to Nokogiri.XML or Nokogiri.HTML
|
14
16
|
# Nokogiri.XML('<content>Chapter 1</content') {|config| config.recover.noent}
|
15
17
|
#
|
@@ -67,19 +69,27 @@ module Nokogiri
|
|
67
69
|
NOBASEFIX = 1 << 18
|
68
70
|
# relax any hardcoded limit from the parser
|
69
71
|
HUGE = 1 << 19
|
72
|
+
# line numbers stored as long int (instead of a short int)
|
73
|
+
BIG_LINES = 1 << 22
|
70
74
|
|
71
75
|
# the default options used for parsing XML documents
|
72
|
-
DEFAULT_XML = RECOVER | NONET
|
76
|
+
DEFAULT_XML = RECOVER | NONET | BIG_LINES
|
77
|
+
# the default options used for parsing XSLT stylesheets
|
78
|
+
DEFAULT_XSLT = RECOVER | NONET | NOENT | DTDLOAD | DTDATTR | NOCDATA | BIG_LINES
|
73
79
|
# the default options used for parsing HTML documents
|
74
|
-
DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET
|
80
|
+
DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET | BIG_LINES
|
81
|
+
# the default options used for parsing XML schemas
|
82
|
+
DEFAULT_SCHEMA = NONET | BIG_LINES
|
75
83
|
|
76
84
|
attr_accessor :options
|
77
|
-
|
85
|
+
|
86
|
+
def initialize(options = STRICT)
|
78
87
|
@options = options
|
79
88
|
end
|
80
89
|
|
81
90
|
constants.each do |constant|
|
82
91
|
next if constant.to_sym == :STRICT
|
92
|
+
|
83
93
|
class_eval %{
|
84
94
|
def #{constant.downcase}
|
85
95
|
@options |= #{constant}
|
@@ -106,14 +116,18 @@ module Nokogiri
|
|
106
116
|
@options & RECOVER == STRICT
|
107
117
|
end
|
108
118
|
|
109
|
-
|
119
|
+
def ==(other)
|
120
|
+
other.to_i == to_i
|
121
|
+
end
|
122
|
+
|
123
|
+
alias_method :to_i, :options
|
110
124
|
|
111
125
|
def inspect
|
112
126
|
options = []
|
113
127
|
self.class.constants.each do |k|
|
114
128
|
options << k.downcase if send(:"#{k.downcase}?")
|
115
129
|
end
|
116
|
-
super.sub(/>$/, " " + options.join(
|
130
|
+
super.sub(/>$/, " " + options.join(", ") + ">")
|
117
131
|
end
|
118
132
|
end
|
119
133
|
end
|
@@ -1,16 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
5
|
+
# :nodoc: all
|
3
6
|
module PP
|
4
7
|
module CharacterData
|
5
|
-
def pretty_print
|
6
|
-
nice_name = self.class.name.split(
|
7
|
-
pp.group(2, "#(#{nice_name} ",
|
8
|
-
pp.pp
|
8
|
+
def pretty_print(pp)
|
9
|
+
nice_name = self.class.name.split("::").last
|
10
|
+
pp.group(2, "#(#{nice_name} ", ")") do
|
11
|
+
pp.pp(text)
|
9
12
|
end
|
10
13
|
end
|
11
14
|
|
12
|
-
def inspect
|
13
|
-
"#<#{self.class.name}:#{
|
15
|
+
def inspect
|
16
|
+
"#<#{self.class.name}:#{format("0x%x", object_id)} #{text.inspect}>"
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
data/lib/nokogiri/xml/pp/node.rb
CHANGED
@@ -1,53 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
5
|
+
# :nodoc: all
|
3
6
|
module PP
|
4
7
|
module Node
|
5
|
-
def inspect
|
6
|
-
attributes = inspect_attributes.reject
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
}.join ' '
|
16
|
-
"#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{attributes}>"
|
8
|
+
def inspect
|
9
|
+
attributes = inspect_attributes.reject do |x|
|
10
|
+
attribute = send(x)
|
11
|
+
!attribute || (attribute.respond_to?(:empty?) && attribute.empty?)
|
12
|
+
rescue NoMethodError
|
13
|
+
true
|
14
|
+
end.map do |attribute|
|
15
|
+
"#{attribute.to_s.sub(/_\w+/, "s")}=#{send(attribute).inspect}"
|
16
|
+
end.join(" ")
|
17
|
+
"#<#{self.class.name}:#{format("0x%x", object_id)} #{attributes}>"
|
17
18
|
end
|
18
19
|
|
19
|
-
def pretty_print
|
20
|
-
nice_name = self.class.name.split(
|
21
|
-
pp.group(2, "#(#{nice_name}:#{
|
22
|
-
|
20
|
+
def pretty_print(pp)
|
21
|
+
nice_name = self.class.name.split("::").last
|
22
|
+
pp.group(2, "#(#{nice_name}:#{format("0x%x", object_id)} {", "})") do
|
23
23
|
pp.breakable
|
24
|
-
attrs = inspect_attributes.map
|
24
|
+
attrs = inspect_attributes.map do |t|
|
25
25
|
[t, send(t)] if respond_to?(t)
|
26
|
-
|
26
|
+
end.compact.find_all do |x|
|
27
27
|
if x.last
|
28
|
-
if [:attribute_nodes, :children].include?
|
28
|
+
if [:attribute_nodes, :children].include?(x.first)
|
29
29
|
!x.last.empty?
|
30
30
|
else
|
31
31
|
true
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
34
|
+
end
|
35
35
|
|
36
36
|
pp.seplist(attrs) do |v|
|
37
|
-
if [:attribute_nodes, :children].include?
|
38
|
-
pp.group(2, "#{v.first.to_s.sub(/_\w+$/,
|
37
|
+
if [:attribute_nodes, :children].include?(v.first)
|
38
|
+
pp.group(2, "#{v.first.to_s.sub(/_\w+$/, "s")} = [", "]") do
|
39
39
|
pp.breakable
|
40
40
|
pp.seplist(v.last) do |item|
|
41
|
-
pp.pp
|
41
|
+
pp.pp(item)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
else
|
45
|
-
pp.text
|
46
|
-
pp.pp
|
45
|
+
pp.text("#{v.first} = ")
|
46
|
+
pp.pp(v.last)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
pp.breakable
|
50
|
-
|
51
50
|
end
|
52
51
|
end
|
53
52
|
end
|
data/lib/nokogiri/xml/pp.rb
CHANGED
data/lib/nokogiri/xml/reader.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
###
|
@@ -7,18 +9,18 @@ module Nokogiri
|
|
7
9
|
#
|
8
10
|
# Here is an example of usage:
|
9
11
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
12
|
+
# reader = Nokogiri::XML::Reader(<<-eoxml)
|
13
|
+
# <x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
14
|
+
# <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
15
|
+
# </x>
|
16
|
+
# eoxml
|
15
17
|
#
|
16
|
-
#
|
18
|
+
# reader.each do |node|
|
17
19
|
#
|
18
|
-
#
|
19
|
-
#
|
20
|
+
# # node is an instance of Nokogiri::XML::Reader
|
21
|
+
# puts node.name
|
20
22
|
#
|
21
|
-
#
|
23
|
+
# end
|
22
24
|
#
|
23
25
|
# Note that Nokogiri::XML::Reader#each can only be called once!! Once
|
24
26
|
# the cursor moves through the entire document, you must parse the
|
@@ -69,41 +71,32 @@ module Nokogiri
|
|
69
71
|
# A list of errors encountered while parsing
|
70
72
|
attr_accessor :errors
|
71
73
|
|
72
|
-
# The encoding for the document
|
73
|
-
attr_reader :encoding
|
74
|
-
|
75
74
|
# The XML source
|
76
75
|
attr_reader :source
|
77
76
|
|
78
|
-
|
77
|
+
alias_method :self_closing?, :empty_element?
|
79
78
|
|
80
|
-
def initialize
|
79
|
+
def initialize(source, url = nil, encoding = nil) # :nodoc:
|
81
80
|
@source = source
|
82
81
|
@errors = []
|
83
82
|
@encoding = encoding
|
84
83
|
end
|
85
84
|
private :initialize
|
86
85
|
|
87
|
-
|
88
|
-
#
|
86
|
+
# Get the attributes and namespaces of the current node as a Hash.
|
87
|
+
#
|
88
|
+
# This is the union of Reader#attribute_hash and Reader#namespaces
|
89
|
+
#
|
90
|
+
# [Returns]
|
91
|
+
# (Hash<String, String>) Attribute names and values, and namespace prefixes and hrefs.
|
89
92
|
def attributes
|
90
|
-
|
91
|
-
[node.name, node.to_s]
|
92
|
-
}].merge(namespaces || {})
|
93
|
-
end
|
94
|
-
|
95
|
-
###
|
96
|
-
# Get a list of attributes for the current node
|
97
|
-
def attribute_nodes
|
98
|
-
nodes = attr_nodes
|
99
|
-
nodes.each { |v| v.instance_variable_set(:@_r, self) }
|
100
|
-
nodes
|
93
|
+
attribute_hash.merge(namespaces)
|
101
94
|
end
|
102
95
|
|
103
96
|
###
|
104
97
|
# Move the cursor through the document yielding the cursor to the block
|
105
98
|
def each
|
106
|
-
while cursor =
|
99
|
+
while (cursor = read)
|
107
100
|
yield cursor
|
108
101
|
end
|
109
102
|
end
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
class << self
|
4
6
|
###
|
5
7
|
# Create a new Nokogiri::XML::RelaxNG document from +string_or_io+.
|
6
8
|
# See Nokogiri::XML::RelaxNG for an example.
|
7
|
-
def RelaxNG
|
8
|
-
RelaxNG.new(string_or_io)
|
9
|
+
def RelaxNG(string_or_io, options = ParseOptions::DEFAULT_SCHEMA)
|
10
|
+
RelaxNG.new(string_or_io, options)
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
@@ -26,6 +28,10 @@ module Nokogiri
|
|
26
28
|
# end
|
27
29
|
#
|
28
30
|
# The list of errors are Nokogiri::XML::SyntaxError objects.
|
31
|
+
#
|
32
|
+
# NOTE: RelaxNG input is always treated as TRUSTED documents, meaning that they will cause the
|
33
|
+
# underlying parsing libraries to access network resources. This is counter to Nokogiri's
|
34
|
+
# "untrusted by default" security policy, but is a limitation of the underlying libraries.
|
29
35
|
class RelaxNG < Nokogiri::XML::Schema
|
30
36
|
end
|
31
37
|
end
|