nokogiri 1.6.2.rc1-x64-mingw32

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 (263) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +26 -0
  3. data/.editorconfig +17 -0
  4. data/.gemtest +0 -0
  5. data/.travis.yml +25 -0
  6. data/CHANGELOG.ja.rdoc +857 -0
  7. data/CHANGELOG.rdoc +880 -0
  8. data/C_CODING_STYLE.rdoc +33 -0
  9. data/Gemfile +21 -0
  10. data/Manifest.txt +371 -0
  11. data/README.ja.rdoc +112 -0
  12. data/README.rdoc +180 -0
  13. data/ROADMAP.md +89 -0
  14. data/Rakefile +351 -0
  15. data/STANDARD_RESPONSES.md +47 -0
  16. data/Y_U_NO_GEMSPEC.md +155 -0
  17. data/bin/nokogiri +78 -0
  18. data/build_all +130 -0
  19. data/dependencies.yml +4 -0
  20. data/ext/nokogiri/depend +358 -0
  21. data/ext/nokogiri/extconf.rb +453 -0
  22. data/ext/nokogiri/html_document.c +170 -0
  23. data/ext/nokogiri/html_document.h +10 -0
  24. data/ext/nokogiri/html_element_description.c +279 -0
  25. data/ext/nokogiri/html_element_description.h +10 -0
  26. data/ext/nokogiri/html_entity_lookup.c +32 -0
  27. data/ext/nokogiri/html_entity_lookup.h +8 -0
  28. data/ext/nokogiri/html_sax_parser_context.c +116 -0
  29. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  30. data/ext/nokogiri/html_sax_push_parser.c +87 -0
  31. data/ext/nokogiri/html_sax_push_parser.h +9 -0
  32. data/ext/nokogiri/nokogiri.c +148 -0
  33. data/ext/nokogiri/nokogiri.h +164 -0
  34. data/ext/nokogiri/xml_attr.c +94 -0
  35. data/ext/nokogiri/xml_attr.h +9 -0
  36. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  37. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  38. data/ext/nokogiri/xml_cdata.c +56 -0
  39. data/ext/nokogiri/xml_cdata.h +9 -0
  40. data/ext/nokogiri/xml_comment.c +54 -0
  41. data/ext/nokogiri/xml_comment.h +9 -0
  42. data/ext/nokogiri/xml_document.c +577 -0
  43. data/ext/nokogiri/xml_document.h +23 -0
  44. data/ext/nokogiri/xml_document_fragment.c +48 -0
  45. data/ext/nokogiri/xml_document_fragment.h +10 -0
  46. data/ext/nokogiri/xml_dtd.c +202 -0
  47. data/ext/nokogiri/xml_dtd.h +10 -0
  48. data/ext/nokogiri/xml_element_content.c +123 -0
  49. data/ext/nokogiri/xml_element_content.h +10 -0
  50. data/ext/nokogiri/xml_element_decl.c +69 -0
  51. data/ext/nokogiri/xml_element_decl.h +9 -0
  52. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  53. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  54. data/ext/nokogiri/xml_entity_decl.c +110 -0
  55. data/ext/nokogiri/xml_entity_decl.h +10 -0
  56. data/ext/nokogiri/xml_entity_reference.c +52 -0
  57. data/ext/nokogiri/xml_entity_reference.h +9 -0
  58. data/ext/nokogiri/xml_io.c +56 -0
  59. data/ext/nokogiri/xml_io.h +11 -0
  60. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  61. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  62. data/ext/nokogiri/xml_namespace.c +78 -0
  63. data/ext/nokogiri/xml_namespace.h +13 -0
  64. data/ext/nokogiri/xml_node.c +1541 -0
  65. data/ext/nokogiri/xml_node.h +13 -0
  66. data/ext/nokogiri/xml_node_set.c +467 -0
  67. data/ext/nokogiri/xml_node_set.h +14 -0
  68. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  69. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  70. data/ext/nokogiri/xml_reader.c +681 -0
  71. data/ext/nokogiri/xml_reader.h +10 -0
  72. data/ext/nokogiri/xml_relax_ng.c +161 -0
  73. data/ext/nokogiri/xml_relax_ng.h +9 -0
  74. data/ext/nokogiri/xml_sax_parser.c +312 -0
  75. data/ext/nokogiri/xml_sax_parser.h +39 -0
  76. data/ext/nokogiri/xml_sax_parser_context.c +262 -0
  77. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  78. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  79. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  80. data/ext/nokogiri/xml_schema.c +205 -0
  81. data/ext/nokogiri/xml_schema.h +9 -0
  82. data/ext/nokogiri/xml_syntax_error.c +63 -0
  83. data/ext/nokogiri/xml_syntax_error.h +13 -0
  84. data/ext/nokogiri/xml_text.c +52 -0
  85. data/ext/nokogiri/xml_text.h +9 -0
  86. data/ext/nokogiri/xml_xpath_context.c +307 -0
  87. data/ext/nokogiri/xml_xpath_context.h +10 -0
  88. data/ext/nokogiri/xslt_stylesheet.c +270 -0
  89. data/ext/nokogiri/xslt_stylesheet.h +14 -0
  90. data/lib/nokogiri.rb +137 -0
  91. data/lib/nokogiri/2.0/nokogiri.so +0 -0
  92. data/lib/nokogiri/2.1/nokogiri.so +0 -0
  93. data/lib/nokogiri/css.rb +27 -0
  94. data/lib/nokogiri/css/node.rb +52 -0
  95. data/lib/nokogiri/css/parser.rb +715 -0
  96. data/lib/nokogiri/css/parser.y +249 -0
  97. data/lib/nokogiri/css/parser_extras.rb +91 -0
  98. data/lib/nokogiri/css/syntax_error.rb +7 -0
  99. data/lib/nokogiri/css/tokenizer.rb +152 -0
  100. data/lib/nokogiri/css/tokenizer.rex +55 -0
  101. data/lib/nokogiri/css/xpath_visitor.rb +219 -0
  102. data/lib/nokogiri/decorators/slop.rb +35 -0
  103. data/lib/nokogiri/html.rb +37 -0
  104. data/lib/nokogiri/html/builder.rb +35 -0
  105. data/lib/nokogiri/html/document.rb +333 -0
  106. data/lib/nokogiri/html/document_fragment.rb +41 -0
  107. data/lib/nokogiri/html/element_description.rb +23 -0
  108. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  109. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  110. data/lib/nokogiri/html/sax/parser.rb +52 -0
  111. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  112. data/lib/nokogiri/html/sax/push_parser.rb +16 -0
  113. data/lib/nokogiri/syntax_error.rb +4 -0
  114. data/lib/nokogiri/version.rb +106 -0
  115. data/lib/nokogiri/xml.rb +73 -0
  116. data/lib/nokogiri/xml/attr.rb +14 -0
  117. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  118. data/lib/nokogiri/xml/builder.rb +443 -0
  119. data/lib/nokogiri/xml/cdata.rb +11 -0
  120. data/lib/nokogiri/xml/character_data.rb +7 -0
  121. data/lib/nokogiri/xml/document.rb +279 -0
  122. data/lib/nokogiri/xml/document_fragment.rb +112 -0
  123. data/lib/nokogiri/xml/dtd.rb +32 -0
  124. data/lib/nokogiri/xml/element_content.rb +36 -0
  125. data/lib/nokogiri/xml/element_decl.rb +13 -0
  126. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  127. data/lib/nokogiri/xml/namespace.rb +13 -0
  128. data/lib/nokogiri/xml/node.rb +982 -0
  129. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  130. data/lib/nokogiri/xml/node_set.rb +355 -0
  131. data/lib/nokogiri/xml/notation.rb +6 -0
  132. data/lib/nokogiri/xml/parse_options.rb +98 -0
  133. data/lib/nokogiri/xml/pp.rb +2 -0
  134. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  135. data/lib/nokogiri/xml/pp/node.rb +56 -0
  136. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  137. data/lib/nokogiri/xml/reader.rb +112 -0
  138. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  139. data/lib/nokogiri/xml/sax.rb +4 -0
  140. data/lib/nokogiri/xml/sax/document.rb +171 -0
  141. data/lib/nokogiri/xml/sax/parser.rb +123 -0
  142. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  143. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  144. data/lib/nokogiri/xml/schema.rb +63 -0
  145. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  146. data/lib/nokogiri/xml/text.rb +9 -0
  147. data/lib/nokogiri/xml/xpath.rb +10 -0
  148. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  149. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  150. data/lib/nokogiri/xslt.rb +56 -0
  151. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  152. data/lib/xsd/xmlparser/nokogiri.rb +102 -0
  153. data/suppressions/README.txt +1 -0
  154. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  155. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  156. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  157. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  158. data/tasks/nokogiri.org.rb +24 -0
  159. data/tasks/test.rb +95 -0
  160. data/test/css/test_nthiness.rb +222 -0
  161. data/test/css/test_parser.rb +358 -0
  162. data/test/css/test_tokenizer.rb +198 -0
  163. data/test/css/test_xpath_visitor.rb +96 -0
  164. data/test/decorators/test_slop.rb +16 -0
  165. data/test/files/2ch.html +108 -0
  166. data/test/files/address_book.rlx +12 -0
  167. data/test/files/address_book.xml +10 -0
  168. data/test/files/atom.xml +344 -0
  169. data/test/files/bar/bar.xsd +4 -0
  170. data/test/files/bogus.xml +0 -0
  171. data/test/files/dont_hurt_em_why.xml +422 -0
  172. data/test/files/encoding.html +82 -0
  173. data/test/files/encoding.xhtml +84 -0
  174. data/test/files/exslt.xml +8 -0
  175. data/test/files/exslt.xslt +35 -0
  176. data/test/files/foo/foo.xsd +4 -0
  177. data/test/files/metacharset.html +10 -0
  178. data/test/files/noencoding.html +47 -0
  179. data/test/files/po.xml +32 -0
  180. data/test/files/po.xsd +66 -0
  181. data/test/files/saml/saml20assertion_schema.xsd +283 -0
  182. data/test/files/saml/saml20protocol_schema.xsd +302 -0
  183. data/test/files/saml/xenc_schema.xsd +146 -0
  184. data/test/files/saml/xmldsig_schema.xsd +318 -0
  185. data/test/files/shift_jis.html +10 -0
  186. data/test/files/shift_jis.xml +5 -0
  187. data/test/files/shift_jis_no_charset.html +9 -0
  188. data/test/files/snuggles.xml +3 -0
  189. data/test/files/staff.dtd +10 -0
  190. data/test/files/staff.xml +59 -0
  191. data/test/files/staff.xslt +32 -0
  192. data/test/files/test_document_url/bar.xml +2 -0
  193. data/test/files/test_document_url/document.dtd +4 -0
  194. data/test/files/test_document_url/document.xml +6 -0
  195. data/test/files/tlm.html +850 -0
  196. data/test/files/to_be_xincluded.xml +2 -0
  197. data/test/files/valid_bar.xml +2 -0
  198. data/test/files/xinclude.xml +4 -0
  199. data/test/helper.rb +164 -0
  200. data/test/html/sax/test_parser.rb +141 -0
  201. data/test/html/sax/test_parser_context.rb +46 -0
  202. data/test/html/test_builder.rb +164 -0
  203. data/test/html/test_document.rb +619 -0
  204. data/test/html/test_document_encoding.rb +148 -0
  205. data/test/html/test_document_fragment.rb +261 -0
  206. data/test/html/test_element_description.rb +105 -0
  207. data/test/html/test_named_characters.rb +14 -0
  208. data/test/html/test_node.rb +196 -0
  209. data/test/html/test_node_encoding.rb +27 -0
  210. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
  211. data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
  212. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  213. data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
  214. data/test/namespaces/test_namespaces_in_parsed_doc.rb +66 -0
  215. data/test/test_convert_xpath.rb +135 -0
  216. data/test/test_css_cache.rb +45 -0
  217. data/test/test_encoding_handler.rb +46 -0
  218. data/test/test_memory_leak.rb +156 -0
  219. data/test/test_nokogiri.rb +138 -0
  220. data/test/test_reader.rb +558 -0
  221. data/test/test_soap4r_sax.rb +52 -0
  222. data/test/test_xslt_transforms.rb +279 -0
  223. data/test/xml/node/test_save_options.rb +28 -0
  224. data/test/xml/node/test_subclass.rb +44 -0
  225. data/test/xml/sax/test_parser.rb +382 -0
  226. data/test/xml/sax/test_parser_context.rb +115 -0
  227. data/test/xml/sax/test_push_parser.rb +157 -0
  228. data/test/xml/test_attr.rb +64 -0
  229. data/test/xml/test_attribute_decl.rb +86 -0
  230. data/test/xml/test_builder.rb +315 -0
  231. data/test/xml/test_c14n.rb +161 -0
  232. data/test/xml/test_cdata.rb +48 -0
  233. data/test/xml/test_comment.rb +29 -0
  234. data/test/xml/test_document.rb +934 -0
  235. data/test/xml/test_document_encoding.rb +28 -0
  236. data/test/xml/test_document_fragment.rb +228 -0
  237. data/test/xml/test_dtd.rb +187 -0
  238. data/test/xml/test_dtd_encoding.rb +33 -0
  239. data/test/xml/test_element_content.rb +56 -0
  240. data/test/xml/test_element_decl.rb +73 -0
  241. data/test/xml/test_entity_decl.rb +122 -0
  242. data/test/xml/test_entity_reference.rb +245 -0
  243. data/test/xml/test_namespace.rb +95 -0
  244. data/test/xml/test_node.rb +1155 -0
  245. data/test/xml/test_node_attributes.rb +113 -0
  246. data/test/xml/test_node_encoding.rb +107 -0
  247. data/test/xml/test_node_inheritance.rb +32 -0
  248. data/test/xml/test_node_reparenting.rb +374 -0
  249. data/test/xml/test_node_set.rb +755 -0
  250. data/test/xml/test_parse_options.rb +64 -0
  251. data/test/xml/test_processing_instruction.rb +30 -0
  252. data/test/xml/test_reader_encoding.rb +142 -0
  253. data/test/xml/test_relax_ng.rb +60 -0
  254. data/test/xml/test_schema.rb +129 -0
  255. data/test/xml/test_syntax_error.rb +12 -0
  256. data/test/xml/test_text.rb +45 -0
  257. data/test/xml/test_unparented_node.rb +422 -0
  258. data/test/xml/test_xinclude.rb +83 -0
  259. data/test/xml/test_xpath.rb +376 -0
  260. data/test/xslt/test_custom_functions.rb +133 -0
  261. data/test/xslt/test_exception_handling.rb +37 -0
  262. data/test_all +81 -0
  263. metadata +601 -0
