less 1.2.2 → 1.3.3

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 (197) hide show
  1. package/.npmignore +1 -0
  2. package/CHANGELOG.md +118 -0
  3. package/CONTRIBUTING.md +50 -0
  4. package/Makefile +14 -2
  5. package/benchmark/benchmark.less +11 -11
  6. package/benchmark/less-benchmark.js +1 -1
  7. package/bin/lessc +77 -21
  8. package/build/amd.js +6 -0
  9. package/build/ecma-5.js +120 -0
  10. package/build/header.js +7 -0
  11. package/build/require-rhino.js +7 -0
  12. package/build/require.js +7 -0
  13. package/lib/less/browser.js +192 -53
  14. package/lib/less/colors.js +1 -0
  15. package/lib/less/functions.js +159 -10
  16. package/lib/less/index.js +125 -56
  17. package/lib/less/lessc_helper.js +62 -0
  18. package/lib/less/parser.js +391 -154
  19. package/lib/less/rhino.js +84 -23
  20. package/lib/less/tree/anonymous.js +15 -1
  21. package/lib/less/tree/assignment.js +3 -1
  22. package/lib/less/tree/call.js +12 -6
  23. package/lib/less/tree/color.js +10 -0
  24. package/lib/less/tree/dimension.js +3 -1
  25. package/lib/less/tree/directive.js +10 -10
  26. package/lib/less/tree/element.js +8 -7
  27. package/lib/less/tree/import.js +17 -14
  28. package/lib/less/tree/media.js +121 -0
  29. package/lib/less/tree/mixin.js +133 -45
  30. package/lib/less/tree/operation.js +5 -0
  31. package/lib/less/tree/quoted.js +15 -1
  32. package/lib/less/tree/ratio.js +13 -0
  33. package/lib/less/tree/rule.js +7 -0
  34. package/lib/less/tree/ruleset.js +236 -37
  35. package/lib/less/tree/selector.js +21 -11
  36. package/lib/less/tree/unicode-descriptor.js +13 -0
  37. package/lib/less/tree/url.js +16 -14
  38. package/lib/less/tree/variable.js +13 -1
  39. package/lib/less/tree.js +28 -0
  40. package/package.json +13 -3
  41. package/test/browser/common.js +74 -0
  42. package/test/browser/css/relative-urls/urls.css +36 -0
  43. package/test/browser/css/rootpath/urls.css +36 -0
  44. package/test/browser/css/rootpath-relative/urls.css +36 -0
  45. package/test/browser/css/urls.css +36 -0
  46. package/test/browser/jasmine-html.js +681 -0
  47. package/test/browser/jasmine.css +82 -0
  48. package/test/browser/jasmine.js +2600 -0
  49. package/test/browser/less/imports/urls.less +4 -0
  50. package/test/browser/less/imports/urls2.less +4 -0
  51. package/test/browser/less/relative-urls/urls.less +33 -0
  52. package/test/browser/less/rootpath/urls.less +33 -0
  53. package/test/browser/less/rootpath-relative/urls.less +33 -0
  54. package/test/browser/less/urls.less +33 -0
  55. package/test/browser/phantom-runner.js +139 -0
  56. package/test/browser/runner-browser.js +3 -0
  57. package/test/browser/runner-main.js +15 -0
  58. package/test/browser/runner-relative-urls.js +4 -0
  59. package/test/browser/runner-rootpath-relative.js +5 -0
  60. package/test/browser/runner-rootpath.js +4 -0
  61. package/test/browser/template.htm +10 -0
  62. package/test/browser-test-prepare.js +29 -0
  63. package/test/css/charsets.css +1 -0
  64. package/test/css/colors.css +22 -0
  65. package/test/css/comments.css +7 -0
  66. package/test/css/css-3.css +57 -2
  67. package/test/css/css-escapes.css +4 -0
  68. package/test/css/css.css +11 -11
  69. package/test/css/debug/linenumbers-all.css +43 -0
  70. package/test/css/debug/linenumbers-comments.css +35 -0
  71. package/test/css/debug/linenumbers-mediaquery.css +35 -0
  72. package/test/css/functions.css +59 -2
  73. package/test/css/ie-filters.css +7 -3
  74. package/test/css/import-once.css +3 -0
  75. package/test/css/import.css +7 -9
  76. package/test/css/javascript.css +3 -2
  77. package/test/css/media.css +168 -0
  78. package/test/css/mixins-args.css +35 -4
  79. package/test/css/mixins-guards.css +13 -0
  80. package/test/css/mixins-important.css +21 -0
  81. package/test/css/mixins-named-args.css +27 -0
  82. package/test/css/mixins-pattern.css +4 -6
  83. package/test/css/mixins.css +50 -0
  84. package/test/css/scope.css +20 -0
  85. package/test/css/selectors.css +76 -0
  86. package/test/css/static-urls/urls.css +42 -0
  87. package/test/css/strings.css +2 -2
  88. package/test/css/urls.css +42 -0
  89. package/test/css/variables.css +0 -1
  90. package/test/css/whitespace.css +4 -0
  91. package/test/less/charsets.less +3 -0
  92. package/test/less/colors.less +27 -0
  93. package/test/less/comments.less +12 -0
  94. package/test/less/css-3.less +54 -6
  95. package/test/less/css-escapes.less +6 -1
  96. package/test/less/css.less +14 -12
  97. package/test/less/debug/import/test.less +25 -0
  98. package/test/less/debug/linenumbers.less +23 -0
  99. package/test/less/errors/bad-variable-declaration1.less +1 -0
  100. package/test/less/errors/bad-variable-declaration1.txt +2 -0
  101. package/test/less/errors/comment-in-selector.less +1 -0
  102. package/test/less/errors/comment-in-selector.txt +2 -0
  103. package/test/less/errors/import-missing.less +1 -0
  104. package/test/less/errors/import-missing.txt +3 -0
  105. package/test/less/errors/import-no-semi.less +1 -0
  106. package/test/less/errors/import-no-semi.txt +2 -0
  107. package/test/less/errors/import-subfolder1.less +1 -0
  108. package/test/less/errors/import-subfolder1.txt +3 -0
  109. package/test/less/errors/import-subfolder2.less +1 -0
  110. package/test/less/errors/import-subfolder2.txt +2 -0
  111. package/test/less/errors/imports/import-subfolder1.less +1 -0
  112. package/test/less/errors/imports/import-subfolder2.less +1 -0
  113. package/test/less/errors/imports/import-test.less +4 -0
  114. package/test/less/errors/imports/subfolder/mixin-not-defined.less +1 -0
  115. package/test/less/errors/imports/subfolder/parse-error-curly-bracket.less +1 -0
  116. package/test/less/errors/javascript-error.less +3 -0
  117. package/test/less/errors/javascript-error.txt +4 -0
  118. package/test/less/errors/mixed-mixin-definition-args-1.less +6 -0
  119. package/test/less/errors/mixed-mixin-definition-args-1.txt +4 -0
  120. package/test/less/errors/mixed-mixin-definition-args-2.less +6 -0
  121. package/test/less/errors/mixed-mixin-definition-args-2.txt +4 -0
  122. package/test/less/errors/mixin-not-defined.less +11 -0
  123. package/test/less/errors/mixin-not-defined.txt +3 -0
  124. package/test/less/errors/mixin-not-matched.less +6 -0
  125. package/test/less/errors/mixin-not-matched.txt +3 -0
  126. package/test/less/errors/mixin-not-matched2.less +6 -0
  127. package/test/less/errors/mixin-not-matched2.txt +3 -0
  128. package/test/less/errors/parse-error-curly-bracket.less +1 -0
  129. package/test/less/errors/parse-error-curly-bracket.txt +2 -0
  130. package/test/less/errors/parse-error-missing-bracket.less +2 -0
  131. package/test/less/errors/parse-error-missing-bracket.txt +2 -0
  132. package/test/less/errors/parse-error-with-import.less +13 -0
  133. package/test/less/errors/parse-error-with-import.txt +4 -0
  134. package/test/less/errors/property-ie5-hack.less +3 -0
  135. package/test/less/errors/property-ie5-hack.txt +4 -0
  136. package/test/less/errors/recursive-variable.less +1 -0
  137. package/test/less/errors/recursive-variable.txt +2 -0
  138. package/test/less/functions.less +64 -2
  139. package/test/less/ie-filters.less +7 -0
  140. package/test/less/import/deeper/import-once-test-a.less +1 -0
  141. package/test/less/import/import-and-relative-paths-test.less +6 -0
  142. package/test/less/import/import-charset-test.less +1 -0
  143. package/test/less/import/import-once-test-c.less +6 -0
  144. package/test/less/import/import-test-a.less +1 -0
  145. package/test/less/import/import-test-c.less +0 -1
  146. package/test/less/import/imports/font.less +8 -0
  147. package/test/less/import/imports/logo.less +5 -0
  148. package/test/less/import/urls.less +1 -0
  149. package/test/less/import-once.less +4 -0
  150. package/test/less/import.less +2 -1
  151. package/test/less/javascript.less +4 -2
  152. package/test/less/media.less +169 -1
  153. package/test/less/mixins-args.less +54 -11
  154. package/test/less/mixins-guards.less +30 -0
  155. package/test/less/mixins-important.less +4 -0
  156. package/test/less/mixins-named-args.less +36 -0
  157. package/test/less/mixins-pattern.less +3 -0
  158. package/test/less/mixins.less +47 -0
  159. package/test/less/scope.less +48 -1
  160. package/test/less/selectors.less +88 -0
  161. package/test/less/static-urls/urls.less +33 -0
  162. package/test/less/strings.less +1 -1
  163. package/test/less/urls.less +33 -0
  164. package/test/less/variables.less +0 -1
  165. package/test/less/whitespace.less +7 -0
  166. package/test/less-test.js +145 -36
  167. package/bench.css +0 -5943
  168. package/benchmark/b1.less +0 -3980
  169. package/dist/less-1.1.0.js +0 -2695
  170. package/dist/less-1.1.0.min.js +0 -16
  171. package/dist/less-1.1.1.js +0 -2710
  172. package/dist/less-1.1.1.min.js +0 -16
  173. package/dist/less-1.1.2.js +0 -2712
  174. package/dist/less-1.1.2.min.js +0 -16
  175. package/dist/less-1.1.3.js +0 -2721
  176. package/dist/less-1.1.3.min.js +0 -16
  177. package/dist/less-1.1.4.js +0 -2769
  178. package/dist/less-1.1.4.min.js +0 -16
  179. package/dist/less-1.1.5.js +0 -2805
  180. package/dist/less-1.1.5.min.js +0 -9
  181. package/dist/less-1.1.6.js +0 -3004
  182. package/dist/less-1.1.6.min.js +0 -9
  183. package/dist/less-1.2.0.js +0 -3293
  184. package/dist/less-1.2.0.min.js +0 -9
  185. package/dist/less-1.2.1.js +0 -3318
  186. package/dist/less-1.2.1.min.js +0 -9
  187. package/dist/less-1.2.2.js +0 -3337
  188. package/dist/less-1.2.2.min.js +0 -9
  189. package/dist/less-rhino-1.1.3.js +0 -2460
  190. package/dist/less-rhino-1.1.5.js +0 -2481
  191. package/foo.less +0 -2
  192. package/lib/less/cssmin.js +0 -355
  193. package/test/html/index.html +0 -10
  194. package/test/html/less.js +0 -3333
  195. package/test/html/lib.less +0 -2
  196. package/test/html/styles.less +0 -8
  197. package/x.less +0 -4
