nokogiri 1.6.0 → 1.13.2

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 (340) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -19
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +280 -0
  6. data/bin/nokogiri +84 -31
  7. data/dependencies.yml +23 -4
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +952 -132
  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 +231 -96
  18. data/ext/nokogiri/nokogiri.h +188 -129
  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 +29 -21
  24. data/ext/nokogiri/xml_document.c +327 -223
  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 +45 -20
  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 +74 -32
  33. data/ext/nokogiri/xml_node.c +1290 -680
  34. data/ext/nokogiri/xml_node_set.c +239 -208
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +227 -189
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +123 -125
  39. data/ext/nokogiri/xml_sax_parser_context.c +138 -79
  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 +50 -23
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +227 -140
  45. data/ext/nokogiri/xslt_stylesheet.c +269 -177
  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 -58
  93. data/lib/nokogiri/css/parser.rb +407 -357
  94. data/lib/nokogiri/css/parser.y +265 -246
  95. data/lib/nokogiri/css/parser_extras.rb +52 -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 +8 -7
  99. data/lib/nokogiri/css/xpath_visitor.rb +266 -80
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +17 -8
  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/html4/document.rb +331 -0
  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 -15
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +88 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +96 -0
  118. data/lib/nokogiri/html5.rb +477 -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 +221 -0
  123. data/lib/nokogiri/version.rb +3 -105
  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 +96 -54
  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 +234 -95
  130. data/lib/nokogiri/xml/document_fragment.rb +86 -36
  131. data/lib/nokogiri/xml/dtd.rb +16 -4
  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 +8 -4
  138. data/lib/nokogiri/xml/node.rb +947 -502
  139. data/lib/nokogiri/xml/node_set.rb +168 -159
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +40 -5
  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 -41
  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 +270 -0
  155. data/lib/nokogiri/xml/syntax_error.rb +25 -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 +38 -36
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +69 -69
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.13.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +278 -362
  177. data/.autotest +0 -26
  178. data/.gemtest +0 -0
  179. data/.travis.yml +0 -27
  180. data/CHANGELOG.ja.rdoc +0 -819
  181. data/CHANGELOG.rdoc +0 -819
  182. data/C_CODING_STYLE.rdoc +0 -33
  183. data/Manifest.txt +0 -315
  184. data/README.ja.rdoc +0 -106
  185. data/README.rdoc +0 -175
  186. data/ROADMAP.md +0 -90
  187. data/Rakefile +0 -246
  188. data/STANDARD_RESPONSES.md +0 -47
  189. data/Y_U_NO_GEMSPEC.md +0 -155
  190. data/build_all +0 -105
  191. data/ext/nokogiri/html_document.c +0 -170
  192. data/ext/nokogiri/html_document.h +0 -10
  193. data/ext/nokogiri/html_element_description.c +0 -279
  194. data/ext/nokogiri/html_element_description.h +0 -10
  195. data/ext/nokogiri/html_entity_lookup.c +0 -32
  196. data/ext/nokogiri/html_entity_lookup.h +0 -8
  197. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  198. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  199. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  200. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  201. data/ext/nokogiri/xml_attr.h +0 -9
  202. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  203. data/ext/nokogiri/xml_cdata.h +0 -9
  204. data/ext/nokogiri/xml_comment.h +0 -9
  205. data/ext/nokogiri/xml_document.h +0 -23
  206. data/ext/nokogiri/xml_document_fragment.h +0 -10
  207. data/ext/nokogiri/xml_dtd.h +0 -10
  208. data/ext/nokogiri/xml_element_content.h +0 -10
  209. data/ext/nokogiri/xml_element_decl.h +0 -9
  210. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  211. data/ext/nokogiri/xml_entity_decl.h +0 -10
  212. data/ext/nokogiri/xml_entity_reference.h +0 -9
  213. data/ext/nokogiri/xml_io.c +0 -56
  214. data/ext/nokogiri/xml_io.h +0 -11
  215. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  216. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  217. data/ext/nokogiri/xml_namespace.h +0 -13
  218. data/ext/nokogiri/xml_node.h +0 -13
  219. data/ext/nokogiri/xml_node_set.h +0 -14
  220. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  221. data/ext/nokogiri/xml_reader.h +0 -10
  222. data/ext/nokogiri/xml_relax_ng.h +0 -9
  223. data/ext/nokogiri/xml_sax_parser.h +0 -39
  224. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  225. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  226. data/ext/nokogiri/xml_schema.h +0 -9
  227. data/ext/nokogiri/xml_syntax_error.h +0 -13
  228. data/ext/nokogiri/xml_text.h +0 -9
  229. data/ext/nokogiri/xml_xpath_context.h +0 -10
  230. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  231. data/lib/nokogiri/html/document.rb +0 -254
  232. data/lib/nokogiri/html/document_fragment.rb +0 -41
  233. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  234. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  235. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  236. data/ports/archives/libxml2-2.8.0.tar.gz +0 -0
  237. data/ports/archives/libxslt-1.1.26.tar.gz +0 -0
  238. data/tasks/cross_compile.rb +0 -132
  239. data/tasks/nokogiri.org.rb +0 -24
  240. data/tasks/test.rb +0 -95
  241. data/test/css/test_nthiness.rb +0 -159
  242. data/test/css/test_parser.rb +0 -341
  243. data/test/css/test_tokenizer.rb +0 -198
  244. data/test/css/test_xpath_visitor.rb +0 -91
  245. data/test/decorators/test_slop.rb +0 -16
  246. data/test/files/2ch.html +0 -108
  247. data/test/files/address_book.rlx +0 -12
  248. data/test/files/address_book.xml +0 -10
  249. data/test/files/bar/bar.xsd +0 -4
  250. data/test/files/bogus.xml +0 -0
  251. data/test/files/dont_hurt_em_why.xml +0 -422
  252. data/test/files/encoding.html +0 -82
  253. data/test/files/encoding.xhtml +0 -84
  254. data/test/files/exslt.xml +0 -8
  255. data/test/files/exslt.xslt +0 -35
  256. data/test/files/foo/foo.xsd +0 -4
  257. data/test/files/metacharset.html +0 -10
  258. data/test/files/noencoding.html +0 -47
  259. data/test/files/po.xml +0 -32
  260. data/test/files/po.xsd +0 -66
  261. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  262. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  263. data/test/files/saml/xenc_schema.xsd +0 -146
  264. data/test/files/saml/xmldsig_schema.xsd +0 -318
  265. data/test/files/shift_jis.html +0 -10
  266. data/test/files/shift_jis.xml +0 -5
  267. data/test/files/snuggles.xml +0 -3
  268. data/test/files/staff.dtd +0 -10
  269. data/test/files/staff.xml +0 -59
  270. data/test/files/staff.xslt +0 -32
  271. data/test/files/test_document_url/bar.xml +0 -2
  272. data/test/files/test_document_url/document.dtd +0 -4
  273. data/test/files/test_document_url/document.xml +0 -6
  274. data/test/files/tlm.html +0 -850
  275. data/test/files/to_be_xincluded.xml +0 -2
  276. data/test/files/valid_bar.xml +0 -2
  277. data/test/files/xinclude.xml +0 -4
  278. data/test/helper.rb +0 -154
  279. data/test/html/sax/test_parser.rb +0 -141
  280. data/test/html/sax/test_parser_context.rb +0 -46
  281. data/test/html/test_builder.rb +0 -164
  282. data/test/html/test_document.rb +0 -552
  283. data/test/html/test_document_encoding.rb +0 -138
  284. data/test/html/test_document_fragment.rb +0 -261
  285. data/test/html/test_element_description.rb +0 -105
  286. data/test/html/test_named_characters.rb +0 -14
  287. data/test/html/test_node.rb +0 -196
  288. data/test/html/test_node_encoding.rb +0 -27
  289. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  290. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  291. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  292. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  293. data/test/test_convert_xpath.rb +0 -135
  294. data/test/test_css_cache.rb +0 -45
  295. data/test/test_encoding_handler.rb +0 -46
  296. data/test/test_memory_leak.rb +0 -156
  297. data/test/test_nokogiri.rb +0 -132
  298. data/test/test_reader.rb +0 -555
  299. data/test/test_soap4r_sax.rb +0 -52
  300. data/test/test_xslt_transforms.rb +0 -254
  301. data/test/xml/node/test_save_options.rb +0 -28
  302. data/test/xml/node/test_subclass.rb +0 -44
  303. data/test/xml/sax/test_parser.rb +0 -366
  304. data/test/xml/sax/test_parser_context.rb +0 -106
  305. data/test/xml/sax/test_push_parser.rb +0 -157
  306. data/test/xml/test_attr.rb +0 -64
  307. data/test/xml/test_attribute_decl.rb +0 -86
  308. data/test/xml/test_builder.rb +0 -306
  309. data/test/xml/test_c14n.rb +0 -151
  310. data/test/xml/test_cdata.rb +0 -48
  311. data/test/xml/test_comment.rb +0 -29
  312. data/test/xml/test_document.rb +0 -828
  313. data/test/xml/test_document_encoding.rb +0 -28
  314. data/test/xml/test_document_fragment.rb +0 -223
  315. data/test/xml/test_dtd.rb +0 -103
  316. data/test/xml/test_dtd_encoding.rb +0 -33
  317. data/test/xml/test_element_content.rb +0 -56
  318. data/test/xml/test_element_decl.rb +0 -73
  319. data/test/xml/test_entity_decl.rb +0 -122
  320. data/test/xml/test_entity_reference.rb +0 -245
  321. data/test/xml/test_namespace.rb +0 -95
  322. data/test/xml/test_node.rb +0 -1137
  323. data/test/xml/test_node_attributes.rb +0 -96
  324. data/test/xml/test_node_encoding.rb +0 -107
  325. data/test/xml/test_node_inheritance.rb +0 -32
  326. data/test/xml/test_node_reparenting.rb +0 -374
  327. data/test/xml/test_node_set.rb +0 -755
  328. data/test/xml/test_parse_options.rb +0 -64
  329. data/test/xml/test_processing_instruction.rb +0 -30
  330. data/test/xml/test_reader_encoding.rb +0 -142
  331. data/test/xml/test_relax_ng.rb +0 -60
  332. data/test/xml/test_schema.rb +0 -103
  333. data/test/xml/test_syntax_error.rb +0 -12
  334. data/test/xml/test_text.rb +0 -45
  335. data/test/xml/test_unparented_node.rb +0 -422
  336. data/test/xml/test_xinclude.rb +0 -83
  337. data/test/xml/test_xpath.rb +0 -295
  338. data/test/xslt/test_custom_functions.rb +0 -133
  339. data/test/xslt/test_exception_handling.rb +0 -37
  340. data/test_all +0 -81
