nokogiri 1.4.4 → 1.4.5

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 (54) hide show
  1. data/.gemtest +0 -0
  2. data/CHANGELOG.ja.rdoc +16 -0
  3. data/CHANGELOG.rdoc +23 -1
  4. data/Manifest.txt +4 -3
  5. data/Rakefile +41 -37
  6. data/ext/nokogiri/xml_document.c +9 -0
  7. data/ext/nokogiri/xml_io.c +32 -7
  8. data/ext/nokogiri/xml_node.c +14 -13
  9. data/ext/nokogiri/xml_sax_parser.c +4 -2
  10. data/ext/nokogiri/xslt_stylesheet.c +9 -3
  11. data/lib/nokogiri/css.rb +6 -3
  12. data/lib/nokogiri/css/parser.rb +665 -70
  13. data/lib/nokogiri/css/parser.y +3 -1
  14. data/lib/nokogiri/css/parser_extras.rb +91 -0
  15. data/lib/nokogiri/css/tokenizer.rb +148 -3
  16. data/lib/nokogiri/css/tokenizer.rex +1 -1
  17. data/lib/nokogiri/ffi/structs/xml_attr.rb +2 -1
  18. data/lib/nokogiri/ffi/structs/xml_node_set.rb +1 -1
  19. data/lib/nokogiri/ffi/weak_bucket.rb +10 -10
  20. data/lib/nokogiri/ffi/xml/document.rb +8 -0
  21. data/lib/nokogiri/ffi/xml/node_set.rb +1 -0
  22. data/lib/nokogiri/ffi/xml/sax/parser.rb +9 -1
  23. data/lib/nokogiri/ffi/xslt/stylesheet.rb +4 -0
  24. data/lib/nokogiri/html/document.rb +134 -15
  25. data/lib/nokogiri/html/sax/parser.rb +6 -2
  26. data/lib/nokogiri/version.rb +6 -1
  27. data/lib/nokogiri/xml/node.rb +8 -23
  28. data/lib/nokogiri/xml/node/save_options.rb +10 -0
  29. data/lib/nokogiri/xml/node_set.rb +1 -1
  30. data/lib/nokogiri/xml/parse_options.rb +8 -0
  31. data/lib/nokogiri/xml/reader.rb +6 -6
  32. data/lib/nokogiri/xml/sax/document.rb +2 -2
  33. data/lib/nokogiri/xml/schema.rb +7 -1
  34. data/tasks/cross_compile.rb +8 -15
  35. data/test/css/test_tokenizer.rb +8 -0
  36. data/test/files/encoding.html +82 -0
  37. data/test/files/encoding.xhtml +84 -0
  38. data/test/helper.rb +2 -0
  39. data/test/html/sax/test_parser.rb +45 -0
  40. data/test/html/test_document.rb +55 -0
  41. data/test/html/test_document_encoding.rb +46 -0
  42. data/test/html/test_element_description.rb +1 -1
  43. data/test/test_memory_leak.rb +20 -0
  44. data/test/test_reader.rb +13 -0
  45. data/test/test_xslt_transforms.rb +6 -2
  46. data/test/xml/sax/test_parser.rb +16 -0
  47. data/test/xml/test_document.rb +3 -1
  48. data/test/xml/test_node.rb +13 -1
  49. data/test/xml/test_node_set.rb +10 -0
  50. data/test/xml/test_schema.rb +5 -0
  51. metadata +94 -109
  52. data/deps.rip +0 -5
  53. data/lib/nokogiri/css/generated_parser.rb +0 -676
  54. data/lib/nokogiri/css/generated_tokenizer.rb +0 -145
File without changes
@@ -1,3 +1,19 @@
1
+ === 1.4.5 / 未リリース
2
+
3
+ * 新機能
4
+
5
+ * Nokogiri::HTML::Document#title アクセサメソッドでHTML文書のタイトルを読み書きできる
6
+
7
+ * バグの修正
8
+
9
+ * Node#serialize とその仲間達はSaveOptionオブジェクトを受け入れる
10
+ * Nokogiri::CSS::Parser has-a Nokogiri::CSS::Tokenizer
11
+ * [JRUBY+FFIのみ] 「弱い参照」はスレッドセーフになった. #355
12
+ * HTML::SAX::Parserから呼ばれるstart_element()コールバックのattributes引数はHTML::XML::Parserによるエミュレートコールバックと同じく連想配列になった. rel. #356
13
+ * HTML::SAX::Parserのparse*()メソッドはXML::SAX::Parser同様に渡されたブロックをコールバックするようになった.
14
+ * HTMLパーサーのエンコーディング判定をlibxml2の仕様を超えて拡張・改善した. (XML宣言のencodingを認識、非ASCII文字出現後のmetaタグも文字化けを生じずに反映)
15
+ * Document#remove_namespaces! は名前空間付きの属性に対応した. #396
16
+
1
17
  === 1.4.4 2010年11月15日
2
18
 
3
19
  * 新機能
@@ -1,4 +1,26 @@
1
- === 1.4.4 / Unreleased
1
+ === 1.4.5 / 2011-06-15
2
+
3
+ * New Features
4
+
5
+ * Nokogiri::HTML::Document#title accessor gets and sets the document title.
6
+ * extracted sets of Node::SaveOptions into Node::SaveOptions::DEFAULT_{X,H,XH}TML (refactor)
7
+ * Raise an exception if a string is passed to Nokogiri::XML::Schema#validate. #406
8
+
9
+ * Bugfixes
10
+
11
+ * Node#serialize-and-friends now accepts a SaveOption object as the, erm, save object.
12
+ * Nokogiri::CSS::Parser has-a Nokogiri::CSS::Tokenizer
13
+ * [JRUBY+FFI only] Weak references are now threadsafe. #355
14
+ * Make direct start_element() callback (currently used for
15
+ HTML::SAX::Parser) pass attributes in assoc array, just as
16
+ emulated start_element() callback does. rel. #356
17
+ * HTML::SAX::Parser should call back a block given to parse*() if any, just as XML::SAX::Parser does.
18
+ * Add further encoding detection to HTML parser that libxml2 does not do.
19
+ * Document#remove_namespaces! now handles attributes with namespaces. #396
20
+ * XSLT::Stylesheet#transform no longer segfaults when handed a non-XML::Document. #452
21
+ * XML::Reader no longer segfaults when under GC pressure. #439
22
+
23
+ === 1.4.4 / 2010-11-15
2
24
 
3
25
  * New Features
4
26
 
