nokogiri 1.9.1 → 1.15.3

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 (226) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +45 -0
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -89
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -61
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +864 -418
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +165 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +108 -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 +251 -105
  18. data/ext/nokogiri/nokogiri.h +215 -90
  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 +22 -22
  22. data/ext/nokogiri/xml_cdata.c +40 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +401 -240
  25. data/ext/nokogiri/xml_document_fragment.c +13 -17
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +63 -55
  28. data/ext/nokogiri/xml_element_decl.c +31 -31
  29. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +17 -19
  32. data/ext/nokogiri/xml_namespace.c +135 -61
  33. data/ext/nokogiri/xml_node.c +1346 -677
  34. data/ext/nokogiri/xml_node_set.c +246 -216
  35. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  36. data/ext/nokogiri/xml_reader.c +347 -212
  37. data/ext/nokogiri/xml_relax_ng.c +86 -77
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +145 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +64 -36
  41. data/ext/nokogiri/xml_schema.c +138 -81
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +36 -26
  44. data/ext/nokogiri/xml_xpath_context.c +366 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +111 -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 +630 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +103 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -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/nokogiri_gumbo.h +944 -0
  65. data/gumbo-parser/src/parser.c +4891 -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 +223 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +170 -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 +66 -0
  88. data/gumbo-parser/src/util.h +34 -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 +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +224 -95
  100. data/lib/nokogiri/css.rb +56 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/encoding_handler.rb +57 -0
  103. data/lib/nokogiri/extension.rb +32 -0
  104. data/lib/nokogiri/gumbo.rb +15 -0
  105. data/lib/nokogiri/html.rb +38 -27
  106. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  107. data/lib/nokogiri/html4/document.rb +214 -0
  108. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  109. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  110. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  111. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  112. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  113. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  114. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  115. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  116. data/lib/nokogiri/html4.rb +47 -0
  117. data/lib/nokogiri/html5/document.rb +168 -0
  118. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  119. data/lib/nokogiri/html5/node.rb +103 -0
  120. data/lib/nokogiri/html5.rb +392 -0
  121. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  122. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  123. data/lib/nokogiri/syntax_error.rb +2 -0
  124. data/lib/nokogiri/version/constant.rb +6 -0
  125. data/lib/nokogiri/version/info.rb +223 -0
  126. data/lib/nokogiri/version.rb +3 -108
  127. data/lib/nokogiri/xml/attr.rb +55 -3
  128. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  129. data/lib/nokogiri/xml/builder.rb +98 -54
  130. data/lib/nokogiri/xml/cdata.rb +3 -1
  131. data/lib/nokogiri/xml/character_data.rb +2 -0
  132. data/lib/nokogiri/xml/document.rb +312 -126
  133. data/lib/nokogiri/xml/document_fragment.rb +93 -48
  134. data/lib/nokogiri/xml/dtd.rb +4 -2
  135. data/lib/nokogiri/xml/element_content.rb +12 -2
  136. data/lib/nokogiri/xml/element_decl.rb +6 -2
  137. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  138. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  139. data/lib/nokogiri/xml/namespace.rb +45 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1088 -418
  142. data/lib/nokogiri/xml/node_set.rb +173 -63
  143. data/lib/nokogiri/xml/notation.rb +13 -0
  144. data/lib/nokogiri/xml/parse_options.rb +145 -52
  145. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  146. data/lib/nokogiri/xml/pp/node.rb +42 -30
  147. data/lib/nokogiri/xml/pp.rb +4 -2
  148. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  149. data/lib/nokogiri/xml/reader.rb +21 -28
  150. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  151. data/lib/nokogiri/xml/sax/document.rb +45 -49
  152. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  153. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  154. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  155. data/lib/nokogiri/xml/sax.rb +6 -4
  156. data/lib/nokogiri/xml/schema.rb +19 -9
  157. data/lib/nokogiri/xml/searchable.rb +120 -72
  158. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  159. data/lib/nokogiri/xml/text.rb +2 -0
  160. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  161. data/lib/nokogiri/xml/xpath.rb +15 -4
  162. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  163. data/lib/nokogiri/xml.rb +38 -37
  164. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  165. data/lib/nokogiri/xslt.rb +101 -22
  166. data/lib/nokogiri.rb +59 -75
  167. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  168. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  169. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  170. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  171. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  172. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  173. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  174. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  175. data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
  177. metadata +128 -265
  178. data/ext/nokogiri/html_document.c +0 -170
  179. data/ext/nokogiri/html_document.h +0 -10
  180. data/ext/nokogiri/html_element_description.c +0 -279
  181. data/ext/nokogiri/html_element_description.h +0 -10
  182. data/ext/nokogiri/html_entity_lookup.c +0 -32
  183. data/ext/nokogiri/html_entity_lookup.h +0 -8
  184. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  185. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  186. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  187. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  188. data/ext/nokogiri/xml_attr.h +0 -9
  189. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  190. data/ext/nokogiri/xml_cdata.h +0 -9
  191. data/ext/nokogiri/xml_comment.h +0 -9
  192. data/ext/nokogiri/xml_document.h +0 -23
  193. data/ext/nokogiri/xml_document_fragment.h +0 -10
  194. data/ext/nokogiri/xml_dtd.h +0 -10
  195. data/ext/nokogiri/xml_element_content.h +0 -10
  196. data/ext/nokogiri/xml_element_decl.h +0 -9
  197. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  198. data/ext/nokogiri/xml_entity_decl.h +0 -10
  199. data/ext/nokogiri/xml_entity_reference.h +0 -9
  200. data/ext/nokogiri/xml_io.c +0 -61
  201. data/ext/nokogiri/xml_io.h +0 -11
  202. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  203. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  204. data/ext/nokogiri/xml_namespace.h +0 -14
  205. data/ext/nokogiri/xml_node.h +0 -13
  206. data/ext/nokogiri/xml_node_set.h +0 -12
  207. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  208. data/ext/nokogiri/xml_reader.h +0 -10
  209. data/ext/nokogiri/xml_relax_ng.h +0 -9
  210. data/ext/nokogiri/xml_sax_parser.h +0 -39
  211. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  212. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  213. data/ext/nokogiri/xml_schema.h +0 -9
  214. data/ext/nokogiri/xml_syntax_error.h +0 -13
  215. data/ext/nokogiri/xml_text.h +0 -9
  216. data/ext/nokogiri/xml_xpath_context.h +0 -10
  217. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  218. data/lib/nokogiri/html/document.rb +0 -335
  219. data/lib/nokogiri/html/document_fragment.rb +0 -49
  220. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  221. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  222. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  223. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  224. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  225. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  226. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
