less 2.0.4 → 2.1.0
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/.gitmodules +0 -3
- data/.travis.yml +10 -0
- data/README.md +1 -1
- data/Rakefile +2 -0
- data/bin/lessc +21 -2
- data/less.gemspec +5 -3
- data/lib/less/defaults.rb +13 -0
- data/lib/less/js/CHANGELOG +41 -0
- data/lib/less/js/Makefile +21 -2
- data/lib/less/js/benchmark/benchmark.less +11 -11
- data/lib/less/js/benchmark/less-benchmark.js +3 -5
- data/lib/less/js/bin/lessc +52 -18
- data/lib/less/js/build/amd.js +6 -0
- data/lib/less/js/build/require-rhino.js +7 -0
- data/lib/less/js/dist/{less-1.0.44.js → less-1.1.4.js} +159 -45
- data/lib/less/js/dist/less-1.1.4.min.js +16 -0
- data/lib/less/js/dist/less-1.1.5.js +2805 -0
- data/lib/less/js/dist/less-1.1.5.min.js +9 -0
- data/lib/less/js/dist/less-1.1.6.js +3004 -0
- data/lib/less/js/dist/less-1.1.6.min.js +9 -0
- data/lib/less/js/dist/less-1.2.0.js +3293 -0
- data/lib/less/js/dist/less-1.2.0.min.js +9 -0
- data/lib/less/js/dist/less-1.2.1.js +3318 -0
- data/lib/less/js/dist/less-1.2.1.min.js +9 -0
- data/lib/less/js/dist/less-1.2.2.js +3337 -0
- data/lib/less/js/dist/less-1.2.2.min.js +9 -0
- data/lib/less/js/dist/less-1.3.0.js +3478 -0
- data/lib/less/js/dist/less-1.3.0.min.js +9 -0
- data/lib/less/js/dist/less-rhino-1.1.3.js +2460 -0
- data/lib/less/js/dist/less-rhino-1.1.5.js +2481 -0
- data/lib/less/js/lib/less/browser.js +38 -27
- data/lib/less/js/lib/less/colors.js +151 -0
- data/lib/less/js/lib/less/cssmin.js +355 -0
- data/lib/less/js/lib/less/functions.js +61 -7
- data/lib/less/js/lib/less/index.js +48 -37
- data/lib/less/js/lib/less/parser.js +327 -120
- data/lib/less/js/lib/less/rhino.js +62 -0
- data/lib/less/js/lib/less/tree/alpha.js +1 -1
- data/lib/less/js/lib/less/tree/anonymous.js +1 -1
- data/lib/less/js/lib/less/tree/assignment.js +17 -0
- data/lib/less/js/lib/less/tree/call.js +7 -4
- data/lib/less/js/lib/less/tree/color.js +9 -6
- data/lib/less/js/lib/less/tree/comment.js +1 -1
- data/lib/less/js/lib/less/tree/condition.js +42 -0
- data/lib/less/js/lib/less/tree/dimension.js +16 -1
- data/lib/less/js/lib/less/tree/directive.js +4 -2
- data/lib/less/js/lib/less/tree/element.js +20 -5
- data/lib/less/js/lib/less/tree/expression.js +2 -2
- data/lib/less/js/lib/less/tree/import.js +16 -14
- data/lib/less/js/lib/less/tree/javascript.js +1 -1
- data/lib/less/js/lib/less/tree/keyword.js +12 -2
- data/lib/less/js/lib/less/tree/media.js +114 -0
- data/lib/less/js/lib/less/tree/mixin.js +49 -20
- data/lib/less/js/lib/less/tree/operation.js +1 -1
- data/lib/less/js/lib/less/tree/paren.js +16 -0
- data/lib/less/js/lib/less/tree/quoted.js +2 -2
- data/lib/less/js/lib/less/tree/rule.js +8 -4
- data/lib/less/js/lib/less/tree/ruleset.js +49 -12
- data/lib/less/js/lib/less/tree/selector.js +18 -4
- data/lib/less/js/lib/less/tree/url.js +2 -2
- data/lib/less/js/lib/less/tree/value.js +1 -1
- data/lib/less/js/lib/less/tree/variable.js +5 -3
- data/lib/less/js/lib/less/tree.js +6 -2
- data/lib/less/js/package.json +2 -2
- data/lib/less/js/test/css/colors.css +16 -0
- data/lib/less/js/test/css/comments.css +9 -5
- data/lib/less/js/test/css/css-3.css +18 -2
- data/lib/less/js/test/css/css-escapes.css +1 -1
- data/lib/less/js/test/css/css.css +11 -4
- data/lib/less/js/test/css/functions.css +13 -0
- data/lib/less/js/test/css/ie-filters.css +5 -0
- data/lib/less/js/test/css/import.css +12 -3
- data/lib/less/js/test/css/media.css +60 -2
- data/lib/less/js/test/css/mixins-args.css +17 -2
- data/lib/less/js/test/css/mixins-guards.css +58 -0
- data/lib/less/js/test/css/mixins-important.css +17 -0
- data/lib/less/js/test/css/mixins-pattern.css +4 -6
- data/lib/less/js/test/css/mixins.css +21 -0
- data/lib/less/js/test/css/operations.css +3 -0
- data/lib/less/js/test/css/parens.css +1 -1
- data/lib/less/js/test/css/rulesets.css +6 -2
- data/lib/less/js/test/css/scope.css +6 -6
- data/lib/less/js/test/css/selectors.css +38 -1
- data/lib/less/js/test/css/strings.css +6 -4
- data/lib/less/js/test/css/variables.css +3 -0
- data/lib/less/js/test/css/whitespace.css +5 -3
- data/lib/less/js/test/less/colors.less +19 -0
- data/lib/less/js/test/less/comments.less +8 -6
- data/lib/less/js/test/less/css-3.less +10 -0
- data/lib/less/js/test/less/css.less +4 -0
- data/lib/less/js/test/less/functions.less +15 -1
- data/lib/less/js/test/less/ie-filters.less +8 -0
- data/lib/less/js/test/less/import/import-test-e.less +2 -0
- data/lib/less/js/test/less/import.less +4 -1
- data/lib/less/js/test/less/media.less +55 -1
- data/lib/less/js/test/less/mixins-args.less +20 -1
- data/lib/less/js/test/less/mixins-guards.less +94 -0
- data/lib/less/js/test/less/mixins-important.less +18 -0
- data/lib/less/js/test/less/mixins-pattern.less +3 -0
- data/lib/less/js/test/less/mixins.less +20 -0
- data/lib/less/js/test/less/operations.less +4 -0
- data/lib/less/js/test/less/selectors.less +31 -0
- data/lib/less/js/test/less/strings.less +2 -0
- data/lib/less/js/test/less/variables.less +4 -0
- data/lib/less/js/test/less-test.js +3 -5
- data/lib/less/loader.rb +24 -25
- data/lib/less/parser.rb +32 -6
- data/lib/less/version.rb +1 -1
- data/lib/less.rb +7 -8
- data/spec/less/faulty/faulty.less +3 -0
- data/spec/less/parser_spec.rb +28 -2
- metadata +321 -149
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
var path = require('path'),
|
|
2
2
|
fs = require('fs'),
|
|
3
|
-
sys = require('
|
|
3
|
+
sys = require('util');
|
|
4
4
|
|
|
5
|
-
require
|
|
6
|
-
|
|
7
|
-
var less = require('lib/less');
|
|
5
|
+
var less = require('../lib/less');
|
|
8
6
|
|
|
9
7
|
less.tree.functions.add = function (a, b) {
|
|
10
8
|
return new(less.tree.Dimension)(a.value + b.value);
|
|
@@ -12,7 +10,7 @@ less.tree.functions.add = function (a, b) {
|
|
|
12
10
|
less.tree.functions.increment = function (a) {
|
|
13
11
|
return new(less.tree.Dimension)(a.value + 1);
|
|
14
12
|
}
|
|
15
|
-
less.tree.functions.
|
|
13
|
+
less.tree.functions._color = function (str) {
|
|
16
14
|
if (str.value === "evil red") { return new(less.tree.Color)("600") }
|
|
17
15
|
}
|
|
18
16
|
|
data/lib/less/loader.rb
CHANGED
|
@@ -1,41 +1,40 @@
|
|
|
1
|
+
require 'commonjs'
|
|
1
2
|
|
|
2
3
|
module Less
|
|
3
4
|
class Loader
|
|
4
|
-
|
|
5
|
+
include CallJS
|
|
6
|
+
|
|
7
|
+
attr_reader :environment
|
|
8
|
+
|
|
5
9
|
def initialize
|
|
6
10
|
@cxt = V8::Context.new
|
|
7
|
-
@
|
|
8
|
-
@
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@process = Process.new
|
|
11
|
+
@environment = CommonJS::Environment.new(@cxt, :path => Pathname(__FILE__).dirname.join('js','lib').to_s)
|
|
12
|
+
@environment.native('path', Path.new)
|
|
13
|
+
@environment.native('util', Sys.new)
|
|
14
|
+
@environment.native('fs', Fs.new)
|
|
15
|
+
|
|
16
|
+
@cxt['process'] = Process.new
|
|
14
17
|
@cxt['console'] = Console.new
|
|
15
18
|
end
|
|
16
|
-
|
|
17
|
-
def require(
|
|
18
|
-
|
|
19
|
-
filename = path =~ /\.js$/ ? path : "#{path}.js"
|
|
20
|
-
filepath = @path.join(filename)
|
|
21
|
-
fail LoadError, "no such file: #{filename}" unless filepath.exist?
|
|
22
|
-
load = @cxt.eval("(function(process, require, exports, __dirname) {require.paths = [];#{File.read(filepath)}})", filepath.expand_path)
|
|
23
|
-
@exports[path] = exports = @cxt['Object'].new
|
|
24
|
-
load.call(@process, method(:require), exports, Dir.pwd)
|
|
25
|
-
end
|
|
26
|
-
return exports
|
|
19
|
+
|
|
20
|
+
def require(module_id)
|
|
21
|
+
@environment.require(module_id)
|
|
27
22
|
end
|
|
28
|
-
|
|
23
|
+
|
|
29
24
|
class Path
|
|
30
25
|
def join(*components)
|
|
31
26
|
File.join(*components)
|
|
32
27
|
end
|
|
33
|
-
|
|
28
|
+
|
|
34
29
|
def dirname(path)
|
|
35
30
|
File.dirname(path)
|
|
36
31
|
end
|
|
32
|
+
|
|
33
|
+
def basename(path)
|
|
34
|
+
File.basename(path)
|
|
35
|
+
end
|
|
37
36
|
end
|
|
38
|
-
|
|
37
|
+
|
|
39
38
|
class Sys
|
|
40
39
|
def error(*errors)
|
|
41
40
|
raise errors.join(' ')
|
|
@@ -46,18 +45,18 @@ module Less
|
|
|
46
45
|
def statSync(path)
|
|
47
46
|
File.stat(path)
|
|
48
47
|
end
|
|
49
|
-
|
|
48
|
+
|
|
50
49
|
def readFile(path, encoding, callback)
|
|
51
50
|
callback.call(nil, File.read(path))
|
|
52
51
|
end
|
|
53
|
-
|
|
52
|
+
|
|
54
53
|
end
|
|
55
54
|
|
|
56
55
|
class Process
|
|
57
56
|
def exit(*args)
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
|
-
|
|
59
|
+
|
|
61
60
|
class Console
|
|
62
61
|
def log(*msgs)
|
|
63
62
|
puts msgs.join(',')
|
data/lib/less/parser.rb
CHANGED
|
@@ -9,10 +9,32 @@ module Less
|
|
|
9
9
|
#
|
|
10
10
|
# @yield code to wrap
|
|
11
11
|
def calljs
|
|
12
|
-
|
|
12
|
+
lock do
|
|
13
|
+
yield
|
|
14
|
+
end
|
|
13
15
|
rescue V8::JSError => e
|
|
14
16
|
raise ParseError.new(e)
|
|
15
17
|
end
|
|
18
|
+
|
|
19
|
+
# @private
|
|
20
|
+
# Ensure proper locking before entering the V8 API
|
|
21
|
+
#
|
|
22
|
+
# @yield code to wrap in lock
|
|
23
|
+
def lock
|
|
24
|
+
result, exception = nil, nil
|
|
25
|
+
V8::C::Locker() do
|
|
26
|
+
begin
|
|
27
|
+
result = yield
|
|
28
|
+
rescue Exception => e
|
|
29
|
+
exception = e
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
if exception
|
|
33
|
+
raise exception
|
|
34
|
+
else
|
|
35
|
+
result
|
|
36
|
+
end
|
|
37
|
+
end
|
|
16
38
|
end
|
|
17
39
|
|
|
18
40
|
# Convert lesscss source into an abstract syntax Tree
|
|
@@ -26,10 +48,12 @@ module Less
|
|
|
26
48
|
# @option opts [String] :filename to associate with resulting parse trees (useful for generating errors)
|
|
27
49
|
def initialize(options = {})
|
|
28
50
|
stringy = {}
|
|
29
|
-
options.each do |k,v|
|
|
51
|
+
Less.defaults.merge(options).each do |k,v|
|
|
30
52
|
stringy[k.to_s] = v.is_a?(Array) ? v.map(&:to_s) : v.to_s
|
|
31
53
|
end
|
|
32
|
-
|
|
54
|
+
lock do
|
|
55
|
+
@parser = Less.Parser.new(stringy)
|
|
56
|
+
end
|
|
33
57
|
end
|
|
34
58
|
|
|
35
59
|
# Convert `less` source into a abstract syntaxt tree
|
|
@@ -37,9 +61,11 @@ module Less
|
|
|
37
61
|
# @return [Less::Tree] the parsed tree
|
|
38
62
|
def parse(less)
|
|
39
63
|
calljs do
|
|
40
|
-
|
|
41
|
-
@parser.parse(less, lambda {|
|
|
42
|
-
|
|
64
|
+
tree = nil
|
|
65
|
+
@parser.parse(less, lambda {|*args|
|
|
66
|
+
this, e, t = *args
|
|
67
|
+
fail e.message unless e.nil?
|
|
68
|
+
tree = t
|
|
43
69
|
})
|
|
44
70
|
Tree.new(tree) if tree
|
|
45
71
|
end
|
data/lib/less/version.rb
CHANGED
data/lib/less.rb
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
require 'v8'
|
|
2
|
+
require 'pathname'
|
|
3
|
+
require 'less/parser'
|
|
4
|
+
require 'less/loader'
|
|
5
|
+
require 'less/version'
|
|
6
|
+
require 'less/defaults'
|
|
3
7
|
|
|
4
8
|
module Less
|
|
5
|
-
|
|
6
|
-
require 'v8'
|
|
7
|
-
require 'pathname'
|
|
8
|
-
require 'less/parser'
|
|
9
|
-
require 'less/loader'
|
|
10
|
-
require 'less/version'
|
|
9
|
+
extend Less::Defaults
|
|
11
10
|
|
|
12
11
|
@loader = Less::Loader.new
|
|
13
12
|
@less = @loader.require('less/index')
|
data/spec/less/parser_spec.rb
CHANGED
|
@@ -14,14 +14,40 @@ describe Less::Parser do
|
|
|
14
14
|
subject.parse(".class {width: 1+1}").to_css(:compress => true).strip.should eql ".class{width:2;}"
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
|
+
|
|
17
18
|
it "throws a ParseError if the lesscss is bogus" do
|
|
18
19
|
expect {subject.parse('{^)')}.should raise_error(Less::ParseError)
|
|
19
20
|
end
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
it "passes exceptions from the less compiler" do
|
|
23
|
+
expect {subject.parse('body { color: @a; }').to_css}.should raise_error(Less::ParseError, /variable @a is undefined/)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "when configured with multiple load paths" do
|
|
27
|
+
subject {Less::Parser.new :paths => [cwd.join('one'), cwd.join('two'), cwd.join('faulty')]}
|
|
23
28
|
|
|
24
29
|
it "will load files from both paths" do
|
|
30
|
+
subject.parse('@import "one.less";').to_css.gsub(/\n/,'').strip.should eql ".one { width: 1;}"
|
|
31
|
+
subject.parse('@import "two.less";').to_css.gsub(/\n/,'').strip.should eql ".two { width: 1;}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "passes exceptions from less imported less files" do
|
|
35
|
+
expect {subject.parse('@import "faulty.less";').to_css}.should raise_error(Less::ParseError, /variable @a is undefined/)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "when load paths are specified in as default options" do
|
|
41
|
+
before do
|
|
42
|
+
Less.paths << cwd.join('one')
|
|
43
|
+
Less.paths << cwd.join('two')
|
|
44
|
+
@parser = Less::Parser.new
|
|
45
|
+
end
|
|
46
|
+
after do
|
|
47
|
+
Less.paths.clear
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "will load files from default load paths" do
|
|
25
51
|
@parser.parse('@import "one.less";').to_css.gsub(/\n/,'').strip.should eql ".one { width: 1;}"
|
|
26
52
|
@parser.parse('@import "two.less";').to_css.gsub(/\n/,'').strip.should eql ".two { width: 1;}"
|
|
27
53
|
end
|