nokogiri 1.10.9 → 1.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +38 -0
  3. data/LICENSE-DEPENDENCIES.md +1632 -1022
  4. data/LICENSE.md +1 -1
  5. data/README.md +190 -95
  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 +909 -422
  10. data/ext/nokogiri/gumbo.c +610 -0
  11. data/ext/nokogiri/html4_document.c +171 -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.c +40 -0
  15. data/ext/nokogiri/html4_sax_parser_context.c +98 -0
  16. data/ext/nokogiri/html4_sax_push_parser.c +96 -0
  17. data/ext/nokogiri/libxml2_polyfill.c +114 -0
  18. data/ext/nokogiri/nokogiri.c +258 -105
  19. data/ext/nokogiri/nokogiri.h +207 -90
  20. data/ext/nokogiri/test_global_handlers.c +40 -0
  21. data/ext/nokogiri/xml_attr.c +18 -18
  22. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  23. data/ext/nokogiri/xml_cdata.c +33 -33
  24. data/ext/nokogiri/xml_comment.c +19 -31
  25. data/ext/nokogiri/xml_document.c +499 -323
  26. data/ext/nokogiri/xml_document_fragment.c +17 -36
  27. data/ext/nokogiri/xml_dtd.c +65 -59
  28. data/ext/nokogiri/xml_element_content.c +63 -55
  29. data/ext/nokogiri/xml_element_decl.c +31 -31
  30. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  31. data/ext/nokogiri/xml_entity_decl.c +37 -35
  32. data/ext/nokogiri/xml_entity_reference.c +17 -19
  33. data/ext/nokogiri/xml_namespace.c +131 -61
  34. data/ext/nokogiri/xml_node.c +1429 -723
  35. data/ext/nokogiri/xml_node_set.c +257 -225
  36. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  37. data/ext/nokogiri/xml_reader.c +340 -231
  38. data/ext/nokogiri/xml_relax_ng.c +87 -99
  39. data/ext/nokogiri/xml_sax_parser.c +269 -176
  40. data/ext/nokogiri/xml_sax_parser_context.c +286 -152
  41. data/ext/nokogiri/xml_sax_push_parser.c +111 -64
  42. data/ext/nokogiri/xml_schema.c +132 -140
  43. data/ext/nokogiri/xml_syntax_error.c +52 -23
  44. data/ext/nokogiri/xml_text.c +37 -30
  45. data/ext/nokogiri/xml_xpath_context.c +373 -185
  46. data/ext/nokogiri/xslt_stylesheet.c +342 -191
  47. data/gumbo-parser/CHANGES.md +63 -0
  48. data/gumbo-parser/Makefile +129 -0
  49. data/gumbo-parser/THANKS +27 -0
  50. data/gumbo-parser/src/Makefile +34 -0
  51. data/gumbo-parser/src/README.md +41 -0
  52. data/gumbo-parser/src/ascii.c +75 -0
  53. data/gumbo-parser/src/ascii.h +115 -0
  54. data/gumbo-parser/src/attribute.c +42 -0
  55. data/gumbo-parser/src/attribute.h +17 -0
  56. data/gumbo-parser/src/char_ref.c +22225 -0
  57. data/gumbo-parser/src/char_ref.h +29 -0
  58. data/gumbo-parser/src/char_ref.rl +2154 -0
  59. data/gumbo-parser/src/error.c +658 -0
  60. data/gumbo-parser/src/error.h +152 -0
  61. data/gumbo-parser/src/foreign_attrs.c +103 -0
  62. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/nokogiri_gumbo.h +953 -0
  66. data/gumbo-parser/src/parser.c +4932 -0
  67. data/gumbo-parser/src/parser.h +41 -0
  68. data/gumbo-parser/src/replacement.h +33 -0
  69. data/gumbo-parser/src/string_buffer.c +103 -0
  70. data/gumbo-parser/src/string_buffer.h +68 -0
  71. data/gumbo-parser/src/string_piece.c +48 -0
  72. data/gumbo-parser/src/svg_attrs.c +174 -0
  73. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  74. data/gumbo-parser/src/svg_tags.c +137 -0
  75. data/gumbo-parser/src/svg_tags.gperf +55 -0
  76. data/gumbo-parser/src/tag.c +223 -0
  77. data/gumbo-parser/src/tag_lookup.c +382 -0
  78. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  79. data/gumbo-parser/src/tag_lookup.h +13 -0
  80. data/gumbo-parser/src/token_buffer.c +79 -0
  81. data/gumbo-parser/src/token_buffer.h +71 -0
  82. data/gumbo-parser/src/token_type.h +17 -0
  83. data/gumbo-parser/src/tokenizer.c +3464 -0
  84. data/gumbo-parser/src/tokenizer.h +112 -0
  85. data/gumbo-parser/src/tokenizer_states.h +339 -0
  86. data/gumbo-parser/src/utf8.c +245 -0
  87. data/gumbo-parser/src/utf8.h +164 -0
  88. data/gumbo-parser/src/util.c +66 -0
  89. data/gumbo-parser/src/util.h +34 -0
  90. data/gumbo-parser/src/vector.c +111 -0
  91. data/gumbo-parser/src/vector.h +45 -0
  92. data/lib/nokogiri/class_resolver.rb +67 -0
  93. data/lib/nokogiri/css/node.rb +14 -8
  94. data/lib/nokogiri/css/parser.rb +399 -377
  95. data/lib/nokogiri/css/parser.y +250 -245
  96. data/lib/nokogiri/css/parser_extras.rb +16 -71
  97. data/lib/nokogiri/css/selector_cache.rb +38 -0
  98. data/lib/nokogiri/css/syntax_error.rb +3 -1
  99. data/lib/nokogiri/css/tokenizer.rb +7 -5
  100. data/lib/nokogiri/css/tokenizer.rex +11 -9
  101. data/lib/nokogiri/css/xpath_visitor.rb +242 -96
  102. data/lib/nokogiri/css.rb +122 -17
  103. data/lib/nokogiri/decorators/slop.rb +11 -11
  104. data/lib/nokogiri/encoding_handler.rb +57 -0
  105. data/lib/nokogiri/extension.rb +32 -0
  106. data/lib/nokogiri/gumbo.rb +15 -0
  107. data/lib/nokogiri/html.rb +38 -27
  108. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  109. data/lib/nokogiri/html4/document.rb +235 -0
  110. data/lib/nokogiri/html4/document_fragment.rb +166 -0
  111. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  112. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  113. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  114. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  115. data/lib/nokogiri/html4/sax/parser.rb +48 -0
  116. data/lib/nokogiri/html4/sax/parser_context.rb +15 -0
  117. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  118. data/lib/nokogiri/html4.rb +42 -0
  119. data/lib/nokogiri/html5/builder.rb +40 -0
  120. data/lib/nokogiri/html5/document.rb +199 -0
  121. data/lib/nokogiri/html5/document_fragment.rb +200 -0
  122. data/lib/nokogiri/html5/node.rb +103 -0
  123. data/lib/nokogiri/html5.rb +368 -0
  124. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  125. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  126. data/lib/nokogiri/syntax_error.rb +2 -0
  127. data/lib/nokogiri/version/constant.rb +6 -0
  128. data/lib/nokogiri/version/info.rb +224 -0
  129. data/lib/nokogiri/version.rb +3 -108
  130. data/lib/nokogiri/xml/attr.rb +55 -3
  131. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  132. data/lib/nokogiri/xml/builder.rb +83 -35
  133. data/lib/nokogiri/xml/cdata.rb +3 -1
  134. data/lib/nokogiri/xml/character_data.rb +2 -0
  135. data/lib/nokogiri/xml/document.rb +359 -130
  136. data/lib/nokogiri/xml/document_fragment.rb +170 -54
  137. data/lib/nokogiri/xml/dtd.rb +4 -2
  138. data/lib/nokogiri/xml/element_content.rb +12 -2
  139. data/lib/nokogiri/xml/element_decl.rb +6 -2
  140. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  141. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  142. data/lib/nokogiri/xml/namespace.rb +44 -0
  143. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  144. data/lib/nokogiri/xml/node.rb +1168 -420
  145. data/lib/nokogiri/xml/node_set.rb +145 -67
  146. data/lib/nokogiri/xml/notation.rb +13 -0
  147. data/lib/nokogiri/xml/parse_options.rb +145 -52
  148. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  149. data/lib/nokogiri/xml/pp/node.rb +47 -30
  150. data/lib/nokogiri/xml/pp.rb +4 -2
  151. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  152. data/lib/nokogiri/xml/reader.rb +68 -41
  153. data/lib/nokogiri/xml/relax_ng.rb +60 -17
  154. data/lib/nokogiri/xml/sax/document.rb +198 -111
  155. data/lib/nokogiri/xml/sax/parser.rb +144 -67
  156. data/lib/nokogiri/xml/sax/parser_context.rb +119 -6
  157. data/lib/nokogiri/xml/sax/push_parser.rb +9 -5
  158. data/lib/nokogiri/xml/sax.rb +54 -4
  159. data/lib/nokogiri/xml/schema.rb +116 -39
  160. data/lib/nokogiri/xml/searchable.rb +139 -95
  161. data/lib/nokogiri/xml/syntax_error.rb +29 -5
  162. data/lib/nokogiri/xml/text.rb +2 -0
  163. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  164. data/lib/nokogiri/xml/xpath.rb +15 -4
  165. data/lib/nokogiri/xml/xpath_context.rb +15 -4
  166. data/lib/nokogiri/xml.rb +45 -55
  167. data/lib/nokogiri/xslt/stylesheet.rb +32 -8
  168. data/lib/nokogiri/xslt.rb +103 -30
  169. data/lib/nokogiri.rb +59 -75
  170. data/lib/xsd/xmlparser/nokogiri.rb +32 -29
  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/libxml2/0019-xpath-Use-separate-static-hash-table-for-standard-fu.patch +244 -0
  175. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  176. data/ports/archives/libxml2-2.13.6.tar.xz +0 -0
  177. data/ports/archives/libxslt-1.1.42.tar.xz +0 -0
  178. metadata +123 -295
  179. data/ext/nokogiri/html_document.c +0 -170
  180. data/ext/nokogiri/html_document.h +0 -10
  181. data/ext/nokogiri/html_element_description.c +0 -279
  182. data/ext/nokogiri/html_element_description.h +0 -10
  183. data/ext/nokogiri/html_entity_lookup.c +0 -32
  184. data/ext/nokogiri/html_entity_lookup.h +0 -8
  185. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  186. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  187. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  188. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  189. data/ext/nokogiri/xml_attr.h +0 -9
  190. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  191. data/ext/nokogiri/xml_cdata.h +0 -9
  192. data/ext/nokogiri/xml_comment.h +0 -9
  193. data/ext/nokogiri/xml_document.h +0 -23
  194. data/ext/nokogiri/xml_document_fragment.h +0 -10
  195. data/ext/nokogiri/xml_dtd.h +0 -10
  196. data/ext/nokogiri/xml_element_content.h +0 -10
  197. data/ext/nokogiri/xml_element_decl.h +0 -9
  198. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  199. data/ext/nokogiri/xml_entity_decl.h +0 -10
  200. data/ext/nokogiri/xml_entity_reference.h +0 -9
  201. data/ext/nokogiri/xml_io.c +0 -61
  202. data/ext/nokogiri/xml_io.h +0 -11
  203. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  204. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  205. data/ext/nokogiri/xml_namespace.h +0 -14
  206. data/ext/nokogiri/xml_node.h +0 -13
  207. data/ext/nokogiri/xml_node_set.h +0 -12
  208. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  209. data/ext/nokogiri/xml_reader.h +0 -10
  210. data/ext/nokogiri/xml_relax_ng.h +0 -9
  211. data/ext/nokogiri/xml_sax_parser.h +0 -39
  212. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  213. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  214. data/ext/nokogiri/xml_schema.h +0 -9
  215. data/ext/nokogiri/xml_syntax_error.h +0 -13
  216. data/ext/nokogiri/xml_text.h +0 -9
  217. data/ext/nokogiri/xml_xpath_context.h +0 -10
  218. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  219. data/lib/nokogiri/html/document.rb +0 -335
  220. data/lib/nokogiri/html/document_fragment.rb +0 -49
  221. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  222. data/lib/nokogiri/html/sax/parser.rb +0 -62
  223. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  224. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  225. data/patches/libxml2/0004-libxml2.la-is-in-top_builddir.patch +0 -25
  226. data/patches/libxml2/0005-Fix-infinite-loop-in-xmlStringLenDecodeEntities.patch +0 -32
  227. data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
  228. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  229. /data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  230. /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,111 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  module Nokogiri
