cloudhead-less 1.1.2 → 1.1.3

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/lib/less.rb CHANGED
@@ -7,8 +7,9 @@ require 'delegate'
7
7
 
8
8
  LESS_ROOT = File.expand_path(File.dirname(__FILE__))
9
9
  LESS_PARSER = File.join(LESS_ROOT, 'less', 'engine', 'parser.rb')
10
- LESS_GRAMMAR = File.join(LESS_ROOT, 'less', 'engine', 'less.tt')
10
+ LESS_GRAMMAR = File.join(LESS_ROOT, 'less', 'engine', 'grammar')
11
11
 
12
+ require 'ext'
12
13
  require 'less/command'
13
14
  require 'less/engine'
14
15
 
@@ -30,66 +31,3 @@ module Less
30
31
  Engine.new(less).to_css
31
32
  end
32
33
  end
33
-
34
- module Treetop
35
- module Runtime
36
- class CompiledParser
37
- def failure_message
38
- return nil unless (tf = terminal_failures) && tf.size > 0
39
- "on line #{failure_line}: expected " + (
40
- tf.size == 1 ?
41
- tf[0].expected_string :
42
- "one of #{Less::YELLOW[tf.map {|f| f.expected_string }.uniq * ' ']}"
43
- ) +
44
- " got #{Less::YELLOW[input[failure_index]]}" +
45
- " after:\n\n#{input[index...failure_index]}\n"
46
- end
47
- end
48
- end
49
- end
50
-
51
- class Object
52
- def verbose
53
- $verbose = true
54
- yield
55
- ensure
56
- $verbose = false
57
- end
58
-
59
- def tap
60
- yield self
61
- self
62
- end
63
-
64
- def log(s = '') puts "* #{s}" if $verbose end
65
- def log!(s = '') puts "* #{s}" end
66
- def error(s) $stderr.puts s end
67
- def error!(s) raise Exception, s end
68
- end
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
-
85
- class Class
86
- def to_sym
87
- self.to_s.to_sym
88
- end
89
- end
90
-
91
- class Symbol
92
- def to_proc
93
- proc {|obj, *args| obj.send(self, *args) }
94
- end
95
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudhead-less
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - cloudhead
@@ -30,11 +30,14 @@ files:
30
30
  - VERSION
31
31
  - bin/lessc
32
32
  - less.gemspec
33
+ - lib/ext.rb
33
34
  - lib/less.rb
34
35
  - lib/less/command.rb
35
36
  - lib/less/engine.rb
36
37
  - lib/less/engine/builder.rb
37
- - lib/less/engine/less.tt
38
+ - lib/less/engine/grammar/common.tt
39
+ - lib/less/engine/grammar/entity.tt
40
+ - lib/less/engine/grammar/less.tt
38
41
  - lib/less/engine/nodes.rb
39
42
  - lib/less/engine/nodes/element.rb
40
43
  - lib/less/engine/nodes/entity.rb
@@ -43,7 +46,6 @@ files:
43
46
  - lib/less/engine/nodes/property.rb
44
47
  - lib/less/engine/nodes/ruleset.rb
45
48
  - lib/less/engine/nodes/selector.rb
46
- - lib/less/engine/parser.rb
47
49
  - lib/vendor/treetop/.gitignore
48
50
  - lib/vendor/treetop/LICENSE
49
51
  - lib/vendor/treetop/README
