nokogiri 1.11.7-x86-mingw32 → 1.12.0.rc1-x86-mingw32

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE-DEPENDENCIES.md +243 -22
  3. data/LICENSE.md +1 -1
  4. data/README.md +6 -5
  5. data/ext/nokogiri/depend +35 -34
  6. data/ext/nokogiri/extconf.rb +181 -103
  7. data/ext/nokogiri/gumbo.c +611 -0
  8. data/ext/nokogiri/{html_document.c → html4_document.c} +8 -8
  9. data/ext/nokogiri/{html_element_description.c → html4_element_description.c} +20 -18
  10. data/ext/nokogiri/{html_entity_lookup.c → html4_entity_lookup.c} +7 -7
  11. data/ext/nokogiri/{html_sax_parser_context.c → html4_sax_parser_context.c} +5 -5
  12. data/ext/nokogiri/{html_sax_push_parser.c → html4_sax_push_parser.c} +4 -4
  13. data/ext/nokogiri/include/libxslt/xsltconfig.h +1 -1
  14. data/ext/nokogiri/libxml2_backwards_compat.c +30 -30
  15. data/ext/nokogiri/nokogiri.c +51 -38
  16. data/ext/nokogiri/nokogiri.h +16 -9
  17. data/ext/nokogiri/xml_document.c +13 -13
  18. data/ext/nokogiri/xml_element_content.c +2 -0
  19. data/ext/nokogiri/xml_encoding_handler.c +11 -6
  20. data/ext/nokogiri/xml_namespace.c +2 -0
  21. data/ext/nokogiri/xml_node.c +102 -102
  22. data/ext/nokogiri/xml_node_set.c +20 -20
  23. data/ext/nokogiri/xml_reader.c +2 -0
  24. data/ext/nokogiri/xml_sax_parser.c +6 -6
  25. data/ext/nokogiri/xml_sax_parser_context.c +2 -0
  26. data/ext/nokogiri/xml_schema.c +2 -0
  27. data/ext/nokogiri/xml_xpath_context.c +67 -65
  28. data/ext/nokogiri/xslt_stylesheet.c +2 -1
  29. data/gumbo-parser/CHANGES.md +63 -0
  30. data/gumbo-parser/Makefile +101 -0
  31. data/gumbo-parser/THANKS +27 -0
  32. data/lib/nokogiri.rb +31 -29
  33. data/lib/nokogiri/2.5/nokogiri.so +0 -0
  34. data/lib/nokogiri/2.6/nokogiri.so +0 -0
  35. data/lib/nokogiri/2.7/nokogiri.so +0 -0
  36. data/lib/nokogiri/3.0/nokogiri.so +0 -0
  37. data/lib/nokogiri/css.rb +14 -14
  38. data/lib/nokogiri/css/parser.rb +1 -1
  39. data/lib/nokogiri/css/parser.y +1 -1
  40. data/lib/nokogiri/css/syntax_error.rb +1 -1
  41. data/lib/nokogiri/extension.rb +2 -2
  42. data/lib/nokogiri/gumbo.rb +14 -0
  43. data/lib/nokogiri/html.rb +31 -27
  44. data/lib/nokogiri/html4.rb +40 -0
  45. data/lib/nokogiri/{html → html4}/builder.rb +2 -2
  46. data/lib/nokogiri/{html → html4}/document.rb +4 -4
  47. data/lib/nokogiri/{html → html4}/document_fragment.rb +3 -3
  48. data/lib/nokogiri/{html → html4}/element_description.rb +1 -1
  49. data/lib/nokogiri/{html → html4}/element_description_defaults.rb +1 -1
  50. data/lib/nokogiri/{html → html4}/entity_lookup.rb +1 -1
  51. data/lib/nokogiri/{html → html4}/sax/parser.rb +11 -14
  52. data/lib/nokogiri/html4/sax/parser_context.rb +19 -0
  53. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +5 -5
  54. data/lib/nokogiri/html5.rb +473 -0
  55. data/lib/nokogiri/html5/document.rb +74 -0
  56. data/lib/nokogiri/html5/document_fragment.rb +80 -0
  57. data/lib/nokogiri/html5/node.rb +93 -0
  58. data/lib/nokogiri/version/constant.rb +1 -1
  59. data/lib/nokogiri/version/info.rb +11 -2
  60. data/lib/nokogiri/xml.rb +35 -36
  61. data/lib/nokogiri/xml/node.rb +6 -5
  62. data/lib/nokogiri/xml/parse_options.rb +2 -0
  63. data/lib/nokogiri/xml/pp.rb +2 -2
  64. data/lib/nokogiri/xml/sax.rb +4 -4
  65. data/lib/nokogiri/xml/sax/document.rb +24 -30
  66. data/lib/nokogiri/xml/xpath.rb +2 -2
  67. data/lib/nokogiri/xslt.rb +16 -16
  68. data/lib/nokogiri/xslt/stylesheet.rb +1 -1
  69. metadata +37 -37
  70. data/lib/nokogiri/html/sax/parser_context.rb +0 -17
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright 2013-2021 Sam Ruby, Stephen Checkoway
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require_relative "../html4/document"
19
+
20
+ module Nokogiri
21
+ module HTML5
22
+ # @since v1.12.0
23
+ # @note HTML5 functionality is not available when running JRuby.
24
+ class Document < Nokogiri::HTML4::Document
25
+ def self.parse(string_or_io, url = nil, encoding = nil, **options, &block)
26
+ yield options if block_given?
27
+ string_or_io = '' unless string_or_io
28
+
29
+ if string_or_io.respond_to?(:encoding) && string_or_io.encoding.name != 'ASCII-8BIT'
30
+ encoding ||= string_or_io.encoding.name
31
+ end
32
+
33
+ if string_or_io.respond_to?(:read) && string_or_io.respond_to?(:path)
34
+ url ||= string_or_io.path
35
+ end
36
+ unless string_or_io.respond_to?(:read) || string_or_io.respond_to?(:to_str)
37
+ raise ArgumentError.new("not a string or IO object")
38
+ end
39
+ do_parse(string_or_io, url, encoding, options)
40
+ end
41
+
42
+ def self.read_io(io, url = nil, encoding = nil, **options)
43
+ raise ArgumentError.new("io object doesn't respond to :read") unless io.respond_to?(:read)
44
+ do_parse(io, url, encoding, options)
45
+ end
46
+
47
+ def self.read_memory(string, url = nil, encoding = nil, **options)
48
+ raise ArgumentError.new("string object doesn't respond to :to_str") unless string.respond_to?(:to_str)
49
+ do_parse(string, url, encoding, options)
50
+ end
51
+
52
+ def fragment(tags = nil)
53
+ DocumentFragment.new(self, tags, self.root)
54
+ end
55
+
56
+ def to_xml(options = {}, &block)
57
+ # Bypass XML::Document#to_xml which doesn't add
58
+ # XML::Node::SaveOptions::AS_XML like XML::Node#to_xml does.
59
+ XML::Node.instance_method(:to_xml).bind(self).call(options, &block)
60
+ end
61
+
62
+ private
63
+ def self.do_parse(string_or_io, url, encoding, options)
64
+ string = HTML5.read_and_encode(string_or_io, encoding)
65
+ max_attributes = options[:max_attributes] || Nokogiri::Gumbo::DEFAULT_MAX_ATTRIBUTES
66
+ max_errors = options[:max_errors] || options[:max_parse_errors] || Nokogiri::Gumbo::DEFAULT_MAX_ERRORS
67
+ max_depth = options[:max_tree_depth] || Nokogiri::Gumbo::DEFAULT_MAX_TREE_DEPTH
68
+ doc = Nokogiri::Gumbo.parse(string, url, max_attributes, max_errors, max_depth)
69
+ doc.encoding = 'UTF-8'
70
+ doc
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright 2013-2021 Sam Ruby, Stephen Checkoway
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require_relative "../html4/document_fragment"
19
+
20
+ module Nokogiri
21
+ module HTML5
22
+ # @since v1.12.0
23
+ # @note HTML5 functionality is not available when running JRuby.
24
+ class DocumentFragment < Nokogiri::HTML4::DocumentFragment
25
+ attr_accessor :document
26
+ attr_accessor :errors
27
+
28
+ # Create a document fragment.
29
+ def initialize(doc, tags = nil, ctx = nil, options = {})
30
+ self.document = doc
31
+ self.errors = []
32
+ return self unless tags
33
+
34
+ max_attributes = options[:max_attributes] || Nokogiri::Gumbo::DEFAULT_MAX_ATTRIBUTES
35
+ max_errors = options[:max_errors] || Nokogiri::Gumbo::DEFAULT_MAX_ERRORS
36
+ max_depth = options[:max_tree_depth] || Nokogiri::Gumbo::DEFAULT_MAX_TREE_DEPTH
37
+ tags = Nokogiri::HTML5.read_and_encode(tags, nil)
38
+ Nokogiri::Gumbo.fragment(self, tags, ctx, max_attributes, max_errors, max_depth)
39
+ end
40
+
41
+ def serialize(options = {}, &block)
42
+ # Bypass XML::Document.serialize which doesn't support options even
43
+ # though XML::Node.serialize does!
44
+ XML::Node.instance_method(:serialize).bind(self).call(options, &block)
45
+ end
46
+
47
+ # Parse a document fragment from +tags+, returning a Nodeset.
48
+ def self.parse(tags, encoding = nil, options = {})
49
+ doc = HTML5::Document.new
50
+ tags = HTML5.read_and_encode(tags, encoding)
51
+ doc.encoding = "UTF-8"
52
+ new(doc, tags, nil, options)
53
+ end
54
+
55
+ def extract_params(params) # :nodoc:
56
+ handler = params.find do |param|
57
+ ![Hash, String, Symbol].include?(param.class)
58
+ end
59
+ params -= [handler] if handler
60
+
61
+ hashes = []
62
+ while Hash === params.last || params.last.nil?
63
+ hashes << params.pop
64
+ break if params.empty?
65
+ end
66
+ ns, binds = hashes.reverse
67
+
68
+ ns ||=
69
+ begin
70
+ ns = {}
71
+ children.each { |child| ns.merge!(child.namespaces) }
72
+ ns
73
+ end
74
+
75
+ [params, handler, ns, binds]
76
+ end
77
+ end
78
+ end
79
+ end
80
+ # vim: set shiftwidth=2 softtabstop=2 tabstop=8 expandtab:
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright 2013-2021 Sam Ruby, Stephen Checkoway
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require_relative "../xml/node"
19
+
20
+ module Nokogiri
21
+ module HTML5
22
+ # @since v1.12.0
23
+ # @note HTML5 functionality is not available when running JRuby.
24
+ module Node
25
+ def inner_html(options = {})
26
+ return super(options) unless document.is_a?(HTML5::Document)
27
+ result = options[:preserve_newline] && HTML5.prepend_newline?(self) ? String.new("\n") : String.new
28
+ result << children.map { |child| child.to_html(options) }.join
29
+ result
30
+ end
31
+
32
+ def write_to(io, *options)
33
+ return super(io, *options) unless document.is_a?(HTML5::Document)
34
+ options = options.first.is_a?(Hash) ? options.shift : {}
35
+ encoding = options[:encoding] || options[0]
36
+ if Nokogiri.jruby?
37
+ save_options = options[:save_with] || options[1]
38
+ indent_times = options[:indent] || 0
39
+ else
40
+ save_options = options[:save_with] || options[1] || XML::Node::SaveOptions::FORMAT
41
+ indent_times = options[:indent] || 2
42
+ end
43
+ indent_string = (options[:indent_text] || " ") * indent_times
44
+
45
+ config = XML::Node::SaveOptions.new(save_options.to_i)
46
+ yield config if block_given?
47
+
48
+ config_options = config.options
49
+ if config_options & (XML::Node::SaveOptions::AS_XML | XML::Node::SaveOptions::AS_XHTML) != 0
50
+ # Use Nokogiri's serializing code.
51
+ native_write_to(io, encoding, indent_string, config_options)
52
+ else
53
+ # Serialize including the current node.
54
+ encoding ||= document.encoding || Encoding::UTF_8
55
+ internal_ops = {
56
+ preserve_newline: options[:preserve_newline] || false,
57
+ }
58
+ HTML5.serialize_node_internal(self, io, encoding, internal_ops)
59
+ end
60
+ end
61
+
62
+ def fragment(tags)
63
+ return super(tags) unless document.is_a?(HTML5::Document)
64
+ DocumentFragment.new(document, tags, self)
65
+ end
66
+
67
+ private
68
+
69
+ # HTML elements can have attributes that contain colons.
70
+ # Nokogiri::XML::Node#[]= treats names with colons as a prefixed QName
71
+ # and tries to create an attribute in a namespace. This is especially
72
+ # annoying with attribute names like xml:lang since libxml2 will
73
+ # actually create the xml namespace if it doesn't exist already.
74
+ def add_child_node_and_reparent_attrs(node)
75
+ return super(node) unless document.is_a?(HTML5::Document)
76
+ # I'm not sure what this method is supposed to do. Reparenting
77
+ # namespaces is handled by libxml2, including child namespaces which
78
+ # this method wouldn't handle.
79
+ # https://github.com/sparklemotion/nokogiri/issues/1790
80
+ add_child_node(node)
81
+ # node.attribute_nodes.find_all { |a| a.namespace }.each do |attr|
82
+ # attr.remove
83
+ # ns = attr.namespace
84
+ # a["#{ns.prefix}:#{attr.name}"] = attr.value
85
+ # end
86
+ end
87
+ end
88
+ # Monkey patch
89
+ XML::Node.prepend(HTML5::Node)
90
+ end
91
+ end
92
+
93
+ # vim: set shiftwidth=2 softtabstop=2 tabstop=8 expandtab:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Nokogiri
3
3
  # The version of Nokogiri you are using
