less 1.0.15 → 1.0.16
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/less.gemspec +4 -2
- data/lib/less.rb +15 -0
- data/lib/less/command.rb +1 -1
- data/lib/less/engine.rb +1 -1
- data/lib/less/engine/less.tt +66 -39
- data/lib/less/engine/nodes/entity.rb +6 -0
- data/lib/less/engine/nodes/literal.rb +3 -3
- data/lib/less/engine/nodes/property.rb +56 -37
- data/lib/less/engine/parser.rb +210 -62
- data/spec/css/parens.css +7 -0
- data/spec/engine_spec.rb +4 -0
- data/spec/less/operations.less +1 -1
- data/spec/less/parens.less +15 -0
- metadata +4 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.16
|
data/less.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{less}
|
5
|
-
s.version = "1.0.
|
5
|
+
s.version = "1.0.16"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["cloudhead"]
|
9
|
-
s.date = %q{2009-07-
|
9
|
+
s.date = %q{2009-07-23}
|
10
10
|
s.default_executable = %q{lessc}
|
11
11
|
s.description = %q{LESS is leaner CSS}
|
12
12
|
s.email = %q{self@cloudhead.net}
|
@@ -140,6 +140,7 @@ Gem::Specification.new do |s|
|
|
140
140
|
"spec/css/mixins-args.css",
|
141
141
|
"spec/css/mixins.css",
|
142
142
|
"spec/css/operations.css",
|
143
|
+
"spec/css/parens.css",
|
143
144
|
"spec/css/rulesets.css",
|
144
145
|
"spec/css/scope.css",
|
145
146
|
"spec/css/selectors.css",
|
@@ -166,6 +167,7 @@ Gem::Specification.new do |s|
|
|
166
167
|
"spec/less/mixins-args.less",
|
167
168
|
"spec/less/mixins.less",
|
168
169
|
"spec/less/operations.less",
|
170
|
+
"spec/less/parens.less",
|
169
171
|
"spec/less/rulesets.less",
|
170
172
|
"spec/less/scope.less",
|
171
173
|
"spec/less/selectors.less",
|
data/lib/less.rb
CHANGED
@@ -67,6 +67,21 @@ class Object
|
|
67
67
|
def error!(s) raise Exception, s end
|
68
68
|
end
|
69
69
|
|
70
|
+
class Array
|
71
|
+
def dissolve
|
72
|
+
ary = flatten.compact
|
73
|
+
case ary.size
|
74
|
+
when 0 then []
|
75
|
+
when 1 then first
|
76
|
+
else ary
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def one?
|
81
|
+
size == 1
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
70
85
|
class Class
|
71
86
|
def to_sym
|
72
87
|
self.to_s.to_sym
|
data/lib/less/command.rb
CHANGED
@@ -53,7 +53,7 @@ module Less
|
|
53
53
|
def parse new = false
|
54
54
|
begin
|
55
55
|
# Create a new Less object with the contents of a file
|
56
|
-
css = Less::Engine.new(File.new
|
56
|
+
css = Less::Engine.new(File.new(@source)).to_css
|
57
57
|
css = css.delete " \n" if compress?
|
58
58
|
|
59
59
|
File.open( @destination, "w" ) do |file|
|
data/lib/less/engine.rb
CHANGED
data/lib/less/engine/less.tt
CHANGED
@@ -36,7 +36,7 @@ grammar Less
|
|
36
36
|
path = File.join(env.root.file, url.value)
|
37
37
|
path += '.less' unless path =~ /\.(le|c)ss$/
|
38
38
|
if File.exist? path
|
39
|
-
imported = Less::Engine.new(File.new
|
39
|
+
imported = Less::Engine.new(File.new(path)).to_tree
|
40
40
|
env.rules += imported.rules
|
41
41
|
else
|
42
42
|
raise ImportError, path
|
@@ -48,7 +48,7 @@ grammar Less
|
|
48
48
|
rule url
|
49
49
|
'url(' path:(string / [-a-zA-Z0-9_%$/.&=:;#+?]+) ')' {
|
50
50
|
def build env = nil
|
51
|
-
Node::String.new
|
51
|
+
Node::String.new CGI.unescape(path.text_value)
|
52
52
|
end
|
53
53
|
|
54
54
|
def value
|
@@ -100,20 +100,47 @@ grammar Less
|
|
100
100
|
# height: 100%;
|
101
101
|
#
|
102
102
|
rule declaration
|
103
|
-
ws name:(ident / variable) s ':' s
|
103
|
+
ws name:(ident / variable) s ':' s expressions s (';'/ ws &'}') ws {
|
104
104
|
def build env
|
105
|
-
env << (name.text_value =~ /^@/ ?
|
106
|
-
|
105
|
+
env << (name.text_value =~ /^@/ ?
|
106
|
+
Node::Variable : Node::Property).new(name.text_value, expressions.build(env), env)
|
107
|
+
|
107
108
|
end
|
108
109
|
# Empty rule
|
109
110
|
} / ws ident s ':' s ';' ws
|
110
111
|
end
|
111
112
|
|
113
|
+
rule expressions
|
114
|
+
expression+ {
|
115
|
+
def build env
|
116
|
+
elements.map do |e|
|
117
|
+
e.build(env) if e.respond_to? :build
|
118
|
+
end.compact
|
119
|
+
end
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
112
123
|
#
|
113
124
|
# An operation or compound value
|
114
125
|
#
|
115
126
|
rule expression
|
116
|
-
|
127
|
+
s '(' s expressions s ')' s {
|
128
|
+
def build env
|
129
|
+
Node::Expression.new(['('] + expressions.build(env).flatten + [')'])
|
130
|
+
end
|
131
|
+
} / entity tail:(operator entity)* ws {
|
132
|
+
def build env
|
133
|
+
exp = all.map do |e|
|
134
|
+
e.method(:build).arity.zero??
|
135
|
+
e.build : e.build(env) if e.respond_to? :build
|
136
|
+
end.dissolve
|
137
|
+
exp.is_a?(Array) ? Node::Expression.new(exp) : exp
|
138
|
+
end
|
139
|
+
|
140
|
+
def all
|
141
|
+
[entity] + tail.elements.map {|i| [i.operator, i.entity] }.flatten.compact
|
142
|
+
end
|
143
|
+
}
|
117
144
|
end
|
118
145
|
|
119
146
|
#
|
@@ -125,22 +152,23 @@ grammar Less
|
|
125
152
|
|
126
153
|
rule fonts
|
127
154
|
font family:(s ',' s font)+ {
|
128
|
-
def build
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
155
|
+
def build
|
156
|
+
Node::FontFamily.new(all.map(&:build))
|
157
|
+
end
|
158
|
+
|
159
|
+
def all
|
160
|
+
[font] + family.elements.map {|f| f.font }
|
133
161
|
end
|
134
162
|
}
|
135
163
|
end
|
136
164
|
|
137
165
|
rule font
|
138
166
|
[a-zA-Z] [-a-zA-Z0-9]* {
|
139
|
-
def build
|
167
|
+
def build
|
140
168
|
Node::Keyword.new(text_value)
|
141
169
|
end
|
142
170
|
} / string {
|
143
|
-
def build
|
171
|
+
def build
|
144
172
|
Node::String.new(text_value)
|
145
173
|
end
|
146
174
|
}
|
@@ -155,8 +183,8 @@ grammar Less
|
|
155
183
|
|
156
184
|
rule variable
|
157
185
|
'@' [-a-zA-Z0-9_]+ {
|
158
|
-
def build
|
159
|
-
|
186
|
+
def build
|
187
|
+
Node::Variable.new(text_value)
|
160
188
|
end
|
161
189
|
}
|
162
190
|
end
|
@@ -199,19 +227,19 @@ grammar Less
|
|
199
227
|
rule accessor
|
200
228
|
ident:(class_id / tag) '[' attr:(string / variable) ']' {
|
201
229
|
def build env
|
202
|
-
env.
|
230
|
+
env.nearest(ident.text_value)[attr.text_value.delete(%q["'])].evaluate
|
203
231
|
end
|
204
232
|
}
|
205
233
|
end
|
206
234
|
|
207
235
|
rule operator
|
208
236
|
S [-+*/] S {
|
209
|
-
def build
|
210
|
-
|
237
|
+
def build
|
238
|
+
Node::Operator.new(text_value.strip)
|
211
239
|
end
|
212
240
|
} / [-+*/] {
|
213
|
-
def build
|
214
|
-
|
241
|
+
def build
|
242
|
+
Node::Operator.new(text_value)
|
215
243
|
end
|
216
244
|
}
|
217
245
|
end
|
@@ -221,16 +249,16 @@ grammar Less
|
|
221
249
|
#
|
222
250
|
rule literal
|
223
251
|
color / (dimension / [-a-z]+) '/' dimension {
|
224
|
-
def build
|
225
|
-
|
252
|
+
def build
|
253
|
+
Node::Anonymous.new(text_value)
|
226
254
|
end
|
227
255
|
} / number unit {
|
228
|
-
def build
|
229
|
-
|
256
|
+
def build
|
257
|
+
Node::Number.new(number.text_value, unit.text_value)
|
230
258
|
end
|
231
259
|
} / string {
|
232
|
-
def build
|
233
|
-
|
260
|
+
def build
|
261
|
+
Node::String.new(text_value)
|
234
262
|
end
|
235
263
|
}
|
236
264
|
end
|
@@ -238,8 +266,8 @@ grammar Less
|
|
238
266
|
# !important
|
239
267
|
rule important
|
240
268
|
'!important' {
|
241
|
-
def build
|
242
|
-
|
269
|
+
def build
|
270
|
+
Node::Keyword.new(text_value)
|
243
271
|
end
|
244
272
|
}
|
245
273
|
end
|
@@ -249,8 +277,8 @@ grammar Less
|
|
249
277
|
#
|
250
278
|
rule keyword
|
251
279
|
[-a-zA-Z]+ !ns {
|
252
|
-
def build
|
253
|
-
|
280
|
+
def build
|
281
|
+
Node::Keyword.new(text_value)
|
254
282
|
end
|
255
283
|
}
|
256
284
|
end
|
@@ -261,11 +289,11 @@ grammar Less
|
|
261
289
|
rule string
|
262
290
|
"'" content:(!"'" . )* "'" {
|
263
291
|
def value
|
264
|
-
text_value
|
292
|
+
content.text_value
|
265
293
|
end
|
266
294
|
} / ["] content:(!["] . )* ["] {
|
267
295
|
def value
|
268
|
-
text_value
|
296
|
+
content.text_value
|
269
297
|
end
|
270
298
|
}
|
271
299
|
end
|
@@ -285,18 +313,17 @@ grammar Less
|
|
285
313
|
('px'/'em'/'pc'/'%'/'pt'/'cm'/'mm')?
|
286
314
|
end
|
287
315
|
|
288
|
-
|
289
316
|
#
|
290
317
|
# Color
|
291
318
|
#
|
292
319
|
rule color
|
293
320
|
'#' rgb {
|
294
|
-
def build
|
295
|
-
|
321
|
+
def build
|
322
|
+
Node::Color.new(*rgb.build)
|
296
323
|
end
|
297
324
|
} / fn:(('hsl'/'rgb') 'a'?) arguments {
|
298
|
-
def build
|
299
|
-
|
325
|
+
def build
|
326
|
+
Node::Function.new(fn.text_value, arguments.build.flatten)
|
300
327
|
end
|
301
328
|
}
|
302
329
|
end
|
@@ -325,8 +352,8 @@ grammar Less
|
|
325
352
|
#
|
326
353
|
rule function
|
327
354
|
name:([-a-zA-Z_]+) arguments {
|
328
|
-
def build
|
329
|
-
|
355
|
+
def build
|
356
|
+
Node::Function.new(name.text_value, [arguments.build].flatten)
|
330
357
|
end
|
331
358
|
}
|
332
359
|
end
|
@@ -135,15 +135,15 @@ module Less
|
|
135
135
|
include Literal
|
136
136
|
end
|
137
137
|
|
138
|
-
class FontFamily
|
138
|
+
class FontFamily
|
139
139
|
include Literal
|
140
140
|
|
141
141
|
def initialize family = []
|
142
|
-
|
142
|
+
@family = family
|
143
143
|
end
|
144
144
|
|
145
145
|
def to_css
|
146
|
-
|
146
|
+
@family.map(&:to_css) * ', '
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
@@ -5,14 +5,23 @@ module Less
|
|
5
5
|
|
6
6
|
attr_accessor :value
|
7
7
|
|
8
|
-
def initialize key, value = nil
|
9
|
-
super key
|
10
|
-
|
8
|
+
def initialize key, value = nil, parent = nil
|
9
|
+
super key, parent
|
10
|
+
|
11
|
+
value = if value.is_a? Array
|
12
|
+
value.each {|v| v.parent = self if v.respond_to? :parent }
|
13
|
+
elsif value.nil?
|
14
|
+
[]
|
15
|
+
else
|
16
|
+
value
|
17
|
+
end
|
18
|
+
|
19
|
+
@value = Expression.new(value, self)
|
11
20
|
@eval = false # Store the first evaluation in here
|
12
21
|
end
|
13
22
|
|
14
23
|
def << token
|
15
|
-
token = Node::Anonymous.new(*token) unless token.is_a? Entity or token.
|
24
|
+
token = Node::Anonymous.new(*token) unless token.is_a? Entity or token.respond_to? :to_ruby
|
16
25
|
token.parent = self if token.respond_to? :parent
|
17
26
|
@value << token
|
18
27
|
end
|
@@ -45,9 +54,9 @@ module Less
|
|
45
54
|
class Variable < Property
|
46
55
|
attr_reader :declaration
|
47
56
|
|
48
|
-
def initialize key, value = nil
|
57
|
+
def initialize key, value = nil, parent = nil
|
49
58
|
@declaration = value ? true : false
|
50
|
-
super key.delete('@'), value
|
59
|
+
super key.delete('@'), value, parent
|
51
60
|
end
|
52
61
|
|
53
62
|
def inspect
|
@@ -76,55 +85,65 @@ module Less
|
|
76
85
|
end
|
77
86
|
|
78
87
|
class Expression < Array
|
79
|
-
|
80
|
-
|
88
|
+
attr_reader :parent
|
89
|
+
|
90
|
+
def initialize ary, parent = nil
|
91
|
+
self.parent = parent
|
92
|
+
super ary
|
93
|
+
end
|
94
|
+
|
95
|
+
def expressions; select {|i| i.kind_of? Expression } end
|
96
|
+
def operators; select {|i| i.is_a? Operator } end
|
97
|
+
def entities; select {|i| i.kind_of? Entity } end
|
98
|
+
def literals; select {|i| i.kind_of? Literal } end
|
99
|
+
|
100
|
+
def parent= obj
|
101
|
+
@parent = obj
|
102
|
+
each {|e| e.parent = obj if e.respond_to? :parent }
|
81
103
|
end
|
82
104
|
|
83
|
-
def operators; select {|i| i.is_a? Operator } end
|
84
|
-
def entities; select {|i| i.kind_of? Entity } end
|
85
|
-
def literals; select {|i| i.kind_of? Literal } end
|
86
|
-
|
87
105
|
def inspect
|
88
106
|
'[' + map {|i| i.inspect }.join(', ') + ']'
|
89
107
|
end
|
108
|
+
|
109
|
+
def terminal?
|
110
|
+
expressions.empty?
|
111
|
+
end
|
90
112
|
|
91
113
|
def to_css
|
92
|
-
map
|
114
|
+
map do |i|
|
115
|
+
i.respond_to?(:to_css) ? i.to_css : i.to_s
|
116
|
+
end * ' '
|
117
|
+
end
|
118
|
+
|
119
|
+
def to_ruby
|
120
|
+
map do |i|
|
121
|
+
i.respond_to?(:to_ruby) ? i.to_ruby : i.to_s
|
122
|
+
end
|
93
123
|
end
|
94
124
|
|
95
125
|
#
|
96
126
|
# Evaluates the expression and instantiates a new Literal with the result
|
97
127
|
# ex: [#111, +, #111] will evaluate to a Color node, with value #222
|
98
128
|
#
|
99
|
-
# TODO: refactor the conditionals
|
100
129
|
def evaluate
|
101
|
-
if size > 2
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
unit = evaluated.literals.map do |node|
|
130
|
+
if size > 2 or !terminal?
|
131
|
+
# Replace self with an evaluated sub-expression
|
132
|
+
replace map {|e| e.respond_to?(:evaluate) ? e.evaluate : e }
|
133
|
+
|
134
|
+
unit = literals.map do |node|
|
107
135
|
node.unit
|
108
136
|
end.compact.uniq.tap do |ary|
|
109
137
|
raise MixedUnitsError, self * ' ' if ary.size > 1
|
110
138
|
end.join
|
111
|
-
|
112
|
-
entity =
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
result
|
120
|
-
else
|
121
|
-
entity.class.new(result, *(unit if entity.class == Node::Number))
|
122
|
-
end
|
123
|
-
else
|
124
|
-
first
|
125
|
-
end
|
126
|
-
else
|
127
|
-
self
|
139
|
+
|
140
|
+
entity = literals.find {|e| e.unit == unit } || entities.first
|
141
|
+
result = operators.empty?? self : eval(to_ruby.join)
|
142
|
+
|
143
|
+
case result
|
144
|
+
when Entity then result
|
145
|
+
when Expression then result.one?? result.first : self.class.new(result)
|
146
|
+
else entity.class.new(result, *(unit if entity.class == Node::Number))
|
128
147
|
end
|
129
148
|
elsif size == 1
|
130
149
|
first
|
data/lib/less/engine/parser.rb
CHANGED
@@ -494,7 +494,7 @@ module Less
|
|
494
494
|
path = File.join(env.root.file, url.value)
|
495
495
|
path += '.less' unless path =~ /\.(le|c)ss$/
|
496
496
|
if File.exist? path
|
497
|
-
imported = Less::Engine.new(File.new
|
497
|
+
imported = Less::Engine.new(File.new(path)).to_tree
|
498
498
|
env.rules += imported.rules
|
499
499
|
else
|
500
500
|
raise ImportError, path
|
@@ -589,7 +589,7 @@ module Less
|
|
589
589
|
|
590
590
|
module Url1
|
591
591
|
def build env = nil
|
592
|
-
Node::String.new
|
592
|
+
Node::String.new CGI.unescape(path.text_value)
|
593
593
|
end
|
594
594
|
|
595
595
|
def value
|
@@ -1039,7 +1039,7 @@ module Less
|
|
1039
1039
|
elements[4]
|
1040
1040
|
end
|
1041
1041
|
|
1042
|
-
def
|
1042
|
+
def expressions
|
1043
1043
|
elements[5]
|
1044
1044
|
end
|
1045
1045
|
|
@@ -1054,8 +1054,9 @@ module Less
|
|
1054
1054
|
|
1055
1055
|
module Declaration2
|
1056
1056
|
def build env
|
1057
|
-
env << (name.text_value =~ /^@/ ?
|
1058
|
-
|
1057
|
+
env << (name.text_value =~ /^@/ ?
|
1058
|
+
Node::Variable : Node::Property).new(name.text_value, expressions.build(env), env)
|
1059
|
+
|
1059
1060
|
end
|
1060
1061
|
# Empty rule
|
1061
1062
|
end
|
@@ -1125,7 +1126,7 @@ module Less
|
|
1125
1126
|
r8 = _nt_s
|
1126
1127
|
s1 << r8
|
1127
1128
|
if r8
|
1128
|
-
r9 =
|
1129
|
+
r9 = _nt_expressions
|
1129
1130
|
s1 << r9
|
1130
1131
|
if r9
|
1131
1132
|
r10 = _nt_s
|
@@ -1258,16 +1259,110 @@ module Less
|
|
1258
1259
|
r0
|
1259
1260
|
end
|
1260
1261
|
|
1262
|
+
module Expressions0
|
1263
|
+
def build env
|
1264
|
+
elements.map do |e|
|
1265
|
+
e.build(env) if e.respond_to? :build
|
1266
|
+
end.compact
|
1267
|
+
end
|
1268
|
+
end
|
1269
|
+
|
1270
|
+
def _nt_expressions
|
1271
|
+
start_index = index
|
1272
|
+
if node_cache[:expressions].has_key?(index)
|
1273
|
+
cached = node_cache[:expressions][index]
|
1274
|
+
@index = cached.interval.end if cached
|
1275
|
+
return cached
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
s0, i0 = [], index
|
1279
|
+
loop do
|
1280
|
+
r1 = _nt_expression
|
1281
|
+
if r1
|
1282
|
+
s0 << r1
|
1283
|
+
else
|
1284
|
+
break
|
1285
|
+
end
|
1286
|
+
end
|
1287
|
+
if s0.empty?
|
1288
|
+
@index = i0
|
1289
|
+
r0 = nil
|
1290
|
+
else
|
1291
|
+
r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
|
1292
|
+
r0.extend(Expressions0)
|
1293
|
+
end
|
1294
|
+
|
1295
|
+
node_cache[:expressions][start_index] = r0
|
1296
|
+
|
1297
|
+
r0
|
1298
|
+
end
|
1299
|
+
|
1261
1300
|
module Expression0
|
1301
|
+
def s
|
1302
|
+
elements[0]
|
1303
|
+
end
|
1304
|
+
|
1305
|
+
def s
|
1306
|
+
elements[2]
|
1307
|
+
end
|
1308
|
+
|
1309
|
+
def expressions
|
1310
|
+
elements[3]
|
1311
|
+
end
|
1312
|
+
|
1313
|
+
def s
|
1314
|
+
elements[4]
|
1315
|
+
end
|
1316
|
+
|
1317
|
+
def s
|
1318
|
+
elements[6]
|
1319
|
+
end
|
1320
|
+
end
|
1321
|
+
|
1322
|
+
module Expression1
|
1323
|
+
def build env
|
1324
|
+
Node::Expression.new(['('] + expressions.build(env).flatten + [')'])
|
1325
|
+
end
|
1326
|
+
end
|
1327
|
+
|
1328
|
+
module Expression2
|
1329
|
+
def operator
|
1330
|
+
elements[0]
|
1331
|
+
end
|
1332
|
+
|
1333
|
+
def entity
|
1334
|
+
elements[1]
|
1335
|
+
end
|
1336
|
+
end
|
1337
|
+
|
1338
|
+
module Expression3
|
1262
1339
|
def entity
|
1263
1340
|
elements[0]
|
1264
1341
|
end
|
1265
1342
|
|
1266
|
-
def
|
1343
|
+
def tail
|
1344
|
+
elements[1]
|
1345
|
+
end
|
1346
|
+
|
1347
|
+
def ws
|
1267
1348
|
elements[2]
|
1268
1349
|
end
|
1269
1350
|
end
|
1270
1351
|
|
1352
|
+
module Expression4
|
1353
|
+
def build env
|
1354
|
+
exp = all.map do |e|
|
1355
|
+
e.method(:build).arity.zero??
|
1356
|
+
e.build : e.build(env) if e.respond_to? :build
|
1357
|
+
end.dissolve
|
1358
|
+
exp.is_a?(Array) ? Node::Expression.new(exp) : exp
|
1359
|
+
end
|
1360
|
+
|
1361
|
+
def all
|
1362
|
+
[entity] + tail.elements.map {|i| [i.operator, i.entity] }.flatten.compact
|
1363
|
+
end
|
1364
|
+
end
|
1365
|
+
|
1271
1366
|
def _nt_expression
|
1272
1367
|
start_index = index
|
1273
1368
|
if node_cache[:expression].has_key?(index)
|
@@ -1278,36 +1373,48 @@ module Less
|
|
1278
1373
|
|
1279
1374
|
i0 = index
|
1280
1375
|
i1, s1 = index, []
|
1281
|
-
r2 =
|
1376
|
+
r2 = _nt_s
|
1282
1377
|
s1 << r2
|
1283
1378
|
if r2
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
r3 = r4
|
1379
|
+
if has_terminal?('(', false, index)
|
1380
|
+
r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
1381
|
+
@index += 1
|
1288
1382
|
else
|
1289
|
-
|
1290
|
-
|
1291
|
-
r3 = r5
|
1292
|
-
else
|
1293
|
-
r6 = _nt_WS
|
1294
|
-
if r6
|
1295
|
-
r3 = r6
|
1296
|
-
else
|
1297
|
-
@index = i3
|
1298
|
-
r3 = nil
|
1299
|
-
end
|
1300
|
-
end
|
1383
|
+
terminal_parse_failure('(')
|
1384
|
+
r3 = nil
|
1301
1385
|
end
|
1302
1386
|
s1 << r3
|
1303
1387
|
if r3
|
1304
|
-
|
1305
|
-
s1 <<
|
1388
|
+
r4 = _nt_s
|
1389
|
+
s1 << r4
|
1390
|
+
if r4
|
1391
|
+
r5 = _nt_expressions
|
1392
|
+
s1 << r5
|
1393
|
+
if r5
|
1394
|
+
r6 = _nt_s
|
1395
|
+
s1 << r6
|
1396
|
+
if r6
|
1397
|
+
if has_terminal?(')', false, index)
|
1398
|
+
r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
1399
|
+
@index += 1
|
1400
|
+
else
|
1401
|
+
terminal_parse_failure(')')
|
1402
|
+
r7 = nil
|
1403
|
+
end
|
1404
|
+
s1 << r7
|
1405
|
+
if r7
|
1406
|
+
r8 = _nt_s
|
1407
|
+
s1 << r8
|
1408
|
+
end
|
1409
|
+
end
|
1410
|
+
end
|
1411
|
+
end
|
1306
1412
|
end
|
1307
1413
|
end
|
1308
1414
|
if s1.last
|
1309
|
-
r1 = instantiate_node(
|
1415
|
+
r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
|
1310
1416
|
r1.extend(Expression0)
|
1417
|
+
r1.extend(Expression1)
|
1311
1418
|
else
|
1312
1419
|
@index = i1
|
1313
1420
|
r1 = nil
|
@@ -1315,9 +1422,49 @@ module Less
|
|
1315
1422
|
if r1
|
1316
1423
|
r0 = r1
|
1317
1424
|
else
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1425
|
+
i9, s9 = index, []
|
1426
|
+
r10 = _nt_entity
|
1427
|
+
s9 << r10
|
1428
|
+
if r10
|
1429
|
+
s11, i11 = [], index
|
1430
|
+
loop do
|
1431
|
+
i12, s12 = index, []
|
1432
|
+
r13 = _nt_operator
|
1433
|
+
s12 << r13
|
1434
|
+
if r13
|
1435
|
+
r14 = _nt_entity
|
1436
|
+
s12 << r14
|
1437
|
+
end
|
1438
|
+
if s12.last
|
1439
|
+
r12 = instantiate_node(SyntaxNode,input, i12...index, s12)
|
1440
|
+
r12.extend(Expression2)
|
1441
|
+
else
|
1442
|
+
@index = i12
|
1443
|
+
r12 = nil
|
1444
|
+
end
|
1445
|
+
if r12
|
1446
|
+
s11 << r12
|
1447
|
+
else
|
1448
|
+
break
|
1449
|
+
end
|
1450
|
+
end
|
1451
|
+
r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
|
1452
|
+
s9 << r11
|
1453
|
+
if r11
|
1454
|
+
r15 = _nt_ws
|
1455
|
+
s9 << r15
|
1456
|
+
end
|
1457
|
+
end
|
1458
|
+
if s9.last
|
1459
|
+
r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
|
1460
|
+
r9.extend(Expression3)
|
1461
|
+
r9.extend(Expression4)
|
1462
|
+
else
|
1463
|
+
@index = i9
|
1464
|
+
r9 = nil
|
1465
|
+
end
|
1466
|
+
if r9
|
1467
|
+
r0 = r9
|
1321
1468
|
else
|
1322
1469
|
@index = i0
|
1323
1470
|
r0 = nil
|
@@ -1406,11 +1553,12 @@ module Less
|
|
1406
1553
|
end
|
1407
1554
|
|
1408
1555
|
module Fonts2
|
1409
|
-
def build
|
1410
|
-
|
1411
|
-
|
1412
|
-
|
1413
|
-
|
1556
|
+
def build
|
1557
|
+
Node::FontFamily.new(all.map(&:build))
|
1558
|
+
end
|
1559
|
+
|
1560
|
+
def all
|
1561
|
+
[font] + family.elements.map {|f| f.font }
|
1414
1562
|
end
|
1415
1563
|
end
|
1416
1564
|
|
@@ -1488,13 +1636,13 @@ module Less
|
|
1488
1636
|
end
|
1489
1637
|
|
1490
1638
|
module Font1
|
1491
|
-
def build
|
1639
|
+
def build
|
1492
1640
|
Node::Keyword.new(text_value)
|
1493
1641
|
end
|
1494
1642
|
end
|
1495
1643
|
|
1496
1644
|
module Font2
|
1497
|
-
def build
|
1645
|
+
def build
|
1498
1646
|
Node::String.new(text_value)
|
1499
1647
|
end
|
1500
1648
|
end
|
@@ -1640,8 +1788,8 @@ module Less
|
|
1640
1788
|
end
|
1641
1789
|
|
1642
1790
|
module Variable1
|
1643
|
-
def build
|
1644
|
-
|
1791
|
+
def build
|
1792
|
+
Node::Variable.new(text_value)
|
1645
1793
|
end
|
1646
1794
|
end
|
1647
1795
|
|
@@ -2394,7 +2542,7 @@ module Less
|
|
2394
2542
|
|
2395
2543
|
module Accessor1
|
2396
2544
|
def build env
|
2397
|
-
env.
|
2545
|
+
env.nearest(ident.text_value)[attr.text_value.delete(%q["'])].evaluate
|
2398
2546
|
end
|
2399
2547
|
end
|
2400
2548
|
|
@@ -2482,14 +2630,14 @@ module Less
|
|
2482
2630
|
end
|
2483
2631
|
|
2484
2632
|
module Operator1
|
2485
|
-
def build
|
2486
|
-
|
2633
|
+
def build
|
2634
|
+
Node::Operator.new(text_value.strip)
|
2487
2635
|
end
|
2488
2636
|
end
|
2489
2637
|
|
2490
2638
|
module Operator2
|
2491
|
-
def build
|
2492
|
-
|
2639
|
+
def build
|
2640
|
+
Node::Operator.new(text_value)
|
2493
2641
|
end
|
2494
2642
|
end
|
2495
2643
|
|
@@ -2556,8 +2704,8 @@ module Less
|
|
2556
2704
|
end
|
2557
2705
|
|
2558
2706
|
module Literal1
|
2559
|
-
def build
|
2560
|
-
|
2707
|
+
def build
|
2708
|
+
Node::Anonymous.new(text_value)
|
2561
2709
|
end
|
2562
2710
|
end
|
2563
2711
|
|
@@ -2572,14 +2720,14 @@ module Less
|
|
2572
2720
|
end
|
2573
2721
|
|
2574
2722
|
module Literal3
|
2575
|
-
def build
|
2576
|
-
|
2723
|
+
def build
|
2724
|
+
Node::Number.new(number.text_value, unit.text_value)
|
2577
2725
|
end
|
2578
2726
|
end
|
2579
2727
|
|
2580
2728
|
module Literal4
|
2581
|
-
def build
|
2582
|
-
|
2729
|
+
def build
|
2730
|
+
Node::String.new(text_value)
|
2583
2731
|
end
|
2584
2732
|
end
|
2585
2733
|
|
@@ -2691,8 +2839,8 @@ module Less
|
|
2691
2839
|
end
|
2692
2840
|
|
2693
2841
|
module Important0
|
2694
|
-
def build
|
2695
|
-
|
2842
|
+
def build
|
2843
|
+
Node::Keyword.new(text_value)
|
2696
2844
|
end
|
2697
2845
|
end
|
2698
2846
|
|
@@ -2722,8 +2870,8 @@ module Less
|
|
2722
2870
|
end
|
2723
2871
|
|
2724
2872
|
module Keyword1
|
2725
|
-
def build
|
2726
|
-
|
2873
|
+
def build
|
2874
|
+
Node::Keyword.new(text_value)
|
2727
2875
|
end
|
2728
2876
|
end
|
2729
2877
|
|
@@ -2794,7 +2942,7 @@ module Less
|
|
2794
2942
|
|
2795
2943
|
module String2
|
2796
2944
|
def value
|
2797
|
-
text_value
|
2945
|
+
content.text_value
|
2798
2946
|
end
|
2799
2947
|
end
|
2800
2948
|
|
@@ -2810,7 +2958,7 @@ module Less
|
|
2810
2958
|
|
2811
2959
|
module String5
|
2812
2960
|
def value
|
2813
|
-
text_value
|
2961
|
+
content.text_value
|
2814
2962
|
end
|
2815
2963
|
end
|
2816
2964
|
|
@@ -3271,8 +3419,8 @@ module Less
|
|
3271
3419
|
end
|
3272
3420
|
|
3273
3421
|
module Color1
|
3274
|
-
def build
|
3275
|
-
|
3422
|
+
def build
|
3423
|
+
Node::Color.new(*rgb.build)
|
3276
3424
|
end
|
3277
3425
|
end
|
3278
3426
|
|
@@ -3290,8 +3438,8 @@ module Less
|
|
3290
3438
|
end
|
3291
3439
|
|
3292
3440
|
module Color4
|
3293
|
-
def build
|
3294
|
-
|
3441
|
+
def build
|
3442
|
+
Node::Function.new(fn.text_value, arguments.build.flatten)
|
3295
3443
|
end
|
3296
3444
|
end
|
3297
3445
|
|
@@ -3607,8 +3755,8 @@ module Less
|
|
3607
3755
|
end
|
3608
3756
|
|
3609
3757
|
module Function1
|
3610
|
-
def build
|
3611
|
-
|
3758
|
+
def build
|
3759
|
+
Node::Function.new(name.text_value, [arguments.build].flatten)
|
3612
3760
|
end
|
3613
3761
|
end
|
3614
3762
|
|
data/spec/css/parens.css
ADDED
data/spec/engine_spec.rb
CHANGED
data/spec/less/operations.less
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
.parens {
|
2
|
+
@var: 1px;
|
3
|
+
border: (@var * 2) solid black;
|
4
|
+
margin: (@var * 1) (@var + 2) (4 * 4) 3;
|
5
|
+
width: (6 * 6);
|
6
|
+
padding: 2px (6px * 6px);
|
7
|
+
}
|
8
|
+
|
9
|
+
.more-parens {
|
10
|
+
@var: (2 * 2);
|
11
|
+
padding: (2 * @var) 4 4 (@var * 1px);
|
12
|
+
//width: (@var * @var) * 6;
|
13
|
+
//margin: (6 * 6)px;
|
14
|
+
//height: (7 * 7) + (8 * 8);
|
15
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: less
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cloudhead
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-23 00:00:00 -04:00
|
13
13
|
default_executable: lessc
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- spec/css/mixins-args.css
|
148
148
|
- spec/css/mixins.css
|
149
149
|
- spec/css/operations.css
|
150
|
+
- spec/css/parens.css
|
150
151
|
- spec/css/rulesets.css
|
151
152
|
- spec/css/scope.css
|
152
153
|
- spec/css/selectors.css
|
@@ -173,6 +174,7 @@ files:
|
|
173
174
|
- spec/less/mixins-args.less
|
174
175
|
- spec/less/mixins.less
|
175
176
|
- spec/less/operations.less
|
177
|
+
- spec/less/parens.less
|
176
178
|
- spec/less/rulesets.less
|
177
179
|
- spec/less/scope.less
|
178
180
|
- spec/less/selectors.less
|