nokogiri 1.8.5 → 1.15.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (358) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +40 -18
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -61
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +867 -417
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +165 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +108 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +251 -105
  18. data/ext/nokogiri/nokogiri.h +215 -90
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +42 -37
  21. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  22. data/ext/nokogiri/xml_cdata.c +40 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +401 -237
  25. data/ext/nokogiri/xml_document_fragment.c +13 -17
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +63 -55
  28. data/ext/nokogiri/xml_element_decl.c +31 -31
  29. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +17 -19
  32. data/ext/nokogiri/xml_namespace.c +136 -62
  33. data/ext/nokogiri/xml_node.c +1387 -678
  34. data/ext/nokogiri/xml_node_set.c +246 -216
  35. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  36. data/ext/nokogiri/xml_reader.c +347 -212
  37. data/ext/nokogiri/xml_relax_ng.c +86 -77
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +145 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +64 -36
  41. data/ext/nokogiri/xml_schema.c +138 -81
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +36 -26
  44. data/ext/nokogiri/xml_xpath_context.c +366 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +111 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +630 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +103 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  65. data/gumbo-parser/src/parser.c +4891 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +223 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +66 -0
  88. data/gumbo-parser/src/util.h +34 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +224 -95
  100. data/lib/nokogiri/css.rb +56 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/encoding_handler.rb +57 -0
  103. data/lib/nokogiri/extension.rb +32 -0
  104. data/lib/nokogiri/gumbo.rb +15 -0
  105. data/lib/nokogiri/html.rb +38 -27
  106. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  107. data/lib/nokogiri/html4/document.rb +214 -0
  108. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  109. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  110. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  111. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  112. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  113. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  114. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  115. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  116. data/lib/nokogiri/html4.rb +47 -0
  117. data/lib/nokogiri/html5/document.rb +168 -0
  118. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  119. data/lib/nokogiri/html5/node.rb +103 -0
  120. data/lib/nokogiri/html5.rb +392 -0
  121. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  122. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  123. data/lib/nokogiri/syntax_error.rb +2 -0
  124. data/lib/nokogiri/version/constant.rb +6 -0
  125. data/lib/nokogiri/version/info.rb +223 -0
  126. data/lib/nokogiri/version.rb +3 -108
  127. data/lib/nokogiri/xml/attr.rb +55 -3
  128. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  129. data/lib/nokogiri/xml/builder.rb +98 -54
  130. data/lib/nokogiri/xml/cdata.rb +3 -1
  131. data/lib/nokogiri/xml/character_data.rb +2 -0
  132. data/lib/nokogiri/xml/document.rb +312 -126
  133. data/lib/nokogiri/xml/document_fragment.rb +104 -48
  134. data/lib/nokogiri/xml/dtd.rb +4 -2
  135. data/lib/nokogiri/xml/element_content.rb +12 -2
  136. data/lib/nokogiri/xml/element_decl.rb +6 -2
  137. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  138. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  139. data/lib/nokogiri/xml/namespace.rb +45 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1093 -411
  142. data/lib/nokogiri/xml/node_set.rb +173 -67
  143. data/lib/nokogiri/xml/notation.rb +13 -0
  144. data/lib/nokogiri/xml/parse_options.rb +145 -52
  145. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  146. data/lib/nokogiri/xml/pp/node.rb +42 -30
  147. data/lib/nokogiri/xml/pp.rb +4 -2
  148. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  149. data/lib/nokogiri/xml/reader.rb +21 -28
  150. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  151. data/lib/nokogiri/xml/sax/document.rb +45 -49
  152. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  153. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  154. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  155. data/lib/nokogiri/xml/sax.rb +6 -4
  156. data/lib/nokogiri/xml/schema.rb +19 -9
  157. data/lib/nokogiri/xml/searchable.rb +120 -72
  158. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  159. data/lib/nokogiri/xml/text.rb +2 -0
  160. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  161. data/lib/nokogiri/xml/xpath.rb +15 -4
  162. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  163. data/lib/nokogiri/xml.rb +38 -37
  164. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  165. data/lib/nokogiri/xslt.rb +101 -22
  166. data/lib/nokogiri.rb +59 -75
  167. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  168. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  169. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  170. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  171. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  172. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  173. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  174. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  175. data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
  177. metadata +126 -399
  178. data/.autotest +0 -22
  179. data/.cross_rubies +0 -8
  180. data/.editorconfig +0 -17
  181. data/.gemtest +0 -0
  182. data/.travis.yml +0 -63
  183. data/CHANGELOG.md +0 -1368
  184. data/CONTRIBUTING.md +0 -42
  185. data/C_CODING_STYLE.rdoc +0 -33
  186. data/Gemfile-libxml-ruby +0 -3
  187. data/Manifest.txt +0 -370
  188. data/ROADMAP.md +0 -111
  189. data/Rakefile +0 -348
  190. data/SECURITY.md +0 -19
  191. data/STANDARD_RESPONSES.md +0 -47
  192. data/Y_U_NO_GEMSPEC.md +0 -155
  193. data/appveyor.yml +0 -29
  194. data/build_all +0 -44
  195. data/ext/nokogiri/html_document.c +0 -170
  196. data/ext/nokogiri/html_document.h +0 -10
  197. data/ext/nokogiri/html_element_description.c +0 -279
  198. data/ext/nokogiri/html_element_description.h +0 -10
  199. data/ext/nokogiri/html_entity_lookup.c +0 -32
  200. data/ext/nokogiri/html_entity_lookup.h +0 -8
  201. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  202. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  203. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  204. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  205. data/ext/nokogiri/xml_attr.h +0 -9
  206. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  207. data/ext/nokogiri/xml_cdata.h +0 -9
  208. data/ext/nokogiri/xml_comment.h +0 -9
  209. data/ext/nokogiri/xml_document.h +0 -23
  210. data/ext/nokogiri/xml_document_fragment.h +0 -10
  211. data/ext/nokogiri/xml_dtd.h +0 -10
  212. data/ext/nokogiri/xml_element_content.h +0 -10
  213. data/ext/nokogiri/xml_element_decl.h +0 -9
  214. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  215. data/ext/nokogiri/xml_entity_decl.h +0 -10
  216. data/ext/nokogiri/xml_entity_reference.h +0 -9
  217. data/ext/nokogiri/xml_io.c +0 -61
  218. data/ext/nokogiri/xml_io.h +0 -11
  219. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  220. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  221. data/ext/nokogiri/xml_namespace.h +0 -15
  222. data/ext/nokogiri/xml_node.h +0 -13
  223. data/ext/nokogiri/xml_node_set.h +0 -12
  224. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  225. data/ext/nokogiri/xml_reader.h +0 -10
  226. data/ext/nokogiri/xml_relax_ng.h +0 -9
  227. data/ext/nokogiri/xml_sax_parser.h +0 -39
  228. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  229. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  230. data/ext/nokogiri/xml_schema.h +0 -9
  231. data/ext/nokogiri/xml_syntax_error.h +0 -13
  232. data/ext/nokogiri/xml_text.h +0 -9
  233. data/ext/nokogiri/xml_xpath_context.h +0 -10
  234. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  235. data/lib/nokogiri/html/document.rb +0 -335
  236. data/lib/nokogiri/html/document_fragment.rb +0 -49
  237. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  238. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  239. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  240. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  241. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  242. data/patches/sort-patches-by-date +0 -25
  243. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  244. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  245. data/suppressions/README.txt +0 -1
  246. data/suppressions/nokogiri_ruby-2.supp +0 -10
  247. data/tasks/test.rb +0 -100
  248. data/test/css/test_nthiness.rb +0 -226
  249. data/test/css/test_parser.rb +0 -386
  250. data/test/css/test_tokenizer.rb +0 -215
  251. data/test/css/test_xpath_visitor.rb +0 -96
  252. data/test/decorators/test_slop.rb +0 -23
  253. data/test/files/2ch.html +0 -108
  254. data/test/files/GH_1042.html +0 -18
  255. data/test/files/address_book.rlx +0 -12
  256. data/test/files/address_book.xml +0 -10
  257. data/test/files/atom.xml +0 -344
  258. data/test/files/bar/bar.xsd +0 -4
  259. data/test/files/bogus.xml +0 -0
  260. data/test/files/dont_hurt_em_why.xml +0 -422
  261. data/test/files/encoding.html +0 -82
  262. data/test/files/encoding.xhtml +0 -84
  263. data/test/files/exslt.xml +0 -8
  264. data/test/files/exslt.xslt +0 -35
  265. data/test/files/foo/foo.xsd +0 -4
  266. data/test/files/metacharset.html +0 -10
  267. data/test/files/namespace_pressure_test.xml +0 -1684
  268. data/test/files/noencoding.html +0 -47
  269. data/test/files/po.xml +0 -32
  270. data/test/files/po.xsd +0 -66
  271. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  272. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  273. data/test/files/saml/xenc_schema.xsd +0 -146
  274. data/test/files/saml/xmldsig_schema.xsd +0 -318
  275. data/test/files/shift_jis.html +0 -10
  276. data/test/files/shift_jis.xml +0 -5
  277. data/test/files/shift_jis_no_charset.html +0 -9
  278. data/test/files/slow-xpath.xml +0 -25509
  279. data/test/files/snuggles.xml +0 -3
  280. data/test/files/staff.dtd +0 -10
  281. data/test/files/staff.xml +0 -59
  282. data/test/files/staff.xslt +0 -32
  283. data/test/files/test_document_url/bar.xml +0 -2
  284. data/test/files/test_document_url/document.dtd +0 -4
  285. data/test/files/test_document_url/document.xml +0 -6
  286. data/test/files/tlm.html +0 -851
  287. data/test/files/to_be_xincluded.xml +0 -2
  288. data/test/files/valid_bar.xml +0 -2
  289. data/test/files/xinclude.xml +0 -4
  290. data/test/helper.rb +0 -271
  291. data/test/html/sax/test_parser.rb +0 -168
  292. data/test/html/sax/test_parser_context.rb +0 -46
  293. data/test/html/sax/test_parser_text.rb +0 -163
  294. data/test/html/sax/test_push_parser.rb +0 -87
  295. data/test/html/test_attributes.rb +0 -85
  296. data/test/html/test_builder.rb +0 -164
  297. data/test/html/test_document.rb +0 -712
  298. data/test/html/test_document_encoding.rb +0 -143
  299. data/test/html/test_document_fragment.rb +0 -310
  300. data/test/html/test_element_description.rb +0 -105
  301. data/test/html/test_named_characters.rb +0 -14
  302. data/test/html/test_node.rb +0 -212
  303. data/test/html/test_node_encoding.rb +0 -91
  304. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  305. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  306. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  308. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  309. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  310. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  311. data/test/test_convert_xpath.rb +0 -135
  312. data/test/test_css_cache.rb +0 -47
  313. data/test/test_encoding_handler.rb +0 -48
  314. data/test/test_memory_leak.rb +0 -156
  315. data/test/test_nokogiri.rb +0 -138
  316. data/test/test_soap4r_sax.rb +0 -52
  317. data/test/test_xslt_transforms.rb +0 -314
  318. data/test/xml/node/test_save_options.rb +0 -28
  319. data/test/xml/node/test_subclass.rb +0 -44
  320. data/test/xml/sax/test_parser.rb +0 -402
  321. data/test/xml/sax/test_parser_context.rb +0 -115
  322. data/test/xml/sax/test_parser_text.rb +0 -202
  323. data/test/xml/sax/test_push_parser.rb +0 -265
  324. data/test/xml/test_attr.rb +0 -74
  325. data/test/xml/test_attribute_decl.rb +0 -86
  326. data/test/xml/test_builder.rb +0 -341
  327. data/test/xml/test_c14n.rb +0 -180
  328. data/test/xml/test_cdata.rb +0 -54
  329. data/test/xml/test_comment.rb +0 -40
  330. data/test/xml/test_document.rb +0 -982
  331. data/test/xml/test_document_encoding.rb +0 -31
  332. data/test/xml/test_document_fragment.rb +0 -298
  333. data/test/xml/test_dtd.rb +0 -187
  334. data/test/xml/test_dtd_encoding.rb +0 -31
  335. data/test/xml/test_element_content.rb +0 -56
  336. data/test/xml/test_element_decl.rb +0 -73
  337. data/test/xml/test_entity_decl.rb +0 -122
  338. data/test/xml/test_entity_reference.rb +0 -262
  339. data/test/xml/test_namespace.rb +0 -96
  340. data/test/xml/test_node.rb +0 -1325
  341. data/test/xml/test_node_attributes.rb +0 -115
  342. data/test/xml/test_node_encoding.rb +0 -75
  343. data/test/xml/test_node_inheritance.rb +0 -32
  344. data/test/xml/test_node_reparenting.rb +0 -592
  345. data/test/xml/test_node_set.rb +0 -809
  346. data/test/xml/test_parse_options.rb +0 -64
  347. data/test/xml/test_processing_instruction.rb +0 -30
  348. data/test/xml/test_reader.rb +0 -620
  349. data/test/xml/test_reader_encoding.rb +0 -134
  350. data/test/xml/test_relax_ng.rb +0 -60
  351. data/test/xml/test_schema.rb +0 -142
  352. data/test/xml/test_syntax_error.rb +0 -36
  353. data/test/xml/test_text.rb +0 -60
  354. data/test/xml/test_unparented_node.rb +0 -483
  355. data/test/xml/test_xinclude.rb +0 -83
  356. data/test/xml/test_xpath.rb +0 -470
  357. data/test/xslt/test_custom_functions.rb +0 -133
  358. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,470 +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
