nokogiri 1.10.10 → 1.14.3-aarch64-linux

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 (251) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +44 -0
  3. data/LICENSE-DEPENDENCIES.md +1632 -1022
  4. data/LICENSE.md +1 -1
  5. data/README.md +185 -96
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -66
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +819 -421
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +114 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/include/libexslt/exslt.h +108 -0
  17. data/ext/nokogiri/include/libexslt/exsltconfig.h +70 -0
  18. data/ext/nokogiri/include/libexslt/exsltexports.h +63 -0
  19. data/ext/nokogiri/include/libxml2/libxml/HTMLparser.h +306 -0
  20. data/ext/nokogiri/include/libxml2/libxml/HTMLtree.h +147 -0
  21. data/ext/nokogiri/include/libxml2/libxml/SAX.h +204 -0
  22. data/ext/nokogiri/include/libxml2/libxml/SAX2.h +172 -0
  23. data/ext/nokogiri/include/libxml2/libxml/c14n.h +128 -0
  24. data/ext/nokogiri/include/libxml2/libxml/catalog.h +182 -0
  25. data/ext/nokogiri/include/libxml2/libxml/chvalid.h +230 -0
  26. data/ext/nokogiri/include/libxml2/libxml/debugXML.h +217 -0
  27. data/ext/nokogiri/include/libxml2/libxml/dict.h +81 -0
  28. data/ext/nokogiri/include/libxml2/libxml/encoding.h +232 -0
  29. data/ext/nokogiri/include/libxml2/libxml/entities.h +153 -0
  30. data/ext/nokogiri/include/libxml2/libxml/globals.h +499 -0
  31. data/ext/nokogiri/include/libxml2/libxml/hash.h +236 -0
  32. data/ext/nokogiri/include/libxml2/libxml/list.h +137 -0
  33. data/ext/nokogiri/include/libxml2/libxml/nanoftp.h +186 -0
  34. data/ext/nokogiri/include/libxml2/libxml/nanohttp.h +81 -0
  35. data/ext/nokogiri/include/libxml2/libxml/parser.h +1244 -0
  36. data/ext/nokogiri/include/libxml2/libxml/parserInternals.h +656 -0
  37. data/ext/nokogiri/include/libxml2/libxml/pattern.h +100 -0
  38. data/ext/nokogiri/include/libxml2/libxml/relaxng.h +218 -0
  39. data/ext/nokogiri/include/libxml2/libxml/schemasInternals.h +958 -0
  40. data/ext/nokogiri/include/libxml2/libxml/schematron.h +142 -0
  41. data/ext/nokogiri/include/libxml2/libxml/threads.h +91 -0
  42. data/ext/nokogiri/include/libxml2/libxml/tree.h +1312 -0
  43. data/ext/nokogiri/include/libxml2/libxml/uri.h +94 -0
  44. data/ext/nokogiri/include/libxml2/libxml/valid.h +463 -0
  45. data/ext/nokogiri/include/libxml2/libxml/xinclude.h +129 -0
  46. data/ext/nokogiri/include/libxml2/libxml/xlink.h +189 -0
  47. data/ext/nokogiri/include/libxml2/libxml/xmlIO.h +368 -0
  48. data/ext/nokogiri/include/libxml2/libxml/xmlautomata.h +146 -0
  49. data/ext/nokogiri/include/libxml2/libxml/xmlerror.h +947 -0
  50. data/ext/nokogiri/include/libxml2/libxml/xmlexports.h +77 -0
  51. data/ext/nokogiri/include/libxml2/libxml/xmlmemory.h +226 -0
  52. data/ext/nokogiri/include/libxml2/libxml/xmlmodule.h +57 -0
  53. data/ext/nokogiri/include/libxml2/libxml/xmlreader.h +428 -0
  54. data/ext/nokogiri/include/libxml2/libxml/xmlregexp.h +222 -0
  55. data/ext/nokogiri/include/libxml2/libxml/xmlsave.h +88 -0
  56. data/ext/nokogiri/include/libxml2/libxml/xmlschemas.h +246 -0
  57. data/ext/nokogiri/include/libxml2/libxml/xmlschemastypes.h +152 -0
  58. data/ext/nokogiri/include/libxml2/libxml/xmlstring.h +140 -0
  59. data/ext/nokogiri/include/libxml2/libxml/xmlunicode.h +202 -0
  60. data/ext/nokogiri/include/libxml2/libxml/xmlversion.h +503 -0
  61. data/ext/nokogiri/include/libxml2/libxml/xmlwriter.h +488 -0
  62. data/ext/nokogiri/include/libxml2/libxml/xpath.h +575 -0
  63. data/ext/nokogiri/include/libxml2/libxml/xpathInternals.h +632 -0
  64. data/ext/nokogiri/include/libxml2/libxml/xpointer.h +137 -0
  65. data/ext/nokogiri/include/libxslt/attributes.h +38 -0
  66. data/ext/nokogiri/include/libxslt/documents.h +93 -0
  67. data/ext/nokogiri/include/libxslt/extensions.h +262 -0
  68. data/ext/nokogiri/include/libxslt/extra.h +72 -0
  69. data/ext/nokogiri/include/libxslt/functions.h +78 -0
  70. data/ext/nokogiri/include/libxslt/imports.h +75 -0
  71. data/ext/nokogiri/include/libxslt/keys.h +53 -0
  72. data/ext/nokogiri/include/libxslt/namespaces.h +68 -0
  73. data/ext/nokogiri/include/libxslt/numbersInternals.h +73 -0
  74. data/ext/nokogiri/include/libxslt/pattern.h +84 -0
  75. data/ext/nokogiri/include/libxslt/preproc.h +43 -0
  76. data/ext/nokogiri/include/libxslt/security.h +104 -0
  77. data/ext/nokogiri/include/libxslt/templates.h +77 -0
  78. data/ext/nokogiri/include/libxslt/transform.h +207 -0
  79. data/ext/nokogiri/include/libxslt/variables.h +118 -0
  80. data/ext/nokogiri/include/libxslt/xslt.h +110 -0
  81. data/ext/nokogiri/include/libxslt/xsltInternals.h +1982 -0
  82. data/ext/nokogiri/include/libxslt/xsltconfig.h +179 -0
  83. data/ext/nokogiri/include/libxslt/xsltexports.h +64 -0
  84. data/ext/nokogiri/include/libxslt/xsltlocale.h +76 -0
  85. data/ext/nokogiri/include/libxslt/xsltutils.h +310 -0
  86. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  87. data/ext/nokogiri/nokogiri.c +228 -104
  88. data/ext/nokogiri/nokogiri.h +204 -90
  89. data/ext/nokogiri/test_global_handlers.c +40 -0
  90. data/ext/nokogiri/xml_attr.c +17 -17
  91. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  92. data/ext/nokogiri/xml_cdata.c +15 -20
  93. data/ext/nokogiri/xml_comment.c +19 -26
  94. data/ext/nokogiri/xml_document.c +306 -225
  95. data/ext/nokogiri/xml_document_fragment.c +12 -16
  96. data/ext/nokogiri/xml_dtd.c +64 -58
  97. data/ext/nokogiri/xml_element_content.c +33 -28
  98. data/ext/nokogiri/xml_element_decl.c +26 -26
  99. data/ext/nokogiri/xml_encoding_handler.c +45 -20
  100. data/ext/nokogiri/xml_entity_decl.c +37 -35
  101. data/ext/nokogiri/xml_entity_reference.c +16 -18
  102. data/ext/nokogiri/xml_namespace.c +136 -61
  103. data/ext/nokogiri/xml_node.c +1344 -672
  104. data/ext/nokogiri/xml_node_set.c +178 -168
  105. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  106. data/ext/nokogiri/xml_reader.c +316 -190
  107. data/ext/nokogiri/xml_relax_ng.c +52 -30
  108. data/ext/nokogiri/xml_sax_parser.c +130 -124
  109. data/ext/nokogiri/xml_sax_parser_context.c +110 -89
  110. data/ext/nokogiri/xml_sax_push_parser.c +36 -29
  111. data/ext/nokogiri/xml_schema.c +98 -50
  112. data/ext/nokogiri/xml_syntax_error.c +42 -21
  113. data/ext/nokogiri/xml_text.c +14 -18
  114. data/ext/nokogiri/xml_xpath_context.c +263 -148
  115. data/ext/nokogiri/xslt_stylesheet.c +271 -178
  116. data/gumbo-parser/CHANGES.md +63 -0
  117. data/gumbo-parser/Makefile +111 -0
  118. data/gumbo-parser/THANKS +27 -0
  119. data/lib/nokogiri/2.7/nokogiri.so +0 -0
  120. data/lib/nokogiri/3.0/nokogiri.so +0 -0
  121. data/lib/nokogiri/3.1/nokogiri.so +0 -0
  122. data/lib/nokogiri/3.2/nokogiri.so +0 -0
  123. data/lib/nokogiri/class_resolver.rb +67 -0
  124. data/lib/nokogiri/css/node.rb +10 -8
  125. data/lib/nokogiri/css/parser.rb +397 -377
  126. data/lib/nokogiri/css/parser.y +250 -245
  127. data/lib/nokogiri/css/parser_extras.rb +54 -49
  128. data/lib/nokogiri/css/syntax_error.rb +3 -1
  129. data/lib/nokogiri/css/tokenizer.rb +5 -3
  130. data/lib/nokogiri/css/tokenizer.rex +3 -2
  131. data/lib/nokogiri/css/xpath_visitor.rb +223 -94
  132. data/lib/nokogiri/css.rb +56 -17
  133. data/lib/nokogiri/decorators/slop.rb +9 -7
  134. data/lib/nokogiri/encoding_handler.rb +57 -0
  135. data/lib/nokogiri/extension.rb +32 -0
  136. data/lib/nokogiri/gumbo.rb +15 -0
  137. data/lib/nokogiri/html.rb +38 -27
  138. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  139. data/lib/nokogiri/html4/document.rb +214 -0
  140. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  141. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  142. data/lib/nokogiri/html4/element_description_defaults.rb +572 -0
  143. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  144. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  145. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  146. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  147. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  148. data/lib/nokogiri/html4.rb +47 -0
  149. data/lib/nokogiri/html5/document.rb +168 -0
  150. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  151. data/lib/nokogiri/html5/node.rb +98 -0
  152. data/lib/nokogiri/html5.rb +389 -0
  153. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  154. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  155. data/lib/nokogiri/syntax_error.rb +2 -0
  156. data/lib/nokogiri/version/constant.rb +6 -0
  157. data/lib/nokogiri/version/info.rb +223 -0
  158. data/lib/nokogiri/version.rb +3 -108
  159. data/lib/nokogiri/xml/attr.rb +55 -3
  160. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  161. data/lib/nokogiri/xml/builder.rb +75 -34
  162. data/lib/nokogiri/xml/cdata.rb +3 -1
  163. data/lib/nokogiri/xml/character_data.rb +2 -0
  164. data/lib/nokogiri/xml/document.rb +312 -126
  165. data/lib/nokogiri/xml/document_fragment.rb +93 -48
  166. data/lib/nokogiri/xml/dtd.rb +4 -2
  167. data/lib/nokogiri/xml/element_content.rb +2 -0
  168. data/lib/nokogiri/xml/element_decl.rb +3 -1
  169. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  170. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  171. data/lib/nokogiri/xml/namespace.rb +45 -0
  172. data/lib/nokogiri/xml/node/save_options.rb +15 -8
  173. data/lib/nokogiri/xml/node.rb +1067 -406
  174. data/lib/nokogiri/xml/node_set.rb +135 -59
  175. data/lib/nokogiri/xml/notation.rb +13 -0
  176. data/lib/nokogiri/xml/parse_options.rb +145 -52
  177. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  178. data/lib/nokogiri/xml/pp/node.rb +27 -26
  179. data/lib/nokogiri/xml/pp.rb +4 -2
  180. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  181. data/lib/nokogiri/xml/reader.rb +21 -28
  182. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  183. data/lib/nokogiri/xml/sax/document.rb +45 -49
  184. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  185. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  186. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  187. data/lib/nokogiri/xml/sax.rb +6 -4
  188. data/lib/nokogiri/xml/schema.rb +19 -9
  189. data/lib/nokogiri/xml/searchable.rb +112 -72
  190. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  191. data/lib/nokogiri/xml/text.rb +2 -0
  192. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  193. data/lib/nokogiri/xml/xpath.rb +15 -4
  194. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  195. data/lib/nokogiri/xml.rb +38 -37
  196. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  197. data/lib/nokogiri/xslt.rb +29 -20
  198. data/lib/nokogiri.rb +48 -72
  199. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  200. metadata +146 -307
  201. data/ext/nokogiri/html_document.c +0 -170
  202. data/ext/nokogiri/html_document.h +0 -10
  203. data/ext/nokogiri/html_element_description.c +0 -279
  204. data/ext/nokogiri/html_element_description.h +0 -10
  205. data/ext/nokogiri/html_entity_lookup.c +0 -32
  206. data/ext/nokogiri/html_entity_lookup.h +0 -8
  207. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  208. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  209. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  210. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  211. data/ext/nokogiri/xml_attr.h +0 -9
  212. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  213. data/ext/nokogiri/xml_cdata.h +0 -9
  214. data/ext/nokogiri/xml_comment.h +0 -9
  215. data/ext/nokogiri/xml_document.h +0 -23
  216. data/ext/nokogiri/xml_document_fragment.h +0 -10
  217. data/ext/nokogiri/xml_dtd.h +0 -10
  218. data/ext/nokogiri/xml_element_content.h +0 -10
  219. data/ext/nokogiri/xml_element_decl.h +0 -9
  220. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  221. data/ext/nokogiri/xml_entity_decl.h +0 -10
  222. data/ext/nokogiri/xml_entity_reference.h +0 -9
  223. data/ext/nokogiri/xml_io.c +0 -61
  224. data/ext/nokogiri/xml_io.h +0 -11
  225. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  226. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  227. data/ext/nokogiri/xml_namespace.h +0 -14
  228. data/ext/nokogiri/xml_node.h +0 -13
  229. data/ext/nokogiri/xml_node_set.h +0 -12
  230. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  231. data/ext/nokogiri/xml_reader.h +0 -10
  232. data/ext/nokogiri/xml_relax_ng.h +0 -9
  233. data/ext/nokogiri/xml_sax_parser.h +0 -39
  234. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  235. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  236. data/ext/nokogiri/xml_schema.h +0 -9
  237. data/ext/nokogiri/xml_syntax_error.h +0 -13
  238. data/ext/nokogiri/xml_text.h +0 -9
  239. data/ext/nokogiri/xml_xpath_context.h +0 -10
  240. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  241. data/lib/nokogiri/html/document.rb +0 -335
  242. data/lib/nokogiri/html/document_fragment.rb +0 -49
  243. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  244. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  245. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  246. data/patches/libxml2/0002-Remove-script-macro-support.patch +0 -40
  247. data/patches/libxml2/0003-Update-entities-to-remove-handling-of-ssi.patch +0 -44
  248. data/patches/libxml2/0004-libxml2.la-is-in-top_builddir.patch +0 -25
  249. data/patches/libxml2/0005-Fix-infinite-loop-in-xmlStringLenDecodeEntities.patch +0 -32
  250. data/ports/archives/libxml2-2.9.10.tar.gz +0 -0
  251. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class << self