@@ -1,4 +1,5 @@
1
1
  .autotest
2
+ .gemtest
2
3
  CHANGELOG.ja.rdoc
3
4
  CHANGELOG.rdoc
4
5
  Manifest.txt
@@ -6,7 +7,6 @@ README.ja.rdoc
6
7
  README.rdoc
7
8
  Rakefile
8
9
  bin/nokogiri
9
- deps.rip
10
10
  ext/nokogiri/depend
11
11
  ext/nokogiri/extconf.rb
12
12
  ext/nokogiri/html_document.c
@@ -77,11 +77,10 @@ ext/nokogiri/xslt_stylesheet.c
77
77
  ext/nokogiri/xslt_stylesheet.h
78
78
  lib/nokogiri.rb
79
79
  lib/nokogiri/css.rb
80
- lib/nokogiri/css/generated_parser.rb
81
- lib/nokogiri/css/generated_tokenizer.rb
82
80
  lib/nokogiri/css/node.rb
83
81
  lib/nokogiri/css/parser.rb
84
82
  lib/nokogiri/css/parser.y
83
+ lib/nokogiri/css/parser_extras.rb
85
84
  lib/nokogiri/css/syntax_error.rb
86
85
  lib/nokogiri/css/tokenizer.rb
87
86
  lib/nokogiri/css/tokenizer.rex
@@ -213,6 +212,8 @@ test/files/address_book.rlx
213
212
  test/files/address_book.xml
214
213
  test/files/bar/bar.xsd
215
214
  test/files/dont_hurt_em_why.xml
215
+ test/files/encoding.html
216
+ test/files/encoding.xhtml
216
217
  test/files/exslt.xml
217
218
  test/files/exslt.xslt
218
219
  test/files/foo/foo.xsd
data/Rakefile CHANGED
@@ -7,12 +7,13 @@ require 'hoe'
7
7
  windows = RUBY_PLATFORM =~ /(mswin|mingw)/i
8
8
  java = RUBY_PLATFORM =~ /java/
9
9
 
10
- GENERATED_PARSER = "lib/nokogiri/css/generated_parser.rb"
11
- GENERATED_TOKENIZER = "lib/nokogiri/css/generated_tokenizer.rb"
10
+ GENERATED_PARSER = "lib/nokogiri/css/parser.rb"
11
+ GENERATED_TOKENIZER = "lib/nokogiri/css/tokenizer.rb"
12
12
  CROSS_DIR = File.join(File.dirname(__FILE__), 'tmp', 'cross')
13
13
 
14
14
  # Make sure hoe-debugging is installed
15
15
  Hoe.plugin :debugging
16
+ Hoe.plugin :git
16
17
 
17
18
  HOE = Hoe.spec 'nokogiri' do
18
19
  developer('Aaron Patterson', 'aaronp@rubyforge.org')
@@ -21,18 +22,19 @@ HOE = Hoe.spec 'nokogiri' do
21
22
  self.history_file = ['CHANGELOG', ENV['HLANG'], 'rdoc'].compact.join('.')
22
23
  self.extra_rdoc_files = FileList['*.rdoc','ext/nokogiri/*.c']
23
24
  self.clean_globs = [
25
+ "ext/nokogiri/*.dll",
24
26
  'lib/nokogiri/*.{o,so,bundle,a,log,dll}',
25
27
  'lib/nokogiri/nokogiri.rb',
26
28
  'lib/nokogiri/1.{8,9}',
27
29
  GENERATED_PARSER,
28
30
  GENERATED_TOKENIZER,
29
- 'cross',
31
+ CROSS_DIR
30
32
  ]
31
33
 
32
34
  %w{ racc rexical rake-compiler }.each do |dep|
33
- self.extra_dev_deps << [dep, '>= 0']
35
+ extra_dev_deps << [dep, '>= 0']
34
36
  end
35
- self.extra_dev_deps << ["minitest", ">= 1.6.0"]
37
+ extra_dev_deps << ["minitest", ">= 1.6.0"]
36
38
 
37
39
  self.spec_extras = { :extensions => ["ext/nokogiri/extconf.rb"] }
38
40
 
@@ -65,8 +67,7 @@ unless java
65
67
 
66
68
  ext.config_options << ENV['EXTOPTS']
67
69
  ext.cross_compile = true
68
- ext.cross_platform = 'i386-mingw32'
69
- # ext.cross_platform = 'i386-mswin32'
70
+ ext.cross_platform = ["x86-mingw32", "x86-mswin32-60"]
70
71
  ext.cross_config_options <<
71
72
  "--with-xml2-include=#{File.join(CROSS_DIR, 'include', 'libxml2')}"
72
73
  ext.cross_config_options <<
@@ -89,13 +90,14 @@ namespace :gem do
89
90
 
90
91
  desc "Build a gem targetted for JRuby"
91
92
  task :jruby => ['gem:jruby:spec'] do
93
+ raise "ERROR: please run this task under jruby" unless java
92
94
  system "gem build nokogiri.gemspec"
93
95
  FileUtils.mkdir_p "pkg"
94
96
  FileUtils.mv Dir.glob("nokogiri*-java.gem"), "pkg"
95
97
  end
96
98
 
97
99
  namespace :jruby do
98
- task :spec => [GENERATED_PARSER, GENERATED_TOKENIZER] do
100
+ task :spec => [GENERATED_PARSER, GENERATED_TOKENIZER, :"gem:jruby:dlls"] do
99
101
  File.open("#{HOE.name}.gemspec", 'w') do |f|
100
102
  HOE.spec.platform = 'java'
101
103
  HOE.spec.files << GENERATED_PARSER
@@ -106,27 +108,45 @@ namespace :gem do
106
108
  f.write(HOE.spec.to_ruby)
107
109
  end
108
110
  end
111
+
112
+ task :dlls do
113
+ def run cmd
114
+ puts(cmd) || system(cmd) || raise("command failed")
115
+ end
116
+
117
+ dlldir = "tmp/dlls"
118
+ FileUtils.mkdir_p dlldir
119
+ Dir.chdir dlldir do
120
+ unless File.exists? "nokogiri-1.4.3.1-java.gem"
121
+ run "wget http://rubygems.org/downloads/nokogiri-1.4.3.1-java.gem"
122
+ end
123
+ unless File.exists? "data.tar.gz"
124
+ run "tar -xf nokogiri-1.4.3.1-java.gem"
125
+ end
126
+ FileUtils.rm_rf "unpack"
127
+ FileUtils.mkdir "unpack"
128
+ Dir.chdir "unpack" do
129
+ run "tar -zxf ../data.tar.gz"
130
+ end
131
+ end
132
+
133
+ Dir["#{dlldir}/unpack/ext/nokogiri/*.dll"].each do |file|
134
+ cp file, "ext/nokogiri"
135
+ end
136
+ end
109
137
  end
