nokogiri 1.10.9 → 1.13.6

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -0
  3. data/LICENSE-DEPENDENCIES.md +1173 -884
  4. data/LICENSE.md +1 -1
  5. data/README.md +178 -96
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -64
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +746 -424
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +119 -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 +228 -91
  18. data/ext/nokogiri/nokogiri.h +191 -89
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +15 -15
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +13 -18
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -219
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +43 -18
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +60 -51
  33. data/ext/nokogiri/xml_node.c +1001 -610
  34. data/ext/nokogiri/xml_node_set.c +174 -162
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +226 -175
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +112 -112
  39. data/ext/nokogiri/xml_sax_parser_context.c +112 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  41. data/ext/nokogiri/xml_schema.c +96 -46
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +13 -17
  44. data/ext/nokogiri/xml_xpath_context.c +223 -115
  45. data/ext/nokogiri/xslt_stylesheet.c +265 -173
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -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 +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -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/parser.c +4875 -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 +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -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 +68 -0
  88. data/gumbo-parser/src/util.h +30 -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 +218 -91
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/{html → html4}/document.rb +103 -105
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +91 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +100 -0
  118. data/lib/nokogiri/html5.rb +478 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +222 -0
  123. data/lib/nokogiri/version.rb +3 -108
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +74 -33
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +224 -86
  130. data/lib/nokogiri/xml/document_fragment.rb +46 -44
  131. data/lib/nokogiri/xml/dtd.rb +4 -2
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +10 -5
  138. data/lib/nokogiri/xml/node.rb +884 -378
  139. data/lib/nokogiri/xml/node_set.rb +51 -54
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +22 -8
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +38 -34
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +112 -72
  155. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -37
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +49 -65
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
  166. data/patches/libxml2/{0003-Update-entities-to-remove-handling-of-ssi.patch → 0002-Update-entities-to-remove-handling-of-ssi.patch} +0 -0
  167. data/patches/libxml2/{0004-libxml2.la-is-in-top_builddir.patch → 0003-libxml2.la-is-in-top_builddir.patch} +1 -1
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.14.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +196 -140
  177. data/ext/nokogiri/html_document.c +0 -170
  178. data/ext/nokogiri/html_document.h +0 -10
  179. data/ext/nokogiri/html_element_description.c +0 -279
  180. data/ext/nokogiri/html_element_description.h +0 -10
  181. data/ext/nokogiri/html_entity_lookup.c +0 -32
  182. data/ext/nokogiri/html_entity_lookup.h +0 -8
  183. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  184. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  185. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  186. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  187. data/ext/nokogiri/xml_attr.h +0 -9
  188. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  189. data/ext/nokogiri/xml_cdata.h +0 -9
  190. data/ext/nokogiri/xml_comment.h +0 -9
  191. data/ext/nokogiri/xml_document.h +0 -23
  192. data/ext/nokogiri/xml_document_fragment.h +0 -10
  193. data/ext/nokogiri/xml_dtd.h +0 -10
  194. data/ext/nokogiri/xml_element_content.h +0 -10
  195. data/ext/nokogiri/xml_element_decl.h +0 -9
  196. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  197. data/ext/nokogiri/xml_entity_decl.h +0 -10
  198. data/ext/nokogiri/xml_entity_reference.h +0 -9
  199. data/ext/nokogiri/xml_io.c +0 -61
  200. data/ext/nokogiri/xml_io.h +0 -11
  201. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  202. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  203. data/ext/nokogiri/xml_namespace.h +0 -14
  204. data/ext/nokogiri/xml_node.h +0 -13
  205. data/ext/nokogiri/xml_node_set.h +0 -12
  206. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  207. data/ext/nokogiri/xml_reader.h +0 -10
  208. data/ext/nokogiri/xml_relax_ng.h +0 -9
  209. data/ext/nokogiri/xml_sax_parser.h +0 -39
  210. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  211. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  212. data/ext/nokogiri/xml_schema.h +0 -9
  213. data/ext/nokogiri/xml_syntax_error.h +0 -13
  214. data/ext/nokogiri/xml_text.h +0 -9
  215. data/ext/nokogiri/xml_xpath_context.h +0 -10
  216. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  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/patches/libxml2/0005-Fix-infinite-loop-in-xmlStringLenDecodeEntities.patch +0 -32
  222. data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
  223. 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,34 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
- module HTML
4
+ module HTML4
3
5
  module SAX
4
6
  class PushParser
5
-
6
- # The Nokogiri::HTML::SAX::Document on which the PushParser will be
7
+ # The Nokogiri::HTML4::SAX::Document on which the PushParser will be
7
8
  # operating
8
9
  attr_accessor :document
9
-
10
- 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")
11
12
  @document = doc
12
13
  @encoding = encoding
13
- @sax_parser = HTML::SAX::Parser.new(doc, @encoding)
14
+ @sax_parser = HTML4::SAX::Parser.new(doc, @encoding)
14
15
 
15
16
  ## Create our push parser context
16
17
  initialize_native(@sax_parser, file_name, encoding)
17
18
  end
18
-
19
+
19
20
  ###
20
21
  # Write a +chunk+ of HTML to the PushParser. Any callback methods
21
22
  # that can be called will be called immediately.
22
- def write chunk, last_chunk = false
23
+ def write(chunk, last_chunk = false)
23
24
  native_write(chunk, last_chunk)
24
25
  end
25
- alias :<< :write
26
+ alias_method :<<, :write
26
27
 
27
28
  ###
28
29
  # Finish the parsing. This method is only necessary for
29
- # Nokogiri::HTML::SAX::Document#end_document to be called.
30
+ # Nokogiri::HTML4::SAX::Document#end_document to be called.
30
31
  def finish
31
- write '', true
32
+ write("", true)
32
33
  end
33
34
  end
34
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: