nokogiri-maglev- 1.5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. data/.autotest +26 -0
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +544 -0
  4. data/CHANGELOG.rdoc +532 -0
  5. data/Manifest.txt +283 -0
  6. data/README.ja.rdoc +106 -0
  7. data/README.rdoc +174 -0
  8. data/Rakefile +171 -0
  9. data/bin/nokogiri +53 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +124 -0
  12. data/ext/nokogiri/html_document.c +154 -0
  13. data/ext/nokogiri/html_document.h +10 -0
  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 +32 -0
  17. data/ext/nokogiri/html_entity_lookup.h +8 -0
  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/nokogiri.c +115 -0
  21. data/ext/nokogiri/nokogiri.h +160 -0
  22. data/ext/nokogiri/st.c +576 -0
  23. data/ext/nokogiri/xml_attr.c +94 -0
  24. data/ext/nokogiri/xml_attr.h +9 -0
  25. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  26. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  27. data/ext/nokogiri/xml_cdata.c +56 -0
  28. data/ext/nokogiri/xml_cdata.h +9 -0
  29. data/ext/nokogiri/xml_comment.c +54 -0
  30. data/ext/nokogiri/xml_comment.h +9 -0
  31. data/ext/nokogiri/xml_document.c +478 -0
  32. data/ext/nokogiri/xml_document.h +23 -0
  33. data/ext/nokogiri/xml_document_fragment.c +48 -0
  34. data/ext/nokogiri/xml_document_fragment.h +10 -0
  35. data/ext/nokogiri/xml_dtd.c +202 -0
  36. data/ext/nokogiri/xml_dtd.h +10 -0
  37. data/ext/nokogiri/xml_element_content.c +123 -0
  38. data/ext/nokogiri/xml_element_content.h +10 -0
  39. data/ext/nokogiri/xml_element_decl.c +69 -0
  40. data/ext/nokogiri/xml_element_decl.h +9 -0
  41. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  42. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  43. data/ext/nokogiri/xml_entity_decl.c +110 -0
  44. data/ext/nokogiri/xml_entity_decl.h +10 -0
  45. data/ext/nokogiri/xml_entity_reference.c +52 -0
  46. data/ext/nokogiri/xml_entity_reference.h +9 -0
  47. data/ext/nokogiri/xml_io.c +56 -0
  48. data/ext/nokogiri/xml_io.h +11 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  50. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  51. data/ext/nokogiri/xml_namespace.c +84 -0
  52. data/ext/nokogiri/xml_namespace.h +13 -0
  53. data/ext/nokogiri/xml_node.c +1397 -0
  54. data/ext/nokogiri/xml_node.h +13 -0
  55. data/ext/nokogiri/xml_node_set.c +418 -0
  56. data/ext/nokogiri/xml_node_set.h +9 -0
  57. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  58. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  59. data/ext/nokogiri/xml_reader.c +684 -0
  60. data/ext/nokogiri/xml_reader.h +10 -0
  61. data/ext/nokogiri/xml_relax_ng.c +162 -0
  62. data/ext/nokogiri/xml_relax_ng.h +9 -0
  63. data/ext/nokogiri/xml_sax_parser.c +293 -0
  64. data/ext/nokogiri/xml_sax_parser.h +39 -0
  65. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  66. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  67. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  68. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  69. data/ext/nokogiri/xml_schema.c +205 -0
  70. data/ext/nokogiri/xml_schema.h +9 -0
  71. data/ext/nokogiri/xml_syntax_error.c +58 -0
  72. data/ext/nokogiri/xml_syntax_error.h +13 -0
  73. data/ext/nokogiri/xml_text.c +50 -0
  74. data/ext/nokogiri/xml_text.h +9 -0
  75. data/ext/nokogiri/xml_xpath_context.c +315 -0
  76. data/ext/nokogiri/xml_xpath_context.h +9 -0
  77. data/ext/nokogiri/xslt_stylesheet.c +265 -0
  78. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  79. data/lib/nokogiri.rb +127 -0
  80. data/lib/nokogiri/css.rb +27 -0
  81. data/lib/nokogiri/css/node.rb +99 -0
  82. data/lib/nokogiri/css/parser.rb +677 -0
  83. data/lib/nokogiri/css/parser.y +237 -0
  84. data/lib/nokogiri/css/parser_extras.rb +91 -0
  85. data/lib/nokogiri/css/syntax_error.rb +7 -0
  86. data/lib/nokogiri/css/tokenizer.rb +152 -0
  87. data/lib/nokogiri/css/tokenizer.rex +55 -0
  88. data/lib/nokogiri/css/xpath_visitor.rb +171 -0
  89. data/lib/nokogiri/decorators/slop.rb +35 -0
  90. data/lib/nokogiri/html.rb +36 -0
  91. data/lib/nokogiri/html/builder.rb +35 -0
  92. data/lib/nokogiri/html/document.rb +213 -0
  93. data/lib/nokogiri/html/document_fragment.rb +41 -0
  94. data/lib/nokogiri/html/element_description.rb +23 -0
  95. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  96. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  97. data/lib/nokogiri/html/sax/parser.rb +52 -0
  98. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  99. data/lib/nokogiri/syntax_error.rb +4 -0
  100. data/lib/nokogiri/version.rb +88 -0
  101. data/lib/nokogiri/xml.rb +67 -0
  102. data/lib/nokogiri/xml/attr.rb +14 -0
  103. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  104. data/lib/nokogiri/xml/builder.rb +426 -0
  105. data/lib/nokogiri/xml/cdata.rb +11 -0
  106. data/lib/nokogiri/xml/character_data.rb +7 -0
  107. data/lib/nokogiri/xml/document.rb +234 -0
  108. data/lib/nokogiri/xml/document_fragment.rb +98 -0
  109. data/lib/nokogiri/xml/dtd.rb +22 -0
  110. data/lib/nokogiri/xml/element_content.rb +36 -0
  111. data/lib/nokogiri/xml/element_decl.rb +13 -0
  112. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  113. data/lib/nokogiri/xml/namespace.rb +13 -0
  114. data/lib/nokogiri/xml/node.rb +915 -0
  115. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  116. data/lib/nokogiri/xml/node_set.rb +357 -0
  117. data/lib/nokogiri/xml/notation.rb +6 -0
  118. data/lib/nokogiri/xml/parse_options.rb +93 -0
  119. data/lib/nokogiri/xml/pp.rb +2 -0
  120. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  121. data/lib/nokogiri/xml/pp/node.rb +56 -0
  122. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  123. data/lib/nokogiri/xml/reader.rb +112 -0
  124. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  125. data/lib/nokogiri/xml/sax.rb +4 -0
  126. data/lib/nokogiri/xml/sax/document.rb +164 -0
  127. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  128. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  129. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  130. data/lib/nokogiri/xml/schema.rb +63 -0
  131. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  132. data/lib/nokogiri/xml/text.rb +9 -0
  133. data/lib/nokogiri/xml/xpath.rb +10 -0
  134. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  135. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  136. data/lib/nokogiri/xslt.rb +52 -0
  137. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  138. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  139. data/nokogiri_help_responses.md +40 -0
  140. data/tasks/cross_compile.rb +152 -0
  141. data/tasks/nokogiri.org.rb +18 -0
  142. data/tasks/test.rb +94 -0
  143. data/test/css/test_nthiness.rb +159 -0
  144. data/test/css/test_parser.rb +303 -0
  145. data/test/css/test_tokenizer.rb +198 -0
  146. data/test/css/test_xpath_visitor.rb +85 -0
  147. data/test/decorators/test_slop.rb +16 -0
  148. data/test/files/2ch.html +108 -0
  149. data/test/files/address_book.rlx +12 -0
  150. data/test/files/address_book.xml +10 -0
  151. data/test/files/bar/bar.xsd +4 -0
  152. data/test/files/dont_hurt_em_why.xml +422 -0
  153. data/test/files/encoding.html +82 -0
  154. data/test/files/encoding.xhtml +84 -0
  155. data/test/files/exslt.xml +8 -0
  156. data/test/files/exslt.xslt +35 -0
  157. data/test/files/foo/foo.xsd +4 -0
  158. data/test/files/metacharset.html +10 -0
  159. data/test/files/noencoding.html +47 -0
  160. data/test/files/po.xml +32 -0
  161. data/test/files/po.xsd +66 -0
  162. data/test/files/shift_jis.html +10 -0
  163. data/test/files/shift_jis.xml +5 -0
  164. data/test/files/snuggles.xml +3 -0
  165. data/test/files/staff.dtd +10 -0
  166. data/test/files/staff.xml +59 -0
  167. data/test/files/staff.xslt +32 -0
  168. data/test/files/tlm.html +850 -0
  169. data/test/files/valid_bar.xml +2 -0
  170. data/test/helper.rb +173 -0
  171. data/test/html/sax/test_parser.rb +139 -0
  172. data/test/html/sax/test_parser_context.rb +48 -0
  173. data/test/html/test_builder.rb +165 -0
  174. data/test/html/test_document.rb +472 -0
  175. data/test/html/test_document_encoding.rb +138 -0
  176. data/test/html/test_document_fragment.rb +255 -0
  177. data/test/html/test_element_description.rb +101 -0
  178. data/test/html/test_named_characters.rb +14 -0
  179. data/test/html/test_node.rb +193 -0
  180. data/test/html/test_node_encoding.rb +27 -0
  181. data/test/test_convert_xpath.rb +135 -0
  182. data/test/test_css_cache.rb +45 -0
  183. data/test/test_encoding_handler.rb +46 -0
  184. data/test/test_memory_leak.rb +72 -0
  185. data/test/test_nokogiri.rb +133 -0
  186. data/test/test_reader.rb +425 -0
  187. data/test/test_soap4r_sax.rb +52 -0
  188. data/test/test_xslt_transforms.rb +193 -0
  189. data/test/xml/node/test_save_options.rb +28 -0
  190. data/test/xml/node/test_subclass.rb +44 -0
  191. data/test/xml/sax/test_parser.rb +338 -0
  192. data/test/xml/sax/test_parser_context.rb +113 -0
  193. data/test/xml/sax/test_push_parser.rb +156 -0
  194. data/test/xml/test_attr.rb +65 -0
  195. data/test/xml/test_attribute_decl.rb +86 -0
  196. data/test/xml/test_builder.rb +227 -0
  197. data/test/xml/test_cdata.rb +50 -0
  198. data/test/xml/test_comment.rb +29 -0
  199. data/test/xml/test_document.rb +697 -0
  200. data/test/xml/test_document_encoding.rb +26 -0
  201. data/test/xml/test_document_fragment.rb +192 -0
  202. data/test/xml/test_dtd.rb +107 -0
  203. data/test/xml/test_dtd_encoding.rb +33 -0
  204. data/test/xml/test_element_content.rb +56 -0
  205. data/test/xml/test_element_decl.rb +73 -0
  206. data/test/xml/test_entity_decl.rb +122 -0
  207. data/test/xml/test_entity_reference.rb +21 -0
  208. data/test/xml/test_namespace.rb +70 -0
  209. data/test/xml/test_node.rb +917 -0
  210. data/test/xml/test_node_attributes.rb +34 -0
  211. data/test/xml/test_node_encoding.rb +107 -0
  212. data/test/xml/test_node_reparenting.rb +334 -0
  213. data/test/xml/test_node_set.rb +742 -0
  214. data/test/xml/test_parse_options.rb +52 -0
  215. data/test/xml/test_processing_instruction.rb +30 -0
  216. data/test/xml/test_reader_encoding.rb +126 -0
  217. data/test/xml/test_relax_ng.rb +60 -0
  218. data/test/xml/test_schema.rb +94 -0
  219. data/test/xml/test_syntax_error.rb +12 -0
  220. data/test/xml/test_text.rb +47 -0
  221. data/test/xml/test_unparented_node.rb +381 -0
  222. data/test/xml/test_xpath.rb +237 -0
  223. data/test/xslt/test_custom_functions.rb +94 -0
  224. data/test/xslt/test_exception_handling.rb +37 -0
  225. metadata +548 -0
