less 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -27,7 +27,7 @@ begin
27
27
  config = YAML.load(
28
28
  File.read(File.expand_path('~/.rubyforge/user-config.yml'))
29
29
  )
30
-
30
+ options << '--line-numbers' << '--inline-source'
31
31
  host = "#{config['username']}@rubyforge.org"
32
32
  remote_dir = "/var/www/gforge-projects/the-perfect-gem/"
33
33
  local_dir = 'rdoc'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.0
data/bin/lessc CHANGED
@@ -23,10 +23,11 @@ opts = OptionParser.new do |o|
23
23
  options[:watch] = true
24
24
  end
25
25
 
26
- # Compress
27
- o.on("-c", "--compress", "compress css file") do
28
- options[:compress] = true
29
- end
26
+ # Compression needs a proper algorithm
27
+ #
28
+ # o.on("-c", "--compress", "compress css file") do
29
+ # options[:compress] = true
30
+ # end
30
31
 
31
32
  o.separator ""
32
33
 
@@ -38,7 +39,7 @@ opts = OptionParser.new do |o|
38
39
 
39
40
  # Version
40
41
  o.on_tail("-v", "--version", "show version") do
41
- puts "Less Compiler " + Less::VERSION
42
+ puts "lessc " + Less.version
42
43
  exit
43
44
  end
44
45
  end
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.7.0"
5
+ s.version = "0.8.0"
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.rb CHANGED
@@ -1,10 +1,15 @@
1
+ require 'cgi'
2
+
1
3
  require 'less/command'
2
4
  require 'less/engine'
3
5
  require 'less/tree'
4
6
 
5
7
  module Less
6
- VERSION = '0.5.2'
7
- class MixedUnitsError < Exception
8
+ class MixedUnitsError < Exception
9
+ end
10
+
11
+ def self.version
12
+ File.read( File.join( File.dirname(__FILE__), '..', 'VERSION') )
8
13
  end
9
14
  end
10
15
 
data/lib/less/command.rb CHANGED
@@ -4,10 +4,12 @@ module Less
4
4
  @source, @destination = options[:source], options[:destination]
5
5
  @options = options
6
6
  end
7
- def watch?() @options[:watch] end
7
+
8
+ def watch?() @options[:watch] end
8
9
  def compress?() @options[:compress] end
9
10
 
10
- # little function which allows us to Ctrl-C exit inside the passed block
11
+ # little function which allows us to
12
+ # Ctrl-C exit inside the passed block
11
13
  def watch &block
12
14
  begin
13
15
  block.call
@@ -20,28 +22,22 @@ module Less
20
22
  def run!
21
23
  if watch?
22
24
  log "Watching for changes in #@source ...Ctrl-C to abort.\n"
23
- #
25
+
24
26
  # Main watch loop
25
- #
26
27
  loop do
27
28
  watch { sleep 1 }
28
29
 
29
30
  # File has changed
30
31
  if File.stat( @source ).mtime > File.stat( @destination ).mtime
31
32
  log "Change detected... "
32
- #
33
- # Error loop
34
- #
35
- loop do
36
- unless compile
37
- log "Press [enter] to continue..."
38
- watch { $stdin.gets }
39
- next # continue within the error loop, until the error is fixed
40
- end
41
- break # break to main loop, as no errors were encountered
33
+
34
+ # Loop until error is fixed
35
+ while not compile
36
+ log "Press [enter] to continue..."
37
+ watch { $stdin.gets }
42
38
  end
43
- end # if
44
- end # loop
39
+ end
40
+ end
45
41
  else
46
42
  compile
47
43
  end
@@ -56,7 +52,7 @@ module Less
56
52
  File.open( @destination, "w" ) do |file|
57
53
  file.write css
58
54
  end
59
- puts "#{@destination.split('/').last} was updated!" if watch?
55
+ puts " [Updated] #{@destination.split('/').last}" if watch?
60
56
  rescue Errno::ENOENT => e
61
57
  abort "#{e}"
62
58
  rescue SyntaxError
data/lib/less/engine.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  module Less
2
2
  class Engine < String
