nokogiri 1.11.3 → 1.13.8

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 (179) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/LICENSE-DEPENDENCIES.md +243 -22
  4. data/LICENSE.md +1 -1
  5. data/README.md +14 -11
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -64
  8. data/ext/nokogiri/depend +35 -34
  9. data/ext/nokogiri/extconf.rb +237 -133
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/{html_document.c → html4_document.c} +8 -8
  12. data/ext/nokogiri/{html_element_description.c → html4_element_description.c} +21 -19
  13. data/ext/nokogiri/{html_entity_lookup.c → html4_entity_lookup.c} +7 -7
  14. data/ext/nokogiri/{html_sax_parser_context.c → html4_sax_parser_context.c} +8 -8
  15. data/ext/nokogiri/{html_sax_push_parser.c → html4_sax_push_parser.c} +4 -4
  16. data/ext/nokogiri/libxml2_backwards_compat.c +30 -30
  17. data/ext/nokogiri/nokogiri.c +70 -38
  18. data/ext/nokogiri/nokogiri.h +27 -9
  19. data/ext/nokogiri/xml_attr.c +2 -2
  20. data/ext/nokogiri/xml_attribute_decl.c +3 -3
  21. data/ext/nokogiri/xml_cdata.c +1 -1
  22. data/ext/nokogiri/xml_document.c +50 -50
  23. data/ext/nokogiri/xml_document_fragment.c +0 -2
  24. data/ext/nokogiri/xml_dtd.c +10 -10
  25. data/ext/nokogiri/xml_element_content.c +2 -0
  26. data/ext/nokogiri/xml_element_decl.c +3 -3
  27. data/ext/nokogiri/xml_encoding_handler.c +31 -12
  28. data/ext/nokogiri/xml_entity_decl.c +5 -5
  29. data/ext/nokogiri/xml_namespace.c +4 -2
  30. data/ext/nokogiri/xml_node.c +833 -492
  31. data/ext/nokogiri/xml_node_set.c +24 -24
  32. data/ext/nokogiri/xml_reader.c +90 -11
  33. data/ext/nokogiri/xml_sax_parser.c +6 -6
  34. data/ext/nokogiri/xml_sax_parser_context.c +12 -3
  35. data/ext/nokogiri/xml_schema.c +5 -3
  36. data/ext/nokogiri/xml_text.c +1 -1
  37. data/ext/nokogiri/xml_xpath_context.c +110 -85
  38. data/ext/nokogiri/xslt_stylesheet.c +109 -10
  39. data/gumbo-parser/CHANGES.md +63 -0
  40. data/gumbo-parser/Makefile +101 -0
  41. data/gumbo-parser/THANKS +27 -0
  42. data/gumbo-parser/src/Makefile +34 -0
  43. data/gumbo-parser/src/README.md +41 -0
  44. data/gumbo-parser/src/ascii.c +75 -0
  45. data/gumbo-parser/src/ascii.h +115 -0
  46. data/gumbo-parser/src/attribute.c +42 -0
  47. data/gumbo-parser/src/attribute.h +17 -0
  48. data/gumbo-parser/src/char_ref.c +22225 -0
  49. data/gumbo-parser/src/char_ref.h +29 -0
  50. data/gumbo-parser/src/char_ref.rl +2154 -0
  51. data/gumbo-parser/src/error.c +626 -0
  52. data/gumbo-parser/src/error.h +148 -0
  53. data/gumbo-parser/src/foreign_attrs.c +104 -0
  54. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  55. data/gumbo-parser/src/gumbo.h +943 -0
  56. data/gumbo-parser/src/insertion_mode.h +33 -0
  57. data/gumbo-parser/src/macros.h +91 -0
  58. data/gumbo-parser/src/parser.c +4875 -0
  59. data/gumbo-parser/src/parser.h +41 -0
  60. data/gumbo-parser/src/replacement.h +33 -0
  61. data/gumbo-parser/src/string_buffer.c +103 -0
  62. data/gumbo-parser/src/string_buffer.h +68 -0
  63. data/gumbo-parser/src/string_piece.c +48 -0
  64. data/gumbo-parser/src/svg_attrs.c +174 -0
  65. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  66. data/gumbo-parser/src/svg_tags.c +137 -0
  67. data/gumbo-parser/src/svg_tags.gperf +55 -0
  68. data/gumbo-parser/src/tag.c +222 -0
  69. data/gumbo-parser/src/tag_lookup.c +382 -0
  70. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  71. data/gumbo-parser/src/tag_lookup.h +13 -0
  72. data/gumbo-parser/src/token_buffer.c +79 -0
  73. data/gumbo-parser/src/token_buffer.h +71 -0
  74. data/gumbo-parser/src/token_type.h +17 -0
  75. data/gumbo-parser/src/tokenizer.c +3463 -0
  76. data/gumbo-parser/src/tokenizer.h +112 -0
  77. data/gumbo-parser/src/tokenizer_states.h +339 -0
  78. data/gumbo-parser/src/utf8.c +245 -0
  79. data/gumbo-parser/src/utf8.h +164 -0
  80. data/gumbo-parser/src/util.c +68 -0
  81. data/gumbo-parser/src/util.h +30 -0
  82. data/gumbo-parser/src/vector.c +111 -0
  83. data/gumbo-parser/src/vector.h +45 -0
  84. data/lib/nokogiri/class_resolver.rb +67 -0
  85. data/lib/nokogiri/css/node.rb +9 -8
  86. data/lib/nokogiri/css/parser.rb +361 -342
  87. data/lib/nokogiri/css/parser.y +250 -245
  88. data/lib/nokogiri/css/parser_extras.rb +22 -20
  89. data/lib/nokogiri/css/syntax_error.rb +2 -1
  90. data/lib/nokogiri/css/tokenizer.rb +4 -3
  91. data/lib/nokogiri/css/tokenizer.rex +3 -2
  92. data/lib/nokogiri/css/xpath_visitor.rb +179 -82
  93. data/lib/nokogiri/css.rb +49 -17
  94. data/lib/nokogiri/decorators/slop.rb +8 -7
  95. data/lib/nokogiri/extension.rb +8 -3
  96. data/lib/nokogiri/gumbo.rb +15 -0
  97. data/lib/nokogiri/html.rb +37 -27
  98. data/lib/nokogiri/{html → html4}/builder.rb +3 -2
  99. data/lib/nokogiri/{html → html4}/document.rb +92 -81
  100. data/lib/nokogiri/{html → html4}/document_fragment.rb +13 -9
  101. data/lib/nokogiri/{html → html4}/element_description.rb +2 -1
  102. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  103. data/lib/nokogiri/{html → html4}/entity_lookup.rb +3 -2
  104. data/lib/nokogiri/{html → html4}/sax/parser.rb +16 -16
  105. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  106. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +11 -11
  107. data/lib/nokogiri/html4.rb +46 -0
  108. data/lib/nokogiri/html5/document.rb +91 -0
  109. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  110. data/lib/nokogiri/html5/node.rb +100 -0
  111. data/lib/nokogiri/html5.rb +478 -0
  112. data/lib/nokogiri/jruby/dependencies.rb +10 -9
  113. data/lib/nokogiri/syntax_error.rb +1 -0
  114. data/lib/nokogiri/version/constant.rb +2 -1
  115. data/lib/nokogiri/version/info.rb +31 -14
  116. data/lib/nokogiri/version.rb +1 -0
  117. data/lib/nokogiri/xml/attr.rb +5 -3
  118. data/lib/nokogiri/xml/attribute_decl.rb +2 -1
  119. data/lib/nokogiri/xml/builder.rb +71 -31
  120. data/lib/nokogiri/xml/cdata.rb +2 -1
  121. data/lib/nokogiri/xml/character_data.rb +1 -0
  122. data/lib/nokogiri/xml/document.rb +183 -96
  123. data/lib/nokogiri/xml/document_fragment.rb +41 -38
  124. data/lib/nokogiri/xml/dtd.rb +3 -2
  125. data/lib/nokogiri/xml/element_content.rb +1 -0
  126. data/lib/nokogiri/xml/element_decl.rb +2 -1
  127. data/lib/nokogiri/xml/entity_decl.rb +3 -2
  128. data/lib/nokogiri/xml/entity_reference.rb +1 -0
  129. data/lib/nokogiri/xml/namespace.rb +2 -0
  130. data/lib/nokogiri/xml/node/save_options.rb +9 -5
  131. data/lib/nokogiri/xml/node.rb +525 -354
  132. data/lib/nokogiri/xml/node_set.rb +50 -54
  133. data/lib/nokogiri/xml/notation.rb +12 -0
  134. data/lib/nokogiri/xml/parse_options.rb +13 -6
  135. data/lib/nokogiri/xml/pp/character_data.rb +8 -6
  136. data/lib/nokogiri/xml/pp/node.rb +24 -26
  137. data/lib/nokogiri/xml/pp.rb +3 -2
  138. data/lib/nokogiri/xml/processing_instruction.rb +2 -1
  139. data/lib/nokogiri/xml/reader.rb +20 -24
  140. data/lib/nokogiri/xml/relax_ng.rb +1 -0
  141. data/lib/nokogiri/xml/sax/document.rb +44 -49
  142. data/lib/nokogiri/xml/sax/parser.rb +37 -34
  143. data/lib/nokogiri/xml/sax/parser_context.rb +7 -3
  144. data/lib/nokogiri/xml/sax/push_parser.rb +5 -5
  145. data/lib/nokogiri/xml/sax.rb +5 -4
  146. data/lib/nokogiri/xml/schema.rb +7 -6
  147. data/lib/nokogiri/xml/searchable.rb +93 -62
  148. data/lib/nokogiri/xml/syntax_error.rb +5 -4
  149. data/lib/nokogiri/xml/text.rb +1 -0
  150. data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
  151. data/lib/nokogiri/xml/xpath.rb +13 -1
  152. data/lib/nokogiri/xml/xpath_context.rb +2 -3
  153. data/lib/nokogiri/xml.rb +37 -37
  154. data/lib/nokogiri/xslt/stylesheet.rb +2 -1
  155. data/lib/nokogiri/xslt.rb +28 -20
  156. data/lib/nokogiri.rb +48 -43
  157. data/lib/xsd/xmlparser/nokogiri.rb +25 -24
  158. data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  159. data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
  160. data/patches/libxml2/{0004-libxml2.la-is-in-top_builddir.patch → 0003-libxml2.la-is-in-top_builddir.patch} +1 -1
  161. data/patches/libxml2/{0008-use-glibc-strlen.patch → 0004-use-glibc-strlen.patch} +3 -3
  162. data/patches/libxml2/{0009-avoid-isnan-isinf.patch → 0005-avoid-isnan-isinf.patch} +4 -4
  163. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  164. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  165. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  166. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2445 -1919
  167. data/ports/archives/libxml2-2.9.14.tar.xz +0 -0
  168. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  169. metadata +204 -93
  170. data/lib/nokogiri/html/element_description_defaults.rb +0 -672
  171. data/lib/nokogiri/html/sax/parser_context.rb +0 -17
  172. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  173. data/patches/libxml2/0005-Fix-infinite-loop-in-xmlStringLenDecodeEntities.patch +0 -32
  174. data/patches/libxml2/0006-htmlParseComment-treat-as-if-it-closed-the-comment.patch +0 -73
  175. data/patches/libxml2/0007-use-new-htmlParseLookupCommentEnd-to-find-comment-en.patch +0 -103
  176. data/patches/libxml2/0010-parser.c-shrink-the-input-buffer-when-appropriate.patch +0 -70
  177. data/patches/libxml2/0011-update-automake-files-for-arm64.patch +0 -2511
  178. data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
  179. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nokogiri
