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.
Files changed (112) hide show
  1. data/.gitmodules +0 -3
  2. data/.travis.yml +10 -0
  3. data/README.md +1 -1
  4. data/Rakefile +2 -0
  5. data/bin/lessc +21 -2
  6. data/less.gemspec +5 -3
  7. data/lib/less/defaults.rb +13 -0
  8. data/lib/less/js/CHANGELOG +41 -0
  9. data/lib/less/js/Makefile +21 -2
  10. data/lib/less/js/benchmark/benchmark.less +11 -11
  11. data/lib/less/js/benchmark/less-benchmark.js +3 -5
  12. data/lib/less/js/bin/lessc +52 -18
  13. data/lib/less/js/build/amd.js +6 -0
  14. data/lib/less/js/build/require-rhino.js +7 -0
  15. data/lib/less/js/dist/{less-1.0.44.js → less-1.1.4.js} +159 -45
  16. data/lib/less/js/dist/less-1.1.4.min.js +16 -0
  17. data/lib/less/js/dist/less-1.1.5.js +2805 -0
  18. data/lib/less/js/dist/less-1.1.5.min.js +9 -0
  19. data/lib/less/js/dist/less-1.1.6.js +3004 -0
  20. data/lib/less/js/dist/less-1.1.6.min.js +9 -0
  21. data/lib/less/js/dist/less-1.2.0.js +3293 -0
  22. data/lib/less/js/dist/less-1.2.0.min.js +9 -0
  23. data/lib/less/js/dist/less-1.2.1.js +3318 -0
  24. data/lib/less/js/dist/less-1.2.1.min.js +9 -0
  25. data/lib/less/js/dist/less-1.2.2.js +3337 -0
  26. data/lib/less/js/dist/less-1.2.2.min.js +9 -0
  27. data/lib/less/js/dist/less-1.3.0.js +3478 -0
  28. data/lib/less/js/dist/less-1.3.0.min.js +9 -0
  29. data/lib/less/js/dist/less-rhino-1.1.3.js +2460 -0
  30. data/lib/less/js/dist/less-rhino-1.1.5.js +2481 -0
  31. data/lib/less/js/lib/less/browser.js +38 -27
  32. data/lib/less/js/lib/less/colors.js +151 -0
  33. data/lib/less/js/lib/less/cssmin.js +355 -0
  34. data/lib/less/js/lib/less/functions.js +61 -7
  35. data/lib/less/js/lib/less/index.js +48 -37
  36. data/lib/less/js/lib/less/parser.js +327 -120
  37. data/lib/less/js/lib/less/rhino.js +62 -0
  38. data/lib/less/js/lib/less/tree/alpha.js +1 -1
  39. data/lib/less/js/lib/less/tree/anonymous.js +1 -1
  40. data/lib/less/js/lib/less/tree/assignment.js +17 -0
  41. data/lib/less/js/lib/less/tree/call.js +7 -4
  42. data/lib/less/js/lib/less/tree/color.js +9 -6
  43. data/lib/less/js/lib/less/tree/comment.js +1 -1
  44. data/lib/less/js/lib/less/tree/condition.js +42 -0
  45. data/lib/less/js/lib/less/tree/dimension.js +16 -1
  46. data/lib/less/js/lib/less/tree/directive.js +4 -2
  47. data/lib/less/js/lib/less/tree/element.js +20 -5
  48. data/lib/less/js/lib/less/tree/expression.js +2 -2
  49. data/lib/less/js/lib/less/tree/import.js +16 -14
  50. data/lib/less/js/lib/less/tree/javascript.js +1 -1
  51. data/lib/less/js/lib/less/tree/keyword.js +12 -2
  52. data/lib/less/js/lib/less/tree/media.js +114 -0
  53. data/lib/less/js/lib/less/tree/mixin.js +49 -20
  54. data/lib/less/js/lib/less/tree/operation.js +1 -1
  55. data/lib/less/js/lib/less/tree/paren.js +16 -0
  56. data/lib/less/js/lib/less/tree/quoted.js +2 -2
  57. data/lib/less/js/lib/less/tree/rule.js +8 -4
  58. data/lib/less/js/lib/less/tree/ruleset.js +49 -12
  59. data/lib/less/js/lib/less/tree/selector.js +18 -4
  60. data/lib/less/js/lib/less/tree/url.js +2 -2
  61. data/lib/less/js/lib/less/tree/value.js +1 -1
  62. data/lib/less/js/lib/less/tree/variable.js +5 -3
  63. data/lib/less/js/lib/less/tree.js +6 -2
  64. data/lib/less/js/package.json +2 -2
  65. data/lib/less/js/test/css/colors.css +16 -0
  66. data/lib/less/js/test/css/comments.css +9 -5
  67. data/lib/less/js/test/css/css-3.css +18 -2
  68. data/lib/less/js/test/css/css-escapes.css +1 -1
  69. data/lib/less/js/test/css/css.css +11 -4
  70. data/lib/less/js/test/css/functions.css +13 -0
  71. data/lib/less/js/test/css/ie-filters.css +5 -0
  72. data/lib/less/js/test/css/import.css +12 -3
  73. data/lib/less/js/test/css/media.css +60 -2
  74. data/lib/less/js/test/css/mixins-args.css +17 -2
  75. data/lib/less/js/test/css/mixins-guards.css +58 -0
  76. data/lib/less/js/test/css/mixins-important.css +17 -0
  77. data/lib/less/js/test/css/mixins-pattern.css +4 -6
  78. data/lib/less/js/test/css/mixins.css +21 -0
  79. data/lib/less/js/test/css/operations.css +3 -0
  80. data/lib/less/js/test/css/parens.css +1 -1
  81. data/lib/less/js/test/css/rulesets.css +6 -2
  82. data/lib/less/js/test/css/scope.css +6 -6
  83. data/lib/less/js/test/css/selectors.css +38 -1
  84. data/lib/less/js/test/css/strings.css +6 -4
  85. data/lib/less/js/test/css/variables.css +3 -0
  86. data/lib/less/js/test/css/whitespace.css +5 -3
  87. data/lib/less/js/test/less/colors.less +19 -0
  88. data/lib/less/js/test/less/comments.less +8 -6
  89. data/lib/less/js/test/less/css-3.less +10 -0
  90. data/lib/less/js/test/less/css.less +4 -0
  91. data/lib/less/js/test/less/functions.less +15 -1
  92. data/lib/less/js/test/less/ie-filters.less +8 -0
  93. data/lib/less/js/test/less/import/import-test-e.less +2 -0
  94. data/lib/less/js/test/less/import.less +4 -1
  95. data/lib/less/js/test/less/media.less +55 -1
  96. data/lib/less/js/test/less/mixins-args.less +20 -1
  97. data/lib/less/js/test/less/mixins-guards.less +94 -0
  98. data/lib/less/js/test/less/mixins-important.less +18 -0
  99. data/lib/less/js/test/less/mixins-pattern.less +3 -0
  100. data/lib/less/js/test/less/mixins.less +20 -0
  101. data/lib/less/js/test/less/operations.less +4 -0
  102. data/lib/less/js/test/less/selectors.less +31 -0
  103. data/lib/less/js/test/less/strings.less +2 -0
  104. data/lib/less/js/test/less/variables.less +4 -0
  105. data/lib/less/js/test/less-test.js +3 -5
  106. data/lib/less/loader.rb +24 -25
  107. data/lib/less/parser.rb +32 -6
  108. data/lib/less/version.rb +1 -1
  109. data/lib/less.rb +7 -8
  110. data/spec/less/faulty/faulty.less +3 -0
  111. data/spec/less/parser_spec.rb +28 -2
  112. 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.round(number(n)), n.unit);
