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.

Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +45 -0
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -89
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -61
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +864 -418
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +165 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +108 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +251 -105
  18. data/ext/nokogiri/nokogiri.h +215 -90
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +17 -17
  21. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  22. data/ext/nokogiri/xml_cdata.c +40 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +401 -240
  25. data/ext/nokogiri/xml_document_fragment.c +13 -17
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +63 -55
  28. data/ext/nokogiri/xml_element_decl.c +31 -31
  29. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +17 -19
  32. data/ext/nokogiri/xml_namespace.c +135 -61
  33. data/ext/nokogiri/xml_node.c +1346 -677
  34. data/ext/nokogiri/xml_node_set.c +246 -216
  35. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  36. data/ext/nokogiri/xml_reader.c +347 -212
  37. data/ext/nokogiri/xml_relax_ng.c +86 -77
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +145 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +64 -36
  41. data/ext/nokogiri/xml_schema.c +138 -81
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +36 -26
  44. data/ext/nokogiri/xml_xpath_context.c +366 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +111 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +630 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +103 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  65. data/gumbo-parser/src/parser.c +4891 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +223 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +66 -0
  88. data/gumbo-parser/src/util.h +34 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +224 -95
  100. data/lib/nokogiri/css.rb +56 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/encoding_handler.rb +57 -0
  103. data/lib/nokogiri/extension.rb +32 -0
  104. data/lib/nokogiri/gumbo.rb +15 -0
  105. data/lib/nokogiri/html.rb +38 -27
  106. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  107. data/lib/nokogiri/html4/document.rb +214 -0
  108. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  109. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  110. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  111. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  112. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  113. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  114. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  115. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  116. data/lib/nokogiri/html4.rb +47 -0
  117. data/lib/nokogiri/html5/document.rb +168 -0
  118. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  119. data/lib/nokogiri/html5/node.rb +103 -0
  120. data/lib/nokogiri/html5.rb +392 -0
  121. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  122. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  123. data/lib/nokogiri/syntax_error.rb +2 -0
  124. data/lib/nokogiri/version/constant.rb +6 -0
  125. data/lib/nokogiri/version/info.rb +223 -0
  126. data/lib/nokogiri/version.rb +3 -108
  127. data/lib/nokogiri/xml/attr.rb +55 -3
  128. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  129. data/lib/nokogiri/xml/builder.rb +98 -54
  130. data/lib/nokogiri/xml/cdata.rb +3 -1
  131. data/lib/nokogiri/xml/character_data.rb +2 -0
  132. data/lib/nokogiri/xml/document.rb +312 -126
  133. data/lib/nokogiri/xml/document_fragment.rb +93 -48
  134. data/lib/nokogiri/xml/dtd.rb +4 -2
  135. data/lib/nokogiri/xml/element_content.rb +12 -2
  136. data/lib/nokogiri/xml/element_decl.rb +6 -2
  137. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  138. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  139. data/lib/nokogiri/xml/namespace.rb +45 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1088 -418
  142. data/lib/nokogiri/xml/node_set.rb +173 -63
  143. data/lib/nokogiri/xml/notation.rb +13 -0
  144. data/lib/nokogiri/xml/parse_options.rb +145 -52
  145. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  146. data/lib/nokogiri/xml/pp/node.rb +42 -30
  147. data/lib/nokogiri/xml/pp.rb +4 -2
  148. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  149. data/lib/nokogiri/xml/reader.rb +21 -28
  150. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  151. data/lib/nokogiri/xml/sax/document.rb +45 -49
  152. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  153. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  154. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  155. data/lib/nokogiri/xml/sax.rb +6 -4
  156. data/lib/nokogiri/xml/schema.rb +19 -9
  157. data/lib/nokogiri/xml/searchable.rb +120 -72
  158. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  159. data/lib/nokogiri/xml/text.rb +2 -0
  160. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  161. data/lib/nokogiri/xml/xpath.rb +15 -4
  162. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  163. data/lib/nokogiri/xml.rb +38 -37
  164. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  165. data/lib/nokogiri/xslt.rb +101 -22
  166. data/lib/nokogiri.rb +59 -75
  167. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  168. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  169. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  170. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  171. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  172. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  173. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  174. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  175. data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
  177. metadata +128 -265
  178. data/ext/nokogiri/html_document.c +0 -170
  179. data/ext/nokogiri/html_document.h +0 -10
  180. data/ext/nokogiri/html_element_description.c +0 -279
  181. data/ext/nokogiri/html_element_description.h +0 -10
  182. data/ext/nokogiri/html_entity_lookup.c +0 -32
  183. data/ext/nokogiri/html_entity_lookup.h +0 -8
  184. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  185. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  186. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  187. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  188. data/ext/nokogiri/xml_attr.h +0 -9
  189. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  190. data/ext/nokogiri/xml_cdata.h +0 -9
  191. data/ext/nokogiri/xml_comment.h +0 -9
  192. data/ext/nokogiri/xml_document.h +0 -23
  193. data/ext/nokogiri/xml_document_fragment.h +0 -10
  194. data/ext/nokogiri/xml_dtd.h +0 -10
  195. data/ext/nokogiri/xml_element_content.h +0 -10
  196. data/ext/nokogiri/xml_element_decl.h +0 -9
  197. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  198. data/ext/nokogiri/xml_entity_decl.h +0 -10
  199. data/ext/nokogiri/xml_entity_reference.h +0 -9
  200. data/ext/nokogiri/xml_io.c +0 -61
  201. data/ext/nokogiri/xml_io.h +0 -11
  202. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  203. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  204. data/ext/nokogiri/xml_namespace.h +0 -14
  205. data/ext/nokogiri/xml_node.h +0 -13
  206. data/ext/nokogiri/xml_node_set.h +0 -12
  207. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  208. data/ext/nokogiri/xml_reader.h +0 -10
  209. data/ext/nokogiri/xml_relax_ng.h +0 -9
  210. data/ext/nokogiri/xml_sax_parser.h +0 -39
  211. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  212. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  213. data/ext/nokogiri/xml_schema.h +0 -9
  214. data/ext/nokogiri/xml_syntax_error.h +0 -13
  215. data/ext/nokogiri/xml_text.h +0 -9
  216. data/ext/nokogiri/xml_xpath_context.h +0 -10
  217. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  218. data/lib/nokogiri/html/document.rb +0 -335
  219. data/lib/nokogiri/html/document_fragment.rb +0 -49
  220. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  221. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  222. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  223. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  224. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  225. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  226. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