110
138
 
111
139
  task :spec => ['gem:dev:spec']
112
140
  end
113
141
 
114
142
  file GENERATED_PARSER => "lib/nokogiri/css/parser.y" do |t|
115
- begin
116
- racc = Config::CONFIG['target_os'] =~ /mswin32/ ? '' : `which racc`.strip
117
- racc = "#{::Config::CONFIG['bindir']}/racc" if racc.empty?
118
- sh "#{racc} -l -o #{t.name} #{t.prerequisites.first}"
119
- rescue
120
- abort "need racc, sudo gem install racc"
121
- end
143
+ racc = Config::CONFIG['target_os'] =~ /mswin32/ ? '' : `which racc`.strip
144
+ racc = "#{::Config::CONFIG['bindir']}/racc" if racc.empty?
145
+ sh "#{racc} -l -o #{t.name} #{t.prerequisites.first}"
122
146
  end
123
147
 
124
148
  file GENERATED_TOKENIZER => "lib/nokogiri/css/tokenizer.rex" do |t|
125
- begin
126
- sh "rex --independent -o #{t.name} #{t.prerequisites.first}"
127
- rescue
128
- abort "need rexical, sudo gem install rexical"
129
- end
149
+ sh "rex --independent -o #{t.name} #{t.prerequisites.first}"
130
150
  end
131
151
 
132
152
  require 'tasks/test'
@@ -153,6 +173,7 @@ unless windows || java || ENV['NOKOGIRI_FFI']
153
173
  end
154
174
 
155
175
  Rake::Task[:test].prerequisites << :compile
176
+ Rake::Task[:test].prerequisites << :check_extra_deps
156
177
  if Hoe.plugins.include?(:debugging)
157
178
  ['valgrind', 'valgrind:mem', 'valgrind:mem0'].each do |task_name|
158
179
  Rake::Task["test:#{task_name}"].prerequisites << :compile
@@ -167,21 +188,4 @@ else
167
188
  end
168
189
  end
169
190
 
170
- namespace :install do
171
- desc "Install rex and racc for development"
172
- task :deps => %w(rexical racc)
173
-
174
- task :racc do |t|
175
- sh "sudo gem install racc"
176
- end
177
-
178
- task :rexical do
179
- sh "sudo gem install rexical"
180
- end
181
- end
182
-
183
- namespace :rip do
184
- task :install => [GENERATED_TOKENIZER, GENERATED_PARSER]
185
- end
186
-
187
191
  # vim: syntax=Ruby
@@ -41,6 +41,7 @@ static void dealloc(xmlDocPtr doc)
41
41
  static void recursively_remove_namespaces_from_node(xmlNodePtr node)
42
42
  {
43
43
  xmlNodePtr child ;
44
+ xmlAttrPtr property ;
44
45
 
45
46
  xmlSetNs(node, NULL);
46
47
 
@@ -51,6 +52,14 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
51
52
  xmlFreeNsList(node->nsDef);
52
53
  node->nsDef = NULL;
53
54
  }
55
+
56
+ if (node->properties != NULL) {
57
+ property = node->properties ;
58
+ while (property != NULL) {
59
+ if (property->ns) property->ns = NULL ;
60
+ property = property->next ;
61
+ }
62
+ }
54
63
  }
55
64
 
56
65
  /*
@@ -2,22 +2,47 @@
2
2
 
3
3
  static ID id_read, id_write;
4
4
 
5
+ VALUE read_check(VALUE *args) {
6
+ return rb_funcall(args[0], id_read, 1, args[1]);
7
+ }
8
+
9
+ VALUE read_failed(void) {
10
+ return Qnil;
11
+ }
12
+
5
13
  int io_read_callback(void * ctx, char * buffer, int len) {
6
- VALUE io = (VALUE)ctx;
7
- VALUE string = rb_funcall(io, id_read, 1, INT2NUM(len));
14
+ VALUE string, args[2];
15
+ size_t str_len, safe_len;
16
+
17
+ args[0] = (VALUE)ctx;
18
+ args[1] = INT2NUM(len);
19
+
20
+ string = rb_rescue(read_check, (VALUE)args, read_failed, 0);
8
21
 
9
22
  if(NIL_P(string)) return 0;
10
23
 
11
- memcpy(buffer, StringValuePtr(string), (size_t)RSTRING_LEN(string));
24
+ str_len = (size_t)RSTRING_LEN(string);
25
+ safe_len = str_len > (size_t)len ? (size_t)len : str_len;
26
+ memcpy(buffer, StringValuePtr(string), safe_len);
12
27
 
13
- return (int)RSTRING_LEN(string);
28
+ return safe_len;
29
+ }
30
+
31
+ VALUE write_check(VALUE *args) {
32
+ return rb_funcall(args[0], id_write, 1, args[1]);
33
+ }
34
+
35
+ VALUE write_failed(void) {
36
+ return Qnil;
14
37
  }
15
38
 
16
39
  int io_write_callback(void * ctx, char * buffer, int len) {
17
- VALUE io = (VALUE)ctx;
18
- VALUE string = rb_str_new(buffer, (long)len);
40
+ VALUE args[2];
41
+
42
+ args[0] = (VALUE)ctx;
43
+ args[1] = rb_str_new(buffer, (long)len);
19
44
 
20
- rb_funcall(io, id_write, 1, string);
45
+ rb_rescue(write_check, (VALUE)args, write_failed, 0);
21
46
  return len;
22
47
  }
23
48
 
@@ -14,10 +14,7 @@ static void debug_node_dealloc(xmlNodePtr x)
14
14
 
15
15
  static void mark(xmlNodePtr node)
16
16
  {
17
- /* it's OK if the document isn't fully realized (as in XML::Reader). */
18
- /* see http://github.com/tenderlove/nokogiri/issues/closed/#issue/95 */
19
- if (DOC_RUBY_OBJECT_TEST(node->doc) && DOC_RUBY_OBJECT(node->doc))
20
- rb_gc_mark(DOC_RUBY_OBJECT(node->doc));
17
+ rb_gc_mark(DOC_RUBY_OBJECT(node->doc));
21
18
  }
22
19
 
23
20
  /* :nodoc: */
@@ -1241,6 +1238,8 @@ VALUE Nokogiri_wrap_xml_node(VALUE klass, xmlNodePtr node)
1241
1238
  VALUE document = Qnil ;
1242
1239
  VALUE node_cache = Qnil ;
1243
1240
  VALUE rb_node = Qnil ;
1241
+ int node_has_a_document = 0 ;
1242
+ void (*mark_method)(xmlNodePtr) = NULL ;
1244
1243
 
1245
1244
  assert(node);
1246
1245
 
@@ -1249,11 +1248,9 @@ VALUE Nokogiri_wrap_xml_node(VALUE klass, xmlNodePtr node)
1249
1248
 
1250
1249
  if(NULL != node->_private) return (VALUE)node->_private;
1251
1250
 
1252
- if(RTEST(klass))
1253
- rb_node = Data_Wrap_Struct(klass, mark, debug_node_dealloc, node) ;
1254
-
1255
- else switch(node->type)
1256
- {
1251
+ if(!RTEST(klass)) {
1252
+ switch(node->type)
1253
+ {
1257
1254
  case XML_ELEMENT_NODE:
1258
1255
  klass = cNokogiriXmlElement;
1259
1256
  break;
@@ -1292,15 +1289,19 @@ VALUE Nokogiri_wrap_xml_node(VALUE klass, xmlNodePtr node)
1292
1289
  break;
1293
1290
  default:
1294
1291
  klass = cNokogiriXmlNode;
1292
+ }
1295
1293
  }
1296
1294
 
1297
- rb_node = Data_Wrap_Struct(klass, mark, debug_node_dealloc, node) ;
1295
+ /* It's OK if the node doesn't have a fully-realized document (as in XML::Reader). */
1296
+ /* see https://github.com/tenderlove/nokogiri/issues/95 */
1297
+ /* and https://github.com/tenderlove/nokogiri/issues/439 */
1298
+ node_has_a_document = (DOC_RUBY_OBJECT_TEST(node->doc) && DOC_RUBY_OBJECT(node->doc)) ? 1 : 0 ;
1299
+ mark_method = node_has_a_document ? mark : NULL ;
1298
1300
 
1301
+ rb_node = Data_Wrap_Struct(klass, mark_method, debug_node_dealloc, node) ;
1299
1302
  node->_private = (void *)rb_node;
1300
1303
 
1301
- if (DOC_RUBY_OBJECT_TEST(node->doc) && DOC_RUBY_OBJECT(node->doc)) {
1302
- /* it's OK if the document isn't fully realized (as in XML::Reader). */
1303
- /* see http://github.com/tenderlove/nokogiri/issues/closed/#issue/95 */
1304
+ if (node_has_a_document) {
1304
1305
  document = DOC_RUBY_OBJECT(node->doc);
1305
1306
  node_cache = DOC_NODE_CACHE(node->doc);
1306
1307
  rb_ary_push(node_cache, rb_node);
@@ -62,8 +62,10 @@ static void start_element(void * ctx, const xmlChar *name, const xmlChar **atts)
62
62
  int i = 0;
63
63
  if(atts) {
64
64
  while((attr = atts[i]) != NULL) {
65
- rb_ary_push(attributes, NOKOGIRI_STR_NEW2(attr));
66
- i++;
65
+ const xmlChar * val = atts[i+1];
66
+ VALUE value = val != NULL ? NOKOGIRI_STR_NEW2(val) : Qnil;
67
+ rb_ary_push(attributes, rb_ary_new3(2, NOKOGIRI_STR_NEW2(attr), value));
68
+ i+=2;
67
69
  }
68
70
  }
69
71
 
@@ -100,6 +100,8 @@ static VALUE transform(int argc, VALUE* argv, VALUE self)
100
100
 
101
101
  rb_scan_args(argc, argv, "11", &xmldoc, &paramobj);
102
102
  if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; }
103
+ if (!rb_obj_is_kind_of(xmldoc, cNokogiriXmlDocument))
104
+ rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document");
103
105
 
104
106
  /* handle hashes as arguments. */
105
107
  if(T_HASH == TYPE(paramobj)) {
@@ -139,6 +141,7 @@ static void method_caller(xmlXPathParserContextPtr ctxt, int nargs)
139
141
  xmlXPathObjectPtr xpath;
140
142
  VALUE obj;
141
143
  VALUE *args;
144
+ VALUE result;
142
145
 
143
146
  transform = xsltXPathGetTransformContext(ctxt);
144
147
 
@@ -172,7 +175,7 @@ static void method_caller(xmlXPathParserContextPtr ctxt, int nargs)
172
175
  }
173
176
  args[i] = thing;
174
177
  }
175
- VALUE result = rb_funcall3(obj, rb_intern((const char *)function), (int)count, args);
178
+ result = rb_funcall3(obj, rb_intern((const char *)function), (int)count, args);
176
179
  switch(TYPE(result)) {
177
180
  case T_FLOAT:
178
181
  case T_BIGNUM:
@@ -239,9 +242,12 @@ static VALUE registr(VALUE self, VALUE uri, VALUE obj)
239
242
  VALUE cNokogiriXsltStylesheet ;
240
243
  void init_xslt_stylesheet()
241
244
  {
242
- VALUE nokogiri = rb_define_module("Nokogiri");
245
+ VALUE nokogiri;
246
+ VALUE klass;
247
+
248
+ nokogiri = rb_define_module("Nokogiri");
243
249
  xslt = rb_define_module_under(nokogiri, "XSLT");
244
- VALUE klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
250
+ klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
245
251
 
246
252
  rb_iv_set(xslt, "@modules", rb_hash_new());
247
253
 
@@ -1,9 +1,12 @@
1
1
  require 'nokogiri/css/node'
2
2
  require 'nokogiri/css/xpath_visitor'
3
- require 'nokogiri/css/generated_parser'
4
- require 'nokogiri/css/generated_tokenizer'
5
- require 'nokogiri/css/tokenizer'
3
+
4
+ x = $-w
5
+ $-w = false
6
6
  require 'nokogiri/css/parser'
7
+ $-w = x
8
+
9
+ require 'nokogiri/css/tokenizer'
7
10
  require 'nokogiri/css/syntax_error'
8
11
 
9
12
  module Nokogiri
@@ -1,82 +1,677 @@
1
- require 'thread'
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.6
4
+ # from Racc grammer file "".
5
+ #
2
6
 
7
+ require 'racc/parser.rb'
8
+
9
+
10
+ require 'nokogiri/css/parser_extras'
3
11
  module Nokogiri
4
12
  module CSS
5
- class Parser < GeneratedTokenizer
6
- @cache_on = true
7
- @cache = {}
8
- @mutex = Mutex.new
9
-
10
- class << self
11
- # Turn on CSS parse caching
12
- attr_accessor :cache_on
13
- alias :cache_on? :cache_on
14
- alias :set_cache :cache_on=
15
-
16
- # Get the css selector in +string+ from the cache
17
- def [] string
18
- return unless @cache_on
19
- @mutex.synchronize { @cache[string] }
20
- end
13
+ class Parser < Racc::Parser
14
+ ##### State transition tables begin ###
15
+
16
+ racc_action_table = [
17
+ 4, 56, 27, 22, 12, 24, 57, 4, 65, 1,
18
+ 41, 12, 75, 57, 4, 23, 1, 82, 12, 19,
19
+ 93, 92, 5, 1, 9, 10, 19, 13, 16, 5,
20
+ 12, 9, 10, 19, 13, 16, 5, 5, 9, 10,
21
+ 4, 13, 16, 16, 12, 41, 64, 4, 5, 1,
22
+ 60, 10, 12, 59, 16, 59, 28, 1, 29, 19,
23
+ 12, 12, 5, 62, 9, 10, 19, 13, 16, 12,
24
+ 5, 9, 83, 10, 12, 13, 16, 84, 5, 5,
25
+ 63, 10, 10, 12, 16, 16, 58, 5, 61, 62,
26
+ 10, 4, 5, 16, 87, 10, 27, 53, 16, 54,
27
+ 49, 5, 88, 41, 10, 68, 70, 16, 27, 53,
28
+ 19, 54, 44, 91, 21, 9, 69, 71, 72, 94,
29
+ 74, 68, 70, -23, 66, 33, 35, 37, 27, 53,
30
+ 96, 54, 69, 71, 72, 32, 74, 34, 36, 97,
31
+ 66, 27, 53, nil, 54 ]
32
+
33
+ racc_action_check = [
34
+ 0, 20, 4, 4, 0, 4, 43, 9, 27, 0,
35
+ 39, 9, 29, 20, 31, 4, 9, 43, 31, 0,
36
+ 73, 73, 0, 31, 0, 0, 9, 0, 0, 9,
37
+ 7, 9, 9, 31, 9, 9, 31, 14, 31, 31,
38
+ 57, 31, 31, 14, 57, 7, 26, 5, 7, 57,
39
+ 22, 7, 41, 53, 7, 22, 5, 41, 5, 57,
40
+ 8, 79, 57, 54, 57, 57, 5, 57, 57, 18,
41
+ 41, 5, 55, 41, 17, 41, 41, 56, 8, 79,
42
+ 25, 8, 79, 15, 8, 79, 21, 18, 24, 24,
43
+ 18, 16, 17, 18, 60, 17, 59, 59, 17, 59,
44
+ 16, 15, 61, 11, 15, 30, 30, 15, 19, 19,
45
+ 16, 19, 10, 67, 2, 16, 30, 30, 30, 76,
46
+ 30, 28, 28, 1, 30, 6, 6, 6, 62, 62,
47
+ 81, 62, 28, 28, 28, 6, 28, 6, 6, 88,
48
+ 28, 65, 65, nil, 65 ]
49
+
50
+ racc_action_pointer = [
51
+ -2, 95, 86, nil, -8, 45, 118, 24, 54, 5,
52
+ 101, 82, nil, nil, 13, 77, 89, 68, 63, 98,
53
+ 1, 75, 43, nil, 77, 57, 23, -4, 118, -13,
54
+ 102, 12, nil, nil, nil, nil, nil, nil, nil, -11,
55
+ nil, 46, nil, -6, nil, nil, nil, nil, nil, nil,
56
+ nil, nil, nil, 41, 51, 49, 77, 38, nil, 86,
57
+ 81, 95, 118, nil, nil, 131, nil, 88, nil, nil,
58
+ nil, nil, nil, 10, nil, nil, 94, nil, nil, 55,
59
+ nil, 107, nil, nil, nil, nil, nil, nil, 126, nil,
60
+ nil, nil, nil, nil, nil, nil, nil, nil ]
61
+
62
+ racc_action_default = [
63
+ -24, -21, -69, -2, -69, -69, -18, -45, -50, -24,
64
+ -69, -16, -54, -22, -12, -53, -69, -52, -51, -69,
65
+ -69, -69, -38, -28, -36, -69, -69, -37, -57, -69,
66
+ -57, -24, -5, -3, -8, -4, -7, -6, -9, -44,
67
+ -11, -24, -46, -69, -19, -15, -13, -14, -49, -43,
68
+ -42, -48, -47, -38, -36, -69, -69, -24, -20, -69,
69
+ -69, -41, -69, -29, -30, -69, -58, -69, -63, -59,
70
+ -64, -60, -61, -69, -62, -27, -69, -17, -10, -66,
71
+ -68, -69, -32, -31, 98, -1, -35, -40, -69, -33,
72
+ -34, -25, -55, -56, -26, -67, -65, -39 ]
73
+
74
+ racc_goto_table = [
75
+ 39, 42, 25, 40, 77, 30, 20, 45, 48, 79,
76
+ 51, 52, 67, 46, 76, 43, 50, 55, 47, 38,
77
+ 31, 26, 81, nil, nil, nil, nil, nil, nil, nil,
78
+ 85, nil, nil, nil, 80, 78, nil, nil, nil, nil,
79
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
80
+ nil, nil, nil, nil, nil, nil, nil, 86, nil, nil,
81
+ 89, nil, nil, 90, nil, nil, nil, nil, nil, nil,
82
+ nil, nil, 95 ]
83
+
84
+ racc_goto_check = [
85
+ 7, 7, 15, 8, 2, 9, 1, 8, 7, 5,
86
+ 7, 7, 14, 10, 14, 1, 9, 15, 11, 6,
87
+ 3, 16, 19, nil, nil, nil, nil, nil, nil, nil,
88
+ 2, nil, nil, nil, 7, 8, nil, nil, nil, nil,
89
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
90
+ nil, nil, nil, nil, nil, nil, nil, 15, nil, nil,
91
+ 15, nil, nil, 15, nil, nil, nil, nil, nil, nil,
92
+ nil, nil, 7 ]
93
+
94
+ racc_goto_pointer = [
95
+ nil, 6, -27, 14, nil, -32, 12, -7, -4, 0,
96
+ -1, 4, nil, nil, -16, -2, 17, nil, nil, -19 ]
97
+
98
+ racc_goto_default = [
99
+ nil, nil, 3, nil, 6, 7, nil, 11, nil, 14,
100
+ 15, 17, 18, 2, nil, nil, nil, 8, 73, nil ]
101
+
102
+ racc_reduce_table = [
103
+ 0, 0, :racc_error,
104
+ 3, 32, :_reduce_1,
105
+ 1, 32, :_reduce_2,
106
+ 1, 34, :_reduce_3,
107
+ 1, 34, :_reduce_4,
108
+ 1, 34, :_reduce_5,
109
+ 1, 34, :_reduce_6,
110
+ 1, 34, :_reduce_7,
111
+ 1, 34, :_reduce_8,
112
+ 2, 35, :_reduce_9,
113
+ 3, 35, :_reduce_10,
114
+ 2, 35, :_reduce_11,
115
+ 1, 35, :_reduce_none,
116
+ 2, 35, :_reduce_13,
117
+ 2, 35, :_reduce_14,
118
+ 2, 35, :_reduce_15,
119
+ 1, 35, :_reduce_16,
120
+ 3, 33, :_reduce_17,
121
+ 1, 33, :_reduce_none,
122
+ 2, 43, :_reduce_19,
123
+ 3, 36, :_reduce_20,
124
+ 1, 36, :_reduce_21,
125
+ 1, 36, :_reduce_22,
126
+ 1, 44, :_reduce_23,
127
+ 0, 44, :_reduce_none,
128
+ 4, 42, :_reduce_25,
129
+ 4, 42, :_reduce_26,
130
+ 3, 42, :_reduce_27,
131
+ 2, 40, :_reduce_28,
132
+ 3, 40, :_reduce_29,
133
+ 3, 40, :_reduce_30,
134
+ 3, 40, :_reduce_31,
135
+ 3, 40, :_reduce_32,
136
+ 3, 46, :_reduce_33,
137
+ 3, 46, :_reduce_34,
138
+ 3, 46, :_reduce_35,
139
+ 1, 46, :_reduce_none,
140
+ 1, 46, :_reduce_none,
141
+ 1, 46, :_reduce_38,
142
+ 4, 47, :_reduce_39,
143
+ 3, 47, :_reduce_40,
144
+ 2, 47, :_reduce_41,
145
+ 2, 41, :_reduce_42,
146
+ 2, 41, :_reduce_43,
147
+ 1, 37, :_reduce_none,
148
+ 0, 37, :_reduce_none,
149
+ 2, 38, :_reduce_46,
150
+ 2, 38, :_reduce_47,
151
+ 2, 38, :_reduce_48,
152
+ 2, 38, :_reduce_49,
153
+ 1, 38, :_reduce_none,
154
+ 1, 38, :_reduce_none,
155
+ 1, 38, :_reduce_none,
156
+ 1, 38, :_reduce_none,
157
+ 1, 48, :_reduce_54,
158
+ 2, 45, :_reduce_55,
159
+ 2, 45, :_reduce_56,
160
+ 0, 45, :_reduce_none,
161
+ 1, 49, :_reduce_58,
162
+ 1, 49, :_reduce_59,
163
+ 1, 49, :_reduce_60,
164
+ 1, 49, :_reduce_61,
165
+ 1, 49, :_reduce_62,
166
+ 1, 49, :_reduce_63,
167
+ 1, 49, :_reduce_64,
168
+ 3, 39, :_reduce_65,
169
+ 1, 50, :_reduce_none,
170
+ 2, 50, :_reduce_none,
171
+ 1, 50, :_reduce_none ]
172
+
173
+ racc_reduce_n = 69
174
+
175
+ racc_shift_n = 98
176
+
177
+ racc_token_table = {
178
+ false => 0,
179
+ :error => 1,
180
+ :FUNCTION => 2,
181
+ :INCLUDES => 3,
182
+ :DASHMATCH => 4,
183
+ :LBRACE => 5,
184
+ :HASH => 6,
185
+ :PLUS => 7,
186
+ :GREATER => 8,
187
+ :S => 9,
188
+ :STRING => 10,
189
+ :IDENT => 11,
190
+ :COMMA => 12,
191
+ :NUMBER => 13,
192
+ :PREFIXMATCH => 14,
193
+ :SUFFIXMATCH => 15,
194
+ :SUBSTRINGMATCH => 16,
195
+ :TILDE => 17,
196
+ :NOT_EQUAL => 18,
197
+ :SLASH => 19,
198
+ :DOUBLESLASH => 20,
199
+ :NOT => 21,
200
+ :EQUAL => 22,
201
+ :RPAREN => 23,
202
+ :LSQUARE => 24,
203
+ :RSQUARE => 25,
204
+ :HAS => 26,
205
+ "." => 27,
206
+ "|" => 28,
207
+ "*" => 29,
208
+ ":" => 30 }
209
+
210
+ racc_nt_base = 31
211
+
212
+ racc_use_result_var = true
213
+
214
+ Racc_arg = [
215
+ racc_action_table,
216
+ racc_action_check,
217
+ racc_action_default,
218
+ racc_action_pointer,
219
+ racc_goto_table,
220
+ racc_goto_check,
221
+ racc_goto_default,
222
+ racc_goto_pointer,
223
+ racc_nt_base,
224
+ racc_reduce_table,
225
+ racc_token_table,
226
+ racc_shift_n,
227
+ racc_reduce_n,
228
+ racc_use_result_var ]
229
+
230
+ Racc_token_to_s_table = [
231
+ "$end",
232
+ "error",
233
+ "FUNCTION",
234
+ "INCLUDES",
235
+ "DASHMATCH",
236
+ "LBRACE",
237
+ "HASH",
238
+ "PLUS",
239
+ "GREATER",
240
+ "S",
241
+ "STRING",
242
+ "IDENT",
243
+ "COMMA",
244
+ "NUMBER",
245
+ "PREFIXMATCH",
246
+ "SUFFIXMATCH",
247
+ "SUBSTRINGMATCH",
248
+ "TILDE",
249
+ "NOT_EQUAL",
250
+ "SLASH",
251
+ "DOUBLESLASH",
252
+ "NOT",
253
+ "EQUAL",
254
+ "RPAREN",
255
+ "LSQUARE",
256
+ "RSQUARE",
257
+ "HAS",
258
+ "\".\"",
259
+ "\"|\"",
260
+ "\"*\"",
261
+ "\":\"",
262
+ "$start",
263
+ "selector",
264
+ "simple_selector_1toN",
265
+ "combinator",
266
+ "simple_selector",
267
+ "element_name",
268
+ "hcap_0toN",
269
+ "hcap_1toN",
270
+ "negation",
271
+ "function",
272
+ "pseudo",
273
+ "attrib",
274
+ "class",
275
+ "namespace",
276
+ "attrib_val_0or1",
277
+ "expr",
278
+ "an_plus_b",
279
+ "attribute_id",
280
+ "eql_incl_dash",
281
+ "negation_arg" ]
282
+
283
+ Racc_debug_parser = false
284
+
285
+ ##### State transition tables end #####
286
+
287
+ # reduce 0 omitted
288
+
289
+ def _reduce_1(val, _values, result)
290
+ result = [val.first, val.last].flatten
291
+
292
+ result
293
+ end
294
+
295
+ def _reduce_2(val, _values, result)
296
+ result = val.flatten
297
+ result
298
+ end
299
+
300
+ def _reduce_3(val, _values, result)
301
+ result = :DIRECT_ADJACENT_SELECTOR
302
+ result
303
+ end
304
+
305
+ def _reduce_4(val, _values, result)
306
+ result = :CHILD_SELECTOR
307
+ result
308
+ end
309
+
310
+ def _reduce_5(val, _values, result)
311
+ result = :PRECEDING_SELECTOR
312
+ result
313
+ end
314
+
315
+ def _reduce_6(val, _values, result)
316
+ result = :DESCENDANT_SELECTOR
317
+ result
318
+ end
319
+
320
+ def _reduce_7(val, _values, result)
321
+ result = :DESCENDANT_SELECTOR
322
+ result
323
+ end
324
+
325
+ def _reduce_8(val, _values, result)
326
+ result = :CHILD_SELECTOR
327
+ result
328
+ end
329
+
330
+ def _reduce_9(val, _values, result)
331
+ result = if val[1].nil?
332
+ val.first
333
+ else
334
+ Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]])
335
+ end
336
+
337
+ result
338
+ end
339
+
340
+ def _reduce_10(val, _values, result)
341
+ result = Node.new(:CONDITIONAL_SELECTOR,
342
+ [
343
+ val.first,
344
+ Node.new(:COMBINATOR, [val[1], val.last])
345
+ ]
346
+ )
347
+
348
+ result
349
+ end
350
+
351
+ def _reduce_11(val, _values, result)
352
+ result = Node.new(:CONDITIONAL_SELECTOR, val)
353
+
354
+ result
355
+ end
356
+
357
+ # reduce 12 omitted
358
+
359
+ def _reduce_13(val, _values, result)
360
+ result = Node.new(:CONDITIONAL_SELECTOR, val)
361
+
362
+ result
363
+ end
364
+
365
+ def _reduce_14(val, _values, result)
366
+ result = Node.new(:CONDITIONAL_SELECTOR, val)
367
+
368
+ result
369
+ end
370
+
371
+ def _reduce_15(val, _values, result)
372
+ result = Node.new(:CONDITIONAL_SELECTOR,
373
+ [
374
+ Node.new(:ELEMENT_NAME, ['*']),
375
+ Node.new(:COMBINATOR, val)
376
+ ]
377
+ )
378
+
379
+ result
380
+ end
381
+
382
+ def _reduce_16(val, _values, result)
383
+ result = Node.new(:CONDITIONAL_SELECTOR,
384
+ [Node.new(:ELEMENT_NAME, ['*']), val.first]
385
+ )
386
+
387
+ result
388
+ end
389
+
390
+ def _reduce_17(val, _values, result)
391
+ result = Node.new(val[1], [val.first, val.last])
392
+
393
+ result
394
+ end
395
+
396
+ # reduce 18 omitted
397
+
398
+ def _reduce_19(val, _values, result)
399
+ result = Node.new(:CLASS_CONDITION, [val[1]])
400
+ result
401
+ end
402
+
403
+ def _reduce_20(val, _values, result)
404
+ result = Node.new(:ELEMENT_NAME,
405
+ [[val.first, val.last].compact.join(':')]
406
+ )
407
+
408
+ result
409
+ end
410
+
411
+ def _reduce_21(val, _values, result)
412
+ name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first
413
+ result = Node.new(:ELEMENT_NAME, [name])
414
+
415
+ result
416
+ end
417
+
418
+ def _reduce_22(val, _values, result)
419
+ result = Node.new(:ELEMENT_NAME, val)
420
+ result
421
+ end
422
+
423
+ def _reduce_23(val, _values, result)
424
+ result = val[0]
425
+ result
426
+ end
427
+
428
+ # reduce 24 omitted
429
+
430
+ def _reduce_25(val, _values, result)
431
+ result = Node.new(:ATTRIBUTE_CONDITION,
432
+ [Node.new(:ELEMENT_NAME, [val[1]])] + (val[2] || [])
433
+ )
434
+
435
+ result
436
+ end
437
+
438
+ def _reduce_26(val, _values, result)
439
+ result = Node.new(:ATTRIBUTE_CONDITION,
440
+ [val[1]] + (val[2] || [])
441
+ )
442
+
443
+ result
444
+ end
21
445
 