4
6
  ###
5
7
  # Create a new Nokogiri::XML::Schema object using a +string_or_io+
6
8
  # object.
7
- def Schema string_or_io
8
- Schema.new(string_or_io)
9
+ def Schema(string_or_io, options = ParseOptions::DEFAULT_SCHEMA)
10
+ Schema.new(string_or_io, options)
9
11
  end
10
12
  end
11
13
 
@@ -26,15 +28,23 @@ module Nokogiri
26
28
  # end
27
29
  #
28
30
  # The list of errors are Nokogiri::XML::SyntaxError objects.
31
+ #
32
+ # NOTE: As of v1.11.0, Schema treats inputs as UNTRUSTED by default, and so external entities
33
+ # are not resolved from the network (`http://` or `ftp://`). Previously, parsing treated
34
+ # documents as "trusted" by default which was counter to Nokogiri's "untrusted by default"
35
+ # security policy. If a document is trusted, then the caller may turn off the NONET option via
36
+ # the ParseOptions to re-enable external entity resolution over a network connection.
29
37
  class Schema
30
38
  # Errors while parsing the schema file
31
39
  attr_accessor :errors
40
+ # The Nokogiri::XML::ParseOptions used to parse the schema
41
+ attr_accessor :parse_options
32
42
 
33
43
  ###
