less 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/lib/less/js/.gitignore +7 -0
  3. data/lib/less/js/.npmignore +1 -0
  4. data/lib/less/js/CHANGELOG.md +118 -0
  5. data/lib/less/js/CONTRIBUTING.md +50 -0
  6. data/lib/less/js/Makefile +14 -2
  7. data/lib/less/js/bin/lessc +72 -21
  8. data/lib/less/js/dist/less-1.3.1.js +4011 -0
  9. data/lib/less/js/dist/less-1.3.1.min.js +9 -0
  10. data/lib/less/js/dist/less-1.3.2.js +4401 -0
  11. data/lib/less/js/dist/less-1.3.2.min.js +9 -0
  12. data/lib/less/js/dist/less-1.3.3.js +4413 -0
  13. data/lib/less/js/dist/less-1.3.3.min.js +9 -0
  14. data/lib/less/js/dist/less-rhino-1.3.1.js +3725 -0
  15. data/lib/less/js/dist/less-rhino-1.3.2.js +3990 -0
  16. data/lib/less/js/dist/less-rhino-1.3.3.js +4002 -0
  17. data/lib/less/js/lib/less/browser.js +192 -53
  18. data/lib/less/js/lib/less/colors.js +1 -0
  19. data/lib/less/js/lib/less/functions.js +159 -10
  20. data/lib/less/js/lib/less/index.js +124 -56
  21. data/lib/less/js/lib/less/lessc_helper.js +62 -0
  22. data/lib/less/js/lib/less/parser.js +352 -135
  23. data/lib/less/js/lib/less/rhino.js +84 -23
  24. data/lib/less/js/lib/less/tree.js +28 -0
  25. data/lib/less/js/lib/less/tree/anonymous.js +15 -1
  26. data/lib/less/js/lib/less/tree/assignment.js +3 -1
  27. data/lib/less/js/lib/less/tree/call.js +12 -6
  28. data/lib/less/js/lib/less/tree/color.js +10 -0
  29. data/lib/less/js/lib/less/tree/dimension.js +3 -1
  30. data/lib/less/js/lib/less/tree/directive.js +9 -5
  31. data/lib/less/js/lib/less/tree/element.js +8 -6
  32. data/lib/less/js/lib/less/tree/import.js +16 -13
  33. data/lib/less/js/lib/less/tree/media.js +16 -9
  34. data/lib/less/js/lib/less/tree/mixin.js +123 -46
  35. data/lib/less/js/lib/less/tree/operation.js +5 -0
  36. data/lib/less/js/lib/less/tree/quoted.js +15 -1
  37. data/lib/less/js/lib/less/tree/ratio.js +13 -0
  38. data/lib/less/js/lib/less/tree/rule.js +7 -0
  39. data/lib/less/js/lib/less/tree/ruleset.js +232 -34
  40. data/lib/less/js/lib/less/tree/selector.js +21 -11
  41. data/lib/less/js/lib/less/tree/unicode-descriptor.js +13 -0
  42. data/lib/less/js/lib/less/tree/url.js +16 -14
  43. data/lib/less/js/lib/less/tree/variable.js +13 -1
  44. data/lib/less/js/package.json +13 -3
  45. data/lib/less/js/test/browser-test-prepare.js +29 -0
  46. data/lib/less/js/test/browser/common.js +74 -0
  47. data/lib/less/js/test/browser/css/relative-urls/urls.css +36 -0
  48. data/lib/less/js/test/browser/css/rootpath-relative/urls.css +36 -0
  49. data/lib/less/js/test/browser/css/rootpath/urls.css +36 -0
  50. data/lib/less/js/test/browser/css/urls.css +36 -0
  51. data/lib/less/js/test/browser/jasmine-html.js +681 -0
  52. data/lib/less/js/test/browser/jasmine.css +82 -0
  53. data/lib/less/js/test/browser/jasmine.js +2600 -0
  54. data/lib/less/js/test/browser/less/imports/urls.less +4 -0
  55. data/lib/less/js/test/browser/less/imports/urls2.less +4 -0
  56. data/lib/less/js/test/browser/less/relative-urls/urls.less +33 -0
  57. data/lib/less/js/test/browser/less/rootpath-relative/urls.less +33 -0
  58. data/lib/less/js/test/browser/less/rootpath/urls.less +33 -0
  59. data/lib/less/js/test/browser/less/urls.less +33 -0
  60. data/lib/less/js/test/browser/phantom-runner.js +139 -0
  61. data/lib/less/js/test/browser/runner-browser.js +3 -0
  62. data/lib/less/js/test/browser/runner-main.js +15 -0
  63. data/lib/less/js/test/browser/runner-relative-urls.js +4 -0
  64. data/lib/less/js/test/browser/runner-rootpath-relative.js +5 -0
  65. data/lib/less/js/test/browser/runner-rootpath.js +4 -0
  66. data/lib/less/js/test/browser/template.htm +10 -0
  67. data/lib/less/js/test/css/charsets.css +1 -0
  68. data/lib/less/js/test/css/colors.css +22 -0
  69. data/lib/less/js/test/css/comments.css +7 -0
  70. data/lib/less/js/test/css/css-3.css +57 -2
  71. data/lib/less/js/test/css/css-escapes.css +4 -0
  72. data/lib/less/js/test/css/css.css +11 -11
  73. data/lib/less/js/test/css/debug/linenumbers-all.css +43 -0
  74. data/lib/less/js/test/css/debug/linenumbers-comments.css +35 -0
  75. data/lib/less/js/test/css/debug/linenumbers-mediaquery.css +35 -0
  76. data/lib/less/js/test/css/functions.css +59 -2
  77. data/lib/less/js/test/css/ie-filters.css +7 -3
  78. data/lib/less/js/test/css/import-once.css +3 -0
  79. data/lib/less/js/test/css/import.css +7 -9
  80. data/lib/less/js/test/css/javascript.css +3 -2
  81. data/lib/less/js/test/css/media.css +116 -0
  82. data/lib/less/js/test/css/mixins-args.css +23 -4
  83. data/lib/less/js/test/css/mixins-guards.css +13 -0
  84. data/lib/less/js/test/css/mixins-important.css +21 -0
  85. data/lib/less/js/test/css/mixins-named-args.css +27 -0
  86. data/lib/less/js/test/css/mixins.css +50 -0
  87. data/lib/less/js/test/css/scope.css +20 -0
  88. data/lib/less/js/test/css/selectors.css +64 -0
  89. data/lib/less/js/test/css/static-urls/urls.css +42 -0
  90. data/lib/less/js/test/css/strings.css +2 -2
  91. data/lib/less/js/test/css/urls.css +42 -0
  92. data/lib/less/js/test/css/variables.css +0 -1
  93. data/lib/less/js/test/css/whitespace.css +4 -0
  94. data/lib/less/js/test/less-test.js +145 -36
  95. data/lib/less/js/test/less/charsets.less +3 -0
  96. data/lib/less/js/test/less/colors.less +27 -0
  97. data/lib/less/js/test/less/comments.less +12 -0
  98. data/lib/less/js/test/less/css-3.less +54 -6
  99. data/lib/less/js/test/less/css-escapes.less +6 -1
  100. data/lib/less/js/test/less/css.less +14 -12
  101. data/lib/less/js/test/less/debug/import/test.less +25 -0
  102. data/lib/less/js/test/less/debug/linenumbers.less +23 -0
  103. data/lib/less/js/test/less/errors/bad-variable-declaration1.less +1 -0
  104. data/lib/less/js/test/less/errors/bad-variable-declaration1.txt +2 -0
  105. data/lib/less/js/test/less/errors/comment-in-selector.less +1 -0
  106. data/lib/less/js/test/less/errors/comment-in-selector.txt +2 -0
  107. data/lib/less/js/test/less/errors/import-missing.less +1 -0
  108. data/lib/less/js/test/less/errors/import-missing.txt +3 -0
  109. data/lib/less/js/test/less/errors/import-no-semi.less +1 -0
  110. data/lib/less/js/test/less/errors/import-no-semi.txt +2 -0
  111. data/lib/less/js/test/less/errors/import-subfolder1.less +1 -0
  112. data/lib/less/js/test/less/errors/import-subfolder1.txt +3 -0
  113. data/lib/less/js/test/less/errors/import-subfolder2.less +1 -0
  114. data/lib/less/js/test/less/errors/import-subfolder2.txt +2 -0
  115. data/lib/less/js/test/less/errors/imports/import-subfolder1.less +1 -0
  116. data/lib/less/js/test/less/errors/imports/import-subfolder2.less +1 -0
  117. data/lib/less/js/test/less/errors/imports/import-test.less +4 -0
  118. data/lib/less/js/test/less/errors/imports/subfolder/mixin-not-defined.less +1 -0
  119. data/lib/less/js/test/less/errors/imports/subfolder/parse-error-curly-bracket.less +1 -0
  120. data/lib/less/js/test/less/errors/javascript-error.less +3 -0
  121. data/lib/less/js/test/less/errors/javascript-error.txt +4 -0
  122. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-1.less +6 -0
  123. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-1.txt +4 -0
  124. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-2.less +6 -0
  125. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-2.txt +4 -0
  126. data/lib/less/js/test/less/errors/mixin-not-defined.less +11 -0
  127. data/lib/less/js/test/less/errors/mixin-not-defined.txt +3 -0
  128. data/lib/less/js/test/less/errors/mixin-not-matched.less +6 -0
  129. data/lib/less/js/test/less/errors/mixin-not-matched.txt +3 -0
  130. data/lib/less/js/test/less/errors/mixin-not-matched2.less +6 -0
  131. data/lib/less/js/test/less/errors/mixin-not-matched2.txt +3 -0
  132. data/lib/less/js/test/less/errors/parse-error-curly-bracket.less +1 -0
  133. data/lib/less/js/test/less/errors/parse-error-curly-bracket.txt +2 -0
  134. data/lib/less/js/test/less/errors/parse-error-missing-bracket.less +2 -0
  135. data/lib/less/js/test/less/errors/parse-error-missing-bracket.txt +2 -0
  136. data/lib/less/js/test/less/errors/parse-error-with-import.less +13 -0
  137. data/lib/less/js/test/less/errors/parse-error-with-import.txt +4 -0
  138. data/lib/less/js/test/less/errors/property-ie5-hack.less +3 -0
  139. data/lib/less/js/test/less/errors/property-ie5-hack.txt +4 -0
  140. data/lib/less/js/test/less/errors/recursive-variable.less +1 -0
  141. data/lib/less/js/test/less/errors/recursive-variable.txt +2 -0
  142. data/lib/less/js/test/less/functions.less +64 -2
  143. data/lib/less/js/test/less/ie-filters.less +7 -0
  144. data/lib/less/js/test/less/import-once.less +4 -0
  145. data/lib/less/js/test/less/import.less +2 -1
  146. data/lib/less/js/test/less/import/deeper/import-once-test-a.less +1 -0
  147. data/lib/less/js/test/less/import/import-and-relative-paths-test.less +6 -0
  148. data/lib/less/js/test/less/import/import-charset-test.less +1 -0
  149. data/lib/less/js/test/less/import/import-once-test-c.less +6 -0
  150. data/lib/less/js/test/less/import/import-test-a.less +1 -0
  151. data/lib/less/js/test/less/import/import-test-c.less +0 -1
  152. data/lib/less/js/test/less/import/imports/font.less +8 -0
  153. data/lib/less/js/test/less/import/imports/logo.less +5 -0
  154. data/lib/less/js/test/less/import/urls.less +1 -0
  155. data/lib/less/js/test/less/javascript.less +4 -2
  156. data/lib/less/js/test/less/media.less +120 -0
  157. data/lib/less/js/test/less/mixins-args.less +40 -10
  158. data/lib/less/js/test/less/mixins-guards.less +30 -0
  159. data/lib/less/js/test/less/mixins-important.less +4 -0
  160. data/lib/less/js/test/less/mixins-named-args.less +36 -0
  161. data/lib/less/js/test/less/mixins.less +47 -0
  162. data/lib/less/js/test/less/scope.less +48 -1
  163. data/lib/less/js/test/less/selectors.less +81 -0
  164. data/lib/less/js/test/less/static-urls/urls.less +33 -0
  165. data/lib/less/js/test/less/strings.less +1 -1
  166. data/lib/less/js/test/less/urls.less +33 -0
  167. data/lib/less/js/test/less/variables.less +0 -1
  168. data/lib/less/js/test/less/whitespace.less +7 -0
  169. data/lib/less/version.rb +1 -1
  170. metadata +101 -4
  171. data/lib/less/js/CHANGELOG +0 -41
  172. data/lib/less/js/lib/less/cssmin.js +0 -355
