nokogiri 1.8.5 → 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 (358) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +40 -18
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -90
  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 +867 -417
  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 +42 -37
  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 -237
  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 +136 -62
  33. data/ext/nokogiri/xml_node.c +1387 -678
  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 +104 -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 +1093 -411
  142. data/lib/nokogiri/xml/node_set.rb +173 -67
  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 +126 -399
  178. data/.autotest +0 -22
  179. data/.cross_rubies +0 -8
  180. data/.editorconfig +0 -17
  181. data/.gemtest +0 -0
  182. data/.travis.yml +0 -63
  183. data/CHANGELOG.md +0 -1368
  184. data/CONTRIBUTING.md +0 -42
  185. data/C_CODING_STYLE.rdoc +0 -33
  186. data/Gemfile-libxml-ruby +0 -3
  187. data/Manifest.txt +0 -370
  188. data/ROADMAP.md +0 -111
  189. data/Rakefile +0 -348
  190. data/SECURITY.md +0 -19
  191. data/STANDARD_RESPONSES.md +0 -47
  192. data/Y_U_NO_GEMSPEC.md +0 -155
  193. data/appveyor.yml +0 -29
  194. data/build_all +0 -44
  195. data/ext/nokogiri/html_document.c +0 -170
  196. data/ext/nokogiri/html_document.h +0 -10
  197. data/ext/nokogiri/html_element_description.c +0 -279
  198. data/ext/nokogiri/html_element_description.h +0 -10
  199. data/ext/nokogiri/html_entity_lookup.c +0 -32
  200. data/ext/nokogiri/html_entity_lookup.h +0 -8
  201. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  202. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  203. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  204. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  205. data/ext/nokogiri/xml_attr.h +0 -9
  206. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  207. data/ext/nokogiri/xml_cdata.h +0 -9
  208. data/ext/nokogiri/xml_comment.h +0 -9
  209. data/ext/nokogiri/xml_document.h +0 -23
  210. data/ext/nokogiri/xml_document_fragment.h +0 -10
  211. data/ext/nokogiri/xml_dtd.h +0 -10
  212. data/ext/nokogiri/xml_element_content.h +0 -10
  213. data/ext/nokogiri/xml_element_decl.h +0 -9
  214. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  215. data/ext/nokogiri/xml_entity_decl.h +0 -10
  216. data/ext/nokogiri/xml_entity_reference.h +0 -9
  217. data/ext/nokogiri/xml_io.c +0 -61
  218. data/ext/nokogiri/xml_io.h +0 -11
  219. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  220. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  221. data/ext/nokogiri/xml_namespace.h +0 -15
  222. data/ext/nokogiri/xml_node.h +0 -13
  223. data/ext/nokogiri/xml_node_set.h +0 -12
  224. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  225. data/ext/nokogiri/xml_reader.h +0 -10
  226. data/ext/nokogiri/xml_relax_ng.h +0 -9
  227. data/ext/nokogiri/xml_sax_parser.h +0 -39
  228. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  229. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  230. data/ext/nokogiri/xml_schema.h +0 -9
  231. data/ext/nokogiri/xml_syntax_error.h +0 -13
  232. data/ext/nokogiri/xml_text.h +0 -9
  233. data/ext/nokogiri/xml_xpath_context.h +0 -10
  234. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  235. data/lib/nokogiri/html/document.rb +0 -335
  236. data/lib/nokogiri/html/document_fragment.rb +0 -49
  237. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  238. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  239. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  240. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  241. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  242. data/patches/sort-patches-by-date +0 -25
  243. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  244. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  245. data/suppressions/README.txt +0 -1
  246. data/suppressions/nokogiri_ruby-2.supp +0 -10
  247. data/tasks/test.rb +0 -100
  248. data/test/css/test_nthiness.rb +0 -226
  249. data/test/css/test_parser.rb +0 -386
  250. data/test/css/test_tokenizer.rb +0 -215
  251. data/test/css/test_xpath_visitor.rb +0 -96
  252. data/test/decorators/test_slop.rb +0 -23
  253. data/test/files/2ch.html +0 -108
  254. data/test/files/GH_1042.html +0 -18
  255. data/test/files/address_book.rlx +0 -12
  256. data/test/files/address_book.xml +0 -10
  257. data/test/files/atom.xml +0 -344
  258. data/test/files/bar/bar.xsd +0 -4
  259. data/test/files/bogus.xml +0 -0
  260. data/test/files/dont_hurt_em_why.xml +0 -422
  261. data/test/files/encoding.html +0 -82
  262. data/test/files/encoding.xhtml +0 -84
  263. data/test/files/exslt.xml +0 -8
  264. data/test/files/exslt.xslt +0 -35
  265. data/test/files/foo/foo.xsd +0 -4
  266. data/test/files/metacharset.html +0 -10
  267. data/test/files/namespace_pressure_test.xml +0 -1684
  268. data/test/files/noencoding.html +0 -47
  269. data/test/files/po.xml +0 -32
  270. data/test/files/po.xsd +0 -66
  271. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  272. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  273. data/test/files/saml/xenc_schema.xsd +0 -146
  274. data/test/files/saml/xmldsig_schema.xsd +0 -318
  275. data/test/files/shift_jis.html +0 -10
  276. data/test/files/shift_jis.xml +0 -5
  277. data/test/files/shift_jis_no_charset.html +0 -9
  278. data/test/files/slow-xpath.xml +0 -25509
  279. data/test/files/snuggles.xml +0 -3
  280. data/test/files/staff.dtd +0 -10
  281. data/test/files/staff.xml +0 -59
  282. data/test/files/staff.xslt +0 -32
  283. data/test/files/test_document_url/bar.xml +0 -2
  284. data/test/files/test_document_url/document.dtd +0 -4
  285. data/test/files/test_document_url/document.xml +0 -6
  286. data/test/files/tlm.html +0 -851
  287. data/test/files/to_be_xincluded.xml +0 -2
  288. data/test/files/valid_bar.xml +0 -2
  289. data/test/files/xinclude.xml +0 -4
  290. data/test/helper.rb +0 -271
  291. data/test/html/sax/test_parser.rb +0 -168
  292. data/test/html/sax/test_parser_context.rb +0 -46
  293. data/test/html/sax/test_parser_text.rb +0 -163
  294. data/test/html/sax/test_push_parser.rb +0 -87
  295. data/test/html/test_attributes.rb +0 -85
  296. data/test/html/test_builder.rb +0 -164
  297. data/test/html/test_document.rb +0 -712
  298. data/test/html/test_document_encoding.rb +0 -143
  299. data/test/html/test_document_fragment.rb +0 -310
  300. data/test/html/test_element_description.rb +0 -105
  301. data/test/html/test_named_characters.rb +0 -14
  302. data/test/html/test_node.rb +0 -212
  303. data/test/html/test_node_encoding.rb +0 -91
  304. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  305. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  306. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  308. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  309. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  310. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  311. data/test/test_convert_xpath.rb +0 -135
  312. data/test/test_css_cache.rb +0 -47
  313. data/test/test_encoding_handler.rb +0 -48
  314. data/test/test_memory_leak.rb +0 -156
  315. data/test/test_nokogiri.rb +0 -138
  316. data/test/test_soap4r_sax.rb +0 -52
  317. data/test/test_xslt_transforms.rb +0 -314
  318. data/test/xml/node/test_save_options.rb +0 -28
  319. data/test/xml/node/test_subclass.rb +0 -44
  320. data/test/xml/sax/test_parser.rb +0 -402
  321. data/test/xml/sax/test_parser_context.rb +0 -115
  322. data/test/xml/sax/test_parser_text.rb +0 -202
  323. data/test/xml/sax/test_push_parser.rb +0 -265
  324. data/test/xml/test_attr.rb +0 -74
  325. data/test/xml/test_attribute_decl.rb +0 -86
  326. data/test/xml/test_builder.rb +0 -341
  327. data/test/xml/test_c14n.rb +0 -180
  328. data/test/xml/test_cdata.rb +0 -54
  329. data/test/xml/test_comment.rb +0 -40
  330. data/test/xml/test_document.rb +0 -982
  331. data/test/xml/test_document_encoding.rb +0 -31
  332. data/test/xml/test_document_fragment.rb +0 -298
  333. data/test/xml/test_dtd.rb +0 -187
  334. data/test/xml/test_dtd_encoding.rb +0 -31
  335. data/test/xml/test_element_content.rb +0 -56
  336. data/test/xml/test_element_decl.rb +0 -73
  337. data/test/xml/test_entity_decl.rb +0 -122
  338. data/test/xml/test_entity_reference.rb +0 -262
  339. data/test/xml/test_namespace.rb +0 -96
  340. data/test/xml/test_node.rb +0 -1325
  341. data/test/xml/test_node_attributes.rb +0 -115
  342. data/test/xml/test_node_encoding.rb +0 -75
  343. data/test/xml/test_node_inheritance.rb +0 -32
  344. data/test/xml/test_node_reparenting.rb +0 -592
  345. data/test/xml/test_node_set.rb +0 -809
  346. data/test/xml/test_parse_options.rb +0 -64
  347. data/test/xml/test_processing_instruction.rb +0 -30
  348. data/test/xml/test_reader.rb +0 -620
  349. data/test/xml/test_reader_encoding.rb +0 -134
  350. data/test/xml/test_relax_ng.rb +0 -60
  351. data/test/xml/test_schema.rb +0 -142
  352. data/test/xml/test_syntax_error.rb +0 -36
  353. data/test/xml/test_text.rb +0 -60
  354. data/test/xml/test_unparented_node.rb +0 -483
  355. data/test/xml/test_xinclude.rb +0 -83
  356. data/test/xml/test_xpath.rb +0 -470
  357. data/test/xslt/test_custom_functions.rb +0 -133
  358. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,3 +1,6 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  module Nokogiri
