nokogiri 1.6.1 → 1.6.2.rc1

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 (93) hide show
  1. checksums.yaml +7 -7
  2. data/.editorconfig +17 -0
  3. data/.travis.yml +4 -6
  4. data/CHANGELOG.ja.rdoc +37 -8
  5. data/CHANGELOG.rdoc +48 -3
  6. data/Gemfile +3 -3
  7. data/Manifest.txt +57 -1
  8. data/README.ja.rdoc +22 -16
  9. data/README.rdoc +24 -19
  10. data/ROADMAP.md +1 -2
  11. data/Rakefile +161 -58
  12. data/build_all +56 -31
  13. data/dependencies.yml +3 -3
  14. data/ext/nokogiri/extconf.rb +379 -121
  15. data/ext/nokogiri/html_document.c +2 -2
  16. data/ext/nokogiri/nokogiri.c +6 -1
  17. data/ext/nokogiri/xml_document.c +5 -4
  18. data/ext/nokogiri/xml_node.c +11 -4
  19. data/ext/nokogiri/xml_reader.c +1 -1
  20. data/ext/nokogiri/xml_sax_parser_context.c +40 -0
  21. data/ext/nokogiri/xml_syntax_error.c +10 -5
  22. data/ext/nokogiri/xml_syntax_error.h +1 -1
  23. data/ext/nokogiri/xml_xpath_context.c +2 -14
  24. data/ext/nokogiri/xslt_stylesheet.c +1 -1
  25. data/lib/nokogiri.rb +31 -22
  26. data/lib/nokogiri/css/node.rb +0 -50
  27. data/lib/nokogiri/css/parser.rb +213 -218
  28. data/lib/nokogiri/css/parser.y +21 -30
  29. data/lib/nokogiri/css/xpath_visitor.rb +62 -14
  30. data/lib/nokogiri/html/document.rb +97 -18
  31. data/lib/nokogiri/html/sax/parser.rb +2 -2
  32. data/lib/nokogiri/version.rb +1 -1
  33. data/lib/nokogiri/xml/builder.rb +1 -1
  34. data/lib/nokogiri/xml/document.rb +2 -2
  35. data/lib/nokogiri/xml/dtd.rb +10 -0
  36. data/lib/nokogiri/xml/node.rb +26 -1
  37. data/lib/nokogiri/xml/sax/parser.rb +1 -1
  38. data/ports/archives/libxslt-1.1.28.tar.gz +0 -0
  39. data/ports/patches/libxml2/0001-Fix-parser-local-buffers-size-problems.patch +265 -0
  40. data/ports/patches/libxml2/0002-Fix-entities-local-buffers-size-problems.patch +102 -0
  41. data/ports/patches/libxml2/0003-Fix-an-error-in-previous-commit.patch +26 -0
  42. data/ports/patches/libxml2/0004-Fix-potential-out-of-bound-access.patch +26 -0
  43. data/ports/patches/libxml2/0005-Detect-excessive-entities-expansion-upon-replacement.patch +158 -0
  44. data/ports/patches/libxml2/0006-Do-not-fetch-external-parsed-entities.patch +78 -0
  45. data/ports/patches/libxml2/0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch +480 -0
  46. data/ports/patches/libxml2/0008-Improve-handling-of-xmlStopParser.patch +315 -0
  47. data/ports/patches/libxml2/0009-Fix-a-couple-of-return-without-value.patch +37 -0
  48. data/ports/patches/libxslt/0001-Adding-doc-update-related-to-1.1.28.patch +222 -0
  49. data/ports/patches/libxslt/0002-Fix-a-couple-of-places-where-f-printf-parameters-wer.patch +53 -0
  50. data/ports/patches/libxslt/0003-Initialize-pseudo-random-number-generator-with-curre.patch +60 -0
  51. data/ports/patches/libxslt/0004-EXSLT-function-str-replace-is-broken-as-is.patch +42 -0
  52. data/ports/patches/libxslt/0006-Fix-str-padding-to-work-with-UTF-8-strings.patch +164 -0
  53. data/ports/patches/libxslt/0007-Separate-function-for-predicate-matching-in-patterns.patch +587 -0
  54. data/ports/patches/libxslt/0008-Fix-direct-pattern-matching.patch +80 -0
  55. data/ports/patches/libxslt/0009-Fix-certain-patterns-with-predicates.patch +185 -0
  56. data/ports/patches/libxslt/0010-Fix-handling-of-UTF-8-strings-in-EXSLT-crypto-module.patch +126 -0
  57. data/ports/patches/libxslt/0013-Memory-leak-in-xsltCompileIdKeyPattern-error-path.patch +25 -0
  58. data/ports/patches/libxslt/0014-Fix-for-bug-436589.patch +43 -0
  59. data/ports/patches/libxslt/0015-Fix-mkdir-for-mingw.patch +41 -0
  60. data/suppressions/README.txt +1 -0
  61. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  62. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  63. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  64. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  65. data/test/css/test_nthiness.rb +65 -2
  66. data/test/css/test_parser.rb +27 -10
  67. data/test/css/test_tokenizer.rb +1 -1
  68. data/test/css/test_xpath_visitor.rb +6 -1
  69. data/test/files/atom.xml +344 -0
  70. data/test/files/shift_jis_no_charset.html +9 -0
  71. data/test/helper.rb +10 -0
  72. data/test/html/test_document.rb +74 -7
  73. data/test/html/test_document_encoding.rb +10 -0
  74. data/test/html/test_document_fragment.rb +3 -3
  75. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  76. data/test/test_nokogiri.rb +6 -0
  77. data/test/test_reader.rb +7 -4
  78. data/test/test_xslt_transforms.rb +25 -0
  79. data/test/xml/sax/test_parser.rb +16 -0
  80. data/test/xml/sax/test_parser_context.rb +9 -0
  81. data/test/xml/test_builder.rb +9 -0
  82. data/test/xml/test_c14n.rb +12 -2
  83. data/test/xml/test_document.rb +66 -0
  84. data/test/xml/test_document_fragment.rb +5 -0
  85. data/test/xml/test_dtd.rb +84 -0
  86. data/test/xml/test_entity_reference.rb +3 -3
  87. data/test/xml/test_node.rb +21 -3
  88. data/test/xml/test_node_attributes.rb +17 -0
  89. data/test/xml/test_schema.rb +26 -0
  90. data/test/xml/test_xpath.rb +81 -0
  91. metadata +254 -174
  92. data/ports/archives/libxslt-1.1.26.tar.gz +0 -0
  93. data/tasks/cross_compile.rb +0 -134