34
44
  # Create a new Nokogiri::XML::Schema object using a +string_or_io+
35
45
  # object.
36
- def self.new string_or_io
37
- from_document Nokogiri::XML(string_or_io)
46
+ def self.new(string_or_io, options = ParseOptions::DEFAULT_SCHEMA)
47
+ from_document(Nokogiri::XML(string_or_io), options)
38
48
  end
39
49
 
40
50
  ###
@@ -42,9 +52,9 @@ module Nokogiri
42
52
  # Nokogiri::XML::Document object, or a filename. An Array of
43
53
  # Nokogiri::XML::SyntaxError objects found while validating the
44
54
  # +thing+ is returned.
45
- def validate thing
46
- if thing.is_a?(Nokogiri::XML::Document)
47
- validate_document(thing)
55
+ def validate(thing)
56
+ if thing.is_a?(Nokogiri::XML::Document)
57
+ validate_document(thing)
48
58
  elsif File.file?(thing)
49
59
  validate_file(thing)
50
60
  else
@@ -55,8 +65,8 @@ module Nokogiri
55
65
  ###
56
66
  # Returns true if +thing+ is a valid Nokogiri::XML::Document or
57
67
  # file.
58
- def valid? thing
59
- validate(thing).length == 0
68
+ def valid?(thing)
69
+ validate(thing).empty?
60
70
  end
