nokogiri 1.6.8.1 → 1.13.4

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 (354) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +3 -20
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +197 -83
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +16 -22
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +751 -432
  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 +120 -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 -95
  18. data/ext/nokogiri/nokogiri.h +190 -98
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +49 -40
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +24 -23
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -217
  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 -58
  33. data/ext/nokogiri/xml_node.c +1194 -729
  34. data/ext/nokogiri/xml_node_set.c +178 -165
  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 +115 -114
  39. data/ext/nokogiri/xml_sax_parser_context.c +105 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +88 -35
  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 +410 -372
  94. data/lib/nokogiri/css/parser.y +260 -244
  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 +7 -6
  99. data/lib/nokogiri/css/xpath_visitor.rb +226 -92
  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 +104 -106
  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 +24 -13
  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 -107
  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 +231 -93
  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 +20 -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 +911 -337
  139. data/lib/nokogiri/xml/node_set.rb +141 -84
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +23 -9
  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 +43 -40
  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 +138 -89
  155. data/lib/nokogiri/xml/syntax_error.rb +26 -1
  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 +39 -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/libxml2/0010-Revert-Different-approach-to-fix-quadratic-behavior.patch +45 -0
  174. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  175. data/ports/archives/libxml2-2.9.13.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  177. metadata +233 -258
  178. data/.autotest +0 -26
  179. data/.cross_rubies +0 -9
  180. data/.editorconfig +0 -17
  181. data/.gemtest +0 -0
  182. data/.travis.yml +0 -51
  183. data/CHANGELOG.rdoc +0 -1160
  184. data/CONTRIBUTING.md +0 -42
  185. data/C_CODING_STYLE.rdoc +0 -33
  186. data/LICENSE.txt +0 -31
  187. data/Manifest.txt +0 -364
  188. data/ROADMAP.md +0 -111
  189. data/Rakefile +0 -375
  190. data/STANDARD_RESPONSES.md +0 -47
  191. data/Y_U_NO_GEMSPEC.md +0 -155
  192. data/appveyor.yml +0 -22
  193. data/build_all +0 -45
  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 -60
  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 -13
  221. data/ext/nokogiri/xml_node.h +0 -13
  222. data/ext/nokogiri/xml_node_set.h +0 -13
  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 -39
  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/sort-patches-by-date +0 -25
  238. data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
  239. data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
  240. data/suppressions/README.txt +0 -1
  241. data/suppressions/nokogiri_ree-1.8.7.358.supp +0 -61
  242. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  243. data/suppressions/nokogiri_ruby-1.9.2.320.supp +0 -28
  244. data/suppressions/nokogiri_ruby-1.9.3.327.supp +0 -28
  245. data/tasks/test.rb +0 -100
  246. data/test/css/test_nthiness.rb +0 -226
  247. data/test/css/test_parser.rb +0 -369
  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 -20
  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 -181
  289. data/test/html/sax/test_parser.rb +0 -141
  290. data/test/html/sax/test_parser_context.rb +0 -46
  291. data/test/html/sax/test_push_parser.rb +0 -87
  292. data/test/html/test_builder.rb +0 -164
  293. data/test/html/test_document.rb +0 -701
  294. data/test/html/test_document_encoding.rb +0 -145
  295. data/test/html/test_document_fragment.rb +0 -301
  296. data/test/html/test_element_description.rb +0 -105
  297. data/test/html/test_named_characters.rb +0 -14
  298. data/test/html/test_node.rb +0 -212
  299. data/test/html/test_node_encoding.rb +0 -85
  300. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  301. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  302. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  303. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  304. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  305. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  306. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  307. data/test/test_convert_xpath.rb +0 -135
  308. data/test/test_css_cache.rb +0 -45
  309. data/test/test_encoding_handler.rb +0 -48
  310. data/test/test_memory_leak.rb +0 -156
  311. data/test/test_nokogiri.rb +0 -138
  312. data/test/test_soap4r_sax.rb +0 -52
  313. data/test/test_xslt_transforms.rb +0 -314
  314. data/test/xml/node/test_save_options.rb +0 -28
  315. data/test/xml/node/test_subclass.rb +0 -44
  316. data/test/xml/sax/test_parser.rb +0 -394
  317. data/test/xml/sax/test_parser_context.rb +0 -115
  318. data/test/xml/sax/test_push_parser.rb +0 -157
  319. data/test/xml/test_attr.rb +0 -67
  320. data/test/xml/test_attribute_decl.rb +0 -86
  321. data/test/xml/test_builder.rb +0 -341
  322. data/test/xml/test_c14n.rb +0 -180
  323. data/test/xml/test_cdata.rb +0 -48
  324. data/test/xml/test_comment.rb +0 -40
  325. data/test/xml/test_document.rb +0 -982
  326. data/test/xml/test_document_encoding.rb +0 -31
  327. data/test/xml/test_document_fragment.rb +0 -271
  328. data/test/xml/test_dtd.rb +0 -187
  329. data/test/xml/test_dtd_encoding.rb +0 -31
  330. data/test/xml/test_element_content.rb +0 -56
  331. data/test/xml/test_element_decl.rb +0 -73
  332. data/test/xml/test_entity_decl.rb +0 -122
  333. data/test/xml/test_entity_reference.rb +0 -251
  334. data/test/xml/test_namespace.rb +0 -96
  335. data/test/xml/test_node.rb +0 -1244
  336. data/test/xml/test_node_attributes.rb +0 -115
  337. data/test/xml/test_node_encoding.rb +0 -69
  338. data/test/xml/test_node_inheritance.rb +0 -32
  339. data/test/xml/test_node_reparenting.rb +0 -549
  340. data/test/xml/test_node_set.rb +0 -775
  341. data/test/xml/test_parse_options.rb +0 -64
  342. data/test/xml/test_processing_instruction.rb +0 -30
  343. data/test/xml/test_reader.rb +0 -589
  344. data/test/xml/test_reader_encoding.rb +0 -134
  345. data/test/xml/test_relax_ng.rb +0 -60
  346. data/test/xml/test_schema.rb +0 -142
  347. data/test/xml/test_syntax_error.rb +0 -30
  348. data/test/xml/test_text.rb +0 -60
  349. data/test/xml/test_unparented_node.rb +0 -440
  350. data/test/xml/test_xinclude.rb +0 -83
  351. data/test/xml/test_xpath.rb +0 -445
  352. data/test/xslt/test_custom_functions.rb +0 -133
  353. data/test/xslt/test_exception_handling.rb +0 -37
  354. data/test_all +0 -107
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Nokogiri
2
4
  module XML
