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,5 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', "helper"))
1
+ # -*- coding: utf-8 -*-
2
+ require "helper"
2
3
 
3
4
  module Nokogiri
4
5
  module HTML
@@ -9,14 +10,32 @@ module Nokogiri
9
10
  @parser = HTML::SAX::Parser.new(Doc.new)
10
11
  end
11
12
 
13
+ def test_parse_empty_document
14
+ # This caused a segfault in libxml 2.6.x
15
+ assert_nothing_raised { @parser.parse '' }
16
+ end
17
+
18
+ def test_parse_empty_file
19
+ # Make sure empty files don't break stuff
20
+ empty_file_name = File.join(Dir.tmpdir, 'bogus.xml')
21
+ FileUtils.touch empty_file_name
22
+ assert_nothing_raised { @parser.parse_file empty_file_name }
23
+ end
24
+
12
25
  def test_parse_file
13
26
  @parser.parse_file(HTML_FILE)
14
27
  assert_equal 1110, @parser.document.end_elements.length
15
28
  end
16
29
 
30
+ def test_parse_file_nil_argument
31
+ assert_raises(ArgumentError) {
32
+ @parser.parse_file(nil)
33
+ }
34
+ end
35
+
17
36
  def test_parse_file_non_existant
18
37
  assert_raise Errno::ENOENT do
19
- @parser.parse_file('foo')
38
+ @parser.parse_file('there_is_no_reasonable_way_this_file_exists')
20
39
  end
21
40
  end
22
41
 
@@ -26,6 +45,21 @@ module Nokogiri
26
45
  end
27
46
  end
28
47
 
48
+ def test_parse_memory_nil
49
+ assert_raise ArgumentError do
50
+ @parser.parse_memory(nil)
51
+ end
52
+ end
53
+
54
+ def test_parse_force_encoding
55
+ @parser.parse_memory(<<-HTML, 'UTF-8')
56
+ <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
57
+ Информация
58
+ HTML
59
+ assert_equal("Информация",
60
+ @parser.document.data.join.strip)
61
+ end
62
+
29
63
  def test_parse_document
30
64
  @parser.parse_memory(<<-eoxml)
31
65
  <p>Paragraph 1</p>
@@ -34,6 +68,51 @@ module Nokogiri
34
68
  assert_equal([["html", []], ["body", []], ["p", []], ["p", []]],
35
69
  @parser.document.start_elements)
36
70
  end
71
+
72
+ def test_parser_attributes
73
+ html = <<-eohtml
74
+ <html>
75
+ <head>
76
+ <title>hello</title>
77
+ </head>
78
+ <body>
79
+ <img src="face.jpg" title="daddy &amp; me">
80
+ <hr noshade size="2">
81
+ </body>
82
+ </html>
83
+ eohtml
84
+
85
+ block_called = false
86
+ @parser.parse(html) { |ctx|
87
+ block_called = true
88
+ ctx.replace_entities = true
89
+ }
90
+
91
+ assert block_called
92
+
93
+ noshade_value = if Nokogiri.uses_libxml? && Nokogiri::VERSION_INFO['libxml']['loaded'] < '2.7.7'
94
+ ['noshade', 'noshade']
95
+ elsif Nokogiri.jruby?
96
+ ['noshade', '']
97
+ else
98
+ ['noshade', nil]
99
+ end
100
+
101
+ assert_equal [
102
+ ['html', []],
103
+ ['head', []],
104
+ ['title', []],
105
+ ['body', []],
106
+ ['img', [
107
+ ['src', 'face.jpg'],
108
+ ['title', 'daddy & me']
109
+ ]],
110
+ ['hr', [
111
+ noshade_value,
112
+ ['size', '2']
113
+ ]]
114
+ ], @parser.document.start_elements
115
+ end
37
116
  end
38
117
  end
39
118
  end
@@ -0,0 +1,48 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "helper"
4
+
5
+ module Nokogiri
6
+ module HTML
7
+ module SAX
8
+ class TestParserContext < Nokogiri::SAX::TestCase
9
+ def test_from_io
10
+ assert_nothing_raised do
11
+ ParserContext.new StringIO.new('fo'), 'UTF-8'
12
+ end
13
+ end
14
+
15
+ def test_from_string
16
+ assert_nothing_raised do
17
+ ParserContext.new 'blah blah'
18
+ end
19
+ end
20
+
21
+ def test_parse_with
22
+ ctx = ParserContext.new 'blah'
23
+ assert_raises ArgumentError do
24
+ ctx.parse_with nil
25
+ end
26
+ end
27
+
28
+ def test_parse_with_sax_parser
29
+ assert_nothing_raised do
30
+ xml = "<root />"
31
+ ctx = ParserContext.new xml
32
+ parser = Parser.new Doc.new
33
+ ctx.parse_with parser
34
+ end
35
+ end
36
+
37
+ def test_from_file
38
+ assert_nothing_raised do
39
+ ctx = ParserContext.file HTML_FILE, 'UTF-8'
40
+ parser = Parser.new Doc.new
41
+ ctx.parse_with parser
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
@@ -1,8 +1,14 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module HTML
5
5
  class TestBuilder < Nokogiri::TestCase