61
71
  end
62
72
  end
@@ -1,19 +1,25 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  module Nokogiri
2
5
  module XML
3
6
  #
4
7
  # The Searchable module declares the interface used for searching your DOM.
5
8
  #
6
- # It implements the public methods `search`, `css`, and `xpath`,
9
+ # It implements the public methods #search, #css, and #xpath,
7
10
  # as well as allowing specific implementations to specialize some
8
11
  # of the important behaviors.
9
12
  #
10
13
  module Searchable
11
14
  # Regular expression used by Searchable#search to determine if a query
12
15
  # string is CSS or XPath
13
- LOOKS_LIKE_XPATH = /^(\.\/|\/|\.\.|\.$)/
14
-
16
+ LOOKS_LIKE_XPATH = %r{^(\./|/|\.\.|\.$)}
17
+
18
+ # :section: Searching via XPath or CSS Queries
19
+
15
20
  ###
16
- # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
21
+ # call-seq:
22
+ # search(*paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class])
17
23
  #
18
24
  # Search this object for +paths+. +paths+ must be one or more XPath or CSS queries:
19
25
  #
@@ -24,52 +30,53 @@ module Nokogiri
24
30
  # node.search('.//bike:tire', {'bike' => 'http://schwinn.com/'})
25
31
  # node.search('bike|tire', {'bike' => 'http://schwinn.com/'})
26
32
  #
27
- # For XPath queries, a hash of variable bindings may also be
28
- # appended to the namespace bindings. For example:
33
+ # For XPath queries, a hash of variable bindings may also be appended to the namespace
34
+ # bindings. For example:
29
35
  #
30
36
  # node.search('.//address[@domestic=$value]', nil, {:value => 'Yes'})
31
37
  #
