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,592 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestNodeReparenting < Nokogiri::TestCase
6
-
7
- describe "standard node reparenting behavior" do
8
- # describe "namespace handling during reparenting" do
9
- # describe "given a Node" do
10
- # describe "with a Namespace" do
11
- # it "keeps the Namespace"
12
- # end
13
- # describe "given a parent Node with a default and a non-default Namespace" do
14
- # describe "passed an Node without a namespace" do
15
- # it "inserts an Node that inherits the default Namespace"
16
- # end
17
- # describe "passed a Node with a Namespace that matches the parent's non-default Namespace" do
18
- # it "inserts a Node that inherits the matching parent Namespace"
19
- # end
20
- # end
21
- # end
22
- # describe "given a markup string" do
23
- # describe "parsed relative to the document" do
24
- # describe "with a Namespace" do
25
- # it "keeps the Namespace"
26
- # end
27
- # describe "given a parent Node with a default and a non-default Namespace" do
28
- # describe "passed an Node without a namespace" do
29
- # it "inserts an Node that inherits the default Namespace"
30
- # end
31
- # describe "passed a Node with a Namespace that matches the parent's non-default Namespace" do
32
- # it "inserts a Node that inherits the matching parent Namespace"
33
- # end
34
- # end
35
- # end
36
- # describe "parsed relative to a specific node" do
37
- # describe "with a Namespace" do
38
- # it "keeps the Namespace"
39
- # end
40
- # describe "given a parent Node with a default and a non-default Namespace" do
41
- # describe "passed an Node without a namespace" do
42
- # it "inserts an Node that inherits the default Namespace"
43
- # end
44
- # describe "passed a Node with a Namespace that matches the parent's non-default Namespace" do
45
- # it "inserts a Node that inherits the matching parent Namespace"
46
- # end
47
- # end
48
- # end
49
- # end
50
- # end
51
-
52
-
53
- before do
54
- @doc = Nokogiri::XML "<root><a1>First node</a1><a2>Second node</a2><a3>Third <bx />node</a3></root>"
55
- @doc2 = @doc.dup
56
- @fragment_string = "<b1>foo</b1><b2>bar</b2>"
57
- @fragment = Nokogiri::XML::DocumentFragment.parse @fragment_string
58
- @node_set = Nokogiri::XML("<root><b1>foo</b1><b2>bar</b2></root>").xpath("/root/node()")
59
- end
60
-
61
- {
62
- :add_child => {:target => "/root/a1", :returns_self => false, :children_tags => %w[text b1 b2]},
63
- :<< => {:target => "/root/a1", :returns_self => true, :children_tags => %w[text b1 b2]},
64
-
65
- :replace => {:target => "/root/a1/node()", :returns_self => false, :children_tags => %w[b1 b2]},
66
- :swap => {:target => "/root/a1/node()", :returns_self => true, :children_tags => %w[b1 b2]},
67
-
68
- :children= => {:target => "/root/a1", :returns_self => false, :children_tags => %w[b1 b2]},
69
- :inner_html= => {:target => "/root/a1", :returns_self => true, :children_tags => %w[b1 b2]},
70
-
71
- :add_previous_sibling => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[b1 b2 text]},
72
- :previous= => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[b1 b2 text]},
73
- :before => {:target => "/root/a1/text()", :returns_self => true, :children_tags => %w[b1 b2 text]},
74
-
75
- :add_next_sibling => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[text b1 b2]},
76
- :next= => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[text b1 b2]},
77
- :after => {:target => "/root/a1/text()", :returns_self => true, :children_tags => %w[text b1 b2]}
78
- }.each do |method, params|
79
- describe "##{method}" do
80
- describe "passed a Node" do
81
- [:current, :another].each do |which|
82
- describe "passed a Node in the #{which} document" do
83
- before do
84
- @other_doc = which == :current ? @doc : @doc2
85
- @other_node = @other_doc.at_xpath("/root/a2")
86
- end
87
-
88
- it "unlinks the Node from its previous position" do
89
- @doc.at_xpath(params[:target]).send(method, @other_node)
90
- @other_doc.at_xpath("/root/a2").must_be_nil
91
- end
92
-
93
- it "inserts the Node in the proper position" do
94
- @doc.at_xpath(params[:target]).send(method, @other_node)
95
- @doc.at_xpath("/root/a1/a2").wont_be_nil
96
- end
97
-
98
- it "returns the expected value" do
99
- sendee = @doc.at_xpath(params[:target])
100
- result = sendee.send(method, @other_node)
101
- if params[:returns_self]
102
- result.must_equal sendee
103
- else
104
- result.must_equal @other_node
105
- end
106
- end
107
- end
108
- end
109
- end
110
- describe "passed a markup string" do
111
- it "inserts the fragment roots in the proper position" do
112
- @doc.at_xpath(params[:target]).send(method, @fragment_string)
113
- @doc.xpath("/root/a1/node()").collect {|n| n.name}.must_equal params[:children_tags]
114
- end
115
-
116
- it "returns the expected value" do
117
- sendee = @doc.at_xpath(params[:target])
118
- result = sendee.send(method, @fragment_string)
119
- if params[:returns_self]
120
- result.must_equal sendee
121
- else
122
- result.must_be_kind_of Nokogiri::XML::NodeSet
123
- result.to_html.must_equal @fragment_string
124
- end
125
- end
126
- end
127
- describe "passed a fragment" do
128
- it "inserts the fragment roots in the proper position" do
129
- @doc.at_xpath(params[:target]).send(method, @fragment)
130
- @doc.xpath("/root/a1/node()").collect {|n| n.name}.must_equal params[:children_tags]
131
- end
132
- end
133
- describe "passed a document" do
134
- it "raises an exception" do
135
- proc { @doc.at_xpath("/root/a1").send(method, @doc2) }.must_raise(ArgumentError)
136
- end
137
- end
138
- describe "passed a non-Node" do
139
- it "raises an exception" do
140
- proc { @doc.at_xpath("/root/a1").send(method, 42) }.must_raise(ArgumentError)
141
- end
142
- end
143
- describe "passed a NodeSet" do
144
- it "inserts each member of the NodeSet in the proper order" do
145
- @doc.at_xpath(params[:target]).send(method, @node_set)
146
- @doc.xpath("/root/a1/node()").collect {|n| n.name}.must_equal params[:children_tags]
147
- end
148
- end
149
- end
150
- end
151
-
152
- describe "text node merging" do
153
- describe "#add_child" do
154
- it "merges the Text node with adjacent Text nodes" do
155
- @doc.at_xpath("/root/a1").add_child Nokogiri::XML::Text.new('hello', @doc)
156
- @doc.at_xpath("/root/a1/text()").content.must_equal "First nodehello"
157
- end
158
- end
159
-
160
- describe "#replace" do
161
- it "merges the Text node with adjacent Text nodes" do
162
- @doc.at_xpath("/root/a3/bx").replace Nokogiri::XML::Text.new('hello', @doc)
163
- @doc.at_xpath("/root/a3/text()").content.must_equal "Third hellonode"
164
- end
165
- end
166
- end
167
- end
168
-
169
- describe "ad hoc node reparenting behavior" do
170
- describe "#<<" do
171
- it "allows chaining" do
172
- doc = Nokogiri::XML::Document.new
173
- root = Nokogiri::XML::Element.new('root', doc)
174
- doc.root = root
175
-
176
- child1 = Nokogiri::XML::Element.new('child1', doc)
177
- child2 = Nokogiri::XML::Element.new('child2', doc)
178
-
179
- doc.root << child1 << child2
180
-
181
- assert_equal [child1, child2], doc.root.children.to_a
182
- end
183
- end
184
-
185
- describe "#add_child" do
186
- describe "given a new node with a namespace" do
187
- it "keeps the namespace" do
188
- doc = Nokogiri::XML::Document.new
189
- item = Nokogiri::XML::Element.new('item', doc)
190
- doc.root = item
191
-
192
- entry = Nokogiri::XML::Element.new('entry', doc)
193
- entry.add_namespace('tlm', 'http://tenderlovemaking.com')
194
- assert_equal 'http://tenderlovemaking.com', entry.namespaces['xmlns:tlm']
195
- item.add_child(entry)
196
- assert_equal 'http://tenderlovemaking.com', entry.namespaces['xmlns:tlm']
197
- end
198
- end
199
-
200
- describe "given the new document is empty" do
201
- it "adds the node to the new document" do
202
- doc1 = Nokogiri::XML.parse("<value>3</value>")
203
- doc2 = Nokogiri::XML::Document.new
204
- node = doc1.at_xpath("//value")
205
- node.remove
206
- doc2.add_child(node)
207
- assert_match /<value>3<\/value>/, doc2.to_xml
208
- end
209
- end
210
-
211
- describe "given a parent node with a default namespace" do
212
- before do
213
- @doc = Nokogiri::XML(<<-eoxml)
214
- <root xmlns="http://tenderlovemaking.com/">
215
- <first>
216
- </first>
217
- </root>
218
- eoxml
219
- end
220
-
221
- it "inserts a node that inherits the default namespace" do
222
- assert node = @doc.at('//xmlns:first')
223
- child = Nokogiri::XML::Node.new('second', @doc)
224
- node.add_child(child)
225
- assert @doc.at('//xmlns:second')
226
- end
227
- end
228
-
229
- describe "given a parent node with a default and non-default namespace" do
230
- before do
231
- @doc = Nokogiri::XML(<<-eoxml)
232
- <root xmlns="http://tenderlovemaking.com/" xmlns:foo="http://flavorjon.es/">
233
- <first>
234
- </first>
235
- </root>
236
- eoxml
237
- assert @node = @doc.at('//xmlns:first')
238
- @child = Nokogiri::XML::Node.new('second', @doc)
239
- end
240
-
241
- describe "and a child with a namespace matching the parent's default namespace" do
242
- describe "and as the default prefix" do
243
- before do
244
- @ns = @child.add_namespace(nil, 'http://tenderlovemaking.com/')
245
- @child.namespace = @ns
246
- end
247
-
248
- it "inserts a node that inherits the parent's default namespace" do
249
- @node.add_child(@child)
250
- assert reparented = @doc.at('//bar:second', "bar" => "http://tenderlovemaking.com/")
251
- assert reparented.namespace_definitions.empty?
252
- assert_equal @ns, reparented.namespace
253
- assert_equal(
254
- {
255
- "xmlns" => "http://tenderlovemaking.com/",
256
- "xmlns:foo" => "http://flavorjon.es/",
257
- },
258
- reparented.namespaces)
259
- end
260
- end
261
-
262
- describe "but with a different prefix" do
263
- before do
264
- @ns = @child.add_namespace("baz", 'http://tenderlovemaking.com/')
265
- @child.namespace = @ns
266
- end
267
-
268
- it "inserts a node that uses its own namespace" do
269
- @node.add_child(@child)
270
- assert reparented = @doc.at('//bar:second', "bar" => "http://tenderlovemaking.com/")
271
- assert reparented.namespace_definitions.include?(@ns)
272
- assert_equal @ns, reparented.namespace
273
- assert_equal(
274
- {
275
- "xmlns" => "http://tenderlovemaking.com/",
276
- "xmlns:foo" => "http://flavorjon.es/",
277
- "xmlns:baz" => "http://tenderlovemaking.com/",
278
- },
279
- reparented.namespaces)
280
- end
281
- end
282
- end
283
-
284
- describe "and a child with a namespace matching the parent's non-default namespace" do
285
- describe "set by #namespace=" do
286
- before do
287
- @ns = @doc.root.namespace_definitions.detect { |x| x.prefix == "foo" }
288
- @child.namespace = @ns
289
- end
290
-
291
- it "inserts a node that inherits the matching parent namespace" do
292
- @node.add_child(@child)
293
- assert reparented = @doc.at('//bar:second', "bar" => "http://flavorjon.es/")
294
- assert reparented.namespace_definitions.empty?
295
- assert_equal @ns, reparented.namespace
296
- assert_equal(
297
- {
298
- "xmlns" => "http://tenderlovemaking.com/",
299
- "xmlns:foo" => "http://flavorjon.es/",
300
- },
301
- reparented.namespaces)
302
- end
303
- end
304
-
305
- describe "with the same prefix" do
306
- before do
307
- @ns = @child.add_namespace("foo", 'http://flavorjon.es/')
308
- @child.namespace = @ns
309
- end
310
-
311
- it "inserts a node that uses the parent's namespace" do
312
- @node.add_child(@child)
313
- assert reparented = @doc.at('//bar:second', "bar" => "http://flavorjon.es/")
314
- assert reparented.namespace_definitions.empty?
315
- assert_equal @ns, reparented.namespace
316
- assert_equal(
317
- {
318
- "xmlns" => "http://tenderlovemaking.com/",
319
- "xmlns:foo" => "http://flavorjon.es/",
320
- },
321
- reparented.namespaces)
322
- end
323
- end
324
-
325
- describe "as the default prefix" do
326
- before do
327
- @ns = @child.add_namespace(nil, 'http://flavorjon.es/')
328
- @child.namespace = @ns
329
- end
330
-
331
- it "inserts a node that keeps its namespace" do
332
- @node.add_child(@child)
333
- assert reparented = @doc.at('//bar:second', "bar" => "http://flavorjon.es/")
334
- assert reparented.namespace_definitions.include?(@ns)
335
- assert_equal @ns, reparented.namespace
336
- assert_equal(
337
- {
338
- "xmlns" => "http://flavorjon.es/",
339
- "xmlns:foo" => "http://flavorjon.es/",
340
- },
341
- reparented.namespaces)
342
- end
343
- end
344
-
345
- describe "but with a different prefix" do
346
- before do
347
- @ns = @child.add_namespace('baz', 'http://flavorjon.es/')
348
- @child.namespace = @ns
349
- end
350
-
351
- it "inserts a node that keeps its namespace" do
352
- @node.add_child(@child)
353
- assert reparented = @doc.at('//bar:second', "bar" => "http://flavorjon.es/")
354
- assert reparented.namespace_definitions.include?(@ns)
355
- assert_equal @ns, reparented.namespace
356
- assert_equal(
357
- {
358
- "xmlns" =>"http://tenderlovemaking.com/",
359
- "xmlns:foo" =>"http://flavorjon.es/",
360
- "xmlns:baz" =>"http://flavorjon.es/",
361
- },
362
- reparented.namespaces)
363
- end
364
- end
365
- end
366
-
367
- describe "and a child node with a default namespace not matching the parent's default namespace and a namespace matching a parent namespace but with a different prefix" do
368
- before do
369
- @ns = @child.add_namespace(nil, 'http://example.org/')
370
- @child.namespace = @ns
371
- @ns2 = @child.add_namespace('baz', 'http://tenderlovemaking.com/')
372
- end
373
-
374
- it "inserts a node that keeps its namespace" do
375
- @node.add_child(@child)
376
- assert reparented = @doc.at('//bar:second', "bar" => "http://example.org/")
377
- assert reparented.namespace_definitions.include?(@ns)
378
- assert reparented.namespace_definitions.include?(@ns2)
379
- assert_equal @ns, reparented.namespace
380
- assert_equal(
381
- {
382
- "xmlns" => "http://example.org/",
383
- "xmlns:foo" => "http://flavorjon.es/",
384
- "xmlns:baz" => "http://tenderlovemaking.com/",
385
- },
386
- reparented.namespaces)
387
- end
388
- end
389
- end
390
- end
391
-
392
- describe "#add_previous_sibling" do
393
- it "should not merge text nodes during the operation" do
394
- xml = Nokogiri::XML %Q(<root>text node</root>)
395
- replacee = xml.root.children.first
396
- replacee.add_previous_sibling "foo <p></p> bar"
397
- assert_equal "foo <p></p> bartext node", xml.root.children.to_html
398
- end
399
-
400
- it 'should remove the child node after the operation' do
401
- fragment = Nokogiri::HTML::DocumentFragment.parse("a<a>b</a>")
402
- node = fragment.children.last
403
- node.add_previous_sibling node.children
404
- assert_empty node.children, "should have no childrens"
405
- end
406
-
407
- describe "with a text node before" do
408
- it "should not defensively dup the 'before' text node" do
409
- xml = Nokogiri::XML %Q(<root>before<p></p>after</root>)
410
- pivot = xml.at_css("p")
411
- before = xml.root.children.first
412
- after = xml.root.children.last
413
- pivot.add_previous_sibling("x")
414
-
415
- assert_equal "after", after.content
416
- assert !after.parent.nil?, "unrelated node should not be affected"
417
-
418
- assert_equal "before", before.content
419
- assert !before.parent.nil?, "no need to reparent"
420
- end
421
- end
422
- end
423
-
424
- describe "#add_next_sibling" do
425
- it "should not merge text nodes during the operation" do
426
- xml = Nokogiri::XML %Q(<root>text node</root>)
427
- replacee = xml.root.children.first
428
- replacee.add_next_sibling "foo <p></p> bar"
429
- assert_equal "text nodefoo <p></p> bar", xml.root.children.to_html
430
- end
431
-
432
- it 'should append a text node before an existing non text node' do
433
- xml = Nokogiri::XML %Q(<root><p>foo</p><p>bar</p></root>)
434
- p = xml.at_css 'p'
435
- p.add_next_sibling 'a'
436
- assert_equal '<root><p>foo</p>a<p>bar</p></root>', xml.root.to_s
437
- end
438
-
439
- it 'should append a text node before an existing text node' do
440
- xml = Nokogiri::XML %Q(<root><p>foo</p>after</root>)
441
- p = xml.at_css 'p'
442
- p.add_next_sibling 'x'
443
- assert_equal '<root><p>foo</p>xafter</root>', xml.root.to_s
444
- end
445
-
446
- describe "with a text node after" do
447
- it "should not defensively dup the 'after' text node" do
448
- xml = Nokogiri::XML %Q(<root>before<p></p>after</root>)
449
- pivot = xml.at_css("p")
450
- before = xml.root.children.first
451
- after = xml.root.children.last
452
- pivot.add_next_sibling("x")
453
-
454
- assert_equal "before", before.content
455
- assert !before.parent.nil?, "unrelated node should not be affected"
456
-
457
- assert_equal "after", after.content
458
- assert !after.parent.nil?
459
- end
460
- end
461
- end
462
-
463
- describe "#replace" do
464
- describe "a text node with a text node" do
465
- it "should not merge text nodes during the operation" do
466
- xml = Nokogiri::XML %Q(<root>text node</root>)
467
- replacee = xml.root.children.first
468
- replacee.replace "new text node"
469
- assert_equal "new text node", xml.root.children.first.content
470
- end
471
- end
472
-
473
- it "can replace with a comment node" do
474
- doc = Nokogiri::XML %Q{<parent><child>text}
475
- replacee = doc.at_css("child")
476
- replacer = doc.create_comment("<b>text</b>")
477
- replacee.replace replacer
478
- assert_equal 1, doc.root.children.length
479
- assert_equal replacer, doc.root.children.first
480
- end
481
-
482
- it "can replace with a CDATA node" do
483
- doc = Nokogiri::XML %Q{<parent><child>text}
484
- replacee = doc.at_css("child")
485
- replacer = doc.create_cdata("<b>text</b>")
486
- replacee.replace replacer
487
- assert_equal 1, doc.root.children.length
488
- assert_equal replacer, doc.root.children.first
489
- end
490
-
491
- describe "when a document has a default namespace" do
492
- before do
493
- @fruits = Nokogiri::XML(<<-eoxml)
494
- <fruit xmlns="http://fruits.org">
495
- <apple />
496
- </fruit>
497
- eoxml
498
- end
499
-
500
- it "inserts a node with default namespaces" do
501
- apple = @fruits.css('apple').first
502
-
503
- orange = Nokogiri::XML::Node.new('orange', @fruits)
504
- apple.replace(orange)
505
-
506
- assert_equal orange, @fruits.css('orange').first
507
- end
508
- end
509
- end
510
-
511
- describe "unlinking a node and then reparenting it" do
512
- it "not blow up" do
513
- # see http://github.com/sparklemotion/nokogiri/issues#issue/22
514
- 10.times do
515
- begin
516
- doc = Nokogiri::XML <<-EOHTML
517
- <root>
518
- <a>
519
- <b/>
520
- <c/>
521
- </a>
522
- </root>
523
- EOHTML
524
-
525
- assert root = doc.at("root")
526
- assert a = root.at("a")
527
- assert b = a.at("b")
528
- assert c = a.at("c")
529
- a.add_next_sibling(b.unlink)
530
- c.unlink
531
- end
532
- GC.start
533
- end
534
- end
535
- end
536
-
537
- describe "replace-merging text nodes" do
538
- [
539
- ['<root>a<br/></root>', 'afoo'],
540
- ['<root>a<br/>b</root>', 'afoob'],
541
- ['<root><br/>b</root>', 'foob']
542
- ].each do |xml, result|
543
- it "doesn't blow up on #{xml}" do
544
- doc = Nokogiri::XML.parse(xml)
545
- saved_nodes = doc.root.children
546
- doc.at_xpath("/root/br").replace(Nokogiri::XML::Text.new('foo', doc))
547
- saved_nodes.each { |child| child.inspect } # try to cause a crash
548
- assert_equal result, doc.at_xpath("/root/text()").inner_text
549
- end
550
- end
551
- end
552
-
553
- describe "reparenting into another document" do
554
- it "correctly sets default namespace of a reparented node" do
555
- # issue described in #391
556
- # thanks to Nick Canzoneri @nickcanz for this test case!
557
- source_doc = Nokogiri::XML <<-EOX
558
- <?xml version="1.0" encoding="utf-8"?>
559
- <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
560
- <Product>
561
- <Package />
562
- <Directory Id="TARGETDIR" Name="SourceDir">
563
- <Component>
564
- <File />
565
- </Component>
566
- </Directory>
567
- </Product>
568
- </Wix>
569
- EOX
570
-
571
- dest_doc = Nokogiri::XML <<-EOX
572
- <?xml version="1.0" encoding="utf-8"?>
573
- <Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
574
- <Fragment Id='MSIComponents'>
575
- <DirectoryRef Id='InstallDir'>
576
- </DirectoryRef>
577
- </Fragment>
578
- </Wix>
579
- EOX
580
-
581
- stuff = source_doc.at_css("Directory[Id='TARGETDIR']")
582
- insert_point = dest_doc.at_css("DirectoryRef[Id='InstallDir']")
583
- insert_point.children = stuff.children()
584
-
585
- assert_no_match(/default:/, insert_point.children.to_xml)
586
- assert_match(/<Component>/, insert_point.children.to_xml)
587
- end
588
- end
589
- end
590
- end
591
- end
592
- end