less 0.8.0 → 0.8.1

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.
Files changed (5) hide show
  1. data/VERSION +1 -1
  2. data/less.gemspec +1 -1
  3. data/lib/less/engine.rb +40 -38
  4. data/spec/spec.less +5 -4
  5. metadata +1 -1
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.8.1
data/less.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{less}
5
- s.version = "0.8.0"
5
+ s.version = "0.8.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["cloudhead"]
data/lib/less/engine.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module Less
2
2
  class Engine < String
3
3
  REGEXP = {
4
- :path => /(?>[#.][->#.\w ]+)?(?> ?> ?)?@([-\w]+)/, # #header > .title > @var
4
+ :path => /([#.][->#.\w ]+)?( ?> ?)?@([-\w]+)/, # #header > .title > @var
5
5
  :selector => /[-\w #.>*:]/, # .cow .milk > a
6
- :variable => /^@([-\w]+)/, # @milk-white
6
+ :variable => /@([-\w]+)/, # @milk-white
7
7
  :property => /@[-\w]+|[-a-z]+/ # font-size
8
8
  }
9
9
 
@@ -23,8 +23,8 @@ module Less
23
23
  # can then be deleted.
24
24
  #
25
25
  @tree = @tree.traverse :leaf do |key, value, path, node|
26
- matched = if match = key.match( REGEXP[:variable] )
27
- node[:variables] ||= {}
26
+ matched = if match = key.match( REGEXP[:variable] )
27
+ node[:variables] ||= Tree.new
28
28
  node[:variables][ match.captures.first ] = value
29
29
  elsif value == :mixin
30
30
  node[:mixins] ||= []
@@ -44,38 +44,16 @@ module Less
44
44
  end
45
45
  end
46
46
 
47
- #
48
- # Evaluate variables
49
- #
47
+ # Call `evaluate` on variables, such as '@dark: @light / 2'
48
+ @tree = @tree.traverse :branch do |path, node|
49
+ node.vars.each do |key, value|
50
+ evaluate key, value, node.vars
51
+ end if node.vars?
52
+ end
53
+
54
+ # Call `evaluate` on css properties, such as 'font-size: @big'
50
55
  @tree = @tree.traverse :leaf do |key, value, path, node|
51
- convert = lambda do |key, value, node| # We declare this as a lambda, for re-use
52
- if value.is_a?(String) && value.include?('@') # There's a var to evaluate
53
-
54
- # Find its value
55
- var = value.delete(' ').match( REGEXP[:path] ).captures.join
56
- var = unless var.include? '>'
57
- node.var( var ) || @tree.var( var ) # Try local first, then global
58
- else
59
- @tree.find :var, var.split('>') # Try finding it in a specific namespace
60
- end
61
-
62
- if var
63
- node[ key ] = value.gsub REGEXP[:path], var # Substitute variable with value
64
- else
65
- node.delete key # Discard the declaration if the variable wasn't found
66
- end
67
- end
68
- end
69
-
70
- # Call `convert` on css properties, such as 'font-size: @big'
71
- convert.call key, value, node
72
-
73
- # Call `convert` on variables, such as '@dark: @light / 2'
74
- if node.vars?
75
- node.vars.each do |key, value|
76
- convert.call key, value, node
77
- end
78
- end
56
+ evaluate key, value, node
79
57
  end
80
58
 
81
59
  #
@@ -87,9 +65,12 @@ module Less
87
65
  if (unit = value.scan(/(%)|\d+(px)|\d+(em)|(#)/i).flatten.compact.uniq).size <= 1
88
66
  unit = unit.join
89
67
  value = if unit == '#'
90
- evaluate = lambda {|v| unit + eval( v ).to_s(16) }
68
+ evaluate = lambda do |v|
69
+ result = eval v
70
+ unit + ( result.zero?? '000' : result.to_s(16) )
71
+ end
91
72
  value.gsub(/#([a-z0-9]+)/i) do
92
- hex = $1 * ( $1.size == 3 ? 2 : 1 )
73
+ hex = $1 * ( $1.size < 6 ? 6 / $1.size : 1 )
93
74
  hex.to_i(16)
94
75
  end.delete unit
95
76
  else
@@ -103,10 +84,31 @@ module Less
103
84
  end
104
85
  end
105
86
  end
106
-
107
87
  end
108
88
  alias render compile
109
89
 
90
+ #
91
+ # Evaluate variables
92
+ #
93
+ def evaluate key, value, node
94
+ if value.is_a? String and value.include? '@' # There's a var to evaluate
95
+ value.scan REGEXP[:path] do |p|
96
+ p = p.join.delete ' '
97
+ var = if p.include? '>'
98
+ @tree.find :var, p.split('>') # Try finding it in a specific namespace
99
+ else
100
+ node.var( p ) || @tree.var( p ) # Try local first, then global
101
+ end
102
+
103
+ if var
104
+ node[ key ] = value.gsub REGEXP[:path], var # Substitute variable with value
105
+ else
106
+ node.delete key # Discard the declaration if the variable wasn't found
107
+ end
108
+ end
109
+ end
110
+ end
111
+
110
112
  def to_css
111
113
  self.compile.to_css
112
114
  end
data/spec/spec.less CHANGED
@@ -14,8 +14,9 @@ lala
14
14
  font-family: "Verdana", 'Baka', serif;
15
15
  }
16
16
  .dookoo {
17
+ @fi: @fa;
17
18
  @fa: grey;
18
- color: @fa;
19
+ color: .alt > @base-color - .alt > @base-color;
19
20
  line-height: 1999px;
20
21
  .blah {
21
22
  .bloop {
@@ -24,9 +25,9 @@ lala
24
25
  }
25
26
  }
26
27
  .alt {
27
- @base-color: green;
28
- @darker-color: @base-color / 2;
29
- @another-color: * > @base-color;
28
+ @base-color: #876956 - #111;
29
+ @darker-color: @base-color - @base-color;
30
+ @another-color: @base-color;
30
31
  }
31
32
  #kelkoo {
32
33
  color: .dookoo > .blah > .bloop > @supernested;
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: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - cloudhead