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
|
@@ -86,6 +86,13 @@ tree.functions = {
|
|
|
86
86
|
hsl.a = clamp(hsl.a);
|
|
87
87
|
return hsla(hsl);
|
|
88
88
|
},
|
|
89
|
+
fade: function (color, amount) {
|
|
90
|
+
var hsl = color.toHSL();
|
|
91
|
+
|
|
92
|
+
hsl.a = amount.value / 100;
|
|
93
|
+
hsl.a = clamp(hsl.a);
|
|
94
|
+
return hsla(hsl);
|
|
95
|
+
},
|
|
89
96
|
spin: function (color, amount) {
|
|
90
97
|
var hsl = color.toHSL();
|
|
91
98
|
var hue = (hsl.h + amount.value) % 360;
|
|
@@ -137,16 +144,63 @@ tree.functions = {
|
|
|
137
144
|
return new(tree.Quoted)('"' + str + '"', str);
|
|
138
145
|
},
|
|
139
146
|
round: function (n) {
|
|
147
|
+
return this._math('round', n);
|
|
148
|
+
},
|
|
149
|
+
ceil: function (n) {
|
|
150
|
+
return this._math('ceil', n);
|
|
151
|
+
},
|
|
152
|
+
floor: function (n) {
|
|
153
|
+
return this._math('floor', n);
|
|
154
|
+
},
|
|
155
|
+
_math: function (fn, n) {
|
|
140
156
|
if (n instanceof tree.Dimension) {
|
|
141
|
-
return new(tree.Dimension)(Math
|
|
157
|
+
return new(tree.Dimension)(Math[fn](number(n)), n.unit);
|
|
142
158
|
} else if (typeof(n) === 'number') {
|
|
143
|
-
return Math
|
|
159
|
+
return Math[fn](n);
|
|
144
160
|
} else {
|
|
145
|
-
|
|
146
|
-
error: "RuntimeError",
|
|
147
|
-
message: "math functions take numbers as parameters"
|
|
148
|
-
};
|
|
161
|
+
throw { type: "Argument", message: "argument must be a number" };
|
|
149
162
|
}
|
|
163
|
+
},
|
|
164
|
+
argb: function (color) {
|
|
165
|
+
return new(tree.Anonymous)(color.toARGB());
|
|
166
|
+
|
|
167
|
+
},
|
|
168
|
+
percentage: function (n) {
|
|
169
|
+
return new(tree.Dimension)(n.value * 100, '%');
|
|
170
|
+
},
|
|
171
|
+
color: function (n) {
|
|
172
|
+
if (n instanceof tree.Quoted) {
|
|
173
|
+
return new(tree.Color)(n.value.slice(1));
|
|
174
|
+
} else {
|
|
175
|
+
throw { type: "Argument", message: "argument must be a string" };
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
iscolor: function (n) {
|
|
179
|
+
return this._isa(n, tree.Color);
|
|
180
|
+
},
|
|
181
|
+
isnumber: function (n) {
|
|
182
|
+
return this._isa(n, tree.Dimension);
|
|
183
|
+
},
|
|
184
|
+
isstring: function (n) {
|
|
185
|
+
return this._isa(n, tree.Quoted);
|
|
186
|
+
},
|
|
187
|
+
iskeyword: function (n) {
|
|
188
|
+
return this._isa(n, tree.Keyword);
|
|
189
|
+
},
|
|
190
|
+
isurl: function (n) {
|
|
191
|
+
return this._isa(n, tree.URL);
|
|
192
|
+
},
|
|
193
|
+
ispixel: function (n) {
|
|
194
|
+
return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False;
|
|
195
|
+
},
|
|
196
|
+
ispercentage: function (n) {
|
|
197
|
+
return (n instanceof tree.Dimension) && n.unit === '%' ? tree.True : tree.False;
|
|
198
|
+
},
|
|
199
|
+
isem: function (n) {
|
|
200
|
+
return (n instanceof tree.Dimension) && n.unit === 'em' ? tree.True : tree.False;
|
|
201
|
+
},
|
|
202
|
+
_isa: function (n, Type) {
|
|
203
|
+
return (n instanceof Type) ? tree.True : tree.False;
|
|
150
204
|
}
|
|
151
205
|
};
|
|
152
206
|
|
|
@@ -171,4 +225,4 @@ function clamp(val) {
|
|
|
171
225
|
return Math.min(1, Math.max(0, val));
|
|
172
226
|
}
|
|
173
227
|
|
|
174
|
-
})(require('
|
|
228
|
+
})(require('./tree'));
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
var path = require('path'),
|
|
2
|
-
sys = require('
|
|
2
|
+
sys = require('util'),
|
|
3
3
|
fs = require('fs');
|
|
4
4
|
|
|
5
|
-
require.paths.unshift(path.join(__dirname, '..'));
|
|
6
|
-
|
|
7
5
|
var less = {
|
|
8
|
-
version: [1,
|
|
9
|
-
Parser: require('
|
|
10
|
-
importer: require('
|
|
11
|
-
tree: require('
|
|
6
|
+
version: [1, 3, 0],
|
|
7
|
+
Parser: require('./parser').Parser,
|
|
8
|
+
importer: require('./parser').importer,
|
|
9
|
+
tree: require('./tree'),
|
|
12
10
|
render: function (input, options, callback) {
|
|
13
11
|
options = options || {};
|
|
14
12
|
|
|
@@ -16,12 +14,12 @@ var less = {
|
|
|
16
14
|
callback = options, options = {};
|
|
17
15
|
}
|
|
18
16
|
|
|
19
|
-
var parser = new(
|
|
17
|
+
var parser = new(less.Parser)(options),
|
|
20
18
|
ee;
|
|
21
19
|
|
|
22
20
|
if (callback) {
|
|
23
21
|
parser.parse(input, function (e, root) {
|
|
24
|
-
callback(e, root.toCSS(options));
|
|
22
|
+
callback(e, root && root.toCSS && root.toCSS(options));
|
|
25
23
|
});
|
|
26
24
|
} else {
|
|
27
25
|
ee = new(require('events').EventEmitter);
|
|
@@ -36,15 +34,18 @@ var less = {
|
|
|
36
34
|
}
|
|
37
35
|
},
|
|
38
36
|
writeError: function (ctx, options) {
|
|
37
|
+
options = options || {};
|
|
38
|
+
|
|
39
39
|
var message = "";
|
|
40
40
|
var extract = ctx.extract;
|
|
41
41
|
var error = [];
|
|
42
|
-
|
|
43
|
-
options = options || {};
|
|
42
|
+
var stylize = options.color ? less.stylize : function (str) { return str };
|
|
44
43
|
|
|
45
44
|
if (options.silent) { return }
|
|
46
45
|
|
|
47
|
-
if (
|
|
46
|
+
if (ctx.stack) { return sys.error(stylize(ctx.stack, 'red')) }
|
|
47
|
+
|
|
48
|
+
if (!ctx.hasOwnProperty('index')) {
|
|
48
49
|
return sys.error(ctx.stack || ctx.message);
|
|
49
50
|
}
|
|
50
51
|
|
|
@@ -52,17 +53,20 @@ var less = {
|
|
|
52
53
|
error.push(stylize((ctx.line - 1) + ' ' + extract[0], 'grey'));
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
if (extract[1]) {
|
|
57
|
+
error.push(ctx.line + ' ' + extract[1].slice(0, ctx.column)
|
|
58
|
+
+ stylize(stylize(stylize(extract[1][ctx.column], 'bold')
|
|
59
|
+
+ extract[1].slice(ctx.column + 1), 'red'), 'inverse'));
|
|
60
|
+
}
|
|
58
61
|
|
|
59
62
|
if (typeof(extract[2]) === 'string') {
|
|
60
63
|
error.push(stylize((ctx.line + 1) + ' ' + extract[2], 'grey'));
|
|
61
64
|
}
|
|
62
65
|
error = error.join('\n') + '\033[0m\n';
|
|
63
66
|
|
|
64
|
-
message += stylize(ctx.message, 'red');
|
|
65
|
-
ctx.filename && (message += stylize(' in ', 'red') + ctx.filename
|
|
67
|
+
message += stylize(ctx.type + 'Error: ' + ctx.message, 'red');
|
|
68
|
+
ctx.filename && (message += stylize(' in ', 'red') + ctx.filename +
|
|
69
|
+
stylize(':' + ctx.line + ':' + ctx.column, 'grey'));
|
|
66
70
|
|
|
67
71
|
sys.error(message, error);
|
|
68
72
|
|
|
@@ -70,22 +74,25 @@ var less = {
|
|
|
70
74
|
sys.error(stylize('from ', 'red') + (ctx.filename || ''));
|
|
71
75
|
sys.error(stylize(ctx.callLine, 'grey') + ' ' + ctx.callExtract);
|
|
72
76
|
}
|
|
73
|
-
if (ctx.stack) { sys.error(stylize(ctx.stack, 'red')) }
|
|
74
77
|
}
|
|
75
78
|
};
|
|
76
79
|
|
|
77
|
-
['color',
|
|
78
|
-
'keyword',
|
|
79
|
-
'selector',
|
|
80
|
-
'call',
|
|
81
|
-
'mixin',
|
|
80
|
+
['color', 'directive', 'operation', 'dimension',
|
|
81
|
+
'keyword', 'variable', 'ruleset', 'element',
|
|
82
|
+
'selector', 'quoted', 'expression', 'rule',
|
|
83
|
+
'call', 'url', 'alpha', 'import',
|
|
84
|
+
'mixin', 'comment', 'anonymous', 'value',
|
|
85
|
+
'javascript', 'assignment', 'condition', 'paren',
|
|
86
|
+
'media'
|
|
82
87
|
].forEach(function (n) {
|
|
83
|
-
require(
|
|
88
|
+
require('./tree/' + n);
|
|
84
89
|
});
|
|
85
90
|
|
|
86
|
-
less.Parser.importer = function (file, paths, callback) {
|
|
91
|
+
less.Parser.importer = function (file, paths, callback, env) {
|
|
87
92
|
var pathname;
|
|
88
93
|
|
|
94
|
+
// TODO: Undo this at some point,
|
|
95
|
+
// or use different approach.
|
|
89
96
|
paths.unshift('.');
|
|
90
97
|
|
|
91
98
|
for (var i = 0; i < paths.length; i++) {
|
|
@@ -100,23 +107,26 @@ less.Parser.importer = function (file, paths, callback) {
|
|
|
100
107
|
|
|
101
108
|
if (pathname) {
|
|
102
109
|
fs.readFile(pathname, 'utf-8', function(e, data) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
});
|
|
110
|
+
if (e) return callback(e);
|
|
111
|
+
|
|
112
|
+
new(less.Parser)({
|
|
113
|
+
paths: [path.dirname(pathname)].concat(paths),
|
|
114
|
+
filename: pathname
|
|
115
|
+
}).parse(data, function (e, root) {
|
|
116
|
+
callback(e, root, data);
|
|
117
|
+
});
|
|
112
118
|
});
|
|
113
119
|
} else {
|
|
114
|
-
|
|
115
|
-
|
|
120
|
+
if (typeof(env.errback) === "function") {
|
|
121
|
+
env.errback(file, paths, callback);
|
|
122
|
+
} else {
|
|
123
|
+
callback({ type: 'File', message: "'" + file + "' wasn't found.\n" });
|
|
124
|
+
}
|
|
116
125
|
}
|
|
117
126
|
}
|
|
118
127
|
|
|
119
|
-
require('
|
|
128
|
+
require('./functions');
|
|
129
|
+
require('./colors');
|
|
120
130
|
|
|
121
131
|
for (var k in less) { exports[k] = less[k] }
|
|
122
132
|
|
|
@@ -134,4 +144,5 @@ function stylize(str, style) {
|
|
|
134
144
|
return '\033[' + styles[style][0] + 'm' + str +
|
|
135
145
|
'\033[' + styles[style][1] + 'm';
|
|
136
146
|
}
|
|
147
|
+
less.stylize = stylize;
|
|
137
148
|
|