nokogiri-backupify 1.5.0.beta.4

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 (275) hide show
  1. data/.autotest +26 -0
  2. data/CHANGELOG.ja.rdoc +509 -0
  3. data/CHANGELOG.rdoc +490 -0
  4. data/Manifest.txt +274 -0
  5. data/README.ja.rdoc +106 -0
  6. data/README.rdoc +150 -0
  7. data/Rakefile +217 -0
  8. data/bin/nokogiri +54 -0
  9. data/deps.rip +5 -0
  10. data/ext/java/nokogiri/EncodingHandler.java +124 -0
  11. data/ext/java/nokogiri/HtmlDocument.java +146 -0
  12. data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  13. data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  14. data/ext/java/nokogiri/HtmlSaxParserContext.java +256 -0
  15. data/ext/java/nokogiri/NokogiriService.java +466 -0
  16. data/ext/java/nokogiri/XmlAttr.java +183 -0
  17. data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  18. data/ext/java/nokogiri/XmlCdata.java +89 -0
  19. data/ext/java/nokogiri/XmlComment.java +84 -0
  20. data/ext/java/nokogiri/XmlDocument.java +514 -0
  21. data/ext/java/nokogiri/XmlDocumentFragment.java +216 -0
  22. data/ext/java/nokogiri/XmlDtd.java +464 -0
  23. data/ext/java/nokogiri/XmlElement.java +221 -0
  24. data/ext/java/nokogiri/XmlElementContent.java +382 -0
  25. data/ext/java/nokogiri/XmlElementDecl.java +147 -0
  26. data/ext/java/nokogiri/XmlEntityDecl.java +161 -0
  27. data/ext/java/nokogiri/XmlEntityReference.java +75 -0
  28. data/ext/java/nokogiri/XmlNamespace.java +127 -0
  29. data/ext/java/nokogiri/XmlNode.java +1392 -0
  30. data/ext/java/nokogiri/XmlNodeSet.java +284 -0
  31. data/ext/java/nokogiri/XmlProcessingInstruction.java +103 -0
  32. data/ext/java/nokogiri/XmlReader.java +409 -0
  33. data/ext/java/nokogiri/XmlRelaxng.java +199 -0
  34. data/ext/java/nokogiri/XmlSaxParserContext.java +353 -0
  35. data/ext/java/nokogiri/XmlSaxPushParser.java +182 -0
  36. data/ext/java/nokogiri/XmlSchema.java +175 -0
  37. data/ext/java/nokogiri/XmlSyntaxError.java +114 -0
  38. data/ext/java/nokogiri/XmlText.java +135 -0
  39. data/ext/java/nokogiri/XmlXpathContext.java +175 -0
  40. data/ext/java/nokogiri/XsltStylesheet.java +181 -0
  41. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +205 -0
  42. data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  43. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +80 -0
  44. data/ext/java/nokogiri/internals/NokogiriHandler.java +326 -0
  45. data/ext/java/nokogiri/internals/NokogiriHelpers.java +583 -0
  46. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +170 -0
  47. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +118 -0
  48. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +73 -0
  49. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  50. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +78 -0
  51. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +120 -0
  52. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +56 -0
  53. data/ext/java/nokogiri/internals/ParserContext.java +278 -0
  54. data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
  55. data/ext/java/nokogiri/internals/ReaderNode.java +473 -0
  56. data/ext/java/nokogiri/internals/SaveContext.java +282 -0
  57. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +68 -0
  58. data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  59. data/ext/java/nokogiri/internals/XmlDomParser.java +77 -0
  60. data/ext/java/nokogiri/internals/XmlDomParserContext.java +233 -0
  61. data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  62. data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  63. data/ext/nokogiri/depend +358 -0
  64. data/ext/nokogiri/extconf.rb +124 -0
  65. data/ext/nokogiri/html_document.c +154 -0
  66. data/ext/nokogiri/html_document.h +10 -0
  67. data/ext/nokogiri/html_element_description.c +276 -0
  68. data/ext/nokogiri/html_element_description.h +10 -0
  69. data/ext/nokogiri/html_entity_lookup.c +32 -0
  70. data/ext/nokogiri/html_entity_lookup.h +8 -0
  71. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  72. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  73. data/ext/nokogiri/nokogiri.c +92 -0
  74. data/ext/nokogiri/nokogiri.h +160 -0
  75. data/ext/nokogiri/xml_attr.c +94 -0
  76. data/ext/nokogiri/xml_attr.h +9 -0
  77. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  78. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  79. data/ext/nokogiri/xml_cdata.c +56 -0
  80. data/ext/nokogiri/xml_cdata.h +9 -0
  81. data/ext/nokogiri/xml_comment.c +54 -0
  82. data/ext/nokogiri/xml_comment.h +9 -0
  83. data/ext/nokogiri/xml_document.c +478 -0
  84. data/ext/nokogiri/xml_document.h +23 -0
  85. data/ext/nokogiri/xml_document_fragment.c +48 -0
  86. data/ext/nokogiri/xml_document_fragment.h +10 -0
  87. data/ext/nokogiri/xml_dtd.c +202 -0
  88. data/ext/nokogiri/xml_dtd.h +10 -0
  89. data/ext/nokogiri/xml_element_content.c +123 -0
  90. data/ext/nokogiri/xml_element_content.h +10 -0
  91. data/ext/nokogiri/xml_element_decl.c +69 -0
  92. data/ext/nokogiri/xml_element_decl.h +9 -0
  93. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  94. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  95. data/ext/nokogiri/xml_entity_decl.c +110 -0
  96. data/ext/nokogiri/xml_entity_decl.h +10 -0
  97. data/ext/nokogiri/xml_entity_reference.c +52 -0
  98. data/ext/nokogiri/xml_entity_reference.h +9 -0
  99. data/ext/nokogiri/xml_io.c +31 -0
  100. data/ext/nokogiri/xml_io.h +11 -0
  101. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  102. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  103. data/ext/nokogiri/xml_namespace.c +84 -0
  104. data/ext/nokogiri/xml_namespace.h +13 -0
  105. data/ext/nokogiri/xml_node.c +1384 -0
  106. data/ext/nokogiri/xml_node.h +13 -0
  107. data/ext/nokogiri/xml_node_set.c +418 -0
  108. data/ext/nokogiri/xml_node_set.h +9 -0
  109. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  110. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  111. data/ext/nokogiri/xml_reader.c +684 -0
  112. data/ext/nokogiri/xml_reader.h +10 -0
  113. data/ext/nokogiri/xml_relax_ng.c +161 -0
  114. data/ext/nokogiri/xml_relax_ng.h +9 -0
  115. data/ext/nokogiri/xml_sax_parser.c +288 -0
  116. data/ext/nokogiri/xml_sax_parser.h +39 -0
  117. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  118. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  119. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  120. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  121. data/ext/nokogiri/xml_schema.c +205 -0
  122. data/ext/nokogiri/xml_schema.h +9 -0
  123. data/ext/nokogiri/xml_syntax_error.c +58 -0
  124. data/ext/nokogiri/xml_syntax_error.h +13 -0
  125. data/ext/nokogiri/xml_text.c +50 -0
  126. data/ext/nokogiri/xml_text.h +9 -0
  127. data/ext/nokogiri/xml_xpath_context.c +309 -0
  128. data/ext/nokogiri/xml_xpath_context.h +9 -0
  129. data/ext/nokogiri/xslt_stylesheet.c +258 -0
  130. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  131. data/lib/isorelax.jar +0 -0
  132. data/lib/jing.jar +0 -0
  133. data/lib/nekodtd.jar +0 -0
  134. data/lib/nekohtml.jar +0 -0
  135. data/lib/nokogiri.rb +143 -0
  136. data/lib/nokogiri/css.rb +23 -0
  137. data/lib/nokogiri/css/node.rb +99 -0
  138. data/lib/nokogiri/css/parser.rb +677 -0
  139. data/lib/nokogiri/css/parser.y +237 -0
  140. data/lib/nokogiri/css/parser_extras.rb +91 -0
  141. data/lib/nokogiri/css/syntax_error.rb +7 -0
  142. data/lib/nokogiri/css/tokenizer.rb +152 -0
  143. data/lib/nokogiri/css/tokenizer.rex +55 -0
  144. data/lib/nokogiri/css/xpath_visitor.rb +171 -0
  145. data/lib/nokogiri/decorators/slop.rb +35 -0
  146. data/lib/nokogiri/html.rb +36 -0
  147. data/lib/nokogiri/html/builder.rb +35 -0
  148. data/lib/nokogiri/html/document.rb +221 -0
  149. data/lib/nokogiri/html/document_fragment.rb +41 -0
  150. data/lib/nokogiri/html/element_description.rb +23 -0
  151. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  152. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  153. data/lib/nokogiri/html/sax/parser.rb +52 -0
  154. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  155. data/lib/nokogiri/syntax_error.rb +4 -0
  156. data/lib/nokogiri/version.rb +35 -0
  157. data/lib/nokogiri/xml.rb +67 -0
  158. data/lib/nokogiri/xml/attr.rb +14 -0
  159. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  160. data/lib/nokogiri/xml/builder.rb +418 -0
  161. data/lib/nokogiri/xml/cdata.rb +11 -0
  162. data/lib/nokogiri/xml/character_data.rb +7 -0
  163. data/lib/nokogiri/xml/document.rb +218 -0
  164. data/lib/nokogiri/xml/document_fragment.rb +84 -0
  165. data/lib/nokogiri/xml/dtd.rb +22 -0
  166. data/lib/nokogiri/xml/element_content.rb +36 -0
  167. data/lib/nokogiri/xml/element_decl.rb +13 -0
  168. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  169. data/lib/nokogiri/xml/namespace.rb +13 -0
  170. data/lib/nokogiri/xml/node.rb +907 -0
  171. data/lib/nokogiri/xml/node/save_options.rb +45 -0
  172. data/lib/nokogiri/xml/node_set.rb +350 -0
  173. data/lib/nokogiri/xml/notation.rb +6 -0
  174. data/lib/nokogiri/xml/parse_options.rb +85 -0
  175. data/lib/nokogiri/xml/pp.rb +2 -0
  176. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  177. data/lib/nokogiri/xml/pp/node.rb +56 -0
  178. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  179. data/lib/nokogiri/xml/reader.rb +112 -0
  180. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  181. data/lib/nokogiri/xml/sax.rb +4 -0
  182. data/lib/nokogiri/xml/sax/document.rb +164 -0
  183. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  184. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  185. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  186. data/lib/nokogiri/xml/schema.rb +57 -0
  187. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  188. data/lib/nokogiri/xml/text.rb +9 -0
  189. data/lib/nokogiri/xml/xpath.rb +10 -0
  190. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  191. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  192. data/lib/nokogiri/xslt.rb +52 -0
  193. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  194. data/lib/xercesImpl.jar +0 -0
  195. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  196. data/tasks/cross_compile.rb +177 -0
  197. data/tasks/test.rb +94 -0
  198. data/test/css/test_nthiness.rb +159 -0
  199. data/test/css/test_parser.rb +303 -0
  200. data/test/css/test_tokenizer.rb +198 -0
  201. data/test/css/test_xpath_visitor.rb +85 -0
  202. data/test/decorators/test_slop.rb +16 -0
  203. data/test/files/2ch.html +108 -0
  204. data/test/files/address_book.rlx +12 -0
  205. data/test/files/address_book.xml +10 -0
  206. data/test/files/bar/bar.xsd +4 -0
  207. data/test/files/dont_hurt_em_why.xml +422 -0
  208. data/test/files/exslt.xml +8 -0
  209. data/test/files/exslt.xslt +35 -0
  210. data/test/files/foo/foo.xsd +4 -0
  211. data/test/files/po.xml +32 -0
  212. data/test/files/po.xsd +66 -0
  213. data/test/files/shift_jis.html +10 -0
  214. data/test/files/shift_jis.xml +5 -0
  215. data/test/files/snuggles.xml +3 -0
  216. data/test/files/staff.dtd +10 -0
  217. data/test/files/staff.xml +59 -0
  218. data/test/files/staff.xslt +32 -0
  219. data/test/files/tlm.html +850 -0
  220. data/test/files/valid_bar.xml +2 -0
  221. data/test/helper.rb +171 -0
  222. data/test/html/sax/test_parser.rb +136 -0
  223. data/test/html/sax/test_parser_context.rb +48 -0
  224. data/test/html/test_builder.rb +164 -0
  225. data/test/html/test_document.rb +457 -0
  226. data/test/html/test_document_encoding.rb +123 -0
  227. data/test/html/test_document_fragment.rb +255 -0
  228. data/test/html/test_element_description.rb +100 -0
  229. data/test/html/test_named_characters.rb +14 -0
  230. data/test/html/test_node.rb +190 -0
  231. data/test/html/test_node_encoding.rb +27 -0
  232. data/test/test_convert_xpath.rb +135 -0
  233. data/test/test_css_cache.rb +45 -0
  234. data/test/test_encoding_handler.rb +46 -0
  235. data/test/test_memory_leak.rb +52 -0
  236. data/test/test_nokogiri.rb +132 -0
  237. data/test/test_reader.rb +403 -0
  238. data/test/test_soap4r_sax.rb +52 -0
  239. data/test/test_xslt_transforms.rb +189 -0
  240. data/test/xml/node/test_save_options.rb +20 -0
  241. data/test/xml/node/test_subclass.rb +44 -0
  242. data/test/xml/sax/test_parser.rb +338 -0
  243. data/test/xml/sax/test_parser_context.rb +113 -0
  244. data/test/xml/sax/test_push_parser.rb +156 -0
  245. data/test/xml/test_attr.rb +65 -0
  246. data/test/xml/test_attribute_decl.rb +86 -0
  247. data/test/xml/test_builder.rb +210 -0
  248. data/test/xml/test_cdata.rb +50 -0
  249. data/test/xml/test_comment.rb +29 -0
  250. data/test/xml/test_document.rb +675 -0
  251. data/test/xml/test_document_encoding.rb +26 -0
  252. data/test/xml/test_document_fragment.rb +192 -0
  253. data/test/xml/test_dtd.rb +107 -0
  254. data/test/xml/test_dtd_encoding.rb +33 -0
  255. data/test/xml/test_element_content.rb +56 -0
  256. data/test/xml/test_element_decl.rb +73 -0
  257. data/test/xml/test_entity_decl.rb +122 -0
  258. data/test/xml/test_entity_reference.rb +21 -0
  259. data/test/xml/test_namespace.rb +70 -0
  260. data/test/xml/test_node.rb +899 -0
  261. data/test/xml/test_node_attributes.rb +34 -0
  262. data/test/xml/test_node_encoding.rb +107 -0
  263. data/test/xml/test_node_reparenting.rb +321 -0
  264. data/test/xml/test_node_set.rb +708 -0
  265. data/test/xml/test_parse_options.rb +52 -0
  266. data/test/xml/test_processing_instruction.rb +30 -0
  267. data/test/xml/test_reader_encoding.rb +126 -0
  268. data/test/xml/test_relax_ng.rb +60 -0
  269. data/test/xml/test_schema.rb +89 -0
  270. data/test/xml/test_syntax_error.rb +12 -0
  271. data/test/xml/test_text.rb +47 -0
  272. data/test/xml/test_unparented_node.rb +381 -0
  273. data/test/xml/test_xpath.rb +237 -0
  274. data/test/xslt/test_custom_functions.rb +94 -0
  275. metadata +525 -0
