nokogiri 1.0.0 → 1.6.8.1

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 (309) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +26 -0
  3. data/.cross_rubies +9 -0
  4. data/.editorconfig +17 -0
  5. data/.gemtest +0 -0
  6. data/.travis.yml +51 -0
  7. data/CHANGELOG.rdoc +1160 -0
  8. data/CONTRIBUTING.md +42 -0
  9. data/C_CODING_STYLE.rdoc +33 -0
  10. data/Gemfile +22 -0
  11. data/LICENSE.txt +31 -0
  12. data/Manifest.txt +284 -40
  13. data/README.md +166 -0
  14. data/ROADMAP.md +111 -0
  15. data/Rakefile +310 -199
  16. data/STANDARD_RESPONSES.md +47 -0
  17. data/Y_U_NO_GEMSPEC.md +155 -0
  18. data/appveyor.yml +22 -0
  19. data/bin/nokogiri +118 -0
  20. data/build_all +45 -0
  21. data/dependencies.yml +29 -0
  22. data/ext/nokogiri/depend +358 -0
  23. data/ext/nokogiri/extconf.rb +664 -34
  24. data/ext/nokogiri/html_document.c +120 -33
  25. data/ext/nokogiri/html_document.h +1 -1
  26. data/ext/nokogiri/html_element_description.c +279 -0
  27. data/ext/nokogiri/html_element_description.h +10 -0
  28. data/ext/nokogiri/html_entity_lookup.c +32 -0
  29. data/ext/nokogiri/html_entity_lookup.h +8 -0
  30. data/ext/nokogiri/html_sax_parser_context.c +116 -0
  31. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  32. data/ext/nokogiri/html_sax_push_parser.c +87 -0
  33. data/ext/nokogiri/html_sax_push_parser.h +9 -0
  34. data/ext/nokogiri/nokogiri.c +145 -0
  35. data/ext/nokogiri/nokogiri.h +131 -0
  36. data/ext/nokogiri/xml_attr.c +94 -0
  37. data/ext/nokogiri/xml_attr.h +9 -0
  38. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  39. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  40. data/ext/nokogiri/xml_cdata.c +23 -19
  41. data/ext/nokogiri/xml_cdata.h +1 -1
  42. data/ext/nokogiri/xml_comment.c +69 -0
  43. data/ext/nokogiri/xml_comment.h +9 -0
  44. data/ext/nokogiri/xml_document.c +501 -54
  45. data/ext/nokogiri/xml_document.h +14 -1
  46. data/ext/nokogiri/xml_document_fragment.c +48 -0
  47. data/ext/nokogiri/xml_document_fragment.h +10 -0
  48. data/ext/nokogiri/xml_dtd.c +109 -24
  49. data/ext/nokogiri/xml_dtd.h +3 -1
  50. data/ext/nokogiri/xml_element_content.c +123 -0
  51. data/ext/nokogiri/xml_element_content.h +10 -0
  52. data/ext/nokogiri/xml_element_decl.c +69 -0
  53. data/ext/nokogiri/xml_element_decl.h +9 -0
  54. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  55. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  56. data/ext/nokogiri/xml_entity_decl.c +110 -0
  57. data/ext/nokogiri/xml_entity_decl.h +10 -0
  58. data/ext/nokogiri/xml_entity_reference.c +52 -0
  59. data/ext/nokogiri/xml_entity_reference.h +9 -0
  60. data/ext/nokogiri/xml_io.c +60 -0
  61. data/ext/nokogiri/xml_io.h +11 -0
  62. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  63. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  64. data/ext/nokogiri/xml_namespace.c +117 -0
  65. data/ext/nokogiri/xml_namespace.h +13 -0
  66. data/ext/nokogiri/xml_node.c +1285 -315
  67. data/ext/nokogiri/xml_node.h +4 -6
  68. data/ext/nokogiri/xml_node_set.c +415 -54
  69. data/ext/nokogiri/xml_node_set.h +6 -2
  70. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  71. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  72. data/ext/nokogiri/xml_reader.c +316 -77
  73. data/ext/nokogiri/xml_reader.h +1 -1
  74. data/ext/nokogiri/xml_relax_ng.c +161 -0
  75. data/ext/nokogiri/xml_relax_ng.h +9 -0
  76. data/ext/nokogiri/xml_sax_parser.c +215 -80
  77. data/ext/nokogiri/xml_sax_parser.h +30 -1
  78. data/ext/nokogiri/xml_sax_parser_context.c +262 -0
  79. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  80. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  81. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  82. data/ext/nokogiri/xml_schema.c +205 -0
  83. data/ext/nokogiri/xml_schema.h +9 -0
  84. data/ext/nokogiri/xml_syntax_error.c +45 -175
  85. data/ext/nokogiri/xml_syntax_error.h +4 -2
  86. data/ext/nokogiri/xml_text.c +37 -14
  87. data/ext/nokogiri/xml_text.h +1 -1
  88. data/ext/nokogiri/xml_xpath_context.c +230 -13
  89. data/ext/nokogiri/xml_xpath_context.h +2 -1
  90. data/ext/nokogiri/xslt_stylesheet.c +196 -34
  91. data/ext/nokogiri/xslt_stylesheet.h +6 -1
  92. data/lib/nokogiri/css/node.rb +18 -61
  93. data/lib/nokogiri/css/parser.rb +725 -17
  94. data/lib/nokogiri/css/parser.y +126 -63
  95. data/lib/nokogiri/css/parser_extras.rb +91 -0
  96. data/lib/nokogiri/css/syntax_error.rb +7 -0
  97. data/lib/nokogiri/css/tokenizer.rb +148 -5
  98. data/lib/nokogiri/css/tokenizer.rex +31 -39
  99. data/lib/nokogiri/css/xpath_visitor.rb +109 -51
  100. data/lib/nokogiri/css.rb +24 -3
  101. data/lib/nokogiri/decorators/slop.rb +42 -0
  102. data/lib/nokogiri/html/builder.rb +27 -1
  103. data/lib/nokogiri/html/document.rb +329 -3
  104. data/lib/nokogiri/html/document_fragment.rb +39 -0
  105. data/lib/nokogiri/html/element_description.rb +23 -0
  106. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  107. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  108. data/lib/nokogiri/html/sax/parser.rb +35 -4
  109. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  110. data/lib/nokogiri/html/sax/push_parser.rb +36 -0
  111. data/lib/nokogiri/html.rb +18 -76
  112. data/lib/nokogiri/syntax_error.rb +4 -0
  113. data/lib/nokogiri/version.rb +106 -1
  114. data/lib/nokogiri/xml/attr.rb +14 -0
  115. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  116. data/lib/nokogiri/xml/builder.rb +395 -31
  117. data/lib/nokogiri/xml/cdata.rb +4 -2
  118. data/lib/nokogiri/xml/character_data.rb +7 -0
  119. data/lib/nokogiri/xml/document.rb +267 -12
  120. data/lib/nokogiri/xml/document_fragment.rb +149 -0
  121. data/lib/nokogiri/xml/dtd.rb +27 -1
  122. data/lib/nokogiri/xml/element_content.rb +36 -0
  123. data/lib/nokogiri/xml/element_decl.rb +13 -0
  124. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  125. data/lib/nokogiri/xml/namespace.rb +13 -0
  126. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  127. data/lib/nokogiri/xml/node.rb +748 -109
  128. data/lib/nokogiri/xml/node_set.rb +200 -72
  129. data/lib/nokogiri/xml/parse_options.rb +120 -0
  130. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  131. data/lib/nokogiri/xml/pp/node.rb +56 -0
  132. data/lib/nokogiri/xml/pp.rb +2 -0
  133. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  134. data/lib/nokogiri/xml/reader.rb +102 -4
  135. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  136. data/lib/nokogiri/xml/sax/document.rb +114 -2
  137. data/lib/nokogiri/xml/sax/parser.rb +97 -7
  138. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  139. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  140. data/lib/nokogiri/xml/sax.rb +2 -7
  141. data/lib/nokogiri/xml/schema.rb +63 -0
  142. data/lib/nokogiri/xml/searchable.rb +221 -0
  143. data/lib/nokogiri/xml/syntax_error.rb +27 -1
  144. data/lib/nokogiri/xml/text.rb +4 -1
  145. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  146. data/lib/nokogiri/xml/xpath.rb +4 -0
  147. data/lib/nokogiri/xml/xpath_context.rb +3 -1
  148. data/lib/nokogiri/xml.rb +45 -38
  149. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  150. data/lib/nokogiri/xslt.rb +47 -2
  151. data/lib/nokogiri.rb +117 -24
  152. data/lib/xsd/xmlparser/nokogiri.rb +102 -0
  153. data/patches/sort-patches-by-date +25 -0
  154. data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
  155. data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
  156. data/suppressions/README.txt +1 -0
  157. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  158. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  159. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  160. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  161. data/tasks/test.rb +100 -0
  162. data/test/css/test_nthiness.rb +73 -6
  163. data/test/css/test_parser.rb +184 -39
  164. data/test/css/test_tokenizer.rb +72 -19
  165. data/test/css/test_xpath_visitor.rb +44 -2
  166. data/test/decorators/test_slop.rb +20 -0
  167. data/test/files/2ch.html +108 -0
  168. data/test/files/GH_1042.html +18 -0
  169. data/test/files/address_book.rlx +12 -0
  170. data/test/files/address_book.xml +10 -0
  171. data/test/files/atom.xml +344 -0
  172. data/test/files/bar/bar.xsd +4 -0
  173. data/test/files/bogus.xml +0 -0
  174. data/test/files/dont_hurt_em_why.xml +422 -0
  175. data/test/files/encoding.html +82 -0
  176. data/test/files/encoding.xhtml +84 -0
  177. data/test/files/exslt.xml +8 -0
  178. data/test/files/exslt.xslt +35 -0
  179. data/test/files/foo/foo.xsd +4 -0
  180. data/test/files/metacharset.html +10 -0
  181. data/test/files/namespace_pressure_test.xml +1684 -0
  182. data/test/files/noencoding.html +47 -0
  183. data/test/files/po.xml +32 -0
  184. data/test/files/po.xsd +66 -0
  185. data/test/files/saml/saml20assertion_schema.xsd +283 -0
  186. data/test/files/saml/saml20protocol_schema.xsd +302 -0
  187. data/test/files/saml/xenc_schema.xsd +146 -0
  188. data/test/files/saml/xmldsig_schema.xsd +318 -0
  189. data/test/files/shift_jis.html +10 -0
  190. data/test/files/shift_jis.xml +5 -0
  191. data/test/files/shift_jis_no_charset.html +9 -0
  192. data/test/files/slow-xpath.xml +25509 -0
  193. data/test/files/snuggles.xml +3 -0
  194. data/test/files/staff.dtd +10 -0
  195. data/test/files/test_document_url/bar.xml +2 -0
  196. data/test/files/test_document_url/document.dtd +4 -0
  197. data/test/files/test_document_url/document.xml +6 -0
  198. data/test/files/tlm.html +2 -1
  199. data/test/files/to_be_xincluded.xml +2 -0
  200. data/test/files/valid_bar.xml +2 -0
  201. data/test/files/xinclude.xml +4 -0
  202. data/test/helper.rb +124 -13
  203. data/test/html/sax/test_parser.rb +118 -4
  204. data/test/html/sax/test_parser_context.rb +46 -0
  205. data/test/html/sax/test_push_parser.rb +87 -0
  206. data/test/html/test_builder.rb +94 -8
  207. data/test/html/test_document.rb +626 -11
  208. data/test/html/test_document_encoding.rb +145 -0
  209. data/test/html/test_document_fragment.rb +301 -0
  210. data/test/html/test_element_description.rb +105 -0
  211. data/test/html/test_named_characters.rb +14 -0
  212. data/test/html/test_node.rb +212 -0
  213. data/test/html/test_node_encoding.rb +85 -0
  214. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
  215. data/test/namespaces/test_namespaces_aliased_default.rb +24 -0
  216. data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
  217. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  218. data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
  219. data/test/namespaces/test_namespaces_in_parsed_doc.rb +80 -0
  220. data/test/namespaces/test_namespaces_preservation.rb +31 -0
  221. data/test/test_convert_xpath.rb +2 -47
  222. data/test/test_css_cache.rb +45 -0
  223. data/test/test_encoding_handler.rb +48 -0
  224. data/test/test_memory_leak.rb +156 -0
  225. data/test/test_nokogiri.rb +103 -1
  226. data/test/test_soap4r_sax.rb +52 -0
  227. data/test/test_xslt_transforms.rb +293 -8
  228. data/test/xml/node/test_save_options.rb +28 -0
  229. data/test/xml/node/test_subclass.rb +44 -0
  230. data/test/xml/sax/test_parser.rb +309 -8
  231. data/test/xml/sax/test_parser_context.rb +115 -0
  232. data/test/xml/sax/test_push_parser.rb +157 -0
  233. data/test/xml/test_attr.rb +67 -0
  234. data/test/xml/test_attribute_decl.rb +86 -0
  235. data/test/xml/test_builder.rb +327 -2
  236. data/test/xml/test_c14n.rb +180 -0
  237. data/test/xml/test_cdata.rb +32 -2
  238. data/test/xml/test_comment.rb +40 -0
  239. data/test/xml/test_document.rb +846 -35
  240. data/test/xml/test_document_encoding.rb +31 -0
  241. data/test/xml/test_document_fragment.rb +271 -0
  242. data/test/xml/test_dtd.rb +153 -9
  243. data/test/xml/test_dtd_encoding.rb +31 -0
  244. data/test/xml/test_element_content.rb +56 -0
  245. data/test/xml/test_element_decl.rb +73 -0
  246. data/test/xml/test_entity_decl.rb +122 -0
  247. data/test/xml/test_entity_reference.rb +251 -0
  248. data/test/xml/test_namespace.rb +96 -0
  249. data/test/xml/test_node.rb +1126 -105
  250. data/test/xml/test_node_attributes.rb +115 -0
  251. data/test/xml/test_node_encoding.rb +69 -0
  252. data/test/xml/test_node_inheritance.rb +32 -0
  253. data/test/xml/test_node_reparenting.rb +549 -0
  254. data/test/xml/test_node_set.rb +668 -9
  255. data/test/xml/test_parse_options.rb +64 -0
  256. data/test/xml/test_processing_instruction.rb +30 -0
  257. data/test/xml/test_reader.rb +589 -0
  258. data/test/xml/test_reader_encoding.rb +134 -0
  259. data/test/xml/test_relax_ng.rb +60 -0
  260. data/test/xml/test_schema.rb +142 -0
  261. data/test/xml/test_syntax_error.rb +30 -0
  262. data/test/xml/test_text.rb +49 -2
  263. data/test/xml/test_unparented_node.rb +440 -0
  264. data/test/xml/test_xinclude.rb +83 -0
  265. data/test/xml/test_xpath.rb +445 -0
  266. data/test/xslt/test_custom_functions.rb +133 -0
  267. data/test/xslt/test_exception_handling.rb +37 -0
  268. data/test_all +107 -0
  269. metadata +459 -115
  270. data/History.txt +0 -6
  271. data/README.ja.txt +0 -86
  272. data/README.txt +0 -87
  273. data/ext/nokogiri/html_sax_parser.c +0 -32
  274. data/ext/nokogiri/html_sax_parser.h +0 -11
  275. data/ext/nokogiri/native.c +0 -40
  276. data/ext/nokogiri/native.h +0 -51
  277. data/ext/nokogiri/xml_xpath.c +0 -46
  278. data/ext/nokogiri/xml_xpath.h +0 -11
  279. data/lib/nokogiri/css/generated_parser.rb +0 -653
  280. data/lib/nokogiri/css/generated_tokenizer.rb +0 -159
  281. data/lib/nokogiri/decorators/hpricot/node.rb +0 -58
  282. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -14
  283. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -17
  284. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  285. data/lib/nokogiri/decorators.rb +0 -1
  286. data/lib/nokogiri/hpricot.rb +0 -47
  287. data/lib/nokogiri/xml/after_handler.rb +0 -18
  288. data/lib/nokogiri/xml/before_handler.rb +0 -32
  289. data/lib/nokogiri/xml/element.rb +0 -6
  290. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  291. data/nokogiri.gemspec +0 -34
  292. data/test/hpricot/files/basic.xhtml +0 -17
  293. data/test/hpricot/files/boingboing.html +0 -2266
  294. data/test/hpricot/files/cy0.html +0 -3653
  295. data/test/hpricot/files/immob.html +0 -400
  296. data/test/hpricot/files/pace_application.html +0 -1320
  297. data/test/hpricot/files/tenderlove.html +0 -16
  298. data/test/hpricot/files/uswebgen.html +0 -220
  299. data/test/hpricot/files/utf8.html +0 -1054
  300. data/test/hpricot/files/week9.html +0 -1723
  301. data/test/hpricot/files/why.xml +0 -19
  302. data/test/hpricot/load_files.rb +0 -7
  303. data/test/hpricot/test_alter.rb +0 -67
  304. data/test/hpricot/test_builder.rb +0 -27
  305. data/test/hpricot/test_parser.rb +0 -423
  306. data/test/hpricot/test_paths.rb +0 -15
  307. data/test/hpricot/test_preserved.rb +0 -78
  308. data/test/hpricot/test_xml.rb +0 -30
  309. data/test/test_reader.rb +0 -222