6
+ def test_top_level_function_builds
7
+ foo = nil
8
+ Nokogiri() { |xml| foo = xml }
9
+ assert_instance_of Nokogiri::HTML::Builder, foo
10
+ end
11
+
6
12
  def test_builder_with_explicit_tags
7
13
  html_doc = Nokogiri::HTML::Builder.new {
8
14
  div.slide(:class => 'another_class') {
@@ -16,7 +22,7 @@ module Nokogiri
16
22
  end
17
23
 
18
24
  def test_hash_as_attributes_for_attribute_method
19
- html = Nokogiri::HTML::Builder.new {
25
+ html = Nokogiri::HTML::Builder.new { ||
20
26
  div.slide(:class => 'another_class') {
21
27
  span 'Slide 1'
22
28
  }
@@ -36,7 +42,7 @@ module Nokogiri
36
42
 
37
43
  def test_href_with_attributes
38
44
  uri = 'http://tenderlovemaking.com/'
39
- built = Nokogiri::XML::Builder.new { |x|
45
+ built = Nokogiri::XML::Builder.new {
40
46
  div {
41
47
  a('King Khan & The Shrines', :href => uri)
42
48
  }
@@ -47,11 +53,13 @@ module Nokogiri
47
53
 
48
54
  def test_tag_nesting
49
55
  builder = Nokogiri::HTML::Builder.new do
50
- span.left ''
51
- span.middle {
52
- div.icon ''
56
+ body {
57
+ span.left ''
58
+ span.middle {
59
+ div.icon ''
60
+ }
61
+ span.right ''
53
62
  }
54
- span.right ''
55
63
  end
56
64
  assert node = builder.doc.css('span.right').first
57
65
  assert_equal 'middle', node.previous_sibling['class']
@@ -117,7 +125,7 @@ module Nokogiri
117
125
  assert_equal('<html><body><b>bold tag</b></body></html>',
118
126
  builder.doc.root.to_html.chomp.gsub(/>\s*</, '><'))
119
127
  end
120
-
128
+
121
129
  def test_instance_eval_with_delegation_to_block_context
122
130
  class << self
123
131
  def foo
@@ -128,6 +136,29 @@ module Nokogiri
128
136
  builder = Nokogiri::HTML::Builder.new { text foo }
129
137
  assert builder.to_html.include?("foo!")
130
138
  end
139
+
140
+ def test_builder_with_param
141
+ doc = Nokogiri::HTML::Builder.new { |html|
142
+ html.body {
143
+ html.p "hello world"
144
+ }
145
+ }.doc
146
+
147
+ assert node = doc.xpath('//body/p').first
148
+ assert_equal 'hello world', node.content
149
+ end
150
+
151
+ def test_builder_with_id
152
+ text = "hello world"
153
+ doc = Nokogiri::HTML::Builder.new { |html|
154
+ html.body {
155
+ html.id_ text
156
+ }
157
+ }.doc
158
+
159
+ assert node = doc.xpath('//body/id').first
160
+ assert_equal text, node.content
161
+ end
131
162
  end
132
163
  end
133
164
  end
@@ -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
@@ -8,8 +8,101 @@ module Nokogiri
8
8
  @html = Nokogiri::HTML.parse(File.read(HTML_FILE))
9
9
  end
10
10
 
11
- def test_emtpy_string_returns_empty_doc
11
+ def test_exceptions_remove_newlines
12
+ errors = @html.errors
13
+ assert errors.length > 0, 'has errors'
14
+ errors.each do |error|
15
+ assert_equal(error.to_s.chomp, error.to_s)
16
+ end
17
+ end
18
+
19
+ def test_fragment
20
+ fragment = @html.fragment
21
+ assert_equal 0, fragment.children.length
22
+ end
23
+
24
+ def test_document_takes_config_block
25
+ options = nil
26
+ Nokogiri::HTML(File.read(HTML_FILE), HTML_FILE) do |cfg|
27
+ options = cfg
28
+ options.nonet.nowarning.dtdattr
29
+ end
30
+ assert options.nonet?
31
+ assert options.nowarning?
32
+ assert options.dtdattr?
33
+ end
34
+
35
+ def test_parse_takes_config_block
36
+ options = nil
37
+ Nokogiri::HTML.parse(File.read(HTML_FILE), HTML_FILE) do |cfg|
38
+ options = cfg
39
+ options.nonet.nowarning.dtdattr
40
+ end
41
+ assert options.nonet?
42
+ assert options.nowarning?
43
+ assert options.dtdattr?
44
+ end
45
+
46
+ def test_subclass
47
+ klass = Class.new(Nokogiri::HTML::Document)
48
+ doc = klass.new
49
+ assert_instance_of klass, doc
50
+ end
51
+
52
+ def test_subclass_initialize
53
+ klass = Class.new(Nokogiri::HTML::Document) do
54
+ attr_accessor :initialized_with
55
+
56
+ def initialize(*args)
57
+ @initialized_with = args
58
+ end
59
+ end
60
+ doc = klass.new("uri", "external_id", 1)
61
+ assert_equal ["uri", "external_id", 1], doc.initialized_with
62
+ end
63
+
64
+ def test_subclass_dup
65
+ klass = Class.new(Nokogiri::HTML::Document)
66
+ doc = klass.new.dup
67
+ assert_instance_of klass, doc
68
+ end
69
+
70
+ def test_subclass_parse
71
+ klass = Class.new(Nokogiri::HTML::Document)
72
+ doc = klass.parse(File.read(HTML_FILE))
73
+ assert_equal @html.to_s, doc.to_s
74
+ assert_instance_of klass, doc
75
+ end
76
+
77
+ def test_document_parse_method
78
+ html = Nokogiri::HTML::Document.parse(File.read(HTML_FILE))
79
+ assert_equal @html.to_s, html.to_s
80
+ end
81
+
82
+ ###
83
+ # Nokogiri::HTML returns an empty Document when given a blank string GH#11
84
+ def test_empty_string_returns_empty_doc
12
85
  doc = Nokogiri::HTML('')
86
+ assert_instance_of Nokogiri::HTML::Document, doc
87
+ assert_nil doc.root
88
+ end
89
+
90
+ unless %w[2 6] === LIBXML_VERSION.split('.')[0..1]
91
+ # FIXME: this is a hack around broken libxml versions
92
+ def test_to_xhtml_with_indent
93
+ doc = Nokogiri::HTML('<html><body><a>foo</a></body></html>')
94
+ doc = Nokogiri::HTML(doc.to_xhtml(:indent => 2))
95
+ assert_indent 2, doc
96
+ end
97
+
98
+ def test_write_to_xhtml_with_indent
99
+ io = StringIO.new
100
+ doc = Nokogiri::HTML('<html><body><a>foo</a></body></html>')
101
+ doc.write_xhtml_to io, :indent => 5
102
+ io.rewind
103
+ doc = Nokogiri::HTML(io.read)
104
+ assert_indent 5, doc
105
+ end
13
106
  end
14
107
 
15
108
  def test_swap_should_not_exist
@@ -24,12 +117,91 @@ module Nokogiri
24
117
  }
25
118
  end
26
119
 
120
+ def test_meta_encoding
121
+ assert_equal 'UTF-8', @html.meta_encoding
122
+
123
+ html = Nokogiri::HTML(<<-eohtml)
124
+ <html>
125
+ <head>
126
+ <meta http-equiv="X-Content-Type" content="text/html; charset=Shift_JIS">
127
+ </head>
128
+ <body>
129
+ foo
130
+ </body>
131
+ </html>
132
+ eohtml
133
+ assert_nil html.meta_encoding
134
+ end
135
+
136
+ def test_meta_encoding=
137
+ @html.meta_encoding = 'EUC-JP'
138
+ assert_equal 'EUC-JP', @html.meta_encoding
139
+ end
140
+
141
+ def test_title
142
+ assert_equal 'Tender Lovemaking ', @html.title
143
+ doc = Nokogiri::HTML('<html><body>foo</body></html>')
144
+ assert_nil doc.title
145
+ end
146
+
147
+ def test_title=()
148
+ doc = Nokogiri::HTML(<<eohtml)
149
+ <html>
150
+ <head>
151
+ <title>old</title>
152
+ </head>
153
+ <body>
154
+ foo
155
+ </body>
156
+ </html>
157
+ eohtml
158
+ doc.title = 'new'
159
+ assert_equal 'new', doc.title
160
+
161
+ doc = Nokogiri::HTML(<<eohtml)
162
+ <html>
163
+ <head>
164
+ </head>
165
+ <body>
166
+ foo
167
+ </body>
168
+ </html>
169
+ eohtml
170
+ doc.title = 'new'
171
+ assert_equal 'new', doc.title
172
+
173
+ doc = Nokogiri::HTML(<<eohtml)
174
+ <html>
175
+ <body>
176
+ foo
177
+ </body>
178
+ </html>
179
+ eohtml
180
+ doc.title = 'new'
181
+ assert_nil doc.title
182
+ end
183
+
184
+ def test_meta_encoding_without_head
185
+ html = Nokogiri::HTML('<html><body>foo</body></html>')
186
+ assert_nil html.meta_encoding
187
+
188
+ html.meta_encoding = 'EUC-JP'
189
+ assert_nil html.meta_encoding
190
+ end
191
+
27
192
  def test_root_node_parent_is_document
28
193
  parent = @html.root.parent
29
194
  assert_equal @html, parent
30
195
  assert_instance_of Nokogiri::HTML::Document, parent
31
196
  end
32
197
 
198
+ def test_parse_handles_nil_gracefully
199
+ assert_nothing_raised do
200
+ @doc = Nokogiri::HTML::Document.parse(nil)
201
+ end
202
+ assert_instance_of Nokogiri::HTML::Document, @doc
203
+ end
204
+
33
205
  def test_parse_empty_document
34
206
  doc = Nokogiri::HTML("\n")
35
207
  assert_equal 0, doc.css('a').length
@@ -43,15 +215,17 @@ module Nokogiri
43
215
  end
44
216
 
45
217
  def test_parse_io
46
- assert doc = File.open(HTML_FILE, 'rb') { |f|
47
- Document.read_io(f, nil, 'UTF-8', PARSE_NOERROR | PARSE_NOWARNING)
218
+ assert File.open(HTML_FILE, 'rb') { |f|
219
+ Document.read_io(f, nil, 'UTF-8',
220
+ XML::ParseOptions::NOERROR | XML::ParseOptions::NOWARNING
221
+ )
48
222
  }
49
223
  end
50
224
 
51
225
  def test_to_xhtml
52
226
  assert_match 'XHTML', @html.to_xhtml
53
- assert_match 'XHTML', @html.to_xhtml('UTF-8')
54
- assert_match 'UTF-8', @html.to_xhtml('UTF-8')
227
+ assert_match 'XHTML', @html.to_xhtml(:encoding => 'UTF-8')
228
+ assert_match 'UTF-8', @html.to_xhtml(:encoding => 'UTF-8')
55
229
  end
56
230
 
57
231
  def test_no_xml_header
@@ -142,7 +316,7 @@ module Nokogiri
142
316
  end
143
317
 
144
318
  def test_find_with_function
145
- found = @html.css("div:awesome() h1", Class.new {
319
+ assert @html.css("div:awesome() h1", Class.new {
146
320
  def awesome divs
147
321
  [divs.first]
148
322
  end
@@ -201,6 +375,11 @@ module Nokogiri
201
375
  assert_equal('<p>Helloworld!</p>', node.inner_html.gsub(/\s/, ''))
202
376
  end
203
377
 
378
+ def test_round_trip
379
+ doc = Nokogiri::HTML(@html.inner_html)
380
+ assert_equal @html.root.to_html, doc.root.to_html
381
+ end
382
+
204
383
  def test_fragment_contains_text_node
205
384
  fragment = Nokogiri::HTML.fragment('fooo')
206
385
  assert_equal 1, fragment.children.length
@@ -211,22 +390,6 @@ module Nokogiri
211
390
  assert_equal 2, Nokogiri::HTML.fragment("<br/><hr/>").children.length
212
391
  end
213
392
 
214
- def test_fragment
215
- fragment = Nokogiri::HTML.fragment(<<-eohtml)
216
- <div>
217
- <b>Hello World</b>
218
- </div>
219
- eohtml
220
- assert_equal 1, fragment.children.length
221
- assert_equal 'div', fragment.children.first.name
222
- assert_match(/Hello World/, fragment.to_html)
223
-
224
- # libxml2 is broken in 2.6.16 and 2.6.17
225
- unless [16, 17].include?(Nokogiri::LIBXML_VERSION.split('.').last.to_i)
226
- assert_equal 1, fragment.css('div').length
227
- end
228
- end
229
-
230
393
  def test_relative_css_finder
231
394
  doc = Nokogiri::HTML(<<-eohtml)
232
395
  <html>