@@ -0,0 +1,41 @@
1
+ From a7ff3f0043f02d4ade966b6ac05b8be39166daa7 Mon Sep 17 00:00:00 2001
2
+ From: Lars Kanis <lars@greiz-reinsdorf.de>
3
+ Date: Sun, 6 Oct 2013 22:04:46 +0200
4
+ Subject: [PATCH] Use mkdir macro also in case if mingw32.
5
+
6
+ This fixes bug 676511.
7
+ ---
8
+ libxslt/libxslt.h | 6 ++++++
9
+ libxslt/win32config.h | 1 -
10
+ 2 files changed, 6 insertions(+), 1 deletion(-)
11
+
12
+ diff --git a/libxslt/libxslt.h b/libxslt/libxslt.h
13
+ index 2f6f20d..e6d4c83 100644
14
+ --- a/libxslt/libxslt.h
15
+ +++ b/libxslt/libxslt.h
16
+ @@ -27,4 +27,10 @@
17
+ #endif
18
+ #endif
19
+
20
+ +#if defined(_MSC_VER) || defined(__MINGW32__)
21
+ +#include <io.h>
22
+ +#include <direct.h>
23
+ +#define mkdir(p,m) _mkdir(p)
24
+ +#endif
25
+ +
26
+ #endif /* ! __XSLT_LIBXSLT_H__ */
27
+ diff --git a/libxslt/win32config.h b/libxslt/win32config.h
28
+ index 9f60e55..e1ceae1 100644
29
+ --- a/libxslt/win32config.h
30
+ +++ b/libxslt/win32config.h
31
+ @@ -78,7 +78,6 @@ static int isnan (double d) {
32
+
33
+ #include <direct.h>
34
+ #if defined(_MSC_VER) || defined(__MINGW32__)
35
+ -#define mkdir(p,m) _mkdir(p)
36
+ #define snprintf _snprintf
37
+ #if _MSC_VER < 1500
38
+ #define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a)
39
+ --
40
+ 1.8.3.2
41
+
@@ -0,0 +1 @@
1
+ This directory contains valgrind suppression files generated by the hoe-debugging gem.
@@ -0,0 +1,61 @@
1
+ {
2
+ <insert_a_suppression_name_here>
3
+ Memcheck:Addr8
4
+ fun:garbage_collect
5
+ fun:rb_newobj
6
+ fun:rb_node_newnode
7
+ fun:ruby_yyparse
8
+ fun:yycompile
9
+ fun:load_file
10
+ fun:rb_load
11
+ fun:rb_require_safe
12
+ fun:rb_call0
13
+ fun:rb_call
14
+ fun:eval_fcall
15
+ fun:rb_eval
16
+ fun:rb_load
17
+ fun:rb_require_safe
18
+ fun:rb_call0
19
+ fun:rb_call
20
+ fun:eval_fcall
21
+ fun:rb_eval
22
+ fun:rb_load
23
+ fun:rb_require_safe
24
+ fun:rb_protect
25
+ fun:require_libraries
26
+ fun:proc_options
27
+ fun:ruby_process_options
28
+ }
29
+ {
30
+ <insert_a_suppression_name_here>
31
+ Memcheck:Addr8
32
+ fun:garbage_collect_0
33
+ fun:rb_newobj
34
+ fun:rb_node_newnode
35
+ fun:ruby_yyparse
36
+ fun:yycompile
37
+ fun:load_file
38
+ fun:rb_load
39
+ fun:rb_require_safe
40
+ fun:rb_call0
41
+ fun:rb_call
42
+ fun:eval_fcall
43
+ fun:rb_eval
44
+ fun:rb_load
45
+ fun:rb_require_safe
46
+ fun:rb_call0
47
+ fun:rb_call
48
+ fun:eval_fcall
49
+ fun:rb_eval
50
+ fun:rb_load
51
+ fun:rb_require_safe
52
+ fun:rb_protect
53
+ fun:require_libraries
54
+ fun:proc_options
55
+ fun:ruby_process_options
56
+ }
57
+ {
58
+ <insert_a_suppression_name_here>
59
+ Memcheck:Addr8
60
+ fun:rb_gc_wipe_stack
61
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ <insert_a_suppression_name_here>
3
+ Memcheck:Addr4
4
+ fun:glob_helper
5
+ fun:ruby_glob0
6
+ fun:rb_push_glob
7
+ fun:vm_call_method
8
+ fun:vm_exec_core
9
+ fun:vm_exec
10
+ fun:rb_yield
11
+ fun:rb_ary_each
12
+ fun:vm_call_method
13
+ fun:vm_exec_core
14
+ fun:vm_exec
15
+ fun:vm_call0
16
+ fun:rb_iterate
17
+ fun:rb_block_call
18
+ fun:enum_find_all
19
+ fun:vm_call_method
20
+ fun:vm_exec_core
21
+ fun:vm_exec
22
+ fun:vm_call0
23
+ fun:rb_class_new_instance
24
+ fun:vm_call_method
25
+ fun:vm_exec_core
26
+ fun:vm_exec
27
+ fun:vm_call0
28
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ <insert_a_suppression_name_here>
3
+ Memcheck:Addr4
4
+ fun:glob_helper
5
+ fun:ruby_glob0
6
+ fun:rb_push_glob
7
+ fun:vm_call_method
8
+ fun:vm_exec_core
9
+ fun:vm_exec
10
+ fun:rb_yield
11
+ fun:rb_ary_each
12
+ fun:vm_call_method
13
+ fun:vm_exec_core
14
+ fun:vm_exec
15
+ fun:vm_call0
16
+ fun:rb_iterate
17
+ fun:rb_block_call
18
+ fun:enum_find_all
19
+ fun:vm_call_method
20
+ fun:vm_exec_core
21
+ fun:vm_exec
22
+ fun:vm_call0
23
+ fun:rb_class_new_instance
24
+ fun:vm_call_method
25
+ fun:vm_exec_core
26
+ fun:vm_exec
27
+ fun:vm_call0
28
+ }
@@ -26,10 +26,20 @@ module Nokogiri
26
26
  <div>
27
27
  <b>bold1 </b>
28
28
  <i>italic1 </i>
29
- <b>bold2 </b>
29
+ <b class="a">bold2 </b>
30
+ <em class="a">emphasis1 </em>
30
31
  <i>italic2 </i>
31
32
  <p>para1 </p>
32
- <b>bold3 </b>
33
+ <b class="a">bold3 </b>
34
+ </div>
35
+ <div>
36
+ <i class="b">italic3 </i>
37
+ <em>emphasis2 </em>
38
+ <i class="b">italic4 </i>
39
+ <em>emphasis3 </em>
40
+ <i class="c">italic5 </i>
41
+ <span><i class="b">italic6 </i></span>
42
+ <i>italic7 </i>
33
43
  </div>
34
44
  <div>
35
45
  <p>para2 </p>
@@ -38,6 +48,20 @@ module Nokogiri
38
48
  <div>
39
49
  <p>para4 </p>
40
50
  </div>
51
+
52
+ <div>
53
+ <h2></h2>
54
+ <h1 class='c'>header1 </h1>
55
+ <h2></h2>
56
+ </div>
57
+ <div>
58
+ <h1 class='c'>header2 </h1>
59
+ <h1 class='c'>header3 </h1>
60
+ </div>
61
+ <div>
62
+ <h1 class='c'>header4</h1>
63
+ </div>
64
+
41
65
  <p class='empty'></p>
42
66
  <p class='not-empty'><b></b></p>
43
67
  </html>
@@ -74,6 +98,10 @@ EOF
74
98
  assert_result_rows [1,2,3], @parser.search("table/tr:nth(-n+3)")
75
99
  end
76
100
 
101
+ def test_4nm1
102
+ assert_result_rows [3,7,11], @parser.search("table/tr:nth(4n-1)")
103
+ end
104
+
77
105
  def test_np3
78
106
  assert_result_rows [3,4,5,6,7,8,9,10,11,12,13,14], @parser.search("table/tr:nth(n+3)")
79
107
  end
@@ -91,29 +119,64 @@ EOF
91
119
  def test_first_child
92
120
  assert_result_rows [1], @parser.search("div/b:first-child"), "bold"
93
121
  assert_result_rows [1], @parser.search("table/tr:first-child")
122
+ assert_result_rows [2,4], @parser.search("div/h1.c:first-child"), "header"
94
123
  end
95
124
 
96
125
  def test_last_child
97
126
  assert_result_rows [3], @parser.search("div/b:last-child"), "bold"
98
127
  assert_result_rows [14], @parser.search("table/tr:last-child")
128
+ assert_result_rows [3,4], @parser.search("div/h1.c:last-child"), "header"
129
+ end
130
+
131
+ def test_nth_child
132
+ assert_result_rows [2], @parser.search("div/b:nth-child(3)"), "bold"
133
+ assert_result_rows [5], @parser.search("table/tr:nth-child(5)")
134
+ assert_result_rows [1,3], @parser.search("div/h1.c:nth-child(2)"), "header"
135
+ assert_result_rows [3,4], @parser.search("div/i.b:nth-child(2n+1)"), "italic"
99
136
  end
100
137
 
101
138
  def test_first_of_type
102
139
  assert_result_rows [1], @parser.search("table/tr:first-of-type")
103
140
  assert_result_rows [1], @parser.search("div/b:first-of-type"), "bold"
141
+ assert_result_rows [2], @parser.search("div/b.a:first-of-type"), "bold"
142
+ assert_result_rows [3], @parser.search("div/i.b:first-of-type"), "italic"
104
143
  end
105
144
 
106
145
  def test_last_of_type
107
146
  assert_result_rows [14], @parser.search("table/tr:last-of-type")
108
147
  assert_result_rows [3], @parser.search("div/b:last-of-type"), "bold"
148
+ assert_result_rows [2,7], @parser.search("div/i:last-of-type"), "italic"
149
+ assert_result_rows [2,6,7], @parser.search("div i:last-of-type"), "italic"
150
+ assert_result_rows [4], @parser.search("div/i.b:last-of-type"), "italic"
151
+ end
152
+
153
+ def test_nth_of_type
154
+ assert_result_rows [1], @parser.search("div/b:nth-of-type(1)"), "bold"
155
+ assert_result_rows [2], @parser.search("div/b:nth-of-type(2)"), "bold"
156
+ assert_result_rows [2], @parser.search("div/.a:nth-of-type(1)"), "bold"
157
+ assert_result_rows [2,4,7], @parser.search("div i:nth-of-type(2n)"), "italic"
158
+ assert_result_rows [1,3,5,6], @parser.search("div i:nth-of-type(2n+1)"), "italic"
159
+ assert_result_rows [1], @parser.search("div .a:nth-of-type(2n)"), "emphasis"
160
+ assert_result_rows [2,3], @parser.search("div .a:nth-of-type(2n+1)"), "bold"
161
+ end
162
+
163
+ def test_nth_last_of_type
164
+ assert_result_rows [14], @parser.search("table/tr:nth-last-of-type(1)")
165
+ assert_result_rows [12], @parser.search("table/tr:nth-last-of-type(3)")
166
+ assert_result_rows [2,6,7], @parser.search("div i:nth-last-of-type(1)"), "italic"
167
+ assert_result_rows [1,5], @parser.search("div i:nth-last-of-type(2)"), "italic"
168
+ assert_result_rows [4], @parser.search("div/i.b:nth-last-of-type(1)"), "italic"
169
+ assert_result_rows [3], @parser.search("div/i.b:nth-last-of-type(2)"), "italic"
109
170
  end
110
171
 
111
172
  def test_only_of_type
112
173
  assert_result_rows [1,4], @parser.search("div/p:only-of-type"), "para"
174
+ assert_result_rows [5], @parser.search("div/i.c:only-of-type"), "italic"
113
175
  end
114
176
 
115
177
  def test_only_child
116
178
  assert_result_rows [4], @parser.search("div/p:only-child"), "para"
179
+ assert_result_rows [4], @parser.search("div/h1.c:only-child"), "header"
117
180
  end
118
181
 
119
182
  def test_empty
@@ -82,9 +82,9 @@ module Nokogiri
82
82
  end
83
83
 
84
84
  def test_function_with_arguments
85
- assert_xpath "//*[position() = 2 and self::a]",
85
+ assert_xpath "//a[count(preceding-sibling::*) = 1]",
86
86
  @parser.parse("a[2]")
87
- assert_xpath "//*[position() = 2 and self::a]",
87
+ assert_xpath "//a[count(preceding-sibling::*) = 1]",
88
88
  @parser.parse("a:nth-child(2)")
89
89
  end
90
90
 
@@ -158,24 +158,31 @@ module Nokogiri
158
158
  def test_standard_nth_selectors
159
159
  assert_xpath '//a[position() = 1]', @parser.parse('a:first-of-type()')
160
160
  assert_xpath '//a[position() = 1]', @parser.parse('a:first-of-type') # no parens
161
- assert_xpath '//a[position() = 99]', @parser.parse('a:nth-of-type(99)')
161
+ assert_xpath "//a[contains(concat(' ', normalize-space(@class), ' '), ' b ')][position() = 1]",
162
+ @parser.parse('a.b:first-of-type') # no parens
163
+ assert_xpath '//a[position() = 99]', @parser.parse('a:nth-of-type(99)')
164
+ assert_xpath "//a[contains(concat(' ', normalize-space(@class), ' '), ' b ')][position() = 99]",
165
+ @parser.parse('a.b:nth-of-type(99)')
162
166
  assert_xpath '//a[position() = last()]', @parser.parse('a:last-of-type()')
163
167
  assert_xpath '//a[position() = last()]', @parser.parse('a:last-of-type') # no parens
168
+ assert_xpath "//a[contains(concat(' ', normalize-space(@class), ' '), ' b ')][position() = last()]",
169
+ @parser.parse('a.b:last-of-type') # no parens
164
170
  assert_xpath '//a[position() = last()]', @parser.parse('a:nth-last-of-type(1)')
165
171
  assert_xpath '//a[position() = last() - 98]', @parser.parse('a:nth-last-of-type(99)')
172
+ assert_xpath "//a[contains(concat(' ', normalize-space(@class), ' '), ' b ')][position() = last() - 98]",
173
+ @parser.parse('a.b:nth-last-of-type(99)')
166
174
  end
167
175
 
168
176
  def test_nth_child_selectors
169
- assert_xpath '//*[position() = 1 and self::a]', @parser.parse('a:first-child')
170
- assert_xpath '//*[position() = 99 and self::a]', @parser.parse('a:nth-child(99)')
171
- assert_xpath '//*[position() = last() and self::a]', @parser.parse('a:last-child')
172
- assert_xpath '//*[position() = last() and self::a]', @parser.parse('a:nth-last-child(1)')
173
- assert_xpath '//*[position() = last() - 98 and self::a]', @parser.parse('a:nth-last-child(99)')
177
+ assert_xpath '//a[count(preceding-sibling::*) = 0]', @parser.parse('a:first-child')
178
+ assert_xpath '//a[count(preceding-sibling::*) = 98]', @parser.parse('a:nth-child(99)')
179
+ assert_xpath '//a[count(following-sibling::*) = 0]', @parser.parse('a:last-child')
180
+ assert_xpath '//a[count(following-sbiling::*) = 0]', @parser.parse('a:nth-last-child(1)')
181
+ assert_xpath '//a[count(following-sbiling::*) = 98]', @parser.parse('a:nth-last-child(99)')
174
182
  end
175
183
 
176
184
  def test_miscellaneous_selectors
177
- assert_xpath '//*[last() = 1 and self::a]',
178
- @parser.parse('a:only-child')
185
+ assert_xpath '//a[count(preceding-sibling::*) = 0 and count(following-sibling::*) = 0]', @parser.parse('a:only-child')
179
186
  assert_xpath '//a[last() = 1]', @parser.parse('a:only-of-type')
180
187
  assert_xpath '//a[not(node())]', @parser.parse('a:empty')
181
188
  end
@@ -284,6 +291,11 @@ module Nokogiri
284
291
  @parser.parse('foo .awesome')
285
292
  end
286
293
 
294
+ def test_bare_not
295
+ assert_xpath "//*[not(contains(concat(' ', normalize-space(@class), ' '), ' a '))]",
296
+ @parser.parse(':not(.a)')
297
+ end
298
+
287
299
  def test_not_so_simple_not
288
300
  assert_xpath "//*[@id = 'p' and not(contains(concat(' ', normalize-space(@class), ' '), ' a '))]",
289
301
  @parser.parse('#p:not(.a)')
@@ -293,6 +305,11 @@ module Nokogiri
293
305
  @parser.parse("p[a='foo']:not(.b)")
294
306
  end
295
307
 
308
+ def test_multiple_not
309
+ assert_xpath "//p[not(contains(concat(' ', normalize-space(@class), ' '), ' a ')) and not(contains(concat(' ', normalize-space(@class), ' '), ' b ')) and not(contains(concat(' ', normalize-space(@class), ' '), ' c '))]",
310
+ @parser.parse("p:not(.a):not(.b):not(.c)")
311
+ end
312
+
296
313
  def test_ident
297
314
  assert_xpath '//x', @parser.parse('x')
298
315
  end
@@ -152,7 +152,7 @@ module Nokogiri
152
152
  ], @scanner)