4
+ module HTML4
5
+ module SAX
6
+ ###
7
+ # Context for HTML SAX parsers. This class is usually not instantiated by the user. Instead,
8
+ # you should be looking at Nokogiri::HTML4::SAX::Parser
9
+ class ParserContext < Nokogiri::XML::SAX::ParserContext
10
+ def self.new(thing, encoding = "UTF-8")
11
+ if [:read, :close].all? { |x| thing.respond_to?(x) }
12
+ super
13
+ else
14
+ memory(thing, encoding)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,35 +1,35 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Nokogiri
3
- module HTML
4
+ module HTML4
4
5
  module SAX
5
6
  class PushParser
6
-
7
- # The Nokogiri::HTML::SAX::Document on which the PushParser will be
7
+ # The Nokogiri::HTML4::SAX::Document on which the PushParser will be
8
8
  # operating
9
9
  attr_accessor :document
10
-
11
- def initialize(doc = HTML::SAX::Document.new, file_name = nil, encoding = 'UTF-8')
10
+
11
+ def initialize(doc = HTML4::SAX::Document.new, file_name = nil, encoding = "UTF-8")
12
12
  @document = doc
13
13
  @encoding = encoding
14
- @sax_parser = HTML::SAX::Parser.new(doc, @encoding)
14
+ @sax_parser = HTML4::SAX::Parser.new(doc, @encoding)
15
15
 
