nokogiri 1.10.7 → 1.16.0

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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +42 -0
  3. data/LICENSE-DEPENDENCIES.md +1632 -1022
  4. data/LICENSE.md +1 -1
  5. data/README.md +188 -96
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +34 -66
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +862 -421
  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 +222 -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 +39 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +408 -243
  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 +131 -61
  33. data/ext/nokogiri/xml_node.c +1343 -674
  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 +305 -213
  37. data/ext/nokogiri/xml_relax_ng.c +87 -78
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +149 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +65 -37
  41. data/ext/nokogiri/xml_schema.c +138 -82
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +35 -26
  44. data/ext/nokogiri/xml_xpath_context.c +363 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +126 -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 +3464 -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 +5 -3
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +205 -96
  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 +326 -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 +224 -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 +75 -34
  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 -127
  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 +44 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1096 -419
  142. data/lib/nokogiri/xml/node_set.rb +137 -61
  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 +7 -5
  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 +39 -38
  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/{0004-libxml2.la-is-in-top_builddir.patch → 0003-libxml2.la-is-in-top_builddir.patch} +1 -1
  169. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  170. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  171. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  172. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  173. data/ports/archives/libxml2-2.12.3.tar.xz +0 -0
  174. data/ports/archives/libxslt-1.1.39.tar.xz +0 -0
  175. metadata +121 -291
  176. data/ext/nokogiri/html_document.c +0 -170
  177. data/ext/nokogiri/html_document.h +0 -10
  178. data/ext/nokogiri/html_element_description.c +0 -279
  179. data/ext/nokogiri/html_element_description.h +0 -10
  180. data/ext/nokogiri/html_entity_lookup.c +0 -32
  181. data/ext/nokogiri/html_entity_lookup.h +0 -8
  182. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  183. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  184. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  185. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  186. data/ext/nokogiri/xml_attr.h +0 -9
  187. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  188. data/ext/nokogiri/xml_cdata.h +0 -9
  189. data/ext/nokogiri/xml_comment.h +0 -9
  190. data/ext/nokogiri/xml_document.h +0 -23
  191. data/ext/nokogiri/xml_document_fragment.h +0 -10
  192. data/ext/nokogiri/xml_dtd.h +0 -10
  193. data/ext/nokogiri/xml_element_content.h +0 -10
  194. data/ext/nokogiri/xml_element_decl.h +0 -9
  195. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  196. data/ext/nokogiri/xml_entity_decl.h +0 -10
  197. data/ext/nokogiri/xml_entity_reference.h +0 -9
  198. data/ext/nokogiri/xml_io.c +0 -61
  199. data/ext/nokogiri/xml_io.h +0 -11
  200. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  201. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  202. data/ext/nokogiri/xml_namespace.h +0 -14
  203. data/ext/nokogiri/xml_node.h +0 -13
  204. data/ext/nokogiri/xml_node_set.h +0 -12
  205. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  206. data/ext/nokogiri/xml_reader.h +0 -10
  207. data/ext/nokogiri/xml_relax_ng.h +0 -9
  208. data/ext/nokogiri/xml_sax_parser.h +0 -39
  209. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  210. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  211. data/ext/nokogiri/xml_schema.h +0 -9
  212. data/ext/nokogiri/xml_syntax_error.h +0 -13
  213. data/ext/nokogiri/xml_text.h +0 -9
  214. data/ext/nokogiri/xml_xpath_context.h +0 -10
  215. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  216. data/lib/nokogiri/html/document.rb +0 -335
  217. data/lib/nokogiri/html/document_fragment.rb +0 -49
  218. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  219. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  220. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  221. data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
  222. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  223. /data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  224. /data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
@@ -1,27 +1,40 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  module Nokogiri
2
5
  module XML
3
6
  class DocumentFragment < Nokogiri::XML::Node
7
+ ####
8
+ # Create a Nokogiri::XML::DocumentFragment from +tags+
9
+ def self.parse(tags, options = ParseOptions::DEFAULT_XML, &block)
10
+ new(XML::Document.new, tags, nil, options, &block)
11
+ end
12
+
4
13
  ##
5
14
  # Create a new DocumentFragment from +tags+.
6
15
  #
7
16
  # If +ctx+ is present, it is used as a context node for the
8
17
  # subtree created, e.g., namespaces will be resolved relative
9
18
  # to +ctx+.
10
- def initialize document, tags = nil, ctx = nil
19
+ def initialize(document, tags = nil, ctx = nil, options = ParseOptions::DEFAULT_XML) # rubocop:disable Lint/MissingSuper
11
20
  return self unless tags
12
21
 
22
+ options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
23
+ yield options if block_given?
24
+
13
25
  children = if ctx
14
- # Fix for issue#490
15
- if Nokogiri.jruby?
16
- # fix for issue #770
17
- ctx.parse("<root #{namespace_declarations(ctx)}>#{tags}</root>").children
18
- else
19
- ctx.parse(tags)
20
- end
21
- else
22
- XML::Document.parse("<root>#{tags}</root>") \
23
- .xpath("/root/node()")
24
- end
26
+ # Fix for issue#490
27
+ if Nokogiri.jruby?
28
+ # fix for issue #770
29
+ ctx.parse("<root #{namespace_declarations(ctx)}>#{tags}</root>", options).children
30
+ else
31
+ ctx.parse(tags, options)
32
+ end
33
+ else
34
+ wrapper_doc = XML::Document.parse("<root>#{tags}</root>", nil, nil, options)
35
+ self.errors = wrapper_doc.errors
36
+ wrapper_doc.xpath("/root/node()")
37
+ end
25
38
  children.each { |child| child.parent = self }
26
39
  end
27
40
 
@@ -39,7 +52,7 @@ module Nokogiri
39
52
  ###
40
53
  # return the name for DocumentFragment
41
54
  def name
42
- '#document-fragment'
55
+ "#document-fragment"
43
56
  end
44
57
 
45
58
  ###
@@ -51,12 +64,10 @@ module Nokogiri
51
64
  ###
52
65
  # Convert this DocumentFragment to html
53
66
  # See Nokogiri::XML::NodeSet#to_html
54
- def to_html *args
67
+ def to_html(*args)
55
68
  if Nokogiri.jruby?
56
69
  options = args.first.is_a?(Hash) ? args.shift : {}
57
- if !options[:save_with]
58
- options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
59
- end
70
+ options[:save_with] ||= Node::SaveOptions::DEFAULT_HTML
60
71
  args.insert(0, options)
61
72
  end
62
73
  children.to_html(*args)
@@ -65,12 +76,10 @@ module Nokogiri
65
76
  ###
66
77
  # Convert this DocumentFragment to xhtml
67
78
  # See Nokogiri::XML::NodeSet#to_xhtml
68
- def to_xhtml *args
79
+ def to_xhtml(*args)
69
80
  if Nokogiri.jruby?
70
81
  options = args.first.is_a?(Hash) ? args.shift : {}
71
- if !options[:save_with]
72
- options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_XHTML
73
- end
82
+ options[:save_with] ||= Node::SaveOptions::DEFAULT_XHTML
74
83
  args.insert(0, options)
75
84
  end
76
85
  children.to_xhtml(*args)
@@ -79,7 +88,7 @@ module Nokogiri
79
88
  ###
80
89
  # Convert this DocumentFragment to xml
81
90
  # See Nokogiri::XML::NodeSet#to_xml
82
- def to_xml *args
91
+ def to_xml(*args)
83
92
  children.to_xml(*args)
84
93
  end
85
94
 
@@ -90,7 +99,7 @@ module Nokogiri
90
99
  # selectors. For example:
91
100
  #
92
101
  # For more information see Nokogiri::XML::Searchable#css
93
- def css *args
102
+ def css(*args)
94
103
  if children.any?