@@ -0,0 +1,138 @@
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_default_to_encoding_from_string
23
+ bad_charset = <<-eohtml
24
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
25
+ <html>
26
+ <head>
27
+ <meta http-equiv="Content-Type" content="text/html; charset=charset=UTF-8">
28
+ </head>
29
+ <body>
30
+ <a href="http://tenderlovemaking.com/">blah!</a>
31
+ </body>
32
+ </html>
33
+ eohtml
34
+ doc = Nokogiri::HTML(bad_charset)
35
+ assert_equal bad_charset.encoding.name, doc.encoding
36
+
37
+ doc = Nokogiri.parse(bad_charset)
38
+ assert_equal bad_charset.encoding.name, doc.encoding
39
+ end
40
+
41
+ def test_encoding_non_utf8
42
+ orig = '日本語が上手です'
43
+ bin = Encoding::ASCII_8BIT
44
+ [Encoding::Shift_JIS, Encoding::EUC_JP].each do |enc|
45
+ html = <<-eohtml.encode(enc)
46
+ <html>
47
+ <meta http-equiv="Content-Type" content="text/html; charset=#{enc.name}">
48
+ <title xml:lang="ja">#{orig}</title></html>
49
+ eohtml
50
+ text = Nokogiri::HTML.parse(html).at('title').inner_text
51
+ assert_equal(
52
+ orig.encode(enc).force_encoding(bin),
53
+ text.encode(enc).force_encoding(bin)
54
+ )
55
+ end
56
+ end
57
+
58
+ def test_encoding_with_a_bad_name
59
+ bad_charset = <<-eohtml
60
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
61
+ <html>
62
+ <head>
63
+ <meta http-equiv="Content-Type" content="text/html; charset=charset=UTF-8">
64
+ </head>
65
+ <body>
66
+ <a href="http://tenderlovemaking.com/">blah!</a>
67
+ </body>
68
+ </html>
69
+ eohtml
70
+ doc = Nokogiri::HTML(bad_charset, nil, 'askldjfhalsdfjhlkasdfjh')
71
+ assert_equal ['http://tenderlovemaking.com/'],
72
+ doc.css('a').map { |a| a['href'] }
73
+ end
74
+ end
75
+ end
76
+
77
+ class TestDocumentEncodingDetection < Nokogiri::TestCase
78
+ if IO.respond_to?(:binread)
79
+ def binread(file)
80
+ IO.binread(file)
81
+ end
82
+ else
83
+ def binread(file)
84
+ IO.read(file)
85
+ end
86
+ end
87
+
88
+ def binopen(file)
89
+ File.open(file, 'rb')
90
+ end
91
+
92
+ def test_document_html_noencoding
93
+ from_stream = Nokogiri::HTML(binopen(NOENCODING_FILE))
94
+ from_string = Nokogiri::HTML(binread(NOENCODING_FILE))
95
+
96
+ assert_equal from_string.to_s.size, from_stream.to_s.size
97
+ end
98
+
99
+ def test_document_html_charset
100
+ html = Nokogiri::HTML(binopen(METACHARSET_FILE))
101
+ assert_equal 'iso-2022-jp', html.encoding
102
+ assert_equal 'たこ焼き仮面', html.title
103
+ end
104
+
105
+ def test_document_xhtml_enc
106
+ [ENCODING_XHTML_FILE, ENCODING_HTML_FILE].each { |file|
107
+ doc_from_string_enc = Nokogiri::HTML(binread(file), nil, 'Shift_JIS')
108
+ ary_from_string_enc = doc_from_string_enc.xpath('//p/text()').map { |text| text.text }
109
+
110
+ doc_from_string = Nokogiri::HTML(binread(file))
111
+ ary_from_string = doc_from_string.xpath('//p/text()').map { |text| text.text }
112
+
113
+ doc_from_file_enc = Nokogiri::HTML(binopen(file), nil, 'Shift_JIS')
114
+ ary_from_file_enc = doc_from_file_enc.xpath('//p/text()').map { |text| text.text }
115
+
116
+ doc_from_file = Nokogiri::HTML(binopen(file))
117
+ ary_from_file = doc_from_file.xpath('//p/text()').map { |text| text.text }
118
+
119
+ title = 'たこ焼き仮面'
120
+
121
+ assert_equal(title, doc_from_string_enc.at('//title/text()').text)
122
+ assert_equal(title, doc_from_string.at('//title/text()').text)
123
+ assert_equal(title, doc_from_file_enc.at('//title/text()').text)
124
+ unless Nokogiri.jruby? && file == ENCODING_HTML_FILE
125
+ assert_equal(title, doc_from_file.at('//title/text()').text)
126
+ end
127
+
128
+ evil = (0..72).map { |i| '超' * i + '悪い事を構想中。' }
129
+
130
+ assert_equal(evil, ary_from_string_enc)
131
+ assert_equal(evil, ary_from_string)
132
+ assert_equal(evil, ary_from_file_enc)
133
+ assert_equal(evil, ary_from_file)
134
+ }
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,255 @@
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_parse_encoding
28
+ fragment = "<div>hello world</div>"
29
+ f = Nokogiri::HTML::DocumentFragment.parse fragment, 'ISO-8859-1'
30
+ assert_equal 'ISO-8859-1', f.document.encoding
31
+ assert_equal "hello world", f.content
32
+ end
33
+
34
+ def test_html_parse_with_encoding
35
+ fragment = "<div>hello world</div>"
36
+ f = Nokogiri::HTML.fragment fragment, 'ISO-8859-1'
37
+ assert_equal 'ISO-8859-1', f.document.encoding
38
+ assert_equal "hello world", f.content
39
+ end
40
+
41
+ def test_parse_in_context
42
+ assert_equal('<br>', @html.root.parse('<br />').to_s)
43
+ end
44
+
45
+ def test_inner_html=
46
+ fragment = Nokogiri::HTML.fragment '<hr />'
47
+
48
+ fragment.inner_html = "hello"
49
+ assert_equal 'hello', fragment.inner_html
50
+ end
51
+
52
+ def test_ancestors_search
53
+ html = %q{
54
+ <div>
55
+ <ul>
56
+ <li>foo</li>
57
+ </ul>
58
+ </div>
59
+ }
60
+ fragment = Nokogiri::HTML.fragment html
61
+ li = fragment.at('li')
62
+ assert li.matches?('li')
63
+ end
64
+
65
+ def test_fun_encoding
66
+ string = %Q(<body>こんにちは</body>)
67
+ html = Nokogiri::HTML::DocumentFragment.parse(
68
+ string
69
+ ).to_html(:encoding => 'UTF-8')
70
+ assert_equal string, html
71
+ end
72
+
73
+ def test_new
74
+ assert Nokogiri::HTML::DocumentFragment.new(@html)
75
+ end
76
+
77
+ def test_body_fragment_should_contain_body
78
+ fragment = Nokogiri::HTML::DocumentFragment.parse(" <body><div>foo</div></body>")
79
+ assert_match(/^<body>/, fragment.to_s)
80
+ end
81
+
82
+ def test_nonbody_fragment_should_not_contain_body
83
+ fragment = Nokogiri::HTML::DocumentFragment.parse("<div>foo</div>")
84
+ assert_match(/^<div>/, fragment.to_s)
85
+ end
86
+
87
+ def test_fragment_should_have_document
88
+ fragment = Nokogiri::HTML::DocumentFragment.new(@html)
89
+ assert_equal @html, fragment.document
90
+ end
91
+
92
+ def test_empty_fragment_should_be_searchable_by_css
93
+ fragment = Nokogiri::HTML.fragment("")
94
+ assert_equal 0, fragment.css("a").size
95
+ end
96
+
97
+ def test_empty_fragment_should_be_searchable
98
+ fragment = Nokogiri::HTML.fragment("")
99
+ assert_equal 0, fragment.search("//a").size
100
+ end
101
+
102
+ def test_name
103
+ fragment = Nokogiri::HTML::DocumentFragment.new(@html)
104
+ assert_equal '#document-fragment', fragment.name
105
+ end
106
+
107
+ def test_static_method
108
+ fragment = Nokogiri::HTML::DocumentFragment.parse("<div>a</div>")
109
+ assert_instance_of Nokogiri::HTML::DocumentFragment, fragment
110
+ end
111
+
112
+ def test_many_fragments
113
+ 100.times { Nokogiri::HTML::DocumentFragment.new(@html) }
114
+ end
115
+
116
+ def test_subclass
117
+ klass = Class.new(Nokogiri::HTML::DocumentFragment)
118
+ fragment = klass.new(@html, "<div>a</div>")
119
+ assert_instance_of klass, fragment
120
+ end
121
+
122
+ def test_subclass_parse
123
+ klass = Class.new(Nokogiri::HTML::DocumentFragment)
124
+ doc = klass.parse("<div>a</div>")
125
+ assert_instance_of klass, doc
126
+ end
127
+
128
+ def test_html_fragment
129
+ fragment = Nokogiri::HTML.fragment("<div>a</div>")
130
+ assert_equal "<div>a</div>", fragment.to_s
131
+ end
132
+
133
+ def test_html_fragment_has_outer_text
134
+ doc = "a<div>b</div>c"
135
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
136
+ if Nokogiri.uses_libxml? &&
137
+ Nokogiri::VERSION_INFO['libxml']['loaded'] <= "2.6.16"
138
+ assert_equal "a<div>b</div><p>c</p>", fragment.to_s
139
+ else
140
+ assert_equal "a<div>b</div>c", fragment.to_s
141
+ end
142
+ end
143
+
144
+ def test_html_fragment_case_insensitivity
145
+ doc = "<Div>b</Div>"
146
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
147
+ assert_equal "<div>b</div>", fragment.to_s
148
+ end
149
+
150
+ def test_html_fragment_with_leading_whitespace
151
+ doc = " <div>b</div> "
152
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
153
+ assert_match %r% <div>b</div> *%, fragment.to_s
154
+ end
155
+
156
+ def test_html_fragment_with_leading_whitespace_and_newline
157
+ doc = " \n<div>b</div> "
158
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
159
+ assert_match %r% \n<div>b</div> *%, fragment.to_s
160
+ end
161
+
162
+ def test_html_fragment_with_leading_text_and_newline
163
+ fragment = HTML::Document.new.fragment("First line\nSecond line<br>Broken line")
164
+ assert_equal fragment.to_s, "First line\nSecond line<br>Broken line"
165
+ end
166
+
167
+ def test_html_fragment_with_leading_whitespace_and_text_and_newline
168
+ fragment = HTML::Document.new.fragment(" First line\nSecond line<br>Broken line")
169
+ assert_equal " First line\nSecond line<br>Broken line", fragment.to_s
170
+ end
171
+
172
+ def test_html_fragment_with_leading_entity
173
+ failed = "&quot;test<br/>test&quot;"
174
+ fragment = Nokogiri::HTML::DocumentFragment.parse(failed)
175
+ assert_equal '"test<br>test"', fragment.to_html
176
+ end
177
+
178
+ def test_to_s
179
+ doc = "<span>foo<br></span><span>bar</span>"
180
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
181
+ assert_equal "<span>foo<br></span><span>bar</span>", fragment.to_s
182
+ end
183
+
184
+ def test_to_html
185
+ doc = "<span>foo<br></span><span>bar</span>"
186
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
187
+ assert_equal "<span>foo<br></span><span>bar</span>", fragment.to_html
188
+ end
189
+
190
+ def test_to_xhtml
191
+ doc = "<span>foo<br></span><span>bar</span>"
192
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
193
+ if !Nokogiri.uses_libxml? ||
194
+ Nokogiri::VERSION_INFO['libxml']['loaded'] >= "2.7.0"
195
+ assert_equal "<span>foo<br /></span><span>bar</span>", fragment.to_xhtml
196
+ else
197
+ assert_equal "<span>foo<br></span><span>bar</span>", fragment.to_xhtml
198
+ end
199
+ end
200
+
201
+ def test_to_xml
202
+ doc = "<span>foo<br></span><span>bar</span>"
203
+ fragment = Nokogiri::HTML::Document.new.fragment(doc)
204
+ assert_equal "<span>foo<br/></span><span>bar</span>", fragment.to_xml
205
+ end
206
+
207
+ def test_fragment_script_tag_with_cdata
208
+ doc = HTML::Document.new
209
+ fragment = doc.fragment("<script>var foo = 'bar';</script>")
210
+ assert_equal("<script>var foo = 'bar';</script>",
211
+ fragment.to_s)
212
+ end
213
+
214
+ def test_fragment_with_comment
215
+ doc = HTML::Document.new
216
+ fragment = doc.fragment("<p>hello<!-- your ad here --></p>")
217
+ assert_equal("<p>hello<!-- your ad here --></p>",
218
+ fragment.to_s)
219
+ end
220
+
221
+ def test_malformed_fragment_is_corrected
222
+ fragment = HTML::DocumentFragment.parse("<div </div>")
223
+ assert_equal "<div></div>", fragment.to_s
224
+ end
225
+
226
+ def test_unclosed_script_tag
227
+ # see GH#315
228
+ fragment = HTML::DocumentFragment.parse("foo <script>bar")
229
+ assert_equal "foo <script>bar</script>", fragment.to_html
230
+ end
231
+
232
+ def test_error_propagation_on_fragment_parse
233
+ frag = Nokogiri::HTML::DocumentFragment.parse "<hello>oh, hello there.</hello>"
234
+ assert frag.errors.any?{|err| err.to_s =~ /Tag hello invalid/}, "errors should be copied to the fragment"
235
+ end
236
+
237
+ def test_error_propagation_on_fragment_parse_in_node_context
238
+ doc = Nokogiri::HTML::Document.parse "<html><body><div></div></body></html>"
239
+ context_node = doc.at_css "div"
240
+ frag = Nokogiri::HTML::DocumentFragment.new doc, "<hello>oh, hello there.</hello>", context_node
241
+ assert frag.errors.any?{|err| err.to_s =~ /Tag hello invalid/}, "errors should be on the context node's document"
242
+ end
243
+
244
+ def test_error_propagation_on_fragment_parse_in_node_context_should_not_include_preexisting_errors
245
+ doc = Nokogiri::HTML::Document.parse "<html><body><div></div><jimmy></jimmy></body></html>"
246
+ assert doc.errors.any?{|err| err.to_s =~ /jimmy/}, "assert on setup"
247
+
248
+ context_node = doc.at_css "div"
249
+ frag = Nokogiri::HTML::DocumentFragment.new doc, "<hello>oh, hello there.</hello>", context_node
250
+ assert frag.errors.any?{|err| err.to_s =~ /Tag hello invalid/}, "errors should be on the context node's document"
251
+ assert frag.errors.none?{|err| err.to_s =~ /jimmy/}, "errors should not include pre-existing document errors"
252
+ end
253
+ end
254
+ end
255
+ end
@@ -0,0 +1,101 @@
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
+ assert_equal 60, sub_elements.length # maglev deviation
64
+ else
65
+ assert sub_elements.length > 0
66
+ end
67
+ end
68
+
69
+ def test_default_sub_element
70
+ assert_equal 'div', ElementDescription['body'].default_sub_element
71
+ end
72
+
73
+ def test_optional_attributes
74
+ attrs = ElementDescription['table'].optional_attributes
75
+ assert attrs
76
+ end
77
+
78
+ def test_deprecated_attributes
79
+ attrs = ElementDescription['table'].deprecated_attributes
80
+ assert attrs
81
+ assert_equal 2, attrs.length
82
+ end
83
+
84
+ def test_required_attributes
85
+ attrs = ElementDescription['table'].required_attributes
86
+ assert attrs
87
+ assert_equal 0, attrs.length
88
+ end
89
+
90
+ def test_inspect
91
+ desc = ElementDescription['input']
92
+ assert_match desc.name, desc.inspect
93
+ end
94
+
95
+ def test_to_s
96
+ desc = ElementDescription['input']
97
+ assert_match desc.name, desc.to_s
98
+ end
99
+ end
100
+ end
101
+ end