@@ -1,5 +1,7 @@
1
1
  #hidden {
2
2
  color: transparent;
3
+ }
4
+ #hidden1 {
3
5
  color: transparent;
4
6
  }
5
7
  .two-args {
@@ -49,10 +51,6 @@ body {
49
51
  #var-inside {
50
52
  width: 10px;
51
53
  }
52
- .id-class {
53
- color: red;
54
- color: red;
55
- }
56
54
  .arguments {
57
55
  border: 1px solid #000000;
58
56
  width: 1px;
@@ -74,3 +72,24 @@ body {
74
72
  border: "{";
75
73
  width: "{";
76
74
  }
75
+ .comma-vs-semi-colon {
76
+ one: a;
77
+ two: b, c;
78
+ one: d, e;
79
+ two: f;
80
+ one: g;
81
+ one: h;
82
+ one: i;
83
+ one: j;
84
+ one: k;
85
+ two: l;
86
+ one: m, n;
87
+ one: o, p;
88
+ two: q;
89
+ one: r, s;
90
+ two: t;
91
+ }
92
+ #named-conflict {
93
+ four: a, 11, 12, 13;
94
+ four: a, 21, 22, 23;
95
+ }
@@ -56,3 +56,16 @@
56
56
  content: not false;
57
57
  content: not false and false, not false;
58
58
  }
