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.
- checksums.yaml +4 -4
- data/Gemfile +38 -0
- data/LICENSE-DEPENDENCIES.md +1632 -1022
- data/LICENSE.md +1 -1
- data/README.md +190 -95
- data/bin/nokogiri +63 -50
- data/dependencies.yml +34 -66
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +909 -422
- data/ext/nokogiri/gumbo.c +610 -0
- data/ext/nokogiri/html4_document.c +171 -0
- data/ext/nokogiri/html4_element_description.c +299 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser.c +40 -0
- data/ext/nokogiri/html4_sax_parser_context.c +98 -0
- data/ext/nokogiri/html4_sax_push_parser.c +96 -0
- data/ext/nokogiri/libxml2_polyfill.c +114 -0
- data/ext/nokogiri/nokogiri.c +258 -105
- data/ext/nokogiri/nokogiri.h +207 -90
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +18 -18
- data/ext/nokogiri/xml_attribute_decl.c +22 -22
- data/ext/nokogiri/xml_cdata.c +33 -33
- data/ext/nokogiri/xml_comment.c +19 -31
- data/ext/nokogiri/xml_document.c +499 -323
- data/ext/nokogiri/xml_document_fragment.c +17 -36
- data/ext/nokogiri/xml_dtd.c +65 -59
- data/ext/nokogiri/xml_element_content.c +63 -55
- data/ext/nokogiri/xml_element_decl.c +31 -31
- data/ext/nokogiri/xml_encoding_handler.c +54 -21
- data/ext/nokogiri/xml_entity_decl.c +37 -35
- data/ext/nokogiri/xml_entity_reference.c +17 -19
- data/ext/nokogiri/xml_namespace.c +131 -61
- data/ext/nokogiri/xml_node.c +1429 -723
- data/ext/nokogiri/xml_node_set.c +257 -225
- data/ext/nokogiri/xml_processing_instruction.c +18 -20
- data/ext/nokogiri/xml_reader.c +340 -231
- data/ext/nokogiri/xml_relax_ng.c +87 -99
- data/ext/nokogiri/xml_sax_parser.c +269 -176
- data/ext/nokogiri/xml_sax_parser_context.c +286 -152
- data/ext/nokogiri/xml_sax_push_parser.c +111 -64
- data/ext/nokogiri/xml_schema.c +132 -140
- data/ext/nokogiri/xml_syntax_error.c +52 -23
- data/ext/nokogiri/xml_text.c +37 -30
- data/ext/nokogiri/xml_xpath_context.c +373 -185
- data/ext/nokogiri/xslt_stylesheet.c +342 -191
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +129 -0
- data/gumbo-parser/THANKS +27 -0
- data/gumbo-parser/src/Makefile +34 -0
- data/gumbo-parser/src/README.md +41 -0
- data/gumbo-parser/src/ascii.c +75 -0
- data/gumbo-parser/src/ascii.h +115 -0
- data/gumbo-parser/src/attribute.c +42 -0
- data/gumbo-parser/src/attribute.h +17 -0
- data/gumbo-parser/src/char_ref.c +22225 -0
- data/gumbo-parser/src/char_ref.h +29 -0
- data/gumbo-parser/src/char_ref.rl +2154 -0
- data/gumbo-parser/src/error.c +658 -0
- data/gumbo-parser/src/error.h +152 -0
- data/gumbo-parser/src/foreign_attrs.c +103 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/nokogiri_gumbo.h +953 -0
- data/gumbo-parser/src/parser.c +4932 -0
- data/gumbo-parser/src/parser.h +41 -0
- data/gumbo-parser/src/replacement.h +33 -0
- data/gumbo-parser/src/string_buffer.c +103 -0
- data/gumbo-parser/src/string_buffer.h +68 -0
- data/gumbo-parser/src/string_piece.c +48 -0
- data/gumbo-parser/src/svg_attrs.c +174 -0
- data/gumbo-parser/src/svg_attrs.gperf +77 -0
- data/gumbo-parser/src/svg_tags.c +137 -0
- data/gumbo-parser/src/svg_tags.gperf +55 -0
- data/gumbo-parser/src/tag.c +223 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +170 -0
- data/gumbo-parser/src/tag_lookup.h +13 -0
- data/gumbo-parser/src/token_buffer.c +79 -0
- data/gumbo-parser/src/token_buffer.h +71 -0
- data/gumbo-parser/src/token_type.h +17 -0
- data/gumbo-parser/src/tokenizer.c +3464 -0
- data/gumbo-parser/src/tokenizer.h +112 -0
- data/gumbo-parser/src/tokenizer_states.h +339 -0
- data/gumbo-parser/src/utf8.c +245 -0
- data/gumbo-parser/src/utf8.h +164 -0
- data/gumbo-parser/src/util.c +66 -0
- data/gumbo-parser/src/util.h +34 -0
- data/gumbo-parser/src/vector.c +111 -0
- data/gumbo-parser/src/vector.h +45 -0
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +14 -8
- data/lib/nokogiri/css/parser.rb +399 -377
- data/lib/nokogiri/css/parser.y +250 -245
- data/lib/nokogiri/css/parser_extras.rb +16 -71
- data/lib/nokogiri/css/selector_cache.rb +38 -0
- data/lib/nokogiri/css/syntax_error.rb +3 -1
- data/lib/nokogiri/css/tokenizer.rb +7 -5
- data/lib/nokogiri/css/tokenizer.rex +11 -9
- data/lib/nokogiri/css/xpath_visitor.rb +242 -96
- data/lib/nokogiri/css.rb +122 -17
- data/lib/nokogiri/decorators/slop.rb +11 -11
- data/lib/nokogiri/encoding_handler.rb +57 -0
- data/lib/nokogiri/extension.rb +32 -0
- data/lib/nokogiri/gumbo.rb +15 -0
- data/lib/nokogiri/html.rb +38 -27
- data/lib/nokogiri/{html → html4}/builder.rb +4 -2
- data/lib/nokogiri/html4/document.rb +235 -0
- data/lib/nokogiri/html4/document_fragment.rb +166 -0
- data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
- data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
- data/lib/nokogiri/html4/encoding_reader.rb +121 -0
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
- data/lib/nokogiri/html4/sax/parser.rb +48 -0
- data/lib/nokogiri/html4/sax/parser_context.rb +15 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
- data/lib/nokogiri/html4.rb +42 -0
- data/lib/nokogiri/html5/builder.rb +40 -0
- data/lib/nokogiri/html5/document.rb +199 -0
- data/lib/nokogiri/html5/document_fragment.rb +200 -0
- data/lib/nokogiri/html5/node.rb +103 -0
- data/lib/nokogiri/html5.rb +368 -0
- data/lib/nokogiri/jruby/dependencies.rb +3 -0
- data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
- data/lib/nokogiri/syntax_error.rb +2 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +224 -0
- data/lib/nokogiri/version.rb +3 -108
- data/lib/nokogiri/xml/attr.rb +55 -3
- data/lib/nokogiri/xml/attribute_decl.rb +6 -2
- data/lib/nokogiri/xml/builder.rb +83 -35
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +359 -130
- data/lib/nokogiri/xml/document_fragment.rb +170 -54
- data/lib/nokogiri/xml/dtd.rb +4 -2
- data/lib/nokogiri/xml/element_content.rb +12 -2
- data/lib/nokogiri/xml/element_decl.rb +6 -2
- data/lib/nokogiri/xml/entity_decl.rb +7 -3
- data/lib/nokogiri/xml/entity_reference.rb +2 -0
- data/lib/nokogiri/xml/namespace.rb +44 -0
- data/lib/nokogiri/xml/node/save_options.rb +23 -8
- data/lib/nokogiri/xml/node.rb +1168 -420
- data/lib/nokogiri/xml/node_set.rb +145 -67
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +145 -52
- data/lib/nokogiri/xml/pp/character_data.rb +9 -6
- data/lib/nokogiri/xml/pp/node.rb +47 -30
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +4 -1
- data/lib/nokogiri/xml/reader.rb +68 -41
- data/lib/nokogiri/xml/relax_ng.rb +60 -17
- data/lib/nokogiri/xml/sax/document.rb +198 -111
- data/lib/nokogiri/xml/sax/parser.rb +144 -67
- data/lib/nokogiri/xml/sax/parser_context.rb +119 -6
- data/lib/nokogiri/xml/sax/push_parser.rb +9 -5
- data/lib/nokogiri/xml/sax.rb +54 -4
- data/lib/nokogiri/xml/schema.rb +116 -39
- data/lib/nokogiri/xml/searchable.rb +139 -95
- data/lib/nokogiri/xml/syntax_error.rb +29 -5
- data/lib/nokogiri/xml/text.rb +2 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
- data/lib/nokogiri/xml/xpath.rb +15 -4
- data/lib/nokogiri/xml/xpath_context.rb +15 -4
- data/lib/nokogiri/xml.rb +45 -55
- data/lib/nokogiri/xslt/stylesheet.rb +32 -8
- data/lib/nokogiri/xslt.rb +103 -30
- data/lib/nokogiri.rb +59 -75
- data/lib/xsd/xmlparser/nokogiri.rb +32 -29
- data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
- data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
- data/patches/libxml2/0019-xpath-Use-separate-static-hash-table-for-standard-fu.patch +244 -0
- data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
- data/ports/archives/libxml2-2.13.6.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.42.tar.xz +0 -0
- metadata +123 -295
- data/ext/nokogiri/html_document.c +0 -170
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.c +0 -279
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.c +0 -32
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.c +0 -116
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.c +0 -87
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -61
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -14
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
- data/lib/nokogiri/html/document.rb +0 -335
- data/lib/nokogiri/html/document_fragment.rb +0 -49
- data/lib/nokogiri/html/element_description_defaults.rb +0 -671
- data/lib/nokogiri/html/sax/parser.rb +0 -62
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxml2/0004-libxml2.la-is-in-top_builddir.patch +0 -25
- data/patches/libxml2/0005-Fix-infinite-loop-in-xmlStringLenDecodeEntities.patch +0 -32
- data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
- /data/patches/libxml2/{0002-Remove-script-macro-support.patch → 0001-Remove-script-macro-support.patch} +0 -0
- /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
|
-
#
|
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
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
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
|
138
|
+
def to_html(*args)
|
55
139
|
if Nokogiri.jruby?
|
56
140
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
57
|
-
|
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
|
150
|
+
def to_xhtml(*args)
|
69
151
|
if Nokogiri.jruby?
|
70
152
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
71
|
-
|
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
|
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
|
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
|
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
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
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
|
-
|
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=
|
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
|
268
|
+
def namespace_declarations(ctx)
|
147
269
|
ctx.namespace_scopes.map do |namespace|
|
148
270
|
prefix = namespace.prefix.nil? ? "" : ":#{namespace.prefix}"
|
149
|
-
%
|
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
|
data/lib/nokogiri/xml/dtd.rb
CHANGED
@@ -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(
|
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 ==
|
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
|
-
#
|
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
|
-
|
9
|
-
|
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
|
12
|
+
def self.new(name, doc, *args)
|
11
13
|
doc.create_entity(name, *args)
|
12
14
|
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
+
private
|
17
|
+
|
18
|
+
def inspect_attributes
|
19
|
+
[:to_s]
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
@@ -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
|
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
|
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
|
-
|
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
|