@@ -1,109 +1,4 @@
1
- module Nokogiri
2
- # The version of Nokogiri you are using
3
- VERSION = '1.9.1'
1
+ # frozen_string_literal: true
4
2
 
5
- class VersionInfo # :nodoc:
6
- def jruby?
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"
@@ -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
- alias :value :content
5
- alias :to_s :content
6
- alias :content= :value=
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
- def inspect
14
- "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{to_s.inspect}>"
15
+ private
16
+
17
+ def inspect_attributes
18
+ [:to_s]
15
19
  end
16
20
  end
17
21
  end
@@ -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), access use the Builder#doc method to get
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(open('somedoc.xml'))
248
- # Nokogiri::XML::Builder.with(doc.at('some_tag')) do |xml|
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 root, &block
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 options = {}, root = nil, &block
267
-
307
+ def initialize(options = {}, root = nil, &block)
268
308
  if root
269
- @doc = root.document
309
+ @doc = root.document
270
310
  @parent = root
271
311
  else
272
- namespace = self.class.name.split('::')
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 = nil
279
- @arity = nil
280
- @ns = nil
315
+ @context = nil
316
+ @arity = nil
317
+ @ns = nil
281
318
 
282
- options.each do |k,v|
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 block_given?
324
+ return unless block
287
325
 
288
326
  @arity = block.arity
289
327
  if @arity <= 0
290
- @context = eval('self', block.binding)
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 string
302
- insert @doc.create_text_node(string)
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 string
308
- insert doc.create_cdata(string)
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 string
314
- insert doc.create_comment(string)
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 [] ns
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 = { :pending => ns.to_s }
333
- return self
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
- if !options[:save_with]
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 << string
390
+ def <<(string)
352
391
  @doc.fragment(string).children.each { |x| insert(x) }
353
392
  end
354
393
 
355
- def method_missing method, *args, &block # :nodoc:
356
- if @context && @context.respond_to?(method)
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(/[_!]$/, ''),*args) { |n|
398
+ node = @doc.create_element(method.to_s.sub(/[_!]$/, ""), *args) do |n|
360
399
  # Set up the namespace
361
- if @ns.is_a? Nokogiri::XML::Namespace
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? Hash
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 block_given?
385
- old_parent = @parent
386
- @parent = node
387
- @arity ||= block.arity
388
- if @arity <= 0
389
- instance_eval(&block)
390
- else
391
- block.call(self)
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 node, doc_builder
443
+ def initialize(node, doc_builder)
400
444
  @node = node
401
445
  @doc_builder = doc_builder
402
446
  end
403
447
 
404
- def []= k, v
448
+ def []=(k, v)
405
449
  @node[k] = v
406
450
  end
407
451
 
408
- def [] k
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['id'] = $1
460
+ @node["id"] = Regexp.last_match(1)
417
461
  @node.content = args.first if args.first
418
462
  when /^(.*)=/
419
- @node[$1] = args.first
463
+ @node[Regexp.last_match(1)] = args.first
420
464
  else
421
- @node['class'] =
422
- ((@node['class'] || '').split(/\s/) + [method.to_s]).join(' ')
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] || '').split(/\s/) + [v]).join(' ')
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 block_given?
475
+ if block
432
476
  old_parent = @doc_builder.parent
433
477
  @doc_builder.parent = @node
434
478
  value = @doc_builder.instance_eval(&block)
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class CDATA < Nokogiri::XML::Text
4
6
  ###
5
7
  # Get the name of this CDATA node
6
8
  def name
7
- '#cdata-section'
9
+ "#cdata-section"
8
10
  end
9
11
  end
10
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class CharacterData < Nokogiri::XML::Node