2
5
  module XML
3
6
  ####
@@ -11,10 +14,10 @@ module Nokogiri
11
14
  # The Document this NodeSet is associated with
12
15
  attr_accessor :document
13
16
 
14
- alias :clone :dup
17
+ alias_method :clone, :dup
15
18
 
16
19
  # Create a NodeSet with +document+ defaulting to +list+
17
- def initialize document, list = []
20
+ def initialize(document, list = [])
18
21
  @document = document
19
22
  document.decorate(self)
20
23
  list.each { |x| self << x }
@@ -23,8 +26,9 @@ module Nokogiri
23
26
 
24
27
  ###
25
28
  # Get the first element of the NodeSet.
26
- def first n = nil
29
+ def first(n = nil)
27
30
  return self[0] unless n
31
+
28
32
  list = []
29
33
  [n, length].min.times { |i| list << self[i] }
30
34
  list
@@ -44,9 +48,9 @@ module Nokogiri
44
48
 
45
49
  ###
46
50
  # Returns the index of the first node in self that is == to +node+ or meets the given block. Returns nil if no match is found.
47
- def index(node = nil, &block)
51
+ def index(node = nil)
48
52
  if node
49
- warn "given block not used" if block_given?
53
+ warn("given block not used") if block_given?
50
54
  each_with_index { |member, j| return j if member == node }