@@ -1,3 +1,6 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  module Nokogiri
2
5
  module XML
3
6
  ####
@@ -11,10 +14,10 @@ module Nokogiri
11
14
  # The Document this NodeSet is associated with
12
15
  attr_accessor :document
13
16
 
14
- alias :clone :dup
17
+ alias_method :clone, :dup
15
18
 
16
19
  # Create a NodeSet with +document+ defaulting to +list+
17
- def initialize document, list = []
20
+ def initialize(document, list = [])
18
21
  @document = document
19
22
  document.decorate(self)
20
23
  list.each { |x| self << x }
@@ -23,8 +26,9 @@ module Nokogiri
23
26
 
24
27
  ###
25
28
  # Get the first element of the NodeSet.
26
- def first n = nil
29
+ def first(n = nil)
27
30
  return self[0] unless n
31
+
28
32
  list = []
29
33
  [n, length].min.times { |i| list << self[i] }
30
34
  list
@@ -44,9 +48,9 @@ module Nokogiri
44
48
 
45
49
  ###
46
50
  # 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
- def index(node = nil, &block)
51
+ def index(node = nil)
48
52
  if node
49
- warn "given block not used" if block_given?
53
+ warn("given block not used") if block_given?
50
54
  each_with_index { |member, j| return j if member == node }
51
55
  elsif block_given?
52
56
  each_with_index { |member, j| return j if yield(member) }
@@ -56,18 +60,18 @@ module Nokogiri
56
60
 
57
61
  ###
58
62
  # Insert +datum+ before the first Node in this NodeSet
59
- def before datum
60
- first.before datum
63
+ def before(datum)
64
+ first.before(datum)
61
65
  end
62
66
 
63
67
  ###
64
68
  # Insert +datum+ after the last Node in this NodeSet
65
- def after datum
66
- last.after datum
69
+ def after(datum)
70
+ last.after(datum)
67
71
  end
68
72
 
69
- alias :<< :push
70
- alias :remove :unlink
73
+ alias_method :<<, :push
74
+ alias_method :remove, :unlink
71
75
 