3
3
  REGEXP = {
4
- :path => /([#.][->#.\w]+)?( ?> ?)?@([\w\-]+)/, # #header > .title > @var
5
- :selector => /[-\w #.>*_:]/, # .cow .milk > a
6
- :values => /[-\w \(\)@>\/*+#%.,'"]/, # 10px solid #fff
7
- :variable => /^@([\w\-]+)/ # @milk-white
4
+ :path => /(?>[#.][->#.\w ]+)?(?> ?> ?)?@([-\w]+)/, # #header > .title > @var
5
+ :selector => /[-\w #.>*:]/, # .cow .milk > a
6
+ :variable => /^@([-\w]+)/, # @milk-white
7
+ :property => /@[-\w]+|[-a-z]+/ # font-size
8
8
  }
9
9
 
10
10
  def initialize s
@@ -85,18 +85,18 @@ module Less
85
85
  @tree = @tree.traverse :leaf do |key, value, path, node|
86
86
  if value.match /[-+\/*]/
87
87
  if (unit = value.scan(/(%)|\d+(px)|\d+(em)|(#)/i).flatten.compact.uniq).size <= 1
88
- unit = unit.join
88
+ unit = unit.join
89
89
  value = if unit == '#'
90
+ evaluate = lambda {|v| unit + eval( v ).to_s(16) }
90
91
  value.gsub(/#([a-z0-9]+)/i) do
91
92
  hex = $1 * ( $1.size == 3 ? 2 : 1 )
92
93
  hex.to_i(16)
93
94
  end.delete unit
94
- evaluate = lambda {|v| unit + eval( v ).to_s(16) }
95
95
  else
96
- value.gsub(/px|em|%/, '')
97
96
  evaluate = lambda {|v| eval( v ).to_s + unit }
98
- end.to_s
99
- next if value.match /[a-z]/i
97
+ value.gsub(/px|em|%/, '')
98
+ end.to_s
99
+ next if value.match /[a-z]/i
100
100
  node[ key ] = evaluate.call value
101
101
  else
102
102
  raise MixedUnitsError
@@ -119,13 +119,14 @@ module Less
119
119
  # less: color: black;
120
120
  # hashify: "color" => "black"
121
121
  #
122
- hash = self.gsub(/"/, "'"). # ""
123
- gsub(/([@a-z\-]+):[ \t]*(#{ REGEXP[:values] }+);/, '"\\1" => "\\2",'). # Properties
122
+ hash = self.gsub(/\/\/.*\n/, ''). # Comments //
123
+ gsub(/\/\*.*?\//m, ''). # Comments /*
124
+ gsub(/"/, "'"). # " => '
125
+ gsub(/("|')(.+?)(\1)/) { $1 + CGI.escape( $2 ) + $1 }. # Escape string values
126
+ gsub(/(#{REGEXP[:property]}):[ \t]*(.+?);/, '"\\1" => "\\2",'). # Declarations
124
127
  gsub(/\}/, "},"). # Closing }
125
- gsub(/([ \t]*)(#{ REGEXP[:selector] }+?)[ \t\n]*\{/m, '\\1"\\2" => {'). # Selectors
126
- gsub(/([.#][->\w .#]+);/, '"\\1" => :mixin,'). # Mixins
127
- gsub("\n\n", "\n"). # New-lines
128
- gsub(/\/\/.*\n/, '') # Comments
128
+ gsub(/([ \t]*)(#{REGEXP[:selector]}+?)[ \t\n]*\{/m, '\\1"\\2" => {'). # Selectors
129
+ gsub(/([.#][->\w .#]+);/, '"\\1" => :mixin,') # Mixins
129
130
  eval "{" + hash + "}" # Return {hash}
130
131
  end
131
132
  end
data/lib/less/tree.rb CHANGED
@@ -57,7 +57,7 @@ module Less
57
57
  def to_css css = []
58
58
  self.traverse :branch do |path, node|
59
59
  properties = node.inject("") do |s, (k, v)|
60
- v.is_a?(String) ? (s + "#{k}: #{v}; ") : s # Add the property to the list
60
+ v.is_a?(String) ? (s + "#{k}: #{CGI.unescape(v)}; ") : s # Add the property to the list
61
61
  end
62
62
  css << path * ' > ' + " { " + properties + "}" # Add the rule-set to the CSS
63
63
  end
data/spec/spec.less CHANGED
@@ -2,7 +2,11 @@
2
2
  // the main color
3
3
  @base-color: #fff;
4
4
  @darker-color: @base-color / 2;
5
+ /*
5
6
 
7
+ lala
8
+
9
+ */
6
10
  .dookoo a {
7
11
  color: black;
8
12
  }
@@ -13,19 +17,27 @@
13
17
  @fa: grey;
14
18
  color: @fa;
15
19
  line-height: 1999px;
20
+ .blah {
21
+ .bloop {
22
+ @supernested: iceberg;
23
+ }
24
+ }
16
25
  }
17
26
  .alt {
18
27
  @base-color: green;
19
28
  @darker-color: @base-color / 2;
20
29
  @another-color: * > @base-color;
21
30
  }
31
+ #kelkoo {
32
+ color: .dookoo > .blah > .bloop > @supernested;
33
+ }
22
34
  .altfoo { color: .alt > @base-color; }
23
35
  .foo { border: 1px solid black; color: @base-color; }
24
36
  .foo2 {
25
37
  width: 10px * 2;
26
38
  }
27
39
  #content {
28
- font-size: 12px;
40
+ font-size: "};(*#)";
29
41
  @some-color: blue;
30
42
  #header {
31
43
  .foo;
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.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - cloudhead