51
55
  elsif block_given?
52
56
  each_with_index { |member, j| return j if yield(member) }
@@ -56,18 +60,18 @@ module Nokogiri
56
60
 
57
61
  ###
58
62
  # Insert +datum+ before the first Node in this NodeSet
59
- def before datum
60
- first.before datum
63
+ def before(datum)
64
+ first.before(datum)
61
65
  end
62
66
 
63
67
  ###
64
68
  # Insert +datum+ after the last Node in this NodeSet
65
- def after datum
66
- last.after datum
69
+ def after(datum)
70
+ last.after(datum)
67
71
  end
68
72
 
69
- alias :<< :push
70
- alias :remove :unlink
73
+ alias_method :<<, :push
74
+ alias_method :remove, :unlink
71
75
 
72
76
  ###
73
77
  # call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
@@ -76,7 +80,7 @@ module Nokogiri
76
80
  # selectors. For example:
77
81
  #
78
82
  # For more information see Nokogiri::XML::Searchable#css
79
- def css *args
83
+ def css(*args)
80
84
  rules, handler, ns, _ = extract_params(args)
81
85
  paths = css_rules_to_xpath(rules, ns)
82
86
 
@@ -92,7 +96,7 @@ module Nokogiri
92
96
  # queries.
93
97
  #
94
98
  # For more information see Nokogiri::XML::Searchable#xpath
95
- def xpath *args
99
+ def xpath(*args)
96
100
  paths, handler, ns, binds = extract_params(args)
97
101
 
98
102
  inject(NodeSet.new(document)) do |set, node|
@@ -100,13 +104,6 @@ module Nokogiri
100
104
  end
101
105
  end
102
106
 
103
- ###
104
- # Search this NodeSet's nodes' immediate children using CSS selector +selector+
105
- def > selector
106
- ns = document.root.namespaces
107
- xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
108
- end
109
-
110
107
  ###