4
- VERSION = "1.11.7"
4
+ VERSION = "1.12.0.rc1"
5
5
  end
@@ -52,6 +52,10 @@ module Nokogiri
52
52
  defined?(Nokogiri::LIBXML_ICONV_ENABLED) && Nokogiri::LIBXML_ICONV_ENABLED
53
53
  end
54
54
 
55
+ def libxslt_has_datetime?
56
+ defined?(Nokogiri::LIBXSLT_DATETIME_ENABLED) && Nokogiri::LIBXSLT_DATETIME_ENABLED
57
+ end
58
+
55
59
  def libxml2_using_packaged?
56
60
  libxml2? && Nokogiri::PACKAGED_LIBRARIES
57
61
  end
@@ -151,6 +155,7 @@ module Nokogiri
151
155
  else
152
156
  libxslt["source"] = "system"
153
157
  end
158
+ libxslt["datetime_enabled"] = libxslt_has_datetime?
154
159
  libxslt["compiled"] = compiled_libxslt_version.to_s
155
160
  libxslt["loaded"] = loaded_libxslt_version.to_s
156
161
  end
@@ -191,15 +196,19 @@ module Nokogiri
191
196
  Gem::Requirement.new(requirement).satisfied_by?(VersionInfo.instance.loaded_libxml_version)