2
5
  module XML
6
+ # DocumentFragment represents a fragment of an \XML document. It provides the same functionality
7
+ # exposed by XML::Node and can be used to contain one or more \XML subtrees.
3
8
  class DocumentFragment < Nokogiri::XML::Node
4
- ##
5
- # Create a new DocumentFragment from +tags+.
9
+ # The options used to parse the document fragment. Returns the value of any options that were
10
+ # passed into the constructor as a parameter or set in a config block, else the default
11
+ # options for the specific subclass.
12
+ attr_reader :parse_options
13
+
14
+ class << self
15
+ # :call-seq:
16
+ # parse(input) { |options| ... } → XML::DocumentFragment
17
+ # parse(input, options:) → XML::DocumentFragment
18
+ #
19
+ # Parse \XML fragment input from a String, and return a new XML::DocumentFragment. This
20
+ # method creates a new, empty XML::Document to contain the fragment.
21
+ #
22
+ # [Required Parameters]
23
+ # - +input+ (String) The content to be parsed.
24
+ #
25
+ # [Optional Keyword Arguments]
26
+ # - +options+ (Nokogiri::XML::ParseOptions) Configuration object that determines some
27
+ # behaviors during parsing. See ParseOptions for more information. The default value is
28
+ # +ParseOptions::DEFAULT_XML+.
29
+ #
30
+ # [Yields]
31
+ # If a block is given, a Nokogiri::XML::ParseOptions object is yielded to the block which
32
+ # can be configured before parsing. See Nokogiri::XML::ParseOptions for more information.
33
+ #
34
+ # [Returns] Nokogiri::XML::DocumentFragment
35
+ def parse(tags, options_ = ParseOptions::DEFAULT_XML, options: options_, &block)
36
+ new(XML::Document.new, tags, options: options, &block)
37
+ end
38
+
39
+ # Wrapper method to separate the concerns of:
40
+ # - the native object allocator's parameter (it only requires `document`)
41
+ # - the initializer's parameters
42
+ def new(document, ...) # :nodoc:
43
+ instance = native_new(document)
44
+ instance.send(:initialize, document, ...)
45
+ instance
46
+ end
47
+ end
48
+
49
+ # :call-seq:
50
+ # new(document, input=nil) { |options| ... } → DocumentFragment
51
+ # new(document, input=nil, context:, options:) → DocumentFragment
52
+ #
53
+ # Parse \XML fragment input from a String, and return a new DocumentFragment that is
54
+ # associated with the given +document+.
55
+ #
56
+ # 💡 It's recommended to use either XML::DocumentFragment.parse or Node#parse rather than call
57
+ # this method directly.
58
+ #
59
+ # [Required Parameters]
60
+ # - +document+ (XML::Document) The parent document to associate the returned fragment with.
61
+ #
62
+ # [Optional Parameters]
63
+ # - +input+ (String) The content to be parsed.
6
64
  #