32
- # Custom XPath functions and CSS pseudo-selectors may also be
33
- # defined. To define custom functions create a class and
34
- # implement the function you want to define. The first argument
35
- # to the method will be the current matching NodeSet. Any other
36
- # arguments are ones that you pass in. Note that this class may
37
- # appear anywhere in the argument list. For example:
38
- #
39
- # node.search('.//title[regex(., "\w+")]', 'div.employee:regex("[0-9]+")'
40
- # Class.new {
41
- # def regex node_set, regex
42
- # node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
43
- # end
44
- # }.new
45
- # )
38
+ # 💡 Custom XPath functions and CSS pseudo-selectors may also be defined. To define custom
39
+ # functions create a class and implement the function you want to define. The first argument
40
+ # to the method will be the current matching NodeSet. Any other arguments are ones that you
41
+ # pass in. Note that this class may appear anywhere in the argument list. For example:
42
+ #
43
+ # handler = Class.new {
44
+ # def regex node_set, regex
45
+ # node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
46
+ # end
47
+ # }.new
48
+ # node.search('.//title[regex(., "\w+")]', 'div.employee:regex("[0-9]+")', handler)
46
49
  #
47
50
  # See Searchable#xpath and Searchable#css for further usage help.
48
- def search *args
51
+ def search(*args)
49
52
  paths, handler, ns, binds = extract_params(args)
50
53
 
51
54
  xpaths = paths.map(&:to_s).map do |path|
52
- (path =~ LOOKS_LIKE_XPATH) ? path : xpath_query_from_css_rule(path, ns)
55
+ LOOKS_LIKE_XPATH.match?(path) ? path : xpath_query_from_css_rule(path, ns)
53
56
  end.flatten.uniq
54
57
 
55
58
  xpath(*(xpaths + [ns, handler, binds].compact))
56
59
  end
57
- alias :/ :search
60
+
61
+ alias_method :/, :search
58
62
 
59
63
  ###
60
- # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
64
+ # call-seq:
65
+ # at(*paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class])
61
66
  #
62
67
  # Search this object for +paths+, and return only the first
63
68
  # result. +paths+ must be one or more XPath or CSS queries.
64
69
  #
65
70
  # See Searchable#search for more information.
66
- def at *args
71
+ def at(*args)
67
72
  search(*args).first
68
73
  end
69
- alias :% :at
74
+
75
+ alias_method :%, :at
70
76
 
71
77
  ###
72
- # call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
78
+ # call-seq:
79
+ # css(*rules, [namespace-bindings, custom-pseudo-class])
73
80
  #
74
81
  # Search this object for CSS +rules+. +rules+ must be one or more CSS
75
82
  # selectors. For example:
@@ -82,44 +89,61 @@ module Nokogiri
82
89
  #
83
90
  # node.css('bike|tire', {'bike' => 'http://schwinn.com/'})
84
91
  #
85
- # Custom CSS pseudo classes may also be defined. To define
86
- # custom pseudo classes, create a class and implement the custom
87
- # pseudo class you want defined. The first argument to the
88
- # method will be the current matching NodeSet. Any other
89
- # arguments are ones that you pass in. For example:
92
+ # 💡 Custom CSS pseudo classes may also be defined which are mapped to a custom XPath
93
+ # function. To define custom pseudo classes, create a class and implement the custom pseudo
94
+ # class you want defined. The first argument to the method will be the matching context
95
+ # NodeSet. Any other arguments are ones that you pass in. For example:
90
96
  #
91
- # node.css('title:regex("\w+")', Class.new {
92
- # def regex node_set, regex
97
+ # handler = Class.new {
98
+ # def regex(node_set, regex)
93
99
  # node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
94
100
  # end
95
- # }.new)
101
+ # }.new
102
+ # node.css('title:regex("\w+")', handler)
103
+ #
104
+ # 💡 Some XPath syntax is supported in CSS queries. For example, to query for an attribute:
96
105
  #
97
- # Note that the CSS query string is case-sensitive with regards
98
- # to your document type. That is, if you're looking for "H1" in
99
- # an HTML document, you'll never find anything, since HTML tags
100
- # will match only lowercase CSS queries. However, "H1" might be
101
- # found in an XML document, where tags names are case-sensitive
102
- # (e.g., "H1" is distinct from "h1").
106
+ # node.css('img > @href') # returns all +href+ attributes on an +img+ element
107
+ # node.css('img / @href') # same
103
108
  #
104
- def css *args
109
+ # # this returns +class+ attributes from all +div+ elements AND THEIR CHILDREN!
110
+ # node.css('div @class')
111
+ #
112
+ # node.css
113
+ #
114
+ # 💡 Array-like syntax is supported in CSS queries as an alternative to using +:nth-child()+.
115
+ #
116
+ # ⚠ NOTE that indices are 1-based like +:nth-child+ and not 0-based like Ruby Arrays. For
117
+ # example:
118
+ #
119
+ # # equivalent to 'li:nth-child(2)'
120
+ # node.css('li[2]') # retrieve the second li element in a list
121
+ #
122
+ # ⚠ NOTE that the CSS query string is case-sensitive with regards to your document type. HTML
123
+ # tags will match only lowercase CSS queries, so if you search for "H1" in an HTML document,
124
+ # you'll never find anything. However, "H1" might be found in an XML document, where tags
125
+ # names are case-sensitive (e.g., "H1" is distinct from "h1").
126
+ def css(*args)
105
127
  rules, handler, ns, _ = extract_params(args)