16
16
  ## Create our push parser context
17
17
  initialize_native(@sax_parser, file_name, encoding)
18
18
  end
19
-
19
+
20
20
  ###
21
21
  # Write a +chunk+ of HTML to the PushParser. Any callback methods
22
22
  # that can be called will be called immediately.
23
- def write chunk, last_chunk = false
23
+ def write(chunk, last_chunk = false)
24
24
  native_write(chunk, last_chunk)
25
25
  end
26
- alias :<< :write
26
+ alias_method :<<, :write
27
27
 
28
28
  ###
29
29
  # Finish the parsing. This method is only necessary for
30
- # Nokogiri::HTML::SAX::Document#end_document to be called.
30
+ # Nokogiri::HTML4::SAX::Document#end_document to be called.
31
31
  def finish
32
- write '', true
32
+ write("", true)
33
33
  end
34
34
  end
35
35
  end
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module Nokogiri
5
+ class << self
6
+ # :call-seq:
7
+ # HTML4(input, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block) → Nokogiri::HTML4::Document
8
+ #
9
+ # Parse HTML. Convenience method for Nokogiri::HTML4::Document.parse
10
+ def HTML4(input, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block)
11
+ Nokogiri::HTML4::Document.parse(input, url, encoding, options, &block)
12
+ end
13
+ end
14
+
15
+ # Since v1.12.0
16
+ #
17
+ # 💡 Before v1.12.0, Nokogiri::HTML4 did not exist, and Nokogiri::HTML was the module/namespace
18
+ # for parsing HTML.
19
+ module HTML4
20
+ class << self
21
+ ###
22
+ # Parse HTML. Convenience method for Nokogiri::HTML4::Document.parse
23
+ def parse(input, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block)
24
+ Document.parse(input, url, encoding, options, &block)
25
+ end
26
+
27
+ ####
28
+ # Parse a fragment from +string+ in to a NodeSet.
29
+ def fragment(string, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML, &block)
30
+ HTML4::DocumentFragment.parse(string, encoding, options, &block)
31
+ end
32
+ end
33
+
34
+ # Instance of Nokogiri::HTML4::EntityLookup
35
+ NamedCharacters = EntityLookup.new
36
+ end
37
+ end
38
+
39
+ require_relative "html4/entity_lookup"
40
+ require_relative "html4/document"
41
+ require_relative "html4/document_fragment"
42
+ require_relative "html4/sax/parser_context"
43
+ require_relative "html4/sax/parser"
44
+ require_relative "html4/sax/push_parser"
45
+ require_relative "html4/element_description"
46
+ require_relative "html4/element_description_defaults"
@@ -0,0 +1,91 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # Copyright 2013-2021 Sam Ruby, Stephen Checkoway
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require_relative "../html4/document"
21
+
22
+ module Nokogiri
23
+ module HTML5
24
+ # Since v1.12.0
25
+ #
26
+ # 💡 HTML5 functionality is not available when running JRuby.
27
+ class Document < Nokogiri::HTML4::Document
28
+ def self.parse(string_or_io, url = nil, encoding = nil, **options, &block)
29
+ yield options if block
30
+ string_or_io = "" unless string_or_io
31
+
32
+ if string_or_io.respond_to?(:encoding) && string_or_io.encoding.name != "ASCII-8BIT"
33
+ encoding ||= string_or_io.encoding.name
34
+ end
35
+
36
+ if string_or_io.respond_to?(:read) && string_or_io.respond_to?(:path)
37
+ url ||= string_or_io.path
38
+ end
39
+ unless string_or_io.respond_to?(:read) || string_or_io.respond_to?(:to_str)
40
+ raise ArgumentError, "not a string or IO object"
41
+ end
42
+
43
+ do_parse(string_or_io, url, encoding, options)
44
+ end
45
+
46
+ def self.read_io(io, url = nil, encoding = nil, **options)
47
+ raise ArgumentError, "io object doesn't respond to :read" unless io.respond_to?(:read)
48
+
49
+ do_parse(io, url, encoding, options)
50
+ end
51
+
52
+ def self.read_memory(string, url = nil, encoding = nil, **options)
53
+ raise ArgumentError, "string object doesn't respond to :to_str" unless string.respond_to?(:to_str)
54
+
55
+ do_parse(string, url, encoding, options)
56
+ end
57
+
58
+ def fragment(tags = nil)
59
+ DocumentFragment.new(self, tags, root)
60
+ end
61
+
62
+ def to_xml(options = {}, &block)
63
+ # Bypass XML::Document#to_xml which doesn't add
64
+ # XML::Node::SaveOptions::AS_XML like XML::Node#to_xml does.
65
+ XML::Node.instance_method(:to_xml).bind(self).call(options, &block)
66
+ end
67
+
68
+ # :call-seq:
69
+ # xpath_doctype() → Nokogiri::CSS::XPathVisitor::DoctypeConfig
70
+ #
71
+ # [Returns] The document type which determines CSS-to-XPath translation.
72
+ #
73
+ # See XPathVisitor for more information.
74
+ def xpath_doctype
75
+ Nokogiri::CSS::XPathVisitor::DoctypeConfig::HTML5
76
+ end
77
+
78
+ private
79
+
80
+ def self.do_parse(string_or_io, url, encoding, options)
81
+ string = HTML5.read_and_encode(string_or_io, encoding)
82
+ max_attributes = options[:max_attributes] || Nokogiri::Gumbo::DEFAULT_MAX_ATTRIBUTES
83
+ max_errors = options[:max_errors] || options[:max_parse_errors] || Nokogiri::Gumbo::DEFAULT_MAX_ERRORS
84
+ max_depth = options[:max_tree_depth] || Nokogiri::Gumbo::DEFAULT_MAX_TREE_DEPTH
85
+ doc = Nokogiri::Gumbo.parse(string, url, max_attributes, max_errors, max_depth)
86
+ doc.encoding = "UTF-8"
87
+ doc
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,83 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # Copyright 2013-2021 Sam Ruby, Stephen Checkoway
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require_relative "../html4/document_fragment"
21
+
22
+ module Nokogiri
23
+ module HTML5
24
+ # Since v1.12.0
25
+ #
26
+ # 💡 HTML5 functionality is not available when running JRuby.
27
+ class DocumentFragment < Nokogiri::HTML4::DocumentFragment
28
+ attr_accessor :document
29
+ attr_accessor :errors
30
+
31
+ # Create a document fragment.
32
+ def initialize(doc, tags = nil, ctx = nil, options = {})
33
+ self.document = doc
34
+ self.errors = []
35
+ return self unless tags
36
+
37
+ max_attributes = options[:max_attributes] || Nokogiri::Gumbo::DEFAULT_MAX_ATTRIBUTES
38
+ max_errors = options[:max_errors] || Nokogiri::Gumbo::DEFAULT_MAX_ERRORS
39
+ max_depth = options[:max_tree_depth] || Nokogiri::Gumbo::DEFAULT_MAX_TREE_DEPTH
40
+ tags = Nokogiri::HTML5.read_and_encode(tags, nil)
41
+ Nokogiri::Gumbo.fragment(self, tags, ctx, max_attributes, max_errors, max_depth)
42
+ end
43
+
44
+ def serialize(options = {}, &block)
45
+ # Bypass XML::Document.serialize which doesn't support options even
46
+ # though XML::Node.serialize does!
47
+ XML::Node.instance_method(:serialize).bind(self).call(options, &block)
48
+ end
49
+
50
+ # Parse a document fragment from +tags+, returning a Nodeset.
51
+ def self.parse(tags, encoding = nil, options = {})
52
+ doc = HTML5::Document.new
53
+ tags = HTML5.read_and_encode(tags, encoding)
54
+ doc.encoding = "UTF-8"
55
+ new(doc, tags, nil, options)
56
+ end
57
+
58
+ def extract_params(params) # :nodoc:
59
+ handler = params.find do |param|
60
+ ![Hash, String, Symbol].include?(param.class)
61
+ end
62
+ params -= [handler] if handler
63
+
64
+ hashes = []
65
+ while Hash === params.last || params.last.nil?
66
+ hashes << params.pop
67
+ break if params.empty?
68
+ end
69
+ ns, binds = hashes.reverse
70
+
71
+ ns ||=
72
+ begin
73
+ ns = {}
74
+ children.each { |child| ns.merge!(child.namespaces) }
75
+ ns
76
+ end
77
+
78
+ [params, handler, ns, binds]
79
+ end
80
+ end
81
+ end
82
+ end
83
+ # vim: set shiftwidth=2 softtabstop=2 tabstop=8 expandtab:
@@ -0,0 +1,100 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # Copyright 2013-2021 Sam Ruby, Stephen Checkoway
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require_relative "../xml/node"
21
+
22
+ module Nokogiri
23
+ module HTML5
24
+ # Since v1.12.0
25
+ #
26
+ # 💡 HTML5 functionality is not available when running JRuby.
27
+ module Node
28
+ def inner_html(options = {})
29
+ return super(options) unless document.is_a?(HTML5::Document)
30
+
31
+ result = options[:preserve_newline] && HTML5.prepend_newline?(self) ? +"\n" : +""
32
+ result << children.map { |child| child.to_html(options) }.join
33
+ result
34
+ end
35
+
36
+ def write_to(io, *options)
37
+ return super(io, *options) unless document.is_a?(HTML5::Document)
38
+
39
+ options = options.first.is_a?(Hash) ? options.shift : {}
40
+ encoding = options[:encoding] || options[0]
41
+ if Nokogiri.jruby?
42
+ save_options = options[:save_with] || options[1]
43
+ indent_times = options[:indent] || 0
44
+ else
45
+ save_options = options[:save_with] || options[1] || XML::Node::SaveOptions::FORMAT
46
+ indent_times = options[:indent] || 2
47
+ end
48
+ indent_string = (options[:indent_text] || " ") * indent_times
49
+
50
+ config = XML::Node::SaveOptions.new(save_options.to_i)
51
+ yield config if block_given?
52
+
53
+ config_options = config.options
54
+ if config_options & (XML::Node::SaveOptions::AS_XML | XML::Node::SaveOptions::AS_XHTML) != 0
55
+ # Use Nokogiri's serializing code.
56
+ native_write_to(io, encoding, indent_string, config_options)
57
+ else
58
+ # Serialize including the current node.
59
+ encoding ||= document.encoding || Encoding::UTF_8
60
+ internal_ops = {
61
+ preserve_newline: options[:preserve_newline] || false,
62
+ }
63
+ HTML5.serialize_node_internal(self, io, encoding, internal_ops)
64
+ end
65
+ end
66
+
67
+ def fragment(tags)
68
+ return super(tags) unless document.is_a?(HTML5::Document)
69
+
70
+ DocumentFragment.new(document, tags, self)
71
+ end
72
+
73
+ private
74
+
75
+ # HTML elements can have attributes that contain colons.
76
+ # Nokogiri::XML::Node#[]= treats names with colons as a prefixed QName
77
+ # and tries to create an attribute in a namespace. This is especially
78
+ # annoying with attribute names like xml:lang since libxml2 will
79
+ # actually create the xml namespace if it doesn't exist already.
80
+ def add_child_node_and_reparent_attrs(node)
81
+ return super(node) unless document.is_a?(HTML5::Document)
82
+
83
+ # I'm not sure what this method is supposed to do. Reparenting
84
+ # namespaces is handled by libxml2, including child namespaces which
85
+ # this method wouldn't handle.
86
+ # https://github.com/sparklemotion/nokogiri/issues/1790
87
+ add_child_node(node)
88
+ # node.attribute_nodes.find_all { |a| a.namespace }.each do |attr|
89
+ # attr.remove
90
+ # ns = attr.namespace
91
+ # a["#{ns.prefix}:#{attr.name}"] = attr.value
92
+ # end
93
+ end
94
+ end
95
+ # Monkey patch
96
+ XML::Node.prepend(HTML5::Node)
97
+ end
98
+ end
99
+
100
+ # vim: set shiftwidth=2 softtabstop=2 tabstop=8 expandtab: