cloudhead-less 1.0.13 → 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/Rakefile CHANGED
@@ -69,7 +69,7 @@ begin
69
69
 
70
70
  task :benchmark do
71
71
  print "benchmarking... "
72
- less = File.read("spec/less/big-1.0.less")
72
+ less = File.read("spec/less/big.less")
73
73
  start = Time.now.to_f
74
74
  Less::Engine.new(less).parse
75
75
  total = Time.now.to_f - start
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.13
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.13"
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-20}
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",
@@ -100,20 +100,47 @@ grammar Less
100
100
  # height: 100%;
101
101
  #
102
102
  rule declaration
103
- ws name:(ident / variable) s ':' s expression s (';'/ ws &'}') ws {
103
+ ws name:(ident / variable) s ':' s expressions s (';'/ ws &'}') ws {
104
104
  def build env
105
- env << (name.text_value =~ /^@/ ? Node::Variable : Node::Property).new(name.text_value, [])
106
- expression.build env
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
- entity (operator / S / WS) expression <Builder> / entity
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 env
129
- fonts = ([font] + family.elements.map {|f| f.font }).map do |font|
130
- font.build env
131
- end
132
- env.identifiers.last << Node::FontFamily.new(fonts)
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 env
167
+ def build
140
168
  Node::Keyword.new(text_value)
141
169
  end
142
170
  } / string {
143
- def build env
171
+ def build
144
172
  Node::String.new(text_value)
145
173
  end
146
174
  }
@@ -150,13 +178,13 @@ grammar Less
150
178
  # An identifier
151
179
  #
152
180
  rule ident
153
- '-'? [-a-z0-9_]+
181
+ '*'? '-'? [-a-z0-9_]+
154
182
  end
155
183
 
156
184
  rule variable
157
185
  '@' [-a-zA-Z0-9_]+ {
158
- def build env
159
- env.identifiers.last << Node::Variable.new(text_value)
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.identifiers.last << env.nearest(ident.text_value)[attr.text_value.delete(%q["'])].evaluate
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 env
210
- env.identifiers.last << Node::Operator.new(text_value.strip)
237
+ def build
238
+ Node::Operator.new(text_value.strip)
211
239
  end
212
240
  } / [-+*/] {
213
- def build env
214
- env.identifiers.last << Node::Operator.new(text_value)
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 env
225
- env.identifiers.last << Node::Anonymous.new(text_value)
252
+ def build
253
+ Node::Anonymous.new(text_value)
226
254
  end
227
255
  } / number unit {
228
- def build env
229
- env.identifiers.last << Node::Number.new(number.text_value, unit.text_value)
256
+ def build
257
+ Node::Number.new(number.text_value, unit.text_value)
230
258
  end
231
259
  } / string {
232
- def build env
233
- env.identifiers.last << Node::String.new(text_value)
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 env
242
- env.identifiers.last << Node::Keyword.new(text_value)
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 env
253
- env.identifiers.last << Node::Keyword.new(text_value)
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[1...-1]
292
+ content.text_value
265
293
  end
266
294
  } / ["] content:(!["] . )* ["] {
267
295
  def value
268
- text_value[1...-1]
296
+ content.text_value
269
297
  end
270
298
  }
271
299
  end
@@ -291,12 +319,12 @@ grammar Less
291
319
  #
292
320
  rule color
293
321
  '#' rgb {
294
- def build env
295
- env.identifiers.last << Node::Color.new(*rgb.build)
322
+ def build
323
+ Node::Color.new(*rgb.build)
296
324
  end
297
325
  } / fn:(('hsl'/'rgb') 'a'?) arguments {
298
- def build env
299
- env.identifiers.last << Node::Function.new(fn.text_value, arguments.build.flatten)
326
+ def build
327
+ Node::Function.new(fn.text_value, arguments.build.flatten)
300
328
  end
301
329
  }
302
330
  end
@@ -325,8 +353,8 @@ grammar Less
325
353
  #
326
354
  rule function
327
355
  name:([-a-zA-Z_]+) arguments {
328
- def build env
329
- env.identifiers.last << Node::Function.new(name.text_value, [arguments.build].flatten)
356
+ def build
357
+ Node::Function.new(name.text_value, [arguments.build].flatten)
330
358
  end
331
359
  }
332
360
  end
@@ -69,5 +69,11 @@ module Less
69
69
  self
70
70
  end
71
71
  end
72
+
73
+ class Paren < ::String
74
+ def to_ruby
75
+ self
76
+ end
77
+ end
72
78
  end
73
79
  end
@@ -135,15 +135,15 @@ module Less
135
135
  include Literal
136
136
  end
137
137
 
138
- class FontFamily < Array
138
+ class FontFamily
139
139
  include Literal
140
140
 
141
141
  def initialize family = []
142
- super family
142
+ @family = family
143
143
  end
144
144
 
145
145
  def to_css
146
- self.map(&:to_css) * ', '
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
- @value = Expression.new(value ? [value].flatten : [])
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.is_a? Operator
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
- def initialize ary
80
- super [ary].flatten
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 {|i| i.to_css } * ' '
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 && (entities.size == operators.size + 1)
102
-
103
- # Create a sub-expression with all the variables/properties evaluated
104
- evaluated = Expression.new map {|e| e.respond_to?(:evaluate) ? e.evaluate : e }
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 = evaluated.literals.find {|e| e.unit == unit } || evaluated.first
113
- ruby = map {|e| e.to_ruby if e.respond_to? :to_ruby }
114
-
115
- unless ruby.include? nil
116
- if entity
117
- result = eval(ruby.join)
118
- if result.is_a? Entity
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
@@ -622,8 +622,8 @@ module Less
622
622
  else
623
623
  s4, i4 = [], index
624
624
  loop do
625
- if has_terminal?('[-a-zA-Z0-9_%$/.&=:;#+?]', true, index)
626
- r5 = true
625
+ if has_terminal?('\G[-a-zA-Z0-9_%$/.&=:;#+?]', true, index)
626
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
627
627
  @index += 1
628
628
  else
629
629
  r5 = nil
@@ -698,8 +698,8 @@ module Less
698
698
  i0, s0 = index, []
699
699
  s1, i1 = [], index
700
700
  loop do
701
- if has_terminal?('[-a-z]', true, index)
702
- r2 = true
701
+ if has_terminal?('\G[-a-z]', true, index)
702
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
703
703
  @index += 1
704
704
  else
705
705
  r2 = nil
@@ -738,8 +738,8 @@ module Less
738
738
  if r7
739
739
  s8, i8 = [], index
740
740
  loop do
741
- if has_terminal?('[a-z]', true, index)
742
- r9 = true
741
+ if has_terminal?('\G[a-z]', true, index)
742
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
743
743
  @index += 1
744
744
  else
745
745
  r9 = nil
@@ -1039,7 +1039,7 @@ module Less
1039
1039
  elements[4]
1040
1040
  end
1041
1041
 
1042
- def expression
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 =~ /^@/ ? Node::Variable : Node::Property).new(name.text_value, [])
1058
- expression.build env
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 = _nt_expression
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 expression
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 = _nt_entity
1376
+ r2 = _nt_s
1282
1377
  s1 << r2
1283
1378
  if r2
1284
- i3 = index
1285
- r4 = _nt_operator
1286
- if r4
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
- r5 = _nt_S
1290
- if r5
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
- r7 = _nt_expression
1305
- s1 << r7
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(Builder,input, i1...index, s1)
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
- r8 = _nt_entity
1319
- if r8
1320
- r0 = r8
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
@@ -1329,6 +1476,92 @@ module Less
1329
1476
  r0
1330
1477
  end
1331
1478
 
1479
+ def _nt_separator
1480
+ start_index = index
1481
+ if node_cache[:separator].has_key?(index)
1482
+ cached = node_cache[:separator][index]
1483
+ @index = cached.interval.end if cached
1484
+ return cached
1485
+ end
1486
+
1487
+ i0 = index
1488
+ r1 = _nt_operator
1489
+ if r1
1490
+ r0 = r1
1491
+ else
1492
+ r2 = _nt_S
1493
+ if r2
1494
+ r0 = r2
1495
+ else
1496
+ r3 = _nt_WS
1497
+ if r3
1498
+ r0 = r3
1499
+ else
1500
+ @index = i0
1501
+ r0 = nil
1502
+ end
1503
+ end
1504
+ end
1505
+
1506
+ node_cache[:separator][start_index] = r0
1507
+
1508
+ r0
1509
+ end
1510
+
1511
+ module Paren0
1512
+ def s
1513
+ elements[0]
1514
+ end
1515
+
1516
+ def s
1517
+ elements[2]
1518
+ end
1519
+ end
1520
+
1521
+ module Paren1
1522
+ def build
1523
+ Node::Paren.new(text_value.strip)
1524
+ end
1525
+ end
1526
+
1527
+ def _nt_paren
1528
+ start_index = index
1529
+ if node_cache[:paren].has_key?(index)
1530
+ cached = node_cache[:paren][index]
1531
+ @index = cached.interval.end if cached
1532
+ return cached
1533
+ end
1534
+
1535
+ i0, s0 = index, []
1536
+ r1 = _nt_s
1537
+ s0 << r1
1538
+ if r1
1539
+ if has_terminal?('\G[()]', true, index)
1540
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
1541
+ @index += 1
1542
+ else
1543
+ r2 = nil
1544
+ end
1545
+ s0 << r2
1546
+ if r2
1547
+ r3 = _nt_s
1548
+ s0 << r3
1549
+ end
1550
+ end
1551
+ if s0.last
1552
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1553
+ r0.extend(Paren0)
1554
+ r0.extend(Paren1)
1555
+ else
1556
+ @index = i0
1557
+ r0 = nil
1558
+ end
1559
+
1560
+ node_cache[:paren][start_index] = r0
1561
+
1562
+ r0
1563
+ end
1564
+
1332
1565
  def _nt_entity
1333
1566
  start_index = index
1334
1567
  if node_cache[:entity].has_key?(index)
@@ -1406,11 +1639,15 @@ module Less
1406
1639
  end
1407
1640
 
1408
1641
  module Fonts2
1409
- def build env
1410
- fonts = ([font] + family.elements.map {|f| f.font }).map do |font|
1411
- font.build env
1642
+ def build
1643
+ fonts = all.map do |font|
1644
+ font.build
1412
1645
  end
1413
- env.identifiers.last << Node::FontFamily.new(fonts)
1646
+ Node::FontFamily.new(all.map(&:build))
1647
+ end
1648
+
1649
+ def all
1650
+ [font] + family.elements.map {|f| f.font }
1414
1651
  end
1415
1652
  end
1416
1653
 
@@ -1488,13 +1725,13 @@ module Less
1488
1725
  end
1489
1726
 
1490
1727
  module Font1
1491
- def build env
1728
+ def build
1492
1729
  Node::Keyword.new(text_value)
1493
1730
  end
1494
1731
  end
1495
1732
 
1496
1733
  module Font2
1497
- def build env
1734
+ def build
1498
1735
  Node::String.new(text_value)
1499
1736
  end
1500
1737
  end
@@ -1509,8 +1746,8 @@ module Less
1509
1746
 
1510
1747
  i0 = index
1511
1748
  i1, s1 = index, []
1512
- if has_terminal?('[a-zA-Z]', true, index)
1513
- r2 = true
1749
+ if has_terminal?('\G[a-zA-Z]', true, index)
1750
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
1514
1751
  @index += 1
1515
1752
  else
1516
1753
  r2 = nil
@@ -1519,8 +1756,8 @@ module Less
1519
1756
  if r2
1520
1757
  s3, i3 = [], index
1521
1758
  loop do
1522
- if has_terminal?('[-a-zA-Z0-9]', true, index)
1523
- r4 = true
1759
+ if has_terminal?('\G[-a-zA-Z0-9]', true, index)
1760
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
1524
1761
  @index += 1
1525
1762
  else
1526
1763
  r4 = nil
@@ -1572,11 +1809,11 @@ module Less
1572
1809
  end
1573
1810
 
1574
1811
  i0, s0 = index, []
1575
- if has_terminal?('-', false, index)
1812
+ if has_terminal?('*', false, index)
1576
1813
  r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
1577
1814
  @index += 1
1578
1815
  else
1579
- terminal_parse_failure('-')
1816
+ terminal_parse_failure('*')
1580
1817
  r2 = nil
1581
1818
  end
1582
1819
  if r2
@@ -1586,27 +1823,42 @@ module Less
1586
1823
  end
1587
1824
  s0 << r1
1588
1825
  if r1
1589
- s3, i3 = [], index
1590
- loop do
1591
- if has_terminal?('[-a-z0-9_]', true, index)
1592
- r4 = true
1593
- @index += 1
1594
- else
1595
- r4 = nil
1596
- end
1597
- if r4
1598
- s3 << r4
1599
- else
1600
- break
1601
- end
1826
+ if has_terminal?('-', false, index)
1827
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
1828
+ @index += 1
1829
+ else
1830
+ terminal_parse_failure('-')
1831
+ r4 = nil
1602
1832
  end
1603
- if s3.empty?
1604
- @index = i3
1605
- r3 = nil
1833
+ if r4
1834
+ r3 = r4
1606
1835
  else
1607
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1836
+ r3 = instantiate_node(SyntaxNode,input, index...index)
1608
1837
  end
1609
1838
  s0 << r3
1839
+ if r3
1840
+ s5, i5 = [], index
1841
+ loop do
1842
+ if has_terminal?('\G[-a-z0-9_]', true, index)
1843
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1844
+ @index += 1
1845
+ else
1846
+ r6 = nil
1847
+ end
1848
+ if r6
1849
+ s5 << r6
1850
+ else
1851
+ break
1852
+ end
1853
+ end
1854
+ if s5.empty?
1855
+ @index = i5
1856
+ r5 = nil
1857
+ else
1858
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
1859
+ end
1860
+ s0 << r5
1861
+ end
1610
1862
  end
1611
1863
  if s0.last
1612
1864
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
@@ -1625,8 +1877,8 @@ module Less
1625
1877
  end
1626
1878
 
1627
1879
  module Variable1
1628
- def build env
1629
- env.identifiers.last << Node::Variable.new(text_value)
1880
+ def build
1881
+ Node::Variable.new(text_value)
1630
1882
  end
1631
1883
  end
1632
1884
 
@@ -1650,8 +1902,8 @@ module Less
1650
1902
  if r1
1651
1903
  s2, i2 = [], index
1652
1904
  loop do
1653
- if has_terminal?('[-a-zA-Z0-9_]', true, index)
1654
- r3 = true
1905
+ if has_terminal?('\G[-a-zA-Z0-9_]', true, index)
1906
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
1655
1907
  @index += 1
1656
1908
  else
1657
1909
  r3 = nil
@@ -1946,8 +2198,8 @@ module Less
1946
2198
  s1 << r3
1947
2199
  if r3
1948
2200
  i4, s4 = index, []
1949
- if has_terminal?('[|~*$^]', true, index)
1950
- r6 = true
2201
+ if has_terminal?('\G[|~*$^]', true, index)
2202
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1951
2203
  @index += 1
1952
2204
  else
1953
2205
  r6 = nil
@@ -2090,8 +2342,8 @@ module Less
2090
2342
  end
2091
2343
  s0 << r1
2092
2344
  if r1
2093
- if has_terminal?('[_a-z]', true, index)
2094
- r2 = true
2345
+ if has_terminal?('\G[_a-z]', true, index)
2346
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
2095
2347
  @index += 1
2096
2348
  else
2097
2349
  r2 = nil
@@ -2100,8 +2352,8 @@ module Less
2100
2352
  if r2
2101
2353
  s3, i3 = [], index
2102
2354
  loop do
2103
- if has_terminal?('[-a-zA-Z0-9_]', true, index)
2104
- r4 = true
2355
+ if has_terminal?('\G[-a-zA-Z0-9_]', true, index)
2356
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
2105
2357
  @index += 1
2106
2358
  else
2107
2359
  r4 = nil
@@ -2150,8 +2402,8 @@ module Less
2150
2402
  end
2151
2403
  s0 << r1
2152
2404
  if r1
2153
- if has_terminal?('[_a-z]', true, index)
2154
- r2 = true
2405
+ if has_terminal?('\G[_a-z]', true, index)
2406
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
2155
2407
  @index += 1
2156
2408
  else
2157
2409
  r2 = nil
@@ -2160,8 +2412,8 @@ module Less
2160
2412
  if r2
2161
2413
  s3, i3 = [], index
2162
2414
  loop do
2163
- if has_terminal?('[-a-zA-Z0-9_]', true, index)
2164
- r4 = true
2415
+ if has_terminal?('\G[-a-zA-Z0-9_]', true, index)
2416
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
2165
2417
  @index += 1
2166
2418
  else
2167
2419
  r4 = nil
@@ -2202,8 +2454,8 @@ module Less
2202
2454
 
2203
2455
  i0 = index
2204
2456
  i1, s1 = index, []
2205
- if has_terminal?('[a-zA-Z]', true, index)
2206
- r2 = true
2457
+ if has_terminal?('\G[a-zA-Z]', true, index)
2458
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
2207
2459
  @index += 1
2208
2460
  else
2209
2461
  r2 = nil
@@ -2212,8 +2464,8 @@ module Less
2212
2464
  if r2
2213
2465
  s3, i3 = [], index
2214
2466
  loop do
2215
- if has_terminal?('[-a-zA-Z]', true, index)
2216
- r4 = true
2467
+ if has_terminal?('\G[-a-zA-Z]', true, index)
2468
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
2217
2469
  @index += 1
2218
2470
  else
2219
2471
  r4 = nil
@@ -2227,8 +2479,8 @@ module Less
2227
2479
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2228
2480
  s1 << r3
2229
2481
  if r3
2230
- if has_terminal?('[0-9]', true, index)
2231
- r6 = true
2482
+ if has_terminal?('\G[0-9]', true, index)
2483
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
2232
2484
  @index += 1
2233
2485
  else
2234
2486
  r6 = nil
@@ -2301,8 +2553,8 @@ module Less
2301
2553
  r3 = _nt_s
2302
2554
  s2 << r3
2303
2555
  if r3
2304
- if has_terminal?('[+>~]', true, index)
2305
- r4 = true
2556
+ if has_terminal?('\G[+>~]', true, index)
2557
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
2306
2558
  @index += 1
2307
2559
  else
2308
2560
  r4 = nil
@@ -2379,7 +2631,7 @@ module Less
2379
2631
 
2380
2632
  module Accessor1
2381
2633
  def build env
2382
- env.identifiers.last << env.nearest(ident.text_value)[attr.text_value.delete(%q["'])].evaluate
2634
+ env.nearest(ident.text_value)[attr.text_value.delete(%q["'])].evaluate
2383
2635
  end
2384
2636
  end
2385
2637
 
@@ -2467,14 +2719,14 @@ module Less
2467
2719
  end
2468
2720
 
2469
2721
  module Operator1
2470
- def build env
2471
- env.identifiers.last << Node::Operator.new(text_value.strip)
2722
+ def build
2723
+ Node::Operator.new(text_value.strip)
2472
2724
  end
2473
2725
  end
2474
2726
 
2475
2727
  module Operator2
2476
- def build env
2477
- env.identifiers.last << Node::Operator.new(text_value)
2728
+ def build
2729
+ Node::Operator.new(text_value)
2478
2730
  end
2479
2731
  end
2480
2732
 
@@ -2491,8 +2743,8 @@ module Less
2491
2743
  r2 = _nt_S
2492
2744
  s1 << r2
2493
2745
  if r2
2494
- if has_terminal?('[-+*/]', true, index)
2495
- r3 = true
2746
+ if has_terminal?('\G[-+*/]', true, index)
2747
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
2496
2748
  @index += 1
2497
2749
  else
2498
2750
  r3 = nil
@@ -2514,7 +2766,7 @@ module Less
2514
2766
  if r1
2515
2767
  r0 = r1
2516
2768
  else
2517
- if has_terminal?('[-+*/]', true, index)
2769
+ if has_terminal?('\G[-+*/]', true, index)
2518
2770
  r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
2519
2771
  r5.extend(Operator2)
2520
2772
  @index += 1
@@ -2541,8 +2793,8 @@ module Less
2541
2793
  end
2542
2794
 
2543
2795
  module Literal1
2544
- def build env
2545
- env.identifiers.last << Node::Anonymous.new(text_value)
2796
+ def build
2797
+ Node::Anonymous.new(text_value)
2546
2798
  end
2547
2799
  end
2548
2800
 
@@ -2557,14 +2809,14 @@ module Less
2557
2809
  end
2558
2810
 
2559
2811
  module Literal3
2560
- def build env
2561
- env.identifiers.last << Node::Number.new(number.text_value, unit.text_value)
2812
+ def build
2813
+ Node::Number.new(number.text_value, unit.text_value)
2562
2814
  end
2563
2815
  end
2564
2816
 
2565
2817
  module Literal4
2566
- def build env
2567
- env.identifiers.last << Node::String.new(text_value)
2818
+ def build
2819
+ Node::String.new(text_value)
2568
2820
  end
2569
2821
  end
2570
2822
 
@@ -2589,8 +2841,8 @@ module Less
2589
2841
  else
2590
2842
  s5, i5 = [], index
2591
2843
  loop do
2592
- if has_terminal?('[-a-z]', true, index)
2593
- r6 = true
2844
+ if has_terminal?('\G[-a-z]', true, index)
2845
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
2594
2846
  @index += 1
2595
2847
  else
2596
2848
  r6 = nil
@@ -2676,8 +2928,8 @@ module Less
2676
2928
  end
2677
2929
 
2678
2930
  module Important0
2679
- def build env
2680
- env.identifiers.last << Node::Keyword.new(text_value)
2931
+ def build
2932
+ Node::Keyword.new(text_value)
2681
2933
  end
2682
2934
  end
2683
2935
 
@@ -2707,8 +2959,8 @@ module Less
2707
2959
  end
2708
2960
 
2709
2961
  module Keyword1
2710
- def build env
2711
- env.identifiers.last << Node::Keyword.new(text_value)
2962
+ def build
2963
+ Node::Keyword.new(text_value)
2712
2964
  end
2713
2965
  end
2714
2966
 
@@ -2723,8 +2975,8 @@ module Less
2723
2975
  i0, s0 = index, []
2724
2976
  s1, i1 = [], index
2725
2977
  loop do
2726
- if has_terminal?('[-a-zA-Z]', true, index)
2727
- r2 = true
2978
+ if has_terminal?('\G[-a-zA-Z]', true, index)
2979
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
2728
2980
  @index += 1
2729
2981
  else
2730
2982
  r2 = nil
@@ -2779,7 +3031,7 @@ module Less
2779
3031
 
2780
3032
  module String2
2781
3033
  def value
2782
- text_value[1...-1]
3034
+ content.text_value
2783
3035
  end
2784
3036
  end
2785
3037
 
@@ -2795,7 +3047,7 @@ module Less
2795
3047
 
2796
3048
  module String5
2797
3049
  def value
2798
- text_value[1...-1]
3050
+ content.text_value
2799
3051
  end
2800
3052
  end
2801
3053
 
@@ -2884,8 +3136,8 @@ module Less
2884
3136
  r0 = r1
2885
3137
  else
2886
3138
  i9, s9 = index, []
2887
- if has_terminal?('["]', true, index)
2888
- r10 = true
3139
+ if has_terminal?('\G["]', true, index)
3140
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
2889
3141
  @index += 1
2890
3142
  else
2891
3143
  r10 = nil
@@ -2896,8 +3148,8 @@ module Less
2896
3148
  loop do
2897
3149
  i12, s12 = index, []
2898
3150
  i13 = index
2899
- if has_terminal?('["]', true, index)
2900
- r14 = true
3151
+ if has_terminal?('\G["]', true, index)
3152
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
2901
3153
  @index += 1
2902
3154
  else
2903
3155
  r14 = nil
@@ -2935,8 +3187,8 @@ module Less
2935
3187
  r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
2936
3188
  s9 << r11
2937
3189
  if r11
2938
- if has_terminal?('["]', true, index)
2939
- r16 = true
3190
+ if has_terminal?('\G["]', true, index)
3191
+ r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
2940
3192
  @index += 1
2941
3193
  else
2942
3194
  r16 = nil
@@ -3035,8 +3287,8 @@ module Less
3035
3287
  if r2
3036
3288
  s4, i4 = [], index
3037
3289
  loop do
3038
- if has_terminal?('[0-9]', true, index)
3039
- r5 = true
3290
+ if has_terminal?('\G[0-9]', true, index)
3291
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
3040
3292
  @index += 1
3041
3293
  else
3042
3294
  r5 = nil
@@ -3061,8 +3313,8 @@ module Less
3061
3313
  if r6
3062
3314
  s7, i7 = [], index
3063
3315
  loop do
3064
- if has_terminal?('[0-9]', true, index)
3065
- r8 = true
3316
+ if has_terminal?('\G[0-9]', true, index)
3317
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
3066
3318
  @index += 1
3067
3319
  else
3068
3320
  r8 = nil
@@ -3110,8 +3362,8 @@ module Less
3110
3362
  if r10
3111
3363
  s12, i12 = [], index
3112
3364
  loop do
3113
- if has_terminal?('[0-9]', true, index)
3114
- r13 = true
3365
+ if has_terminal?('\G[0-9]', true, index)
3366
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
3115
3367
  @index += 1
3116
3368
  else
3117
3369
  r13 = nil
@@ -3256,8 +3508,8 @@ module Less
3256
3508
  end
3257
3509
 
3258
3510
  module Color1
3259
- def build env
3260
- env.identifiers.last << Node::Color.new(*rgb.build)
3511
+ def build
3512
+ Node::Color.new(*rgb.build)
3261
3513
  end
3262
3514
  end
3263
3515
 
@@ -3275,8 +3527,8 @@ module Less
3275
3527
  end
3276
3528
 
3277
3529
  module Color4
3278
- def build env
3279
- env.identifiers.last << Node::Function.new(fn.text_value, arguments.build.flatten)
3530
+ def build
3531
+ Node::Function.new(fn.text_value, arguments.build.flatten)
3280
3532
  end
3281
3533
  end
3282
3534
 
@@ -3569,7 +3821,7 @@ module Less
3569
3821
  return cached
3570
3822
  end
3571
3823
 
3572
- if has_terminal?('[a-fA-F0-9]', true, index)
3824
+ if has_terminal?('\G[a-fA-F0-9]', true, index)
3573
3825
  r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
3574
3826
  @index += 1
3575
3827
  else
@@ -3592,8 +3844,8 @@ module Less
3592
3844
  end
3593
3845
 
3594
3846
  module Function1
3595
- def build env
3596
- env.identifiers.last << Node::Function.new(name.text_value, [arguments.build].flatten)
3847
+ def build
3848
+ Node::Function.new(name.text_value, [arguments.build].flatten)
3597
3849
  end
3598
3850
  end
3599
3851
 
@@ -3608,8 +3860,8 @@ module Less
3608
3860
  i0, s0 = index, []
3609
3861
  s1, i1 = [], index
3610
3862
  loop do
3611
- if has_terminal?('[-a-zA-Z_]', true, index)
3612
- r2 = true
3863
+ if has_terminal?('\G[-a-zA-Z_]', true, index)
3864
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
3613
3865
  @index += 1
3614
3866
  else
3615
3867
  r2 = nil
@@ -3869,8 +4121,8 @@ module Less
3869
4121
  i6, s6 = index, []
3870
4122
  s7, i7 = [], index
3871
4123
  loop do
3872
- if has_terminal?('[a-zA-Z]', true, index)
3873
- r8 = true
4124
+ if has_terminal?('\G[a-zA-Z]', true, index)
4125
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
3874
4126
  @index += 1
3875
4127
  else
3876
4128
  r8 = nil
@@ -3915,8 +4167,8 @@ module Less
3915
4167
  else
3916
4168
  s11, i11 = [], index
3917
4169
  loop do
3918
- if has_terminal?('[-a-zA-Z0-9_%$/.&=:;#+?]', true, index)
3919
- r12 = true
4170
+ if has_terminal?('\G[-a-zA-Z0-9_%$/.&=:;#+?]', true, index)
4171
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
3920
4172
  @index += 1
3921
4173
  else
3922
4174
  r12 = nil
@@ -3960,8 +4212,8 @@ module Less
3960
4212
 
3961
4213
  s0, i0 = [], index
3962
4214
  loop do
3963
- if has_terminal?('[ ]', true, index)
3964
- r1 = true
4215
+ if has_terminal?('\G[ ]', true, index)
4216
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
3965
4217
  @index += 1
3966
4218
  else
3967
4219
  r1 = nil
@@ -3989,8 +4241,8 @@ module Less
3989
4241
 
3990
4242
  s0, i0 = [], index
3991
4243
  loop do
3992
- if has_terminal?('[ ]', true, index)
3993
- r1 = true
4244
+ if has_terminal?('\G[ ]', true, index)
4245
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
3994
4246
  @index += 1
3995
4247
  else
3996
4248
  r1 = nil
@@ -4023,8 +4275,8 @@ module Less
4023
4275
 
4024
4276
  s0, i0 = [], index
4025
4277
  loop do
4026
- if has_terminal?('[\\n ]', true, index)
4027
- r1 = true
4278
+ if has_terminal?('\G[\\n ]', true, index)
4279
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
4028
4280
  @index += 1
4029
4281
  else
4030
4282
  r1 = nil
@@ -4052,8 +4304,8 @@ module Less
4052
4304
 
4053
4305
  s0, i0 = [], index
4054
4306
  loop do
4055
- if has_terminal?('[\\n ]', true, index)
4056
- r1 = true
4307
+ if has_terminal?('\G[\\n ]', true, index)
4308
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
4057
4309
  @index += 1
4058
4310
  else
4059
4311
  r1 = nil
@@ -4089,8 +4341,8 @@ module Less
4089
4341
 
4090
4342
  i0, s0 = index, []
4091
4343
  i1 = index
4092
- if has_terminal?('[ ;\\n]', true, index)
4093
- r2 = true
4344
+ if has_terminal?('\G[ ;\\n]', true, index)
4345
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
4094
4346
  @index += 1
4095
4347
  else
4096
4348
  r2 = nil