7
- # If +ctx+ is present, it is used as a context node for the
8
- # subtree created, e.g., namespaces will be resolved relative
9
- # to +ctx+.
10
- def initialize document, tags = nil, ctx = nil
65
+ # [Optional Keyword Arguments]
66
+ # - +context:+ (Nokogiri::XML::Node) The <b>context node</b> for the subtree created. See
67
+ # below for more information.
68
+ #
69
+ # - +options:+ (Nokogiri::XML::ParseOptions) Configuration object that determines some
70
+ # behaviors during parsing. See ParseOptions for more information. The default value is
71
+ # +ParseOptions::DEFAULT_XML+.
72
+ #
73
+ # [Yields]
74
+ # If a block is given, a Nokogiri::XML::ParseOptions object is yielded to the block which
75
+ # can be configured before parsing. See ParseOptions for more information.
76
+ #
77
+ # [Returns] XML::DocumentFragment
78
+ #
79
+ # === Context \Node
80
+ #
81
+ # If a context node is specified using +context:+, then the fragment will be created by
82
+ # calling Node#parse on that node, so the parser will behave as if that Node is the parent of
83
+ # the fragment subtree, and will resolve namespaces relative to that node.
84
+ #
85
+ def initialize(
86
+ document, tags = nil,
87
+ context_ = nil, options_ = ParseOptions::DEFAULT_XML,
88
+ context: context_, options: options_
89
+ ) # rubocop:disable Lint/MissingSuper
11
90
  return self unless tags
