nokogiri 1.8.5 → 1.13.6

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 (356) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -21
  3. data/LICENSE-DEPENDENCIES.md +1159 -868
  4. data/LICENSE.md +5 -28
  5. data/README.md +196 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -59
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +750 -420
  10. data/ext/nokogiri/gumbo.c +584 -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 +119 -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 +228 -91
  18. data/ext/nokogiri/nokogiri.h +191 -89
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +41 -36
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +13 -18
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -216
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +43 -18
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +61 -52
  33. data/ext/nokogiri/xml_node.c +1044 -616
  34. data/ext/nokogiri/xml_node_set.c +174 -162
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +226 -175
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +112 -112
  39. data/ext/nokogiri/xml_sax_parser_context.c +112 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +13 -17
  44. data/ext/nokogiri/xml_xpath_context.c +223 -115
  45. data/ext/nokogiri/xslt_stylesheet.c +265 -173
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -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 +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -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 +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -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 +68 -0
  88. data/gumbo-parser/src/util.h +30 -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 +218 -91
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/{html → html4}/document.rb +103 -105
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +91 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +100 -0
  118. data/lib/nokogiri/html5.rb +478 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +222 -0
  123. data/lib/nokogiri/version.rb +3 -108
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +97 -53
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +224 -86
  130. data/lib/nokogiri/xml/document_fragment.rb +57 -44
  131. data/lib/nokogiri/xml/dtd.rb +4 -2
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +10 -5
  138. data/lib/nokogiri/xml/node.rb +895 -377
  139. data/lib/nokogiri/xml/node_set.rb +92 -65
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +22 -8
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +38 -34
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +112 -72
  155. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -37
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +49 -65
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.14.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +220 -266
  177. data/.autotest +0 -22
  178. data/.cross_rubies +0 -8
  179. data/.editorconfig +0 -17
  180. data/.gemtest +0 -0
  181. data/.travis.yml +0 -63
  182. data/CHANGELOG.md +0 -1368
  183. data/CONTRIBUTING.md +0 -42
  184. data/C_CODING_STYLE.rdoc +0 -33
  185. data/Gemfile-libxml-ruby +0 -3
  186. data/Manifest.txt +0 -370
  187. data/ROADMAP.md +0 -111
  188. data/Rakefile +0 -348
  189. data/SECURITY.md +0 -19
  190. data/STANDARD_RESPONSES.md +0 -47
  191. data/Y_U_NO_GEMSPEC.md +0 -155
  192. data/appveyor.yml +0 -29
  193. data/build_all +0 -44
  194. data/ext/nokogiri/html_document.c +0 -170
  195. data/ext/nokogiri/html_document.h +0 -10
  196. data/ext/nokogiri/html_element_description.c +0 -279
  197. data/ext/nokogiri/html_element_description.h +0 -10
  198. data/ext/nokogiri/html_entity_lookup.c +0 -32
  199. data/ext/nokogiri/html_entity_lookup.h +0 -8
  200. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  201. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  202. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  203. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  204. data/ext/nokogiri/xml_attr.h +0 -9
  205. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  206. data/ext/nokogiri/xml_cdata.h +0 -9
  207. data/ext/nokogiri/xml_comment.h +0 -9
  208. data/ext/nokogiri/xml_document.h +0 -23
  209. data/ext/nokogiri/xml_document_fragment.h +0 -10
  210. data/ext/nokogiri/xml_dtd.h +0 -10
  211. data/ext/nokogiri/xml_element_content.h +0 -10
  212. data/ext/nokogiri/xml_element_decl.h +0 -9
  213. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  214. data/ext/nokogiri/xml_entity_decl.h +0 -10
  215. data/ext/nokogiri/xml_entity_reference.h +0 -9
  216. data/ext/nokogiri/xml_io.c +0 -61
  217. data/ext/nokogiri/xml_io.h +0 -11
  218. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  219. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  220. data/ext/nokogiri/xml_namespace.h +0 -15
  221. data/ext/nokogiri/xml_node.h +0 -13
  222. data/ext/nokogiri/xml_node_set.h +0 -12
  223. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  224. data/ext/nokogiri/xml_reader.h +0 -10
  225. data/ext/nokogiri/xml_relax_ng.h +0 -9
  226. data/ext/nokogiri/xml_sax_parser.h +0 -39
  227. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  228. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  229. data/ext/nokogiri/xml_schema.h +0 -9
  230. data/ext/nokogiri/xml_syntax_error.h +0 -13
  231. data/ext/nokogiri/xml_text.h +0 -9
  232. data/ext/nokogiri/xml_xpath_context.h +0 -10
  233. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  234. data/lib/nokogiri/html/document_fragment.rb +0 -49
  235. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  236. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  237. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  238. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  239. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  240. data/patches/sort-patches-by-date +0 -25
  241. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  242. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  243. data/suppressions/README.txt +0 -1
  244. data/suppressions/nokogiri_ruby-2.supp +0 -10
  245. data/tasks/test.rb +0 -100
  246. data/test/css/test_nthiness.rb +0 -226
  247. data/test/css/test_parser.rb +0 -386
  248. data/test/css/test_tokenizer.rb +0 -215
  249. data/test/css/test_xpath_visitor.rb +0 -96
  250. data/test/decorators/test_slop.rb +0 -23
  251. data/test/files/2ch.html +0 -108
  252. data/test/files/GH_1042.html +0 -18
  253. data/test/files/address_book.rlx +0 -12
  254. data/test/files/address_book.xml +0 -10
  255. data/test/files/atom.xml +0 -344
  256. data/test/files/bar/bar.xsd +0 -4
  257. data/test/files/bogus.xml +0 -0
  258. data/test/files/dont_hurt_em_why.xml +0 -422
  259. data/test/files/encoding.html +0 -82
  260. data/test/files/encoding.xhtml +0 -84
  261. data/test/files/exslt.xml +0 -8
  262. data/test/files/exslt.xslt +0 -35
  263. data/test/files/foo/foo.xsd +0 -4
  264. data/test/files/metacharset.html +0 -10
  265. data/test/files/namespace_pressure_test.xml +0 -1684
  266. data/test/files/noencoding.html +0 -47
  267. data/test/files/po.xml +0 -32
  268. data/test/files/po.xsd +0 -66
  269. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  270. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  271. data/test/files/saml/xenc_schema.xsd +0 -146
  272. data/test/files/saml/xmldsig_schema.xsd +0 -318
  273. data/test/files/shift_jis.html +0 -10
  274. data/test/files/shift_jis.xml +0 -5
  275. data/test/files/shift_jis_no_charset.html +0 -9
  276. data/test/files/slow-xpath.xml +0 -25509
  277. data/test/files/snuggles.xml +0 -3
  278. data/test/files/staff.dtd +0 -10
  279. data/test/files/staff.xml +0 -59
  280. data/test/files/staff.xslt +0 -32
  281. data/test/files/test_document_url/bar.xml +0 -2
  282. data/test/files/test_document_url/document.dtd +0 -4
  283. data/test/files/test_document_url/document.xml +0 -6
  284. data/test/files/tlm.html +0 -851
  285. data/test/files/to_be_xincluded.xml +0 -2
  286. data/test/files/valid_bar.xml +0 -2
  287. data/test/files/xinclude.xml +0 -4
  288. data/test/helper.rb +0 -271
  289. data/test/html/sax/test_parser.rb +0 -168
  290. data/test/html/sax/test_parser_context.rb +0 -46
  291. data/test/html/sax/test_parser_text.rb +0 -163
  292. data/test/html/sax/test_push_parser.rb +0 -87
  293. data/test/html/test_attributes.rb +0 -85
  294. data/test/html/test_builder.rb +0 -164
  295. data/test/html/test_document.rb +0 -712
  296. data/test/html/test_document_encoding.rb +0 -143
  297. data/test/html/test_document_fragment.rb +0 -310
  298. data/test/html/test_element_description.rb +0 -105
  299. data/test/html/test_named_characters.rb +0 -14
  300. data/test/html/test_node.rb +0 -212
  301. data/test/html/test_node_encoding.rb +0 -91
  302. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  303. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  304. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  305. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  306. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  308. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  309. data/test/test_convert_xpath.rb +0 -135
  310. data/test/test_css_cache.rb +0 -47
  311. data/test/test_encoding_handler.rb +0 -48
  312. data/test/test_memory_leak.rb +0 -156
  313. data/test/test_nokogiri.rb +0 -138
  314. data/test/test_soap4r_sax.rb +0 -52
  315. data/test/test_xslt_transforms.rb +0 -314
  316. data/test/xml/node/test_save_options.rb +0 -28
  317. data/test/xml/node/test_subclass.rb +0 -44
  318. data/test/xml/sax/test_parser.rb +0 -402
  319. data/test/xml/sax/test_parser_context.rb +0 -115
  320. data/test/xml/sax/test_parser_text.rb +0 -202
  321. data/test/xml/sax/test_push_parser.rb +0 -265
  322. data/test/xml/test_attr.rb +0 -74
  323. data/test/xml/test_attribute_decl.rb +0 -86
  324. data/test/xml/test_builder.rb +0 -341
  325. data/test/xml/test_c14n.rb +0 -180
  326. data/test/xml/test_cdata.rb +0 -54
  327. data/test/xml/test_comment.rb +0 -40
  328. data/test/xml/test_document.rb +0 -982
  329. data/test/xml/test_document_encoding.rb +0 -31
  330. data/test/xml/test_document_fragment.rb +0 -298
  331. data/test/xml/test_dtd.rb +0 -187
  332. data/test/xml/test_dtd_encoding.rb +0 -31
  333. data/test/xml/test_element_content.rb +0 -56
  334. data/test/xml/test_element_decl.rb +0 -73
  335. data/test/xml/test_entity_decl.rb +0 -122
  336. data/test/xml/test_entity_reference.rb +0 -262
  337. data/test/xml/test_namespace.rb +0 -96
  338. data/test/xml/test_node.rb +0 -1325
  339. data/test/xml/test_node_attributes.rb +0 -115
  340. data/test/xml/test_node_encoding.rb +0 -75
  341. data/test/xml/test_node_inheritance.rb +0 -32
  342. data/test/xml/test_node_reparenting.rb +0 -592
  343. data/test/xml/test_node_set.rb +0 -809
  344. data/test/xml/test_parse_options.rb +0 -64
  345. data/test/xml/test_processing_instruction.rb +0 -30
  346. data/test/xml/test_reader.rb +0 -620
  347. data/test/xml/test_reader_encoding.rb +0 -134
  348. data/test/xml/test_relax_ng.rb +0 -60
  349. data/test/xml/test_schema.rb +0 -142
  350. data/test/xml/test_syntax_error.rb +0 -36
  351. data/test/xml/test_text.rb +0 -60
  352. data/test/xml/test_unparented_node.rb +0 -483
  353. data/test/xml/test_xinclude.rb +0 -83
  354. data/test/xml/test_xpath.rb +0 -470
  355. data/test/xslt/test_custom_functions.rb +0 -133
  356. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ####