111
108
  # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
112
109
  #
@@ -119,18 +116,18 @@ module Nokogiri
119
116
  #
120
117
  # node_set.at(3) # same as node_set[3]
121
118
  #
122
- def at *args
119
+ def at(*args)
123
120
  if args.length == 1 && args.first.is_a?(Numeric)
124
121
  return self[args.first]
125
122
  end
126
123
 
127
124
  super(*args)
128
125
  end
129
- alias :% :at
126
+ alias_method :%, :at
130
127
 
131
128
  ###
132
129
  # Filter this list for nodes that match +expr+
133
- def filter expr
130
+ def filter(expr)
134
131
  find_all { |node| node.matches?(expr) }
135
132
  end
136
133
 
@@ -139,7 +136,7 @@ module Nokogiri
139
136
  # NodeSet.
140
137
  #
141
138
  # See Nokogiri::XML::Node#add_class for more information.
142
- def add_class name
139
+ def add_class(name)
143
140
  each do |el|
144
141
  el.add_class(name)
145
142
  end
@@ -151,7 +148,7 @@ module Nokogiri
151
148
  # NodeSet.
152
149
  #
153
150
  # See Nokogiri::XML::Node#append_class for more information.
154
- def append_class name
151
+ def append_class(name)
155
152
  each do |el|
156
153
  el.append_class(name)
157
154
  end
@@ -163,7 +160,7 @@ module Nokogiri
163
160
  # NodeSet.
164
161
  #
165
162
  # See Nokogiri::XML::Node#remove_class for more information.
166
- def remove_class name = nil
163
+ def remove_class(name = nil)
167
164
  each do |el|
168
165
  el.remove_class(name)
169
166
  end
@@ -171,38 +168,73 @@ module Nokogiri
171
168
  end
172
169
 
173
170
  ###
174
- # Set the attribute +key+ to +value+ or the return value of +blk+
175
- # on all Node objects in the NodeSet.
176
- def attr key, value = nil, &blk
177
- unless Hash === key || key && (value || blk)
178
- return first.attribute(key)
171
+ # Set attributes on each Node in the NodeSet, or get an
172
+ # attribute from the first Node in the NodeSet.
173
+ #
174
+ # To get an attribute from the first Node in a NodeSet:
175
+ #
176
+ # node_set.attr("href") # => "https://www.nokogiri.org"
177
+ #
178
+ # Note that an empty NodeSet will return nil when +#attr+ is called as a getter.
179
+ #
180
+ # To set an attribute on each node, +key+ can either be an
181
+ # attribute name, or a Hash of attribute names and values. When
182
+ # called as a setter, +#attr+ returns the NodeSet.
183
+ #
184
+ # If +key+ is an attribute name, then either +value+ or +block+
185
+ # must be passed.
186
+ #
187
+ # If +key+ is a Hash then attributes will be set for each
188
+ # key/value pair:
189
+ #
190
+ # node_set.attr("href" => "https://www.nokogiri.org", "class" => "member")
191
+ #
192
+ # If +value+ is passed, it will be used as the attribute value
193
+ # for all nodes:
194
+ #
195
+ # node_set.attr("href", "https://www.nokogiri.org")
196
+ #
197
+ # If +block+ is passed, it will be called on each Node object in
198
+ # the NodeSet and the return value used as the attribute value
199
+ # for that node:
200
+ #
201
+ # node_set.attr("class") { |node| node.name }
202
+ #
203
+ def attr(key, value = nil, &block)
204
+ unless key.is_a?(Hash) || (key && (value || block))
205
+ return first&.attribute(key)
179
206
  end
180
207
 
181
208
  hash = key.is_a?(Hash) ? key : { key => value }
182
209
 
183
- hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
210
+ hash.each do |k, v|
211
+ each do |node|
212
+ node[k] = v || yield(node)
213
+ end
214
+ end
184
215
 
185
216
  self
186
217
  end
187
- alias :set :attr
188
- alias :attribute :attr
218
+ alias_method :set, :attr
219
+ alias_method :attribute, :attr
189
220
 
190
221
  ###
191
222
  # Remove the attributed named +name+ from all Node objects in the NodeSet
192
- def remove_attr name
193
- each { |el| el.delete name }
223
+ def remove_attr(name)
224
+ each { |el| el.delete(name) }
194
225
  self
195
226
  end