59
+ .equality-units {
60
+ test: pass;
61
+ }
62
+ .colorguardtest {
63
+ content: is #ff0000;
64
+ content: is not #0000ff its #ff0000;
65
+ content: is not #0000ff its #800080;
66
+ }
67
+ .stringguardtest {
68
+ content: is theme1;
69
+ content: is not theme2;
70
+ content: is theme1 no quotes;
71
+ }
@@ -15,3 +15,24 @@
15
15
  border: 9;
16
16
  boxer: 9;
17
17
  }
18
+ .class .inner {
19
+ test: 1;
20
+ }
21
+ .class .inner {
22
+ test: 2 !important;
23
+ }
24
+ .class .inner {
25
+ test: 3;
26
+ }
27
+ .class .inner {
28
+ test: 4 !important;
29
+ }
30
+ .class .inner {
31
+ test: 5;
32
+ }
33
+ .class .inner {
34
+ test: 0 !important;
35
+ }
36
+ .class .inner {
37
+ test: 9;
38
+ }
@@ -0,0 +1,27 @@
1
+ .named-arg {
2
+ color: blue;
3
+ width: 5px;
4
+ height: 99%;
5
+ args: 1px 100%;
6
+ text-align: center;
7
+ }
8
+ .class {
9
+ width: 5px;
10
+ height: 19%;
11
+ args: 1px 20%;
12
+ }
13
+ .all-args-wrong-args {
14
+ width: 10px;
15
+ height: 9%;
16
+ args: 2px 10%;
17
+ }
18
+ .named-args2 {
19
+ width: 15px;
20
+ height: 49%;
21
+ color: #646464;
22
+ }
23
+ .named-args3 {
24
+ width: 5px;
25
+ height: 29%;
26
+ color: #123456;
27
+ }
@@ -61,11 +61,61 @@
61
61
  .jo.ki {
62
62
  background: none;
63
63
  }