@@ -11,10 +13,10 @@ module Nokogiri
11
13
  # The Document this NodeSet is associated with
12
14
  attr_accessor :document
13
15
 
14
- alias :clone :dup
16
+ alias_method :clone, :dup
15
17
 
16
18
  # Create a NodeSet with +document+ defaulting to +list+
17
- def initialize document, list = []
19
+ def initialize(document, list = [])
18
20
  @document = document
19
21
  document.decorate(self)
20
22
  list.each { |x| self << x }
@@ -23,8 +25,9 @@ module Nokogiri
23
25
 
24
26
  ###
25
27
  # Get the first element of the NodeSet.
26
- def first n = nil
28
+ def first(n = nil)
27
29
  return self[0] unless n
30
+
28
31
  list = []
29
32
  [n, length].min.times { |i| list << self[i] }
30
33
  list
@@ -44,9 +47,9 @@ module Nokogiri
44
47
 
45
48
  ###
46
49
  # 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)
50
+ def index(node = nil)
48
51
  if node
49
- warn "given block not used" if block_given?
52
+ warn("given block not used") if block_given?
50
53
  each_with_index { |member, j| return j if member == node }
51
54
  elsif block_given?
52
55
  each_with_index { |member, j| return j if yield(member) }
@@ -56,18 +59,18 @@ module Nokogiri
56
59
 