12
91
 
13
- 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
92
+ options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
93
+ @parse_options = options
94
+ yield options if block_given?
95
+
96
+ children = if context
97
+ # Fix for issue#490
98
+ if Nokogiri.jruby?
99
+ # fix for issue #770
100
+ context.parse("<root #{namespace_declarations(context)}>#{tags}</root>", options).children
101
+ else
102
+ context.parse(tags, options)
103
+ end
104
+ else
105
+ wrapper_doc = XML::Document.parse("<root>#{tags}</root>", nil, nil, options)
106
+ self.errors = wrapper_doc.errors
107
+ wrapper_doc.xpath("/root/node()")
108
+ end
25
109
  children.each { |child| child.parent = self }
26
110
  end
27
111
 
@@ -39,7 +123,7 @@ module Nokogiri
39
123
  ###
40
124
  # return the name for DocumentFragment
41
125
  def name
42
- '#document-fragment'
126
+ "#document-fragment"
43
127
  end
44
128
 
45
129
  ###
@@ -51,12 +135,10 @@ module Nokogiri
51
135
  ###
52
136
  # Convert this DocumentFragment to html
53
137
  # See Nokogiri::XML::NodeSet#to_html
54
- def to_html *args
138
+ def to_html(*args)
55
139
  if Nokogiri.jruby?