196
- alias remove_attribute remove_attr
227
+ alias_method :remove_attribute, :remove_attr
197
228
 
198
229
  ###
199
230
  # Iterate over each node, yielding to +block+
200
- def each(&block)
231
+ def each
201
232
  return to_enum unless block_given?
202
233
 
203
234
  0.upto(length - 1) do |x|
204
235
  yield self[x]
205
236
  end
237
+ self
206
238
  end
207
239
 
208
240
  ###
@@ -219,24 +251,82 @@ module Nokogiri
219
251
  #
220
252
  # See Nokogiri::XML::Node#content for more information.
221
253
  def inner_text
222
- collect(&:inner_text).join('')
254
+ collect(&:inner_text).join("")
223
255
  end
224
- alias :text :inner_text
256
+ alias_method :text, :inner_text
225
257
 
226
258
  ###
227
259
  # Get the inner html of all contained Node objects
228
- def inner_html *args
229
- collect{|j| j.inner_html(*args) }.join('')
260
+ def inner_html(*args)
261
+ collect { |j| j.inner_html(*args) }.join("")
230
262
  end
231
263
 
232
- ###
233
- # Wrap this NodeSet with +html+ or the results of the builder in +blk+
234
- def wrap(html, &blk)
235
- each do |j|
236
- new_parent = document.parse(html).first
237
- j.add_next_sibling(new_parent)
238
- new_parent.add_child(j)
239
- end
264
+ # :call-seq:
265
+ # wrap(markup) -> self
266
+ # wrap(node) -> self
267
+ #
268
+ # Wrap each member of this NodeSet with the node parsed from +markup+ or a dup of the +node+.
269
+ #
270
+ # [Parameters]
271
+ # - *markup* (String)
272
+ # Markup that is parsed, once per member of the NodeSet, and used as the wrapper. Each
273
+ # node's parent, if it exists, is used as the context node for parsing; otherwise the
274
+ # associated document is used. If the parsed fragment has multiple roots, the first root
275
+ # node is used as the wrapper.
276
+ # - *node* (Nokogiri::XML::Node)
277
+ # An element that is `#dup`ed and used as the wrapper.
278
+ #
279
+ # [Returns] +self+, to support chaining.
280
+ #
281
+ # ⚠ Note that if a +String+ is passed, the markup will be parsed <b>once per node</b> in the
282
+ # NodeSet. You can avoid this overhead in cases where you know exactly the wrapper you wish to
283
+ # use by passing a +Node+ instead.
284
+ #
285
+ # Also see Node#wrap
286
+ #
287
+ # *Example* with a +String+ argument:
288
+ #
289
+ # doc = Nokogiri::HTML5(<<~HTML)
290
+ # <html><body>
291
+ # <a>a</a>
292
+ # <a>b</a>
293
+ # <a>c</a>
294
+ # <a>d</a>
295
+ # </body></html>
296
+ # HTML
297
+ # doc.css("a").wrap("<div></div>")
298
+ # doc.to_html
299
+ # # => <html><head></head><body>
300
+ # # <div><a>a</a></div>
301
+ # # <div><a>b</a></div>
302
+ # # <div><a>c</a></div>
303
+ # # <div><a>d</a></div>
304
+ # # </body></html>
305
+ #
306
+ # *Example* with a +Node+ argument
307
+ #
308
+ # 💡 Note that this is faster than the equivalent call passing a +String+ because it avoids
309
+ # having to reparse the wrapper markup for each node.
310
+ #
311
+ # doc = Nokogiri::HTML5(<<~HTML)
312
+ # <html><body>
313
+ # <a>a</a>
314
+ # <a>b</a>
315
+ # <a>c</a>
316
+ # <a>d</a>
317
+ # </body></html>
318
+ # HTML
319
+ # doc.css("a").wrap(doc.create_element("div"))
320
+ # doc.to_html
321
+ # # => <html><head></head><body>
322
+ # # <div><a>a</a></div>
323
+ # # <div><a>b</a></div>
324
+ # # <div><a>c</a></div>
325
+ # # <div><a>d</a></div>
326
+ # # </body></html>
327
+ #
328
+ def wrap(node_or_tags)
329
+ map { |node| node.wrap(node_or_tags) }
240
330
  self
241
331
  end
242
332
 
@@ -248,38 +338,43 @@ module Nokogiri
248
338
 
249
339
  ###