@@ -0,0 +1,33 @@
1
+ @font-face {
2
+ src: url("/fonts/garamond-pro.ttf");
3
+ src: local(Futura-Medium),
4
+ url(fonts.svg#MyGeometricModern) format("svg");
5
+ }
6
+ #shorthands {
7
+ background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px;
8
+ }
9
+ #misc {
10
+ background-image: url(images/image.jpg);
11
+ }
12
+ #data-uri {
13
+ background: url(data:image/png;charset=utf-8;base64,
14
+ kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/
15
+ k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U
16
+ kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);
17
+ background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);
18
+ background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700);
19
+ }
20
+
21
+ #svg-data-uri {
22
+ background: transparent url('data:image/svg+xml, <svg version="1.1"><g></g></svg>');
23
+ }
24
+
25
+ .comma-delimited {
26
+ background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);
27
+ }
28
+ .values {
29
+ @a: 'Trebuchet';
30
+ url: url(@a);
31
+ }
32
+
33
+ @import "import/import-and-relative-paths-test";
@@ -35,7 +35,6 @@
35
35
  @multi: 'A', B, C;
36
36
  font-family: @a, @a, @a;
37
37
  color: @c !important;
38
- url: url(@a);
39
38
  multi: something @multi, @a;
40
39
  }
41
40
 