@@ -0,0 +1,34 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestNodeAttributes < Nokogiri::TestCase
6
+ def test_attribute_with_ns
7
+ doc = Nokogiri::XML <<-eoxml
8
+ <root xmlns:tlm='http://tenderlovemaking.com/'>
9
+ <node tlm:foo='bar' foo='baz' />
10
+ </root>
11
+ eoxml
12
+
13
+ node = doc.at('node')
14
+
15
+ assert_equal 'bar',
16
+ node.attribute_with_ns('foo', 'http://tenderlovemaking.com/').value
17
+ end
18
+
19
+ def test_namespace_key?
20
+ doc = Nokogiri::XML <<-eoxml
21
+ <root xmlns:tlm='http://tenderlovemaking.com/'>
22
+ <node tlm:foo='bar' foo='baz' />
23
+ </root>
24
+ eoxml
25
+
26
+ node = doc.at('node')
27
+
28
+ assert node.namespaced_key?('foo', 'http://tenderlovemaking.com/')
29
+ assert node.namespaced_key?('foo', nil)
30
+ assert !node.namespaced_key?('foo', 'foo')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,107 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ if RUBY_VERSION =~ /^1\.9/
6
+ class TestNodeEncoding < Nokogiri::TestCase
7
+ def setup
8
+ super
9
+ @html = Nokogiri::HTML(File.read(HTML_FILE), HTML_FILE)
10
+ end
11
+
12
+ def test_get_attribute
13
+ node = @html.css('a').first
14
+ assert_equal @html.encoding, node['href'].encoding.name
15
+ end
16
+
17
+ def test_text_encoding_is_utf_8
18
+ @html = Nokogiri::HTML(File.open(NICH_FILE))
19
+ assert_equal 'UTF-8', @html.text.encoding.name
20
+ end
21
+
22
+ def test_serialize_encoding_html
23
+ @html = Nokogiri::HTML(File.open(NICH_FILE))
24
+ assert_equal @html.encoding.downcase,
25
+ @html.serialize.encoding.name.downcase
26
+
27
+ @doc = Nokogiri::HTML(@html.serialize)
28
+ assert_equal @html.serialize, @doc.serialize
29
+ end
30
+
31
+ def test_serialize_encoding_xml
32
+ @xml = Nokogiri::XML(File.open(SHIFT_JIS_XML))
33
+ assert_equal @xml.encoding.downcase,
34
+ @xml.serialize.encoding.name.downcase
35
+
36
+ @doc = Nokogiri::XML(@xml.serialize)
37
+ assert_equal @xml.serialize, @doc.serialize
38
+ end
39
+
40
+ def test_encode_special_chars
41
+ foo = @html.css('a').first.encode_special_chars('foo')
42
+ assert_equal @html.encoding, foo.encoding.name
43
+ end
44
+
45
+ def test_content
46
+ node = @html.css('a').first
47
+ assert_equal @html.encoding, node.content.encoding.name
48
+ end
49
+
50
+ def test_name
51
+ node = @html.css('a').first
52
+ assert_equal @html.encoding, node.name.encoding.name
53
+ end
54
+
55
+ def test_path
56
+ node = @html.css('a').first
57
+ assert_equal @html.encoding, node.path.encoding.name
58
+ end
59
+
60
+ def test_namespace
61
+ xml = <<-eoxml
62
+ <root>
63
+ <car xmlns:part="http://general-motors.com/">
64
+ <part:tire>Michelin Model XGV</part:tire>
65
+ </car>
66
+ <bicycle xmlns:part="http://schwinn.com/">
67
+ <part:tire>I'm a bicycle tire!</part:tire>
68
+ </bicycle>
69
+ </root>
70
+ eoxml
71
+ doc = Nokogiri::XML(xml, nil, 'UTF-8')
72
+ assert_equal 'UTF-8', doc.encoding
73
+ n = doc.xpath('//part:tire', { 'part' => 'http://schwinn.com/' }).first
74
+ assert n
75
+ assert_equal doc.encoding, n.namespace.href.encoding.name
76
+ assert_equal doc.encoding, n.namespace.prefix.encoding.name
77
+ end
78
+
79
+ def test_namespace_as_hash
80
+ xml = <<-eoxml
81
+ <root>
82
+ <car xmlns:part="http://general-motors.com/">
83
+ <part:tire>Michelin Model XGV</part:tire>
84
+ </car>
85
+ <bicycle xmlns:part="http://schwinn.com/">
86
+ <part:tire>I'm a bicycle tire!</part:tire>
87
+ </bicycle>
88
+ </root>
89
+ eoxml
90
+ doc = Nokogiri::XML(xml, nil, 'UTF-8')
91
+ assert_equal 'UTF-8', doc.encoding
92
+ assert n = doc.xpath('//car').first
93
+
94
+ n.namespace_definitions.each do |nd|
95
+ assert_equal doc.encoding, nd.href.encoding.name
96
+ assert_equal doc.encoding, nd.prefix.encoding.name
97
+ end
98
+
99
+ n.namespaces.each do |k,v|
100
+ assert_equal doc.encoding, k.encoding.name
101
+ assert_equal doc.encoding, v.encoding.name
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,321 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestNodeReparenting < Nokogiri::TestCase
6
+
7
+ describe "standard node reparenting behavior" do
8
+ # describe "namespace handling during reparenting" do
9
+ # describe "given a Node" do
10
+ # describe "with a Namespace" do
11
+ # it "keeps the Namespace"
12
+ # end
13
+ # describe "given a parent Node with a default and a non-default Namespace" do
14
+ # describe "passed an Node without a namespace" do
15
+ # it "inserts an Node that inherits the default Namespace"
16
+ # end
17
+ # describe "passed a Node with a Namespace that matches the parent's non-default Namespace" do
18
+ # it "inserts a Node that inherits the matching parent Namespace"
19
+ # end
20
+ # end
21
+ # end
22
+ # describe "given a markup string" do
23
+ # describe "parsed relative to the document" do
24
+ # describe "with a Namespace" do
25
+ # it "keeps the Namespace"
26
+ # end
27
+ # describe "given a parent Node with a default and a non-default Namespace" do
28
+ # describe "passed an Node without a namespace" do
29
+ # it "inserts an Node that inherits the default Namespace"
30
+ # end
31
+ # describe "passed a Node with a Namespace that matches the parent's non-default Namespace" do
32
+ # it "inserts a Node that inherits the matching parent Namespace"
33
+ # end
34
+ # end
35
+ # end
36
+ # describe "parsed relative to a specific node" do
37
+ # describe "with a Namespace" do
38
+ # it "keeps the Namespace"
39
+ # end
40
+ # describe "given a parent Node with a default and a non-default Namespace" do
41
+ # describe "passed an Node without a namespace" do
42
+ # it "inserts an Node that inherits the default Namespace"
43
+ # end
44
+ # describe "passed a Node with a Namespace that matches the parent's non-default Namespace" do
45
+ # it "inserts a Node that inherits the matching parent Namespace"
46
+ # end
47
+ # end
48
+ # end
49
+ # end
50
+ # end
51
+
52
+ {
53
+ :add_child => {:target => "/root/a1", :returns_self => false, :children_tags => %w[text b1 b2]},
54
+ :<< => {:target => "/root/a1", :returns_self => false, :children_tags => %w[text b1 b2]},
55
+
56
+ :replace => {:target => "/root/a1/node()", :returns_self => false, :children_tags => %w[b1 b2]},
57
+ :swap => {:target => "/root/a1/node()", :returns_self => true, :children_tags => %w[b1 b2]},
58
+
59
+ :children= => {:target => "/root/a1", :returns_self => false, :children_tags => %w[b1 b2]},
60
+ :inner_html= => {:target => "/root/a1", :returns_self => true, :children_tags => %w[b1 b2]},
61
+
62
+ :add_previous_sibling => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[b1 b2 text]},
63
+ :previous= => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[b1 b2 text]},
64
+ :before => {:target => "/root/a1/text()", :returns_self => true, :children_tags => %w[b1 b2 text]},
65
+
66
+ :add_next_sibling => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[text b1 b2]},
67
+ :next= => {:target => "/root/a1/text()", :returns_self => false, :children_tags => %w[text b1 b2]},
68
+ :after => {:target => "/root/a1/text()", :returns_self => true, :children_tags => %w[text b1 b2]}
69
+ }.each do |method, params|
70
+
71
+ before do
72
+ @doc = Nokogiri::XML "<root><a1>First node</a1><a2>Second node</a2><a3>Third <bx />node</a3></root>"
73
+ @doc2 = @doc.dup
74
+ @fragment_string = "<b1>foo</b1><b2>bar</b2>"
75
+ @fragment = Nokogiri::XML::DocumentFragment.parse @fragment_string
76
+ @node_set = Nokogiri::XML("<root><b1>foo</b1><b2>bar</b2></root>").xpath("/root/node()")
77
+ end
78
+
79
+ describe "##{method}" do
80
+ describe "passed a Node" do
81
+ [:current, :another].each do |which|
82
+ describe "passed a Node in the #{which} document" do
83
+ before do
84
+ @other_doc = which == :current ? @doc : @doc2
85
+ @other_node = @other_doc.at_xpath("/root/a2")
86
+ end
87
+
88
+ it "unlinks the Node from its previous position" do
89
+ @doc.at_xpath(params[:target]).send(method, @other_node)
90
+ @other_doc.at_xpath("/root/a2").must_be_nil
91
+ end
92
+
93
+ it "inserts the Node in the proper position" do
94
+ @doc.at_xpath(params[:target]).send(method, @other_node)
95
+ @doc.at_xpath("/root/a1/a2").wont_be_nil
96
+ end
97
+
98
+ it "returns the expected value" do
99
+ sendee = @doc.at_xpath(params[:target])
100
+ result = sendee.send(method, @other_node)
101
+ if params[:returns_self]
102
+ result.must_equal sendee
103
+ else
104
+ result.must_equal @other_node
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ describe "passed a markup string" do
111
+ it "inserts the fragment roots in the proper position" do
112
+ @doc.at_xpath(params[:target]).send(method, @fragment_string)
113
+ @doc.xpath("/root/a1/node()").collect {|n| n.name}.must_equal params[:children_tags]
114
+ end
115
+
116
+ it "returns the expected value" do
117
+ sendee = @doc.at_xpath(params[:target])
118
+ result = sendee.send(method, @fragment_string)
119
+ if params[:returns_self]
120
+ result.must_equal sendee
121
+ else
122
+ result.must_be_kind_of Nokogiri::XML::NodeSet
123
+ result.to_html.must_equal @fragment_string
124
+ end
125
+ end
126
+ end
127
+ describe "passed a fragment" do
128
+ it "inserts the fragment roots in the proper position" do
129
+ @doc.at_xpath(params[:target]).send(method, @fragment)
130
+ @doc.xpath("/root/a1/node()").collect {|n| n.name}.must_equal params[:children_tags]
131
+ end
132
+ end
133
+ describe "passed a document" do
134
+ it "raises an exception" do
135
+ proc { @doc.at_xpath("/root/a1").send(method, @doc2) }.must_raise(ArgumentError)
136
+ end
137
+ end
138
+ describe "passed a non-Node" do
139
+ it "raises an exception" do
140
+ proc { @doc.at_xpath("/root/a1").send(method, 42) }.must_raise(ArgumentError)
141
+ end
142
+ end
143
+ describe "passed a NodeSet" do
144
+ it "inserts each member of the NodeSet in the proper order" do
145
+ @doc.at_xpath(params[:target]).send(method, @node_set)
146
+ @doc.xpath("/root/a1/node()").collect {|n| n.name}.must_equal params[:children_tags]
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ describe "text node merging" do
153
+ describe "#add_child" do
154
+ it "merges the Text node with adjacent Text nodes" do
155
+ @doc.at_xpath("/root/a1").add_child Nokogiri::XML::Text.new('hello', @doc)
156
+ @doc.at_xpath("/root/a1/text()").content.must_equal "First nodehello"
157
+ end
158
+ end
159
+ describe "#replace" do
160
+ it "merges the Text node with adjacent Text nodes" do
161
+ @doc.at_xpath("/root/a3/bx").replace Nokogiri::XML::Text.new('hello', @doc)
162
+ @doc.at_xpath("/root/a3/text()").content.must_equal "Third hellonode"
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ describe "ad hoc node reparenting behavior" do
169
+ describe "#add_child" do
170
+ describe "given a new node with a namespace" do
171
+ it "keeps the namespace" do
172
+ doc = Nokogiri::XML::Document.new
173
+ item = Nokogiri::XML::Element.new('item', doc)
174
+ doc.root = item
175
+
176
+ entry = Nokogiri::XML::Element.new('entry', doc)
177
+ entry.add_namespace('tlm', 'http://tenderlovemaking.com')
178
+ assert_equal 'http://tenderlovemaking.com', entry.namespaces['xmlns:tlm']
179
+ item.add_child(entry)
180
+ assert_equal 'http://tenderlovemaking.com', entry.namespaces['xmlns:tlm']
181
+ end
182
+ end
183
+
184
+ describe "given a parent node with a default namespace" do
185
+ before do
186
+ @doc = Nokogiri::XML(<<-eoxml)
187
+ <root xmlns="http://tenderlovemaking.com/">
188
+ <first>
189
+ </first>
190
+ </root>
191
+ eoxml
192
+ end
193
+
194
+ it "inserts a node that inherits the default namespace" do
195
+ assert node = @doc.at('//xmlns:first')
196
+ child = Nokogiri::XML::Node.new('second', @doc)
197
+ node.add_child(child)
198
+ assert @doc.at('//xmlns:second')
199
+ end
200
+ end
201
+
202
+ describe "given a parent node with a non-default namespace" do
203
+ before do
204
+ @doc = Nokogiri::XML(<<-eoxml)
205
+ <root xmlns="http://tenderlovemaking.com/" xmlns:foo="http://flavorjon.es/">
206
+ <first>
207
+ </first>
208
+ </root>
209
+ eoxml
210
+ end
211
+
212
+ describe "and a child node with a namespace matching the parent's non-default namespace" do
213
+ it "inserts a node that inherits the matching parent namespace" do
214
+ assert node = @doc.at('//xmlns:first')
215
+ child = Nokogiri::XML::Node.new('second', @doc)
216
+
217
+ ns = @doc.root.namespace_definitions.detect { |x| x.prefix == "foo" }
218
+ child.namespace = ns
219
+
220
+ node.add_child(child)
221
+ assert @doc.at('//foo:second', "foo" => "http://flavorjon.es/")
222
+ end
223
+ end
224
+ end
225
+ end
226
+
227
+ describe "#add_previous_sibling" do
228
+ it "should not merge text nodes during the operation" do
229
+ xml = Nokogiri::XML %Q(<root>text node</root>)
230
+ replacee = xml.root.children.first
231
+ replacee.add_previous_sibling "foo <p></p> bar"
232
+ assert_equal "foo <p></p> bartext node", xml.root.children.to_html
233
+ end
234
+ end
235
+
236
+ describe "#add_next_sibling" do
237
+ it "should not merge text nodes during the operation" do
238
+ xml = Nokogiri::XML %Q(<root>text node</root>)
239
+ replacee = xml.root.children.first
240
+ replacee.add_next_sibling "foo <p></p> bar"
241
+ assert_equal "text nodefoo <p></p> bar", xml.root.children.to_html
242
+ end
243
+ end
244
+
245
+ describe "#replace" do
246
+ describe "a text node with a text node" do
247
+ it "should not merge text nodes during the operation" do
248
+ xml = Nokogiri::XML %Q(<root>text node</root>)
249
+ replacee = xml.root.children.first
250
+ replacee.replace "new text node"
251
+ assert_equal "new text node", xml.root.children.first.content
252
+ end
253
+ end
254
+
255
+ describe "when a document has a default namespace" do
256
+ before do
257
+ @fruits = Nokogiri::XML(<<-eoxml)
258
+ <fruit xmlns="http://fruits.org">
259
+ <apple />
260
+ </fruit>
261
+ eoxml
262
+ end
263
+
264
+ it "inserts a node with default namespaces" do
265
+ apple = @fruits.css('apple').first
266
+
267
+ orange = Nokogiri::XML::Node.new('orange', @fruits)
268
+ apple.replace(orange)
269
+
270
+ assert_equal orange, @fruits.css('orange').first
271
+ end
272
+ end
273
+ end
274
+
275
+ describe "unlinking a node and then reparenting it" do
276
+ it "not blow up" do
277
+ # see http://github.com/tenderlove/nokogiri/issues#issue/22
278
+ 10.times do
279
+ STDOUT.putc "."
280
+ STDOUT.flush
281
+ begin
282
+ doc = Nokogiri::XML <<-EOHTML
283
+ <root>
284
+ <a>
285
+ <b/>
286
+ <c/>
287
+ </a>
288
+ </root>
289
+ EOHTML
290
+
291
+ assert root = doc.at("root")
292
+ assert a = root.at("a")
293
+ assert b = a.at("b")
294
+ assert c = a.at("c")
295
+ a.add_next_sibling(b.unlink)
296
+ c.unlink
297
+ end
298
+ GC.start
299
+ end
300
+ end
301
+ end
302
+
303
+ describe "replace-merging text nodes" do
304
+ [
305
+ ['<root>a<br/></root>', 'afoo'],
306
+ ['<root>a<br/>b</root>', 'afoob'],
307
+ ['<root><br/>b</root>', 'foob']
308
+ ].each do |xml, result|
309
+ it "doesn't blow up on #{xml}" do
310
+ doc = Nokogiri::XML.parse(xml)
311
+ saved_nodes = doc.root.children
312
+ doc.at_xpath("/root/br").replace(Nokogiri::XML::Text.new('foo', doc))
313
+ saved_nodes.each { |child| child.inspect } # try to cause a crash
314
+ assert_equal result, doc.at_xpath("/root/text()").inner_text
315
+ end
316
+ end
317
+ end
318
+ end
319
+ end
320
+ end
321
+ end