72
76
  ###
73
77
  # call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
@@ -76,7 +80,7 @@ module Nokogiri
76
80
  # selectors. For example:
77
81
  #
78
82
  # For more information see Nokogiri::XML::Searchable#css
79
- def css *args
83
+ def css(*args)
80
84
  rules, handler, ns, _ = extract_params(args)
81
85
  paths = css_rules_to_xpath(rules, ns)
82
86
 
@@ -92,7 +96,7 @@ module Nokogiri
92
96
  # queries.
93
97
  #
94
98
  # For more information see Nokogiri::XML::Searchable#xpath
95
- def xpath *args
99
+ def xpath(*args)
96
100
  paths, handler, ns, binds = extract_params(args)
97
101
 
98
102
  inject(NodeSet.new(document)) do |set, node|
@@ -100,13 +104,6 @@ module Nokogiri
100
104
  end
101
105
  end
102
106
 
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
107
  ###
111
108
  # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
112
109
  #
@@ -119,18 +116,18 @@ module Nokogiri
119
116
  #
120
117
  # node_set.at(3) # same as node_set[3]
121
118
  #
122
- def at *args
119
+ def at(*args)
123
120
  if args.length == 1 && args.first.is_a?(Numeric)
124
121
  return self[args.first]
125
122
  end
126
123
 
127
124
  super(*args)
128
125
  end
129
- alias :% :at
126
+ alias_method :%, :at
130
127
 
131
128
  ###
132
129
  # Filter this list for nodes that match +expr+
133
- def filter expr
130
+ def filter(expr)
134
131
  find_all { |node| node.matches?(expr) }
135
132
  end
136
133
 
@@ -139,7 +136,7 @@ module Nokogiri
139
136
  # NodeSet.
140
137
  #
141
138
  # See Nokogiri::XML::Node#add_class for more information.
142
- def add_class name
139
+ def add_class(name)
143
140
  each do |el|
144
141
  el.add_class(name)
145
142
  end
@@ -151,7 +148,7 @@ module Nokogiri
151
148
  # NodeSet.
152
149
  #
153
150
  # See Nokogiri::XML::Node#append_class for more information.
154
- def append_class name
151
+ def append_class(name)
155
152
  each do |el|
156
153
  el.append_class(name)
157
154
  end
@@ -163,7 +160,7 @@ module Nokogiri
163
160
  # NodeSet.
164
161
  #
165
162
  # See Nokogiri::XML::Node#remove_class for more information.
166
- def remove_class name = nil
163
+ def remove_class(name = nil)
167
164
  each do |el|
168
165
  el.remove_class(name)
169
166
  end
@@ -171,33 +168,67 @@ module Nokogiri
171
168
  end
172
169
 
173
170
  ###
174
- # Set the attribute +key+ to +value+ or the return value of +blk+
175
- # on all Node objects in the NodeSet.
176
- def attr key, value = nil, &blk
177
- unless Hash === key || key && (value || blk)
178
- return first.attribute(key)
171
+ # Set attributes on each Node in the NodeSet, or get an
172
+ # attribute from the first Node in the NodeSet.
173
+ #
174
+ # To get an attribute from the first Node in a NodeSet:
175
+ #
176
+ # node_set.attr("href") # => "https://www.nokogiri.org"
177
+ #
178
+ # Note that an empty NodeSet will return nil when +#attr+ is called as a getter.
179
+ #
180
+ # To set an attribute on each node, +key+ can either be an
181
+ # attribute name, or a Hash of attribute names and values. When
182
+ # called as a setter, +#attr+ returns the NodeSet.
183
+ #
184
+ # If +key+ is an attribute name, then either +value+ or +block+
185
+ # must be passed.
186
+ #
187
+ # If +key+ is a Hash then attributes will be set for each
188
+ # key/value pair:
189
+ #
190
+ # node_set.attr("href" => "https://www.nokogiri.org", "class" => "member")
191
+ #
192
+ # If +value+ is passed, it will be used as the attribute value
193
+ # for all nodes:
194
+ #
195
+ # node_set.attr("href", "https://www.nokogiri.org")
196
+ #
197
+ # If +block+ is passed, it will be called on each Node object in
198
+ # the NodeSet and the return value used as the attribute value
199
+ # for that node:
200
+ #
201
+ # node_set.attr("class") { |node| node.name }
202
+ #
203
+ def attr(key, value = nil, &block)
204
+ unless key.is_a?(Hash) || (key && (value || block))
205
+ return first&.attribute(key)
179
206
  end