57
60
  ###
58
61
  # Insert +datum+ before the first Node in this NodeSet
59
- def before datum
60
- first.before datum
62
+ def before(datum)
63
+ first.before(datum)
61
64
  end
62
65
 
63
66
  ###
64
67
  # Insert +datum+ after the last Node in this NodeSet
65
- def after datum
66
- last.after datum
68
+ def after(datum)
69
+ last.after(datum)
67
70
  end
68
71
 
69
- alias :<< :push
70
- alias :remove :unlink
72
+ alias_method :<<, :push
73
+ alias_method :remove, :unlink
71
74
 
72
75
  ###
73
76
  # call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
@@ -76,7 +79,7 @@ module Nokogiri
76
79
  # selectors. For example:
77
80
  #
78
81
  # For more information see Nokogiri::XML::Searchable#css
79
- def css *args
82
+ def css(*args)
80
83
  rules, handler, ns, _ = extract_params(args)
81
84
  paths = css_rules_to_xpath(rules, ns)
82
85
 
@@ -92,7 +95,7 @@ module Nokogiri
92
95
  # queries.
93
96
  #
94
97
  # For more information see Nokogiri::XML::Searchable#xpath
95
- def xpath *args
98
+ def xpath(*args)
96
99
  paths, handler, ns, binds = extract_params(args)
