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
@@ -1,20 +1,58 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "helper"
4
+
5
+ module Nokogiri
6
+ module CSS
7
+ class Tokenizer
8
+ alias :scan :scan_setup
9
+ end
10
+ end
11
+ end
2
12
 
3
13
  module Nokogiri
4
14
  module CSS
5
15
  class TestTokenizer < Nokogiri::TestCase
6
16
  def setup
17
+ super
7
18
  @scanner = Nokogiri::CSS::Tokenizer.new
8
19
  end
9
20
 
21
+ def test_has
22
+ @scanner.scan("a:has(b)")
23
+ assert_tokens(
24
+ [[:IDENT, "a"], [":", ":"], [:HAS, "has("], [:IDENT, "b"], [:RPAREN, ")"]],
25
+ @scanner)
26
+ end
27
+
28
+ def test_unicode
29
+ @scanner.scan("a日本語")
30
+ assert_tokens([[:IDENT, 'a日本語']], @scanner)
31
+ end
32
+
33
+ def test_tokenize_bad_single_quote
34
+ @scanner.scan("'")
35
+ assert_tokens([["'", "'"]], @scanner)
36
+ end
37
+
10
38
  def test_not_equal
11
39
  @scanner.scan("h1[a!='Tender Lovemaking']")
12
40
  assert_tokens([ [:IDENT, 'h1'],
13
- ['[', '['],
41
+ [:LSQUARE, '['],
14
42
  [:IDENT, 'a'],
15
43
  [:NOT_EQUAL, '!='],
16
44
  [:STRING, "'Tender Lovemaking'"],
17
- [']', ']'],
45
+ [:RSQUARE, ']'],
46
+ ], @scanner)
47
+ end
48
+
49
+ def test_negation
50
+ @scanner.scan("p:not(.a)")
51
+ assert_tokens([ [:IDENT, 'p'],
52
+ [:NOT, ':not('],
53
+ ['.', '.'],
54
+ [:IDENT, 'a'],
55
+ [:RPAREN, ')'],
18
56
  ], @scanner)
19
57
  end
20
58
 
@@ -23,15 +61,14 @@ module Nokogiri
23
61
  assert_tokens([ [:IDENT, 'script'],
24
62
  [:S, ' '],
25
63
  [:FUNCTION, 'comment('],
26
- [')', ')'],
64
+ [:RPAREN, ')'],
27
65
  ], @scanner)
28
66
  end
29
67
 
30
68
  def test_preceding_selector
31
69
  @scanner.scan("E ~ F")
32
70
  assert_tokens([ [:IDENT, 'E'],
33
- [:TILDE, ' ~'],
34
- [:S, ' '],
71
+ [:TILDE, ' ~ '],
35
72
  [:IDENT, 'F'],
36
73
  ], @scanner)
37
74
  end
@@ -39,19 +76,19 @@ module Nokogiri
39
76
  def test_scan_attribute_string
40
77
  @scanner.scan("h1[a='Tender Lovemaking']")
41
78
  assert_tokens([ [:IDENT, 'h1'],
42
- ['[', '['],
79
+ [:LSQUARE, '['],
43
80
  [:IDENT, 'a'],
44
- ['=', '='],
81
+ [:EQUAL, '='],
45
82
  [:STRING, "'Tender Lovemaking'"],
46
- [']', ']'],
83
+ [:RSQUARE, ']'],
47
84
  ], @scanner)
48
85
  @scanner.scan('h1[a="Tender Lovemaking"]')
49
86
  assert_tokens([ [:IDENT, 'h1'],
50
- ['[', '['],
87
+ [:LSQUARE, '['],
51
88
  [:IDENT, 'a'],
52
- ['=', '='],
89
+ [:EQUAL, '='],
53
90
  [:STRING, '"Tender Lovemaking"'],
54
- [']', ']'],
91
+ [:RSQUARE, ']'],
55
92
  ], @scanner)
56
93
  end
57
94
 
@@ -84,8 +121,7 @@ module Nokogiri
84
121
  def test_scan_greater
85
122
  @scanner.scan('x > y')
86
123
  assert_tokens([ [:IDENT, 'x'],
87
- [:GREATER, ' >'],
88
- [:S, ' '],
124
+ [:GREATER, ' > '],
89
125
  [:IDENT, 'y']
90
126
  ], @scanner)
91
127
  end
@@ -112,11 +148,11 @@ module Nokogiri
112
148
  [':', ':'],