56
140
  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
141
+ options[:save_with] ||= Node::SaveOptions::DEFAULT_HTML
60
142
  args.insert(0, options)
61
143
  end
62
144
  children.to_html(*args)
@@ -65,12 +147,10 @@ module Nokogiri
65
147
  ###
66
148
  # Convert this DocumentFragment to xhtml
67
149
  # See Nokogiri::XML::NodeSet#to_xhtml
68
- def to_xhtml *args
150
+ def to_xhtml(*args)
69
151
  if Nokogiri.jruby?
70
152
  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
153
+ options[:save_with] ||= Node::SaveOptions::DEFAULT_XHTML
74
154
  args.insert(0, options)
75
155
  end
76
156
  children.to_xhtml(*args)
@@ -79,7 +159,7 @@ module Nokogiri
79
159
  ###
80
160
  # Convert this DocumentFragment to xml
81
161
  # See Nokogiri::XML::NodeSet#to_xml
82
- def to_xml *args
162
+ def to_xml(*args)
83
163
  children.to_xml(*args)
84
164
  end
85
165
 
@@ -90,7 +170,7 @@ module Nokogiri
90
170
  # selectors. For example:
91
171
  #
92
172
  # For more information see Nokogiri::XML::Searchable#css
93
- def css *args
173
+ def css(*args)
94
174
  if children.any?