22
- # Set the css selector in +string+ in the cache to +value+
23
- def []= string, value
24
- return value unless @cache_on
25
- @mutex.synchronize { @cache[string] = value }
446
+ def _reduce_27(val, _values, result)
447
+ # Non standard, but hpricot supports it.
448
+ result = Node.new(:PSEUDO_CLASS,
449
+ [Node.new(:FUNCTION, ['nth-child(', val[1]])]
450
+ )
451
+
452
+ result
453
+ end
454
+
455
+ def _reduce_28(val, _values, result)
456
+ result = Node.new(:FUNCTION, [val.first.strip])
457
+
458
+ result
459
+ end
460
+
461
+ def _reduce_29(val, _values, result)
462
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
463
+
464
+ result
465
+ end
466
+
467
+ def _reduce_30(val, _values, result)
468
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
469
+
470
+ result
471
+ end
472
+
473
+ def _reduce_31(val, _values, result)
474
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
475
+
476
+ result
477
+ end
478
+
479
+ def _reduce_32(val, _values, result)
480
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
481
+
482
+ result
483
+ end
484
+
485
+ def _reduce_33(val, _values, result)
486
+ result = [val.first, val.last]
487
+ result
488
+ end
489
+
490
+ def _reduce_34(val, _values, result)
491
+ result = [val.first, val.last]
492
+ result
493
+ end
494
+
495
+ def _reduce_35(val, _values, result)
496
+ result = [val.first, val.last]
497
+ result
498
+ end
499
+
500
+ # reduce 36 omitted
501
+
502
+ # reduce 37 omitted
503
+
504
+ def _reduce_38(val, _values, result)
505
+ if val[0] == 'even'
506
+ val = ["2","n","+","0"]
507
+ result = Node.new(:AN_PLUS_B, val)
508
+ elsif val[0] == 'odd'
509
+ val = ["2","n","+","1"]
510
+ result = Node.new(:AN_PLUS_B, val)
511
+ else
512
+ # This is not CSS standard. It allows us to support this:
513
+ # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
514
+ # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
515
+ # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)'))
516
+ result = val
26
517
  end