180
207
 
181
208
  hash = key.is_a?(Hash) ? key : { key => value }
182
209
 
183
- hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
210
+ hash.each do |k, v|
211
+ each do |node|
212
+ node[k] = v || yield(node)
213
+ end
214
+ end
184
215
 
185
216
  self
186
217
  end
187
- alias :set :attr
188
- alias :attribute :attr
218
+ alias_method :set, :attr
219
+ alias_method :attribute, :attr
189
220
 
190
221
  ###
191
222
  # Remove the attributed named +name+ from all Node objects in the NodeSet
192
- def remove_attr name
193
- each { |el| el.delete name }
223
+ def remove_attr(name)
224
+ each { |el| el.delete(name) }
194
225
  self
195
226
  end
196
- alias remove_attribute remove_attr
227
+ alias_method :remove_attribute, :remove_attr
197
228
 
198
229
  ###
199
230
  # Iterate over each node, yielding to +block+
200
- def each(&block)
231
+ def each
201
232
  return to_enum unless block_given?
202
233
 
203
234
  0.upto(length - 1) do |x|
@@ -220,20 +251,83 @@ module Nokogiri
220
251
  #
221
252
  # See Nokogiri::XML::Node#content for more information.
222
253
  def inner_text
223
- collect(&:inner_text).join('')
254
+ collect(&:inner_text).join("")
224
255
  end
225
- alias :text :inner_text
256
+ alias_method :text, :inner_text
226
257
 
227
258
  ###
228
259
  # Get the inner html of all contained Node objects
229
- def inner_html *args
230
- collect{|j| j.inner_html(*args) }.join('')
260
+ def inner_html(*args)
261
+ collect { |j| j.inner_html(*args) }.join("")
231
262
  end
232
263
 
233
- ###
234
- # Wrap this NodeSet with +html+
235
- def wrap html
236
- map { |node| node.wrap html }
264
+ # :call-seq:
265
+ # wrap(markup) -> self
266
+ # wrap(node) -> self
267
+ #
268
+ # Wrap each member of this NodeSet with the node parsed from +markup+ or a dup of the +node+.
269
+ #
270
+ # [Parameters]
271
+ # - *markup* (String)
272
+ # Markup that is parsed, once per member of the NodeSet, and used as the wrapper. Each
273
+ # node's parent, if it exists, is used as the context node for parsing; otherwise the
274
+ # associated document is used. If the parsed fragment has multiple roots, the first root
275
+ # node is used as the wrapper.
276
+ # - *node* (Nokogiri::XML::Node)
277
+ # An element that is `#dup`ed and used as the wrapper.
278
+ #
279
+ # [Returns] +self+, to support chaining.
280
+ #
281
+ # ⚠ Note that if a +String+ is passed, the markup will be parsed <b>once per node</b> in the
282
+ # NodeSet. You can avoid this overhead in cases where you know exactly the wrapper you wish to
283
+ # use by passing a +Node+ instead.
284
+ #
285
+ # Also see Node#wrap
286
+ #
287
+ # *Example* with a +String+ argument:
288
+ #
289
+ # doc = Nokogiri::HTML5(<<~HTML)
290
+ # <html><body>
291
+ # <a>a</a>
292
+ # <a>b</a>
293
+ # <a>c</a>
294
+ # <a>d</a>
295
+ # </body></html>
296
+ # HTML
297
+ # doc.css("a").wrap("<div></div>")
298
+ # doc.to_html
299
+ # # => <html><head></head><body>
300
+ # # <div><a>a</a></div>
301
+ # # <div><a>b</a></div>
302
+ # # <div><a>c</a></div>
303
+ # # <div><a>d</a></div>
304
+ # # </body></html>
305
+ #
306
+ # *Example* with a +Node+ argument
307
+ #
308
+ # 💡 Note that this is faster than the equivalent call passing a +String+ because it avoids
309
+ # having to reparse the wrapper markup for each node.
310
+ #
311
+ # doc = Nokogiri::HTML5(<<~HTML)
312
+ # <html><body>
313
+ # <a>a</a>
314
+ # <a>b</a>
315
+ # <a>c</a>
316
+ # <a>d</a>
317
+ # </body></html>
318
+ # HTML
319
+ # doc.css("a").wrap(doc.create_element("div"))
320
+ # doc.to_html
321
+ # # => <html><head></head><body>
322
+ # # <div><a>a</a></div>
323
+ # # <div><a>b</a></div>
324
+ # # <div><a>c</a></div>
325
+ # # <div><a>d</a></div>
326
+ # # </body></html>
327
+ #
328
+ def wrap(node_or_tags)
329
+ map { |node| node.wrap(node_or_tags) }
330
+ self
237
331
  end