97
100
 
98
101
  inject(NodeSet.new(document)) do |set, node|
@@ -100,13 +103,6 @@ module Nokogiri
100
103
  end
101
104
  end
102
105
 
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
106
  ###
111
107
  # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
112
108
  #
@@ -119,18 +115,18 @@ module Nokogiri
119
115
  #
120
116
  # node_set.at(3) # same as node_set[3]
121
117
  #
122
- def at *args
118
+ def at(*args)
123
119
  if args.length == 1 && args.first.is_a?(Numeric)
124
120
  return self[args.first]
125
121
  end
126
122
 
127
123
  super(*args)
128
124
  end
129
- alias :% :at
125
+ alias_method :%, :at
130
126
 
131
127
  ###
132
128
  # Filter this list for nodes that match +expr+
133
- def filter expr
129
+ def filter(expr)
134
130
  find_all { |node| node.matches?(expr) }
135
131
  end
136
132
 
@@ -139,7 +135,7 @@ module Nokogiri
139
135
  # NodeSet.
140
136
  #
141
137
  # See Nokogiri::XML::Node#add_class for more information.
142
- def add_class name
138
+ def add_class(name)
143
139
  each do |el|
144
140
  el.add_class(name)
145
141
  end
@@ -151,7 +147,7 @@ module Nokogiri
151
147
  # NodeSet.
152
148
  #
153
149
  # See Nokogiri::XML::Node#append_class for more information.
154
- def append_class name
150
+ def append_class(name)
155
151
  each do |el|
156
152
  el.append_class(name)
157
153
  end
@@ -163,7 +159,7 @@ module Nokogiri
163
159
  # NodeSet.
164
160
  #
165
161
  # See Nokogiri::XML::Node#remove_class for more information.
166
- def remove_class name = nil
162
+ def remove_class(name = nil)
167
163
  each do |el|
168
164
  el.remove_class(name)
169
165
  end
@@ -171,38 +167,73 @@ module Nokogiri
171
167
  end
172
168
 
173
169
  ###
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)
170
+ # Set attributes on each Node in the NodeSet, or get an
171
+ # attribute from the first Node in the NodeSet.
172
+ #
173
+ # To get an attribute from the first Node in a NodeSet:
174
+ #
175
+ # node_set.attr("href") # => "https://www.nokogiri.org"
176
+ #
177
+ # Note that an empty NodeSet will return nil when +#attr+ is called as a getter.
178
+ #
179
+ # To set an attribute on each node, +key+ can either be an
180
+ # attribute name, or a Hash of attribute names and values. When
181
+ # called as a setter, +#attr+ returns the NodeSet.
182
+ #
183
+ # If +key+ is an attribute name, then either +value+ or +block+
184
+ # must be passed.
185
+ #
186
+ # If +key+ is a Hash then attributes will be set for each
187
+ # key/value pair:
188
+ #
189
+ # node_set.attr("href" => "https://www.nokogiri.org", "class" => "member")
190
+ #
191
+ # If +value+ is passed, it will be used as the attribute value
192
+ # for all nodes:
193
+ #
194
+ # node_set.attr("href", "https://www.nokogiri.org")
195
+ #
196
+ # If +block+ is passed, it will be called on each Node object in
197
+ # the NodeSet and the return value used as the attribute value
198
+ # for that node:
199
+ #
200
+ # node_set.attr("class") { |node| node.name }
201
+ #
202
+ def attr(key, value = nil, &block)
203
+ unless key.is_a?(Hash) || (key && (value || block))
204
+ return first ? first.attribute(key) : nil
179
205
  end