113
149
  [:FUNCTION, 'eq('],
114
150
  [:NUMBER, "0"],
115
- [")", ")"]
151
+ [:RPAREN, ')'],
116
152
  ], @scanner)
117
153
  end
118
154
 
119
- def test_scan_an_plus_b
155
+ def test_scan_nth
120
156
  @scanner.scan('x:nth-child(5n+3)')
121
157
  assert_tokens([ [:IDENT, 'x'],
122
158
  [':', ':'],
@@ -125,7 +161,7 @@ module Nokogiri
125
161
  [:IDENT, 'n'],
126
162
  [:PLUS, '+'],
127
163
  [:NUMBER, '3'],
128
- [")", ")"]
164
+ [:RPAREN, ')'],
129
165
  ], @scanner)
130
166
 
131
167
  @scanner.scan('x:nth-child(-1n+3)')
@@ -136,7 +172,7 @@ module Nokogiri
136
172
  [:IDENT, 'n'],
137
173
  [:PLUS, '+'],
138
174
  [:NUMBER, '3'],
139
- [")", ")"]
175
+ [:RPAREN, ')'],
140
176
  ], @scanner)
141
177
 
142
178
  @scanner.scan('x:nth-child(-n+3)')
@@ -146,7 +182,24 @@ module Nokogiri
146
182
  [:IDENT, '-n'],
147
183
  [:PLUS, '+'],
148
184
  [:NUMBER, '3'],
149
- [")", ")"]
185
+ [:RPAREN, ')'],
186
+ ], @scanner)
187
+ end
188
+
189
+ def test_significant_space
190
+ @scanner.scan('x :first-child [a] [b]')
191
+ assert_tokens([ [:IDENT, 'x'],
192
+ [:S, ' '],
193
+ [':', ':'],
194
+ [:IDENT, 'first-child'],
195
+ [:S, ' '],
196
+ [:LSQUARE, '['],
197
+ [:IDENT, 'a'],
198
+ [:RSQUARE, ']'],
199
+ [:S, ' '],
200
+ [:LSQUARE, '['],
201
+ [:IDENT, 'b'],
202
+ [:RSQUARE, ']'],
150
203
  ], @scanner)
151
204
  end
152
205
 
@@ -1,14 +1,56 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module CSS
5
5
  class TestXPathVisitor < Nokogiri::TestCase
6
6
  def setup
7
+ super
7
8
  @parser = Nokogiri::CSS::Parser.new
8
9
  end
9
10
 
11
+ def test_not_simple_selector
12
+ assert_xpath('//ol/*[not(self::li)]', @parser.parse('ol > *:not(li)'))
13
+ end
14
+
15
+ def test_not_last_child
16
+ assert_xpath('//ol/*[not(count(following-sibling::*) = 0)]',
17
+ @parser.parse('ol > *:not(:last-child)'))
18
+ end
19
+
20
+ def test_not_only_child
21
+ assert_xpath('//ol/*[not(count(preceding-sibling::*) = 0 and count(following-sibling::*) = 0)]',
22
+ @parser.parse('ol > *:not(:only-child)'))
23
+ end
24
+
25
+ def test_function_calls_allow_at_params
26
+ assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
27
+ assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
28
+ assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)'))
29
+ end
30
+
31
+ def test_namespace_conversion
32
+ assert_xpath("//aaron:a", @parser.parse('aaron|a'))
33
+ assert_xpath("//a", @parser.parse('|a'))
34
+ end
35
+
36
+ def test_namespaced_attribute_conversion
37
+ assert_xpath("//a[@flavorjones:href]", @parser.parse('a[flavorjones|href]'))
38
+ assert_xpath("//a[@href]", @parser.parse('a[|href]'))
39
+ assert_xpath("//*[@flavorjones:href]", @parser.parse('*[flavorjones|href]'))
40
+ end
41
+
42
+ def test_unknown_psuedo_classes_get_pushed_down
43
+ assert_xpath("//a[aaron(.)]", @parser.parse('a:aaron'))
44
+ end
45
+
46
+ def test_unknown_functions_get_dot_plus_args
47
+ assert_xpath("//a[aaron(.)]", @parser.parse('a:aaron()'))
48
+ assert_xpath("//a[aaron(., 12)]", @parser.parse('a:aaron(12)'))
49
+ assert_xpath("//a[aaron(., 12, 1)]", @parser.parse('a:aaron(12, 1)'))
50
+ end
51
+
10
52
  def test_class_selectors