95
104
  children.css(*args) # 'children' is a smell here
96
105
  else
@@ -109,51 +118,87 @@ module Nokogiri
109
118
  # Search this fragment for +paths+. +paths+ must be one or more XPath or CSS queries.
110
119
  #
111
120
  # For more information see Nokogiri::XML::Searchable#search
112
- def search *rules
121
+ def search(*rules)
113
122
  rules, handler, ns, binds = extract_params(rules)
114
123
 
115
124
  rules.inject(NodeSet.new(document)) do |set, rule|
116
- set += if rule =~ Searchable::LOOKS_LIKE_XPATH
117
- xpath(*([rule, ns, handler, binds].compact))
118
- else
119
- children.css(*([rule, ns, handler].compact)) # 'children' is a smell here
120
- end
125
+ set + if Searchable::LOOKS_LIKE_XPATH.match?(rule)
126
+ xpath(*[rule, ns, handler, binds].compact)
127
+ else
128
+ children.css(*[rule, ns, handler].compact) # 'children' is a smell here
129
+ end
121
130
  end
122
131
  end
123
132
 
124
- alias :serialize :to_s
125
-
126
- class << self
127
- ####
128
- # Create a Nokogiri::XML::DocumentFragment from +tags+
129
- def parse tags
130
- self.new(XML::Document.new, tags)
131
- end
132
- end
133
+ alias_method :serialize, :to_s
133
134
 
134
135
  # A list of Nokogiri::XML::SyntaxError found when parsing a document
135
136
  def errors
136
137
  document.errors
137
138
  end
138
139
 
139
- def errors= things # :nodoc:
140
+ def errors=(things) # :nodoc:
140
141
  document.errors = things
141
142
  end
142
143
 
144
+ def fragment(data)
145
+ document.fragment(data)
146
+ end
147
+
148
+ #
149
+ # :call-seq: deconstruct() → Array
150
+ #
151
+ # Returns the root nodes of this document fragment as an array, to use in pattern matching.
152
+ #
153
+ # 💡 Note that text nodes are returned as well as elements. If you wish to operate only on
154
+ # root elements, you should deconstruct the array returned by
155
+ # <tt>DocumentFragment#elements</tt>.
156
+ #
157
+ # *Example*
158
+ #
159
+ # frag = Nokogiri::HTML5.fragment(<<~HTML)
160
+ # <div>Start</div>
161
+ # This is a <a href="#jump">shortcut</a> for you.
162
+ # <div>End</div>
163
+ # HTML
164
+ #
165
+ # frag.deconstruct
166
+ # # => [#(Element:0x35c { name = "div", children = [ #(Text "Start")] }),
167
+ # # #(Text "\n" + "This is a "),
168
+ # # #(Element:0x370 {
169
+ # # name = "a",
170
+ # # attributes = [ #(Attr:0x384 { name = "href", value = "#jump" })],
171
+ # # children = [ #(Text "shortcut")]
172
+ # # }),
173
+ # # #(Text " for you.\n"),
174
+ # # #(Element:0x398 { name = "div", children = [ #(Text "End")] }),
175
+ # # #(Text "\n")]
176
+ #
177
+ # *Example* only the elements, not the text nodes.
178
+ #
179
+ # frag.elements.deconstruct
180
+ # # => [#(Element:0x35c { name = "div", children = [ #(Text "Start")] }),
181
+ # # #(Element:0x370 {
182
+ # # name = "a",
183
+ # # attributes = [ #(Attr:0x384 { name = "href", value = "#jump" })],
184
+ # # children = [ #(Text "shortcut")]
185
+ # # }),
186
+ # # #(Element:0x398 { name = "div", children = [ #(Text "End")] })]
187
+ #
188
+ # Since v1.14.0
189
+ #
190
+ def deconstruct
191
+ children.to_a
192
+ end
193
+
143
194
  private
144
195
 
145
196
  # fix for issue 770