@@ -35,3 +35,10 @@
35
35
  .empty {
36
36
 
37
37
  }
38
+ .sel
39
+ .newline_ws .tab_ws {
40
+ color:
41
+ white;
42
+ background-position: 45
43
+ -23;
44
+ }
package/test/less-test.js CHANGED
@@ -3,47 +3,170 @@ var path = require('path'),
3
3
  sys = require('util');
4
4
 
5
5
  var less = require('../lib/less');
6
+ var stylize = require('../lib/less/lessc_helper').stylize;
7
+
8
+ var oneTestOnly = process.argv[2];
9
+
10
+ var totalTests = 0,
11
+ failedTests = 0,
12
+ passedTests = 0;
6
13
 
7
14
  less.tree.functions.add = function (a, b) {
8
15
  return new(less.tree.Dimension)(a.value + b.value);
9
- }
16
+ };
10
17
  less.tree.functions.increment = function (a) {
11
18
  return new(less.tree.Dimension)(a.value + 1);
12
- }
19
+ };
13
20
  less.tree.functions._color = function (str) {
14
21
  if (str.value === "evil red") { return new(less.tree.Color)("600") }
15
- }
22
+ };
16
23
 
17
24
  sys.puts("\n" + stylize("LESS", 'underline') + "\n");
18
25
 
