nokogiri 1.18.0.rc1-x86_64-linux-gnu
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +38 -0
- data/LICENSE-DEPENDENCIES.md +2224 -0
- data/LICENSE.md +9 -0
- data/README.md +293 -0
- data/bin/nokogiri +131 -0
- data/dependencies.yml +42 -0
- data/ext/nokogiri/depend +38 -0
- data/ext/nokogiri/extconf.rb +1173 -0
- 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/include/libexslt/exslt.h +108 -0
- data/ext/nokogiri/include/libexslt/exsltconfig.h +70 -0
- data/ext/nokogiri/include/libexslt/exsltexports.h +63 -0
- data/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +336 -0
- data/ext/nokogiri/include/libxml2/libxml/HTMLtree.h +147 -0
- data/ext/nokogiri/include/libxml2/libxml/SAX.h +202 -0
- data/ext/nokogiri/include/libxml2/libxml/SAX2.h +171 -0
- data/ext/nokogiri/include/libxml2/libxml/c14n.h +115 -0
- data/ext/nokogiri/include/libxml2/libxml/catalog.h +182 -0
- data/ext/nokogiri/include/libxml2/libxml/chvalid.h +230 -0
- data/ext/nokogiri/include/libxml2/libxml/debugXML.h +217 -0
- data/ext/nokogiri/include/libxml2/libxml/dict.h +82 -0
- data/ext/nokogiri/include/libxml2/libxml/encoding.h +244 -0
- data/ext/nokogiri/include/libxml2/libxml/entities.h +166 -0
- data/ext/nokogiri/include/libxml2/libxml/globals.h +41 -0
- data/ext/nokogiri/include/libxml2/libxml/hash.h +251 -0
- data/ext/nokogiri/include/libxml2/libxml/list.h +137 -0
- data/ext/nokogiri/include/libxml2/libxml/nanoftp.h +186 -0
- data/ext/nokogiri/include/libxml2/libxml/nanohttp.h +98 -0
- data/ext/nokogiri/include/libxml2/libxml/parser.h +1390 -0
- data/ext/nokogiri/include/libxml2/libxml/parserInternals.h +671 -0
- data/ext/nokogiri/include/libxml2/libxml/pattern.h +106 -0
- data/ext/nokogiri/include/libxml2/libxml/relaxng.h +219 -0
- data/ext/nokogiri/include/libxml2/libxml/schemasInternals.h +959 -0
- data/ext/nokogiri/include/libxml2/libxml/schematron.h +143 -0
- data/ext/nokogiri/include/libxml2/libxml/threads.h +87 -0
- data/ext/nokogiri/include/libxml2/libxml/tree.h +1382 -0
- data/ext/nokogiri/include/libxml2/libxml/uri.h +106 -0
- data/ext/nokogiri/include/libxml2/libxml/valid.h +477 -0
- data/ext/nokogiri/include/libxml2/libxml/xinclude.h +136 -0
- data/ext/nokogiri/include/libxml2/libxml/xlink.h +189 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +438 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlautomata.h +146 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +962 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +146 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +188 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlmodule.h +57 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlreader.h +436 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlregexp.h +215 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlsave.h +102 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlschemas.h +249 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h +152 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlstring.h +140 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +366 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +347 -0
- data/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +489 -0
- data/ext/nokogiri/include/libxml2/libxml/xpath.h +579 -0
- data/ext/nokogiri/include/libxml2/libxml/xpathInternals.h +633 -0
- data/ext/nokogiri/include/libxml2/libxml/xpointer.h +138 -0
- data/ext/nokogiri/include/libxslt/attributes.h +39 -0
- data/ext/nokogiri/include/libxslt/documents.h +93 -0
- data/ext/nokogiri/include/libxslt/extensions.h +262 -0
- data/ext/nokogiri/include/libxslt/extra.h +72 -0
- data/ext/nokogiri/include/libxslt/functions.h +78 -0
- data/ext/nokogiri/include/libxslt/imports.h +75 -0
- data/ext/nokogiri/include/libxslt/keys.h +53 -0
- data/ext/nokogiri/include/libxslt/namespaces.h +68 -0
- data/ext/nokogiri/include/libxslt/numbersInternals.h +73 -0
- data/ext/nokogiri/include/libxslt/pattern.h +84 -0
- data/ext/nokogiri/include/libxslt/preproc.h +43 -0
- data/ext/nokogiri/include/libxslt/security.h +104 -0
- data/ext/nokogiri/include/libxslt/templates.h +77 -0
- data/ext/nokogiri/include/libxslt/transform.h +207 -0
- data/ext/nokogiri/include/libxslt/variables.h +118 -0
- data/ext/nokogiri/include/libxslt/xslt.h +110 -0
- data/ext/nokogiri/include/libxslt/xsltInternals.h +1995 -0
- data/ext/nokogiri/include/libxslt/xsltconfig.h +146 -0
- data/ext/nokogiri/include/libxslt/xsltexports.h +64 -0
- data/ext/nokogiri/include/libxslt/xsltlocale.h +44 -0
- data/ext/nokogiri/include/libxslt/xsltutils.h +343 -0
- data/ext/nokogiri/libxml2_polyfill.c +114 -0
- data/ext/nokogiri/nokogiri.c +294 -0
- data/ext/nokogiri/nokogiri.h +238 -0
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +103 -0
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_cdata.c +62 -0
- data/ext/nokogiri/xml_comment.c +57 -0
- data/ext/nokogiri/xml_document.c +784 -0
- data/ext/nokogiri/xml_document_fragment.c +29 -0
- data/ext/nokogiri/xml_dtd.c +208 -0
- data/ext/nokogiri/xml_element_content.c +131 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_encoding_handler.c +112 -0
- data/ext/nokogiri/xml_entity_decl.c +112 -0
- data/ext/nokogiri/xml_entity_reference.c +50 -0
- data/ext/nokogiri/xml_namespace.c +181 -0
- data/ext/nokogiri/xml_node.c +2459 -0
- data/ext/nokogiri/xml_node_set.c +518 -0
- data/ext/nokogiri/xml_processing_instruction.c +54 -0
- data/ext/nokogiri/xml_reader.c +777 -0
- data/ext/nokogiri/xml_relax_ng.c +149 -0
- data/ext/nokogiri/xml_sax_parser.c +403 -0
- data/ext/nokogiri/xml_sax_parser_context.c +390 -0
- data/ext/nokogiri/xml_sax_push_parser.c +206 -0
- data/ext/nokogiri/xml_schema.c +226 -0
- data/ext/nokogiri/xml_syntax_error.c +93 -0
- data/ext/nokogiri/xml_text.c +59 -0
- data/ext/nokogiri/xml_xpath_context.c +502 -0
- data/ext/nokogiri/xslt_stylesheet.c +421 -0
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +129 -0
- data/gumbo-parser/THANKS +27 -0
- data/lib/nokogiri/3.1/nokogiri.so +0 -0
- data/lib/nokogiri/3.2/nokogiri.so +0 -0
- data/lib/nokogiri/3.3/nokogiri.so +0 -0
- data/lib/nokogiri/3.4/nokogiri.so +0 -0
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +58 -0
- data/lib/nokogiri/css/parser.rb +772 -0
- data/lib/nokogiri/css/parser.y +277 -0
- data/lib/nokogiri/css/parser_extras.rb +36 -0
- data/lib/nokogiri/css/selector_cache.rb +38 -0
- data/lib/nokogiri/css/syntax_error.rb +9 -0
- data/lib/nokogiri/css/tokenizer.rb +155 -0
- data/lib/nokogiri/css/tokenizer.rex +57 -0
- data/lib/nokogiri/css/xpath_visitor.rb +375 -0
- data/lib/nokogiri/css.rb +132 -0
- data/lib/nokogiri/decorators/slop.rb +42 -0
- 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 +48 -0
- data/lib/nokogiri/html4/builder.rb +37 -0
- data/lib/nokogiri/html4/document.rb +235 -0
- data/lib/nokogiri/html4/document_fragment.rb +166 -0
- data/lib/nokogiri/html4/element_description.rb +25 -0
- data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
- data/lib/nokogiri/html4/encoding_reader.rb +121 -0
- data/lib/nokogiri/html4/entity_lookup.rb +15 -0
- data/lib/nokogiri/html4/sax/parser.rb +48 -0
- data/lib/nokogiri/html4/sax/parser_context.rb +15 -0
- data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
- 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 +6 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +224 -0
- data/lib/nokogiri/version.rb +4 -0
- data/lib/nokogiri/xml/attr.rb +66 -0
- data/lib/nokogiri/xml/attribute_decl.rb +22 -0
- data/lib/nokogiri/xml/builder.rb +494 -0
- data/lib/nokogiri/xml/cdata.rb +13 -0
- data/lib/nokogiri/xml/character_data.rb +9 -0
- data/lib/nokogiri/xml/document.rb +514 -0
- data/lib/nokogiri/xml/document_fragment.rb +276 -0
- data/lib/nokogiri/xml/dtd.rb +34 -0
- data/lib/nokogiri/xml/element_content.rb +46 -0
- data/lib/nokogiri/xml/element_decl.rb +17 -0
- data/lib/nokogiri/xml/entity_decl.rb +23 -0
- data/lib/nokogiri/xml/entity_reference.rb +20 -0
- data/lib/nokogiri/xml/namespace.rb +57 -0
- data/lib/nokogiri/xml/node/save_options.rb +76 -0
- data/lib/nokogiri/xml/node.rb +1650 -0
- data/lib/nokogiri/xml/node_set.rb +449 -0
- data/lib/nokogiri/xml/notation.rb +19 -0
- data/lib/nokogiri/xml/parse_options.rb +213 -0
- data/lib/nokogiri/xml/pp/character_data.rb +21 -0
- data/lib/nokogiri/xml/pp/node.rb +73 -0
- data/lib/nokogiri/xml/pp.rb +4 -0
- data/lib/nokogiri/xml/processing_instruction.rb +11 -0
- data/lib/nokogiri/xml/reader.rb +139 -0
- data/lib/nokogiri/xml/relax_ng.rb +75 -0
- data/lib/nokogiri/xml/sax/document.rb +258 -0
- data/lib/nokogiri/xml/sax/parser.rb +199 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +129 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +64 -0
- data/lib/nokogiri/xml/sax.rb +54 -0
- data/lib/nokogiri/xml/schema.rb +140 -0
- data/lib/nokogiri/xml/searchable.rb +297 -0
- data/lib/nokogiri/xml/syntax_error.rb +94 -0
- data/lib/nokogiri/xml/text.rb +11 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +13 -0
- data/lib/nokogiri/xml/xpath.rb +21 -0
- data/lib/nokogiri/xml/xpath_context.rb +49 -0
- data/lib/nokogiri/xml.rb +65 -0
- data/lib/nokogiri/xslt/stylesheet.rb +49 -0
- data/lib/nokogiri/xslt.rb +129 -0
- data/lib/nokogiri.rb +128 -0
- data/lib/xsd/xmlparser/nokogiri.rb +105 -0
- metadata +324 -0
@@ -0,0 +1,276 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Nokogiri
|
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.
|
8
|
+
class DocumentFragment < Nokogiri::XML::Node
|
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.
|
64
|
+
#
|
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
|
90
|
+
return self unless tags
|
91
|
+
|
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
|
109
|
+
children.each { |child| child.parent = self }
|
110
|
+
end
|
111
|
+
|
112
|
+
if Nokogiri.uses_libxml?
|
113
|
+
def dup
|
114
|
+
new_document = document.dup
|
115
|
+
new_fragment = self.class.new(new_document)
|
116
|
+
children.each do |child|
|
117
|
+
child.dup(1, new_document).parent = new_fragment
|
118
|
+
end
|
119
|
+
new_fragment
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
###
|
124
|
+
# return the name for DocumentFragment
|
125
|
+
def name
|
126
|
+
"#document-fragment"
|
127
|
+
end
|
128
|
+
|
129
|
+
###
|
130
|
+
# Convert this DocumentFragment to a string
|
131
|
+
def to_s
|
132
|
+
children.to_s
|
133
|
+
end
|
134
|
+
|
135
|
+
###
|
136
|
+
# Convert this DocumentFragment to html
|
137
|
+
# See Nokogiri::XML::NodeSet#to_html
|
138
|
+
def to_html(*args)
|
139
|
+
if Nokogiri.jruby?
|
140
|
+
options = args.first.is_a?(Hash) ? args.shift : {}
|
141
|
+
options[:save_with] ||= Node::SaveOptions::DEFAULT_HTML
|
142
|
+
args.insert(0, options)
|
143
|
+
end
|
144
|
+
children.to_html(*args)
|
145
|
+
end
|
146
|
+
|
147
|
+
###
|
148
|
+
# Convert this DocumentFragment to xhtml
|
149
|
+
# See Nokogiri::XML::NodeSet#to_xhtml
|
150
|
+
def to_xhtml(*args)
|
151
|
+
if Nokogiri.jruby?
|
152
|
+
options = args.first.is_a?(Hash) ? args.shift : {}
|
153
|
+
options[:save_with] ||= Node::SaveOptions::DEFAULT_XHTML
|
154
|
+
args.insert(0, options)
|
155
|
+
end
|
156
|
+
children.to_xhtml(*args)
|
157
|
+
end
|
158
|
+
|
159
|
+
###
|
160
|
+
# Convert this DocumentFragment to xml
|
161
|
+
# See Nokogiri::XML::NodeSet#to_xml
|
162
|
+
def to_xml(*args)
|
163
|
+
children.to_xml(*args)
|
164
|
+
end
|
165
|
+
|
166
|
+
###
|
167
|
+
# call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
|
168
|
+
#
|
169
|
+
# Search this fragment for CSS +rules+. +rules+ must be one or more CSS
|
170
|
+
# selectors. For example:
|
171
|
+
#
|
172
|
+
# For more information see Nokogiri::XML::Searchable#css
|
173
|
+
def css(*args)
|
174
|
+
if children.any?
|
175
|
+
children.css(*args) # 'children' is a smell here
|
176
|
+
else
|
177
|
+
NodeSet.new(document)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
#
|
182
|
+
# NOTE that we don't delegate #xpath to children ... another smell.
|
183
|
+
# def xpath ; end
|
184
|
+
#
|
185
|
+
|
186
|
+
###
|
187
|
+
# call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
|
188
|
+
#
|
189
|
+
# Search this fragment for +paths+. +paths+ must be one or more XPath or CSS queries.
|
190
|
+
#
|
191
|
+
# For more information see Nokogiri::XML::Searchable#search
|
192
|
+
def search(*rules)
|
193
|
+
rules, handler, ns, binds = extract_params(rules)
|
194
|
+
|
195
|
+
rules.inject(NodeSet.new(document)) do |set, rule|
|
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
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
alias_method :serialize, :to_s
|
205
|
+
|
206
|
+
# A list of Nokogiri::XML::SyntaxError found when parsing a document
|
207
|
+
def errors
|
208
|
+
document.errors
|
209
|
+
end
|
210
|
+
|
211
|
+
def errors=(things) # :nodoc:
|
212
|
+
document.errors = things
|
213
|
+
end
|
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
|
+
|
265
|
+
private
|
266
|
+
|
267
|
+
# fix for issue 770
|
268
|
+
def namespace_declarations(ctx)
|
269
|
+
ctx.namespace_scopes.map do |namespace|
|
270
|
+
prefix = namespace.prefix.nil? ? "" : ":#{namespace.prefix}"
|
271
|
+
%{xmlns#{prefix}="#{namespace.href}"}
|
272
|
+
end.join(" ")
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class DTD < Nokogiri::XML::Node
|
6
|
+
undef_method :attribute_nodes
|
7
|
+
undef_method :values
|
8
|
+
undef_method :content
|
9
|
+
undef_method :namespace
|
10
|
+
undef_method :namespace_definitions
|
11
|
+
undef_method :line if method_defined?(:line)
|
12
|
+
|
13
|
+
def keys
|
14
|
+
attributes.keys
|
15
|
+
end
|
16
|
+
|
17
|
+
def each
|
18
|
+
attributes.each do |key, value|
|
19
|
+
yield([key, value])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def html_dtd?
|
24
|
+
name.casecmp("html").zero?
|
25
|
+
end
|
26
|
+
|
27
|
+
def html5_dtd?
|
28
|
+
html_dtd? &&
|
29
|
+
external_id.nil? &&
|
30
|
+
(system_id.nil? || system_id == "about:legacy-compat")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
###
|
6
|
+
# Represents the allowed content in an Element Declaration inside a DTD:
|
7
|
+
#
|
8
|
+
# <?xml version="1.0"?><?TEST-STYLE PIDATA?>
|
9
|
+
# <!DOCTYPE staff SYSTEM "staff.dtd" [
|
10
|
+
# <!ELEMENT div1 (head, (p | list | note)*, div2*)>
|
11
|
+
# ]>
|
12
|
+
# </root>
|
13
|
+
#
|
14
|
+
# ElementContent represents the binary tree inside the <!ELEMENT> tag shown above that lists the
|
15
|
+
# possible content for the div1 tag.
|
16
|
+
class ElementContent
|
17
|
+
include Nokogiri::XML::PP::Node
|
18
|
+
|
19
|
+
# Possible definitions of type
|
20
|
+
PCDATA = 1
|
21
|
+
ELEMENT = 2
|
22
|
+
SEQ = 3
|
23
|
+
OR = 4
|
24
|
+
|
25
|
+
# Possible content occurrences
|
26
|
+
ONCE = 1
|
27
|
+
OPT = 2
|
28
|
+
MULT = 3
|
29
|
+
PLUS = 4
|
30
|
+
|
31
|
+
attr_reader :document
|
32
|
+
|
33
|
+
###
|
34
|
+
# Get the children of this ElementContent node
|
35
|
+
def children
|
36
|
+
[c1, c2].compact
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def inspect_attributes
|
42
|
+
[:prefix, :name, :type, :occur, :children]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class ElementDecl < Nokogiri::XML::Node
|
6
|
+
undef_method :namespace
|
7
|
+
undef_method :namespace_definitions
|
8
|
+
undef_method :line if method_defined?(:line)
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def inspect_attributes
|
13
|
+
[:to_s]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class EntityDecl < Nokogiri::XML::Node
|
6
|
+
undef_method :attribute_nodes
|
7
|
+
undef_method :attributes
|
8
|
+
undef_method :namespace
|
9
|
+
undef_method :namespace_definitions
|
10
|
+
undef_method :line if method_defined?(:line)
|
11
|
+
|
12
|
+
def self.new(name, doc, *args)
|
13
|
+
doc.create_entity(name, *args)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def inspect_attributes
|
19
|
+
[:to_s]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class EntityReference < Nokogiri::XML::Node
|
6
|
+
def children
|
7
|
+
# libxml2 will create a malformed child node for predefined
|
8
|
+
# entities. because any use of that child is likely to cause a
|
9
|
+
# segfault, we shall pretend that it doesn't exist.
|
10
|
+
#
|
11
|
+
# see https://github.com/sparklemotion/nokogiri/issues/1238 for details
|
12
|
+
NodeSet.new(document)
|
13
|
+
end
|
14
|
+
|
15
|
+
def inspect_attributes
|
16
|
+
[:name]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Nokogiri
|
5
|
+
module XML
|
6
|
+
class Namespace
|
7
|
+
include Nokogiri::XML::PP::Node
|
8
|
+
attr_reader :document
|
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
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def inspect_attributes
|
53
|
+
[:prefix, :href]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
class Node
|
6
|
+
###
|
7
|
+
# Save options for serializing nodes.
|
8
|
+
# See the method group entitled Node@Serialization+and+Generating+Output for usage.
|
9
|
+
class SaveOptions
|
10
|
+
# Format serialized xml
|
11
|
+
FORMAT = 1
|
12
|
+
# Do not include declarations
|
13
|
+
NO_DECLARATION = 2
|
14
|
+
# Do not include empty tags
|
15
|
+
NO_EMPTY_TAGS = 4
|
16
|
+
# Do not save XHTML
|
17
|
+
NO_XHTML = 8
|
18
|
+
# Save as XHTML
|
19
|
+
AS_XHTML = 16
|
20
|
+
# Save as XML
|
21
|
+
AS_XML = 32
|
22
|
+
# Save as HTML
|
23
|
+
AS_HTML = 64
|
24
|
+
|
25
|
+
if Nokogiri.jruby?
|
26
|
+
# Save builder created document
|
27
|
+
AS_BUILDER = 128
|
28
|
+
# the default for XML documents
|
29
|
+
DEFAULT_XML = AS_XML # https://github.com/sparklemotion/nokogiri/issues/#issue/415
|
30
|
+
# the default for HTML document
|
31
|
+
DEFAULT_HTML = NO_DECLARATION | NO_EMPTY_TAGS | AS_HTML
|
32
|
+
# the default for XHTML document
|
33
|
+
DEFAULT_XHTML = NO_DECLARATION | AS_XHTML
|
34
|
+
else
|
35
|
+
# the default for XML documents
|
36
|
+
DEFAULT_XML = FORMAT | AS_XML
|
37
|
+
# the default for HTML document
|
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
|
41
|
+
end
|
42
|
+
|
43
|
+
# Integer representation of the SaveOptions
|
44
|
+
attr_reader :options
|
45
|
+
|
46
|
+
# Create a new SaveOptions object with +options+
|
47
|
+
def initialize(options = 0)
|
48
|
+
@options = options
|
49
|
+
end
|
50
|
+
|
51
|
+
constants.each do |constant|
|
52
|
+
class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
53
|
+
def #{constant.downcase}
|
54
|
+
@options |= #{constant}
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def #{constant.downcase}?
|
59
|
+
#{constant} & @options == #{constant}
|
60
|
+
end
|
61
|
+
RUBY
|
62
|
+
end
|
63
|
+
|
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
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|