146
- def namespace_declarations ctx
197
+ def namespace_declarations(ctx)
147
198
  ctx.namespace_scopes.map do |namespace|
148
199
  prefix = namespace.prefix.nil? ? "" : ":#{namespace.prefix}"
149
- %Q{xmlns#{prefix}="#{namespace.href}"}
150
- end.join ' '
151
- end
152
-
153
- def coerce data
154
- return super unless String === data
155
-
156
- document.fragment(data).children
200
+ %{xmlns#{prefix}="#{namespace.href}"}
201
+ end.join(" ")
157
202
  end
158
203
  end
159
204
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class DTD < Nokogiri::XML::Node
@@ -19,13 +21,13 @@ module Nokogiri
19
21
  end
20
22
 
21
23
  def html_dtd?
22
- name.casecmp('html').zero?
24
+ name.casecmp("html").zero?
23
25
  end
24
26
 
25
27
  def html5_dtd?
26
28
  html_dtd? &&
27
29
  external_id.nil? &&
28
- (system_id.nil? || system_id == 'about:legacy-compat')
30
+ (system_id.nil? || system_id == "about:legacy-compat")
29
31
  end
30
32
  end
31
33
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -9,9 +11,11 @@ module Nokogiri
9
11
  # ]>
10
12
  # </root>
11
13
  #
12
- # ElementContent represents the tree inside the <!ELEMENT> tag shown above
13
- # that lists the possible content for the div1 tag.
14
+ # ElementContent represents the binary tree inside the <!ELEMENT> tag shown above that lists the
15
+ # possible content for the div1 tag.
14
16
  class ElementContent
17
+ include Nokogiri::XML::PP::Node
18
+
15
19
  # Possible definitions of type
16
20
  PCDATA = 1
17
21
  ELEMENT = 2
@@ -31,6 +35,12 @@ module Nokogiri
31
35
  def children
32
36
  [c1, c2].compact
33
37
  end
38
+
39
+ private
40
+
41
+ def inspect_attributes
42
+ [:prefix, :name, :type, :occur, :children]
43
+ end
34
44
  end
35
45
  end
36
46
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class ElementDecl < Nokogiri::XML::Node
@@ -5,8 +7,10 @@ module Nokogiri
5
7
  undef_method :namespace_definitions
6
8
  undef_method :line if method_defined?(:line)
7
9
 
8
- def inspect
9
- "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>"
10
+ private
11
+
12
+ def inspect_attributes
13
+ [:to_s]
10
14
  end
11
15
  end
12
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class EntityDecl < Nokogiri::XML::Node
@@ -7,12 +9,14 @@ module Nokogiri
7
9
  undef_method :namespace_definitions
8
10
  undef_method :line if method_defined?(:line)
9
11
 
10
- def self.new name, doc, *args
12
+ def self.new(name, doc, *args)
11
13
  doc.create_entity(name, *args)
12
14
  end
13
15
 
14
- def inspect
15
- "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>"
16
+ private
17
+
18
+ def inspect_attributes
19
+ [:to_s]
16
20
  end
17
21
  end
18
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class EntityReference < Nokogiri::XML::Node
@@ -1,10 +1,54 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  module Nokogiri
2
5
  module XML
3
6
  class Namespace
4
7
  include Nokogiri::XML::PP::Node
5
8
  attr_reader :document
6
9
 
10
+ #
11
+ # :call-seq: deconstruct_keys(array_of_names) → Hash
12
+ #
13
+ # Returns a hash describing the Namespace, to use in pattern matching.
14
+ #
15
+ # Valid keys and their values:
16
+ # - +prefix+ → (String, nil) The namespace's prefix, or +nil+ if there is no prefix (e.g., default namespace).
17
+ # - +href+ → (String) The namespace's URI
18
+ #
19
+ # *Example*
20
+ #
21
+ # doc = Nokogiri::XML.parse(<<~XML)
22
+ # <?xml version="1.0"?>
23
+ # <root xmlns="http://nokogiri.org/ns/default" xmlns:noko="http://nokogiri.org/ns/noko">
24
+ # <child1 foo="abc" noko:bar="def"/>
25
+ # <noko:child2 foo="qwe" noko:bar="rty"/>
26
+ # </root>
27
+ # XML
28
+ #
29
+ # doc.root.elements.first.namespace
30
+ # # => #(Namespace:0x35c { href = "http://nokogiri.org/ns/default" })
31
+ #
32
+ # doc.root.elements.first.namespace.deconstruct_keys([:prefix, :href])
33
+ # # => {:prefix=>nil, :href=>"http://nokogiri.org/ns/default"}
34
+ #
35
+ # doc.root.elements.last.namespace
36
+ # # => #(Namespace:0x370 {
37
+ # # prefix = "noko",
38
+ # # href = "http://nokogiri.org/ns/noko"
39
+ # # })
40
+ #
41
+ # doc.root.elements.last.namespace.deconstruct_keys([:prefix, :href])
42
+ # # => {:prefix=>"noko", :href=>"http://nokogiri.org/ns/noko"}
43
+ #
44
+ # Since v1.14.0
45
+ #
46
+ def deconstruct_keys(keys)
47
+ { prefix: prefix, href: href }
48
+ end
49
+
7
50
  private
51
+
8
52
  def inspect_attributes
9
53
  [:prefix, :href]
10
54
  end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class Node
4
6
  ###
5
- # Save options for serializing nodes
7
+ # Save options for serializing nodes.
8
+ # See the method group entitled Node@Serialization+and+Generating+Output for usage.
6
9
  class SaveOptions
7
10
  # Format serialized xml
8
11
  FORMAT = 1
@@ -21,28 +24,32 @@ module Nokogiri
21
24
 
22
25
  if Nokogiri.jruby?
23
26
  # Save builder created document
24
- AS_BUILDER = 128
27
+ AS_BUILDER = 128
25
28
  # the default for XML documents
26
29
  DEFAULT_XML = AS_XML # https://github.com/sparklemotion/nokogiri/issues/#issue/415
27
30
  # the default for HTML document
28
31
  DEFAULT_HTML = NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
32
+ # the default for XHTML document
33
+ DEFAULT_XHTML = NO_DECLARATION | AS_XHTML
29
34
  else
30
35
  # the default for XML documents
31
36
  DEFAULT_XML = FORMAT | AS_XML
32
37
  # the default for HTML document
33
38
  DEFAULT_HTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
39
+ # the default for XHTML document
40
+ DEFAULT_XHTML = FORMAT | NO_DECLARATION | AS_XHTML
34
41
  end
35
- # the default for XHTML document
36
- DEFAULT_XHTML = FORMAT | NO_DECLARATION | NO_EMPTY_TAGS | AS_XHTML
37
42
 
38
43
  # Integer representation of the SaveOptions
39
44
  attr_reader :options
40
45
 
41
46
  # Create a new SaveOptions object with +options+
42
- def initialize options = 0; @options = options; end
47
+ def initialize(options = 0)
48
+ @options = options
49
+ end
43
50
 
44
51
  constants.each do |constant|
45
- class_eval %{
52
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
46
53
  def #{constant.downcase}
47
54
  @options |= #{constant}
48
55
  self
@@ -51,10 +58,18 @@ module Nokogiri
51
58
  def #{constant.downcase}?
52
59
  #{constant} & @options == #{constant}
53
60
  end
54
- }
61
+ RUBY
55
62
  end
56
63
 
57
- alias :to_i :options
64
+ alias_method :to_i, :options
65
+
66
+ def inspect
67
+ options = []
68
+ self.class.constants.each do |k|
69
+ options << k.downcase if send(:"#{k.downcase}?")
70
+ end
71
+ super.sub(/>$/, " " + options.join(", ") + ">")
72
+ end
58
73
  end
59
74
  end
60
75
  end