@@ -0,0 +1,122 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestEntityDecl < 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
+ <!ENTITY ent1 "es">
12
+ <!ENTITY nocontent "">
13
+ ]>
14
+ <root />
15
+ eoxml
16
+
17
+ @entities = @xml.internal_subset.children
18
+ @entity_decl = @entities.first
19
+ end
20
+
21
+ def test_constants
22
+ assert_equal 1, EntityDecl::INTERNAL_GENERAL
23
+ assert_equal 2, EntityDecl::EXTERNAL_GENERAL_PARSED
24
+ assert_equal 3, EntityDecl::EXTERNAL_GENERAL_UNPARSED
25
+ assert_equal 4, EntityDecl::INTERNAL_PARAMETER
26
+ assert_equal 5, EntityDecl::EXTERNAL_PARAMETER
27
+ assert_equal 6, EntityDecl::INTERNAL_PREDEFINED
28
+ end
29
+
30
+ def test_create_typed_entity
31
+ entity = @xml.create_entity(
32
+ 'foo', EntityDecl::INTERNAL_GENERAL, nil, nil, nil
33
+ )
34
+ assert_equal EntityDecl::INTERNAL_GENERAL, entity.entity_type
35
+ assert_equal 'foo', entity.name
36
+ end
37
+
38
+ def test_new
39
+ entity = Nokogiri::XML::EntityDecl.new(
40
+ 'foo', @xml, EntityDecl::INTERNAL_GENERAL, nil, nil, nil
41
+ )
42
+ assert_equal EntityDecl::INTERNAL_GENERAL, entity.entity_type
43
+ assert_equal 'foo', entity.name
44
+ end
45
+
46
+ def test_create_default_args
47
+ entity = @xml.create_entity('foo')
48
+ assert_equal EntityDecl::INTERNAL_GENERAL, entity.entity_type
49
+ assert_equal 'foo', entity.name
50
+ end
51
+
52
+ def test_external_id
53
+ assert_nil @entity_decl.external_id
54
+ end
55
+
56
+ def test_system_id
57
+ assert_nil @entity_decl.system_id
58
+ end
59
+
60
+ def test_entity_type
61
+ assert_equal 1, @entity_decl.entity_type
62
+ end
63
+
64
+ def test_original_content
65
+ assert_equal "es", @entity_decl.original_content
66
+ if Nokogiri.jruby?
67
+ assert_nil @entities[1].original_content
68
+ else
69
+ assert_equal "", @entities[1].original_content
70
+ end
71
+ end
72
+
73
+ def test_content
74
+ assert_equal "es", @entity_decl.content
75
+ if Nokogiri.jruby?
76
+ assert_nil @entities[1].content
77
+ else
78
+ assert_equal "", @entities[1].content
79
+ end
80
+ end
81
+
82
+ def test_type
83
+ assert_equal 17, @entities.first.type
84
+ end
85
+
86
+ def test_class
87
+ assert_instance_of Nokogiri::XML::EntityDecl, @entities.first
88
+ end
89
+
90
+ def test_attributes
91
+ assert_raise NoMethodError do
92
+ @entity_decl.attributes
93
+ end
94
+ end
95
+
96
+ def test_namespace
97
+ assert_raise NoMethodError do
98
+ @entity_decl.namespace
99
+ end
100
+ end
101
+
102
+ def test_namespace_definitions
103
+ assert_raise NoMethodError do
104
+ @entity_decl.namespace_definitions
105
+ end
106
+ end
107
+
108
+ def test_line
109
+ assert_raise NoMethodError do
110
+ @entity_decl.line
111
+ end
112
+ end
113
+
114
+ def test_inspect
115
+ assert_equal(
116
+ "#<#{@entity_decl.class.name}:#{sprintf("0x%x", @entity_decl.object_id)} #{@entity_decl.to_s.inspect}>",
117
+ @entity_decl.inspect
118
+ )
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,251 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestEntityReference < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML(File.open(XML_FILE), XML_FILE)
9
+ end
10
+
11
+ def test_new
12
+ assert ref = EntityReference.new(@xml, 'ent4')
13
+ assert_instance_of EntityReference, ref
14
+ end
15
+
16
+ def test_many_references
17
+ 100.times { EntityReference.new(@xml, 'foo') }
18
+ end
19
+
20
+ def test_newline_node
21
+ # issue 719
22
+ xml = <<EOF
23
+ <?xml version="1.0" ?>
24
+ <item></item>
25
+ EOF
26
+ doc = Nokogiri::XML xml
27
+ lf_node = Nokogiri::XML::EntityReference.new(doc, "#xa")
28
+ doc.xpath('/item').first.add_child(lf_node)
29
+ assert_match(/&#xa;/, doc.to_xml)
30
+ end
31
+ end
32
+
33
+ module Common
34
+ PATH = 'test/files/test_document_url/'
35
+
36
+ attr_accessor :path, :parser
37
+
38
+ def xml_document
39
+ File.join path, 'document.xml'
40
+ end
41
+
42
+ def self.included base
43
+ def base.test_relative_and_absolute_path method_name, &block
44
+ test_relative_path method_name, &block
45
+ test_absolute_path method_name, &block
46
+ end
47
+
48
+ def base.test_absolute_path method_name, &block
49
+ define_method "#{method_name}_with_absolute_path" do
50
+ self.path = "#{File.expand_path PATH}/"
51
+ instance_eval(&block)
52
+ end
53
+ end
54
+
55
+ def base.test_relative_path method_name, &block
56
+ define_method method_name do
57
+ self.path = PATH
58
+ instance_eval(&block)
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ class TestDOMEntityReference < Nokogiri::TestCase
65
+ include Common
66
+
67
+ def setup
68
+ super
69
+ @parser = Nokogiri::XML::Document
70
+ end
71
+
72
+ test_relative_and_absolute_path :test_dom_entity_reference_with_dtdloda do
73
+ # Make sure that we can parse entity references and include them in the document
74
+ html = File.read xml_document
75
+ doc = @parser.parse html, path do |cfg|
76
+ cfg.default_xml
77
+ cfg.dtdload
78
+ cfg.noent
79
+ end
80
+ assert_equal [], doc.errors
81
+ assert_equal "foobar", doc.xpath('//blah').text
82
+ end
83
+
84
+ test_relative_and_absolute_path :test_dom_entity_reference_with_dtdvalid do
85
+ # Make sure that we can parse entity references and include them in the document
86
+ html = File.read xml_document
87
+ doc = @parser.parse html, path do |cfg|
88
+ cfg.default_xml
89
+ cfg.dtdvalid
90
+ cfg.noent
91
+ end
92
+ assert_equal [], doc.errors
93
+ assert_equal "foobar", doc.xpath('//blah').text
94
+ end
95
+
96
+ test_absolute_path :test_dom_dtd_loading_with_absolute_path do
97
+ # Make sure that we can parse entity references and include them in the document
98
+ html = %Q[<?xml version="1.0" encoding="UTF-8" ?>
99
+ <!DOCTYPE document SYSTEM "#{path}/document.dtd">
100
+ <document>
101
+ <body>&bar;</body>
102
+ </document>
103
+ ]
104
+ doc = @parser.parse html, xml_document do |cfg|
105
+ cfg.default_xml
106
+ cfg.dtdvalid
107
+ cfg.noent
108
+ end
109
+ assert_equal [], doc.errors
110
+ assert_equal "foobar", doc.xpath('//blah').text
111
+ end
112
+
113
+ test_relative_and_absolute_path :test_dom_entity_reference_with_io do
114
+ # Make sure that we can parse entity references and include them in the document
115
+ html = File.open xml_document
116
+ doc = @parser.parse html, nil do |cfg|
117
+ cfg.default_xml
118
+ cfg.dtdload
119
+ cfg.noent
120
+ end
121
+ assert_equal [], doc.errors
122
+ assert_equal "foobar", doc.xpath('//blah').text
123
+ end
124
+
125
+ test_relative_and_absolute_path :test_dom_entity_reference_without_noent do
126
+ # Make sure that we don't include entity references unless NOENT is set to true
127
+ html = File.read xml_document
128
+ doc = @parser.parse html, path do |cfg|
129
+ cfg.default_xml
130
+ cfg.dtdload
131
+ end
132
+ assert_equal [], doc.errors
133
+ assert_kind_of Nokogiri::XML::EntityReference, doc.xpath('//body').first.children.first
134
+ end
135
+
136
+ test_relative_and_absolute_path :test_dom_entity_reference_without_dtdload do
137
+ # Make sure that we don't include entity references unless NOENT is set to true
138
+ html = File.read xml_document
139
+ doc = @parser.parse html, path do |cfg|
140
+ cfg.default_xml
141
+ end
142
+ assert_kind_of Nokogiri::XML::EntityReference, doc.xpath('//body').first.children.first
143
+ if Nokogiri.uses_libxml?
144
+ assert_equal ["Entity 'bar' not defined"], doc.errors.map(&:to_s)
145
+ end
146
+ end
147
+
148
+ test_relative_and_absolute_path :test_document_dtd_loading_with_nonet do
149
+ # Make sure that we don't include remote entities unless NOENT is set to true
150
+ html = %Q[<?xml version="1.0" encoding="UTF-8" ?>
151
+ <!DOCTYPE document SYSTEM "http://foo.bar.com/">
152
+ <document>
153
+ <body>&bar;</body>
154
+ </document>
155
+ ]
156
+ doc = @parser.parse html, path do |cfg|
157
+ cfg.default_xml
158
+ cfg.dtdload
159
+ end
160
+ assert_kind_of Nokogiri::XML::EntityReference, doc.xpath('//body').first.children.first
161
+ if Nokogiri.uses_libxml?
162
+ assert_equal ["Attempt to load network entity http://foo.bar.com/", "Entity 'bar' not defined"], doc.errors.map(&:to_s)
163
+ else
164
+ assert_equal ["Attempt to load network entity http://foo.bar.com/"], doc.errors.map(&:to_s)
165
+ end
166
+ end
167
+ # TODO: can we retreive a resource pointing to localhost when NONET is set to true ?
168
+ end
169
+
170
+ class TestSaxEntityReference < Nokogiri::SAX::TestCase
171
+ include Common
172
+
173
+ def setup
174
+ super
175
+ @parser = XML::SAX::Parser.new(Doc.new) do |ctx|
176
+ ctx.replace_entities = true
177
+ end
178
+ end
179
+
180
+ test_relative_and_absolute_path :test_sax_entity_reference do
181
+ # Make sure that we can parse entity references and include them in the document
182
+ html = File.read xml_document
183
+ @parser.parse html
184
+ refute_nil @parser.document.errors
185
+ assert_equal ["Entity 'bar' not defined"], @parser.document.errors.map(&:to_s).map(&:strip)
186
+ end
187
+
188
+ test_relative_and_absolute_path :test_more_sax_entity_reference do
189
+ # Make sure that we don't include entity references unless NOENT is set to true
190
+ html = %Q[<?xml version="1.0" encoding="UTF-8" ?>
191
+ <!DOCTYPE document SYSTEM "http://foo.bar.com/">
192
+ <document>
193
+ <body>&bar;</body>
194
+ </document>
195
+ ]
196
+ @parser.parse html
197
+ refute_nil @parser.document.errors
198
+ assert_equal ["Entity 'bar' not defined"], @parser.document.errors.map(&:to_s).map(&:strip)
199
+ end
200
+ end
201
+
202
+ class TestReaderEntityReference < Nokogiri::TestCase
203
+ include Common
204
+
205
+ def setup
206
+ super
207
+ end
208
+
209
+ test_relative_and_absolute_path :test_reader_entity_reference do
210
+ # Make sure that we can parse entity references and include them in the document
211
+ html = File.read xml_document
212
+ reader = Nokogiri::XML::Reader html, path do |cfg|
213
+ cfg.default_xml
214
+ cfg.dtdload
215
+ cfg.noent
216
+ end
217
+ nodes = []
218
+ reader.each { |n| nodes << n.value }
219
+ assert_equal ['foobar'], nodes.compact.map(&:strip).reject(&:empty?)
220
+ end
221
+
222
+ test_relative_and_absolute_path :test_reader_entity_reference_without_noent do
223
+ # Make sure that we can parse entity references and include them in the document
224
+ html = File.read xml_document
225
+ reader = Nokogiri::XML::Reader html, path do |cfg|
226
+ cfg.default_xml
227
+ cfg.dtdload
228
+ end
229
+ nodes = []
230
+ reader.each { |n| nodes << n.value }
231
+ assert_equal [], nodes.compact.map(&:strip).reject(&:empty?)
232
+ end
233
+
234
+ test_relative_and_absolute_path :test_reader_entity_reference_without_dtdload do
235
+ html = File.read xml_document
236
+ reader = Nokogiri::XML::Reader html, path do |cfg|
237
+ cfg.default_xml
238
+ end
239
+ if Nokogiri.uses_libxml? && Nokogiri::LIBXML_PARSER_VERSION.to_i >= 20900
240
+ # Unknown entity is not fatal in libxml2 >= 2.9
241
+ assert_equal 8, reader.count
242
+ else
243
+ assert_raises(Nokogiri::XML::SyntaxError) {
244
+ assert_equal 5, reader.count
245
+ }
246
+ end
247
+ assert_operator reader.errors.size, :>, 0
248
+ end
249
+ end
250
+ end
251
+ end
@@ -0,0 +1,96 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestNamespace < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ @xml = Nokogiri::XML <<-eoxml
9
+ <root xmlns="http://tenderlovemaking.com/" xmlns:foo="bar">
10
+ <awesome/>
11
+ </root>
12
+ eoxml
13
+ end
14
+
15
+ if Nokogiri.uses_libxml?
16
+ def test_namespace_is_in_node_cache
17
+ node = @xml.root.namespace
18
+ assert @xml.instance_variable_get(:@node_cache).include?(node)
19
+ end
20
+ end
21
+
22
+ def test_built_nodes_keep_namespace_decls
23
+ doc = Document.new
24
+ e = Node.new 'element', doc
25
+ c = Node.new 'child', doc
26
+ c.default_namespace = 'woop:de:doo'
27
+
28
+ assert c.namespace, 'has a namespace'
29
+ e.add_child c
30
+ assert c.namespace, 'has a namespace'
31
+
32
+ doc.add_child e
33
+ assert c.namespace, 'has a namespace'
34
+ end
35
+
36
+ def test_inspect
37
+ ns = @xml.root.namespace
38
+ assert_equal "#<#{ns.class.name}:#{sprintf("0x%x", ns.object_id)} href=#{ns.href.inspect}>", ns.inspect
39
+ end
40
+
41
+ def test_namespace_node_prefix
42
+ namespaces = @xml.root.namespace_definitions
43
+ assert_equal [nil, 'foo'], namespaces.map(&:prefix)
44
+ end
45
+
46
+ def test_namespace_node_href
47
+ namespaces = @xml.root.namespace_definitions
48
+ assert_equal [
49
+ 'http://tenderlovemaking.com/',
50
+ 'bar'
51
+ ], namespaces.map(&:href)
52
+ end
53
+
54
+ def test_equality
55
+ namespaces = @xml.root.namespace_definitions
56
+ assert_equal namespaces, @xml.root.namespace_definitions
57
+ end
58
+
59
+ def test_add_definition
60
+ @xml.root.add_namespace_definition('baz', 'bar')
61
+ assert_equal 3, @xml.root.namespace_definitions.length
62
+ end
63
+
64
+ def test_add_definition_return
65
+ ns = @xml.root.add_namespace_definition('baz', 'bar')
66
+ assert_equal 'baz', ns.prefix
67
+ end
68
+
69
+ def test_remove_entity_namespace
70
+ s = %q{<?xml version='1.0'?><!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" [<!ENTITY % p ''>]>}
71
+ Nokogiri::XML(s).remove_namespaces!
72
+ # TODO: we should probably assert something here. See commit 14d2f59.
73
+ end
74
+
75
+ def test_maintain_element_namespaces
76
+ doc = Document.new
77
+ subject = Nokogiri::XML::Node.new 'foo', doc
78
+ subject << '<foobar xmlns="barfoo"/>'
79
+ child = subject.children.first
80
+ assert_equal 'foobar', child.name
81
+ assert_equal 'barfoo', child.namespace.href
82
+ assert_empty child.attributes
83
+ end
84
+
85
+ def test_maintain_element_namespaces_in_urn
86
+ doc = Document.new
87
+ subject = Nokogiri::XML::Node.new 'foo', doc
88
+ subject << '<foobar xmlns="urn:xmpp:foospec:barfoo"/>'
89
+ child = subject.children.first
90
+ assert_equal 'foobar', child.name
91
+ assert_equal 'urn:xmpp:foospec:barfoo', child.namespace.href
92
+ assert_empty child.attributes
93
+ end
94
+ end
95
+ end
96
+ end