250
340
  # Convert this NodeSet to HTML
251
- def to_html *args
341
+ def to_html(*args)
252
342
  if Nokogiri.jruby?
253
343
  options = args.first.is_a?(Hash) ? args.shift : {}
254
- if !options[:save_with]
255
- options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
256
- end
344
+ options[:save_with] ||= Node::SaveOptions::DEFAULT_HTML
257
345
  args.insert(0, options)
258
346
  end
259
- map { |x| x.to_html(*args) }.join
347
+ if empty?
348
+ encoding = (args.first.is_a?(Hash) ? args.first[:encoding] : nil)
349
+ encoding ||= document.encoding
350
+ encoding.nil? ? "" : "".encode(encoding)
351
+ else
352
+ map { |x| x.to_html(*args) }.join
353
+ end
260
354
  end
261
355
 
262
356
  ###
263
357
  # Convert this NodeSet to XHTML
264
- def to_xhtml *args
358
+ def to_xhtml(*args)
265
359
  map { |x| x.to_xhtml(*args) }.join
266
360
  end
267
361
 
268
362
  ###
269
363
  # Convert this NodeSet to XML
270
- def to_xml *args
364
+ def to_xml(*args)
271
365
  map { |x| x.to_xml(*args) }.join
272
366
  end
273
367
 
274
- alias :size :length
275
- alias :to_ary :to_a
368
+ alias_method :size, :length
369
+ alias_method :to_ary, :to_a
276
370
 
277
371
  ###
278
372
  # Removes the last element from set and returns it, or +nil+ if
279
373
  # the set is empty
280
374
  def pop
281
375
  return nil if length == 0
282
- delete last
376
+
377
+ delete(last)
283
378
  end
284
379
 
285
380
  ###
@@ -287,16 +382,18 @@ module Nokogiri
287
382
  # +nil+ if the set is empty.
288
383
  def shift
289
384
  return nil if length == 0
290
- delete first
385
+
386
+ delete(first)
291
387
  end
292
388
 
293
389
  ###
294
390
  # Equality -- Two NodeSets are equal if the contain the same number
295
391
  # of elements and if each element is equal to the corresponding
296
392
  # element in the other NodeSet
297
- def == other
393
+ def ==(other)
298
394
  return false unless other.is_a?(Nokogiri::XML::NodeSet)
299
395
  return false unless length == other.length
396
+
300
397
  each_with_index do |node, i|
301
398
  return false unless node == other[i]
302
399
  end
@@ -320,7 +417,7 @@ module Nokogiri
320
417
  def reverse
321
418
  node_set = NodeSet.new(document)
322
419
  (length - 1).downto(0) do |x|
323
- node_set.push self[x]
420
+ node_set.push(self[x])
324
421
  end
325
422
  node_set
326
423
  end
@@ -328,14 +425,23 @@ module Nokogiri
328
425
  ###
329
426
  # Return a nicely formated string representation
330
427
  def inspect
331
- "[#{map(&:inspect).join ', '}]"
428
+ "[#{map(&:inspect).join(", ")}]"
332
429
  end
333
430
 
334
- alias :+ :|
431
+ alias_method :+, :|
335
432
 
336
- # @private
337
- IMPLIED_XPATH_CONTEXTS = [ './/'.freeze, 'self::'.freeze ].freeze # :nodoc:
433
+ #
434
+ # :call-seq: deconstruct() Array
435
+ #
436
+ # Returns the members of this NodeSet as an array, to use in pattern matching.
437
+ #
438
+ # ⚡ This is an experimental feature, available since v1.14.0
439
+ #
440
+ def deconstruct
441
+ to_a
442
+ end
338
443
 
444
+ IMPLIED_XPATH_CONTEXTS = [".//", "self::"].freeze # :nodoc:
339
445
  end
340
446
  end
341
447
  end
@@ -1,6 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
5
+ # Struct representing an {XML Schema Notation}[https://www.w3.org/TR/xml/#Notations]
3
6
  class Notation < Struct.new(:name, :public_id, :system_id)
7
+ # dead comment to ensure rdoc processing
8
+
9
+ # :attr: name (String)
10
+ # The name for the element.
11
+
12
+ # :attr: public_id (String)
13
+ # The URI corresponding to the public identifier
14
+
15
+ # :attr: system_id (String,nil)
16
+ # The URI corresponding to the system identifier
4
17
  end
5
18
  end
6
19
  end