less 1.2.21 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. data/.gitignore +4 -3
  2. data/.gitmodules +6 -0
  3. data/Gemfile +3 -0
  4. data/README.md +39 -46
  5. data/Rakefile +5 -50
  6. data/bin/lessc +1 -100
  7. data/less.gemspec +21 -125
  8. data/lib/less.rb +11 -30
  9. data/{LICENSE → lib/less/js/LICENSE} +1 -1
  10. data/lib/less/js/Makefile +56 -0
  11. data/lib/less/js/README.md +20 -0
  12. data/lib/less/js/benchmark/benchmark.less +3979 -0
  13. data/lib/less/js/benchmark/less-benchmark.js +49 -0
  14. data/lib/less/js/bin/lessc +105 -0
  15. data/lib/less/js/build/ecma-5.js +120 -0
  16. data/lib/less/js/build/header.js +7 -0
  17. data/lib/less/js/build/require.js +7 -0
  18. data/lib/less/js/dist/less-1.0.44.js +2655 -0
  19. data/lib/less/js/dist/less-1.1.0.js +2695 -0
  20. data/lib/less/js/dist/less-1.1.0.min.js +16 -0
  21. data/lib/less/js/dist/less-1.1.1.js +2710 -0
  22. data/lib/less/js/dist/less-1.1.1.min.js +16 -0
  23. data/lib/less/js/dist/less-1.1.2.js +2712 -0
  24. data/lib/less/js/dist/less-1.1.2.min.js +16 -0
  25. data/lib/less/js/dist/less-1.1.3.js +2721 -0
  26. data/lib/less/js/dist/less-1.1.3.min.js +16 -0
  27. data/lib/less/js/lib/less/browser.js +369 -0
  28. data/lib/less/js/lib/less/functions.js +174 -0
  29. data/lib/less/js/lib/less/index.js +137 -0
  30. data/lib/less/js/lib/less/parser.js +1098 -0
  31. data/lib/less/js/lib/less/tree.js +13 -0
  32. data/lib/less/js/lib/less/tree/alpha.js +17 -0
  33. data/lib/less/js/lib/less/tree/anonymous.js +13 -0
  34. data/lib/less/js/lib/less/tree/call.js +45 -0
  35. data/lib/less/js/lib/less/tree/color.js +98 -0
  36. data/lib/less/js/lib/less/tree/comment.js +14 -0
  37. data/lib/less/js/lib/less/tree/dimension.js +34 -0
  38. data/lib/less/js/lib/less/tree/directive.js +33 -0
  39. data/lib/less/js/lib/less/tree/element.js +32 -0
  40. data/lib/less/js/lib/less/tree/expression.js +23 -0
  41. data/lib/less/js/lib/less/tree/import.js +77 -0
  42. data/lib/less/js/lib/less/tree/javascript.js +51 -0
  43. data/lib/less/js/lib/less/tree/keyword.js +9 -0
  44. data/lib/less/js/lib/less/tree/mixin.js +106 -0
  45. data/lib/less/js/lib/less/tree/operation.js +32 -0
  46. data/lib/less/js/lib/less/tree/quoted.js +29 -0
  47. data/lib/less/js/lib/less/tree/rule.js +38 -0
  48. data/lib/less/js/lib/less/tree/ruleset.js +179 -0
  49. data/lib/less/js/lib/less/tree/selector.js +28 -0
  50. data/lib/less/js/lib/less/tree/url.js +25 -0
  51. data/lib/less/js/lib/less/tree/value.js +24 -0
  52. data/lib/less/js/lib/less/tree/variable.js +24 -0
  53. data/lib/less/js/package.json +13 -0
  54. data/lib/less/js/test/css/colors.css +42 -0
  55. data/lib/less/js/test/css/comments.css +52 -0
  56. data/lib/less/js/test/css/css-3.css +42 -0
  57. data/lib/less/js/test/css/css-escapes.css +20 -0
  58. data/lib/less/js/test/css/css.css +82 -0
  59. data/lib/less/js/test/css/functions.css +30 -0
  60. data/{spec → lib/less/js/test}/css/import.css +4 -2
  61. data/lib/less/js/test/css/javascript.css +22 -0
  62. data/lib/less/js/test/css/lazy-eval.css +3 -0
  63. data/lib/less/js/test/css/media.css +21 -0
  64. data/lib/less/js/test/css/mixins-args.css +61 -0
  65. data/lib/less/js/test/css/mixins-closure.css +9 -0
  66. data/lib/less/js/test/css/mixins-nested.css +14 -0
  67. data/lib/less/js/test/css/mixins-pattern.css +49 -0
  68. data/lib/less/js/test/css/mixins.css +50 -0
  69. data/{spec → lib/less/js/test}/css/operations.css +20 -2
  70. data/{spec → lib/less/js/test}/css/parens.css +0 -0
  71. data/lib/less/js/test/css/rulesets.css +29 -0
  72. data/{spec → lib/less/js/test}/css/scope.css +6 -2
  73. data/lib/less/js/test/css/selectors.css +32 -0
  74. data/lib/less/js/test/css/strings.css +38 -0
  75. data/lib/less/js/test/css/variables.css +24 -0
  76. data/lib/less/js/test/css/whitespace.css +36 -0
  77. data/lib/less/js/test/less-test.js +75 -0
  78. data/{spec → lib/less/js/test}/less/colors.less +13 -2
  79. data/{spec → lib/less/js/test}/less/comments.less +19 -2
  80. data/{spec → lib/less/js/test}/less/css-3.less +4 -1
  81. data/lib/less/js/test/less/css-escapes.less +28 -0
  82. data/{spec → lib/less/js/test}/less/css.less +10 -18
  83. data/lib/less/js/test/less/functions.less +35 -0
  84. data/{spec → lib/less/js/test}/less/import.less +1 -1
  85. data/{spec → lib/less/js/test}/less/import/import-test-a.less +0 -0
  86. data/{spec → lib/less/js/test}/less/import/import-test-b.less +0 -0
  87. data/{spec → lib/less/js/test}/less/import/import-test-c.less +0 -0
  88. data/{spec → lib/less/js/test}/less/import/import-test-d.css +0 -0
  89. data/lib/less/js/test/less/javascript.less +27 -0
  90. data/{spec → lib/less/js/test}/less/lazy-eval.less +0 -0
  91. data/lib/less/js/test/less/media.less +25 -0
  92. data/lib/less/js/test/less/mixins-args.less +118 -0
  93. data/lib/less/js/test/less/mixins-closure.less +26 -0
  94. data/lib/less/js/test/less/mixins-nested.less +22 -0
  95. data/lib/less/js/test/less/mixins-pattern.less +96 -0
  96. data/{spec → lib/less/js/test}/less/mixins.less +8 -4
  97. data/{spec → lib/less/js/test}/less/operations.less +19 -0
  98. data/{spec → lib/less/js/test}/less/parens.less +0 -0
  99. data/{spec → lib/less/js/test}/less/rulesets.less +2 -2
  100. data/{spec → lib/less/js/test}/less/scope.less +1 -1
  101. data/{spec → lib/less/js/test}/less/selectors.less +1 -1
  102. data/lib/less/js/test/less/strings.less +49 -0
  103. data/lib/less/js/test/less/variables.less +50 -0
  104. data/{spec → lib/less/js/test}/less/whitespace.less +3 -0
  105. data/lib/less/loader.rb +67 -0
  106. data/lib/less/parser.rb +46 -0
  107. data/lib/less/version.rb +3 -0
  108. data/spec/less/one/one.less +1 -0
  109. data/spec/less/parser_spec.rb +30 -0
  110. data/spec/less/two/two.less +1 -0
  111. data/spec/spec_helper.rb +2 -7
  112. metadata +156 -106
  113. data/CHANGELOG +0 -62
  114. data/VERSION +0 -1
  115. data/lib/less/command.rb +0 -110
  116. data/lib/less/engine.rb +0 -52
  117. data/lib/less/engine/grammar/common.tt +0 -29
  118. data/lib/less/engine/grammar/entity.tt +0 -144
  119. data/lib/less/engine/grammar/less.tt +0 -341
  120. data/lib/less/engine/nodes.rb +0 -9
  121. data/lib/less/engine/nodes/element.rb +0 -281
  122. data/lib/less/engine/nodes/entity.rb +0 -79
  123. data/lib/less/engine/nodes/function.rb +0 -93
  124. data/lib/less/engine/nodes/literal.rb +0 -171
  125. data/lib/less/engine/nodes/property.rb +0 -232
  126. data/lib/less/engine/nodes/ruleset.rb +0 -12
  127. data/lib/less/engine/nodes/selector.rb +0 -44
  128. data/lib/less/ext.rb +0 -60
  129. data/spec/command_spec.rb +0 -102
  130. data/spec/css/accessors.css +0 -18
  131. data/spec/css/big.css +0 -3768
  132. data/spec/css/colors.css +0 -14
  133. data/spec/css/comments.css +0 -9
  134. data/spec/css/css-3.css +0 -21
  135. data/spec/css/css.css +0 -50
  136. data/spec/css/dash-prefix.css +0 -12
  137. data/spec/css/functions.css +0 -6
  138. data/spec/css/import-with-extra-paths.css +0 -8
  139. data/spec/css/import-with-partial-in-extra-path.css +0 -6
  140. data/spec/css/lazy-eval.css +0 -1
  141. data/spec/css/mixins-args.css +0 -32
  142. data/spec/css/mixins.css +0 -28
  143. data/spec/css/rulesets.css +0 -17
  144. data/spec/css/selectors.css +0 -13
  145. data/spec/css/strings.css +0 -12
  146. data/spec/css/variables.css +0 -8
  147. data/spec/css/whitespace.css +0 -7
  148. data/spec/engine_spec.rb +0 -127
  149. data/spec/less/accessors.less +0 -20
  150. data/spec/less/big.less +0 -1264
  151. data/spec/less/dash-prefix.less +0 -21
  152. data/spec/less/exceptions/mixed-units-error.less +0 -3
  153. data/spec/less/exceptions/name-error-1.0.less +0 -3
  154. data/spec/less/exceptions/syntax-error-1.0.less +0 -3
  155. data/spec/less/extra_import_path/extra.less +0 -1
  156. data/spec/less/extra_import_path/import/import-test-a.css +0 -1
  157. data/spec/less/extra_import_path/import/import-test-a.less +0 -4
  158. data/spec/less/functions.less +0 -6
  159. data/spec/less/hidden.less +0 -25
  160. data/spec/less/import-with-extra-paths.less +0 -4
  161. data/spec/less/literal-css.less +0 -11
  162. data/spec/less/mixins-args.less +0 -59
  163. data/spec/less/strings.less +0 -14
  164. data/spec/less/variables.less +0 -29
  165. data/spec/spec.css +0 -50