106
128
 
107
- css_internal self, rules, handler, ns
129
+ css_internal(self, rules, handler, ns)
108
130
  end
109
131
 
110
132
  ##
111
- # call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
133
+ # call-seq:
134
+ # at_css(*rules, [namespace-bindings, custom-pseudo-class])
112
135
  #
113
136
  # Search this object for CSS +rules+, and return only the first
114
137
  # match. +rules+ must be one or more CSS selectors.
115
138
  #
116
139
  # See Searchable#css for more information.
117
- def at_css *args
140
+ def at_css(*args)
118
141
  css(*args).first
119
142
  end
120
143
 
121
144
  ###
122
- # call-seq: xpath *paths, [namespace-bindings, variable-bindings, custom-handler-class]
145
+ # call-seq:
146
+ # xpath(*paths, [namespace-bindings, variable-bindings, custom-handler-class])
123
147
  #
124
148
  # Search this node for XPath +paths+. +paths+ must be one or more XPath
125
149
  # queries.
@@ -135,43 +159,54 @@ module Nokogiri
135
159
  #
136
160
  # node.xpath('.//address[@domestic=$value]', nil, {:value => 'Yes'})
137
161
  #
138
- # Custom XPath functions may also be defined. To define custom
139
- # functions create a class and implement the function you want
140
- # to define. The first argument to the method will be the
141
- # current matching NodeSet. Any other arguments are ones that
142
- # you pass in. Note that this class may appear anywhere in the
143
- # argument list. For example:
162
+ # 💡 Custom XPath functions may also be defined. To define custom functions create a class and
163
+ # implement the function you want to define. The first argument to the method will be the
164
+ # current matching NodeSet. Any other arguments are ones that you pass in. Note that this
165
+ # class may appear anywhere in the argument list. For example:
144
166
  #
145
- # node.xpath('.//title[regex(., "\w+")]', Class.new {
146
- # def regex node_set, regex
167
+ # handler = Class.new {
168
+ # def regex(node_set, regex)
147
169
  # node_set.find_all { |node| node['some_attribute'] =~ /#{regex}/ }
148
170
  # end
149
- # }.new)
171
+ # }.new
172
+ # node.xpath('.//title[regex(., "\w+")]', handler)
150
173
  #
151
- def xpath *args
174
+ def xpath(*args)
152
175
  paths, handler, ns, binds = extract_params(args)
153
176
 
154
- xpath_internal self, paths, handler, ns, binds
177
+ xpath_internal(self, paths, handler, ns, binds)
155
178
  end
156
179
 
157
180
  ##
158
- # call-seq: xpath *paths, [namespace-bindings, variable-bindings, custom-handler-class]
181
+ # call-seq:
182
+ # at_xpath(*paths, [namespace-bindings, variable-bindings, custom-handler-class])
159
183
  #
160
184
  # Search this node for XPath +paths+, and return only the first
161
185
  # match. +paths+ must be one or more XPath queries.
162
186
  #
163
187
  # See Searchable#xpath for more information.
164
- def at_xpath *args
188
+ def at_xpath(*args)
165
189
  xpath(*args).first
166
190
  end
167
191
 
192
+ # :call-seq:
193
+ # >(selector) → NodeSet
194
+ #
195
+ # Search this node's immediate children using CSS selector +selector+
196
+ def >(selector) # rubocop:disable Naming/BinaryOperatorParameterName
197
+ ns = (document.root&.namespaces || {})
198
+ xpath(CSS.xpath_for(selector, prefix: "./", ns: ns).first)
199
+ end
200
+
201
+ # :section:
202
+
168
203
  private
169
204
 
170
- def css_internal node, rules, handler, ns
171
- xpath_internal node, css_rules_to_xpath(rules, ns), handler, ns, nil
205
+ def css_internal(node, rules, handler, ns)
206
+ xpath_internal(node, css_rules_to_xpath(rules, ns), handler, ns, nil)
172
207
  end
173
208
 
174
- def xpath_internal node, paths, handler, ns, binds
209
+ def xpath_internal(node, paths, handler, ns, binds)
175
210
  document = node.document
176
211
  return NodeSet.new(document) unless document
177
212
 
@@ -186,14 +221,14 @@ module Nokogiri
186
221
  end
187
222
  end
188
223
 
189
- def xpath_impl node, path, handler, ns, binds
224
+ def xpath_impl(node, path, handler, ns, binds)
190
225
  ctx = XPathContext.new(node)
191
226
  ctx.register_namespaces(ns)
192
- path = path.gsub(/xmlns:/, ' :') unless Nokogiri.uses_libxml?
227
+ path = path.gsub(/xmlns:/, " :") unless Nokogiri.uses_libxml?
193
228
 
194
- binds.each do |key,value|
195
- ctx.register_variable key.to_s, value
196
- end if binds
229
+ binds&.each do |key, value|
230
+ ctx.register_variable(key.to_s, value)
231
+ end
197
232
 
