merb-core 0.9.12 → 0.9.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+ module Nokogiri
2
+ module CSS
3
+ class Tokenizer < GeneratedTokenizer
4
+ def scan(str)
5
+ scan_evaluate(str)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,63 @@
1
+ module Nokogiri
2
+ module CSS
3
+ class GeneratedTokenizer
4
+
5
+ macro
6
+ nl \n|\r\n|\r|\f
7
+ w [\s\r\n\f]*
8
+ nonascii [^\\\\0-\\\\177]
9
+ num -?([0-9]+|[0-9]*\.[0-9]+)
10
+ unicode \\\\\\\\\[0-9a-f]{1,6}(\r\n|[\s\n\r\t\f])?
11
+
12
+ escape {unicode}|\\\\\\\[^\n\r\f0-9a-f]
13
+ nmchar [_a-z0-9-]|{nonascii}|{escape}
14
+ nmstart [_a-z]|{nonascii}|{escape}
15
+ ident [-]?({nmstart})({nmchar})*
16
+ name ({nmchar})+
17
+ string1 "([^\n\r\f"]|\\{nl}|{nonascii}|{escape})*"
18
+ string2 '([^\n\r\f']|\\{nl}|{nonascii}|{escape})*'
19
+ string {string1}|{string2}
20
+ invalid1 \"([^\n\r\f\\"]|\\{nl}|{nonascii}|{escape})*
21
+ invalid2 \'([^\n\r\f\\']|\\{nl}|{nonascii}|{escape})*
22
+ invalid {invalid1}|{invalid2}
23
+ Comment \/\*(.|[\r\n])*?\*\/
24
+
25
+ rule
26
+
27
+ # [:state] pattern [actions]
28
+
29
+ ~= { [:INCLUDES, text] }
30
+ \|= { [:DASHMATCH, text] }
31
+ \^= { [:PREFIXMATCH, text] }
32
+ \$= { [:SUFFIXMATCH, text] }
33
+ \*= { [:SUBSTRINGMATCH, text] }
34
+ != { [:NOT_EQUAL, text] }
35
+ {ident}\(\s* { [:FUNCTION, text] }
36
+ @{ident} { [:IDENT, text] }
37
+ {ident} { [:IDENT, text] }
38
+ {num} { [:NUMBER, text] }
39
+ \#{name} { [:HASH, text] }
40
+ {w}\+ { [:PLUS, text] }
41
+ {w}> { [:GREATER, text] }
42
+ {w}, { [:COMMA, text] }
43
+ {w}~ { [:TILDE, text] }
44
+ \:not\( { [:NOT, text] }
45
+ @{ident} { [:ATKEYWORD, text] }
46
+ {num}% { [:PERCENTAGE, text] }
47
+ {num}{ident} { [:DIMENSION, text] }
48
+ <!-- { [:CDO, text] }
49
+ --> { [:CDC, text] }
50
+ {w}\/\/ { [:DOUBLESLASH, text] }
51
+ {w}\/ { [:SLASH, text] }
52
+
53
+ U\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})? {[:UNICODE_RANGE, text] }
54
+
55
+ {Comment} /* ignore comments */
56
+ [\s\t\r\n\f]+ { [:S, text] }
57
+ [\.*:\[\]=\)] { [text, text] }
58
+ {string} { [:STRING, text] }
59
+ {invalid} { [:INVALID, text] }
60
+ . { [text, text] }
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,159 @@
1
+ module Nokogiri
2
+ module CSS
3
+ class XPathVisitor
4
+ def visit_function node
5
+ # note that nth-child and nth-last-child are preprocessed in css/node.rb.
6
+ case node.value.first
7
+ when /^text\(/
8
+ 'child::text()'
9
+ when /^self\(/
10
+ "self::#{node.value[1]}"
11
+ when /^(eq|nth|nth-of-type|nth-child)\(/
12
+ if node.value[1].is_a?(Nokogiri::CSS::Node) and node.value[1].type == :AN_PLUS_B
13
+ an_plus_b(node.value[1])
14
+ else
15
+ "position() = " + node.value[1]
16
+ end
17
+ when /^(first|first-of-type)\(/
18
+ "position() = 1"
19
+ when /^(last|last-of-type)\(/
20
+ "position() = last()"
21
+ when /^(nth-last-child|nth-last-of-type)\(/
22
+ "position() = last() - #{node.value[1]}"
23
+ when /^contains\(/
24
+ "contains(., #{node.value[1]})"
25
+ when /^gt\(/
26
+ "position() > #{node.value[1]}"
27
+ when /^only-child\(/
28
+ "last() = 1"
29
+ else
30
+ node.value.first + ')'
31
+ end
32
+ end
33
+
34
+ def visit_not node
35
+ 'not(' + node.value.first.accept(self) + ')'
36
+ end
37
+
38
+ def visit_preceding_selector node
39
+ node.value.last.accept(self) +
40
+ '[preceding-sibling::' +
41
+ node.value.first.accept(self) +
42
+ ']'
43
+ end
44
+
45
+ def visit_direct_adjacent_selector node
46
+ node.value.last.accept(self) +
47
+ '[preceding-sibling::' +
48
+ node.value.first.accept(self) +
49
+ '][position()=1]'
50
+ end
51
+
52
+ def visit_id node
53
+ node.value.first =~ /^#(.*)$/
54
+ "@id = '#{$1}'"
55
+ end
56
+
57
+ def visit_attribute_condition node
58
+ attribute = if (node.value.first.type == :FUNCTION) or (node.value.first.value.first =~ /::/)
59
+ ''
60
+ else
61
+ '@'
62
+ end
63
+ attribute += node.value.first.accept(self)
64
+
65
+ # Support non-standard css
66
+ attribute.gsub!(/^@@/, '@')
67
+
68
+ return attribute unless node.value.length == 3
69
+
70
+ value = node.value.last
71
+ value = "'#{value}'" if value !~ /^['"]/
72
+
73
+ case node.value[1]
74
+ when '*='
75
+ "contains(#{attribute}, #{value})"
76
+ when '^='
77
+ "starts-with(#{attribute}, #{value})"
78
+ when '|='
79
+ "#{attribute} = #{value} or starts-with(#{attribute}, concat(#{value}, '-'))"
80
+ when '~='
81
+ "contains(concat(\" \", #{attribute}, \" \"),concat(\" \", #{value}, \" \"))"
82
+ when '$='
83
+ "substring(#{attribute}, string-length(#{attribute}) - " +
84
+ "string-length(#{value}) + 1, string-length(#{value})) = #{value}"
85
+ else
86
+ attribute + " #{node.value[1]} " + "#{value}"
87
+ end
88
+ end
89
+
90
+ def visit_pseudo_class node
91
+ if node.value.first.is_a?(Nokogiri::CSS::Node) and node.value.first.type == :FUNCTION
92
+ node.value.first.accept(self)
93
+ else
94
+ case node.value.first
95
+ when "first" then "position() = 1"
96
+ when "last" then "position() = last()"
97
+ when "first-of-type" then "position() = 1"
98
+ when "last-of-type" then "position() = last()"
99
+ when "only-of-type" then "last() = 1"
100
+ when "empty" then "not(node())"
101
+ when "parent" then "node()"
102
+ else
103
+ '1 = 1'
104
+ end
105
+ end
106
+ end
107
+
108
+ def visit_class_condition node
109
+ "contains(concat(' ', @class, ' '),concat(' ', '#{node.value.first}', ' '))"
110
+ end
111
+
112
+ def visit_combinator node
113
+ node.value.first.accept(self) + ' and ' +
114
+ node.value.last.accept(self)
115
+ end
116
+
117
+ def visit_conditional_selector node
118
+ node.value.first.accept(self) + '[' +
119
+ node.value.last.accept(self) + ']'
120
+ end
121
+
122
+ def visit_descendant_selector node
123
+ node.value.first.accept(self) +
124
+ '//' +
125
+ node.value.last.accept(self)
126
+ end
127
+
128
+ def visit_child_selector node
129
+ node.value.first.accept(self) +
130
+ '/' +
131
+ node.value.last.accept(self)
132
+ end
133
+
134
+ def visit_element_name node
135
+ node.value.first
136
+ end
137
+
138
+ def accept node
139
+ node.accept(self)
140
+ end
141
+
142
+ private
143
+ def an_plus_b node
144
+ raise ArgumentError, "expected an+b node to contain 4 tokens, but is #{node.value.inspect}" unless node.value.size == 4
145
+
146
+ a = node.value[0].to_i
147
+ b = node.value[3].to_i
148
+
149
+ if (b == 0)
150
+ return "(position() mod #{a}) = 0"
151
+ else
152
+ compare = (a < 0) ? "<=" : ">="
153
+ return "(position() #{compare} #{b}) and (((position()-#{b}) mod #{a.abs}) = 0)"
154
+ end
155
+ end
156
+
157
+ end
158
+ end
159
+ end
@@ -1,3 +1,3 @@
1
1
  module Merb
2
- VERSION = '0.9.12' unless defined?(Merb::VERSION)
2
+ VERSION = '0.9.13' unless defined?(Merb::VERSION)
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merb-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.9.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Zygmuntowicz
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-30 00:00:00 -07:00
12
+ date: 2008-11-03 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -215,7 +215,6 @@ files:
215
215
  - lib/merb-core/test/helpers/multipart_request_helper.rb
216
216
  - lib/merb-core/test/helpers/request_helper.rb
217
217
  - lib/merb-core/test/helpers/route_helper.rb
218
- - lib/merb-core/test/helpers/view_helper.rb
219
218
  - lib/merb-core/test/helpers.rb
220
219
  - lib/merb-core/test/matchers
221
220
  - lib/merb-core/test/matchers/controller_matchers.rb
@@ -223,6 +222,7 @@ files:
223
222
  - lib/merb-core/test/matchers/route_matchers.rb
224
223
  - lib/merb-core/test/matchers/view_matchers.rb
225
224
  - lib/merb-core/test/matchers.rb
225
+ - lib/merb-core/test/run_spec.rb
226
226
  - lib/merb-core/test/run_specs.rb
227
227
  - lib/merb-core/test/tasks
228
228
  - lib/merb-core/test/tasks/spectasks.rb
@@ -231,7 +231,20 @@ files:
231
231
  - lib/merb-core/test/test_ext/object.rb
232
232
  - lib/merb-core/test/test_ext/rspec.rb
233
233
  - lib/merb-core/test/test_ext/string.rb
234
+ - lib/merb-core/test/webrat.rb
234
235
  - lib/merb-core/test.rb
236
+ - lib/merb-core/vendor
237
+ - lib/merb-core/vendor/nokogiri
238
+ - lib/merb-core/vendor/nokogiri/css
239
+ - lib/merb-core/vendor/nokogiri/css/generated_parser.rb
240
+ - lib/merb-core/vendor/nokogiri/css/generated_tokenizer.rb
241
+ - lib/merb-core/vendor/nokogiri/css/node.rb
242
+ - lib/merb-core/vendor/nokogiri/css/parser.rb
243
+ - lib/merb-core/vendor/nokogiri/css/parser.y
244
+ - lib/merb-core/vendor/nokogiri/css/tokenizer.rb
245
+ - lib/merb-core/vendor/nokogiri/css/tokenizer.rex
246
+ - lib/merb-core/vendor/nokogiri/css/xpath_visitor.rb
247
+ - lib/merb-core/vendor/nokogiri/css.rb
235
248
  - lib/merb-core/version.rb
236
249
  - lib/merb-core.rb
237
250
  has_rdoc: true
@@ -256,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
256
269
  requirements:
257
270
  - install the json gem to get faster json parsing
258
271
  rubyforge_project:
259
- rubygems_version: 1.3.0
272
+ rubygems_version: 1.3.1
260
273
  signing_key:
261
274
  specification_version: 2
262
275
  summary: Merb. Pocket rocket web framework.
@@ -1,121 +0,0 @@
1
- module Merb
2
- module Test
3
- module ViewHelper
4
-
5
- # Small utility class for working with the Hpricot parser class
6
- class DocumentOutput
7
-
8
- # ==== Parameters
9
- # response_body<String>:: The response body to parse with Hpricot.
10
- def initialize(response_body)
11
- @parser = Hpricot.parse(response_body)
12
- end
13
-
14
- # ==== Parameters
15
- # css_query<String>::
16
- # A CSS query to find the element for, e.g. "ul.links".
17
- #
18
- # ==== Returns
19
- # String:: The content of the first tag matching the query.
20
- def content_for(css_query)
21
- match = @parser.search(css_query).first
22
- match.inner_text unless match.nil?
23
- end
24
-
25
- # ==== Parameters
26
- # css_query<String>:: A CSS query to find the elements for.
27
- #
28
- # ==== Returns
29
- # Array[String]:: Content of all tags matching the query.
30
- def content_for_all(css_query)
31
- matches = @parser.search(css_query).collect{|ele| ele.inner_text}
32
- end
33
-
34
- # ==== Parameters
35
- # css_query<String>:: A CSS query to find the elements for.
36
- #
37
- # ==== Returns
38
- # Hpricot::Elements:: All tags matching the query.
39
- def [](css_query)
40
- @parser.search(css_query)
41
- end
42
- end
43
-
44
- # ==== Parameters
45
- # css_query<String>:: A CSS query to find the element for.
46
- # output<DocumentOutput>::
47
- # The output to look for the element in. Defaults to process_output.
48
- #
49
- # ==== Returns
50
- # String:: The content of the first tag matching the query.
51
- def tag(css_query, output = process_output)
52
- output.content_for(css_query)
53
- end
54
-
55
- # ==== Parameters
56
- # css_query<String>:: A CSS query to find the elements for.
57
- # output<DocumentOutput>::
58
- # The output to look for the element in. Defaults to process_output.
59
- #
60
- # ==== Returns
61
- # Array[String]:: Content of all tags matching the query.
62
- def tags(css_query, output = process_output)
63
- output.content_for_all(css_query)
64
- end
65
-
66
- # ==== Parameters
67
- # css_query<String>:: A CSS query to find the element for.
68
- # output<DocumentOutput>::
69
- # The output to look for the element in. Defaults to process_output.
70
- #
71
- # ==== Returns
72
- # Hpricot::Elem:: The first tag matching the query.
73
- def element(css_query, output = process_output)
74
- output[css_query].first
75
- end
76
-
77
- # ==== Parameters
78
- # css_query<String>:: A CSS query to find the elements for.
79
- # output<DocumentOutput>::
80
- # The output to look for the elements in. Defaults to process_output.
81
- #
82
- # ==== Returns
83
- # Array[Hpricot::Elem]:: All tags matching the query.
84
- def elements(css_query, output = process_output)
85
- Hpricot::Elements[*css_query.to_s.split(",").map{|s| s.strip}.map do |query|
86
- output[query]
87
- end.flatten]
88
- end
89
-
90
- # ==== Parameters
91
- # css_query<String>:: A CSS query to find the elements for.
92
- # text<String, Regexp>:: A pattern to match tag contents for.
93
- # output<DocumentOutput>::
94
- # The output to look for the elements in. Defaults to process_output.
95
- #
96
- # ==== Returns
97
- # Array[Hpricot::Elem]:: All tags matching the query and pattern.
98
- def get_elements(css_query, text, output = nil)
99
- els = elements(*[css_query, output].compact)
100
- case text
101
- when String then els.reject {|t| !t.contains?(text) }
102
- when Regexp then els.reject {|t| !t.matches?(text) }
103
- else []
104
- end
105
- end
106
-
107
- protected
108
-
109
- # ==== Returns
110
- # DocumentOutput:: Document output from the response body.
111
- def process_output
112
- return @output unless @output.nil?
113
- return @output = DocumentOutput.new(@response_output) unless @response_output.nil?
114
-
115
- raise "The response output was not in its usual places, please provide the output" if @controller.nil? || @controller.body.empty?
116
- @response_output = @controller.body
117
- @output = DocumentOutput.new(@controller.body)
118
- end
119
- end
120
- end
121
- end