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,113 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "helper"
4
+
5
+ module Nokogiri
6
+ module XML
7
+ module SAX
8
+ class TestParserContext < Nokogiri::SAX::TestCase
9
+ def setup
10
+ @xml = '<hello>
11
+
12
+ world
13
+ <inter>
14
+ <net>
15
+ </net>
16
+ </inter>
17
+
18
+ </hello>'
19
+ end
20
+
21
+ class Counter < Nokogiri::XML::SAX::Document
22
+ attr_accessor :context, :lines, :columns
23
+ def initialize
24
+ @context = nil
25
+ @lines = []
26
+ @columns = []
27
+ end
28
+
29
+ def start_element name, attrs = []
30
+ @lines << [name, context.line]
31
+ @columns << [name, context.column]
32
+ end
33
+ end
34
+
35
+ def test_line_numbers
36
+ sax_handler = Counter.new
37
+
38
+ parser = Nokogiri::XML::SAX::Parser.new(sax_handler)
39
+ parser.parse(@xml) do |ctx|
40
+ sax_handler.context = ctx
41
+ end
42
+
43
+ assert_equal [["hello", 1], ["inter", 4], ["net", 5]],
44
+ sax_handler.lines
45
+ end
46
+
47
+ def test_column_numbers
48
+ sax_handler = Counter.new
49
+
50
+ parser = Nokogiri::XML::SAX::Parser.new(sax_handler)
51
+ parser.parse(@xml) do |ctx|
52
+ sax_handler.context = ctx
53
+ end
54
+
55
+ assert_equal [["hello", 7], ["inter", 7], ["net", 9]],
56
+ sax_handler.columns
57
+ end
58
+
59
+ def test_replace_entities
60
+ pc = ParserContext.new StringIO.new('<root />'), 'UTF-8'
61
+ pc.replace_entities = false
62
+ assert_equal false, pc.replace_entities
63
+
64
+ pc.replace_entities = true
65
+ assert_equal true, pc.replace_entities
66
+ end
67
+
68
+ def test_from_io
69
+ assert_nothing_raised do
70
+ ParserContext.new StringIO.new('fo'), 'UTF-8'
71
+ end
72
+ end
73
+
74
+ def test_from_string
75
+ assert_nothing_raised do
76
+ ParserContext.new 'blah blah'
77
+ end
78
+ end
79
+
80
+ def test_parse_with
81
+ ctx = ParserContext.new 'blah'
82
+ assert_raises ArgumentError do
83
+ ctx.parse_with nil
84
+ end
85
+ end
86
+
87
+ def test_parse_with_sax_parser
88
+ assert_nothing_raised do
89
+ xml = "<root />"
90
+ ctx = ParserContext.new xml
91
+ parser = Parser.new Doc.new
92
+ ctx.parse_with parser
93
+ end
94
+ end
95
+
96
+ def test_from_file
97
+ assert_nothing_raised do
98
+ ctx = ParserContext.file XML_FILE
99
+ parser = Parser.new Doc.new
100
+ ctx.parse_with parser
101
+ end
102
+ end
103
+
104
+ def test_parse_with_returns_nil
105
+ xml = "<root />"
106
+ ctx = ParserContext.new xml
107
+ parser = Parser.new Doc.new
108
+ assert_nil ctx.parse_with(parser)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,156 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "helper"
4
+
5
+ module Nokogiri
6
+ module XML
7
+ module SAX
8
+ class TestPushParser < Nokogiri::SAX::TestCase
9
+ def setup
10
+ super
11
+ @parser = XML::SAX::PushParser.new(Doc.new)
12
+ end
13
+
14
+ def test_exception
15
+ assert_raises(SyntaxError) do
16
+ @parser << "<foo /><foo />"
17
+ end
18
+
19
+ assert_raises(SyntaxError) do
20
+ @parser << nil
21
+ end
22
+ end
23
+
24
+ def test_end_document_called
25
+ @parser.<<(<<-eoxml)
26
+ <p id="asdfasdf">
27
+ <!-- This is a comment -->
28
+ Paragraph 1
29
+ </p>
30
+ eoxml
31
+ assert ! @parser.document.end_document_called
32
+ @parser.finish
33
+ assert @parser.document.end_document_called
34
+ end
35
+
36
+ def test_start_element
37
+ @parser.<<(<<-eoxml)
38
+ <p id="asdfasdf">
39
+ eoxml
40
+
41
+ assert_equal [["p", [["id", "asdfasdf"]]]],
42
+ @parser.document.start_elements
43
+
44
+ @parser.<<(<<-eoxml)
45
+ <!-- This is a comment -->
46
+ Paragraph 1
47
+ </p>
48
+ eoxml
49
+ assert_equal [' This is a comment '], @parser.document.comments
50
+ @parser.finish
51
+ end
52
+
53
+ def test_start_element_with_namespaces
54
+ @parser.<<(<<-eoxml)
55
+ <p xmlns:foo="http://foo.example.com/">
56
+ eoxml
57
+
58
+ assert_equal [["p", [["xmlns:foo", "http://foo.example.com/"]]]],
59
+ @parser.document.start_elements
60
+
61
+ @parser.<<(<<-eoxml)
62
+ <!-- This is a comment -->
63
+ Paragraph 1
64
+ </p>
65
+ eoxml
66
+ assert_equal [' This is a comment '], @parser.document.comments
67
+ @parser.finish
68
+ end
69
+
70
+ def test_start_element_ns
71
+ @parser.<<(<<-eoxml)
72
+ <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' size='large'></stream:stream>
73
+ eoxml
74
+
75
+ assert_equal 1, @parser.document.start_elements_namespace.length
76
+ el = @parser.document.start_elements_namespace.first
77
+
78
+ assert_equal 'stream', el.first
79
+ assert_equal 2, el[1].length
80
+ assert_equal [['version', '1.0'], ['size', 'large']],
81
+ el[1].map { |x| [x.localname, x.value] }
82
+
83
+ assert_equal 'stream', el[2]
84
+ assert_equal 'http://etherx.jabber.org/streams', el[3]
85
+ @parser.finish
86
+ end
87
+
88
+ def test_end_element_ns
89
+ @parser.<<(<<-eoxml)
90
+ <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'></stream:stream>
91
+ eoxml
92
+
93
+ assert_equal [['stream', 'stream', 'http://etherx.jabber.org/streams']],
94
+ @parser.document.end_elements_namespace
95
+ @parser.finish
96
+ end
97
+
98
+ def test_chevron_partial_xml
99
+ @parser.<<(<<-eoxml)
100
+ <p id="asdfasdf">
101
+ eoxml
102
+
103
+ @parser.<<(<<-eoxml)
104
+ <!-- This is a comment -->
105
+ Paragraph 1
106
+ </p>
107
+ eoxml
108
+ assert_equal [' This is a comment '], @parser.document.comments
109
+ @parser.finish
110
+ end
111
+
112
+ def test_chevron
113
+ @parser.<<(<<-eoxml)
114
+ <p id="asdfasdf">
115
+ <!-- This is a comment -->
116
+ Paragraph 1
117
+ </p>
118
+ eoxml
119
+ @parser.finish
120
+ assert_equal [' This is a comment '], @parser.document.comments
121
+ end
122
+
123
+ def test_default_options
124
+ assert_equal 0, @parser.options
125
+ end
126
+
127
+ def test_recover
128
+ @parser.options |= XML::ParseOptions::RECOVER
129
+ @parser.<<(<<-eoxml)
130
+ <p>
131
+ Foo
132
+ <bar>
133
+ Bar
134
+ </p>
135
+ eoxml
136
+ @parser.finish
137
+ assert(@parser.document.errors.size >= 1)
138
+ assert_equal [["p", []], ["bar", []]], @parser.document.start_elements
139
+ assert_equal "FooBar", @parser.document.data.map { |x|
140
+ x.gsub(/\s/, '')
141
+ }.join
142
+ end
143
+
144
+ def test_broken_encoding
145
+ @parser.options |= XML::ParseOptions::RECOVER
146
+ # This is ISO_8859-1:
147
+ @parser.<< "<?xml version='1.0' encoding='UTF-8'?><r>Gau\337</r>"
148
+ @parser.finish
149
+ assert(@parser.document.errors.size >= 1)
150
+ assert_equal "Gau\337", @parser.document.data.join
151
+ assert_equal [["r"]], @parser.document.end_elements
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,65 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestAttr < Nokogiri::TestCase
6
+ def test_new
7
+ assert_nothing_raised do
8
+ 100.times {
9
+ doc = Nokogiri::XML::Document.new
10
+ Nokogiri::XML::Attr.new(doc, 'foo')
11
+ }
12
+ end
13
+ end
14
+
15
+ def test_content=
16
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
17
+ address = xml.xpath('//address')[3]
18
+ street = address.attributes['street']
19
+ street.content = "Y&ent1;"
20
+ assert_equal "Y&ent1;", street.value
21
+ end
22
+
23
+ def test_value=
24
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
25
+ address = xml.xpath('//address')[3]
26
+ street = address.attributes['street']
27
+ street.value = "Y&ent1;"
28
+ assert_equal "Y&ent1;", street.value
29
+ end
30
+
31
+ def test_unlink
32
+ xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
33
+ address = xml.xpath('/staff/employee/address').first
34
+ assert_equal 'Yes', address['domestic']
35
+ address.attribute_nodes.first.unlink
36
+ assert_nil address['domestic']
37
+ end
38
+
39
+ def test_parsing_attribute_namespace
40
+ doc = Nokogiri::XML <<-EOXML
41
+ <root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
42
+ <div f:myattr='foo'></div>
43
+ </root>
44
+ EOXML
45
+
46
+ node = doc.at_css "div"
47
+ attr = node.attributes["myattr"]
48
+ assert_equal "http://flavorjon.es/", attr.namespace.href
49
+ end
50
+
51
+ def test_setting_attribute_namespace
52
+ doc = Nokogiri::XML <<-EOXML
53
+ <root xmlns='http://google.com/' xmlns:f='http://flavorjon.es/'>
54
+ <div f:myattr='foo'></div>
55
+ </root>
56
+ EOXML
57
+
58
+ node = doc.at_css "div"
59
+ attr = node.attributes["myattr"]
60
+ attr.add_namespace("fizzle", "http://fizzle.com/")
61
+ assert_equal "http://fizzle.com/", attr.namespace.href
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,86 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestAttributeDecl < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML(<<-eoxml)
9
+ <?xml version="1.0"?><?TEST-STYLE PIDATA?>
10
+ <!DOCTYPE staff SYSTEM "staff.dtd" [
11
+ <!ATTLIST br width CDATA "0">
12
+ <!ATTLIST a width CDATA "0">
13
+ <!ATTLIST payment type (check|cash) "cash">
14
+ ]>
15
+ <root />
16
+ eoxml
17
+ @attrs = @xml.internal_subset.children
18
+ @attr_decl = @attrs.first
19
+ end
20
+
21
+ def test_inspect
22
+ assert_equal(
23
+ "#<#{@attr_decl.class.name}:#{sprintf("0x%x", @attr_decl.object_id)} #{@attr_decl.to_s.inspect}>",
24
+ @attr_decl.inspect
25
+ )
26
+ end
27
+
28
+ def test_type
29
+ assert_equal 16, @attr_decl.type
30
+ end
31
+
32
+ def test_class
33
+ assert_instance_of Nokogiri::XML::AttributeDecl, @attr_decl
34
+ end
35
+
36
+ def test_content
37
+ assert_raise NoMethodError do
38
+ @attr_decl.content
39
+ end
40
+ end
41
+
42
+ def test_attributes
43
+ assert_raise NoMethodError do
44
+ @attr_decl.attributes
45
+ end
46
+ end
47
+
48
+ def test_namespace
49
+ assert_raise NoMethodError do
50
+ @attr_decl.namespace
51
+ end
52
+ end
53
+
54
+ def test_namespace_definitions
55
+ assert_raise NoMethodError do
56
+ @attr_decl.namespace_definitions
57
+ end
58
+ end
59
+
60
+ def test_line
61
+ assert_raise NoMethodError do
62
+ @attr_decl.line
63
+ end
64
+ end
65
+
66
+ def test_attribute_type
67
+ if Nokogiri.uses_libxml?
68
+ assert_equal 1, @attr_decl.attribute_type
69
+ else
70
+ assert_equal 'CDATA', @attr_decl.attribute_type
71
+ end
72
+ end
73
+
74
+ def test_default
75
+ assert_equal '0', @attr_decl.default
76
+ assert_equal '0', @attrs[1].default
77
+ end
78
+
79
+ def test_enumeration
80
+ assert_equal [], @attr_decl.enumeration
81
+ assert_equal ['check', 'cash'], @attrs[2].enumeration
82
+ end
83
+ end
84
+ end
85
+ end
86
+
@@ -0,0 +1,227 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestBuilder < Nokogiri::TestCase
6
+ def test_attribute_sensitivity
7
+ xml = Nokogiri::XML::Builder.new { |x|
8
+ x.tag "hello", "abcDef" => "world"
9
+ }.to_xml
10
+ doc = Nokogiri.XML xml
11
+ assert_equal 'world', doc.root['abcDef']
12
+ end
13
+
14
+ def test_builder_escape
15
+ xml = Nokogiri::XML::Builder.new { |x|
16
+ x.condition "value < 1", :attr => "value < 1"
17
+ }.to_xml
18
+ doc = Nokogiri.XML xml
19
+ assert_equal 'value < 1', doc.root['attr']
20
+ assert_equal 'value < 1', doc.root.content
21
+ end
22
+
23
+ def test_builder_namespace
24
+ doc = Nokogiri::XML::Builder.new { |xml|
25
+ xml.a("xmlns:a" => "x") do
26
+ xml.b("xmlns:a" => "x", "xmlns:b" => "y")
27
+ end
28
+ }.doc
29
+
30
+ b = doc.at('b')
31
+ assert b
32
+ assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y"}, b.namespaces)
33
+ assert_equal({"xmlns:b"=>"y"}, namespaces_defined_on(b))
34
+ end
35
+
36
+ def test_builder_namespace_part_deux
37
+ doc = Nokogiri::XML::Builder.new { |xml|
38
+ xml.a("xmlns:b" => "y") do
39
+ xml.b("xmlns:a" => "x", "xmlns:b" => "y", "xmlns:c" => "z")
40
+ end
41
+ }.doc
42
+
43
+ b = doc.at('b')
44
+ assert b
45
+ assert_equal({"xmlns:a"=>"x", "xmlns:b"=>"y", "xmlns:c"=>"z"}, b.namespaces)
46
+ assert_equal({"xmlns:a"=>"x", "xmlns:c"=>"z"}, namespaces_defined_on(b))
47
+ end
48
+
49
+ def test_builder_with_unlink
50
+ assert_nothing_raised do
51
+ Nokogiri::XML::Builder.new do |xml|
52
+ xml.foo do
53
+ xml.bar { xml.parent.unlink }
54
+ xml.bar2
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ def test_with_root
61
+ doc = Nokogiri::XML(File.read(XML_FILE))
62
+ Nokogiri::XML::Builder.with(doc.at('employee')) do |xml|
63
+ xml.foo
64
+ end
65
+ assert_equal 1, doc.xpath('//employee/foo').length
66
+ end
67
+
68
+ def test_root_namespace_default_decl
69
+ b = Nokogiri::XML::Builder.new { |xml| xml.root(:xmlns => 'one:two') }
70
+ doc = b.doc
71
+ assert_equal 'one:two', doc.root.namespace.href
72
+ assert_equal({ 'xmlns' => 'one:two' }, doc.root.namespaces)
73
+ end
74
+
75
+ def test_root_namespace_multi_decl
76
+ b = Nokogiri::XML::Builder.new { |xml|
77
+ xml.root(:xmlns => 'one:two', 'xmlns:foo' => 'bar') do
78
+ xml.hello
79
+ end
80
+ }
81
+ doc = b.doc
82
+ assert_equal 'one:two', doc.root.namespace.href
83
+ assert_equal({ 'xmlns' => 'one:two', 'xmlns:foo' => 'bar' }, doc.root.namespaces)
84
+
85
+ assert_equal 'one:two', doc.at('hello').namespace.href
86
+ end
87
+
88
+ def test_non_root_namespace
89
+ b = Nokogiri::XML::Builder.new { |xml|
90
+ xml.root { xml.hello(:xmlns => 'one') }
91
+ }
92
+ assert_equal 'one', b.doc.at('hello', 'xmlns' => 'one').namespace.href
93
+ end
94
+
95
+ def test_specify_namespace
96
+ b = Nokogiri::XML::Builder.new { |xml|
97
+ xml.root('xmlns:foo' => 'bar') do
98
+ xml[:foo].bar
99
+ xml['foo'].baz
100
+ end
101
+ }
102
+ doc = b.doc
103
+ assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
104
+ assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
105
+ end
106
+
107
+ def test_specify_namespace_nested
108
+ b = Nokogiri::XML::Builder.new { |xml|
109
+ xml.root('xmlns:foo' => 'bar') do
110
+ xml.yay do
111
+ xml[:foo].bar
112
+
113
+ xml.yikes do
114
+ xml['foo'].baz
115
+ end
116
+ end
117
+ end
118
+ }
119
+ doc = b.doc
120
+ assert_equal 'bar', doc.at('foo|bar', 'foo' => 'bar').namespace.href
121
+ assert_equal 'bar', doc.at('foo|baz', 'foo' => 'bar').namespace.href
122
+ end
123
+
124
+ def test_specified_namespace_undeclared
125
+ Nokogiri::XML::Builder.new { |xml|
126
+ xml.root do
127
+ assert_raises(ArgumentError) do
128
+ xml[:foo]
129
+ end
130
+ end
131
+ }
132
+ end
133
+
134
+ def test_set_encoding
135
+ builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
136
+ xml.root do
137
+ xml.bar 'blah'
138
+ end
139
+ end
140
+ assert_match 'UTF-8', builder.to_xml
141
+ end
142
+
143
+ def test_bang_and_underscore_is_escaped
144
+ builder = Nokogiri::XML::Builder.new do |xml|
145
+ xml.root do
146
+ xml.p_('adsfadsf')
147
+ xml.p!('adsfadsf')
148
+ end
149
+ end
150
+ assert_equal 2, builder.doc.xpath('//p').length
151
+ end
152
+
153
+ def test_square_brackets_set_attributes
154
+ builder = Nokogiri::XML::Builder.new do |xml|
155
+ xml.root do
156
+ foo = xml.foo
157
+ foo['id'] = 'hello'
158
+ assert_equal 'hello', foo['id']
159
+ end
160
+ end
161
+ assert_equal 1, builder.doc.xpath('//foo[@id = "hello"]').length
162
+ end
163
+
164
+ def test_nested_local_variable
165
+ @ivar = 'hello'
166
+ local_var = 'hello world'
167
+ builder = Nokogiri::XML::Builder.new do |xml|
168
+ xml.root do
169
+ xml.foo local_var
170
+ xml.bar @ivar
171
+ xml.baz {
172
+ xml.text @ivar
173
+ }
174
+ end
175
+ end
176
+
177
+ assert_equal 'hello world', builder.doc.at('//root/foo').content
178
+ assert_equal 'hello', builder.doc.at('//root/bar').content
179
+ assert_equal 'hello', builder.doc.at('baz').content
180
+ end
181
+
182
+ def test_raw_append
183
+ builder = Nokogiri::XML::Builder.new do |xml|
184
+ xml.root do
185
+ xml << 'hello'
186
+ end
187
+ end
188
+
189
+ assert_equal 'hello', builder.doc.at('/root').content
190
+ end
191
+
192
+ def test_raw_append_with_instance_eval
193
+ builder = Nokogiri::XML::Builder.new do
194
+ root do
195
+ self << 'hello'
196
+ end
197
+ end
198
+
199
+ assert_equal 'hello', builder.doc.at('/root').content
200
+ end
201
+
202
+ def test_cdata
203
+ builder = Nokogiri::XML::Builder.new do
204
+ root {
205
+ cdata "hello world"
206
+ }
207
+ end
208
+ assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>", builder.to_xml.gsub(/\n/, ''))
209
+ end
210
+
211
+ def test_builder_no_block
212
+ string = "hello world"
213
+ builder = Nokogiri::XML::Builder.new
214
+ builder.root {
215
+ cdata string
216
+ }
217
+ assert_equal("<?xml version=\"1.0\"?><root><![CDATA[hello world]]></root>", builder.to_xml.gsub(/\n/, ''))
218
+ end
219
+
220
+ private
221
+
222
+ def namespaces_defined_on(node)
223
+ Hash[*node.namespace_definitions.collect{|n| ["xmlns:" + n.prefix, n.href]}.flatten]
224
+ end
225
+ end
226
+ end
227
+ end