64
+ .amp.support {
65
+ color: orange;
66
+ }
64
67
  .extended {
65
68
  width: 100%;
66
69
  border: 1px;
67
70
  background: none;
71
+ color: orange;
68
72
  }
69
73
  .foo .bar {
70
74
  width: 100%;
71
75
  }
76
+ .underParents {
77
+ color: red;
78
+ }
79
+ .parent .underParents {
80
+ color: red;
81
+ }
82
+ * + h1 {
83
+ margin-top: 25px;
84
+ }
85
+ legend + h1 {
86
+ margin-top: 0;
87
+ }
88
+ h1 + * {
89
+ margin-top: 10px;
90
+ }
91
+ * + h2 {
92
+ margin-top: 20px;
93
+ }
94
+ legend + h2 {
95
+ margin-top: 0;
96
+ }
97
+ h2 + * {
98
+ margin-top: 8px;
99
+ }
100
+ * + h3 {
101
+ margin-top: 15px;
102
+ }
103
+ legend + h3 {
104
+ margin-top: 0;
105
+ }
106
+ h3 + * {
107
+ margin-top: 5px;
108
+ }
109
+ .error {
110
+ background-image: "/a.png";
111
+ background-position: center center;
112
+ }
113
+ .test-rec .recursion {
114
+ color: black;
115
+ }
116
+ .button {
117
+ padding-left: 44px;
118
+ }
119
+ .button.large {
120
+ padding-left: 40em;
121
+ }
@@ -13,3 +13,23 @@
13
13
  border-color: #000000;