153
153
  end
154
154
 
155
- def test_scan_an_plus_b
155
+ def test_scan_nth
156
156
  @scanner.scan('x:nth-child(5n+3)')
157
157
  assert_tokens([ [:IDENT, 'x'],
158
158
  [':', ':'],
@@ -13,10 +13,15 @@ module Nokogiri
13
13
  end
14
14
 
15
15
  def test_not_last_child
16
- assert_xpath('//ol/*[not(position() = last())]',
16
+ assert_xpath('//ol/*[not(count(following-sibling::*) = 0)]',
17
17
  @parser.parse('ol > *:not(:last-child)'))
18
18
  end
19
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
+
20
25
  def test_function_calls_allow_at_params
21
26
  assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
22
27
  assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
@@ -0,0 +1,344 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US">
3
+ <id>tag:github.com,2008:/sparklemotion/nokogiri/commits/master</id>
4
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commits/master"/>
5
+ <link type="application/atom+xml" rel="self" href="https://github.com/sparklemotion/nokogiri/commits/master.atom"/>
6
+ <title>Recent Commits to nokogiri:master</title>
7
+ <updated>2013-07-02T08:17:16-07:00</updated>
8
+ <entry>
9
+ <id>tag:github.com,2008:Grit::Commit/233489ddfe4698b24dfcdc1daf3ca15bc880e4b1</id>
10
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/233489ddfe4698b24dfcdc1daf3ca15bc880e4b1"/>
11
+ <title>
12
+ Updated changelog with merged pull requests #887 and #931
13
+ </title>
14
+ <updated>2013-07-02T08:17:16-07:00</updated>
15
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
16
+ <author>
17
+ <name>injekt</name>
18
+ <uri>https://github.com/injekt</uri>
19
+ </author>
20
+ <content type="html">
21
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Updated changelog with merged pull requests #887 and #931&lt;/pre>
22
+ </content>
23
+ </entry>
24
+ <entry>
25
+ <id>tag:github.com,2008:Grit::Commit/15eff8be4539a3461cfc1e3c8a257e7eed134e01</id>
26
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/15eff8be4539a3461cfc1e3c8a257e7eed134e01"/>
27
+ <title>
28
+ Merge pull request #887 from Mange/double-not
29
+ </title>
30
+ <updated>2013-07-02T08:13:36-07:00</updated>
31
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
32
+ <author>
33
+ <name>injekt</name>
34
+ <uri>https://github.com/injekt</uri>
35
+ </author>
36
+ <content type="html">
37
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Merge pull request #887 from Mange/double-not
38
+
39
+ Add support for bare and multiple :not() functions in selectors&lt;/pre>
40
+ </content>
41
+ </entry>
42
+ <entry>
43
+ <id>tag:github.com,2008:Grit::Commit/7a54b1fd1ba1dbcd50d3566bcc62d554eb0fd30e</id>
44
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/7a54b1fd1ba1dbcd50d3566bcc62d554eb0fd30e"/>
45
+ <title>
46
+ Merge pull request #931 from sorah/dont_call_pkgconfig_when_using_bundled_libraries
47
+ </title>
48
+ <updated>2013-07-02T08:11:37-07:00</updated>
49
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/74f896b312b786ee75a18073941e2457?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
50
+ <author>
51
+ <name>knu</name>
52
+ <uri>https://github.com/knu</uri>
53
+ </author>
54
+ <content type="html">
55
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Merge pull request #931 from sorah/dont_call_pkgconfig_when_using_bundled_libraries
56
+
57
+ extconf.rb: Don&#39;t call pkg_config when using bundled libraries&lt;/pre>
58
+ </content>
59
+ </entry>
60
+ <entry>
61
+ <id>tag:github.com,2008:Grit::Commit/e5b93617ba810a34a4fc70dac76a83f9bebd2ea1</id>
62
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/e5b93617ba810a34a4fc70dac76a83f9bebd2ea1"/>
63
+ <title>
64
+ extconf.rb: Don&#39;t call pkg_config when using bundled libraries
65
+ </title>
66
+ <updated>2013-07-02T06:30:00-07:00</updated>
67
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/c4f076f658dd3464f1d8785ad53a0d99?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
68
+ <author>
69
+ <name>sorah</name>
70
+ <uri>https://github.com/sorah</uri>
71
+ </author>
72
+ <content type="html">
73
+ &lt;pre style='white-space:pre-wrap;width:81ex'>extconf.rb: Don&#39;t call pkg_config when using bundled libraries&lt;/pre>
74
+ </content>
75
+ </entry>
76
+ <entry>
77
+ <id>tag:github.com,2008:Grit::Commit/64cd3c8f506394b558bda9376844a51db971bd60</id>
78
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/64cd3c8f506394b558bda9376844a51db971bd60"/>
79
+ <title>
80
+ Add support for bare and multiple :not() functions in selectors
81
+ </title>
82
+ <updated>2013-06-28T10:19:36-07:00</updated>
83
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/1b2792536d87aa21bc739c14980fa103?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
84
+ <author>
85
+ <name>Mange</name>
86
+ <uri>https://github.com/Mange</uri>
87
+ </author>
88
+ <content type="html">
89
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Add support for bare and multiple :not() functions in selectors
90
+
91
+ This enables parsing of &quot;.flash:not(.error):not(.warning)&quot; and
92
+ &quot;:not(p)&quot;.
93
+
94
+ This entailed a huge change to the parser, but I think the parser should
95
+ be a bit more robust now by not declaring :not a special case.&lt;/pre>
96
+ </content>
97
+ </entry>
98
+ <entry>
99
+ <id>tag:github.com,2008:Grit::Commit/37828ec784faf29d713225fa78585854912356cd</id>
100
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/37828ec784faf29d713225fa78585854912356cd"/>
101
+ <title>
102
+ Report error and stop parsing instead of silently ignoring it.
103
+ </title>
104
+ <updated>2013-06-27T18:46:12-07:00</updated>
105
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/2736d9750eb13425e9bf70f112753c49?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
106
+ <author>
107
+ <name>jvshahid</name>
108
+ <uri>https://github.com/jvshahid</uri>
109
+ </author>
110
+ <content type="html">
111
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Report error and stop parsing instead of silently ignoring it.&lt;/pre>
112
+ </content>
113
+ </entry>
114
+ <entry>
115
+ <id>tag:github.com,2008:Grit::Commit/42da60e8ca58a5acc9e8c94ae5ad490589f146c6</id>
116
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/42da60e8ca58a5acc9e8c94ae5ad490589f146c6"/>
117
+ <title>
118
+ Merge pull request #930 from ctborg/master
119
+ </title>
120
+ <updated>2013-06-27T04:23:33-07:00</updated>
121
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
122
+ <author>
123
+ <name>injekt</name>
124
+ <uri>https://github.com/injekt</uri>
125
+ </author>
126
+ <content type="html">
127
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Merge pull request #930 from ctborg/master
128
+
129
+ Adds support for Solaris, OpenSolaris, or illumos.&lt;/pre>
130
+ </content>
131
+ </entry>
132
+ <entry>
133
+ <id>tag:github.com,2008:Grit::Commit/7382a6e6a66d3f80da955ebbcd82250f99321900</id>
134
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/7382a6e6a66d3f80da955ebbcd82250f99321900"/>
135
+ <title>
136
+ Updated CHANGELOG with latest merged pulls
137
+ </title>
138
+ <updated>2013-06-27T04:04:17-07:00</updated>
139
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
140
+ <author>
141
+ <name>injekt</name>
142
+ <uri>https://github.com/injekt</uri>
143
+ </author>
144
+ <content type="html">
145
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Updated CHANGELOG with latest merged pulls&lt;/pre>
146
+ </content>
147
+ </entry>
148
+ <entry>
149
+ <id>tag:github.com,2008:Grit::Commit/3382ebc90e17f2503f4acbbdf53a931d38f3322a</id>
150
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/3382ebc90e17f2503f4acbbdf53a931d38f3322a"/>
151
+ <title>
152
+ Remove REE also.
153
+ </title>
154
+ <updated>2013-06-19T20:57:48-07:00</updated>
155
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/74f896b312b786ee75a18073941e2457?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
156
+ <author>
157
+ <name>knu</name>
158
+ <uri>https://github.com/knu</uri>
159
+ </author>
160
+ <content type="html">
161
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Remove REE also.&lt;/pre>
162
+ </content>
163
+ </entry>
164
+ <entry>
165
+ <id>tag:github.com,2008:Grit::Commit/0c83f4027e295435680cda89a44b5e039e0e6cbb</id>
166
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/0c83f4027e295435680cda89a44b5e039e0e6cbb"/>
167
+ <title>
168
+ Added support for Solaris, OpenSolaris, or illumos
169
+ </title>
170
+ <updated>2013-06-19T07:12:50-07:00</updated>
171
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/aff9165c0ea741d027799d5694d0ceb8?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
172
+ <author>
173
+ <name></name>
174
+ <email>cborg@oanda.com</email>
175
+ </author>
176
+ <content type="html">
177
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Added support for Solaris, OpenSolaris, or illumos&lt;/pre>
178
+ </content>
179
+ </entry>
180
+ <entry>
181
+ <id>tag:github.com,2008:Grit::Commit/fb000c51e3ba4e8730a535d38d617d34111c21ef</id>
182
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/fb000c51e3ba4e8730a535d38d617d34111c21ef"/>
183
+ <title>
184
+ Ensure meta_encoding checks meta charset tag (closes #919)
185
+ </title>
186
+ <updated>2013-06-14T06:06:26-07:00</updated>
187
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
188
+ <author>
189
+ <name>injekt</name>
190
+ <uri>https://github.com/injekt</uri>
191
+ </author>
192
+ <content type="html">
193
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Ensure meta_encoding checks meta charset tag (closes #919)&lt;/pre>
194
+ </content>
195
+ </entry>
196
+ <entry>
197
+ <id>tag:github.com,2008:Grit::Commit/14b7dc21bbeddec1990726760e6f6cc11e71542e</id>
198
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/14b7dc21bbeddec1990726760e6f6cc11e71542e"/>
199
+ <title>
200
+ Updated ROADMAP
201
+ </title>
202
+ <updated>2013-06-14T06:00:57-07:00</updated>
203
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
204
+ <author>
205
+ <name>injekt</name>
206
+ <uri>https://github.com/injekt</uri>
207
+ </author>
208
+ <content type="html">
209
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Updated ROADMAP&lt;/pre>
210
+ </content>
211
+ </entry>
212
+ <entry>
213
+ <id>tag:github.com,2008:Grit::Commit/d1b0afd02f8a2b783380bdfde3acfabf021a0c5a</id>
214
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/d1b0afd02f8a2b783380bdfde3acfabf021a0c5a"/>
215
+ <title>
216
+ Merge pull request #858 from ykzts/feature/not-only-child
217
+ </title>
218
+ <updated>2013-06-14T05:53:28-07:00</updated>
219
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
220
+ <author>
221
+ <name>injekt</name>
222
+ <uri>https://github.com/injekt</uri>
223
+ </author>
224
+ <content type="html">
225
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Merge pull request #858 from ykzts/feature/not-only-child
226
+
227
+ Add feature that the &#39;:only-child&#39; pseudo class should work even though it&#39;s in &#39;:not&#39; pseudo class.&lt;/pre>
228
+ </content>
229
+ </entry>
230
+ <entry>
231
+ <id>tag:github.com,2008:Grit::Commit/d24eb8508c69f2cf336f1ff1b6887fcc3b317fbc</id>
232
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/d24eb8508c69f2cf336f1ff1b6887fcc3b317fbc"/>
233
+ <title>
234
+ Merge pull request #886 from Mange/negative-nth
235
+ </title>
236
+ <updated>2013-06-14T05:50:13-07:00</updated>
237
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/9077af710bdadc972a7898e457bf6ec1?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
238
+ <author>
239
+ <name>injekt</name>
240
+ <uri>https://github.com/injekt</uri>
241
+ </author>
242
+ <content type="html">
243
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Merge pull request #886 from Mange/negative-nth
244
+
245
+ Add support for an-b in nth selectors&lt;/pre>
246
+ </content>
247
+ </entry>
248
+ <entry>
249
+ <id>tag:github.com,2008:Grit::Commit/11eaf3d3f1b84adf5225b6686119dbc6714b4009</id>
250
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/11eaf3d3f1b84adf5225b6686119dbc6714b4009"/>
251
+ <title>
252
+ Note 1.8 deprecation in README
253
+ </title>
254
+ <updated>2013-06-11T06:48:53-07:00</updated>
255
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/bd6e7860b5a891bff077aeaeb5434e60?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
256
+ <author>
257
+ <name>flavorjones</name>
258
+ <uri>https://github.com/flavorjones</uri>
259
+ </author>
260
+ <content type="html">
261
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Note 1.8 deprecation in README&lt;/pre>
262
+ </content>
263
+ </entry>
264
+ <entry>
265
+ <id>tag:github.com,2008:Grit::Commit/82a936a0ceba0508d29cc9f6da84c5a98ae7bede</id>
266
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/82a936a0ceba0508d29cc9f6da84c5a98ae7bede"/>
267
+ <title>
268
+ Fix a typo and DRY with dir_config() calls.
269
+ </title>
270
+ <updated>2013-06-10T21:01:03-07:00</updated>
271
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/74f896b312b786ee75a18073941e2457?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
272
+ <author>
273
+ <name>knu</name>
274
+ <uri>https://github.com/knu</uri>
275
+ </author>
276
+ <content type="html">
277
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Fix a typo and DRY with dir_config() calls.&lt;/pre>
278
+ </content>
279
+ </entry>
280
+ <entry>
281
+ <id>tag:github.com,2008:Grit::Commit/c7ef9b339054f8502e7f526b1b8054e3412cf7ba</id>
282
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/c7ef9b339054f8502e7f526b1b8054e3412cf7ba"/>
283
+ <title>
284
+ Iconv was for building libxml2 and not for nokogiri itself.
285
+ </title>
286
+ <updated>2013-06-10T17:55:20-07:00</updated>
287
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/74f896b312b786ee75a18073941e2457?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
288
+ <author>
289
+ <name>knu</name>
290
+ <uri>https://github.com/knu</uri>
291
+ </author>
292
+ <content type="html">
293
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Iconv was for building libxml2 and not for nokogiri itself.&lt;/pre>
294
+ </content>
295
+ </entry>
296
+ <entry>
297
+ <id>tag:github.com,2008:Grit::Commit/4c1c225b9409571156430aeb5bcf89c4f9dd4812</id>
298
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/4c1c225b9409571156430aeb5bcf89c4f9dd4812"/>
299
+ <title>
300
+ Make sure the MRI gem is built correctly.
301
+ </title>
302
+ <updated>2013-06-10T07:40:39-07:00</updated>
303
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/bd6e7860b5a891bff077aeaeb5434e60?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
304
+ <author>
305
+ <name>flavorjones</name>
306
+ <uri>https://github.com/flavorjones</uri>
307
+ </author>
308
+ <content type="html">
309
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Make sure the MRI gem is built correctly.&lt;/pre>
310
+ </content>
311
+ </entry>
312
+ <entry>
313
+ <id>tag:github.com,2008:Grit::Commit/b6100afd7a0ce17097fb3ca58ae8fe5e63522f6d</id>
314
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/b6100afd7a0ce17097fb3ca58ae8fe5e63522f6d"/>
315
+ <title>
316
+ Fiddling with the windows cross-compile gem logic.
317
+ </title>
318
+ <updated>2013-06-10T07:33:59-07:00</updated>
319
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/bd6e7860b5a891bff077aeaeb5434e60?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
320
+ <author>
321
+ <name>flavorjones</name>
322
+ <uri>https://github.com/flavorjones</uri>
323
+ </author>
324
+ <content type="html">
325
+ &lt;pre style='white-space:pre-wrap;width:81ex'>Fiddling with the windows cross-compile gem logic.&lt;/pre>
326
+ </content>
327
+ </entry>
328
+ <entry>
329
+ <id>tag:github.com,2008:Grit::Commit/b1483de363524c882b5e682a3d3a6e6ab5d7511b</id>
330
+ <link type="text/html" rel="alternate" href="https://github.com/sparklemotion/nokogiri/commit/b1483de363524c882b5e682a3d3a6e6ab5d7511b"/>
331
+ <title>
332
+ build_all now uses ruby 1.9.3 to build everything.
333
+ </title>
334
+ <updated>2013-06-10T07:33:56-07:00</updated>
335
+ <media:thumbnail height="30" width="30" url="https://secure.gravatar.com/avatar/bd6e7860b5a891bff077aeaeb5434e60?s=30&amp;d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png"/>
336
+ <author>
337
+ <name>flavorjones</name>
338
+ <uri>https://github.com/flavorjones</uri>
339
+ </author>
340
+ <content type="html">
341
+ &lt;pre style='white-space:pre-wrap;width:81ex'>build_all now uses ruby 1.9.3 to build everything.&lt;/pre>
342
+ </content>
343
+ </entry>
344
+ </feed>