238
332
 
239
333
  ###
@@ -244,38 +338,43 @@ module Nokogiri
244
338
 
245
339
  ###
246
340
  # Convert this NodeSet to HTML
247
- def to_html *args
341
+ def to_html(*args)
248
342
  if Nokogiri.jruby?
249
343
  options = args.first.is_a?(Hash) ? args.shift : {}
250
- if !options[:save_with]
251
- options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
252
- end
344
+ options[:save_with] ||= Node::SaveOptions::DEFAULT_HTML
253
345
  args.insert(0, options)
254
346
  end
255
- map { |x| x.to_html(*args) }.join
347
+ if empty?
348
+ encoding = (args.first.is_a?(Hash) ? args.first[:encoding] : nil)
349
+ encoding ||= document.encoding
350
+ encoding.nil? ? "" : "".encode(encoding)
351
+ else
352
+ map { |x| x.to_html(*args) }.join
353
+ end
256
354
  end
257
355
 
258
356
  ###
259
357
  # Convert this NodeSet to XHTML
260
- def to_xhtml *args
358
+ def to_xhtml(*args)
261
359
  map { |x| x.to_xhtml(*args) }.join
262
360
  end
263
361
 
264
362
  ###
265
363
  # Convert this NodeSet to XML
266
- def to_xml *args
364
+ def to_xml(*args)
267
365
  map { |x| x.to_xml(*args) }.join
268
366
  end
269
367
 
270
- alias :size :length
271
- alias :to_ary :to_a
368
+ alias_method :size, :length
369
+ alias_method :to_ary, :to_a
272
370
 
273
371
  ###
274
372
  # Removes the last element from set and returns it, or +nil+ if
275
373
  # the set is empty
276
374
  def pop
277
375
  return nil if length == 0
278
- delete last
376
+
377
+ delete(last)
279
378
  end
280
379
 
281
380
  ###
@@ -283,16 +382,18 @@ module Nokogiri
283
382
  # +nil+ if the set is empty.
284
383
  def shift
285
384
  return nil if length == 0
286
- delete first
385
+
386
+ delete(first)
287
387
  end
288
388
 
289
389
  ###
290
390
  # Equality -- Two NodeSets are equal if the contain the same number
291
391
  # of elements and if each element is equal to the corresponding
292
392
  # element in the other NodeSet
293
- def == other
393
+ def ==(other)
294
394
  return false unless other.is_a?(Nokogiri::XML::NodeSet)
295
395
  return false unless length == other.length
396
+
296
397
  each_with_index do |node, i|
297
398
  return false unless node == other[i]
298
399
  end
@@ -316,7 +417,7 @@ module Nokogiri
316
417
  def reverse
317
418
  node_set = NodeSet.new(document)
318
419
  (length - 1).downto(0) do |x|
319
- node_set.push self[x]
420
+ node_set.push(self[x])
320
421
  end
321
422
  node_set
322
423
  end
@@ -324,14 +425,23 @@ module Nokogiri
324
425
  ###
325
426
  # Return a nicely formated string representation
326
427
  def inspect
327
- "[#{map(&:inspect).join ', '}]"
428
+ "[#{map(&:inspect).join(", ")}]"
328
429
  end
329
430
 
330
- alias :+ :|
431
+ alias_method :+, :|
331
432
 
332
- # @private
333
- IMPLIED_XPATH_CONTEXTS = [ './/'.freeze, 'self::'.freeze ].freeze # :nodoc:
433
+ #
434
+ # :call-seq: deconstruct() Array
435
+ #
436
+ # Returns the members of this NodeSet as an array, to use in pattern matching.
437
+ #
438
+ # ⚡ This is an experimental feature, available since v1.14.0
439
+ #
440
+ def deconstruct
441
+ to_a
442
+ end
334
443
 
444
+ IMPLIED_XPATH_CONTEXTS = [".//", "self::"].freeze # :nodoc:
335
445
  end
336
446
  end
337
447
  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