518
+
519
+ result
520
+ end
27
521
 
28
- # Clear the cache
29
- def clear_cache
30
- @mutex.synchronize { @cache = {} }
522
+ def _reduce_39(val, _values, result)
523
+ if val[1] == 'n'
524
+ result = Node.new(:AN_PLUS_B, val)
525
+ else
526
+ raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
31
527
  end
528
+
529
+ result
530
+ end
32
531
 
33
- # Execute +block+ without cache
34
- def without_cache &block
35
- tmp = @cache_on
36
- @cache_on = false
37
- block.call
38
- @cache_on = tmp
532
+ def _reduce_40(val, _values, result)
533
+ # n+3, -n+3
534
+ if val[0] == 'n'
535
+ val.unshift("1")
536
+ result = Node.new(:AN_PLUS_B, val)
537
+ elsif val[0] == '-n'
538
+ val[0] = 'n'
539
+ val.unshift("-1")
540
+ result = Node.new(:AN_PLUS_B, val)
541
+ else
542
+ raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
39
543
  end
544
+
545
+ result
546
+ end
40
547
 
41
- ###
42
- # Parse this CSS selector in +selector+. Returns an AST.
43
- def parse selector
44
- @warned ||= false
45
- unless @warned
46
- $stderr.puts('Nokogiri::CSS::Parser.parse is deprecated, call Nokogiri::CSS.parse(), this will be removed August 1st or version 1.4.0 (whichever is first)')
47
- @warned = true
48
- end
49
- new.parse selector
548
+ def _reduce_41(val, _values, result)
549
+ if val[1] == 'n'
550
+ val << "+"
551
+ val << "0"
552
+ result = Node.new(:AN_PLUS_B, val)
553
+ else
554
+ raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
50
555
  end