@@ -1,171 +0,0 @@
1
- module Less
2
- module Node
3
- module Literal
4
- include Entity
5
-
6
- def unit
7
- nil
8
- end
9
- end
10
-
11
- #
12
- # rgb(255, 0, 0) #f0f0f0
13
- #
14
- class Color
15
- include Literal
16
- attr_reader :r, :g, :b, :a
17
-
18
- def initialize r, g, b, a = 1.0
19
- @r, @g, @b = [r, g, b].map do |c|
20
- normalize(c.is_a?(String) ? c.to_i(16) : c)
21
- end
22
- @a = normalize(a, 1.0)
23
- end
24
-
25
- def alpha v
26
- self.class.new r, g, b, v
27
- end
28
-
29
- def rgb
30
- [r, g, b]
31
- end
32
-
33
- def operate op, other
34
- color = if other.is_a? Numeric
35
- rgb.map {|c| c.send(op, other) }
36
- else
37
- rgb.zip(other.rgb).map {|a, b| a.send(op, b) }
38
- end
39
- self.class.new *[color, @a].flatten # Ruby 1.8 hack
40
- end
41
-
42
- def + other; operate :+, other end
43
- def - other; operate :-, other end
44
- def * other; operate :*, other end
45
- def / other; operate :/, other end
46
-
47
- def coerce other
48
- return self, other
49
- end
50
-
51
- def to_s
52
- if a < 1.0
53
- "rgba(#{r.to_i}, #{g.to_i}, #{b.to_i}, #{a})"
54
- else
55
- "#%02x%02x%02x" % [r, g, b]
56
- end
57
- end
58
-
59
- def inspect
60
- if a < 1.0
61
- "rgba(#{r}, #{g}, #{b}, #{a})"
62
- else
63
- "rgb(#{r}, #{g}, #{b})"
64
- end
65
- end
66
-
67
- def to_css
68
- to_s
69
- end
70
-
71
- def to_ruby
72
- "#{self.class}.new(#{r},#{g},#{b},#{a})"
73
- end
74
-
75
- protected
76
- def normalize(v, max = 255, min = 0)
77
- [[min, v].max, max].min
78
- end
79
- end
80
-
81
- #
82
- # 6 10px 125%
83
- #
84
- class Number < DelegateClass(Float)
85
- include Literal
86
-
87
- attr_accessor :unit
88
-
89
- def initialize value, unit = nil
90
- super value.to_f
91
- @unit = (unit.nil? || unit.empty?) ? nil : unit
92
- end
93
-
94
- def to_s
95
- "#{super}#@unit"
96
- end
97
-
98
- def dup
99
- self
100
- end
101
-
102
- def to_ruby
103
- self.to_f
104
- end
105
-
106
- def inspect
107
- to_s
108
- end
109
-
110
- def to_css
111
- "#{(self % 1).zero?? "#{self.to_i}#@unit" : self}"
112
- end
113
- end
114
-
115
- #
116
- # "hello world"
117
- #
118
- class Quoted < String
119
- include Literal
120
-
121
- attr_reader :quotes, :content
122
-
123
- # Strip quotes if necessary, and save them in @quotes
124
- def initialize str
125
- @quotes, @content = unless str.nil? or str.empty?
126
- str.match(/('|")(.*?)(\1)/).captures rescue [nil, str]
127
- else
128
- [nil, ""]
129
- end
130
- super @content
131
- end
132
-
133
- def to_css
134
- "#@quotes#{@content}#@quotes"
135
- end
136
- end
137
-
138
- class Font
139
- include Literal
140
- end
141
-
142
- class FontFamily
143
- include Literal
144
-
145
- def initialize family = []
146
- @family = family
147
- end
148
-
149
- def to_css
150
- @family.map(&:to_css) * ', '
151
- end
152
- end
153
-
154
- #
155
- # Any un-quoted word
156
- #
157
- # ex: red, small, border-collapse
158
- #
159
- class Keyword < String
160
- include Entity
161
-
162
- def to_css
163
- self
164
- end
165
-
166
- def inspect
167
- "#{self}"
168
- end
169
- end
170
- end
171
- end
@@ -1,232 +0,0 @@
1
- module Less
2
- module Node
3
- class Property < String
4
- include Entity
5
-
6
- attr_accessor :value
7
-
8
- def initialize key, value = nil, parent = nil
9
- super key, parent
10
- value = if value.is_a? Array
11
- value.each {|v| v.parent = self if v.respond_to? :parent }.
12
- map {|v| v.is_a?(Expression) ? v : Expression.new(v, self) }
13
- elsif value.nil?
14
- []
15
- else
16
- value
17
- end
18
- @value = value.is_a?(Expression) ? value : Expression.new(value, self)
19
- @value.parent = self
20
- @value.delimiter = ','
21
- # puts "new property #{to_s}: #{value} => #{@value}, contains: #{@value[0].class}"
22
- # puts
23
- end
24
-
25
- def parent= obj
26
- @parent = obj
27
- value.parent = self
28
- end
29
-
30
- def copy
31
- clone.tap {|c| c.value = value.copy }
32
- end
33
-
34
- def << token
35
- token = Node::Anonymous.new(*token) unless token.is_a? Entity or token.respond_to? :to_ruby
36
- token.parent = self if token.respond_to? :parent
37
- @value << token
38
- end
39
-
40
- def empty?; !@value || @value.empty? end
41
-
42
- def inspect
43
- self + (empty?? "" : ": `#{value.map {|i| i.to_s } * ' | '}`")
44
- end
45
-
46
- def == other
47
- self.to_s == other.to_s
48
- end
49
-
50
- def eql? other
51
- self == other and value.eql? other.value
52
- end
53
-
54
- def to_s
55
- super
56
- end
57
-
58
- def nearest node
59
- parent.nearest node
60
- end
61
-
62
- def evaluate env = nil
63
- # puts "evaluating property `#{to_s}`: #{value.inspect}"
64
- if value.is_a?(Expression) #Value
65
- # puts "value is a Value"
66
- value.map {|e| e.evaluate(env) } #6
67
- else
68
- # puts "value is a #{value.class}"
69
- [value.evaluate(env)]
70
- end
71
-
72
-
73
- end
74
-
75
- def to_css env = nil
76
- # puts "property.to_css `#{to_s}` env:#{env ? env.variables : "nil"}"
77
- val = evaluate(env)
78
- "#{self}: #{if val.respond_to? :to_css
79
- val.to_css
80
- else
81
- # p val
82
- # puts "#{val.class} #{val.first.class}"
83
- val.map {|i| i.to_css }.join(", ")
84
- end};"
85
- end
86
- end
87
-
88
- class Variable < Property
89
- attr_reader :declaration
90
-
91
- def initialize key, value = nil, parent = nil
92
- @declaration = value ? true : false
93
- super key.delete('@'), value, parent
94
- end
95
-
96
- def inspect
97
- "@#{super}"
98
- end
99
-
100
- def to_s
101
- "@#{super}"
102
- end
103
-
104
- def evaluate env = nil
105
- if declaration
106
- # puts "evaluating DEC"
107
- value.evaluate #2
108
- else
109
- # puts "evaluating #{to_s} par: #{parent} env: #{env ? env.variables : "nil"}"
110
- begin
111
- var = (env || self.parent).nearest(to_s) #3
112
- rescue VariableNameError
113
- var = self.parent.nearest(to_s)
114
- end
115
- var.evaluate
116
- end
117
- end
118
-
119
- def to_ruby
120
- evaluate.to_ruby
121
- end
122
-
123
- def to_css env = nil
124
- val = evaluate env
125
- if val.respond_to? :to_css
126
- env ? val.to_css(env) : val.to_css
127
- else
128
- val.map {|i| env ? i.to_css(env) : i.to_css }.join ', '
129
- end
130
- end
131
- end
132
-
133
- class Expression < Array
134
- attr_accessor :parent, :delimiter
135
-
136
- def initialize ary, parent = nil, delimiter = ' '
137
- self.parent = parent
138
- self.delimiter = delimiter
139
- # puts "new expression #{ary} |#{delimiter}|"
140
- super(ary.is_a?(Array) ? ary : [ary].flatten)
141
- end
142
-
143
- def expressions; select {|i| i.kind_of? Expression } end
144
- def variables; select {|i| i.kind_of? Variable } end
145
- def operators; select {|i| i.is_a? Operator } end
146
- def entities; select {|i| i.kind_of? Entity } end
147
- def literals; select {|i| i.kind_of? Literal } end
148
-
149
- def parent= obj
150
- @parent = obj
151
- each {|e| e.parent = obj if e.respond_to? :parent }
152
- end
153
-
154
- def inspect
155
- '[' + map {|i| i.inspect }.join(', ') + ']'
156
- end
157
-
158
- def delimiter= d
159
- @delimiter = d.strip + ' '
160
- end
161
-
162
- def flatten
163
- self
164
- end
165
-
166
- def terminal?
167
- expressions.empty? #&& variables.empty?
168
- end
169
-
170
- def to_css env = nil
171
- # puts "TOCSS, delim: |#{@delimiter}|"
172
- map do |i|
173
- i.parent = self.parent
174
- i.respond_to?(:to_css) ? i.to_css() : i.to_s
175
- end * @delimiter
176
- end
177
-
178
- def to_ruby
179
- map do |i|
180
- i.respond_to?(:to_ruby) ? i.to_ruby : i.to_s
181
- end
182
- end
183
-
184
- #
185
- # Evaluates the expression and instantiates a new Literal with the result
186
- # ex: [#111, +, #111] will evaluate to a Color node, with value #222
187
- #
188
- def evaluate env = nil
189
- # puts "expression #{self.inspect} env: #{env ? env.variables : "nil"}"
190
- if size > 2 or !terminal?
191
- # puts " SIZE > 2 or !terminal"
192
-
193
- # puts "--- sub evaluation ---"
194
-
195
- # Replace self with an evaluated sub-expression
196
- evaled = self.class.new(map {|e| e.respond_to?(:evaluate) ? e.evaluate(env) : e }, parent, delimiter) #5
197
-
198
- # puts "======================"
199
- # puts "evaled => #{evaled.inspect}"
200
-
201
- unit = evaled.literals.map do |node|
202
- node.unit
203
- end.compact.uniq.tap do |ary|
204
- raise MixedUnitsError, evaled * ' ' if ary.size > 1 && !evaled.operators.empty?
205
- end.join
206
-
207
- entity = evaled.literals.find {|e| e.unit == unit } || evaled.literals.first || evaled.entities.first
208
- result = evaled.operators.empty?? evaled : eval(evaled.to_ruby.join)
209
-
210
- # puts "entity is a #{entity.class}"
211
- # puts "delimiter is |#{@delimiter}|"
212
-
213
- case result
214
- when Entity then result
215
- when Expression then result.one?? result.first : self.class.new(result, parent, delimiter)
216
- else entity.class.new(result, *(unit if entity.class == Node::Number))
217
- end
218
- elsif size == 1
219
- if first.is_a? Variable
220
- first.evaluate(env)
221
- elsif first.is_a? Function
222
- first.evaluate(env)
223
- else
224
- first
225
- end
226
- else
227
- self
228
- end
229
- end
230
- end
231
- end
232
- end
@@ -1,12 +0,0 @@
1
- module Less
2
- module Node
3
- class Ruleset < Array
4
- def initialize elements = []
5
- super elements
6
- end
7
-
8
- def to_css
9
- end
10
- end
11
- end
12
- end
@@ -1,44 +0,0 @@
1
- module Less
2
- module Node
3
- class Selector < String
4
- include Entity
5
-
6
- Selectors = {
7
- :Descendant => '',
8
- :Child => '>',
9
- :Adjacent => '+',
10
- :PseudoClass => ':',
11
- :PseudoElement => '::',
12
- :Sibling => '~'
13
- }
14
-
15
- def initialize
16
- super Selectors[ self.class.to_s.split('::').last.to_sym ]
17
- end
18
-
19
- def self.[] key
20
- Node.const_get(Selectors.find {|k, v| v == key }.first)
21
- end
22
- end
23
-
24
- class Descendant < Selector
25
- def to_css; " " end
26
- end
27
-
28
- class Child < Selector
29
- def to_css; " #{self} " end
30
- end
31
-
32
- class Adjacent < Selector
33
- def to_css; " #{self} " end
34
- end
35
-
36
- class PseudoClass < Selector
37
- def to_css; self end
38
- end
39
-
40
- class PseudoElement < Selector
41
- def to_css; self end
42
- end
43
- end
44
- end