192
197
  end
193
198
 
199
+ def self.uses_gumbo?
200
+ uses_libxml? # TODO: replace with Gumbo functionality
201
+ end
202
+
194
203
  def self.jruby? # :nodoc:
195
204
  VersionInfo.instance.jruby?
196
205
  end
197
206
 
198
207
  # Ensure constants used in this file are loaded - see #1896
199
208
  if Nokogiri.jruby?
200
- require "nokogiri/jruby/dependencies"
209
+ require_relative "../jruby/dependencies"
201
210
  end
202
- require "nokogiri/extension"
211
+ require_relative "../extension"
203
212
 
204
213
  # More complete version information about libxml
205
214
  VERSION_INFO = VersionInfo.instance.to_hash
data/lib/nokogiri/xml.rb CHANGED
@@ -1,38 +1,9 @@
1
1
  # frozen_string_literal: true
2
- require 'nokogiri/xml/pp'
3
- require 'nokogiri/xml/parse_options'
4
- require 'nokogiri/xml/sax'
5
- require 'nokogiri/xml/searchable'
6
- require 'nokogiri/xml/node'
7
- require 'nokogiri/xml/attribute_decl'
8
- require 'nokogiri/xml/element_decl'
9
- require 'nokogiri/xml/element_content'
10
- require 'nokogiri/xml/character_data'
11
- require 'nokogiri/xml/namespace'
12
- require 'nokogiri/xml/attr'
13
- require 'nokogiri/xml/dtd'
14
- require 'nokogiri/xml/cdata'
15
- require 'nokogiri/xml/text'
16
- require 'nokogiri/xml/document'
17
- require 'nokogiri/xml/document_fragment'
18
- require 'nokogiri/xml/processing_instruction'
19
- require 'nokogiri/xml/node_set'
20
- require 'nokogiri/xml/syntax_error'
21
- require 'nokogiri/xml/xpath'
22
- require 'nokogiri/xml/xpath_context'
23
- require 'nokogiri/xml/builder'
24
- require 'nokogiri/xml/reader'
25
- require 'nokogiri/xml/notation'
26
- require 'nokogiri/xml/entity_decl'
27
- require 'nokogiri/xml/entity_reference'
28
- require 'nokogiri/xml/schema'
29
- require 'nokogiri/xml/relax_ng'
30
-
31
2
  module Nokogiri