3
5
  ####
@@ -11,8 +13,10 @@ module Nokogiri
11
13
  # The Document this NodeSet is associated with
12
14
  attr_accessor :document
13
15
 
16
+ alias_method :clone, :dup
17
+
14
18
  # Create a NodeSet with +document+ defaulting to +list+
15
- def initialize document, list = []
19
+ def initialize(document, list = [])
16
20
  @document = document
17
21
  document.decorate(self)
18
22
  list.each { |x| self << x }
@@ -21,10 +25,11 @@ module Nokogiri
21
25
 
22
26
  ###
23
27
  # Get the first element of the NodeSet.
24
- def first n = nil
28
+ def first(n = nil)
25
29
  return self[0] unless n
30
+
26
31
  list = []
27
- n.times { |i| list << self[i] }
32
+ [n, length].min.times { |i| list << self[i] }
28
33
  list
29
34
  end
30
35
 
@@ -41,26 +46,31 @@ module Nokogiri
41
46
  end
42
47
 
43
48
  ###
44
- # Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
45
- def index(node)
46
- each_with_index { |member, j| return j if member == node }
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.
50
+ def index(node = nil)
51
+ if node
52
+ warn("given block not used") if block_given?
53
+ each_with_index { |member, j| return j if member == node }
54
+ elsif block_given?
55
+ each_with_index { |member, j| return j if yield(member) }
56
+ end
47
57
  nil
48
58
  end
49
59
 
50
60
  ###
51
61
  # Insert +datum+ before the first Node in this NodeSet
52
- def before datum
53
- first.before datum
62
+ def before(datum)
63
+ first.before(datum)
54
64
  end
55
65
 
56
66
  ###
57
67
  # Insert +datum+ after the last Node in this NodeSet
58
- def after datum
59
- last.after datum
68
+ def after(datum)
69
+ last.after(datum)
60
70
  end
61
71
 
62
- alias :<< :push
63
- alias :remove :unlink
72
+ alias_method :<<, :push
73
+ alias_method :remove, :unlink
64
74
 
65
75
  ###
66
76
  # call-seq: css *rules, [namespace-bindings, custom-pseudo-class]
@@ -69,11 +79,12 @@ module Nokogiri
69
79
  # selectors. For example:
70
80
  #
71
81
  # For more information see Nokogiri::XML::Searchable#css
72
- def css *args
82
+ def css(*args)
73
83
  rules, handler, ns, _ = extract_params(args)
84
+ paths = css_rules_to_xpath(rules, ns)
74
85
 
75
86
  inject(NodeSet.new(document)) do |set, node|
76
- set += css_internal node, rules, handler, ns
87
+ set + xpath_internal(node, paths, handler, ns, nil)
77
88
  end
78
89
  end
79
90
 
@@ -84,21 +95,14 @@ module Nokogiri
84
95
  # queries.
85
96
  #
86
97
  # For more information see Nokogiri::XML::Searchable#xpath
87
- def xpath *args
98
+ def xpath(*args)
88
99
  paths, handler, ns, binds = extract_params(args)
89
100
 
90
101
  inject(NodeSet.new(document)) do |set, node|
91
- set += node.xpath(*(paths + [ns, handler, binds].compact))
102
+ set + xpath_internal(node, paths, handler, ns, binds)
92
103
  end
93
104
  end
94
105
 
95
- ###
96
- # Search this NodeSet's nodes' immediate children using CSS selector +selector+
97
- def > selector
98
- ns = document.root.namespaces
99
- xpath CSS.xpath_for(selector, :prefix => "./", :ns => ns).first
100
- end
101
-
102
106
  ###
103
107
  # call-seq: search *paths, [namespace-bindings, xpath-variable-bindings, custom-handler-class]
104
108
  #
@@ -111,105 +115,155 @@ module Nokogiri
111
115
  #
112
116
  # node_set.at(3) # same as node_set[3]
113
117
  #
114
- def at *args
118
+ def at(*args)
115
119
  if args.length == 1 && args.first.is_a?(Numeric)
116
120
  return self[args.first]
117
121
  end
118
122
 
119
123
  super(*args)
120
124
  end
121
- alias :% :at
125
+ alias_method :%, :at
122
126
 
123
127
  ###
124
128
  # Filter this list for nodes that match +expr+
125
- def filter expr
129
+ def filter(expr)
126
130
  find_all { |node| node.matches?(expr) }
127
131
  end
128
132
 
129
133
  ###
130
- # Append the class attribute +name+ to all Node objects in the NodeSet.
131
- def add_class name
134
+ # Add the class attribute +name+ to all Node objects in the
135
+ # NodeSet.
136
+ #
137
+ # See Nokogiri::XML::Node#add_class for more information.
138
+ def add_class(name)
132
139
  each do |el|
133
- classes = el['class'].to_s.split(/\s+/)
134
- el['class'] = classes.push(name).uniq.join " "
140
+ el.add_class(name)
135
141
  end
136
142
  self
137
143
  end
138
144
 
139
145
  ###
140
- # Remove the class attribute +name+ from all Node objects in the NodeSet.
141
- # If +name+ is nil, remove the class attribute from all Nodes in the
146
+ # Append the class attribute +name+ to all Node objects in the
142
147
  # NodeSet.
143
- def remove_class name = nil
148
+ #
149
+ # See Nokogiri::XML::Node#append_class for more information.
150
+ def append_class(name)
144
151
  each do |el|
145
- if name
146
- classes = el['class'].to_s.split(/\s+/)
147
- if classes.empty?
148
- el.delete 'class'
149
- else
150
- el['class'] = (classes - [name]).uniq.join " "
151
- end
152
- else
153
- el.delete "class"
154
- end
152
+ el.append_class(name)
155
153
  end
156
154
  self
157
155
  end
158
156
 
159
157
  ###
160
- # Set the attribute +key+ to +value+ or the return value of +blk+
161
- # on all Node objects in the NodeSet.
162
- def attr key, value = nil, &blk
163
- unless Hash === key || key && (value || blk)
164
- return first.attribute(key)
158
+ # Remove the class attribute +name+ from all Node objects in the
159
+ # NodeSet.
160
+ #
161
+ # See Nokogiri::XML::Node#remove_class for more information.
162
+ def remove_class(name = nil)
163
+ each do |el|
164
+ el.remove_class(name)
165
+ end
166
+ self
167
+ end
168
+
169
+ ###
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
165
205
  end
166
206
 
167
207
  hash = key.is_a?(Hash) ? key : { key => value }
168
208
 
169
- 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
170
214
 
171
215
  self
172
216
  end
173
- alias :set :attr
174
- alias :attribute :attr
217
+ alias_method :set, :attr
218
+ alias_method :attribute, :attr
175
219
 
176
220
  ###
177
221
  # Remove the attributed named +name+ from all Node objects in the NodeSet
178
- def remove_attr name
179
- each { |el| el.delete name }
222
+ def remove_attr(name)
223
+ each { |el| el.delete(name) }
180
224
  self
181
225
  end
226
+ alias_method :remove_attribute, :remove_attr
182
227
 
183
228
  ###
184
229
  # Iterate over each node, yielding to +block+
185
- def each(&block)
230
+ def each
231
+ return to_enum unless block_given?
232
+
186
233
  0.upto(length - 1) do |x|
187
234
  yield self[x]
188
235
  end
236
+ self
189
237
  end
190
238
 
191
239
  ###
192
240
  # Get the inner text of all contained Node objects
241
+ #
242
+ # Note: This joins the text of all Node objects in the NodeSet:
243
+ #
244
+ # doc = Nokogiri::XML('<xml><a><d>foo</d><d>bar</d></a></xml>')
245
+ # doc.css('d').text # => "foobar"
246
+ #
247
+ # Instead, if you want to return the text of all nodes in the NodeSet:
248
+ #
249
+ # doc.css('d').map(&:text) # => ["foo", "bar"]
250
+ #
251
+ # See Nokogiri::XML::Node#content for more information.
193
252
  def inner_text
194
- collect(&:inner_text).join('')
253
+ collect(&:inner_text).join("")
195
254
  end
196
- alias :text :inner_text
255
+ alias_method :text, :inner_text
197
256
 
198
257
  ###
199
258
  # Get the inner html of all contained Node objects
200
- def inner_html *args
201
- collect{|j| j.inner_html(*args) }.join('')
259
+ def inner_html(*args)
260
+ collect { |j| j.inner_html(*args) }.join("")
202
261
  end
203
262
 
204
263
  ###
205
- # Wrap this NodeSet with +html+ or the results of the builder in +blk+
206
- def wrap(html, &blk)
207
- each do |j|
208
- new_parent = document.parse(html).first
209
- j.add_next_sibling(new_parent)
210
- new_parent.add_child(j)
211
- end
212
- self
264
+ # Wrap this NodeSet with +html+
265
+ def wrap(html)
266
+ map { |node| node.wrap(html) }
213
267
  end
214
268
 
215
269
  ###
@@ -220,10 +274,10 @@ module Nokogiri
220
274
 
221
275
  ###
222
276
  # Convert this NodeSet to HTML
223
- def to_html *args
277
+ def to_html(*args)
224
278
  if Nokogiri.jruby?
225
279
  options = args.first.is_a?(Hash) ? args.shift : {}
226
- if !options[:save_with]
280
+ unless options[:save_with]
227
281
  options[:save_with] = Node::SaveOptions::NO_DECLARATION | Node::SaveOptions::NO_EMPTY_TAGS | Node::SaveOptions::AS_HTML
228
282
  end
229
283
  args.insert(0, options)
@@ -233,25 +287,26 @@ module Nokogiri
233
287
 
234
288
  ###
235
289
  # Convert this NodeSet to XHTML
236
- def to_xhtml *args
290
+ def to_xhtml(*args)
237
291
  map { |x| x.to_xhtml(*args) }.join
238
292
  end
239
293
 
240
294
  ###
241
295
  # Convert this NodeSet to XML
242
- def to_xml *args
296
+ def to_xml(*args)
243
297
  map { |x| x.to_xml(*args) }.join
244
298
  end
245
299
 
246
- alias :size :length
247
- alias :to_ary :to_a
300
+ alias_method :size, :length
301
+ alias_method :to_ary, :to_a
248
302
 
249
303
  ###
250
304
  # Removes the last element from set and returns it, or +nil+ if
251
305
  # the set is empty
252
306
  def pop
253
307
  return nil if length == 0
254
- delete last
308
+
309
+ delete(last)
255
310
  end
256
311
 
257
312
  ###
@@ -259,16 +314,18 @@ module Nokogiri
259
314
  # +nil+ if the set is empty.
260
315
  def shift
261
316
  return nil if length == 0
262
- delete first
317
+
318
+ delete(first)
263
319
  end
264
320
 
265
321
  ###
266
322
  # Equality -- Two NodeSets are equal if the contain the same number
267
323
  # of elements and if each element is equal to the corresponding
268
324
  # element in the other NodeSet
269
- def == other
325
+ def ==(other)
270
326
  return false unless other.is_a?(Nokogiri::XML::NodeSet)
271
327
  return false unless length == other.length
328
+
272
329
  each_with_index do |node, i|
273
330
  return false unless node == other[i]
274
331
  end
@@ -279,7 +336,11 @@ module Nokogiri
279
336
  # Returns a new NodeSet containing all the children of all the nodes in
280
337
  # the NodeSet
281
338
  def children
282
- inject(NodeSet.new(document)) { |set, node| set += node.children }
339
+ node_set = NodeSet.new(document)
340
+ each do |node|
341
+ node.children.each { |n| node_set.push(n) }
342
+ end
343
+ node_set
283
344
  end
284
345
 
285
346
  ###
@@ -288,7 +349,7 @@ module Nokogiri
288
349
  def reverse
289
350
  node_set = NodeSet.new(document)
290
351
  (length - 1).downto(0) do |x|
291
- node_set.push self[x]
352
+ node_set.push(self[x])
292
353
  end
293
354
  node_set
294
355
  end
@@ -296,16 +357,12 @@ module Nokogiri
296
357
  ###
297
358
  # Return a nicely formated string representation
298
359
  def inspect
299
- "[#{map(&:inspect).join ', '}]"
360
+ "[#{map(&:inspect).join(", ")}]"
300
361
  end
301
362
 
302
- alias :+ :|
303
-
304
- private
363
+ alias_method :+, :|
305
364
 
306
- def implied_xpath_contexts # :nodoc:
307
- [".//", "self::"]
308
- end
365
+ IMPLIED_XPATH_CONTEXTS = [".//", "self::"].freeze # :nodoc:
309
366
  end
310
367
  end
311
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,13 +7,13 @@ 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
- # <code>Nokogiri.XML('<content>Chapter 1</content', options: Nokogiri::XML::ParseOptions.new((1 << 0) | (1 << 1)))</code>
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
- # <code>Nokogiri.XML('<content>Chapter 1</content', options: Nokogiri::XML::ParseOptions.new.recover.noent)</code>
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
- # <code>Nokogiri.XML('<content>Chapter 1</content') {|config| config.recover.noent}</code>
16
+ # Nokogiri.XML('<content>Chapter 1</content') {|config| config.recover.noent}
15
17
  #
16
18
  # == Removing particular parse options
17
19
  # You can also remove options from an instance of +ParseOptions+ dynamically.
@@ -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