nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60

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 (319) hide show
  1. data/.autotest +18 -7
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +297 -3
  4. data/CHANGELOG.rdoc +289 -0
  5. data/Manifest.txt +148 -37
  6. data/README.ja.rdoc +20 -20
  7. data/README.rdoc +53 -22
  8. data/Rakefile +127 -211
  9. data/bin/nokogiri +54 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +89 -54
  12. data/ext/nokogiri/html_document.c +34 -27
  13. data/ext/nokogiri/html_document.h +1 -1
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +7 -5
  17. data/ext/nokogiri/html_entity_lookup.h +1 -1
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
  21. data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
  22. data/ext/nokogiri/xml_attr.c +20 -9
  23. data/ext/nokogiri/xml_attr.h +1 -1
  24. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  25. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +21 -9
  27. data/ext/nokogiri/xml_cdata.h +1 -1
  28. data/ext/nokogiri/xml_comment.c +18 -6
  29. data/ext/nokogiri/xml_comment.h +1 -1
  30. data/ext/nokogiri/xml_document.c +247 -68
  31. data/ext/nokogiri/xml_document.h +5 -3
  32. data/ext/nokogiri/xml_document_fragment.c +15 -7
  33. data/ext/nokogiri/xml_document_fragment.h +1 -1
  34. data/ext/nokogiri/xml_dtd.c +110 -10
  35. data/ext/nokogiri/xml_dtd.h +3 -1
  36. data/ext/nokogiri/xml_element_content.c +123 -0
  37. data/ext/nokogiri/xml_element_content.h +10 -0
  38. data/ext/nokogiri/xml_element_decl.c +69 -0
  39. data/ext/nokogiri/xml_element_decl.h +9 -0
  40. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  41. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  42. data/ext/nokogiri/xml_entity_decl.c +110 -0
  43. data/ext/nokogiri/xml_entity_decl.h +10 -0
  44. data/ext/nokogiri/xml_entity_reference.c +16 -5
  45. data/ext/nokogiri/xml_entity_reference.h +1 -1
  46. data/ext/nokogiri/xml_io.c +40 -8
  47. data/ext/nokogiri/xml_io.h +2 -1
  48. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  50. data/ext/nokogiri/xml_namespace.c +84 -0
  51. data/ext/nokogiri/xml_namespace.h +13 -0
  52. data/ext/nokogiri/xml_node.c +782 -225
  53. data/ext/nokogiri/xml_node.h +2 -4
  54. data/ext/nokogiri/xml_node_set.c +253 -34
  55. data/ext/nokogiri/xml_node_set.h +2 -2
  56. data/ext/nokogiri/xml_processing_instruction.c +17 -5
  57. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  58. data/ext/nokogiri/xml_reader.c +277 -85
  59. data/ext/nokogiri/xml_reader.h +1 -1
  60. data/ext/nokogiri/xml_relax_ng.c +168 -0
  61. data/ext/nokogiri/xml_relax_ng.h +9 -0
  62. data/ext/nokogiri/xml_sax_parser.c +183 -111
  63. data/ext/nokogiri/xml_sax_parser.h +30 -1
  64. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  65. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  66. data/ext/nokogiri/xml_sax_push_parser.c +42 -12
  67. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  68. data/ext/nokogiri/xml_schema.c +205 -0
  69. data/ext/nokogiri/xml_schema.h +9 -0
  70. data/ext/nokogiri/xml_syntax_error.c +28 -173
  71. data/ext/nokogiri/xml_syntax_error.h +2 -1
  72. data/ext/nokogiri/xml_text.c +16 -6
  73. data/ext/nokogiri/xml_text.h +1 -1
  74. data/ext/nokogiri/xml_xpath_context.c +104 -47
  75. data/ext/nokogiri/xml_xpath_context.h +1 -1
  76. data/ext/nokogiri/xslt_stylesheet.c +161 -19
  77. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  78. data/lib/nokogiri.rb +47 -8
  79. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  80. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  81. data/lib/nokogiri/css.rb +6 -3
  82. data/lib/nokogiri/css/node.rb +14 -12
  83. data/lib/nokogiri/css/parser.rb +665 -62
  84. data/lib/nokogiri/css/parser.y +20 -10
  85. data/lib/nokogiri/css/parser_extras.rb +91 -0
  86. data/lib/nokogiri/css/tokenizer.rb +148 -5
  87. data/lib/nokogiri/css/tokenizer.rex +10 -9
  88. data/lib/nokogiri/css/xpath_visitor.rb +47 -44
  89. data/lib/nokogiri/decorators/slop.rb +8 -4
  90. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  91. data/lib/nokogiri/ffi/html/document.rb +28 -0
  92. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  93. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  94. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  95. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  96. data/lib/nokogiri/ffi/libxml.rb +420 -0
  97. data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
  98. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  99. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  100. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
  102. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  103. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  105. data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
  106. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  107. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  108. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  109. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  110. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  111. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  112. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  113. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  114. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  115. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
  117. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  118. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  119. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  120. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  121. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  122. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  123. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
  124. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  126. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  127. data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
  128. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  129. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  132. data/lib/nokogiri/ffi/xml/document.rb +174 -0
  133. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  134. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  135. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  136. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  137. data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
  138. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  139. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  140. data/lib/nokogiri/ffi/xml/node.rb +559 -0
  141. data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
  142. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  143. data/lib/nokogiri/ffi/xml/reader.rb +236 -0
  144. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  145. data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
  147. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
  148. data/lib/nokogiri/ffi/xml/schema.rb +109 -0
  149. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  150. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  151. data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
  152. data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
  153. data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
  154. data/lib/nokogiri/html.rb +13 -47
  155. data/lib/nokogiri/html/builder.rb +27 -1
  156. data/lib/nokogiri/html/document.rb +201 -7
  157. data/lib/nokogiri/html/document_fragment.rb +41 -0
  158. data/lib/nokogiri/html/element_description.rb +23 -0
  159. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  160. data/lib/nokogiri/html/sax/parser.rb +34 -3
  161. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  162. data/lib/nokogiri/nokogiri.rb +1 -0
  163. data/lib/nokogiri/version.rb +40 -1
  164. data/lib/nokogiri/version_warning.rb +14 -0
  165. data/lib/nokogiri/xml.rb +32 -53
  166. data/lib/nokogiri/xml/attr.rb +5 -0
  167. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  168. data/lib/nokogiri/xml/builder.rb +349 -29
  169. data/lib/nokogiri/xml/cdata.rb +3 -1
  170. data/lib/nokogiri/xml/character_data.rb +7 -0
  171. data/lib/nokogiri/xml/document.rb +166 -14
  172. data/lib/nokogiri/xml/document_fragment.rb +76 -1
  173. data/lib/nokogiri/xml/dtd.rb +16 -3
  174. data/lib/nokogiri/xml/element_content.rb +36 -0
  175. data/lib/nokogiri/xml/element_decl.rb +13 -0
  176. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  177. data/lib/nokogiri/xml/namespace.rb +13 -0
  178. data/lib/nokogiri/xml/node.rb +561 -166
  179. data/lib/nokogiri/xml/node/save_options.rb +22 -2
  180. data/lib/nokogiri/xml/node_set.rb +202 -40
  181. data/lib/nokogiri/xml/parse_options.rb +93 -0
  182. data/lib/nokogiri/xml/pp.rb +2 -0
  183. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  184. data/lib/nokogiri/xml/pp/node.rb +56 -0
  185. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  186. data/lib/nokogiri/xml/reader.rb +93 -8
  187. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  188. data/lib/nokogiri/xml/sax.rb +1 -7
  189. data/lib/nokogiri/xml/sax/document.rb +107 -2
  190. data/lib/nokogiri/xml/sax/parser.rb +57 -7
  191. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  192. data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
  193. data/lib/nokogiri/xml/schema.rb +63 -0
  194. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  195. data/lib/nokogiri/xml/text.rb +4 -1
  196. data/lib/nokogiri/xml/xpath.rb +1 -1
  197. data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
  198. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  199. data/lib/nokogiri/xslt.rb +26 -2
  200. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  201. data/lib/xsd/xmlparser/nokogiri.rb +45 -9
  202. data/tasks/cross_compile.rb +173 -0
  203. data/tasks/test.rb +25 -69
  204. data/test/css/test_nthiness.rb +3 -4
  205. data/test/css/test_parser.rb +75 -20
  206. data/test/css/test_tokenizer.rb +23 -1
  207. data/test/css/test_xpath_visitor.rb +10 -1
  208. data/test/decorators/test_slop.rb +16 -0
  209. data/test/ffi/test_document.rb +35 -0
  210. data/test/files/2ch.html +108 -0
  211. data/test/files/address_book.rlx +12 -0
  212. data/test/files/address_book.xml +10 -0
  213. data/test/files/bar/bar.xsd +4 -0
  214. data/test/files/encoding.html +82 -0
  215. data/test/files/encoding.xhtml +84 -0
  216. data/test/files/foo/foo.xsd +4 -0
  217. data/test/files/po.xml +32 -0
  218. data/test/files/po.xsd +66 -0
  219. data/test/files/shift_jis.html +10 -0
  220. data/test/files/shift_jis.xml +5 -0
  221. data/test/files/snuggles.xml +3 -0
  222. data/test/files/staff.dtd +10 -0
  223. data/test/files/valid_bar.xml +2 -0
  224. data/test/helper.rb +101 -23
  225. data/test/html/sax/test_parser.rb +81 -2
  226. data/test/html/sax/test_parser_context.rb +48 -0
  227. data/test/html/test_builder.rb +39 -8
  228. data/test/html/test_document.rb +186 -23
  229. data/test/html/test_document_encoding.rb +78 -1
  230. data/test/html/test_document_fragment.rb +253 -0
  231. data/test/html/test_element_description.rb +98 -0
  232. data/test/html/test_named_characters.rb +1 -1
  233. data/test/html/test_node.rb +124 -36
  234. data/test/html/test_node_encoding.rb +27 -0
  235. data/test/test_convert_xpath.rb +1 -52
  236. data/test/test_css_cache.rb +2 -13
  237. data/test/test_encoding_handler.rb +46 -0
  238. data/test/test_memory_leak.rb +88 -19
  239. data/test/test_nokogiri.rb +38 -5
  240. data/test/test_reader.rb +188 -6
  241. data/test/test_soap4r_sax.rb +52 -0
  242. data/test/test_xslt_transforms.rb +183 -83
  243. data/test/xml/node/test_save_options.rb +1 -1
  244. data/test/xml/node/test_subclass.rb +44 -0
  245. data/test/xml/sax/test_parser.rb +175 -4
  246. data/test/xml/sax/test_parser_context.rb +113 -0
  247. data/test/xml/sax/test_push_parser.rb +90 -2
  248. data/test/xml/test_attr.rb +35 -1
  249. data/test/xml/test_attribute_decl.rb +82 -0
  250. data/test/xml/test_builder.rb +186 -1
  251. data/test/xml/test_cdata.rb +32 -1
  252. data/test/xml/test_comment.rb +13 -1
  253. data/test/xml/test_document.rb +415 -43
  254. data/test/xml/test_document_encoding.rb +1 -1
  255. data/test/xml/test_document_fragment.rb +173 -5
  256. data/test/xml/test_dtd.rb +61 -6
  257. data/test/xml/test_dtd_encoding.rb +3 -1
  258. data/test/xml/test_element_content.rb +56 -0
  259. data/test/xml/test_element_decl.rb +73 -0
  260. data/test/xml/test_entity_decl.rb +120 -0
  261. data/test/xml/test_entity_reference.rb +5 -1
  262. data/test/xml/test_namespace.rb +68 -0
  263. data/test/xml/test_node.rb +546 -201
  264. data/test/xml/test_node_attributes.rb +34 -0
  265. data/test/xml/test_node_encoding.rb +33 -3
  266. data/test/xml/test_node_reparenting.rb +321 -0
  267. data/test/xml/test_node_set.rb +538 -2
  268. data/test/xml/test_parse_options.rb +52 -0
  269. data/test/xml/test_processing_instruction.rb +6 -1
  270. data/test/xml/test_reader_encoding.rb +1 -1
  271. data/test/xml/test_relax_ng.rb +60 -0
  272. data/test/xml/test_schema.rb +94 -0
  273. data/test/xml/test_syntax_error.rb +12 -0
  274. data/test/xml/test_text.rb +35 -1
  275. data/test/xml/test_unparented_node.rb +5 -5
  276. data/test/xml/test_xpath.rb +142 -11
  277. data/test/xslt/test_custom_functions.rb +94 -0
  278. metadata +328 -92
  279. data/ext/nokogiri/html_sax_parser.c +0 -57
  280. data/ext/nokogiri/html_sax_parser.h +0 -11
  281. data/ext/nokogiri/iconv.dll +0 -0
  282. data/ext/nokogiri/libexslt.dll +0 -0
  283. data/ext/nokogiri/libxml2.dll +0 -0
  284. data/ext/nokogiri/libxslt.dll +0 -0
  285. data/ext/nokogiri/native.so +0 -0
  286. data/ext/nokogiri/xml_xpath.c +0 -53
  287. data/ext/nokogiri/xml_xpath.h +0 -11
  288. data/ext/nokogiri/zlib1.dll +0 -0
  289. data/lib/action-nokogiri.rb +0 -30
  290. data/lib/nokogiri/css/generated_parser.rb +0 -713
  291. data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
  292. data/lib/nokogiri/decorators.rb +0 -2
  293. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  294. data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
  295. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
  296. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
  297. data/lib/nokogiri/hpricot.rb +0 -51
  298. data/lib/nokogiri/xml/comment.rb +0 -6
  299. data/lib/nokogiri/xml/element.rb +0 -6
  300. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  301. data/lib/nokogiri/xml/fragment_handler.rb +0 -34
  302. data/test/hpricot/files/basic.xhtml +0 -17
  303. data/test/hpricot/files/boingboing.html +0 -2266
  304. data/test/hpricot/files/cy0.html +0 -3653
  305. data/test/hpricot/files/immob.html +0 -400
  306. data/test/hpricot/files/pace_application.html +0 -1320
  307. data/test/hpricot/files/tenderlove.html +0 -16
  308. data/test/hpricot/files/uswebgen.html +0 -220
  309. data/test/hpricot/files/utf8.html +0 -1054
  310. data/test/hpricot/files/week9.html +0 -1723
  311. data/test/hpricot/files/why.xml +0 -19
  312. data/test/hpricot/load_files.rb +0 -11
  313. data/test/hpricot/test_alter.rb +0 -68
  314. data/test/hpricot/test_builder.rb +0 -20
  315. data/test/hpricot/test_parser.rb +0 -426
  316. data/test/hpricot/test_paths.rb +0 -15
  317. data/test/hpricot/test_preserved.rb +0 -77
  318. data/test/hpricot/test_xml.rb +0 -30
  319. data/test/test_gc.rb +0 -15
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module HTML
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  require 'nkf'
4
4
 
@@ -11,12 +11,101 @@ module Nokogiri
11
11
  <html>
12
12
  <head></head>
13
13
  <body>
14
- <div>first</div>
14
+ <div class='baz'><a href="foo" class="bar">first</a></div>
15
15
  </body>
16
16
  </html>
17
17
  eohtml
18
18
  end
19
19
 
20
+ def test_to_a
21
+ assert_equal [['class', 'bar'], ['href', 'foo']],@html.at('a').to_a.sort
22
+ end
23
+
24
+ def test_attr
25
+ node = @html.at('div.baz')
26
+ assert_equal node['class'], node.attr('class')
27
+ end
28
+
29
+ def test_get_attribute
30
+ element = @html.at('div')
31
+ assert_equal 'baz', element.get_attribute('class')
32
+ assert_equal 'baz', element['class']
33
+ element['href'] = "javascript:alert(\"AGGA-KA-BOO!\")"
34
+ assert_match(/%22AGGA-KA-BOO!%22/, element.to_html)
35
+ end
36
+
37
+ def test_css_path_round_trip
38
+ doc = Nokogiri::HTML(File.read(HTML_FILE))
39
+ %w{ #header small div[2] div.post body }.each do |css_sel|
40
+ ele = doc.at css_sel
41
+ assert_equal ele, doc.at(ele.css_path), ele.css_path
42
+ end
43
+ end
44
+
45
+ def test_path_round_trip
46
+ doc = Nokogiri::HTML(File.read(HTML_FILE))
47
+ %w{ #header small div[2] div.post body }.each do |css_sel|
48
+ ele = doc.at css_sel
49
+ assert_equal ele, doc.at(ele.path), ele.path
50
+ end
51
+ end
52
+
53
+ def test_append_with_document
54
+ assert_raises(ArgumentError) do
55
+ @html.root << Nokogiri::HTML::Document.new
56
+ end
57
+ end
58
+
59
+ ###
60
+ # Make sure a document that doesn't declare a meta encoding returns
61
+ # nil.
62
+ def test_meta_encoding
63
+ assert_nil @html.meta_encoding
64
+ end
65
+
66
+ def test_description
67
+ assert desc = @html.at('a.bar').description
68
+ assert_equal 'a', desc.name
69
+ end
70
+
71
+ def test_ancestors_with_selector
72
+ assert node = @html.at('a.bar').child
73
+ assert list = node.ancestors('.baz')
74
+ assert_equal 1, list.length
75
+ assert_equal 'div', list.first.name
76
+ end
77
+
78
+ def test_matches_inside_fragment
79
+ fragment = DocumentFragment.new @html
80
+ fragment << XML::Node.new('a', @html)
81
+
82
+ a = fragment.children.last
83
+ assert a.matches?('a'), 'a should match'
84
+ end
85
+
86
+ def test_css_matches?
87
+ assert node = @html.at('a.bar')
88
+ assert node.matches?('a.bar')
89
+ end
90
+
91
+ def test_xpath_matches?
92
+ assert node = @html.at('//a')
93
+ assert node.matches?('//a')
94
+ end
95
+
96
+ def test_unlink_then_swap
97
+ node = @html.at('a')
98
+ node.unlink
99
+
100
+ another_node = @html.at('div')
101
+ assert another_node, 'should have a node'
102
+
103
+ # This used to segv
104
+ assert_nothing_raised do
105
+ node.add_previous_sibling another_node
106
+ end
107
+ end
108
+
20
109
  def test_swap
21
110
  @html.at('div').swap('<a href="foo">bar</a>')
22
111
  a_tag = @html.css('a').first
@@ -24,6 +113,12 @@ module Nokogiri
24
113
  assert_equal 0, @html.css('div').length
25
114
  end
26
115
 
116
+ def test_swap_with_regex_characters
117
+ @html.at('div').swap('<a href="foo">ba)r</a>')
118
+ a_tag = @html.css('a').first
119
+ assert_equal 'ba)r', a_tag.text
120
+ end
121
+
27
122
  def test_attribute_decodes_entities
28
123
  node = @html.at('div')
29
124
  node['href'] = 'foo&bar'
@@ -32,20 +127,18 @@ module Nokogiri
32
127
  assert_equal 'foo&bar&baz', node['href']
33
128
  end
34
129
 
35
-
36
- def test_before_will_prepend_text_nodes
37
- assert node = @html.at('//body').children.first
38
- node.before "some text"
39
- assert_equal 'some text', @html.at('//body').children[0].content.strip
130
+ def test_parse_config_option
131
+ node = @html.at('div')
132
+ options = nil
133
+ node.parse("<div></div>") do |config|
134
+ options = config
135
+ end
136
+ assert_equal Nokogiri::XML::ParseOptions::DEFAULT_HTML, options.to_i
40
137
  end
41
138
 
42
- def test_inner_html=
43
- assert div = @html.at('//div')
44
- div.inner_html = '<span>testing</span>'
45
- assert_equal 'span', div.children.first.name
46
-
47
- div.inner_html = 'testing'
48
- assert_equal 'testing', div.content
139
+ def test_fragment_handler_does_not_regurge_on_invalid_attributes
140
+ iframe = %Q{<iframe style="width: 0%; height: 0px" src="http://someurl" allowtransparency></iframe>}
141
+ assert_nothing_raised { @html.at('div').fragment(iframe) }
49
142
  end
50
143
 
51
144
  def test_fragment
@@ -63,29 +156,17 @@ module Nokogiri
63
156
  assert_equal 'foo', p_tag.parent['class']
64
157
  end
65
158
 
66
- def test_after_will_append_text_nodes
67
- assert node = @html.at('//body/div')
68
- node.after "some text"
69
- assert_equal 'some text', node.next.text.strip
70
- end
71
-
72
- def test_replace
73
- doc = Nokogiri::HTML(<<-eohtml)
74
- <html>
75
- <head></head>
76
- <body>
77
- <center><img src='logo.gif' /></center>
78
- </body>
79
- </html>
80
- eohtml
81
- center = doc.at("//center")
82
- img = center.search("//img")
83
- assert_raises ArgumentError do
84
- center.replace img
85
- end
159
+ def test_fragment_serialization
160
+ fragment = Nokogiri::HTML.fragment("<div>foo</div>")
161
+ assert_equal "<div>foo</div>", fragment.serialize.chomp
162
+ assert_equal "<div>foo</div>", fragment.to_xml.chomp
163
+ assert_equal "<div>foo</div>", fragment.inner_html
164
+ assert_equal "<div>foo</div>", fragment.to_html
165
+ assert_equal "<div>foo</div>", fragment.to_s
86
166
  end
87
167
 
88
168
  def test_to_html_does_not_contain_entities
169
+ return unless defined?(NKF) # NKF is not implemented on Rubinius as of 2009-11-23
89
170
  html = NKF.nkf("-e --msdos", <<-EOH)
90
171
  <html><body>
91
172
  <p> test paragraph
@@ -94,8 +175,15 @@ module Nokogiri
94
175
  EOH
95
176
  nokogiri = Nokogiri::HTML.parse(html)
96
177
 
97
- assert_equal "<p>testparagraph\r\nfoobar</p>",
98
- nokogiri.at("p").to_html.gsub(/ /, '')
178
+ if RUBY_PLATFORM =~ /java/
179
+ # NKF linebreak modes are not supported as of jruby 1.2
180
+ # see http://jira.codehaus.org/browse/JRUBY-3602 for status
181
+ assert_equal "<p>testparagraph\nfoobar</p>",
182
+ nokogiri.at("p").to_html.gsub(/ /, '')
183
+ else
184
+ assert_equal "<p>testparagraph\r\nfoobar</p>",
185
+ nokogiri.at("p").to_html.gsub(/ /, '')
186
+ end
99
187
  end
100
188
  end
101
189
  end
@@ -0,0 +1,27 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "helper"
3
+
4
+ module Nokogiri
5
+ module HTML
6
+ if RUBY_VERSION =~ /^1\.9/
7
+ class TestNodeEncoding < Nokogiri::TestCase
8
+ def test_inner_html
9
+ doc = Nokogiri::HTML File.open(SHIFT_JIS_HTML, 'rb')
10
+
11
+ hello = "こんにちは"
12
+
13
+ contents = doc.at('h2').inner_html
14
+ assert_equal doc.encoding, contents.encoding.name
15
+ assert_match hello.encode('Shift_JIS'), contents
16
+
17
+ contents = doc.at('h2').inner_html(:encoding => 'UTF-8')
18
+ assert_match hello, contents
19
+
20
+ doc.encoding = 'UTF-8'
21
+ contents = doc.at('h2').inner_html
22
+ assert_match hello, contents
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,36 +1,15 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
-
3
- begin
4
- require 'rubygems'
5
- require 'hpricot'
6
- HAS_HPRICOT = true
7
- rescue LoadError
8
- HAS_HPRICOT = false
9
- end
1
+ require "helper"
10
2
 
11
3
  class TestConvertXPath < Nokogiri::TestCase
12
4
 
13
5
  def setup
14
6
  super
15
7
  @N = Nokogiri(File.read(HTML_FILE))
16
- @NH = Nokogiri.Hpricot(File.read(HTML_FILE)) # decorated document
17
- @H = Hpricot(File.read(HTML_FILE)) if HAS_HPRICOT
18
8
  end
19
9
 
20
10
  def assert_syntactical_equivalence(hpath, xpath, match, &blk)
21
11
  blk ||= lambda {|j| j.first}
22
12
  assert_equal match, blk.call(@N.search(xpath)), "xpath result did not match"
23
- if HAS_HPRICOT
24
- assert_equal match, blk.call(@H.search(hpath)), "hpath result did not match"
25
- end
26
- assert_equal [xpath], @NH.convert_to_xpath(hpath), "converted hpath did not match xpath"
27
- end
28
-
29
- def test_ordinary_xpath_conversions
30
- assert_equal(".//p", @NH.convert_to_xpath("p").first)
31
- assert_equal(".//p", @NH.convert_to_xpath(:p).first)
32
- assert_equal(".//p", @NH.convert_to_xpath("//p").first)
33
- assert_equal(".//p", @NH.convert_to_xpath(".//p").first)
34
13
  end
35
14
 
36
15
  def test_child_tag
@@ -117,21 +96,6 @@ class TestConvertXPath < Nokogiri::TestCase
117
96
  end
118
97
 
119
98
  def test_positional
120
- ##
121
- # we are intentionally NOT staying compatible with nth-and-friends, as Hpricot has an OB1 bug.
122
- #
123
- # assert_syntactical_equivalence("div > div:eq(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
124
- # j.first.inner_text
125
- # end
126
- # assert_syntactical_equivalence("div/div:eq(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
127
- # j.first.inner_text
128
- # end
129
- # assert_syntactical_equivalence("div/div:nth(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
130
- # j.first.inner_text
131
- # end
132
- # assert_syntactical_equivalence("div/div:nth-of-type(0)", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
133
- # j.first.inner_text
134
- # end
135
99
  assert_syntactical_equivalence("div/div:first()", ".//div/div[position() = 1]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n".gsub(/[\r\n]/, '')) do |j|
136
100
  j.first.inner_text.gsub(/[\r\n]/, '')
137
101
  end
@@ -152,21 +116,6 @@ class TestConvertXPath < Nokogiri::TestCase
152
116
  end
153
117
  end
154
118
 
155
- def test_compat_mode_namespaces
156
- assert_equal(".//*[name()='t:sam']", @NH.convert_to_xpath("//t:sam").first)
157
- assert_equal(".//*[name()='t:sam'][@rel='bookmark'][1]", @NH.convert_to_xpath("//t:sam[@rel='bookmark'][1]").first)
158
- end
159
-
160
- ##
161
- # 'and' is not supported by hpricot
162
- # def test_and
163
- # assert_syntactical_equivalence("div[h1 and small]", ".//div[h1 and small]", "\r\nTender Lovemaking\r\nThe act of making love, tenderly.\r\n") do |j|
164
- # j.inner_text
165
- # end
166
- # end
167
-
168
-
169
-
170
119
  # TODO:
171
120
  # doc/'title ~ link' -> links that are siblings of title
172
121
  # doc/'p[@class~="final"]' -> class includes string (whitespacy)
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
1
+ require "helper"
2
2
 
3
3
  class TestCssCache < Nokogiri::TestCase
4
4
 
@@ -31,7 +31,7 @@ class TestCssCache < Nokogiri::TestCase
31
31
  times = cache_setting ? 4 : nil
32
32
 
33
33
  Nokogiri::CSS::Parser.set_cache cache_setting
34
-
34
+
35
35
  Nokogiri::CSS.xpath_for(@css)
36
36
  Nokogiri::CSS.xpath_for(@css)
37
37
  Nokogiri::CSS::Parser.new.xpath_for(@css)
@@ -39,17 +39,6 @@ class TestCssCache < Nokogiri::TestCase
39
39
 
40
40
  assert_equal(times, Nokogiri::CSS::Parser.class_eval { @cache.count })
41
41
  end
42
-
43
- define_method "test_hpricot_cache_#{cache_setting ? "true" : "false"}" do
44
- times = cache_setting ? 2 : nil
45
- Nokogiri::CSS::Parser.set_cache cache_setting
46
-
47
- nh = Nokogiri.Hpricot("<html></html>")
48
-
49
- nh.convert_to_xpath(@css)
50
- nh.convert_to_xpath(@css)
51
- assert_equal(times, Nokogiri::CSS::Parser.class_eval { @cache.count })
52
- end
53
42
  end
54
43
 
55
44
 
@@ -0,0 +1,46 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "helper"
4
+
5
+ class TestEncodingHandler < Nokogiri::TestCase
6
+ def teardown
7
+ Nokogiri::EncodingHandler.clear_aliases!
8
+ end
9
+
10
+ def test_get
11
+ assert_not_nil Nokogiri::EncodingHandler['UTF-8']
12
+ assert_nil Nokogiri::EncodingHandler['alsdkjfhaldskjfh']
13
+ end
14
+
15
+ def test_name
16
+ eh = Nokogiri::EncodingHandler['UTF-8']
17
+ assert_equal "UTF-8", eh.name
18
+ end
19
+
20
+ def test_alias
21
+ Nokogiri::EncodingHandler.alias('UTF-8', 'UTF-18')
22
+ assert_equal 'UTF-8', Nokogiri::EncodingHandler['UTF-18'].name
23
+ end
24
+
25
+ def test_cleanup_aliases
26
+ assert_nil Nokogiri::EncodingHandler['UTF-9']
27
+ Nokogiri::EncodingHandler.alias('UTF-8', 'UTF-9')
28
+ assert_not_nil Nokogiri::EncodingHandler['UTF-9']
29
+
30
+ Nokogiri::EncodingHandler.clear_aliases!
31
+ assert_nil Nokogiri::EncodingHandler['UTF-9']
32
+ end
33
+
34
+ def test_delete
35
+ assert_nil Nokogiri::EncodingHandler['UTF-9']
36
+ Nokogiri::EncodingHandler.alias('UTF-8', 'UTF-9')
37
+ assert_not_nil Nokogiri::EncodingHandler['UTF-9']
38
+
39
+ Nokogiri::EncodingHandler.delete 'UTF-9'
40
+ assert_nil Nokogiri::EncodingHandler['UTF-9']
41
+ end
42
+
43
+ def test_delete_non_existent
44
+ assert_nil Nokogiri::EncodingHandler.delete('UTF-9')
45
+ end
46
+ end
@@ -1,15 +1,48 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
1
+ require "helper"
2
2
 
3
3
  class TestMemoryLeak < Nokogiri::TestCase
4
- def test_for_memory_leak
5
- begin
6
- # we don't use Dike in any tests, but requiring it has side effects
7
- # that can create memory leaks, and that's what we're testing for.
8
- require 'rubygems'
9
- require 'dike' # do not remove!
10
-
11
- count_start = count_object_space_documents
12
- xml_data = <<-EOS
4
+
5
+ if ENV['NOKOGIRI_GC'] # turning these off by default for now
6
+
7
+ def test_dont_hurt_em_why
8
+ content = File.open("#{File.dirname(__FILE__)}/files/dont_hurt_em_why.xml").read
9
+ ndoc = Nokogiri::XML(content)
10
+ 2.times do
11
+ ndoc.search('status text').first.inner_text
12
+ ndoc.search('user name').first.inner_text
13
+ GC.start
14
+ end
15
+ end
16
+
17
+ class BadIO
18
+ def read(*args)
19
+ raise 'hell'
20
+ end
21
+
22
+ def write(*args)
23
+ raise 'chickens'
24
+ end
25
+ end
26
+
27
+ def test_for_mem_leak_on_io_callbacks
28
+ io = File.open SNUGGLES_FILE
29
+ reader = Nokogiri::XML.parse(io)
30
+
31
+ (10**10).times do
32
+ Nokogiri::XML.parse(BadIO.new) rescue nil
33
+ doc.write BadIO.new rescue nil
34
+ end
35
+ end
36
+
37
+ def test_for_memory_leak
38
+ begin
39
+ # we don't use Dike in any tests, but requiring it has side effects
40
+ # that can create memory leaks, and that's what we're testing for.
41
+ require 'rubygems'
42
+ require 'dike' # do not remove!
43
+
44
+ count_start = count_object_space_documents
45
+ xml_data = <<-EOS
13
46
  <test>
14
47
  <items>
15
48
  <item>abc</item>
@@ -18,17 +51,53 @@ class TestMemoryLeak < Nokogiri::TestCase
18
51
  <items>
19
52
  </test>
20
53
  EOS
21
- 20.times do
22
- doc = Nokogiri::XML(xml_data)
23
- doc.xpath("//item")
54
+ 20.times do
55
+ doc = Nokogiri::XML(xml_data)
56
+ doc.xpath("//item")
57
+ end
58
+ 2.times { GC.start }
59
+ count_end = count_object_space_documents
60
+ assert((count_end - count_start) <= 2, "memory leak detected")
61
+ rescue LoadError
62
+ puts "\ndike is not installed, skipping memory leak test"
24
63
  end
25
- 2.times { GC.start }
26
- count_end = count_object_space_documents
27
- assert((count_end - count_start) <= 2, "memory leak detected")
28
- rescue LoadError
29
- puts "\ndike is not installed, skipping memory leak test"
30
64
  end
31
- end
65
+
66
+ if Nokogiri.ffi?
67
+ [ ['Node', 'p', nil],
68
+ ['CDATA', nil, 'content'],
69
+ ['Comment', nil, 'content'],
70
+ ['DocumentFragment', nil],
71
+ ['EntityReference', nil, 'p'],
72
+ ['ProcessingInstruction', nil, 'p', 'content'] ].each do |klass, *args|
73
+
74
+ define_method "test_for_leaked_#{klass}_nodes" do
75
+ Nokogiri::LibXML.expects(:xmlAddChild).at_least(1) # more than once shows we're GCing properly
76
+ 10.times {
77
+ xml = Nokogiri::XML("<root></root>")
78
+ 2.times { Nokogiri::XML.const_get(klass).new(*(args.collect{|arg| arg || xml})) }
79
+ GC.start
80
+ }
81
+ GC.start
82
+ end
83
+
84
+ end
85
+
86
+ def test_for_leaked_attr_nodes
87
+ Nokogiri::LibXML.expects(:xmlFreePropList).at_least(1) # more than once shows we're GCing properly
88
+ 10.times {
89
+ xml = Nokogiri::XML("<root></root>")
90
+ 2.times { Nokogiri::XML::Attr.new(xml, "p") }
91
+ GC.start
92
+ }
93
+ GC.start
94
+ end
95
+
96
+ end # if ffi
97
+
98
+ end # if NOKOGIRI_GC
99
+
100
+ private
32
101
 
33
102
  def count_object_space_documents
34
103
  count = 0