32
3
  class << self
33
4
  ###
34
5
  # Parse XML. Convenience method for Nokogiri::XML::Document.parse
35
- def XML thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_XML, &block
6
+ def XML(thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_XML, &block)
36
7
  Nokogiri::XML::Document.parse(thing, url, encoding, options, &block)
37
8
  end
38
9
  end
@@ -41,20 +12,19 @@ module Nokogiri
41
12
  # Original C14N 1.0 spec canonicalization
42
13
  XML_C14N_1_0 = 0
43
14
  # Exclusive C14N 1.0 spec canonicalization
44
- XML_C14N_EXCLUSIVE_1_0 = 1
15
+ XML_C14N_EXCLUSIVE_1_0 = 1
45
16
  # C14N 1.1 spec canonicalization
46
17
  XML_C14N_1_1 = 2
47
18
  class << self
48
19
  ###
49
20
  # Parse an XML document using the Nokogiri::XML::Reader API. See
50
21
  # Nokogiri::XML::Reader for mor information
51
- def Reader string_or_io, url = nil, encoding = nil, options = ParseOptions::STRICT
52
-
22
+ def Reader(string_or_io, url = nil, encoding = nil, options = ParseOptions::STRICT)
53
23
  options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
54
24
  # Give the options to the user
55
25
  yield options if block_given?