180
206
 
181
207
  hash = key.is_a?(Hash) ? key : { key => value }
182
208
 
183
- hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
209
+ hash.each do |k, v|
210
+ each do |node|
211
+ node[k] = v || yield(node)
212
+ end
213
+ end
184
214
 
185
215
  self
186
216
  end
187
- alias :set :attr
188
- alias :attribute :attr
217
+ alias_method :set, :attr
218
+ alias_method :attribute, :attr
189
219
 
190
220
  ###
191
221
  # Remove the attributed named +name+ from all Node objects in the NodeSet
192
- def remove_attr name
193
- each { |el| el.delete name }
222
+ def remove_attr(name)
223
+ each { |el| el.delete(name) }
194
224
  self
195
225
  end
196
- alias remove_attribute remove_attr
226
+ alias_method :remove_attribute, :remove_attr
197
227
 
198
228
  ###
199
229
  # Iterate over each node, yielding to +block+
200
- def each(&block)
230
+ def each
201
231
  return to_enum unless block_given?
202
232
 
203
233
  0.upto(length - 1) do |x|
204
234
  yield self[x]
205
235
  end
236
+ self
206
237
  end
207
238
 
208
239
  ###
@@ -219,25 +250,20 @@ module Nokogiri
219
250
  #
220
251
  # See Nokogiri::XML::Node#content for more information.
221
252
  def inner_text
222
- collect(&:inner_text).join('')
253
+ collect(&:inner_text).join("")
223
254
  end
224
- alias :text :inner_text
255
+ alias_method :text, :inner_text
225
256
 
226
257
  ###
227
258
  # Get the inner html of all contained Node objects
228
- def inner_html *args
229
- collect{|j| j.inner_html(*args) }.join('')
259
+ def inner_html(*args)
260
+ collect { |j| j.inner_html(*args) }.join("")
230
261
  end
231
262
 
232
263
  ###
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
240
- self
264
+ # Wrap this NodeSet with +html+
265
+ def wrap(html)
266
+ map { |node| node.wrap(html) }
241
267
  end
242
268
 
243
269
  ###
@@ -248,10 +274,10 @@ module Nokogiri
248
274
 
249
275
  ###
250
276
  # Convert this NodeSet to HTML
251
- def to_html *args
277
+ def to_html(*args)
252
278
  if Nokogiri.jruby?
253
279
  options = args.first.is_a?(Hash) ? args.shift : {}
254
- if !options[:save_with]
280
+ unless options[:save_with]
255
281
  options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
256
282
  end
257
283
  args.insert(0, options)
@@ -261,25 +287,26 @@ module Nokogiri
261
287
 
262
288
  ###
263
289
  # Convert this NodeSet to XHTML
264
- def to_xhtml *args
290
+ def to_xhtml(*args)
265
291
  map { |x| x.to_xhtml(*args) }.join
266
292
  end
267
293
 
268
294
  ###
269
295
  # Convert this NodeSet to XML
270
- def to_xml *args
296
+ def to_xml(*args)
271
297
  map { |x| x.to_xml(*args) }.join
272
298
  end
273
299
 
274
- alias :size :length
275
- alias :to_ary :to_a
300
+ alias_method :size, :length
301
+ alias_method :to_ary, :to_a
276
302
 
277
303
  ###
278
304
  # Removes the last element from set and returns it, or +nil+ if
279
305
  # the set is empty
280
306
  def pop
281
307
  return nil if length == 0