198
233
  ctx.evaluate(path, handler)
199
234
  end
@@ -202,13 +237,18 @@ module Nokogiri
202
237
  rules.map { |rule| xpath_query_from_css_rule(rule, ns) }
203
238
  end
204
239
 
205
- def xpath_query_from_css_rule rule, ns
240
+ def xpath_query_from_css_rule(rule, ns)
241
+ visitor = Nokogiri::CSS::XPathVisitor.new(
242
+ builtins: Nokogiri::CSS::XPathVisitor::BuiltinsConfig::OPTIMAL,
243
+ doctype: document.xpath_doctype,
244
+ )
206
245
  self.class::IMPLIED_XPATH_CONTEXTS.map do |implied_xpath_context|
207
- CSS.xpath_for(rule.to_s, :prefix => implied_xpath_context, :ns => ns)
208
- end.join(' | ')
246
+ CSS.xpath_for(rule.to_s, { prefix: implied_xpath_context, ns: ns,
247
+ visitor: visitor, })
248
+ end.join(" | ")
209
249
  end
210
250
 
211
- def extract_params params # :nodoc:
251
+ def extract_params(params) # :nodoc:
212
252
  handler = params.find do |param|
213
253
  ![Hash, String, Symbol].include?(param.class)
214
254
  end
@@ -221,7 +261,7 @@ module Nokogiri
221
261
  end
222
262
  ns, binds = hashes.reverse
223
263
 
224
- ns ||= document.root ? document.root.namespaces : {}
264
+ ns ||= (document.root&.namespaces || {})
225
265
 
226
266
  [params, handler, ns, binds]
227
267
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -41,9 +43,9 @@ module Nokogiri
41
43
 
42
44
  def to_s
43
45
  message = super.chomp
44
- [location_to_s, level_to_s, message].
45
- compact.join(": ").
46
- force_encoding(message.encoding)
46
+ [location_to_s, level_to_s, message]
47
+ .compact.join(": ")
48
+ .force_encoding(message.encoding)
47
49
  end
48
50
 
49
51
  private
@@ -53,7 +55,6 @@ module Nokogiri
53
55
  when 3 then "FATAL"
54
56
  when 2 then "ERROR"
55
57
  when 1 then "WARNING"
56
- else nil
57
58
  end
58
59
  end
59
60
 
@@ -63,6 +64,7 @@ module Nokogiri
63
64
 
64
65
  def location_to_s
65
66
  return nil if nil_or_zero?(line) && nil_or_zero?(column)
67
+
66
68
  "#{line}:#{column}"
67
69
  end
68
70
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class Text < Nokogiri::XML::CharacterData
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
- class XPath
5
+ module XPath
4
6
  class SyntaxError < XML::SyntaxError
5
7
  def to_s
6
- [super.chomp, str1].compact.join(': ')
8
+ [super.chomp, str1].compact.join(": ")
7
9
  end
8
10
  end
9
11
  end
@@ -1,10 +1,21 @@
1
- require 'nokogiri/xml/xpath/syntax_error'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Nokogiri
4
4
  module XML
5
- class XPath
6
- # The Nokogiri::XML::Document tied to this XPath instance
7
- attr_accessor :document
5
+ module XPath
6
+ # The XPath search prefix to search globally, +//+
7
+ GLOBAL_SEARCH_PREFIX = "//"
8
+
9
+ # The XPath search prefix to search direct descendants of the root element, +/+
10
+ ROOT_SEARCH_PREFIX = "/"
11
+
12
+ # The XPath search prefix to search direct descendants of the current element, +./+
13
+ CURRENT_SEARCH_PREFIX = "./"
14
+
15
+ # The XPath search prefix to search anywhere in the current element's subtree, +.//+
16
+ SUBTREE_SEARCH_PREFIX = ".//"
8
17
  end
9
18
  end
10
19
  end
20
+
21
+ require_relative "xpath/syntax_error"
@@ -1,16 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class XPathContext
4
-
5
6
  ###
6
7
  # Register namespaces in +namespaces+
7
8
  def register_namespaces(namespaces)
8
9
  namespaces.each do |k, v|
9
- k = k.to_s.gsub(/.*:/,'') # strip off 'xmlns:' or 'xml:'
10
+ k = k.to_s.gsub(/.*:/, "") # strip off 'xmlns:' or 'xml:'
10
11
  register_ns(k, v)
11
12
  end
12
13
  end
13
-
14
14
  end
15
15
  end
16
16
  end