51
- end
52
-
53
- # Create a new CSS parser with respect to +namespaces+
54
- def initialize namespaces = {}
55
- @namespaces = namespaces
56
- super()
57
- end
58
- alias :parse :scan_str
59
-
60
- # Get the xpath for +string+ using +options+
61
- def xpath_for string, options={}
62
- key = "#{string}#{options[:ns]}#{options[:prefix]}"
63
- v = self.class[key]
64
- return v if v
65
-
66
- args = [
67
- options[:prefix] || '//',
68
- options[:visitor] || XPathVisitor.new
69
- ]
70
- self.class[key] = parse(string).map { |ast|
71
- ast.to_xpath(*args)
72
- }
73
- end
74
-
75
- # On CSS parser error, raise an exception
76
- def on_error error_token_id, error_value, value_stack
77
- after = value_stack.compact.last
78
- raise SyntaxError.new("unexpected '#{error_value}' after '#{after}'")
79
- end
80
- end
81
- end
556
+
557
+ result
558
+ end
559
+
560
+ def _reduce_42(val, _values, result)
561
+ result = Node.new(:PSEUDO_CLASS, [val[1]])
562
+
563
+ result
564
+ end
565
+
566
+ def _reduce_43(val, _values, result)
567
+ result = Node.new(:PSEUDO_CLASS, [val[1]])
568
+ result
569
+ end
570
+
571
+ # reduce 44 omitted
572
+
573
+ # reduce 45 omitted
574
+
575
+ def _reduce_46(val, _values, result)
576
+ result = Node.new(:COMBINATOR, val)
577
+
578
+ result
579
+ end
580
+
581
+ def _reduce_47(val, _values, result)
582
+ result = Node.new(:COMBINATOR, val)
583
+
584
+ result
585
+ end
586
+
587
+ def _reduce_48(val, _values, result)
588
+ result = Node.new(:COMBINATOR, val)
589
+
590
+ result
82
591
  end