@@ -1,96 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestNodeAttributes < Nokogiri::TestCase
6
- def test_attribute_with_ns
7
- doc = Nokogiri::XML <<-eoxml
8
- <root xmlns:tlm='http://tenderlovemaking.com/'>
9
- <node tlm:foo='bar' foo='baz' />
10
- </root>
11
- eoxml
12
-
13
- node = doc.at('node')
14
-
15
- assert_equal 'bar',
16
- node.attribute_with_ns('foo', 'http://tenderlovemaking.com/').value
17
- end
18
-
19
- def test_prefixed_attributes
20
- doc = Nokogiri::XML "<root xml:lang='en-GB' />"
21
-
22
- node = doc.root
23
-
24
- assert_equal 'en-GB', node['xml:lang']
25
- assert_equal 'en-GB', node.attributes['lang'].value
26
- assert_equal nil, node['lang']
27
- end
28
-
29
- def test_set_prefixed_attributes
30
- doc = Nokogiri::XML %Q{<root xmlns:foo="x"/>}
31
-
32
- node = doc.root
33
-
34
- node['xml:lang'] = 'en-GB'
35
- node['foo:bar'] = 'bazz'
36
-
37
- assert_equal 'en-GB', node['xml:lang']
38
- assert_equal 'en-GB', node.attributes['lang'].value
39
- assert_equal nil, node['lang']
40
- assert_equal 'http://www.w3.org/XML/1998/namespace', node.attributes['lang'].namespace.href
41
-
42
- assert_equal 'bazz', node['foo:bar']
43
- assert_equal 'bazz', node.attributes['bar'].value
44
- assert_equal nil, node['bar']
45
- assert_equal 'x', node.attributes['bar'].namespace.href
46
- end
47
-
48
- def test_append_child_namespace_definitions_prefixed_attributes
49
- doc = Nokogiri::XML "<root/>"
50
- node = doc.root
51
-
52
- node['xml:lang'] = 'en-GB'
53
-
54
- assert_equal [], node.namespace_definitions.map(&:prefix)
55
-
56
- child_node = Nokogiri::XML::Node.new 'foo', doc
57
- node << child_node
58
-
59
- assert_equal [], node.namespace_definitions.map(&:prefix)
60
- end
61
-
62
- def test_namespace_key?
63
- doc = Nokogiri::XML <<-eoxml
64
- <root xmlns:tlm='http://tenderlovemaking.com/'>
65
- <node tlm:foo='bar' foo='baz' />
66
- </root>
67
- eoxml
68
-
69
- node = doc.at('node')
70
-
71
- assert node.namespaced_key?('foo', 'http://tenderlovemaking.com/')
72
- assert node.namespaced_key?('foo', nil)
73
- assert !node.namespaced_key?('foo', 'foo')
74
- end
75
-
76
- def test_set_attribute_frees_nodes # testing a segv
77
- skip("JRuby doesn't do GC.") if Nokogiri.jruby?
78
- document = Nokogiri::XML.parse("<foo></foo>")
79
-
80
- node = document.root
81
- node['visible'] = 'foo'
82
- attribute = node.attribute('visible')
83
- text = Nokogiri::XML::Text.new 'bar', document
84
- attribute.add_child(text)
85
-
86
- begin
87
- gc_previous = GC.stress
88
- GC.stress = true
89
- node['visible'] = 'attr'
90
- ensure
91
- GC.stress = gc_previous
92
- end
93
- end
94
- end
95
- end
96
- end
@@ -1,107 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- if RUBY_VERSION =~ /^1\.9/
6
- class TestNodeEncoding < Nokogiri::TestCase
7
- def setup
8
- super
9
- @html = Nokogiri::HTML(File.read(HTML_FILE), HTML_FILE)
10
- end
11
-
12
- def test_get_attribute
13
- node = @html.css('a').first
14
- assert_equal @html.encoding, node['href'].encoding.name
15
- end
16
-
17
- def test_text_encoding_is_utf_8
18
- @html = Nokogiri::HTML(File.open(NICH_FILE))
19
- assert_equal 'UTF-8', @html.text.encoding.name
20
- end
21
-
22
- def test_serialize_encoding_html
23
- @html = Nokogiri::HTML(File.open(NICH_FILE))
24
- assert_equal @html.encoding.downcase,
25
- @html.serialize.encoding.name.downcase
26
-
27
- @doc = Nokogiri::HTML(@html.serialize)
28
- assert_equal @html.serialize, @doc.serialize
29
- end
30
-
31
- def test_serialize_encoding_xml
32
- @xml = Nokogiri::XML(File.open(SHIFT_JIS_XML))
33
- assert_equal @xml.encoding.downcase,
34
- @xml.serialize.encoding.name.downcase
35
-
36
- @doc = Nokogiri::XML(@xml.serialize)
37
- assert_equal @xml.serialize, @doc.serialize
38
- end
39
-
40
- def test_encode_special_chars
41
- foo = @html.css('a').first.encode_special_chars('foo')
42
- assert_equal @html.encoding, foo.encoding.name
43
- end
44
-
45
- def test_content
46
- node = @html.css('a').first
47
- assert_equal @html.encoding, node.content.encoding.name
48
- end
49
-
50
- def test_name
51
- node = @html.css('a').first
52
- assert_equal @html.encoding, node.name.encoding.name
53
- end
54
-
55
- def test_path
56
- node = @html.css('a').first
57
- assert_equal @html.encoding, node.path.encoding.name
58
- end
59
-
60
- def test_namespace
61
- xml = <<-eoxml
62
- <root>
63
- <car xmlns:part="http://general-motors.com/">
64
- <part:tire>Michelin Model XGV</part:tire>
65
- </car>
66
- <bicycle xmlns:part="http://schwinn.com/">
67
- <part:tire>I'm a bicycle tire!</part:tire>
68
- </bicycle>
69
- </root>
70
- eoxml
71
- doc = Nokogiri::XML(xml, nil, 'UTF-8')
72
- assert_equal 'UTF-8', doc.encoding
73
- n = doc.xpath('//part:tire', { 'part' => 'http://schwinn.com/' }).first
74
- assert n
75
- assert_equal doc.encoding, n.namespace.href.encoding.name
76
- assert_equal doc.encoding, n.namespace.prefix.encoding.name
77
- end
78
-
79
- def test_namespace_as_hash
80
- xml = <<-eoxml
81
- <root>
82
- <car xmlns:part="http://general-motors.com/">
83
- <part:tire>Michelin Model XGV</part:tire>
84
- </car>
85
- <bicycle xmlns:part="http://schwinn.com/">
86
- <part:tire>I'm a bicycle tire!</part:tire>
87
- </bicycle>
88
- </root>
89
- eoxml
90
- doc = Nokogiri::XML(xml, nil, 'UTF-8')
91
- assert_equal 'UTF-8', doc.encoding
92
- assert n = doc.xpath('//car').first
93
-
94
- n.namespace_definitions.each do |nd|
95
- assert_equal doc.encoding, nd.href.encoding.name
96
- assert_equal doc.encoding, nd.prefix.encoding.name
97
- end
98
-
99
- n.namespaces.each do |k,v|
100
- assert_equal doc.encoding, k.encoding.name
101
- assert_equal doc.encoding, v.encoding.name
102
- end
103
- end
104
- end
105
- end
106
- end
107
- end
@@ -1,32 +0,0 @@
1
- # issue#560
2
-
3
- require 'helper'
4
-
5
- module Nokogiri
6
- module XML
7
- class TestNodeInheritance < Nokogiri::TestCase
8
- MyNode = Class.new Nokogiri::XML::Node
9
- def setup
10
- super
11
- @node = MyNode.new 'foo', Nokogiri::XML::Document.new
12
- @node['foo'] = 'bar'
13
- end
14
-
15
- def test_node_name
16
- assert @node.name == 'foo'
17
- end
18
-
19
- def test_node_writing_an_attribute_accessing_via_attributes
20
- assert @node.attributes['foo']
21
- end
22
-
23
- def test_node_writing_an_attribute_accessing_via_key
24
- assert @node.key? 'foo'
25
- end
26
-
27
- def test_node_writing_an_attribute_accessing_via_brackets
28
- assert @node['foo'] == 'bar'
29
- end
30
- end
31
- end
32
- end
@@ -1,374 +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
- :add_child => {:target => "/root/a1", :returns_self => false, :children_tags => %w[text b1 b2]},
54
- :<< => {:target => "/root/a1", :returns_self => true, :children_tags => %w[text b1 b2]},
55
-
56
- :replace => {:target => "/root/a1/node()", :returns_self => false, :children_tags => %w[b1 b2]},
57
- :swap => {:target => "/root/a1/node()", :returns_self => true, :children_tags => %w[b1 b2]},
58
-
59
- :children= => {:target => "/root/a1", :returns_self => false, :children_tags => %w[b1 b2]},
60
- :inner_html= => {:target => "/root/a1", :returns_self => true, :children_tags => %w[b1 b2]},
61
-
62
- :add_previous_sibling => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[b1 b2 text]},
63
- :previous= => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[b1 b2 text]},
64
- :before => {:target => "/root/a1/text()", :returns_self => true, :children_tags => %w[b1 b2 text]},
65
-
66
- :add_next_sibling => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[text b1 b2]},
67
- :next= => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[text b1 b2]},
68
- :after => {:target => "/root/a1/text()", :returns_self => true, :children_tags => %w[text b1 b2]}
69
- }.each do |method, params|
70
-
71
- before do
72
- @doc = Nokogiri::XML "<root><a1>First node</a1><a2>Second node</a2><a3>Third <bx />node</a3></root>"
73
- @doc2 = @doc.dup
74
- @fragment_string = "<b1>foo</b1><b2>bar</b2>"
75
- @fragment = Nokogiri::XML::DocumentFragment.parse @fragment_string
76
- @node_set = Nokogiri::XML("<root><b1>foo</b1><b2>bar</b2></root>").xpath("/root/node()")
77
- end
78
-
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 a parent node with a default namespace" do
201
- before do
202
- @doc = Nokogiri::XML(<<-eoxml)
203
- <root xmlns="http://tenderlovemaking.com/">
204
- <first>
205
- </first>
206
- </root>
207
- eoxml
208
- end
209
-
210
- it "inserts a node that inherits the default namespace" do
211
- assert node = @doc.at('//xmlns:first')
212
- child = Nokogiri::XML::Node.new('second', @doc)
213
- node.add_child(child)
214
- assert @doc.at('//xmlns:second')
215
- end
216
- end
217
-
218
- describe "given a parent node with a non-default namespace" do
219
- before do
220
- @doc = Nokogiri::XML(<<-eoxml)
221
- <root xmlns="http://tenderlovemaking.com/" xmlns:foo="http://flavorjon.es/">
222
- <first>
223
- </first>
224
- </root>
225
- eoxml
226
- end
227
-
228
- describe "and a child node with a namespace matching the parent's non-default namespace" do
229
- it "inserts a node that inherits the matching parent namespace" do
230
- assert node = @doc.at('//xmlns:first')
231
- child = Nokogiri::XML::Node.new('second', @doc)
232
-
233
- ns = @doc.root.namespace_definitions.detect { |x| x.prefix == "foo" }
234
- child.namespace = ns
235
-
236
- node.add_child(child)
237
- assert @doc.at('//foo:second', "foo" => "http://flavorjon.es/")
238
- end
239
- end
240
- end
241
- end
242
-
243
- describe "#add_previous_sibling" do
244
- it "should not merge text nodes during the operation" do
245
- xml = Nokogiri::XML %Q(<root>text node</root>)
246
- replacee = xml.root.children.first
247
- replacee.add_previous_sibling "foo <p></p> bar"
248
- assert_equal "foo <p></p> bartext node", xml.root.children.to_html
249
- end
250
-
251
- it 'should remove the child node after the operation' do
252
- fragment = Nokogiri::HTML::DocumentFragment.parse("a<a>b</a>")
253
- node = fragment.children.last
254
- node.add_previous_sibling node.children
255
- assert_empty node.children, "should have no childrens"
256
- end
257
-
258
- describe "with a text node before" do
259
- it "should not defensively dup the 'before' text node" do
260
- xml = Nokogiri::XML %Q(<root>before<p></p>after</root>)
261
- pivot = xml.at_css("p")
262
- before = xml.root.children.first
263
- after = xml.root.children.last
264
- pivot.add_previous_sibling("x")
265
-
266
- assert_equal "after", after.content
267
- assert !after.parent.nil?, "unrelated node should not be affected"
268
-
269
- assert_equal "before", before.content
270
- assert !before.parent.nil?, "no need to reparent"
271
- end
272
- end
273
- end
274
-
275
- describe "#add_next_sibling" do
276
- it "should not merge text nodes during the operation" do
277
- xml = Nokogiri::XML %Q(<root>text node</root>)
278
- replacee = xml.root.children.first
279
- replacee.add_next_sibling "foo <p></p> bar"
280
- assert_equal "text nodefoo <p></p> bar", xml.root.children.to_html
281
- end
282
-
283
- describe "with a text node after" do
284
- it "should not defensively dup the 'after' text node" do
285
- xml = Nokogiri::XML %Q(<root>before<p></p>after</root>)
286
- pivot = xml.at_css("p")
287
- before = xml.root.children.first
288
- after = xml.root.children.last
289
- pivot.add_next_sibling("x")
290
-
291
- assert_equal "before", before.content
292
- assert !before.parent.nil?, "unrelated node should not be affected"
293
-
294
- assert_equal "after", after.content
295
- assert !after.parent.nil?
296
- end
297
- end
298
- end
299
-
300
- describe "#replace" do
301
- describe "a text node with a text node" do
302
- it "should not merge text nodes during the operation" do
303
- xml = Nokogiri::XML %Q(<root>text node</root>)
304
- replacee = xml.root.children.first
305
- replacee.replace "new text node"
306
- assert_equal "new text node", xml.root.children.first.content
307
- end
308
- end
309
-
310
- describe "when a document has a default namespace" do
311
- before do
312
- @fruits = Nokogiri::XML(<<-eoxml)
313
- <fruit xmlns="http://fruits.org">
314
- <apple />
315
- </fruit>
316
- eoxml
317
- end
318
-
319
- it "inserts a node with default namespaces" do
320
- apple = @fruits.css('apple').first
321
-
322
- orange = Nokogiri::XML::Node.new('orange', @fruits)
323
- apple.replace(orange)
324
-
325
- assert_equal orange, @fruits.css('orange').first
326
- end
327
- end
328
- end
329
-
330
- describe "unlinking a node and then reparenting it" do
331
- it "not blow up" do
332
- # see http://github.com/sparklemotion/nokogiri/issues#issue/22
333
- 10.times do
334
- begin
335
- doc = Nokogiri::XML <<-EOHTML
336
- <root>
337
- <a>
338
- <b/>
339
- <c/>
340
- </a>
341
- </root>
342
- EOHTML
343
-
344
- assert root = doc.at("root")
345
- assert a = root.at("a")
346
- assert b = a.at("b")
347
- assert c = a.at("c")
348
- a.add_next_sibling(b.unlink)
349
- c.unlink
350
- end
351
- GC.start
352
- end
353
- end
354
- end
355
-
356
- describe "replace-merging text nodes" do
357
- [
358
- ['<root>a<br/></root>', 'afoo'],
359
- ['<root>a<br/>b</root>', 'afoob'],
360
- ['<root><br/>b</root>', 'foob']
361
- ].each do |xml, result|
362
- it "doesn't blow up on #{xml}" do
363
- doc = Nokogiri::XML.parse(xml)
364
- saved_nodes = doc.root.children
365
- doc.at_xpath("/root/br").replace(Nokogiri::XML::Text.new('foo', doc))
366
- saved_nodes.each { |child| child.inspect } # try to cause a crash
367
- assert_equal result, doc.at_xpath("/root/text()").inner_text
368
- end
369
- end
370
- end
371
- end
372
- end
373
- end
374
- end