data/lib/nokogiri/xml.rb CHANGED
@@ -1,37 +1,10 @@
1
- require 'nokogiri/xml/pp'
2
- require 'nokogiri/xml/parse_options'
3
- require 'nokogiri/xml/sax'
4
- require 'nokogiri/xml/searchable'
5
- require 'nokogiri/xml/node'
6
- require 'nokogiri/xml/attribute_decl'
7
- require 'nokogiri/xml/element_decl'
8
- require 'nokogiri/xml/element_content'
9
- require 'nokogiri/xml/character_data'
10
- require 'nokogiri/xml/namespace'
11
- require 'nokogiri/xml/attr'
12
- require 'nokogiri/xml/dtd'
13
- require 'nokogiri/xml/cdata'
14
- require 'nokogiri/xml/text'
15
- require 'nokogiri/xml/document'
16
- require 'nokogiri/xml/document_fragment'
17
- require 'nokogiri/xml/processing_instruction'
18
- require 'nokogiri/xml/node_set'
19
- require 'nokogiri/xml/syntax_error'
20
- require 'nokogiri/xml/xpath'
21
- require 'nokogiri/xml/xpath_context'
22
- require 'nokogiri/xml/builder'
23
- require 'nokogiri/xml/reader'
24
- require 'nokogiri/xml/notation'
25
- require 'nokogiri/xml/entity_decl'
26
- require 'nokogiri/xml/entity_reference'
27
- require 'nokogiri/xml/schema'
28
- require 'nokogiri/xml/relax_ng'
1
+ # frozen_string_literal: true
29
2
 
30
3
  module Nokogiri
31
4
  class << self
32
5
  ###
33
6
  # Parse XML. Convenience method for Nokogiri::XML::Document.parse
34
- def XML thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_XML, &block
7
+ def XML(thing, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_XML, &block)
35
8
  Nokogiri::XML::Document.parse(thing, url, encoding, options, &block)
36
9
  end
37
10
  end
@@ -40,36 +13,64 @@ module Nokogiri
40
13
  # Original C14N 1.0 spec canonicalization
41
14
  XML_C14N_1_0 = 0
42
15
  # Exclusive C14N 1.0 spec canonicalization
43
- XML_C14N_EXCLUSIVE_1_0 = 1
16
+ XML_C14N_EXCLUSIVE_1_0 = 1
44
17
  # C14N 1.1 spec canonicalization
45
18
  XML_C14N_1_1 = 2
46
19
  class << self
47
20
  ###
48
21
  # Parse an XML document using the Nokogiri::XML::Reader API. See
49
22
  # Nokogiri::XML::Reader for mor information
50
- def Reader string_or_io, url = nil, encoding = nil, options = ParseOptions::STRICT
51
-
23
+ def Reader(string_or_io, url = nil, encoding = nil, options = ParseOptions::STRICT)
52
24
  options = Nokogiri::XML::ParseOptions.new(options) if Integer === options
53
- # Give the options to the user
54
25
  yield options if block_given?
55
26
 
56
- if string_or_io.respond_to? :read
27
+ if string_or_io.respond_to?(:read)
57
28
  return Reader.from_io(string_or_io, url, encoding, options.to_i)
58
29
  end
30
+
59
31
  Reader.from_memory(string_or_io, url, encoding, options.to_i)
60
32
  end
61
33
 
62
34
  ###
63
35
  # Parse XML. Convenience method for Nokogiri::XML::Document.parse
64
- def parse thing, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML, &block
36
+ def parse(thing, url = nil, encoding = nil, options = ParseOptions::DEFAULT_XML, &block)
65
37
  Document.parse(thing, url, encoding, options, &block)
66
38
  end
67
39
 
68
40
  ####
69
41
  # Parse a fragment from +string+ in to a NodeSet.
70
- def fragment string
71
- XML::DocumentFragment.parse(string)
42
+ def fragment(string, options = ParseOptions::DEFAULT_XML, &block)
43
+ XML::DocumentFragment.parse(string, options, &block)
72
44
  end
73
45
  end
74
46
  end
75
47
  end
48
+
49
+ require_relative "xml/pp"
50
+ require_relative "xml/parse_options"
51
+ require_relative "xml/sax"
52
+ require_relative "xml/searchable"
53
+ require_relative "xml/node"
54
+ require_relative "xml/attribute_decl"
55
+ require_relative "xml/element_decl"
56
+ require_relative "xml/element_content"
57
+ require_relative "xml/character_data"
58
+ require_relative "xml/namespace"
59
+ require_relative "xml/attr"
60
+ require_relative "xml/dtd"
61
+ require_relative "xml/cdata"
62
+ require_relative "xml/text"
63
+ require_relative "xml/document"
64
+ require_relative "xml/document_fragment"
65
+ require_relative "xml/processing_instruction"
66
+ require_relative "xml/node_set"
67
+ require_relative "xml/syntax_error"
68
+ require_relative "xml/xpath"
69
+ require_relative "xml/xpath_context"
70
+ require_relative "xml/builder"
71
+ require_relative "xml/reader"
72
+ require_relative "xml/notation"
73
+ require_relative "xml/entity_decl"
74
+ require_relative "xml/entity_reference"
75
+ require_relative "xml/schema"
76
+ require_relative "xml/relax_ng"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XSLT
3
5
  ###
@@ -17,7 +19,7 @@ module Nokogiri
17
19
  # Apply an XSLT stylesheet to an XML::Document.
18
20
  # +params+ is an array of strings used as XSLT parameters.
19
21
  # returns serialized document
20
- def apply_to document, params = []
22
+ def apply_to(document, params = [])
21
23
  serialize(transform(document, params))
22
24
  end
23
25
  end