282
- delete last
308
+
309
+ delete(last)
283
310
  end
284
311
 
285
312
  ###
@@ -287,16 +314,18 @@ module Nokogiri
287
314
  # +nil+ if the set is empty.
288
315
  def shift
289
316
  return nil if length == 0
290
- delete first
317
+
318
+ delete(first)
291
319
  end
292
320
 
293
321
  ###
294
322
  # Equality -- Two NodeSets are equal if the contain the same number
295
323
  # of elements and if each element is equal to the corresponding
296
324
  # element in the other NodeSet
297
- def == other
325
+ def ==(other)
298
326
  return false unless other.is_a?(Nokogiri::XML::NodeSet)
299
327
  return false unless length == other.length
328
+
300
329
  each_with_index do |node, i|
301
330
  return false unless node == other[i]
302
331
  end
@@ -320,7 +349,7 @@ module Nokogiri
320
349
  def reverse
321
350
  node_set = NodeSet.new(document)
322
351
  (length - 1).downto(0) do |x|
323
- node_set.push self[x]
352
+ node_set.push(self[x])
324
353
  end
325
354
  node_set
326
355
  end
@@ -328,14 +357,12 @@ module Nokogiri
328
357
  ###
329
358
  # Return a nicely formated string representation
330
359
  def inspect
331
- "[#{map(&:inspect).join ', '}]"
360
+ "[#{map(&:inspect).join(", ")}]"
332
361
  end
333
362
 
334
- alias :+ :|
335
-
336
- # @private
337
- IMPLIED_XPATH_CONTEXTS = [ './/'.freeze, 'self::'.freeze ].freeze # :nodoc:
363
+ alias_method :+, :|
338
364
 
365
+ IMPLIED_XPATH_CONTEXTS = [".//", "self::"].freeze # :nodoc:
339
366
  end
340
367
  end
341
368
  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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -5,11 +7,11 @@ module Nokogiri
5
7
  #
6
8
  # == Building combinations of parse options
7
9
  # You can build your own combinations of these parse options by using any of the following methods:
8
- # *Note*: All examples attempt to set the +RECOVER+ & +NOENT+ options. All examples use Ruby 2 optional parameter syntax.
10
+ # *Note*: All examples attempt to set the +RECOVER+ & +NOENT+ options.
9
11
  # [Ruby's bitwise operators] You can use the Ruby bitwise operators to set various combinations.
10
- # Nokogiri.XML('<content>Chapter 1</content', options: Nokogiri::XML::ParseOptions.new((1 << 0) | (1 << 1)))
12
+ # Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new((1 << 0) | (1 << 1)))
11
13
  # [Method chaining] Every option has an equivalent method in lowercase. You can chain these methods together to set various combinations.
12
- # Nokogiri.XML('<content>Chapter 1</content', options: Nokogiri::XML::ParseOptions.new.recover.noent)
14
+ # Nokogiri.XML('<content>Chapter 1</content', nil, nil, Nokogiri::XML::ParseOptions.new.recover.noent)
13
15
  # [Using Ruby Blocks] You can also setup parse combinations in the block passed to Nokogiri.XML or Nokogiri.HTML
14
16
  # Nokogiri.XML('<content>Chapter 1</content') {|config| config.recover.noent}
15
17
  #
@@ -67,19 +69,27 @@ module Nokogiri
67
69
  NOBASEFIX = 1 << 18
68
70
  # relax any hardcoded limit from the parser
69
71
  HUGE = 1 << 19
72
+ # line numbers stored as long int (instead of a short int)
73
+ BIG_LINES = 1 << 22
70
74
 
71
75
  # the default options used for parsing XML documents
72
- DEFAULT_XML = RECOVER | NONET
76
+ DEFAULT_XML = RECOVER | NONET | BIG_LINES
77
+ # the default options used for parsing XSLT stylesheets
78
+ DEFAULT_XSLT = RECOVER | NONET | NOENT | DTDLOAD | DTDATTR | NOCDATA | BIG_LINES
73
79
  # the default options used for parsing HTML documents
74
- DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET
80
+ DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET | BIG_LINES
81
+ # the default options used for parsing XML schemas
82
+ DEFAULT_SCHEMA = NONET | BIG_LINES
75
83
 