19
- fs.readdirSync('test/less').forEach(function (file) {
20
- if (! /\.less/.test(file)) { return }
26
+ runTestSet({relativeUrls: true});
21
27
 
22
- toCSS('test/less/' + file, function (err, less) {
23
- var name = path.basename(file, '.less');
24
-
25
- fs.readFile(path.join('test/css', name) + '.css', 'utf-8', function (e, css) {
26
- sys.print("- " + name + ": ")
27
- if (less === css) { sys.print(stylize('OK', 'green')) }
28
- else if (err) {
29
- sys.print(stylize("ERROR: " + (err && err.message), 'red'));
28
+ runTestSet(null, "errors/", function(name, err, compiledLess, doReplacements) {
29
+ fs.readFile(path.join('test/less/', name) + '.txt', 'utf8', function (e, expectedErr) {
30
+ sys.print("- " + name + ": ");
31
+ expectedErr = doReplacements(expectedErr, 'test/less/errors/');
32
+ if (!err) {
33
+ if (compiledLess) {
34
+ fail("No Error", 'red');
35
+ } else {
36
+ fail("No Error, No Output");
37
+ }
38
+ } else {
39
+ var errMessage = less.formatError(err);
40
+ if (errMessage === expectedErr) {
41
+ ok('OK');
30
42
  } else {
31
- sys.print(stylize("FAIL", 'yellow'));
43
+ difference("FAIL", expectedErr, errMessage);
44
+ }
45
+ }
46
+ sys.puts("");
47
+ });}, null, function(input, directory) {
48
+ return input.replace(
49
+ "{path}", path.join(process.cwd(), "/test/less/errors/"))
50
+ .replace("{pathrel}", path.join("test", "less", "errors/"))
51
+ .replace(/\r\n/g, '\n');
52
+ });
53
+
54
+ runTestSet({dumpLineNumbers: 'comments'}, "debug/", null,
55
+ function(name) { return name + '-comments'; });
56
+ runTestSet({dumpLineNumbers: 'mediaquery'}, "debug/", null,
57
+ function(name) { return name + '-mediaquery'; });
58
+ runTestSet({dumpLineNumbers: 'all'}, "debug/", null,
59
+ function(name) { return name + '-all'; });
60
+ runTestSet({relativeUrls: false, rootpath: "folder (1)/"}, "static-urls/");
61
+
62
+ function globalReplacements(input, directory) {
63
+ var p = path.join(process.cwd(), directory),
64
+ pathimport = path.join(process.cwd(), directory + "import/"),
65
+ pathesc = p.replace(/[.:\/]/g, '\\$&'),
66
+ pathimportesc = pathimport.replace(/[.:\/]/g, '\\$&');
67
+
68
+ return input.replace(/\{path\}/g, p)
69
+ .replace(/\{pathesc\}/g, pathesc)
70
+ .replace(/\{pathimport\}/g, pathimport)
71
+ .replace(/\{pathimportesc\}/g, pathimportesc)
72
+ .replace(/\r\n/g, '\n');
73
+ }
74
+
75
+ function runTestSet(options, foldername, verifyFunction, nameModifier, doReplacements) {
76
+ foldername = foldername || "";
77
+
78
+ if(!doReplacements)
79
+ doReplacements = globalReplacements;
80
+
81
+ fs.readdirSync(path.join('test/less/', foldername)).forEach(function (file) {
82
+ if (! /\.less/.test(file)) { return }
83
+
84
+ var name = foldername + path.basename(file, '.less');
85
+
86
+ if (oneTestOnly && name !== oneTestOnly) { return; }
87
+
88
+ totalTests++;
89
+
90
+ toCSS(options, path.join('test/less/', foldername + file), function (err, less) {
91
+
92
+ if (verifyFunction) {
93
+ return verifyFunction(name, err, less, doReplacements);
32
94
  }
33
- sys.puts("");
95
+ var css_name = name;
96
+ if(nameModifier) css_name=nameModifier(name);
97
+ fs.readFile(path.join('test/css', css_name) + '.css', 'utf8', function (e, css) {
98
+ sys.print("- " + css_name + ": ")
99
+
100
+ css = css && doReplacements(css, 'test/less/' + foldername);
101
+ if (less === css) { ok('OK'); }
102
+ else if (err) {
103
+ fail("ERROR: " + (err && err.message));
104
+ } else {
105
+ difference("FAIL", css, less);
106
+ }
107
+ sys.puts("");
108
+ });
34
109
  });
35
110
  });
36
- });
111
+ }
112
+
113
+ function diff(left, right) {
114
+ sys.puts("");
115
+ require('diff').diffLines(left, right).forEach(function(item) {
116
+ if(item.added || item.removed) {
117
+ sys.print(stylize(item.value, item.added ? 'green' : 'red'));
118
+ } else {
119
+ sys.print(item.value);
120
+ }
121
+ });
122
+ }
123
+
124
+ function fail(msg) {
125
+ sys.print(stylize(msg, 'red'));
126
+ failedTests++;
127
+ endTest();
128
+ }
37
129
 
38
- function toCSS(path, callback) {
130
+ function difference(msg, left, right) {
131
+ sys.print(stylize(msg, 'yellow'));
132
+ failedTests++;
133
+
134
+ diff(left, right);
135
+ endTest();
136
+ }
137
+
138
+ function ok(msg) {
139
+ sys.print(stylize(msg, 'green'));
140
+ passedTests++;
141
+ endTest();
142
+ }
143
+
144
+ function endTest() {
145
+ if (failedTests + passedTests === totalTests) {
146
+ sys.puts("");
147
+ sys.puts("");
148
+ if (failedTests > 0) {
149
+ sys.print(failedTests);
150
+ sys.print(stylize(" Failed", "red"));
151
+ sys.print(", " + passedTests + " passed");
152
+ } else {
153
+ sys.print(stylize("All Passed ", "green"));
154
+ sys.print(passedTests + " run");
155
+ }
156
+ }
157
+ }
158
+
159
+ function toCSS(options, path, callback) {
39
160
  var tree, css;
40
- fs.readFile(path, 'utf-8', function (e, str) {
161
+ options = options || {};
162
+ fs.readFile(path, 'utf8', function (e, str) {
41
163
  if (e) { return callback(e) }
164
+
165
+ options.paths = [require('path').dirname(path)];
166
+ options.filename = require('path').resolve(process.cwd(), path);
167
+ options.optimization = options.optimization || 0;
42
168
 
43
- new(less.Parser)({
44
- paths: [require('path').dirname(path)],
45
- optimization: 0
46
- }).parse(str, function (err, tree) {
169
+ new(less.Parser)(options).parse(str, function (err, tree) {
47
170
  if (err) {
48
171
  callback(err);
49
172
  } else {
@@ -57,17 +180,3 @@ function toCSS(path, callback) {
57
180
  });
58
181
  });
59
182
  }
60
-
61
- // Stylize a string
62
- function stylize(str, style) {
63
- var styles = {
64
- 'bold' : [1, 22],
65
- 'inverse' : [7, 27],
66
- 'underline' : [4, 24],
67
- 'yellow' : [33, 39],
68
- 'green' : [32, 39],
69
- 'red' : [31, 39]
70
- };
71
- return '\033[' + styles[style][0] + 'm' + str +
72
- '\033[' + styles[style][1] + 'm';
73
- }