less 1.2.13 → 1.2.14
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 +1 -1
- data/VERSION +1 -1
- data/bin/lessc +12 -6
- data/less.gemspec +5 -5
- data/lib/less.rb +4 -3
- data/lib/less/command.rb +6 -3
- data/lib/less/engine/grammar/less.tt +2 -2
- data/lib/less/engine/nodes/element.rb +9 -7
- data/lib/less/engine/nodes/property.rb +39 -39
- metadata +3 -3
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ begin
|
|
9
9
|
s.description = "LESS is leaner CSS"
|
10
10
|
s.rubyforge_project = 'less'
|
11
11
|
s.add_dependency('treetop', '>= 1.4.2')
|
12
|
-
s.add_dependency('mutter', '>= 0.
|
12
|
+
s.add_dependency('mutter', '>= 0.4.2')
|
13
13
|
end
|
14
14
|
Jeweler::GemcutterTasks.new
|
15
15
|
Jeweler::RubyforgeTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.14
|
data/bin/lessc
CHANGED
@@ -20,6 +20,7 @@ options = {
|
|
20
20
|
:compress => false,
|
21
21
|
:debug => false,
|
22
22
|
:growl => false,
|
23
|
+
:timestamps => false,
|
23
24
|
:color => $stdout.tty?
|
24
25
|
}
|
25
26
|
|
@@ -27,12 +28,12 @@ options = {
|
|
27
28
|
opts = OptionParser.new do |o|
|
28
29
|
o.banner = "usage: lessc source [destination] [--watch]"
|
29
30
|
o.separator ""
|
30
|
-
|
31
|
+
|
31
32
|
# Watch mode
|
32
33
|
o.on("-w", "--watch", "watch for changes") do
|
33
34
|
options[:watch] = true
|
34
35
|
end
|
35
|
-
|
36
|
+
|
36
37
|
# Growl
|
37
38
|
o.on("-g", "--growl", "growl notifications") do
|
38
39
|
if Less::GROWL && (Growl.installed? rescue false)
|
@@ -44,7 +45,12 @@ opts = OptionParser.new do |o|
|
|
44
45
|
"`sudo gem install visionmedia-growl -s http://gems.github.com`"
|
45
46
|
end
|
46
47
|
end
|
47
|
-
|
48
|
+
|
49
|
+
# Timestamps
|
50
|
+
o.on("-t", "--timestamps", "show timestamps in watch mode") do
|
51
|
+
options[:timestamps] = true
|
52
|
+
end
|
53
|
+
|
48
54
|
# No color in output
|
49
55
|
o.on("--no-color", "suppress color in output") do
|
50
56
|
options[:color] = false
|
@@ -53,13 +59,13 @@ opts = OptionParser.new do |o|
|
|
53
59
|
o.on('--verbose', 'show success messages when using growl') do
|
54
60
|
options[:verbose] = true
|
55
61
|
end
|
56
|
-
|
62
|
+
|
57
63
|
# Compression needs a proper algorithm
|
58
64
|
#
|
59
65
|
# o.on("-x", "--compress", "compress css file") do
|
60
66
|
# options[:compress] = true
|
61
67
|
# end
|
62
|
-
|
68
|
+
|
63
69
|
o.separator ""
|
64
70
|
|
65
71
|
# Help
|
@@ -67,7 +73,7 @@ opts = OptionParser.new do |o|
|
|
67
73
|
puts opts
|
68
74
|
exit
|
69
75
|
end
|
70
|
-
|
76
|
+
|
71
77
|
o.on_tail("-d", "--debug", "show full error messages") do
|
72
78
|
options[:debug] = true
|
73
79
|
end
|
data/less.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{less}
|
8
|
-
s.version = "1.2.
|
8
|
+
s.version = "1.2.14"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["cloudhead"]
|
12
|
-
s.date = %q{2009-11-
|
12
|
+
s.date = %q{2009-11-20}
|
13
13
|
s.default_executable = %q{lessc}
|
14
14
|
s.description = %q{LESS is leaner CSS}
|
15
15
|
s.email = %q{self@cloudhead.net}
|
@@ -112,14 +112,14 @@ Gem::Specification.new do |s|
|
|
112
112
|
|
113
113
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
114
114
|
s.add_runtime_dependency(%q<treetop>, [">= 1.4.2"])
|
115
|
-
s.add_runtime_dependency(%q<mutter>, [">= 0.
|
115
|
+
s.add_runtime_dependency(%q<mutter>, [">= 0.4.2"])
|
116
116
|
else
|
117
117
|
s.add_dependency(%q<treetop>, [">= 1.4.2"])
|
118
|
-
s.add_dependency(%q<mutter>, [">= 0.
|
118
|
+
s.add_dependency(%q<mutter>, [">= 0.4.2"])
|
119
119
|
end
|
120
120
|
else
|
121
121
|
s.add_dependency(%q<treetop>, [">= 1.4.2"])
|
122
|
-
s.add_dependency(%q<mutter>, [">= 0.
|
122
|
+
s.add_dependency(%q<mutter>, [">= 0.4.2"])
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
data/lib/less.rb
CHANGED
@@ -13,20 +13,21 @@ require 'ext'
|
|
13
13
|
require 'less/command'
|
14
14
|
require 'less/engine'
|
15
15
|
|
16
|
-
module Less
|
16
|
+
module Less
|
17
17
|
MixedUnitsError = Class.new(RuntimeError)
|
18
18
|
PathError = Class.new(RuntimeError)
|
19
19
|
VariableNameError = Class.new(NameError)
|
20
20
|
MixinNameError = Class.new(NameError)
|
21
21
|
SyntaxError = Class.new(RuntimeError)
|
22
22
|
ImportError = Class.new(RuntimeError)
|
23
|
-
|
23
|
+
CompileError = Class.new(RuntimeError)
|
24
|
+
|
24
25
|
$verbose = false
|
25
26
|
|
26
27
|
def self.version
|
27
28
|
File.read( File.join( File.dirname(__FILE__), '..', 'VERSION') ).strip
|
28
29
|
end
|
29
|
-
|
30
|
+
|
30
31
|
def self.parse less
|
31
32
|
Engine.new(less).to_css
|
32
33
|
end
|
data/lib/less/command.rb
CHANGED
@@ -37,6 +37,7 @@ module Less
|
|
37
37
|
|
38
38
|
# File has changed
|
39
39
|
if File.stat( @source ).mtime > File.stat( @destination ).mtime
|
40
|
+
print Time.now.strftime("%H:%M:%S -- ") if @options[:timestamps]
|
40
41
|
print "Change detected... "
|
41
42
|
|
42
43
|
# Loop until error is fixed
|
@@ -68,6 +69,8 @@ module Less
|
|
68
69
|
abort "#{e}"
|
69
70
|
rescue SyntaxError => e
|
70
71
|
err "#{e}\n", "Syntax"
|
72
|
+
rescue CompileError => e
|
73
|
+
err "#{e}\n", "Compile"
|
71
74
|
rescue MixedUnitsError => e
|
72
75
|
err "`#{e}` you're mixing units together! What do you expect?\n", "Mixed Units"
|
73
76
|
rescue PathError => e
|
@@ -97,9 +100,9 @@ module Less
|
|
97
100
|
false
|
98
101
|
end
|
99
102
|
end
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
+
|
104
|
+
private
|
105
|
+
|
103
106
|
def o ex, *styles
|
104
107
|
@mutter.process(ex.to_s, *(@options[:color] ? styles : []))
|
105
108
|
end
|
@@ -41,7 +41,7 @@ module Less
|
|
41
41
|
rule mixin
|
42
42
|
name:('.' [-a-zA-Z0-9_]+) args:(arguments) s ';' ws {
|
43
43
|
def build env
|
44
|
-
definition = env.nearest(name.text_value, :mixin) or raise MixinNameError, name.text_value
|
44
|
+
definition = env.nearest(name.text_value, :mixin) or raise MixinNameError, "#{name.text_value}() in #{env}"
|
45
45
|
params = args.build.map {|i| Node::Expression.new i } unless args.empty?
|
46
46
|
env << Node::Mixin::Call.new(definition, params || [], env)
|
47
47
|
end
|
@@ -49,7 +49,7 @@ module Less
|
|
49
49
|
def build env
|
50
50
|
selectors.build(env, :mixin).each do |path|
|
51
51
|
rules = path.inject(env.root) do |current, node|
|
52
|
-
current.descend(node.selector, node) or raise MixinNameError, selectors.text_value
|
52
|
+
current.descend(node.selector, node) or raise MixinNameError, "#{selectors.text_value} in #{env}"
|
53
53
|
end.rules
|
54
54
|
env.rules += rules
|
55
55
|
end
|
@@ -121,12 +121,6 @@ module Less
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
-
def mix arr = []
|
125
|
-
@rules += arr.map do |r|
|
126
|
-
r.copy.tap {|i| i.parent = self }
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
124
|
#
|
131
125
|
# Add an arbitrary node to this element
|
132
126
|
#
|
@@ -182,7 +176,7 @@ module Less
|
|
182
176
|
path.map do |node|
|
183
177
|
node.send(ary).find {|i| i.to_s == ident }
|
184
178
|
end.compact.first.tap do |result|
|
185
|
-
raise VariableNameError, ("#{ident} in #{self.to_s}")
|
179
|
+
raise VariableNameError, ("#{ident} in #{self.to_s}") if result.nil? && type != :mixin
|
186
180
|
end
|
187
181
|
end
|
188
182
|
|
@@ -248,6 +242,10 @@ module Less
|
|
248
242
|
end
|
249
243
|
|
250
244
|
def call args = []
|
245
|
+
if e = @rules.find {|r| r.is_a? Element }
|
246
|
+
raise CompileError, "#{e} in #{self.inspect}: can't nest selectors inside a dynamic mixin."
|
247
|
+
end
|
248
|
+
|
251
249
|
env = Element.new
|
252
250
|
|
253
251
|
@params.zip(args).each do |param, val|
|
@@ -270,6 +268,10 @@ module Less
|
|
270
268
|
'.' + name
|
271
269
|
end
|
272
270
|
|
271
|
+
def inspect
|
272
|
+
".#{name}()"
|
273
|
+
end
|
274
|
+
|
273
275
|
def to_css path, env
|
274
276
|
super(path, env)
|
275
277
|
end
|
@@ -2,9 +2,9 @@ module Less
|
|
2
2
|
module Node
|
3
3
|
class Property < String
|
4
4
|
include Entity
|
5
|
-
|
5
|
+
|
6
6
|
attr_accessor :value
|
7
|
-
|
7
|
+
|
8
8
|
def initialize key, value = nil, parent = nil
|
9
9
|
super key, parent
|
10
10
|
value = if value.is_a? Array
|
@@ -21,44 +21,44 @@ module Less
|
|
21
21
|
# puts "new property #{to_s}: #{value} => #{@value}, contains: #{@value[0].class}"
|
22
22
|
# puts
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def parent= obj
|
26
26
|
@parent = obj
|
27
27
|
value.parent = self
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def copy
|
31
31
|
clone.tap {|c| c.value = value.copy }
|
32
32
|
end
|
33
|
-
|
34
|
-
def << token
|
33
|
+
|
34
|
+
def << token
|
35
35
|
token = Node::Anonymous.new(*token) unless token.is_a? Entity or token.respond_to? :to_ruby
|
36
36
|
token.parent = self if token.respond_to? :parent
|
37
37
|
@value << token
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def empty?; !@value || @value.empty? end
|
41
41
|
|
42
42
|
def inspect
|
43
43
|
self + (empty?? "" : ": `#{value.map {|i| i.to_s } * ' | '}`")
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
def == other
|
47
47
|
self.to_s == other.to_s
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
def eql? other
|
51
51
|
self == other and value.eql? other.value
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def to_s
|
55
55
|
super
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def nearest node
|
59
59
|
parent.nearest node
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def evaluate env = nil
|
63
63
|
# puts "evaluating property `#{to_s}`: #{value.inspect}"
|
64
64
|
if value.is_a?(Expression) #Value
|
@@ -68,10 +68,10 @@ module Less
|
|
68
68
|
# puts "value is a #{value.class}"
|
69
69
|
[value.evaluate(env)]
|
70
70
|
end
|
71
|
-
|
72
|
-
|
71
|
+
|
72
|
+
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
def to_css env = nil
|
76
76
|
# puts "property.to_css `#{to_s}` env:#{env ? env.variables : "nil"}"
|
77
77
|
val = evaluate(env)
|
@@ -87,20 +87,20 @@ module Less
|
|
87
87
|
|
88
88
|
class Variable < Property
|
89
89
|
attr_reader :declaration
|
90
|
-
|
91
|
-
def initialize key, value = nil, parent = nil
|
92
|
-
@declaration = value ? true : false
|
90
|
+
|
91
|
+
def initialize key, value = nil, parent = nil
|
92
|
+
@declaration = value ? true : false
|
93
93
|
super key.delete('@'), value, parent
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
def inspect
|
97
97
|
"@#{super}"
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
def to_s
|
101
101
|
"@#{super}"
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
def evaluate env = nil
|
105
105
|
if declaration
|
106
106
|
# puts "evaluating DEC"
|
@@ -115,11 +115,11 @@ module Less
|
|
115
115
|
var.evaluate
|
116
116
|
end
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
def to_ruby
|
120
120
|
evaluate.to_ruby
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
def to_css env = nil
|
124
124
|
val = evaluate env
|
125
125
|
if val.respond_to? :to_css
|
@@ -132,68 +132,68 @@ module Less
|
|
132
132
|
|
133
133
|
class Expression < Array
|
134
134
|
attr_accessor :parent, :delimiter
|
135
|
-
|
135
|
+
|
136
136
|
def initialize ary, parent = nil, delimiter = ' '
|
137
137
|
self.parent = parent
|
138
138
|
self.delimiter = delimiter
|
139
139
|
# puts "new expression #{ary} |#{delimiter}|"
|
140
140
|
super(ary.is_a?(Array) ? ary : [ary].flatten)
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
def expressions; select {|i| i.kind_of? Expression } end
|
144
144
|
def variables; select {|i| i.kind_of? Variable } end
|
145
145
|
def operators; select {|i| i.is_a? Operator } end
|
146
146
|
def entities; select {|i| i.kind_of? Entity } end
|
147
147
|
def literals; select {|i| i.kind_of? Literal } end
|
148
|
-
|
148
|
+
|
149
149
|
def parent= obj
|
150
150
|
@parent = obj
|
151
151
|
each {|e| e.parent = obj if e.respond_to? :parent }
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
def inspect
|
155
155
|
'[' + map {|i| i.inspect }.join(', ') + ']'
|
156
156
|
end
|
157
|
-
|
157
|
+
|
158
158
|
def delimiter= d
|
159
159
|
@delimiter = d.strip + ' '
|
160
160
|
end
|
161
|
-
|
161
|
+
|
162
162
|
def flatten
|
163
163
|
self
|
164
164
|
end
|
165
|
-
|
165
|
+
|
166
166
|
def terminal?
|
167
167
|
expressions.empty? #&& variables.empty?
|
168
168
|
end
|
169
|
-
|
169
|
+
|
170
170
|
def to_css env = nil
|
171
171
|
# puts "TOCSS, delim: |#{@delimiter}|"
|
172
|
-
map do |i|
|
172
|
+
map do |i|
|
173
173
|
i.respond_to?(:to_css) ? i.to_css() : i.to_s
|
174
174
|
end * @delimiter
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
def to_ruby
|
178
178
|
map do |i|
|
179
179
|
i.respond_to?(:to_ruby) ? i.to_ruby : i.to_s
|
180
180
|
end
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
#
|
184
184
|
# Evaluates the expression and instantiates a new Literal with the result
|
185
185
|
# ex: [#111, +, #111] will evaluate to a Color node, with value #222
|
186
|
-
#
|
186
|
+
#
|
187
187
|
def evaluate env = nil
|
188
188
|
# puts "expression #{self.inspect} env: #{env ? env.variables : "nil"}"
|
189
189
|
if size > 2 or !terminal?
|
190
190
|
# puts " SIZE > 2 or !terminal"
|
191
|
-
|
191
|
+
|
192
192
|
# puts "--- sub evaluation ---"
|
193
193
|
|
194
194
|
# Replace self with an evaluated sub-expression
|
195
195
|
evaled = self.class.new(map {|e| e.respond_to?(:evaluate) ? e.evaluate(env) : e }, parent, delimiter) #5
|
196
|
-
|
196
|
+
|
197
197
|
# puts "======================"
|
198
198
|
# puts "evaled => #{evaled.inspect}"
|
199
199
|
|
@@ -202,7 +202,7 @@ module Less
|
|
202
202
|
end.compact.uniq.tap do |ary|
|
203
203
|
raise MixedUnitsError, evaled * ' ' if ary.size > 1 && !evaled.operators.empty?
|
204
204
|
end.join
|
205
|
-
|
205
|
+
|
206
206
|
entity = evaled.literals.find {|e| e.unit == unit } || evaled.literals.first || evaled.entities.first
|
207
207
|
result = evaled.operators.empty?? evaled : eval(evaled.to_ruby.join)
|
208
208
|
|
@@ -226,4 +226,4 @@ module Less
|
|
226
226
|
end
|
227
227
|
end
|
228
228
|
end
|
229
|
-
end
|
229
|
+
end
|
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.2.
|
4
|
+
version: 1.2.14
|
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-11-
|
12
|
+
date: 2009-11-20 00:00:00 -05:00
|
13
13
|
default_executable: lessc
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.4.2
|
34
34
|
version:
|
35
35
|
description: LESS is leaner CSS
|
36
36
|
email: self@cloudhead.net
|