157
+ return new(tree.Dimension)(Math[fn](number(n)), n.unit);
142
158
  } else if (typeof(n) === 'number') {
143
- return Math.round(n);
159
+ return Math[fn](n);
144
160
  } else {
145
- throw {
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('less/tree'));
228
+ })(require('./tree'));
@@ -1,14 +1,12 @@
1
1
  var path = require('path'),
2
- sys = require('sys'),
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, 1, 3],
9
- Parser: require('less/parser').Parser,
10
- importer: require('less/parser').importer,
11
- tree: require('less/tree'),
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(this.Parser)(options),
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 (!ctx.index) {
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
- error.push(ctx.line + ' ' + extract[1].slice(0, ctx.column)
56
- + stylize(stylize(extract[1][ctx.column], 'bold')
57
- + extract[1].slice(ctx.column + 1), 'yellow'));
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', 'directive', 'operation', 'dimension',
78
- 'keyword', 'variable', 'ruleset', 'element',
79
- 'selector', 'quoted', 'expression', 'rule',
80
- 'call', 'url', 'alpha', 'import',
81
- 'mixin', 'comment', 'anonymous', 'value', 'javascript'
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(path.join('less', 'tree', n));
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
- if (e) sys.error(e);
104
-
105
- new(less.Parser)({
106
- paths: [path.dirname(pathname)],
107
- filename: pathname
108
- }).parse(data, function (e, root) {
109
- if (e) less.writeError(e);
110
- callback(root);
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
- sys.error("file '" + file + "' wasn't found.\n");
115
- process.exit(1);
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('less/functions');
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