592
+
593
+ def _reduce_49(val, _values, result)
594
+ result = Node.new(:COMBINATOR, val)
595
+
596
+ result
597
+ end
598
+
599
+ # reduce 50 omitted
600
+
601
+ # reduce 51 omitted
602
+
603
+ # reduce 52 omitted
604
+
605
+ # reduce 53 omitted
606
+
607
+ def _reduce_54(val, _values, result)
608
+ result = Node.new(:ID, val)
609
+ result
610
+ end
611
+
612
+ def _reduce_55(val, _values, result)
613
+ result = [val.first, val[1]]
614
+ result
615
+ end
616
+
617
+ def _reduce_56(val, _values, result)
618
+ result = [val.first, val[1]]
619
+ result
620
+ end
621
+
622
+ # reduce 57 omitted
623
+
624
+ def _reduce_58(val, _values, result)
625
+ result = :equal
626
+ result
627
+ end
628
+
629
+ def _reduce_59(val, _values, result)
630
+ result = :prefix_match
631
+ result
632
+ end
633
+
634
+ def _reduce_60(val, _values, result)
635
+ result = :suffix_match
636
+ result
637
+ end
638
+
639
+ def _reduce_61(val, _values, result)
640
+ result = :substring_match
641
+ result
642
+ end
643
+
644
+ def _reduce_62(val, _values, result)
645
+ result = :not_equal
646
+ result
647
+ end
648
+
649
+ def _reduce_63(val, _values, result)
650
+ result = :includes
651
+ result
652
+ end
653
+
654
+ def _reduce_64(val, _values, result)
655
+ result = :dash_match
656
+ result
657
+ end
658
+
659
+ def _reduce_65(val, _values, result)
660
+ result = Node.new(:NOT, [val[1]])
661
+
662
+ result
663
+ end
664
+
665
+ # reduce 66 omitted
666
+
667
+ # reduce 67 omitted
668
+
669
+ # reduce 68 omitted
670
+
671
+ def _reduce_none(val, _values, result)
672
+ val[0]
673
+ end
674
+
675
+ end # class Parser
676
+ end # module CSS
677
+ end # module Nokogiri