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.
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +16 -0
- data/CHANGELOG.rdoc +23 -1
- data/Manifest.txt +4 -3
- data/Rakefile +41 -37
- data/ext/nokogiri/xml_document.c +9 -0
- data/ext/nokogiri/xml_io.c +32 -7
- data/ext/nokogiri/xml_node.c +14 -13
- data/ext/nokogiri/xml_sax_parser.c +4 -2
- data/ext/nokogiri/xslt_stylesheet.c +9 -3
- data/lib/nokogiri/css.rb +6 -3
- data/lib/nokogiri/css/parser.rb +665 -70
- data/lib/nokogiri/css/parser.y +3 -1
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/tokenizer.rb +148 -3
- data/lib/nokogiri/css/tokenizer.rex +1 -1
- data/lib/nokogiri/ffi/structs/xml_attr.rb +2 -1
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +1 -1
- data/lib/nokogiri/ffi/weak_bucket.rb +10 -10
- data/lib/nokogiri/ffi/xml/document.rb +8 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +1 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +9 -1
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +4 -0
- data/lib/nokogiri/html/document.rb +134 -15
- data/lib/nokogiri/html/sax/parser.rb +6 -2
- data/lib/nokogiri/version.rb +6 -1
- data/lib/nokogiri/xml/node.rb +8 -23
- data/lib/nokogiri/xml/node/save_options.rb +10 -0
- data/lib/nokogiri/xml/node_set.rb +1 -1
- data/lib/nokogiri/xml/parse_options.rb +8 -0
- data/lib/nokogiri/xml/reader.rb +6 -6
- data/lib/nokogiri/xml/sax/document.rb +2 -2
- data/lib/nokogiri/xml/schema.rb +7 -1
- data/tasks/cross_compile.rb +8 -15
- data/test/css/test_tokenizer.rb +8 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/helper.rb +2 -0
- data/test/html/sax/test_parser.rb +45 -0
- data/test/html/test_document.rb +55 -0
- data/test/html/test_document_encoding.rb +46 -0
- data/test/html/test_element_description.rb +1 -1
- data/test/test_memory_leak.rb +20 -0
- data/test/test_reader.rb +13 -0
- data/test/test_xslt_transforms.rb +6 -2
- data/test/xml/sax/test_parser.rb +16 -0
- data/test/xml/test_document.rb +3 -1
- data/test/xml/test_node.rb +13 -1
- data/test/xml/test_node_set.rb +10 -0
- data/test/xml/test_schema.rb +5 -0
- metadata +94 -109
- data/deps.rip +0 -5
- data/lib/nokogiri/css/generated_parser.rb +0 -676
- data/lib/nokogiri/css/generated_tokenizer.rb +0 -145
data/.gemtest
ADDED
File without changes
|
data/CHANGELOG.ja.rdoc
CHANGED
@@ -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
|
* 新機能
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,4 +1,26 @@
|
|
1
|
-
=== 1.4.
|
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
|
|
data/Manifest.txt
CHANGED
@@ -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/
|
11
|
-
GENERATED_TOKENIZER = "lib/nokogiri/css/
|
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
|
-
|
31
|
+
CROSS_DIR
|
30
32
|
]
|
31
33
|
|
32
34
|
%w{ racc rexical rake-compiler }.each do |dep|
|
33
|
-
|
35
|
+
extra_dev_deps << [dep, '>= 0']
|
34
36
|
end
|
35
|
-
|
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
|
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
|
-
|
116
|
-
|
117
|
-
|
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
|
-
|
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
|
data/ext/nokogiri/xml_document.c
CHANGED
@@ -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
|
/*
|
data/ext/nokogiri/xml_io.c
CHANGED
@@ -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
|
7
|
-
|
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
|
-
|
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
|
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
|
18
|
-
|
40
|
+
VALUE args[2];
|
41
|
+
|
42
|
+
args[0] = (VALUE)ctx;
|
43
|
+
args[1] = rb_str_new(buffer, (long)len);
|
19
44
|
|
20
|
-
|
45
|
+
rb_rescue(write_check, (VALUE)args, write_failed, 0);
|
21
46
|
return len;
|
22
47
|
}
|
23
48
|
|
data/ext/nokogiri/xml_node.c
CHANGED
@@ -14,10 +14,7 @@ static void debug_node_dealloc(xmlNodePtr x)
|
|
14
14
|
|
15
15
|
static void mark(xmlNodePtr node)
|
16
16
|
{
|
17
|
-
|
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
|
-
|
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
|
-
|
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 (
|
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
|
-
|
66
|
-
|
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, ¶mobj);
|
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
|
-
|
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
|
245
|
+
VALUE nokogiri;
|
246
|
+
VALUE klass;
|
247
|
+
|
248
|
+
nokogiri = rb_define_module("Nokogiri");
|
243
249
|
xslt = rb_define_module_under(nokogiri, "XSLT");
|
244
|
-
|
250
|
+
klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
|
245
251
|
|
246
252
|
rb_iv_set(xslt, "@modules", rb_hash_new());
|
247
253
|
|
data/lib/nokogiri/css.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
require 'nokogiri/css/node'
|
2
2
|
require 'nokogiri/css/xpath_visitor'
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
data/lib/nokogiri/css/parser.rb
CHANGED
@@ -1,82 +1,677 @@
|
|
1
|
-
|
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 <
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|