@@ -1,421 +0,0 @@
1
- grammar Less
2
- rule primary
3
- (declaration / ruleset / import / comment)+ <Builder> / declaration* <Builder> / import* <Builder> / comment*
4
- end
5
-
6
- rule comment
7
- ws '/*' (!'*/' . )* '*/' ws / ws '//' (!"\n" .)* "\n" ws
8
- end
9
-
10
- #
11
- # div, .class, body > p {...}
12
- #
13
- rule ruleset
14
- selectors "{" ws primary ws "}" ws {
15
- def build env
16
- # Build the ruleset for each selector
17
- selectors.build(env, :ruleset).each do |sel|
18
- primary.build sel
19
- end
20
- end
21
- } / ws selectors ';' ws {
22
- def build env
23
- selectors.build(env, :mixin).each do |path|
24
- rules = path.inject(env.root) do |current, node|
25
- current.descend(node.selector, node) or raise MixinNameError, path.join
26
- end.rules
27
- env.rules += rules
28
- end
29
- end
30
- }
31
- end
32
-
33
- rule import
34
- "@import" S url:(string / url) medias? s ';' ws {
35
- def build env
36
- path = File.join(env.root.file, url.value)
37
- path += '.less' unless path =~ /\.(le|c)ss$/
38
- if File.exist? path
39
- imported = Less::Engine.new(File.new(path)).to_tree
40
- env.rules += imported.rules
41
- else
42
- raise ImportError, path
43
- end
44
- end
45
- }
46
- end
47
-
48
- rule url
49
- 'url(' path:(string / [-a-zA-Z0-9_%$/.&=:;#+?]+) ')' {
50
- def build env = nil
51
- Node::String.new CGI.unescape(path.text_value)
52
- end
53
-
54
- def value
55
- build
56
- end
57
- }
58
- end
59
-
60
- rule medias
61
- [-a-z]+ (s ',' s [a-z]+)*
62
- end
63
-
64
- rule selectors
65
- ws selector tail:(s ',' ws selector)* ws {
66
- def build env, method
67
- all.map do |e|
68
- e.send(method, env) if e.respond_to? method
69
- end.compact
70
- end
71
-
72
- def all
73
- [selector] + tail.elements.map {|e| e.selector }
74
- end
75
- }
76
- end
77
-
78
- #
79
- # div > p a {...}
80
- #
81
- rule selector
82
- sel:(s select element s)+ arguments? {
83
- def ruleset env
84
- sel.elements.inject(env) do |node, e|
85
- node << Node::Element.new(e.element.text_value, e.select.text_value)
86
- node.last
87
- end
88
- end
89
-
90
- def mixin env
91
- sel.elements.map do |e|
92
- Node::Element.new(e.element.text_value, e.select.text_value)
93
- end
94
- end
95
- }
96
- end
97
-
98
- #
99
- # @my-var: 12px;
100
- # height: 100%;
101
- #
102
- rule declaration
103
- ws name:(ident / variable) s ':' s expressions s (';'/ ws &'}') ws {
104
- def build env
105
- env << (name.text_value =~ /^@/ ?
106
- Node::Variable : Node::Property).new(name.text_value, expressions.build(env), env)
107
- end
108
- # Empty rule
109
- } / ws ident s ':' s ';' ws
110
- end
111
-
112
- rule expressions
113
- expression+ {
114
- def build env
115
- elements.map do |e|
116
- e.build(env) if e.respond_to? :build
117
- end.compact
118
- end
119
- }
120
- end
121
-
122
- #
123
- # An operation or compound value
124
- #
125
- # TODO: we can refactor this, by separating entities from operators
126
- rule expression
127
- s '(' s expressions s ')' {
128
- def build env
129
- Node::Expression.new(['('] + expressions.build(env).flatten + [')'])
130
- end
131
- } / s 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
- } / operator
144
- end
145
-
146
- #
147
- # Entity: Any whitespace delimited token
148
- #
149
- rule entity
150
- function / fonts / keyword / accessor / variable / literal / important
151
- end
152
-
153
- rule fonts
154
- font family:(s ',' s font)+ {
155
- def build
156
- Node::FontFamily.new(all.map(&:build))
157
- end
158
-
159
- def all
160
- [font] + family.elements.map {|f| f.font }
161
- end
162
- }
163
- end
164
-
165
- rule font
166
- [a-zA-Z] [-a-zA-Z0-9]* {
167
- def build
168
- Node::Keyword.new(text_value)
169
- end
170
- } / string {
171
- def build
172
- Node::String.new(text_value)
173
- end
174
- }
175
- end
176
-
177
- #
178
- # An identifier
179
- #
180
- rule ident
181
- '*'? '-'? [-a-z0-9_]+
182
- end
183
-
184
- rule variable
185
- '@' [-a-zA-Z0-9_]+ {
186
- def build
187
- Node::Variable.new(text_value)
188
- end
189
- }
190
- end
191
-
192
- #
193
- # div / .class / #id / input[type="text"] / lang(fr)
194
- #
195
- rule element
196
- (class_id / tag / ident) attribute* ('(' ident? attribute* ')')? / attribute+ / '@media' / '@font-face'
197
- end
198
-
199
- rule class_id
200
- tag? (class / id)+
201
- end
202
-
203
- #
204
- # [type="text"]
205
- #
206
- rule attribute
207
- '[' tag ([|~*$^]? '=') (tag / string) ']' / '[' (tag / string) ']'
208
- end
209
-
210
- rule class
211
- '.' [_a-z] [-a-zA-Z0-9_]*
212
- end
213
-
214
- rule id
215
- '#' [_a-z] [-a-zA-Z0-9_]*
216
- end
217
-
218
- rule tag
219
- [a-zA-Z] [-a-zA-Z]* [0-9]? / '*'
220
- end
221
-
222
- rule select
223
- (s [+>~] s / s ':' / S)?
224
- end
225
-
226
- # TODO: Merge this with attribute rule
227
- rule accessor
228
- ident:(class_id / tag) '[' attr:(string / variable) ']' {
229
- def build env
230
- env.nearest(ident.text_value)[attr.text_value.delete(%q["'])].evaluate
231
- end
232
- }
233
- end
234
-
235
- rule operator
236
- S [-+*/] S {
237
- def build env
238
- Node::Operator.new(text_value.strip)
239
- end
240
- } / [-+*/] {
241
- def build env
242
- Node::Operator.new(text_value)
243
- end
244
- }
245
- end
246
-
247
- #
248
- # Tokens which don't need to be evaluated
249
- #
250
- rule literal
251
- color / (dimension / [-a-z]+) '/' dimension {
252
- def build
253
- Node::Anonymous.new(text_value)
254
- end
255
- } / number unit {
256
- def build
257
- Node::Number.new(number.text_value, unit.text_value)
258
- end
259
- } / string {
260
- def build
261
- Node::String.new(text_value)
262
- end
263
- }
264
- end
265
-
266
- # !important
267
- rule important
268
- '!important' {
269
- def build
270
- Node::Keyword.new(text_value)
271
- end
272
- }
273
- end
274
-
275
- #
276
- # `blue`, `small`, `normal` etc.
277
- #
278
- rule keyword
279
- [-a-zA-Z]+ !ns {
280
- def build
281
- Node::Keyword.new(text_value)
282
- end
283
- }
284
- end
285
-
286
- #
287
- # 'hello world' / "hello world"
288
- #
289
- rule string
290
- "'" content:(!"'" . )* "'" {
291
- def value
292
- content.text_value
293
- end
294
- } / ["] content:(!["] . )* ["] {
295
- def value
296
- content.text_value
297
- end
298
- }
299
- end
300
-
301
- #
302
- # Numbers & Units
303
- #
304
- rule dimension
305
- number unit
306
- end
307
-
308
- rule number
309
- '-'? [0-9]* '.' [0-9]+ / '-'? [0-9]+
310
- end
311
-
312
- rule unit
313
- ('px'/'em'/'pc'/'%'/'pt'/'cm'/'mm')?
314
- end
315
-
316
- #
317
- # Color
318
- #
319
- rule color
320
- '#' rgb {
321
- def build
322
- Node::Color.new(*rgb.build)
323
- end
324
- } / fn:(('hsl'/'rgb') 'a'?) arguments {
325
- def build
326
- Node::Function.new(fn.text_value, arguments.build.flatten)
327
- end
328
- }
329
- end
330
-
331
- #
332
- # 00ffdd / 0fd
333
- #
334
- rule rgb
335
- r:(hex hex) g:(hex hex) b:(hex hex) {
336
- def build
337
- [r.text_value, g.text_value, b.text_value]
338
- end
339
- } / r:hex g:hex b:hex {
340
- def build
341
- [r.text_value, g.text_value, b.text_value].map {|c| c * 2 }
342
- end
343
- }
344
- end
345
-
346
- rule hex
347
- [a-fA-F0-9]
348
- end
349
-
350
- #
351
- # Functions and arguments
352
- #
353
- rule function
354
- name:([-a-zA-Z_]+) arguments {
355
- def build
356
- Node::Function.new(name.text_value, [arguments.build].flatten)
357
- end
358
- }
359
- end
360
-
361
- rule arguments
362
- '(' s argument s tail:(',' s argument s)* ')' {
363
- def build
364
- all.map do |e|
365
- e.build if e.respond_to? :build
366
- end.compact
367
- end
368
-
369
- def all
370
- [argument] + tail.elements.map {|e| e.argument }
371
- end
372
- }
373
- end
374
-
375
- rule argument
376
- color / number unit {
377
- def build
378
- Node::Number.new number.text_value, unit.text_value
379
- end
380
- } / string {
381
- def build
382
- Node::String.new text_value
383
- end
384
- } / [a-zA-Z]+ '=' dimension {
385
- def build
386
- Node::Anonymous.new text_value
387
- end
388
- } / [-a-zA-Z0-9_%$/.&=:;#+?]+ {
389
- def build
390
- Node::String.new text_value
391
- end
392
- } / function / keyword other:(S keyword)* {
393
- def build
394
- end
395
- }
396
- end
397
-
398
- #
399
- # Whitespace
400
- #
401
- rule s
402
- [ ]*
403
- end
404
-
405
- rule S
406
- [ ]+
407
- end
408
-
409
- rule ws
410
- [\n ]*
411
- end
412
-
413
- rule WS
414
- [\n ]+
415
- end
416
-
417
- # Non-space char
418
- rule ns
419
- ![ ;\n] .
420
- end
421
- end