-
60
- def anint
61
- 1230456
62
- end
63
- }.new
64
- end
65
-
66
- def test_variable_binding
67
- assert_equal 4, @xml.xpath('//address[@domestic=$value]', nil, :value => 'Yes').length
68
- end
69
-
70
- def test_variable_binding_with_search
71
- assert_equal 4, @xml.search('//address[@domestic=$value]', nil, :value => 'Yes').length
72
- end
73
-
74
- def test_unknown_attribute
75
- assert_equal 0, @xml.xpath('//employee[@id="asdfasdf"]/@fooo').length
76
- assert_nil @xml.xpath('//employee[@id="asdfasdf"]/@fooo')[0]
77
- end
78
-
79
- def test_boolean
80
- assert_equal false, @xml.xpath('1 = 2')
81
- end
82
-
83
- def test_number
84
- assert_equal 2, @xml.xpath('1 + 1')
85
- end
86
-
87
- def test_string
88
- assert_equal 'foo', @xml.xpath('concat("fo", "o")')
89
- end
90
-
91
- def test_node_search_with_multiple_queries
92
- xml = '<document>
93
- <thing>
94
- <div class="title">important thing</div>
95
- </thing>
96
- <thing>
97
- <div class="content">stuff</div>
98
- </thing>
99
- <thing>
100
- <p class="blah">more stuff</div>
101
- </thing>
102
- </document>'
103
- node = Nokogiri::XML(xml).root
104
- assert_kind_of Nokogiri::XML::Node, node
105
-
106
- assert_equal 3, node.xpath('.//div', './/p').length
107
- assert_equal 3, node.css('.title', '.content', 'p').length
108
- assert_equal 3, node.search('.//div', 'p.blah').length
109
- end
110
-
111
- def test_css_search_with_ambiguous_integer_or_string_attributes
112
- # https://github.com/sparklemotion/nokogiri/issues/711
113
- html = "<body><div><img width=200>"
114
- doc = Nokogiri::HTML(html)
115
- assert_not_nil doc.at_css("img[width='200']")
116
- assert_not_nil doc.at_css("img[width=200]")
117
- end
118
-
119
- def test_css_search_uses_custom_selectors_with_arguments
120
- set = @xml.css('employee > address:my_filter("domestic", "Yes")', @handler)
121
- assert set.length > 0
122
- set.each do |node|
123
- assert_equal 'Yes', node['domestic']
124
- end
125
- end
126
-
127
- def test_css_search_uses_custom_selectors
128
- set = @xml.xpath('//employee')
129
- @xml.css('employee:thing()', @handler)
130
- assert_equal(set.length, @handler.things.length)
131
- assert_equal(set.to_a, @handler.things.flatten)
132
- end
133
-
134
- def test_search_with_css_query_uses_custom_selectors_with_arguments
135
- set = @xml.search('employee > address:my_filter("domestic", "Yes")', @handler)
136
- assert set.length > 0
137
- set.each do |node|
138
- assert_equal 'Yes', node['domestic']
139
- end
140
- end
141
-
142
- def test_search_with_xpath_query_uses_custom_selectors_with_arguments
143
- set = if Nokogiri.uses_libxml?
144
- @xml.search('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
145
- else
146
- @xml.search('//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_pass_self_to_function
155
- set = if Nokogiri.uses_libxml?
156
- @xml.xpath('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
157
- else
158
- @xml.xpath('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
159
- end
160
- assert set.length > 0
161
- set.each do |node|
162
- assert_equal 'Yes', node['domestic']
163
- end
164
- end
165
-
166
- def test_custom_xpath_function_gets_strings
167
- set = @xml.xpath('//employee')
168
- if Nokogiri.uses_libxml?
169
- @xml.xpath('//employee[thing("asdf")]', @handler)
170
- else
171
- @xml.xpath('//employee[nokogiri:thing("asdf")]', @ns, @handler)
172
- end
173
- assert_equal(set.length, @handler.things.length)
174
- assert_equal(['asdf'] * set.length, @handler.things)
175
- end
176
-
177
- def parse_params node
178
- params={}
179
- node.xpath('./param').each do |p|
180
- subparams = parse_params p
181
- if(subparams.length > 0)
182
- if(not params.has_key? p.attributes['name'].value)
183
- params[p.attributes['name'].value] = subparams
184
- else
185
- if(params[p.attributes['name'].value].is_a? Array)
186
- params[p.attributes['name'].value] << subparams
187
- else
188
- value = params[p.attributes['name'].value]
189
- params[p.attributes['name'].value] = [value,subparams]
190
- end
191
- end
192
- else
193
- params[p.attributes['name'].value]=p.text
194
- end
195
- end
196
- params
197
- end
198
-
199
- # issue #741 (xpath() around 10x slower in JRuby)
200
- def test_slow_jruby_xpath
201
- skip("testing against an absolute time is brittle. help make this better! see https://github.com/sparklemotion/nokogiri/issues/741")
202
-
203
- doc = Nokogiri::XML(File.open(XPATH_FILE))
204
- start = Time.now
205
-
206
- doc.xpath('.//category').each do |c|
207
- c.xpath('programformats/programformat').each do |p|
208
- p.xpath('./modules/module').each do |m|
209
- parse_params m
210
- end
211
- end
212
- end
213
- stop = Time.now
214
- elapsed_time = stop - start
215
- time_limit = 20
216
- assert_send [elapsed_time, :<, time_limit], "XPath is taking too long"
217
- end
218
-
219
- # issue #1109 (jruby impl's xpath() cache not being cleared on attr removal)
220
- def test_xpath_results_cache_should_get_cleared_on_attr_removal
221
- doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
222
- element = doc.at_xpath('//div[@name="foo"]')
223
- element.remove_attribute('name')
224
- assert_nil doc.at_xpath('//div[@name="foo"]')
225
- end
226
-
227
- # issue #1109 (jruby impl's xpath() cache not being cleared on attr update )
228
- def test_xpath_results_cache_should_get_cleared_on_attr_update
229
- doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
230
- element = doc.at_xpath('//div[@name="foo"]')
231
- element['name'] = 'bar'
232
- assert_nil doc.at_xpath('//div[@name="foo"]')
233
- end
234
-
235
- def test_custom_xpath_function_returns_string
236
- if Nokogiri.uses_libxml?
237
- result = @xml.xpath('thing("asdf")', @handler)
238
- else
239
- result = @xml.xpath('nokogiri:thing("asdf")', @ns, @handler)
240
- end
241
- assert_equal 'asdf', result
242
- end
243
-
244
- def test_custom_xpath_gets_true_booleans
245
- set = @xml.xpath('//employee')
246
- if Nokogiri.uses_libxml?
247
- @xml.xpath('//employee[thing(true())]', @handler)
248
- else
249
- @xml.xpath("//employee[nokogiri:thing(true())]", @ns, @handler)
250
- end
251
- assert_equal(set.length, @handler.things.length)
252
- assert_equal([true] * set.length, @handler.things)
253
- end
254
-
255
- def test_custom_xpath_gets_false_booleans
256
- set = @xml.xpath('//employee')
257
- if Nokogiri.uses_libxml?
258
- @xml.xpath('//employee[thing(false())]', @handler)
259
- else
260
- @xml.xpath("//employee[nokogiri:thing(false())]", @ns, @handler)
261
- end
262
- assert_equal(set.length, @handler.things.length)
263
- assert_equal([false] * set.length, @handler.things)
264
- end
265
-
266
- def test_custom_xpath_gets_numbers
267
- set = @xml.xpath('//employee')
268
- if Nokogiri.uses_libxml?
269
- @xml.xpath('//employee[thing(10)]', @handler)
270
- else
271
- @xml.xpath('//employee[nokogiri:thing(10)]', @ns, @handler)
272
- end
273
- assert_equal(set.length, @handler.things.length)
274
- assert_equal([10] * set.length, @handler.things)
275
- end
276
-
277
- def test_custom_xpath_gets_node_sets
278
- set = @xml.xpath('//employee/name')
279
- if Nokogiri.uses_libxml?
280
- @xml.xpath('//employee[thing(name)]', @handler)
281
- else
282
- @xml.xpath('//employee[nokogiri:thing(name)]', @ns, @handler)
283
- end
284
- assert_equal(set.length, @handler.things.length)
285
- assert_equal(set.to_a, @handler.things.flatten)
286
- end
287
-
288
- def test_custom_xpath_gets_node_sets_and_returns_array
289
- set = @xml.xpath('//employee/name')
290
- if Nokogiri.uses_libxml?
291
- @xml.xpath('//employee[returns_array(name)]', @handler)
292
- else
293
- @xml.xpath('//employee[nokogiri:returns_array(name)]', @ns, @handler)
294
- end
295
- assert_equal(set.length, @handler.things.length)
296
- assert_equal(set.to_a, @handler.things.flatten)
297
- end
298
-
299
- def test_custom_xpath_handler_is_passed_a_decorated_node_set
300
- x = Module.new do
301
- def awesome! ; end
302
- end
303
- util_decorate(@xml, x)
304
-
305
- assert @xml.xpath('//employee/name')
306
-
307
- @xml.xpath('//employee[saves_node_set(name)]', @handler)
308
- assert_equal @xml, @handler.things.document
309
- assert @handler.things.respond_to?(:awesome!)
310
- end
311
-
312
- def test_code_that_invokes_OP_RESET_inside_libxml2
313
- doc = "<html><body id='foo'><foo>hi</foo></body></html>"
314
- xpath = 'id("foo")//foo'
315
- nokogiri = Nokogiri::HTML.parse(doc)
316
- assert nokogiri.xpath(xpath)
317
- end
318
-
319
- def test_custom_xpath_handler_with_args_under_gc_pressure
320
- # see http://github.com/sparklemotion/nokogiri/issues/#issue/345
321
- tool_inspector = Class.new do
322
- def name_equals(nodeset, name, *args)
323
- nodeset.all? do |node|
324
- args.each { |thing| thing.inspect }
325
- node["name"] == name
326
- end
327
- end
328
- end.new
329
-
330
- xml = <<-EOXML
331
- <toolbox>
332
- #{"<tool name='hammer'/><tool name='wrench'/>" * 10}
333
- </toolbox>
334
- EOXML
335
- doc = Nokogiri::XML xml
336
-
337
- # long list of long arguments, to apply GC pressure during
338
- # ruby_funcall argument marshalling
339
- xpath = ["//tool[name_equals(.,'hammer'"]
340
- 1000.times { xpath << "'unused argument #{'x' * 1000}'" }
341
- xpath << "'unused argument')]"
342
- xpath = xpath.join(',')
343
-
344
- assert_equal doc.xpath("//tool[@name='hammer']"), doc.xpath(xpath, tool_inspector)
345
- end
346
-
347
- def test_custom_xpath_without_arguments
348
- if Nokogiri.uses_libxml?
349
- value = @xml.xpath('value()', @handler)
350
- else
351
- value = @xml.xpath('nokogiri:value()', @ns, @handler)
352
- end
353
- assert_equal 123.456, value
354
- end
355
-
356
- def test_custom_xpath_without_arguments_returning_int
357
- if Nokogiri.uses_libxml?
358
- value = @xml.xpath('anint()', @handler)
359
- else
360
- value = @xml.xpath('nokogiri:anint()', @ns, @handler)
361
- end
362
- assert_equal 1230456, value
363
- end
364
-
365
- def test_custom_xpath_with_bullshit_arguments
366
- xml = %q{<foo> </foo>}
367
- doc = Nokogiri::XML.parse(xml)
368
- foo = doc.xpath('//foo[bool_function(bar/baz)]', Class.new {
369
- def bool_function(value)
370
- true
371
- end
372
- }.new)
373
- assert_equal foo, doc.xpath("//foo")
374
- end
375
-
376
- def test_node_set_should_be_decorated
377
- # "called decorate on nill" exception in JRuby issue#514
378
- process_output= <<END
379
- <test>
380
- <track type="Image">
381
- <Format>LZ77</Format>
382
- </test>
383
- END
384
- doc = Nokogiri::XML.parse(process_output)
385
- node = doc.xpath(%{//track[@type='Video']})
386
- assert_equal "[]", node.xpath("Format").inspect
387
- end
388
-
389
- def test_very_specific_xml_xpath_making_problems_in_jruby
390
- # manually merges pull request #681
391
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
392
- <ONIXMessage xmlns:elibri="http://elibri.com.pl/ns/extensions" release="3.0" xmlns="http://www.editeur.org/onix/3.0/reference">
393
- <Product>
394
- <RecordReference>a</RecordReference>
395
- </Product>
396
- </ONIXMessage>}
397
-
398
- xml_doc = Nokogiri::XML(xml_string)
399
- onix = xml_doc.children.first
400
- assert_equal 'a', onix.at_xpath('xmlns:Product').at_xpath('xmlns:RecordReference').text
401
- end
402
-
403
- def test_xpath_after_attribute_change
404
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
405
- <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">
406
- <titleInfo>
407
- <nonSort>THE</nonSort>
408
- <title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
409
- <subTitle>SUBTITLE</subTitle>
410
- </titleInfo>
411
- <titleInfo lang="finnish">
412
- <title>Artikkelin otsikko Hydrangea artiklan 1</title>
413
- </titleInfo>
414
- </mods>}
415
-
416
- xml_doc = Nokogiri::XML(xml_string)
417
- ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
418
- node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
419
- node['lang'] = 'english'
420
- assert_equal 1, xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).length
421
- assert_equal 'english', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
422
- end
423
-
424
- def test_xpath_after_element_removal
425
- xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
426
- <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">
427
- <titleInfo>
428
- <nonSort>THE</nonSort>
429
- <title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
430
- <subTitle>SUBTITLE</subTitle>
431
- </titleInfo>
432
- <titleInfo lang="finnish">
433
- <title>Artikkelin otsikko Hydrangea artiklan 1</title>
434
- </titleInfo>
435
- </mods>}
436
-
437
- xml_doc = Nokogiri::XML(xml_string)
438
- ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
439
- node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
440
- node.remove
441
- assert_equal 1, xml_doc.xpath('//mods:titleInfo',ns_hash).length
442
- assert_equal 'finnish', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
443
- end
444
-
445
- def test_xpath_after_reset_doc_via_innerhtml
446
- xml = <<XML
447
- <?xml version="1.0" encoding="UTF-8"?>
448
- <document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
449
- <text:section name="Section1">[TEXT_INSIDE_SECTION]</text:section>
450
- </document>
451
- XML
452
-
453
- doc = Nokogiri::XML(xml)
454
- doc.inner_html = doc.inner_html
455
- sections = doc.xpath(".//text:section[@name='Section1']")
456
- assert_equal 1, sections.size
457
- assert_equal "[TEXT_INSIDE_SECTION]", sections.first.text
458
- end
459
-
460
- def test_xpath_syntax_error
461
- doc = Nokogiri::XML('<ns1:Root></ns1:Root>')
462
- begin
463
- doc.xpath('//ns1:Root')
464
- rescue => e
465
- assert_equal false, e.message.include?('0:0')
466
- end
467
- end
468
- end
469
- end
470
- 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_match(/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_match(/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