95
175
  children.css(*args) # 'children' is a smell here
96
176
  else
@@ -109,51 +189,87 @@ module Nokogiri
109
189
  # Search this fragment for +paths+. +paths+ must be one or more XPath or CSS queries.
110
190
  #
111
191
  # For more information see Nokogiri::XML::Searchable#search
112
- def search *rules
192
+ def search(*rules)
113
193
  rules, handler, ns, binds = extract_params(rules)
114
194
 
115
195
  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
196
+ set + if Searchable::LOOKS_LIKE_XPATH.match?(rule)
197
+ xpath(*[rule, ns, handler, binds].compact)
198
+ else
199
+ children.css(*[rule, ns, handler].compact) # 'children' is a smell here
200
+ end
121
201
  end
122
202
  end
123
203
 
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
204
+ alias_method :serialize, :to_s
133
205
 
134
206
  # A list of Nokogiri::XML::SyntaxError found when parsing a document
135
207
  def errors
136
208
  document.errors
137
209
  end
138
210
 
139
- def errors= things # :nodoc:
211
+ def errors=(things) # :nodoc:
140
212
  document.errors = things
141
213
  end
142
214
 
215
+ def fragment(data)
216
+ document.fragment(data)
217
+ end
218
+
219
+ #
220
+ # :call-seq: deconstruct() → Array
221
+ #
222
+ # Returns the root nodes of this document fragment as an array, to use in pattern matching.
223
+ #
224
+ # 💡 Note that text nodes are returned as well as elements. If you wish to operate only on
225
+ # root elements, you should deconstruct the array returned by
226
+ # <tt>DocumentFragment#elements</tt>.
227
+ #
228
+ # *Example*
229
+ #
230
+ # frag = Nokogiri::HTML5.fragment(<<~HTML)
231
+ # <div>Start</div>
232
+ # This is a <a href="#jump">shortcut</a> for you.
233
+ # <div>End</div>
234
+ # HTML
235
+ #
236
+ # frag.deconstruct
237
+ # # => [#(Element:0x35c { name = "div", children = [ #(Text "Start")] }),
238
+ # # #(Text "\n" + "This is a "),
239
+ # # #(Element:0x370 {
240
+ # # name = "a",
241
+ # # attributes = [ #(Attr:0x384 { name = "href", value = "#jump" })],
242
+ # # children = [ #(Text "shortcut")]
243
+ # # }),
244
+ # # #(Text " for you.\n"),
245
+ # # #(Element:0x398 { name = "div", children = [ #(Text "End")] }),
246
+ # # #(Text "\n")]
247
+ #
248
+ # *Example* only the elements, not the text nodes.
249
+ #
250
+ # frag.elements.deconstruct
251
+ # # => [#(Element:0x35c { name = "div", children = [ #(Text "Start")] }),
252
+ # # #(Element:0x370 {
253
+ # # name = "a",
254
+ # # attributes = [ #(Attr:0x384 { name = "href", value = "#jump" })],
255
+ # # children = [ #(Text "shortcut")]
256
+ # # }),
257
+ # # #(Element:0x398 { name = "div", children = [ #(Text "End")] })]
258
+ #
259
+ # Since v1.14.0
260
+ #
261
+ def deconstruct
262
+ children.to_a
263
+ end
264
+
143
265
  private
144
266
 
145
267
  # fix for issue 770
146
- def namespace_declarations ctx
268
+ def namespace_declarations(ctx)
147
269
  ctx.namespace_scopes.map do |namespace|
148
270
  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
271
+ %{xmlns#{prefix}="#{namespace.href}"}
272
+ end.join(" ")
157
273
  end
158
274
  end
159
275
  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