less 1.0.15 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|