56
26
 
57
- if string_or_io.respond_to? :read
27
+ if string_or_io.respond_to?(:read)
58
28
  return Reader.from_io(string_or_io, url, encoding, options.to_i)
59
29
  end
60
30
  Reader.from_memory(string_or_io, url, encoding, options.to_i)
@@ -62,15 +32,44 @@ module Nokogiri
62
32
 
63
33
  ###
64
34
  # Parse XML. Convenience method for Nokogiri::XML::Document.parse
65
- def parse thing, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML, &block
35
+ def parse(thing, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML, &block)
66
36
  Document.parse(thing, url, encoding, options, &block)
67
37
  end
68
38
 
69
39
  ####
70
40
  # Parse a fragment from +string+ in to a NodeSet.
71
- def fragment string
41
+ def fragment(string)
72
42
  XML::DocumentFragment.parse(string)
73
43
  end
74
44
  end
75
45
  end
76
46
  end
47
+
48
+ require_relative "xml/pp"
49
+ require_relative "xml/parse_options"
50
+ require_relative "xml/sax"
51
+ require_relative "xml/searchable"
52
+ require_relative "xml/node"
53
+ require_relative "xml/attribute_decl"
54
+ require_relative "xml/element_decl"
55
+ require_relative "xml/element_content"
56
+ require_relative "xml/character_data"
57
+ require_relative "xml/namespace"
58
+ require_relative "xml/attr"
59
+ require_relative "xml/dtd"
60
+ require_relative "xml/cdata"
61
+ require_relative "xml/text"
62
+ require_relative "xml/document"
63
+ require_relative "xml/document_fragment"
64
+ require_relative "xml/processing_instruction"
65
+ require_relative "xml/node_set"
66
+ require_relative "xml/syntax_error"
67
+ require_relative "xml/xpath"
68
+ require_relative "xml/xpath_context"
69
+ require_relative "xml/builder"
70
+ require_relative "xml/reader"
71
+ require_relative "xml/notation"
72
+ require_relative "xml/entity_decl"
73
+ require_relative "xml/entity_reference"
74
+ require_relative "xml/schema"
75
+ require_relative "xml/relax_ng"
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
  require "stringio"
4
- require "nokogiri/xml/node/save_options"
5
4
 
6
5
  module Nokogiri
7
6
  module XML
@@ -837,7 +836,7 @@ module Nokogiri
837
836
  node_set = in_context(contents, options.to_i)
838
837
  if (node_set.empty? && (document.errors.length > error_count))
839
838
  if options.recover?
840
- fragment = Nokogiri::HTML::DocumentFragment.parse contents
839
+ fragment = Nokogiri::HTML4::DocumentFragment.parse contents
841
840
  node_set = fragment.children
842
841
  else
843
842
  raise document.errors[error_count]
@@ -883,7 +882,7 @@ module Nokogiri
883
882
  type == DOCUMENT_NODE
884
883
  end
885
884
 
886
- # Returns true if this is an HTML::Document node
885
+ # Returns true if this is an HTML4::Document node
887
886
  def html?
888
887
  type == HTML_DOCUMENT_NODE
889
888
  end
@@ -909,11 +908,11 @@ module Nokogiri
909
908
  end
910
909
 
911
910
  ###
912
- # Fetch the Nokogiri::HTML::ElementDescription for this node. Returns
911
+ # Fetch the Nokogiri::HTML4::ElementDescription for this node. Returns
913
912
  # nil on XML documents and on unknown tags.
914
913
  def description
915
914
  return nil if document.xml?
916
- Nokogiri::HTML::ElementDescription[name]
915
+ Nokogiri::HTML4::ElementDescription[name]
917
916
  end
918
917
 
919
918
  ###
@@ -1235,3 +1234,5 @@ Requires a Node, NodeSet or String argument, and cannot accept a #{data.class}.
1235
1234
  end
1236
1235
  end
1237
1236
  end
1237
+
1238
+ require_relative "node/save_options"