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,445 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestXPath < Nokogiri::TestCase
6
-
7
- # ** WHY ALL THOSE _if Nokogiri.uses_libxml?_ **
8
- # Hi, my dear readers,
9
- #
10
- # After reading these tests you may be wondering why all those ugly
11
- # if Nokogiri.uses_libxml? sparsed over the whole document. Well, let
12
- # me explain it. While using XPath in Java, you need the extension
13
- # functions to be in a namespace. This is not required by XPath, afaik,
14
- # but it is an usual convention though.
15
- #
16
- # Yours truly,
17
- #
18
- # The guy whose headaches belong to Nokogiri JRuby impl.
19
-
20
-
21
- def setup
22
- super
23
-
24
- @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
25
-
26
- @ns = @xml.root.namespaces
27
-
28
- # TODO: Maybe I should move this to the original code.
29
- @ns["nokogiri"] = "http://www.nokogiri.org/default_ns/ruby/extensions_functions"
30
-
31
- @handler = Class.new {
32
- attr_reader :things
33
-
34
- def initialize
35
- @things = []
36
- end
37
-
38
- def thing thing
39
- @things << thing
40
- thing
41
- end
42
-
43
- def returns_array node_set
44
- @things << node_set.to_a
45
- node_set.to_a
46
- end
47
-
48
- def my_filter set, attribute, value
49
- set.find_all { |x| x[attribute] == value }
50
- end
51
-
52
- def saves_node_set node_set
53
- @things = node_set
54
- end
55
-
56
- def value
57
- 123.456
58
- end
59
- }.new
60
- end
61
-
62
- def test_variable_binding
63
- assert_equal 4, @xml.xpath('//address[@domestic=$value]', nil, :value => 'Yes').length
64
- end
65
-
66
- def test_variable_binding_with_search
67
- assert_equal 4, @xml.search('//address[@domestic=$value]', nil, :value => 'Yes').length
68
- end
69
-
70
- def test_unknown_attribute
71
- assert_equal 0, @xml.xpath('//employee[@id="asdfasdf"]/@fooo').length
72
- assert_nil @xml.xpath('//employee[@id="asdfasdf"]/@fooo')[0]
73
- end
74
-
75
- def test_boolean
76
- assert_equal false, @xml.xpath('1 = 2')
77
- end
78
-
79
- def test_number
80
- assert_equal 2, @xml.xpath('1 + 1')
81
- end
82
-
83
- def test_string
84
- assert_equal 'foo', @xml.xpath('concat("fo", "o")')
85
- end
86
-
87
- def test_node_search_with_multiple_queries
88
- xml = '<document>
89
- <thing>
90
- <div class="title">important thing</div>
91
- </thing>
92
- <thing>
93
- <div class="content">stuff</div>
94
- </thing>
95
- <thing>
96
- <p class="blah">more stuff</div>
97
- </thing>
98
- </document>'
99
- node = Nokogiri::XML(xml).root
100
- assert_kind_of Nokogiri::XML::Node, node
101
-
102
- assert_equal 3, node.xpath('.//div', './/p').length
103
- assert_equal 3, node.css('.title', '.content', 'p').length
104
- assert_equal 3, node.search('.//div', 'p.blah').length
105
- end
106
-
107
- def test_css_search_uses_custom_selectors_with_arguments
108
- set = @xml.css('employee > address:my_filter("domestic", "Yes")', @handler)
109
- assert set.length > 0
110
- set.each do |node|
111
- assert_equal 'Yes', node['domestic']
112
- end
113
- end
114
-
115
- def test_css_search_uses_custom_selectors
116
- set = @xml.xpath('//employee')
117
- @xml.css('employee:thing()', @handler)
118
- assert_equal(set.length, @handler.things.length)
119
- assert_equal(set.to_a, @handler.things.flatten)
120
- end
121
-
122
- def test_search_with_css_query_uses_custom_selectors_with_arguments
123
- set = @xml.search('employee > address:my_filter("domestic", "Yes")', @handler)
124
- assert set.length > 0
125
- set.each do |node|
126
- assert_equal 'Yes', node['domestic']
127
- end
128
- end
129
-
130
- def test_search_with_xpath_query_uses_custom_selectors_with_arguments
131
- set = if Nokogiri.uses_libxml?
132
- @xml.search('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
133
- else
134
- @xml.search('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
135
- end
136
- assert set.length > 0
137
- set.each do |node|
138
- assert_equal 'Yes', node['domestic']
139
- end
140
- end
141
-
142
- def test_pass_self_to_function
143
- set = if Nokogiri.uses_libxml?
144
- @xml.xpath('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
145
- else
146
- @xml.xpath('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
147
- end
148
- assert set.length > 0
149
- set.each do |node|
150
- assert_equal 'Yes', node['domestic']
151
- end
152
- end
153
-
154
- def test_custom_xpath_function_gets_strings
155
- set = @xml.xpath('//employee')
156
- if Nokogiri.uses_libxml?
157
- @xml.xpath('//employee[thing("asdf")]', @handler)
158
- else
159
- @xml.xpath('//employee[nokogiri:thing("asdf")]', @ns, @handler)
160
- end
161
- assert_equal(set.length, @handler.things.length)
162
- assert_equal(['asdf'] * set.length, @handler.things)
163
- end
164
-
165
- def parse_params node
166
- params={}
167
- node.xpath('./param').each do |p|
168
- subparams = parse_params p
169
- if(subparams.length > 0)
170
- if(not params.has_key? p.attributes['name'].value)
171
- params[p.attributes['name'].value] = subparams
172
- else
173
- if(params[p.attributes['name'].value].is_a? Array)
174
- params[p.attributes['name'].value] << subparams
175
- else
176
- value = params[p.attributes['name'].value]
177
- params[p.attributes['name'].value] = [value,subparams]
178
- end
179
- end
180
- else
181
- params[p.attributes['name'].value]=p.text
182
- end
183
- end
184
- params
185
- end
186
-
187
- # issue #741 (xpath() around 10x slower in JRuby)
188
- def test_slow_jruby_xpath
189
- skip("MRI will exceed this timeout when running under valgrind") unless Nokogiri.jruby?
190
-
191
- doc = Nokogiri::XML(File.open(XPATH_FILE))
192
- start = Time.now
193
-
194
- doc.xpath('.//category').each do |c|
195
- c.xpath('programformats/programformat').each do |p|
196
- p.xpath('./modules/module').each do |m|
197
- parse_params m
198
- end
199
- end
200
- end
201
- stop = Time.now
202
- elapsed_time = stop - start
203
- time_limit =
204
- if ENV['TRAVIS'] && ENV['CI']
205
- 20 # Travis CI box slowness
206
- else
207
- 10
208
- end
209
- assert_send [elapsed_time, :<, time_limit], "XPath is taking too long"
210
- end
211
-
212
- # issue #1109 (jruby impl's xpath() cache not being cleared on attr removal)
213
- def test_xpath_results_cache_should_get_cleared_on_attr_removal
214
- doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
215
- element = doc.at_xpath('//div[@name="foo"]')
216
- element.remove_attribute('name')
217
- assert_nil doc.at_xpath('//div[@name="foo"]')
218
- end
219
-
220
- # issue #1109 (jruby impl's xpath() cache not being cleared on attr update )
221
- def test_xpath_results_cache_should_get_cleared_on_attr_update
222
- doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
223
- element = doc.at_xpath('//div[@name="foo"]')
224
- element['name'] = 'bar'
225
- assert_nil doc.at_xpath('//div[@name="foo"]')
226
- end
227
-
228
- def test_custom_xpath_function_returns_string
229
- if Nokogiri.uses_libxml?
230
- result = @xml.xpath('thing("asdf")', @handler)
231
- else
232
- result = @xml.xpath('nokogiri:thing("asdf")', @ns, @handler)
233
- end
234
- assert_equal 'asdf', result
235
- end
236
-
237
- def test_custom_xpath_gets_true_booleans
238
- set = @xml.xpath('//employee')
239
- if Nokogiri.uses_libxml?
240
- @xml.xpath('//employee[thing(true())]', @handler)
241
- else
242
- @xml.xpath("//employee[nokogiri:thing(true())]", @ns, @handler)
243
- end
244
- assert_equal(set.length, @handler.things.length)
245
- assert_equal([true] * set.length, @handler.things)
246
- end
247
-
248
- def test_custom_xpath_gets_false_booleans
249
- set = @xml.xpath('//employee')
250
- if Nokogiri.uses_libxml?
251
- @xml.xpath('//employee[thing(false())]', @handler)
252
- else
253
- @xml.xpath("//employee[nokogiri:thing(false())]", @ns, @handler)
254
- end
255
- assert_equal(set.length, @handler.things.length)
256
- assert_equal([false] * set.length, @handler.things)
257
- end
258
-
259
- def test_custom_xpath_gets_numbers
260
- set = @xml.xpath('//employee')
261
- if Nokogiri.uses_libxml?
262
- @xml.xpath('//employee[thing(10)]', @handler)
263
- else
264
- @xml.xpath('//employee[nokogiri:thing(10)]', @ns, @handler)
265
- end
266
- assert_equal(set.length, @handler.things.length)
267
- assert_equal([10] * set.length, @handler.things)
268
- end
269
-
270
- def test_custom_xpath_gets_node_sets
271
- set = @xml.xpath('//employee/name')
272
- if Nokogiri.uses_libxml?
273
- @xml.xpath('//employee[thing(name)]', @handler)
274
- else
275
- @xml.xpath('//employee[nokogiri:thing(name)]', @ns, @handler)
276
- end
277
- assert_equal(set.length, @handler.things.length)
278
- assert_equal(set.to_a, @handler.things.flatten)
279
- end
280
-
281
- def test_custom_xpath_gets_node_sets_and_returns_array
282
- set = @xml.xpath('//employee/name')
283
- if Nokogiri.uses_libxml?
284
- @xml.xpath('//employee[returns_array(name)]', @handler)
285
- else
286
- @xml.xpath('//employee[nokogiri:returns_array(name)]', @ns, @handler)
287
- end
288
- assert_equal(set.length, @handler.things.length)
289
- assert_equal(set.to_a, @handler.things.flatten)
290
- end
291
-
292
- def test_custom_xpath_handler_is_passed_a_decorated_node_set
293
- x = Module.new do
294
- def awesome! ; end
295
- end
296
- util_decorate(@xml, x)
297
-
298
- assert @xml.xpath('//employee/name')
299
-
300
- @xml.xpath('//employee[saves_node_set(name)]', @handler)
301
- assert_equal @xml, @handler.things.document
302
- assert @handler.things.respond_to?(:awesome!)
303
- end
304
-
305
- def test_code_that_invokes_OP_RESET_inside_libxml2
306
- doc = "<html><body id='foo'><foo>hi</foo></body></html>"
307
- xpath = 'id("foo")//foo'
308
- nokogiri = Nokogiri::HTML.parse(doc)
309
- assert nokogiri.xpath(xpath)
310
- end
311
-
312
- def test_custom_xpath_handler_with_args_under_gc_pressure
313
- # see http://github.com/sparklemotion/nokogiri/issues/#issue/345
314
- tool_inspector = Class.new do
315
- def name_equals(nodeset, name, *args)
316
- nodeset.all? do |node|
317
- args.each { |thing| thing.inspect }
318
- node["name"] == name
319
- end
320
- end
321
- end.new
322
-
323
- xml = <<-EOXML
324
- <toolbox>
325
- #{"<tool name='hammer'/><tool name='wrench'/>" * 10}
326
- </toolbox>
327
- EOXML
328
- doc = Nokogiri::XML xml
329
-
330
- # long list of long arguments, to apply GC pressure during
331
- # ruby_funcall argument marshalling
332
- xpath = ["//tool[name_equals(.,'hammer'"]
333
- 1000.times { xpath << "'unused argument #{'x' * 1000}'" }
334
- xpath << "'unused argument')]"
335
- xpath = xpath.join(',')
336
-
337
- assert_equal doc.xpath("//tool[@name='hammer']"), doc.xpath(xpath, tool_inspector)
338
- end
339
-
340
- def test_custom_xpath_without_arguments
341
- if Nokogiri.uses_libxml?
342
- value = @xml.xpath('value()', @handler)
343
- else
344
- value = @xml.xpath('nokogiri:value()', @ns, @handler)
345
- end
346
- assert_equal 123.456, value
347
- end
348
-
349
- def test_custom_xpath_with_bullshit_arguments
350
- xml = %q{<foo> </foo>}
351
- doc = Nokogiri::XML.parse(xml)
352
- foo = doc.xpath('//foo[bool_function(bar/baz)]', Class.new {
353
- def bool_function(value)
354
- true
355
- end
356
- }.new)
357
- assert_equal foo, doc.xpath("//foo")
358
- end
359
-
360
- def test_node_set_should_be_decorated
361
- # "called decorate on nill" exception in JRuby issue#514
362
- process_output= <<END
363
- <test>
364
- <track type="Image">
365
- <Format>LZ77</Format>
366
- </test>
367
- END
368
- doc = Nokogiri::XML.parse(process_output)
369
- node = doc.xpath(%{//track[@type='Video']})
370
- assert_equal "[]", node.xpath("Format").inspect
371
- end
372
-
373
- def test_very_specific_xml_xpath_making_problems_in_jruby
374
- # manually merges pull request #681
375
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
376
- <ONIXMessage xmlns:elibri="http://elibri.com.pl/ns/extensions" release="3.0" xmlns="http://www.editeur.org/onix/3.0/reference">
377
- <Product>
378
- <RecordReference>a</RecordReference>
379
- </Product>
380
- </ONIXMessage>}
381
-
382
- xml_doc = Nokogiri::XML(xml_string)
383
- onix = xml_doc.children.first
384
- assert_equal 'a', onix.at_xpath('xmlns:Product').at_xpath('xmlns:RecordReference').text
385
- end
386
-
387
- def test_xpath_after_attribute_change
388
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
389
- <mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
390
- <titleInfo>
391
- <nonSort>THE</nonSort>
392
- <title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
393
- <subTitle>SUBTITLE</subTitle>
394
- </titleInfo>
395
- <titleInfo lang="finnish">
396
- <title>Artikkelin otsikko Hydrangea artiklan 1</title>
397
- </titleInfo>
398
- </mods>}
399
-
400
- xml_doc = Nokogiri::XML(xml_string)
401
- ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
402
- node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
403
- node['lang'] = 'english'
404
- assert_equal 1, xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).length
405
- assert_equal 'english', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
406
- end
407
-
408
- def test_xpath_after_element_removal
409
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
410
- <mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
411
- <titleInfo>
412
- <nonSort>THE</nonSort>
413
- <title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
414
- <subTitle>SUBTITLE</subTitle>
415
- </titleInfo>
416
- <titleInfo lang="finnish">
417
- <title>Artikkelin otsikko Hydrangea artiklan 1</title>
418
- </titleInfo>
419
- </mods>}
420
-
421
- xml_doc = Nokogiri::XML(xml_string)
422
- ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
423
- node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
424
- node.remove
425
- assert_equal 1, xml_doc.xpath('//mods:titleInfo',ns_hash).length
426
- assert_equal 'finnish', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
427
- end
428
-
429
- def test_xpath_after_reset_doc_via_innerhtml
430
- xml = <<XML
431
- <?xml version="1.0" encoding="UTF-8"?>
432
- <document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
433
- <text:section name="Section1">[TEXT_INSIDE_SECTION]</text:section>
434
- </document>
435
- XML
436
-
437
- doc = Nokogiri::XML(xml)
438
- doc.inner_html = doc.inner_html
439
- sections = doc.xpath(".//text:section[@name='Section1']")
440
- assert_equal 1, sections.size
441
- assert_equal "[TEXT_INSIDE_SECTION]", sections.first.text
442
- end
443
- end
444
- end
445
- end
@@ -1,133 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- require "helper"
4
-
5
- module Nokogiri
6
- module XSLT
7
- class TestCustomFunctions < Nokogiri::TestCase
8
- def setup
9
- super
10
- @xml = Nokogiri.XML(<<-EOXML)
11
- <?xml version="1.0" encoding="UTF-8"?>
12
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
13
- "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
14
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
15
- <head>
16
- <meta http-equiv="Content-type" content="application/xhtml+xml"/>
17
- <title>Foo</title>
18
- </head>
19
- <body>
20
- <h1>Foo</h1>
21
- <p>Lorem ipsum.</p>
22
- </body>
23
- </html>
24
- EOXML
25
- end
26
-
27
- def test_function
28
- skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
29
- foo = Class.new do
30
- def capitalize nodes
31
- nodes.first.content.upcase
32
- end
33
- end
34
-
35
- XSLT.register "http://e.org/functions", foo
36
-
37
- xsl = Nokogiri.XSLT(<<-EOXSL)
38
- <?xml version="1.0"?>
39
- <xsl:stylesheet version="1.0"
40
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
41
- xmlns:f="http://e.org/functions"
42
- extension-element-prefixes="f">
43
-
44
- <xsl:template match="text()">
45
- <xsl:copy-of select="f:capitalize(.)"/>
46
- </xsl:template>
47
-
48
- <xsl:template match="@*|node()">
49
- <xsl:copy>
50
- <xsl:apply-templates select="@*|node()"/>
51
- <xsl:apply-imports/>
52
- </xsl:copy>
53
- </xsl:template>
54
-
55
- </xsl:stylesheet>
56
- EOXSL
57
- result = xsl.transform @xml
58
- assert_equal 'FOO', result.css('title').first.text
59
- end
60
-
61
-
62
- def test_function_arguments
63
- skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
64
- foo = Class.new do
65
- include MiniTest::Assertions
66
- # Minitest 5 uses `self.assertions` in `assert()` which is not
67
- # defined in the Minitest::Assertions module :-(
68
- attr_writer :assertions
69
- def assertions; @assertions ||= 0; end
70
-
71
- def multiarg *args
72
- assert_equal ["abc", "xyz"], args
73
- args.first
74
- end
75
-
76
- def numericarg arg
77
- assert_equal 42, arg
78
- arg
79
- end
80
- end
81
-
82
- xsl = Nokogiri.XSLT(<<-EOXSL, "http://e.org/functions" => foo)
83
- <?xml version="1.0"?>
84
- <xsl:stylesheet version="1.0"
85
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
86
- xmlns:f="http://e.org/functions"
87
- extension-element-prefixes="f">
88
-
89
- <xsl:template match="text()">
90
- <xsl:copy-of select="f:multiarg('abc', 'xyz')"/>
91
- <xsl:copy-of select="f:numericarg(42)"/>
92
- </xsl:template>
93
- </xsl:stylesheet>
94
- EOXSL
95
-
96
- xsl.transform @xml
97
- end
98
-
99
-
100
- def test_function_XSLT
101
- skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
102
- foo = Class.new do
103
- def america nodes
104
- nodes.first.content.upcase
105
- end
106
- end
107
-
108
- xsl = Nokogiri.XSLT(<<-EOXSL, "http://e.org/functions" => foo)
109
- <?xml version="1.0"?>
110
- <xsl:stylesheet version="1.0"
111
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
112
- xmlns:f="http://e.org/functions"
113
- extension-element-prefixes="f">
114
-
115
- <xsl:template match="text()">
116
- <xsl:copy-of select="f:america(.)"/>
117
- </xsl:template>
118
-
119
- <xsl:template match="@*|node()">
120
- <xsl:copy>
121
- <xsl:apply-templates select="@*|node()"/>
122
- <xsl:apply-imports/>
123
- </xsl:copy>
124
- </xsl:template>
125
-
126
- </xsl:stylesheet>
127
- EOXSL
128
- result = xsl.transform @xml
129
- assert_equal 'FOO', result.css('title').first.text
130
- end
131
- end
132
- end
133
- end
@@ -1,37 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XSLT
5
- class TestExceptionHandling < Nokogiri::TestCase
6
- def test_java_exception_handling
7
- skip('This test is for Java only') if Nokogiri.uses_libxml?
8
-
9
- xml = Nokogiri.XML(<<-EOXML)
10
- <foo>
11
- <bar/>
12
- </foo>
13
- EOXML
14
-
15
- xsl = Nokogiri.XSLT(<<-EOXSL)
16
- <?xml version="1.0"?>
17
- <xsl:stylesheet version="1.0"
18
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
19
-
20
- <xsl:template match="/">
21
- <a/>
22
- <b/>
23
- </xsl:template>
24
- </xsl:stylesheet>
25
- EOXSL
26
-
27
- begin
28
- xsl.transform xml
29
- fail('It should not get here')
30
- rescue RuntimeError => e
31
- assert_match(/Can't have more than one root/, e.to_s, 'The exception message does not contain the expected information')
32
- end
33
- end
34
-
35
- end
36
- end
37
- end