11
- assert_xpath "//*[contains(concat(' ', @class, ' '), ' red ')]",
53
+ assert_xpath "//*[contains(concat(' ', normalize-space(@class), ' '), ' red ')]",
12
54
  @parser.parse(".red")
13
55
  end
14
56
 
@@ -0,0 +1,20 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ class TestSlop < Nokogiri::TestCase
5
+ def test_description_tag
6
+ doc = Nokogiri.Slop(<<-eoxml)
7
+ <item>
8
+ <title>foo</title>
9
+ <description>this is the foo thing</description>
10
+ </item>
11
+ eoxml
12
+ assert doc.item.respond_to?(:title)
13
+ assert_equal 'foo', doc.item.title.text
14
+ assert doc.item.respond_to?(:_description), 'should have description'
15
+ assert 'this is the foo thing', doc.item._description.text
16
+ assert !doc.item.respond_to?(:foo)
17
+ assert_raise(NoMethodError) { doc.item.foo }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,108 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
5
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
6
+ <meta http-equiv="Content-Style-Type" content="text/css" />
7
+ <meta name="Description" CONTENT="�u�n�b�L���O�v����u���ӂ̂������v�܂ł���L���J�o�[���鋐��f���ŒQ�w�Q�����˂�x�ւ悤�����I">
8
+ <meta name="KeyWords" CONTENT="�Q�����˂�, �f����, 2ch, BBS">
9
+ <meta name="Author" CONTENT="�Q�����˂�">
10
+ <meta name="verify-v1" content="hMevVuWJIPYrUj9ItfRJByoLNIpyhnrWaywiH+IFocU=" />
11
+ <title>�Q�����˂�f���‚ւ悤����</title>
12
+ <style type="text/css" media="all">
13
+ @import url(2ch_top.css);
14
+ </style>
15
+ <script>
16
+ <!--
17
+ function fcs(){document.f.STR.focus();}
18
+ -->
19
+ </script>
20
+ </head>
21
+
22
+ <body onLoad="document.f.STR.focus()">
23
+
24
+ <div id="wrapper">
25
+ <div id="header">
26
+ <div id="header_inside">
27
+ <div class="header_left">
28
+ <a href="http://www2.2ch.net/2ch.html"><img src="images/2ch_logo.gif" width="151" height="40" alt="�Q�����˂�" align="middle" border="0" /><a href="http://www2.2ch.net/2ch.html">�f����</a>�b
29
+ <a href="http://c.2ch.net/">imode</a>�b<a href="http://orz.2ch.io/top.html">�g��orz</a>�b<a href="http://p2.2ch.net/">�r���[�Ap2</a>
30
+ </div>
31
+
32
+ <div class="senna_banner">
33
+
34
+ <a href="http://razil.jp/product/senna/"><img src="images/senna88x31.gif" width="88" height="31" alt="Senna" align="middle" border="0" /></a>
35
+ </div>
36
+ <div class="header_right">
37
+ <!---find 2ch form --->
38
+ <form method=GET name=f action="http://find.2ch.net/" style="margin:0px">
39
+ <input size=25 name=STR value="" class="form_input">
40
+ <select name="TYPE" class="form_select">
41
+ <option value="BODY">�{��</option>
42
+
43
+ <option value="TITLE" selected>�X���b�h�^�C�g��</option>
44
+ <option value="POSTERS">���e��</option>
45
+ </select>
46
+ <input type="image" src="images/search_button.gif" alt="����" class="form_button"><br />
47
+ <input type=hidden name=BBS value=ALL>
48
+
49
+ <input type=hidden name=ENCODING value=SJIS>
50
+ <input type=hidden name=COUNT value=50>
51
+ <div class="caption">�{�������⌟���ݒ��<a href="http://find.2ch.net/moritapo/notlogin.php">���O�C��</a><a href="http://find.2ch.net/moritapo/welcome/">&raquo;�ڍ�</a></div>
52
+
53
+ </form>
54
+ </div>
55
+ </div><!--- header_inside --->
56
+ </div><!--- end of header--->
57
+
58
+ <div id="under_header">
59
+ <a href="http://newsnavi.2ch.net/">�j���[�X</a>�b<a href="http://headline.2ch.net/bbynews/">�w�b�h���C��</a>�b<a href="http://epg.2ch.net/">�e���r��</a>�b<a href="http://www.2ch.net/kakolog.html">�ߋ����O�q��</a>
60
+
61
+ </div><!--- end of under header--->
62
+
63
+ <div id="main">
64
+ <iframe src="http://cast.texpo.jp/2chtop/main_frame.html" width="100%" height="550" scrolling="no" border="0" frameborder="0"></iframe>
65
+ </div><!--- end of main--->
66
+
67
+ <div id="footer_menu">
68
+ <div class="guide">
69
+ <a href="http://info.2ch.net/guide/">�g����������</a>�b<a href="http://info.2ch.net/guide/adv.html#saku_guide">�폜�K�C�h���C��</a>�b<a href="http://www2.2ch.net/2ch2.html">�g���Ń��j���[</a>�b<a href="http://info.2ch.net/blog.html">�Ђ�䂫���L</a>�b<a href="http://www.2ch.net/ad.html">�L���̂��ē�</a>
70
+
71
+ </div>
72
+
73
+ <div class="service">
74
+ <iframe src="http://cast.texpo.jp/2chtop/moritapo_frame.html" width="100%" height="50" scrolling="no" border="0" frameborder="0"></iframe>
75
+ </div>
76
+
77
+ <div class="banner">
78
+ <a href=http://livede55.com/ target="_blank"><img
79
+ src="http://www2.livede55.com/2ch_468_60_13.gif"
80
+ width="468" height="60" border="0" alt=���C�u�`���b�g></a><br>
81
+ <br>
82
+ <A href="http://www.bb-chat.tv/" target=_blank><IMG height=60 src="http://img.bbchat.tv/images/bannar/46860-3.gif" width=468 border=0></A><br>
83
+ </div>
84
+
85
+ <div class="condition">
86
+ �Q�����˂�̂����p�͗��p�Ҋe�ʂ̂����f�ɂ��C�����Ă��܂��b<a href="precautions.html">2ch�̃f�[�^���p�ɂ‚���</a>
87
+
88
+ </div>
89
+ </div><!--- end of footer_menu--->
90
+
91
+
92
+ <div id="footer">
93
+ <div class="footer_left">
94
+ <a href="http://www.bunka.go.jp/jiyuriyo/" target="_blank">
95
+ <img src="http://www.dd.iij4u.or.jp/~cap/y_3copyok.jpg" width="184" height="31" border="0" alt="���R���p�}�[�N" /></a>
96
+ </div>
97
+
98
+ <div class="footer_right">
99
+ <a href="http://count.2ch.net/?index" target="_blank">
100
+ <img src="http://count.2ch.net/ct.php/index" width="88" height="31" border="0" alt="���������J�E���^�["></a>
101
+
102
+
103
+ </div>
104
+ </div><!---end of footer--->
105
+
106
+ </div><!--- end of wrapper--->
107
+ </body>
108
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head></head>
4
+ <body>
5
+ <table align="center" border>
6
+ <tr><th>foo1.0</th><th>bar</th><th>bazz</th></tr>
7
+ <tr><td>foo1.1</td><td>bar</td><td>bazz</td></tr>
8
+ </table>
9
+ <table align="center" border>
10
+ <tr><th>foo2.0</th><th>bar</th><th>bazz</th></tr>
11
+ <tr><td>foo2.1</td><td>bar</td><td>bazz</td></tr>
12
+ </table>
13
+ <table align="center" border>
14
+ <tr><th>foo3.0</th><th>bar</th><th>bazz</th></tr>
15
+ <tr><td>foo3.1</td><td>bar</td><td>bazz</td></tr>
16
+ </table>
17
+ </body>
18
+ </html>
@@ -0,0 +1,12 @@
1
+ <element name="addressBook" xmlns="http://relaxng.org/ns/structure/1.0">
2
+ <oneOrMore>
3
+ <element name="card">
4
+ <element name="name">
5
+ <text/>
6
+ </element>
7
+ <element name="email">
8
+ <text/>
9
+ </element>
10
+ </element>
11
+ </oneOrMore>
12
+ </element>
@@ -0,0 +1,10 @@
1
+ <addressBook>
2
+ <card>
3
+ <name>John Smith</name>
4
+ <email>js@example.com</email>
5
+ </card>
6
+ <card>
7
+ <name>Fred Bloggs</name>
8
+ <email>fb@example.net</email>
9
+ </card>
10
+ </addressBook>