14
14
  background-color: #ffffff;
15
15
  }
16
+ .scope {
17
+ scoped-val: #008000;
18
+ }
19
+ .heightIsSet {
20
+ height: 1024px;
21
+ }
22
+ .useHeightInMixinCall {
23
+ mixin-height: 1024px;
24
+ }
25
+ .imported {
26
+ exists: true;
27
+ }
28
+ .testImported {
29
+ exists: true;
30
+ }
31
+ #allAreUsedHere {
32
+ default: 'top level';
33
+ scope: 'top level';
34
+ sub-scope-only: 'inside';
35
+ }
@@ -51,10 +51,56 @@ p a span {
51
51
  .qux .foo .baz {
52
52
  display: inline;
53
53
  }
54
+ .qux.foo .bar,
55
+ .qux.foo .baz {
56
+ display: inline-block;
57
+ }
54
58
  .qux .foo .bar .biz,
55
59
  .qux .foo .baz .biz {
56
60
  display: none;
57
61
  }
62
+ .a.b.c {
63
+ color: red;
64
+ }
65
+ .c .b.a {
66
+ color: red;
67
+ }
68
+ .foo .p.bar {
69
+ color: red;
70
+ }
71
+ .foo.p.bar {
72
+ color: red;
73
+ }
74
+ .foo + .foo {
75
+ background: amber;
76
+ }
77
+ .foo + .foo {
78
+ background: amber;
79
+ }
80
+ .foo + .foo,
81
+ .foo + .bar,
82
+ .bar + .foo,
83
+ .bar + .bar {
84
+ background: amber;
85
+ }
86
+ .foo a > .foo a,
87
+ .foo a > .bar a,
88
+ .foo a > .foo b,
89
+ .foo a > .bar b,
90
+ .bar a > .foo a,
91
+ .bar a > .bar a,
92
+ .bar a > .foo b,
93
+ .bar a > .bar b,
94
+ .foo b > .foo a,
95
+ .foo b > .bar a,
96
+ .foo b > .foo b,
97
+ .foo b > .bar b,
98
+ .bar b > .foo a,
99
+ .bar b > .bar a,
100
+ .bar b > .foo b,
101
+ .bar b > .bar b {
102
+ background: amber;
103
+ }
58
104
  .other ::fnord {
59
105
  color: #ff0000;
60
106
  }
@@ -67,3 +113,21 @@ p a span {
67
113
  .other::bnord {
68
114
  color: #ff0000;
69
115
  }
116
+ .blood {
117
+ color: red;
118
+ }
119
+ .blood {
120
+ color: red;
121
+ }
122
+ .bloodred {
123
+ color: green;
124
+ }
125
+ #blood.blood.red.black {
126
+ color: black;
127
+ }
128
+ :nth-child(3):nth-child(3) {
129
+ second-use: deprecated;
130
+ }
131
+ .test:nth-child(odd):not( :nth-child(3)) {
132
+ color: #ff0000;
133
+ }
@@ -0,0 +1,42 @@
1
+ @import "folder (1)/../css/background.css";
2
+
3
+ @import "folder (1)/import-test-d.css";
4
+ @font-face {
5
+ src: url("/fonts/garamond-pro.ttf");
6
+ src: local(Futura-Medium), url(folder\ \(1\)/fonts.svg#MyGeometricModern) format("svg");
7
+ }
8
+ #shorthands {
9
+ background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px;
10
+ }
11
+ #misc {
12
+ background-image: url(folder\ \(1\)/images/image.jpg);
13
+ }
14
+ #data-uri {
15
+ background: url(data:image/png;charset=utf-8;base64,
16
+ kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/
17
+ k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U
18
+ kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);
19
+ background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);
20
+ background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700);
21
+ }
22
+ #svg-data-uri {
23
+ background: transparent url('data:image/svg+xml, <svg version="1.1"><g></g></svg>');
24
+ }
25
+ .comma-delimited {
26
+ background: url(folder\ \(1\)/bg.jpg) no-repeat, url(folder\ \(1\)/bg.png) repeat-x top left, url(folder\ \(1\)/bg);
27
+ }
28
+ .values {
29
+ url: url('folder (1)/Trebuchet');
30
+ }
31
+ #logo {
32
+ width: 100px;
33
+ height: 100px;
34
+ background: url('folder (1)/../assets/logo.png');
35
+ }
36
+ @font-face {
37
+ font-family: xecret;
38
+ src: url('folder (1)/../assets/xecret.ttf');
39
+ }
40
+ #secret {
41
+ font-family: xecret, sans-serif;
42
+ }
@@ -30,11 +30,11 @@
30
30
  url2: "http://lesscss.org/image-256.jpg";