@@ -0,0 +1,148 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "helper"
3
+
4
+ module Nokogiri
5
+ module HTML
6
+ if RUBY_VERSION =~ /^1\.9/
7
+ class TestDocumentEncoding < Nokogiri::TestCase
8
+ def test_encoding
9
+ doc = Nokogiri::HTML File.open(SHIFT_JIS_HTML, 'rb')
10
+
11
+ hello = "こんにちは"
12
+
13
+ assert_match doc.encoding, doc.to_html
14
+ assert_match hello.encode('Shift_JIS'), doc.to_html
15
+ assert_equal 'Shift_JIS', doc.to_html.encoding.name
16
+
17
+ assert_match hello, doc.to_html(:encoding => 'UTF-8')
18
+ assert_match 'UTF-8', doc.to_html(:encoding => 'UTF-8')
19
+ assert_match 'UTF-8', doc.to_html(:encoding => 'UTF-8').encoding.name
20
+ end
21
+
22
+ def test_encoding_without_charset
23
+ doc = Nokogiri::HTML File.open(SHIFT_JIS_NO_CHARSET, 'r:cp932:cp932').read
24
+
25
+ hello = "こんにちは"
26
+
27
+ assert_match hello, doc.content
28
+ assert_match hello, doc.to_html(:encoding => 'UTF-8')
29
+ assert_match 'UTF-8', doc.to_html(:encoding => 'UTF-8').encoding.name
30
+ end
31
+
32
+ def test_default_to_encoding_from_string
33
+ bad_charset = <<-eohtml
34
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
35
+ <html>
36
+ <head>
37
+ <meta http-equiv="Content-Type" content="text/html; charset=charset=UTF-8">
38
+ </head>
39
+ <body>
40
+ <a href="http://tenderlovemaking.com/">blah!</a>
41
+ </body>
42
+ </html>
43
+ eohtml
44
+ doc = Nokogiri::HTML(bad_charset)
45
+ assert_equal bad_charset.encoding.name, doc.encoding
46
+
47
+ doc = Nokogiri.parse(bad_charset)
48
+ assert_equal bad_charset.encoding.name, doc.encoding
49
+ end
50
+
51
+ def test_encoding_non_utf8
52
+ orig = '日本語が上手です'
53
+ bin = Encoding::ASCII_8BIT
54
+ [Encoding::Shift_JIS, Encoding::EUC_JP].each do |enc|
55
+ html = <<-eohtml.encode(enc)
56
+ <html>
57
+ <meta http-equiv="Content-Type" content="text/html; charset=#{enc.name}">
58
+ <title xml:lang="ja">#{orig}</title></html>
59
+ eohtml
60
+ text = Nokogiri::HTML.parse(html).at('title').inner_text
61
+ assert_equal(
62
+ orig.encode(enc).force_encoding(bin),
63
+ text.encode(enc).force_encoding(bin)
64
+ )
65
+ end
66
+ end
67
+
68
+ def test_encoding_with_a_bad_name
69
+ bad_charset = <<-eohtml
70
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
71
+ <html>
72
+ <head>
73
+ <meta http-equiv="Content-Type" content="text/html; charset=charset=UTF-8">
74
+ </head>
75
+ <body>
76
+ <a href="http://tenderlovemaking.com/">blah!</a>
77
+ </body>
78
+ </html>
79
+ eohtml
80
+ doc = Nokogiri::HTML(bad_charset, nil, 'askldjfhalsdfjhlkasdfjh')
81
+ assert_equal ['http://tenderlovemaking.com/'],
82
+ doc.css('a').map { |a| a['href'] }
83
+ end
84
+ end
85
+ end
86
+
87
+ class TestDocumentEncodingDetection < Nokogiri::TestCase
88
+ if IO.respond_to?(:binread)
89
+ def binread(file)
90
+ IO.binread(file)
91
+ end
92
+ else
93
+ def binread(file)
94
+ IO.read(file)
95
+ end
96
+ end
97
+
98
+ def binopen(file)
99
+ File.open(file, 'rb')
100
+ end
101
+
102
+ def test_document_html_noencoding
103
+ from_stream = Nokogiri::HTML(binopen(NOENCODING_FILE))
104
+ from_string = Nokogiri::HTML(binread(NOENCODING_FILE))
105
+
106
+ assert_equal from_string.to_s.size, from_stream.to_s.size
107
+ end
108
+
109
+ def test_document_html_charset
110
+ html = Nokogiri::HTML(binopen(METACHARSET_FILE))
111
+ assert_equal 'iso-2022-jp', html.encoding
112
+ assert_equal 'たこ焼き仮面', html.title
113
+ end
114
+
115
+ def test_document_xhtml_enc
116
+ [ENCODING_XHTML_FILE, ENCODING_HTML_FILE].each { |file|
117
+ doc_from_string_enc = Nokogiri::HTML(binread(file), nil, 'Shift_JIS')
118
+ ary_from_string_enc = doc_from_string_enc.xpath('//p/text()').map { |text| text.text }
119
+
120
+ doc_from_string = Nokogiri::HTML(binread(file))
121
+ ary_from_string = doc_from_string.xpath('//p/text()').map { |text| text.text }
122
+
123
+ doc_from_file_enc = Nokogiri::HTML(binopen(file), nil, 'Shift_JIS')
124
+ ary_from_file_enc = doc_from_file_enc.xpath('//p/text()').map { |text| text.text }
125
+
126
+ doc_from_file = Nokogiri::HTML(binopen(file))
127
+ ary_from_file = doc_from_file.xpath('//p/text()').map { |text| text.text }
128
+
129
+ title = 'たこ焼き仮面'
130
+
131
+ assert_equal(title, doc_from_string_enc.at('//title/text()').text)
132
+ assert_equal(title, doc_from_string.at('//title/text()').text)
133
+ assert_equal(title, doc_from_file_enc.at('//title/text()').text)
134
+ unless Nokogiri.jruby? && file == ENCODING_HTML_FILE
135
+ assert_equal(title, doc_from_file.at('//title/text()').text)
136
+ end
137
+
138
+ evil = (0..72).map { |i| '超' * i + '悪い事を構想中。' }
139
+
140
+ assert_equal(evil, ary_from_string_enc)
141
+ assert_equal(evil, ary_from_string)
142
+ assert_equal(evil, ary_from_file_enc)
143
+ assert_equal(evil, ary_from_file)
144
+ }
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,261 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "helper"
3
+
4
+ module Nokogiri
5
+ module HTML
6
+ class TestDocumentFragment < Nokogiri::TestCase
7
+ def setup
8
+ super
9
+ @html = Nokogiri::HTML.parse(File.read(HTML_FILE), HTML_FILE)
10
+ end
11
+
12
+ if RUBY_VERSION >= '1.9'
13
+ def test_inspect_encoding
14
+ fragment = "<div>こんにちは!</div>".encode('EUC-JP')
15
+ f = Nokogiri::HTML::DocumentFragment.parse fragment
16
+ assert_equal "こんにちは!", f.content
17
+ end
18
+
19
+ def test_html_parse_encoding
20
+ fragment = "<div>こんにちは!</div>".encode 'EUC-JP'
21
+ f = Nokogiri::HTML.fragment fragment
22
+ assert_equal 'EUC-JP', f.document.encoding
23
+ assert_equal "こんにちは!", f.content
24
+ end
25
+ end
26
+
27
+ def test_colons_are_not_removed
28
+ doc = Nokogiri::HTML::DocumentFragment.parse("<span>3:30pm</span>")
29
+ assert_match(/3:30/, doc.to_s)
30
+ end
31
+
32
+ def test_parse_encoding
33
+ fragment = "<div>hello world</div>"
34
+ f = Nokogiri::HTML::DocumentFragment.parse fragment, 'ISO-8859-1'
35
+ assert_equal 'ISO-8859-1', f.document.encoding
36
+ assert_equal "hello world", f.content
37
+ end
38
+
39
+ def test_html_parse_with_encoding
40
+ fragment = "<div>hello world</div>"
41
+ f = Nokogiri::HTML.fragment fragment, 'ISO-8859-1'
42
+ assert_equal 'ISO-8859-1', f.document.encoding
43
+ assert_equal "hello world", f.content
44
+ end
45
+
46
+ def test_parse_in_context
47
+ assert_equal('<br>', @html.root.parse('<br />').to_s)
48
+ end
49
+
50
+ def test_inner_html=
51
+ fragment = Nokogiri::HTML.fragment '<hr />'
52
+
53
+ fragment.inner_html = "hello"
54
+ assert_equal 'hello', fragment.inner_html
55
+ end
56
+
57
+ def test_ancestors_search
58
+ html = %q{
59
+ <div>
60
+ <ul>
61
+ <li>foo</li>
62
+ </ul>
63
+ </div>
64
+ }
65
+ fragment = Nokogiri::HTML.fragment html
66
+ li = fragment.at('li')
67
+ assert li.matches?('li')
68
+ end
69
+
70
+ def test_fun_encoding
71
+ string = %Q(<body>こんにちは</body>)
72
+ html = Nokogiri::HTML::DocumentFragment.parse(
73
+ string
74
+ ).to_html(:encoding => 'UTF-8')
75
+ assert_equal string, html
76
+ end
77
+
78
+ def test_new
79
+ assert Nokogiri::HTML::DocumentFragment.new(@html)
80
+ end
81
+
82
+ def test_body_fragment_should_contain_body
83
+ fragment = Nokogiri::HTML::DocumentFragment.parse(" <body><div>foo</div></body>")
84
+ assert_match(/^<body>/, fragment.to_s)
85
+ end
86
+
87
+ def test_nonbody_fragment_should_not_contain_body
88
+ fragment = Nokogiri::HTML::DocumentFragment.parse("<div>foo</div>")
89
+ assert_match(/^<div>/, fragment.to_s)
90
+ end
91
+
92
+ def test_fragment_should_have_document
93
+ fragment = Nokogiri::HTML::DocumentFragment.new(@html)
94
+ assert_equal @html, fragment.document
95
+ end
96
+
97
+ def test_empty_fragment_should_be_searchable_by_css
98
+ fragment = Nokogiri::HTML.fragment("")
99
+ assert_equal 0, fragment.css("a").size
100
+ end
101
+
102
+ def test_empty_fragment_should_be_searchable
103
+ fragment = Nokogiri::HTML.fragment("")
104
+ assert_equal 0, fragment.search("//a").size
105
+ end
106
+
107
+ def test_name
108
+ fragment = Nokogiri::HTML::DocumentFragment.new(@html)
109
+ assert_equal '#document-fragment', fragment.name
110
+ end
111
+
112
+ def test_static_method
113
+ fragment = Nokogiri::HTML::DocumentFragment.parse("<div>a</div>")
114
+ assert_instance_of Nokogiri::HTML::DocumentFragment, fragment
115
+ end
116
+
117
+ def test_many_fragments
118
+ 100.times { Nokogiri::HTML::DocumentFragment.new(@html) }
119
+ end
120
+
121
+ def test_subclass
122
+ klass = Class.new(Nokogiri::HTML::DocumentFragment)
123
+ fragment = klass.new(@html, "<div>a</div>")
124
+ assert_instance_of klass, fragment
125
+ end
126
+
127
+ def test_subclass_parse
128
+ klass = Class.new(Nokogiri::HTML::DocumentFragment)
129
+ doc = klass.parse("<div>a</div>")
130
+ assert_instance_of klass, doc
131
+ end
132
+
133
+ def test_html_fragment
134
+ fragment = Nokogiri::HTML.fragment("<div>a</div>")
135
+ assert_equal "<div>a</div>", fragment.to_s
136
+ end
137
+
138
+ def test_html_fragment_has_outer_text
139
+ doc = "a<div>b</div>c"
140
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
141
+ if Nokogiri.uses_libxml? &&
142
+ Nokogiri::VERSION_INFO['libxml']['loaded'] <= "2.6.16"
143
+ assert_equal "a<div>b</div><p>c</p>", fragment.to_s
144
+ else
145
+ assert_equal "a<div>b</div>c", fragment.to_s
146
+ end
147
+ end
148
+
149
+ def test_html_fragment_case_insensitivity
150
+ doc = "<Div>b</Div>"
151
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
152
+ assert_equal "<div>b</div>", fragment.to_s
153
+ end
154
+
155
+ def test_html_fragment_with_leading_whitespace
156
+ doc = " <div>b</div> "
157
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
158
+ assert_match %r% <div>b</div> *%, fragment.to_s
159
+ end
160
+
161
+ def test_html_fragment_with_leading_whitespace_and_newline
162
+ doc = " \n<div>b</div> "
163
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
164
+ assert_match %r% \n<div>b</div> *%, fragment.to_s
165
+ end
166
+
167
+ def test_html_fragment_with_leading_text_and_newline
168
+ fragment = HTML::Document.new.fragment("First line\nSecond line<br>Broken line")
169
+ assert_equal fragment.to_s, "First line\nSecond line<br>Broken line"
170
+ end
171
+
172
+ def test_html_fragment_with_leading_whitespace_and_text_and_newline
173
+ fragment = HTML::Document.new.fragment(" First line\nSecond line<br>Broken line")
174
+ assert_equal " First line\nSecond line<br>Broken line", fragment.to_s
175
+ end
176
+
177
+ def test_html_fragment_with_leading_entity
178
+ failed = "&quot;test<br/>test&quot;"
179
+ fragment = Nokogiri::HTML::DocumentFragment.parse(failed)
180
+ assert_equal '"test<br>test"', fragment.to_html
181
+ end
182
+
183
+ def test_to_s
184
+ doc = "<span>foo<br></span><span>bar</span>"
185
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
186
+ assert_equal "<span>foo<br></span><span>bar</span>", fragment.to_s
187
+ end
188
+
189
+ def test_to_html
190
+ doc = "<span>foo<br></span><span>bar</span>"
191
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
192
+ assert_equal "<span>foo<br></span><span>bar</span>", fragment.to_html
193
+ end
194
+
195
+ def test_to_xhtml
196
+ doc = "<span>foo<br></span><span>bar</span><p></p>"
197
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
198
+ if Nokogiri.jruby? || Nokogiri::VERSION_INFO['libxml']['loaded'] >= "2.7.0"
199
+ assert_equal "<span>foo<br /></span><span>bar</span><p></p>", fragment.to_xhtml
200
+ else
201
+ # FIXME: why are we doing this ? this violates the spec,
202
+ # see http://www.w3.org/TR/xhtml1/#C_2
203
+ assert_equal "<span>foo<br></span><span>bar</span><p></p>", fragment.to_xhtml
204
+ end
205
+ end
206
+
207
+ def test_to_xml
208
+ doc = "<span>foo<br></span><span>bar</span>"
209
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
210
+ assert_equal "<span>foo<br/></span><span>bar</span>", fragment.to_xml
211
+ end
212
+
213
+ def test_fragment_script_tag_with_cdata
214
+ doc = HTML::Document.new
215
+ fragment = doc.fragment("<script>var foo = 'bar';</script>")
216
+ assert_equal("<script>var foo = 'bar';</script>",
217
+ fragment.to_s)
218
+ end
219
+
220
+ def test_fragment_with_comment
221
+ doc = HTML::Document.new
222
+ fragment = doc.fragment("<p>hello<!-- your ad here --></p>")
223
+ assert_equal("<p>hello<!-- your ad here --></p>",
224
+ fragment.to_s)
225
+ end
226
+
227
+ def test_malformed_fragment_is_corrected
228
+ fragment = HTML::DocumentFragment.parse("<div </div>")
229
+ assert_equal "<div></div>", fragment.to_s
230
+ end
231
+
232
+ def test_unclosed_script_tag
233
+ # see GH#315
234
+ fragment = HTML::DocumentFragment.parse("foo <script>bar")
235
+ assert_equal "foo <script>bar</script>", fragment.to_html
236
+ end
237
+
238
+ def test_error_propagation_on_fragment_parse
239
+ frag = Nokogiri::HTML::DocumentFragment.parse "<hello>oh, hello there.</hello>"
240
+ assert frag.errors.any?{|err| err.to_s =~ /Tag hello invalid/}, "errors should be copied to the fragment"
241
+ end
242
+
243
+ def test_error_propagation_on_fragment_parse_in_node_context
244
+ doc = Nokogiri::HTML::Document.parse "<html><body><div></div></body></html>"
245
+ context_node = doc.at_css "div"
246
+ frag = Nokogiri::HTML::DocumentFragment.new doc, "<hello>oh, hello there.</hello>", context_node
247
+ assert frag.errors.any?{|err| err.to_s =~ /Tag hello invalid/}, "errors should be on the context node's document"
248
+ end
249
+
250
+ def test_error_propagation_on_fragment_parse_in_node_context_should_not_include_preexisting_errors
251
+ doc = Nokogiri::HTML::Document.parse "<html><body><div></div><jimmy></jimmy></body></html>"
252
+ assert doc.errors.any?{|err| err.to_s =~ /jimmy/}, "assert on setup"
253
+
254
+ context_node = doc.at_css "div"
255
+ frag = Nokogiri::HTML::DocumentFragment.new doc, "<hello>oh, hello there.</hello>", context_node
256
+ assert frag.errors.any?{|err| err.to_s =~ /Tag hello invalid/}, "errors should be on the context node's document"
257
+ assert frag.errors.none?{|err| err.to_s =~ /jimmy/}, "errors should not include pre-existing document errors"
258
+ end
259
+ end
260
+ end
261
+ end
@@ -0,0 +1,105 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module HTML
5
+ class TestElementDescription < Nokogiri::TestCase
6
+ def test_fetch_nonexistent
7
+ assert_nil ElementDescription['foo']
8
+ end
9
+
10
+ def test_fetch_element_description
11
+ assert desc = ElementDescription['a']
12
+ assert_instance_of ElementDescription, desc
13
+ end
14
+
15
+ def test_name
16
+ assert_equal 'a', ElementDescription['a'].name
17
+ end
18
+
19
+ def test_implied_start_tag?
20
+ assert !ElementDescription['a'].implied_start_tag?
21
+ end
22
+
23
+ def test_implied_end_tag?
24
+ assert !ElementDescription['a'].implied_end_tag?
25
+ assert ElementDescription['p'].implied_end_tag?
26
+ end
27
+
28
+ def test_save_end_tag?
29
+ assert !ElementDescription['a'].save_end_tag?
30
+ assert ElementDescription['br'].save_end_tag?
31
+ end
32
+
33
+ def test_empty?
34
+ assert ElementDescription['br'].empty?
35
+ assert !ElementDescription['a'].empty?
36
+ end
37
+
38
+ def test_deprecated?
39
+ assert ElementDescription['applet'].deprecated?
40
+ assert !ElementDescription['br'].deprecated?
41
+ end
42
+
43
+ def test_inline?
44
+ assert ElementDescription['a'].inline?
45
+ assert !ElementDescription['div'].inline?
46
+ end
47
+
48
+ def test_block?
49
+ element = ElementDescription['a']
50
+ assert_equal(!element.inline?, element.block?)
51
+ end
52
+
53
+ def test_description
54
+ assert ElementDescription['a'].description
55
+ end
56
+
57
+ def test_subelements
58
+ sub_elements = ElementDescription['body'].sub_elements
59
+ if Nokogiri.uses_libxml? && Nokogiri::LIBXML_VERSION >= '2.7.7'
60
+ assert_equal 65, sub_elements.length
61
+ elsif Nokogiri.uses_libxml?
62
+ assert_equal 61, sub_elements.length
63
+ else
64
+ assert sub_elements.length > 0
65
+ end
66
+ end
67
+
68
+ def test_default_sub_element
69
+ assert_equal 'div', ElementDescription['body'].default_sub_element
70
+ end
71
+
72
+ def test_null_default_sub_element
73
+ doc = Nokogiri::HTML('foo')
74
+ doc.root.description.default_sub_element
75
+ end
76
+
77
+ def test_optional_attributes
78
+ attrs = ElementDescription['table'].optional_attributes
79
+ assert attrs
80
+ end
81
+
82
+ def test_deprecated_attributes
83
+ attrs = ElementDescription['table'].deprecated_attributes
84
+ assert attrs
85
+ assert_equal 2, attrs.length
86
+ end
87
+
88
+ def test_required_attributes
89
+ attrs = ElementDescription['table'].required_attributes
90
+ assert attrs
91
+ assert_equal 0, attrs.length
92
+ end
93
+
94
+ def test_inspect
95
+ desc = ElementDescription['input']
96
+ assert_match desc.name, desc.inspect
97
+ end
98
+
99
+ def test_to_s
100
+ desc = ElementDescription['input']
101
+ assert_match desc.name, desc.to_s
102
+ end
103
+ end
104
+ end
105
+ end