76
84
  attr_accessor :options
77
- def initialize options = STRICT
85
+
86
+ def initialize(options = STRICT)
78
87
  @options = options
79
88
  end
80
89
 
81
90
  constants.each do |constant|
82
91
  next if constant.to_sym == :STRICT
92
+
83
93
  class_eval %{
84
94
  def #{constant.downcase}
85
95
  @options |= #{constant}
@@ -106,14 +116,18 @@ module Nokogiri
106
116
  @options & RECOVER == STRICT
107
117
  end
108
118
 
109
- alias :to_i :options
119
+ def ==(other)
120
+ other.to_i == to_i
121
+ end
122
+
123
+ alias_method :to_i, :options
110
124
 
111
125
  def inspect
112
126
  options = []
113
127
  self.class.constants.each do |k|
114
128
  options << k.downcase if send(:"#{k.downcase}?")
115
129
  end
116
- super.sub(/>$/, " " + options.join(', ') + ">")
130
+ super.sub(/>$/, " " + options.join(", ") + ">")
117
131
  end
118
132
  end
119
133
  end
@@ -1,16 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
5
+ # :nodoc: all
3
6
  module PP
4
7
  module CharacterData
5
- def pretty_print pp # :nodoc:
6
- nice_name = self.class.name.split('::').last
7
- pp.group(2, "#(#{nice_name} ", ')') do
8
- pp.pp text
8
+ def pretty_print(pp)
9
+ nice_name = self.class.name.split("::").last
10
+ pp.group(2, "#(#{nice_name} ", ")") do
11
+ pp.pp(text)
9
12
  end
10
13
  end
11
14
 
12
- def inspect # :nodoc:
13
- "#<#{self.class.name}:#{sprintf("0x%x",object_id)} #{text.inspect}>"
15
+ def inspect
16
+ "#<#{self.class.name}:#{format("0x%x", object_id)} #{text.inspect}>"
14
17
  end
15
18
  end
16
19
  end
@@ -1,53 +1,52 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
5
+ # :nodoc: all
3
6
  module PP
4
7
  module Node
5
- def inspect # :nodoc:
6
- attributes = inspect_attributes.reject { |x|
7
- begin
8
- attribute = send x
9
- !attribute || (attribute.respond_to?(:empty?) && attribute.empty?)
10
- rescue NoMethodError
11
- true
12
- end
13
- }.map { |attribute|
14
- "#{attribute.to_s.sub(/_\w+/, 's')}=#{send(attribute).inspect}"
15
- }.join ' '
16
- "#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{attributes}>"
8
+ def inspect
9
+ attributes = inspect_attributes.reject do |x|
10
+ attribute = send(x)
11
+ !attribute || (attribute.respond_to?(:empty?) && attribute.empty?)
12
+ rescue NoMethodError
13
+ true
14
+ end.map do |attribute|
15
+ "#{attribute.to_s.sub(/_\w+/, "s")}=#{send(attribute).inspect}"
16
+ end.join(" ")
17
+ "#<#{self.class.name}:#{format("0x%x", object_id)} #{attributes}>"
17
18
  end
18
19
 
19
- def pretty_print pp # :nodoc:
20
- nice_name = self.class.name.split('::').last
21
- pp.group(2, "#(#{nice_name}:#{sprintf("0x%x", object_id)} {", '})') do
22
-
20
+ def pretty_print(pp)
21
+ nice_name = self.class.name.split("::").last
22
+ pp.group(2, "#(#{nice_name}:#{format("0x%x", object_id)} {", "})") do
23
23
  pp.breakable
24
- attrs = inspect_attributes.map { |t|
24
+ attrs = inspect_attributes.map do |t|
25
25
  [t, send(t)] if respond_to?(t)
26
- }.compact.find_all { |x|
26
+ end.compact.find_all do |x|
27
27
  if x.last
28
- if [:attribute_nodes, :children].include? x.first
28
+ if [:attribute_nodes, :children].include?(x.first)
29
29
  !x.last.empty?
30
30
  else
31
31
  true
32
32
  end
33
33
  end
34
- }
34
+ end
35
35
 
36
36
  pp.seplist(attrs) do |v|
37
- if [:attribute_nodes, :children].include? v.first
38
- pp.group(2, "#{v.first.to_s.sub(/_\w+$/, 's')} = [", "]") do
37
+ if [:attribute_nodes, :children].include?(v.first)
38
+ pp.group(2, "#{v.first.to_s.sub(/_\w+$/, "s")} = [", "]") do
39
39
  pp.breakable
40
40
  pp.seplist(v.last) do |item|
41
- pp.pp item
41
+ pp.pp(item)
42
42
  end
43
43
  end
44
44
  else
45
- pp.text "#{v.first} = "
46
- pp.pp v.last
45
+ pp.text("#{v.first} = ")
46
+ pp.pp(v.last)
47
47
  end
48
48
  end
49
49
  pp.breakable
50
-
51
50
  end
52
51
  end
53
52
  end
@@ -1,2 +1,4 @@
1
- require 'nokogiri/xml/pp/node'
2
- require 'nokogiri/xml/pp/character_data'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "pp/node"
4
+ require_relative "pp/character_data"
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  class ProcessingInstruction < Node
4
- def initialize document, name, content
6
+ def initialize(document, name, content) # rubocop:disable Style/RedundantInitialize
5
7
  end
6
8
  end
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ###
@@ -7,18 +9,18 @@ module Nokogiri
7
9
  #
8
10
  # Here is an example of usage:
9
11
  #
10
- # reader = Nokogiri::XML::Reader(<<-eoxml)
11
- # <x xmlns:tenderlove='http://tenderlovemaking.com/'>
12
- # <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
13
- # </x>
14
- # eoxml
12
+ # reader = Nokogiri::XML::Reader(<<-eoxml)
13
+ # <x xmlns:tenderlove='http://tenderlovemaking.com/'>
14
+ # <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
15
+ # </x>
16
+ # eoxml
15
17
  #
16
- # reader.each do |node|
18
+ # reader.each do |node|
17
19
  #
18
- # # node is an instance of Nokogiri::XML::Reader
19
- # puts node.name
20
+ # # node is an instance of Nokogiri::XML::Reader
21
+ # puts node.name
20
22
  #
21
- # end
23
+ # end
22
24
  #
23
25
  # Note that Nokogiri::XML::Reader#each can only be called once!! Once
24
26
  # the cursor moves through the entire document, you must parse the
@@ -69,41 +71,34 @@ module Nokogiri
69
71
  # A list of errors encountered while parsing
70
72
  attr_accessor :errors
71
73
 
72
- # The encoding for the document
73
- attr_reader :encoding
74
-
75
74
  # The XML source
76
75
  attr_reader :source
77
76
 
78
- alias :self_closing? :empty_element?
77
+ alias_method :self_closing?, :empty_element?
79
78
 
80
- def initialize source, url = nil, encoding = nil # :nodoc:
79
+ def initialize(source, url = nil, encoding = nil) # :nodoc:
81
80
  @source = source
82
81
  @errors = []
83
82
  @encoding = encoding
84
83
  end
85
84
  private :initialize
86
85
 
87
- ###
88
- # Get a list of attributes for the current node.
86
+ # Get the attributes of the current node as a Hash
87
+ #
88
+ # [Returns] (Hash<String, String>) Attribute names and values
89
89
  def attributes
90
- Hash[attribute_nodes.map { |node|
91
- [node.name, node.to_s]
92
- }].merge(namespaces || {})
93
- end
94
-
95
- ###
96
- # Get a list of attributes for the current node
97
- def attribute_nodes
98
- nodes = attr_nodes
99
- nodes.each { |v| v.instance_variable_set(:@_r, self) }
100
- nodes
90
+ attrs_hash = attribute_nodes.each_with_object({}) do |node, hash|
91
+ hash[node.name] = node.to_s
92
+ end
93
+ ns = namespaces
94
+ attrs_hash.merge!(ns) if ns
95
+ attrs_hash
101
96
  end
102
97
 
103
98
  ###
104
99
  # Move the cursor through the document yielding the cursor to the block
105
100
  def each
106
- while cursor = self.read
101
+ while (cursor = read)
107
102
  yield cursor
108
103
  end
109
104
  end