31
31
  url3: "http://lesscss.org#445566";
32
32
  url4: "http://lesscss.org/hello";
33
- url5: "http://lesscss.org/54.4";
33
+ url5: "http://lesscss.org/54.4px";
34
34
  }
35
35
  .mix-mul-class {
36
36
  color: #0000ff;
37
37
  color: #ff0000;
38
- color: #0000ff;
38
+ color: #000000;
39
39
  color: #ffa500;
40
40
  }
@@ -0,0 +1,42 @@
1
+ @import "import/../css/background.css";
2
+
3
+ @import "import/import-test-d.css";
4
+ @font-face {
5
+ src: url("/fonts/garamond-pro.ttf");
6
+ src: local(Futura-Medium), url(fonts.svg#MyGeometricModern) format("svg");
7
+ }
8
+ #shorthands {
9
+ background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px;
10
+ }
11
+ #misc {
12
+ background-image: url(images/image.jpg);
13
+ }
14
+ #data-uri {
15
+ background: url(data:image/png;charset=utf-8;base64,
16
+ kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/
17
+ k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U
18
+ kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);
19
+ background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);
20
+ background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700);
21
+ }
22
+ #svg-data-uri {
23
+ background: transparent url('data:image/svg+xml, <svg version="1.1"><g></g></svg>');
24
+ }
25
+ .comma-delimited {
26
+ background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);
27
+ }
28
+ .values {
29
+ url: url('Trebuchet');
30
+ }
31
+ #logo {
32
+ width: 100px;
33
+ height: 100px;
34
+ background: url('import/imports/../assets/logo.png');
35
+ }
36
+ @font-face {
37
+ font-family: xecret;
38
+ src: url('import/imports/../assets/xecret.ttf');
39
+ }
40
+ #secret {
41
+ font-family: xecret, sans-serif;
42
+ }
@@ -13,7 +13,6 @@
13
13
  .values {
14
14
  font-family: 'Trebuchet', 'Trebuchet', 'Trebuchet';
15
15
  color: #888888 !important;
16
- url: url('Trebuchet');
17
16
  multi: something 'A', B, C, 'Trebuchet';
18
17
  }
19
18
  .variable-names {
@@ -36,3 +36,7 @@
36
36
  solid
37
37
  black;
38
38
  }
39
+ .sel .newline_ws .tab_ws {
40
+ color: white;
41
+ background-position: 45 -23;
42
+ }
@@ -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
- }