nokogiri 1.9.1 → 1.15.3
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.
- checksums.yaml +4 -4
- data/Gemfile +45 -0
- data/LICENSE-DEPENDENCIES.md +1636 -1024
- data/LICENSE.md +5 -28
- data/README.md +203 -89
- data/bin/nokogiri +63 -50
- data/dependencies.yml +33 -61
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +864 -418
- data/ext/nokogiri/gumbo.c +594 -0
- data/ext/nokogiri/html4_document.c +165 -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_context.c +108 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +251 -105
- data/ext/nokogiri/nokogiri.h +215 -90
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +17 -17
- data/ext/nokogiri/xml_attribute_decl.c +22 -22
- data/ext/nokogiri/xml_cdata.c +40 -31
- data/ext/nokogiri/xml_comment.c +20 -27
- data/ext/nokogiri/xml_document.c +401 -240
- data/ext/nokogiri/xml_document_fragment.c +13 -17
- data/ext/nokogiri/xml_dtd.c +64 -58
- 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 +135 -61
- data/ext/nokogiri/xml_node.c +1346 -677
- data/ext/nokogiri/xml_node_set.c +246 -216
- data/ext/nokogiri/xml_processing_instruction.c +18 -20
- data/ext/nokogiri/xml_reader.c +347 -212
- data/ext/nokogiri/xml_relax_ng.c +86 -77
- data/ext/nokogiri/xml_sax_parser.c +149 -124
- data/ext/nokogiri/xml_sax_parser_context.c +145 -103
- data/ext/nokogiri/xml_sax_push_parser.c +64 -36
- data/ext/nokogiri/xml_schema.c +138 -81
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +36 -26
- data/ext/nokogiri/xml_xpath_context.c +366 -178
- data/ext/nokogiri/xslt_stylesheet.c +335 -189
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +111 -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 +630 -0
- data/gumbo-parser/src/error.h +148 -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 +944 -0
- data/gumbo-parser/src/parser.c +4891 -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 +3463 -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 +10 -8
- data/lib/nokogiri/css/parser.rb +397 -377
- data/lib/nokogiri/css/parser.y +250 -245
- data/lib/nokogiri/css/parser_extras.rb +54 -49
- data/lib/nokogiri/css/syntax_error.rb +3 -1
- data/lib/nokogiri/css/tokenizer.rb +107 -104
- data/lib/nokogiri/css/tokenizer.rex +3 -2
- data/lib/nokogiri/css/xpath_visitor.rb +224 -95
- data/lib/nokogiri/css.rb +56 -17
- data/lib/nokogiri/decorators/slop.rb +9 -7
- 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 +214 -0
- data/lib/nokogiri/html4/document_fragment.rb +54 -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/{html → html4}/sax/parser.rb +17 -16
- data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
- data/lib/nokogiri/html4.rb +47 -0
- data/lib/nokogiri/html5/document.rb +168 -0
- data/lib/nokogiri/html5/document_fragment.rb +90 -0
- data/lib/nokogiri/html5/node.rb +103 -0
- data/lib/nokogiri/html5.rb +392 -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 +223 -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 +98 -54
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +312 -126
- data/lib/nokogiri/xml/document_fragment.rb +93 -48
- 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 +45 -0
- data/lib/nokogiri/xml/node/save_options.rb +23 -8
- data/lib/nokogiri/xml/node.rb +1088 -418
- data/lib/nokogiri/xml/node_set.rb +173 -63
- 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 +42 -30
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +4 -1
- data/lib/nokogiri/xml/reader.rb +21 -28
- data/lib/nokogiri/xml/relax_ng.rb +8 -2
- data/lib/nokogiri/xml/sax/document.rb +45 -49
- data/lib/nokogiri/xml/sax/parser.rb +39 -36
- data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
- data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
- data/lib/nokogiri/xml/sax.rb +6 -4
- data/lib/nokogiri/xml/schema.rb +19 -9
- data/lib/nokogiri/xml/searchable.rb +120 -72
- data/lib/nokogiri/xml/syntax_error.rb +6 -4
- 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 +3 -3
- data/lib/nokogiri/xml.rb +38 -37
- data/lib/nokogiri/xslt/stylesheet.rb +3 -1
- data/lib/nokogiri/xslt.rb +101 -22
- data/lib/nokogiri.rb +59 -75
- data/lib/xsd/xmlparser/nokogiri.rb +29 -25
- data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
- data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
- data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
- 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/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
- data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
- metadata +128 -265
- 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_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
- data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
- data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
data/lib/nokogiri/version.rb
CHANGED
@@ -1,109 +1,4 @@
|
|
1
|
-
|
2
|
-
# The version of Nokogiri you are using
|
3
|
-
VERSION = '1.9.1'
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
::JRUBY_VERSION if RUBY_PLATFORM == "java"
|
8
|
-
end
|
9
|
-
|
10
|
-
def engine
|
11
|
-
defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'mri'
|
12
|
-
end
|
13
|
-
|
14
|
-
def loaded_parser_version
|
15
|
-
LIBXML_PARSER_VERSION.
|
16
|
-
scan(/^(\d+)(\d\d)(\d\d)(?!\d)/).first.
|
17
|
-
collect(&:to_i).
|
18
|
-
join(".")
|
19
|
-
end
|
20
|
-
|
21
|
-
def compiled_parser_version
|
22
|
-
LIBXML_VERSION
|
23
|
-
end
|
24
|
-
|
25
|
-
def libxml2?
|
26
|
-
defined?(LIBXML_VERSION)
|
27
|
-
end
|
28
|
-
|
29
|
-
def libxml2_using_system?
|
30
|
-
! libxml2_using_packaged?
|
31
|
-
end
|
32
|
-
|
33
|
-
def libxml2_using_packaged?
|
34
|
-
NOKOGIRI_USE_PACKAGED_LIBRARIES
|
35
|
-
end
|
36
|
-
|
37
|
-
def warnings
|
38
|
-
return [] unless libxml2?
|
39
|
-
|
40
|
-
if compiled_parser_version != loaded_parser_version
|
41
|
-
["Nokogiri was built against LibXML version #{compiled_parser_version}, but has dynamically loaded #{loaded_parser_version}"]
|
42
|
-
else
|
43
|
-
[]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def to_hash
|
48
|
-
hash_info = {}
|
49
|
-
hash_info['warnings'] = []
|
50
|
-
hash_info['nokogiri'] = Nokogiri::VERSION
|
51
|
-
hash_info['ruby'] = {}
|
52
|
-
hash_info['ruby']['version'] = ::RUBY_VERSION
|
53
|
-
hash_info['ruby']['platform'] = ::RUBY_PLATFORM
|
54
|
-
hash_info['ruby']['description'] = ::RUBY_DESCRIPTION
|
55
|
-
hash_info['ruby']['engine'] = engine
|
56
|
-
hash_info['ruby']['jruby'] = jruby? if jruby?
|
57
|
-
|
58
|
-
if libxml2?
|
59
|
-
hash_info['libxml'] = {}
|
60
|
-
hash_info['libxml']['binding'] = 'extension'
|
61
|
-
if libxml2_using_packaged?
|
62
|
-
hash_info['libxml']['source'] = "packaged"
|
63
|
-
hash_info['libxml']['libxml2_path'] = NOKOGIRI_LIBXML2_PATH
|
64
|
-
hash_info['libxml']['libxslt_path'] = NOKOGIRI_LIBXSLT_PATH
|
65
|
-
hash_info['libxml']['libxml2_patches'] = NOKOGIRI_LIBXML2_PATCHES
|
66
|
-
hash_info['libxml']['libxslt_patches'] = NOKOGIRI_LIBXSLT_PATCHES
|
67
|
-
else
|
68
|
-
hash_info['libxml']['source'] = "system"
|
69
|
-
end
|
70
|
-
hash_info['libxml']['compiled'] = compiled_parser_version
|
71
|
-
hash_info['libxml']['loaded'] = loaded_parser_version
|
72
|
-
hash_info['warnings'] = warnings
|
73
|
-
elsif jruby?
|
74
|
-
hash_info['xerces'] = Nokogiri::XERCES_VERSION
|
75
|
-
hash_info['nekohtml'] = Nokogiri::NEKO_VERSION
|
76
|
-
end
|
77
|
-
|
78
|
-
hash_info
|
79
|
-
end
|
80
|
-
|
81
|
-
def to_markdown
|
82
|
-
begin
|
83
|
-
require 'psych'
|
84
|
-
rescue LoadError
|
85
|
-
end
|
86
|
-
require 'yaml'
|
87
|
-
"# Nokogiri (#{Nokogiri::VERSION})\n" +
|
88
|
-
YAML.dump(to_hash).each_line.map { |line| " #{line}" }.join
|
89
|
-
end
|
90
|
-
|
91
|
-
# FIXME: maybe switch to singleton?
|
92
|
-
@@instance = new
|
93
|
-
@@instance.warnings.each do |warning|
|
94
|
-
warn "WARNING: #{warning}"
|
95
|
-
end
|
96
|
-
def self.instance; @@instance; end
|
97
|
-
end
|
98
|
-
|
99
|
-
# More complete version information about libxml
|
100
|
-
VERSION_INFO = VersionInfo.instance.to_hash
|
101
|
-
|
102
|
-
def self.uses_libxml? # :nodoc:
|
103
|
-
VersionInfo.instance.libxml2?
|
104
|
-
end
|
105
|
-
|
106
|
-
def self.jruby? # :nodoc:
|
107
|
-
VersionInfo.instance.jruby?
|
108
|
-
end
|
109
|
-
end
|
3
|
+
require_relative "version/constant"
|
4
|
+
require_relative "version/info"
|
data/lib/nokogiri/xml/attr.rb
CHANGED
@@ -1,11 +1,63 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
module Nokogiri
|
2
5
|
module XML
|
3
6
|
class Attr < Node
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
+
alias_method :value, :content
|
8
|
+
alias_method :to_s, :content
|
9
|
+
alias_method :content=, :value=
|
10
|
+
|
11
|
+
#
|
12
|
+
# :call-seq: deconstruct_keys(array_of_names) → Hash
|
13
|
+
#
|
14
|
+
# Returns a hash describing the Attr, to use in pattern matching.
|
15
|
+
#
|
16
|
+
# Valid keys and their values:
|
17
|
+
# - +name+ → (String) The name of the attribute.
|
18
|
+
# - +value+ → (String) The value of the attribute.
|
19
|
+
# - +namespace+ → (Namespace, nil) The Namespace of the attribute, or +nil+ if there is no namespace.
|
20
|
+
#
|
21
|
+
# ⚡ This is an experimental feature, available since v1.14.0
|
22
|
+
#
|
23
|
+
# *Example*
|
24
|
+
#
|
25
|
+
# doc = Nokogiri::XML.parse(<<~XML)
|
26
|
+
# <?xml version="1.0"?>
|
27
|
+
# <root xmlns="http://nokogiri.org/ns/default" xmlns:noko="http://nokogiri.org/ns/noko">
|
28
|
+
# <child1 foo="abc" noko:bar="def"/>
|
29
|
+
# </root>
|
30
|
+
# XML
|
31
|
+
#
|
32
|
+
# attributes = doc.root.elements.first.attribute_nodes
|
33
|
+
# # => [#(Attr:0x35c { name = "foo", value = "abc" }),
|
34
|
+
# # #(Attr:0x370 {
|
35
|
+
# # name = "bar",
|
36
|
+
# # namespace = #(Namespace:0x384 {
|
37
|
+
# # prefix = "noko",
|
38
|
+
# # href = "http://nokogiri.org/ns/noko"
|
39
|
+
# # }),
|
40
|
+
# # value = "def"
|
41
|
+
# # })]
|
42
|
+
#
|
43
|
+
# attributes.first.deconstruct_keys([:name, :value, :namespace])
|
44
|
+
# # => {:name=>"foo", :value=>"abc", :namespace=>nil}
|
45
|
+
#
|
46
|
+
# attributes.last.deconstruct_keys([:name, :value, :namespace])
|
47
|
+
# # => {:name=>"bar",
|
48
|
+
# # :value=>"def",
|
49
|
+
# # :namespace=>
|
50
|
+
# # #(Namespace:0x384 {
|
51
|
+
# # prefix = "noko",
|
52
|
+
# # href = "http://nokogiri.org/ns/noko"
|
53
|
+
# # })}
|
54
|
+
#
|
55
|
+
def deconstruct_keys(keys)
|
56
|
+
{ name: name, value: value, namespace: namespace }
|
57
|
+
end
|
7
58
|
|
8
59
|
private
|
60
|
+
|
9
61
|
def inspect_attributes
|
10
62
|
[:name, :namespace, :value]
|
11
63
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
###
|
@@ -10,8 +12,10 @@ module Nokogiri
|
|
10
12
|
undef_method :namespace_definitions
|
11
13
|
undef_method :line if method_defined?(:line)
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
+
private
|
16
|
+
|
17
|
+
def inspect_attributes
|
18
|
+
[:to_s]
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
data/lib/nokogiri/xml/builder.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Nokogiri
|
2
4
|
module XML
|
3
5
|
###
|
@@ -195,9 +197,44 @@ module Nokogiri
|
|
195
197
|
#
|
196
198
|
# Note the "foo:object" tag.
|
197
199
|
#
|
200
|
+
# === Namespace inheritance
|
201
|
+
#
|
202
|
+
# In the Builder context, children will inherit their parent's namespace. This is the same
|
203
|
+
# behavior as if the underlying {XML::Document} set +namespace_inheritance+ to +true+:
|
204
|
+
#
|
205
|
+
# result = Nokogiri::XML::Builder.new do |xml|
|
206
|
+
# xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
|
207
|
+
# xml.Header
|
208
|
+
# end
|
209
|
+
# end
|
210
|
+
# result.doc.to_xml
|
211
|
+
# # => <?xml version="1.0" encoding="utf-8"?>
|
212
|
+
# # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
213
|
+
# # <soapenv:Header/>
|
214
|
+
# # </soapenv:Envelope>
|
215
|
+
#
|
216
|
+
# Users may turn this behavior off by passing a keyword argument +namespace_inheritance:false+
|
217
|
+
# to the initializer:
|
218
|
+
#
|
219
|
+
# result = Nokogiri::XML::Builder.new(namespace_inheritance: false) do |xml|
|
220
|
+
# xml["soapenv"].Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/") do
|
221
|
+
# xml.Header
|
222
|
+
# xml["soapenv"].Body # users may explicitly opt into the namespace
|
223
|
+
# end
|
224
|
+
# end
|
225
|
+
# result.doc.to_xml
|
226
|
+
# # => <?xml version="1.0" encoding="utf-8"?>
|
227
|
+
# # <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
228
|
+
# # <Header/>
|
229
|
+
# # <soapenv:Body/>
|
230
|
+
# # </soapenv:Envelope>
|
231
|
+
#
|
232
|
+
# For more information on namespace inheritance, please see {XML::Document#namespace_inheritance}
|
233
|
+
#
|
234
|
+
#
|
198
235
|
# == Document Types
|
199
236
|
#
|
200
|
-
# To create a document type (DTD),
|
237
|
+
# To create a document type (DTD), use the Builder#doc method to get
|
201
238
|
# the current context document. Then call Node#create_internal_subset to
|
202
239
|
# create the DTD node.
|
203
240
|
#
|
@@ -213,7 +250,7 @@ module Nokogiri
|
|
213
250
|
# xml.foo
|
214
251
|
# end
|
215
252
|
# end
|
216
|
-
#
|
253
|
+
#
|
217
254
|
# puts builder.to_xml
|
218
255
|
#
|
219
256
|
# Will output this xml:
|
@@ -225,6 +262,10 @@ module Nokogiri
|
|
225
262
|
# </root>
|
226
263
|
#
|
227
264
|
class Builder
|
265
|
+
include Nokogiri::ClassResolver
|
266
|
+
|
267
|
+
DEFAULT_DOCUMENT_OPTIONS = { namespace_inheritance: true }
|
268
|
+
|
228
269
|
# The current Document object being built
|
229
270
|
attr_accessor :doc
|
230
271
|
|
@@ -244,13 +285,13 @@ module Nokogiri
|
|
244
285
|
#
|
245
286
|
# For example:
|
246
287
|
#
|
247
|
-
# doc = Nokogiri::XML(
|
248
|
-
# Nokogiri::XML::Builder.with(doc.
|
288
|
+
# doc = Nokogiri::XML(File.read('somedoc.xml'))
|
289
|
+
# Nokogiri::XML::Builder.with(doc.at_css('some_tag')) do |xml|
|
249
290
|
# # ... Use normal builder methods here ...
|
250
291
|
# xml.awesome # add the "awesome" tag below "some_tag"
|
251
292
|
# end
|
252
293
|
#
|
253
|
-
def self.with
|
294
|
+
def self.with(root, &block)
|
254
295
|
new({}, root, &block)
|
255
296
|
end
|
256
297
|
|
@@ -263,31 +304,28 @@ module Nokogiri
|
|
263
304
|
# Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
264
305
|
# ...
|
265
306
|
# end
|
266
|
-
def initialize
|
267
|
-
|
307
|
+
def initialize(options = {}, root = nil, &block)
|
268
308
|
if root
|
269
|
-
@doc
|
309
|
+
@doc = root.document
|
270
310
|
@parent = root
|
271
311
|
else
|
272
|
-
|
273
|
-
namespace[-1] = 'Document'
|
274
|
-
@doc = eval(namespace.join('::')).new
|
275
|
-
@parent = @doc
|
312
|
+
@parent = @doc = related_class("Document").new
|
276
313
|
end
|
277
314
|
|
278
|
-
@context
|
279
|
-
@arity
|
280
|
-
@ns
|
315
|
+
@context = nil
|
316
|
+
@arity = nil
|
317
|
+
@ns = nil
|
281
318
|
|
282
|
-
options
|
319
|
+
options = DEFAULT_DOCUMENT_OPTIONS.merge(options)
|
320
|
+
options.each do |k, v|
|
283
321
|
@doc.send(:"#{k}=", v)
|
284
322
|
end
|
285
323
|
|
286
|
-
return unless
|
324
|
+
return unless block
|
287
325
|
|
288
326
|
@arity = block.arity
|
289
327
|
if @arity <= 0
|
290
|
-
@context = eval(
|
328
|
+
@context = eval("self", block.binding)
|
291
329
|
instance_eval(&block)
|
292
330
|
else
|
293
331
|
yield self
|
@@ -298,26 +336,26 @@ module Nokogiri
|
|
298
336
|
|
299
337
|
###
|
300
338
|
# Create a Text Node with content of +string+
|
301
|
-
def text
|
302
|
-
insert
|
339
|
+
def text(string)
|
340
|
+
insert(@doc.create_text_node(string))
|
303
341
|
end
|
304
342
|
|
305
343
|
###
|
306
344
|
# Create a CDATA Node with content of +string+
|
307
|
-
def cdata
|
308
|
-
insert
|
345
|
+
def cdata(string)
|
346
|
+
insert(doc.create_cdata(string))
|
309
347
|
end
|
310
348
|
|
311
349
|
###
|
312
350
|
# Create a Comment Node with content of +string+
|
313
|
-
def comment
|
314
|
-
insert
|
351
|
+
def comment(string)
|
352
|
+
insert(doc.create_comment(string))
|
315
353
|
end
|
316
354
|
|
317
355
|
###
|
318
356
|
# Build a tag that is associated with namespace +ns+. Raises an
|
319
357
|
# ArgumentError if +ns+ has not been defined higher in the tree.
|
320
|
-
def []
|
358
|
+
def [](ns)
|
321
359
|
if @parent != @doc
|
322
360
|
@ns = @parent.namespace_definitions.find { |x| x.prefix == ns.to_s }
|
323
361
|
end
|
@@ -325,12 +363,13 @@ module Nokogiri
|
|
325
363
|
|
326
364
|
@parent.ancestors.each do |a|
|
327
365
|
next if a == doc
|
366
|
+
|
328
367
|
@ns = a.namespace_definitions.find { |x| x.prefix == ns.to_s }
|
329
368
|
return self if @ns
|
330
369
|
end
|
331
370
|
|
332
|
-
@ns = { :
|
333
|
-
|
371
|
+
@ns = { pending: ns.to_s }
|
372
|
+
self
|
334
373
|
end
|
335
374
|
|
336
375
|
###
|
@@ -338,7 +377,7 @@ module Nokogiri
|
|
338
377
|
def to_xml(*args)
|
339
378
|
if Nokogiri.jruby?
|
340
379
|
options = args.first.is_a?(Hash) ? args.shift : {}
|
341
|
-
|
380
|
+
unless options[:save_with]
|
342
381
|
options[:save_with] = Node::SaveOptions::AS_BUILDER
|
343
382
|
end
|
344
383
|
args.insert(0, options)
|
@@ -348,27 +387,28 @@ module Nokogiri
|
|
348
387
|
|
349
388
|
###
|
350
389
|
# Append the given raw XML +string+ to the document
|
351
|
-
def <<
|
390
|
+
def <<(string)
|
352
391
|
@doc.fragment(string).children.each { |x| insert(x) }
|
353
392
|
end
|
354
393
|
|
355
|
-
def method_missing
|
356
|
-
if @context
|
394
|
+
def method_missing(method, *args, &block) # :nodoc:
|
395
|
+
if @context&.respond_to?(method)
|
357
396
|
@context.send(method, *args, &block)
|
358
397
|
else
|
359
|
-
node = @doc.create_element(method.to_s.sub(/[_!]$/,
|
398
|
+
node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) do |n|
|
360
399
|
# Set up the namespace
|
361
|
-
if @ns.is_a?
|
400
|
+
if @ns.is_a?(Nokogiri::XML::Namespace)
|
362
401
|
n.namespace = @ns
|
363
402
|
@ns = nil
|
364
403
|
end
|
365
|
-
|
404
|
+
end
|
366
405
|
|
367
|
-
if @ns.is_a?
|
406
|
+
if @ns.is_a?(Hash)
|
368
407
|
node.namespace = node.namespace_definitions.find { |x| x.prefix == @ns[:pending] }
|
369
408
|
if node.namespace.nil?
|
370
409
|
raise ArgumentError, "Namespace #{@ns[:pending]} has not been defined"
|
371
410
|
end
|
411
|
+
|
372
412
|
@ns = nil
|
373
413
|
end
|
374
414
|
|
@@ -377,35 +417,39 @@ module Nokogiri
|
|
377
417
|
end
|
378
418
|
|
379
419
|
private
|
420
|
+
|
380
421
|
###
|
381
422
|
# Insert +node+ as a child of the current Node
|
382
423
|
def insert(node, &block)
|
383
424
|
node = @parent.add_child(node)
|
384
|
-
if
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
425
|
+
if block
|
426
|
+
begin
|
427
|
+
old_parent = @parent
|
428
|
+
@parent = node
|
429
|
+
@arity ||= block.arity
|
430
|
+
if @arity <= 0
|
431
|
+
instance_eval(&block)
|
432
|
+
else
|
433
|
+
yield(self)
|
434
|
+
end
|
435
|
+
ensure
|
436
|
+
@parent = old_parent
|
392
437
|
end
|
393
|
-
@parent = old_parent
|
394
438
|
end
|
395
439
|
NodeBuilder.new(node, self)
|
396
440
|
end
|
397
441
|
|
398
442
|
class NodeBuilder # :nodoc:
|
399
|
-
def initialize
|
443
|
+
def initialize(node, doc_builder)
|
400
444
|
@node = node
|
401
445
|
@doc_builder = doc_builder
|
402
446
|
end
|
403
447
|
|
404
|
-
def []=
|
448
|
+
def []=(k, v)
|
405
449
|
@node[k] = v
|
406
450
|
end
|
407
451
|
|
408
|
-
def []
|
452
|
+
def [](k)
|
409
453
|
@node[k]
|
410
454
|
end
|
411
455
|
|
@@ -413,22 +457,22 @@ module Nokogiri
|
|
413
457
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
414
458
|
case method.to_s
|
415
459
|
when /^(.*)!$/
|
416
|
-
@node[
|
460
|
+
@node["id"] = Regexp.last_match(1)
|
417
461
|
@node.content = args.first if args.first
|
418
462
|
when /^(.*)=/
|
419
|
-
@node[
|
463
|
+
@node[Regexp.last_match(1)] = args.first
|
420
464
|
else
|
421
|
-
@node[
|
422
|
-
((@node[
|
465
|
+
@node["class"] =
|
466
|
+
((@node["class"] || "").split(/\s/) + [method.to_s]).join(" ")
|
423
467
|
@node.content = args.first if args.first
|
424
468
|
end
|
425
469
|
|
426
470
|
# Assign any extra options
|
427
|
-
opts.each do |k,v|
|
428
|
-
@node[k.to_s] = ((@node[k.to_s] ||
|
471
|
+
opts.each do |k, v|
|
472
|
+
@node[k.to_s] = ((@node[k.to_s] || "").split(/\s/) + [v]).join(" ")
|
429
473
|
end
|
430
474
|
|
431
|
-
if
|
475
|
+
if block
|
432
476
|
old_parent = @doc_builder.parent
|
433
477
|
@doc_builder.parent = @node
|
434
478
|
value = @doc_builder.instance_eval(&block)
|
data/lib/nokogiri/xml/cdata.rb
CHANGED