less 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (265) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +4 -0
  3. data/Gemfile +1 -1
  4. data/less.gemspec +1 -1
  5. data/lib/less/defaults.rb +3 -3
  6. data/lib/less/java_script/v8_context.rb +1 -1
  7. data/lib/less/js/.gitattributes +3 -2
  8. data/lib/less/js/.gitignore +18 -2
  9. data/lib/less/js/.jshintrc +11 -0
  10. data/lib/less/js/CHANGELOG.md +87 -2
  11. data/lib/less/js/CONTRIBUTING.md +4 -3
  12. data/lib/less/js/Gruntfile.js +290 -0
  13. data/lib/less/js/README.md +342 -12
  14. data/lib/less/js/benchmark/benchmark.less +194 -194
  15. data/lib/less/js/benchmark/less-benchmark.js +9 -10
  16. data/lib/less/js/bin/lessc +154 -12
  17. data/lib/less/js/bower.json +18 -0
  18. data/lib/less/js/build.gradle +347 -0
  19. data/lib/less/js/build/README.md +350 -0
  20. data/lib/less/js/build/browser-header.js +4 -0
  21. data/lib/less/js/build/build.yml +160 -0
  22. data/lib/less/js/build/require-rhino.js +7 -2
  23. data/lib/less/js/build/rhino-header.js +4 -0
  24. data/lib/less/js/build/rhino-modules.js +131 -0
  25. data/lib/less/js/build/tasks/.gitkeep +1 -0
  26. data/lib/less/js/dist/less-1.5.0.js +6914 -0
  27. data/lib/less/js/dist/less-1.5.0.min.js +13 -0
  28. data/lib/less/js/dist/less-1.5.1.js +6941 -0
  29. data/lib/less/js/dist/less-1.5.1.min.js +13 -0
  30. data/lib/less/js/dist/less-1.6.0.js +7485 -0
  31. data/lib/less/js/dist/less-1.6.0.min.js +16 -0
  32. data/lib/less/js/dist/less-1.6.1.js +7513 -0
  33. data/lib/less/js/dist/less-1.6.1.min.js +16 -0
  34. data/lib/less/js/dist/less-1.6.2.js +7624 -0
  35. data/lib/less/js/dist/less-1.6.2.min.js +16 -0
  36. data/lib/less/js/dist/less-rhino-1.5.1.js +6831 -0
  37. data/lib/less/js/dist/less-rhino-1.6.2.js +9017 -0
  38. data/lib/less/js/dist/lessc-rhino-1.6.2.js +449 -0
  39. data/lib/less/js/gradle/wrapper/gradle-wrapper.jar +0 -0
  40. data/lib/less/js/gradle/wrapper/gradle-wrapper.properties +6 -0
  41. data/lib/less/js/gradlew +164 -0
  42. data/lib/less/js/gradlew.bat +90 -0
  43. data/lib/less/js/lib/less/browser.js +482 -367
  44. data/lib/less/js/lib/less/colors.js +0 -1
  45. data/lib/less/js/lib/less/encoder.js +4 -0
  46. data/lib/less/js/lib/less/env.js +50 -19
  47. data/lib/less/js/lib/less/extend-visitor.js +66 -41
  48. data/lib/less/js/lib/less/functions.js +309 -104
  49. data/lib/less/js/lib/less/import-visitor.js +21 -10
  50. data/lib/less/js/lib/less/index.js +90 -68
  51. data/lib/less/js/lib/less/join-selector-visitor.js +11 -4
  52. data/lib/less/js/lib/less/lessc_helper.js +56 -45
  53. data/lib/less/js/lib/less/parser.js +830 -460
  54. data/lib/less/js/lib/less/rhino.js +380 -58
  55. data/lib/less/js/lib/less/source-map-output.js +141 -0
  56. data/lib/less/js/lib/less/to-css-visitor.js +215 -0
  57. data/lib/less/js/lib/less/tree.js +57 -5
  58. data/lib/less/js/lib/less/tree/alpha.js +13 -5
  59. data/lib/less/js/lib/less/tree/anonymous.js +11 -5
  60. data/lib/less/js/lib/less/tree/assignment.js +11 -5
  61. data/lib/less/js/lib/less/tree/call.js +19 -8
  62. data/lib/less/js/lib/less/tree/color.js +59 -36
  63. data/lib/less/js/lib/less/tree/comment.js +17 -4
  64. data/lib/less/js/lib/less/tree/condition.js +3 -3
  65. data/lib/less/js/lib/less/tree/dimension.js +161 -153
  66. data/lib/less/js/lib/less/tree/directive.js +39 -18
  67. data/lib/less/js/lib/less/tree/element.js +41 -18
  68. data/lib/less/js/lib/less/tree/expression.js +11 -5
  69. data/lib/less/js/lib/less/tree/extend.js +11 -1
  70. data/lib/less/js/lib/less/tree/import.js +34 -20
  71. data/lib/less/js/lib/less/tree/javascript.js +16 -10
  72. data/lib/less/js/lib/less/tree/keyword.js +5 -2
  73. data/lib/less/js/lib/less/tree/media.js +39 -22
  74. data/lib/less/js/lib/less/tree/mixin.js +135 -56
  75. data/lib/less/js/lib/less/tree/negative.js +4 -2
  76. data/lib/less/js/lib/less/tree/operation.js +17 -12
  77. data/lib/less/js/lib/less/tree/paren.js +5 -2
  78. data/lib/less/js/lib/less/tree/quoted.js +9 -6
  79. data/lib/less/js/lib/less/tree/rule.js +39 -21
  80. data/lib/less/js/lib/less/tree/ruleset.js +229 -145
  81. data/lib/less/js/lib/less/tree/selector.js +101 -34
  82. data/lib/less/js/lib/less/tree/unicode-descriptor.js +4 -3
  83. data/lib/less/js/lib/less/tree/url.js +33 -11
  84. data/lib/less/js/lib/less/tree/value.js +13 -6
  85. data/lib/less/js/lib/less/tree/variable.js +13 -8
  86. data/lib/less/js/lib/less/visitor.js +117 -25
  87. data/lib/less/js/lib/source-map/source-map-0.1.31.js +1933 -0
  88. data/lib/less/js/lib/source-map/source-map-footer.js +4 -0
  89. data/lib/less/js/lib/source-map/source-map-header.js +3 -0
  90. data/lib/less/js/package.json +30 -15
  91. data/lib/less/js/test/browser/common.js +131 -56
  92. data/lib/less/js/test/browser/css/global-vars/simple.css +3 -0
  93. data/lib/less/js/test/browser/css/modify-vars/simple.css +8 -0
  94. data/lib/less/js/test/browser/css/relative-urls/urls.css +8 -9
  95. data/lib/less/js/test/browser/css/rootpath-relative/urls.css +0 -1
  96. data/lib/less/js/test/browser/css/rootpath/urls.css +0 -1
  97. data/lib/less/js/test/browser/css/urls.css +18 -14
  98. data/lib/less/js/test/browser/es5.js +27 -0
  99. data/lib/less/js/test/{less/errors/color-operation-error.less → browser/less/console-errors/test-error.less} +0 -0
  100. data/lib/less/js/test/browser/less/console-errors/test-error.txt +2 -0
  101. data/lib/less/js/test/browser/less/global-vars/simple.less +3 -0
  102. data/lib/less/js/test/browser/less/modify-vars/imports/simple2.less +4 -0
  103. data/lib/less/js/test/browser/less/modify-vars/simple.less +8 -0
  104. data/lib/less/js/test/browser/less/relative-urls/urls.less +1 -1
  105. data/lib/less/js/test/browser/less/rootpath-relative/urls.less +1 -1
  106. data/lib/less/js/test/browser/less/rootpath/urls.less +1 -1
  107. data/lib/less/js/test/browser/less/urls.less +9 -1
  108. data/lib/less/js/test/browser/phantom-runner.js +112 -103
  109. data/lib/less/js/test/browser/runner-browser-options.js +42 -0
  110. data/lib/less/js/test/browser/{runner-browser.js → runner-browser-spec.js} +7 -2
  111. data/lib/less/js/test/browser/runner-console-errors.js +5 -0
  112. data/lib/less/js/test/browser/runner-errors-options.js +5 -0
  113. data/lib/less/js/test/browser/runner-errors-spec.js +4 -0
  114. data/lib/less/js/test/browser/runner-global-vars-options.js +4 -0
  115. data/lib/less/js/test/browser/runner-global-vars-spec.js +3 -0
  116. data/lib/less/js/test/browser/runner-legacy-options.js +4 -0
  117. data/lib/less/js/test/browser/{runner-legacy.js → runner-legacy-spec.js} +1 -4
  118. data/lib/less/js/test/browser/runner-main-options.js +15 -0
  119. data/lib/less/js/test/browser/runner-main-spec.js +3 -0
  120. data/lib/less/js/test/browser/runner-modify-vars-options.js +2 -0
  121. data/lib/less/js/test/browser/runner-modify-vars-spec.js +43 -0
  122. data/lib/less/js/test/browser/runner-no-js-errors-options.js +4 -0
  123. data/lib/less/js/test/browser/runner-no-js-errors-spec.js +4 -0
  124. data/lib/less/js/test/browser/runner-production-options.js +3 -0
  125. data/lib/less/js/test/browser/{runner-production.js → runner-production-spec.js} +1 -3
  126. data/lib/less/js/test/browser/runner-relative-urls-options.js +3 -0
  127. data/lib/less/js/test/browser/{runner-relative-urls.js → runner-relative-urls-spec.js} +1 -2
  128. data/lib/less/js/test/browser/runner-rootpath-options.js +3 -0
  129. data/lib/less/js/test/browser/runner-rootpath-relative-options.js +4 -0
  130. data/lib/less/js/test/browser/{runner-rootpath-relative.js → runner-rootpath-relative-spec.js} +1 -3
  131. data/lib/less/js/test/browser/{runner-rootpath.js → runner-rootpath-spec.js} +1 -2
  132. data/lib/less/js/test/browser/test-runner-template.tmpl +47 -0
  133. data/lib/less/js/test/css/colors.css +7 -0
  134. data/lib/less/js/test/css/comments.css +9 -4
  135. data/lib/less/js/test/css/compression/compression.css +3 -2
  136. data/lib/less/js/test/css/css-3.css +17 -5
  137. data/lib/less/js/test/css/css-guards.css +37 -0
  138. data/lib/less/js/test/css/debug/linenumbers-all.css +6 -0
  139. data/lib/less/js/test/css/debug/linenumbers-comments.css +5 -0
  140. data/lib/less/js/test/css/debug/linenumbers-mediaquery.css +5 -0
  141. data/lib/less/js/test/css/empty.css +0 -0
  142. data/lib/less/js/test/css/extend-chaining.css +9 -0
  143. data/lib/less/js/test/css/extend-selector.css +10 -2
  144. data/lib/less/js/test/css/extract-and-length.css +133 -0
  145. data/lib/less/js/test/css/functions.css +23 -10
  146. data/lib/less/js/test/css/globalVars/extended.css +12 -0
  147. data/lib/less/js/test/css/globalVars/simple.css +6 -0
  148. data/lib/less/js/test/css/import-inline.css +5 -0
  149. data/lib/less/js/test/css/import-once.css +12 -0
  150. data/lib/less/js/test/css/import-reference.css +49 -0
  151. data/lib/less/js/test/css/import.css +0 -2
  152. data/lib/less/js/test/css/media.css +21 -5
  153. data/lib/less/js/test/css/merge.css +26 -0
  154. data/lib/less/js/test/css/mixins-guards-default-func.css +129 -0
  155. data/lib/less/js/test/css/mixins-guards.css +6 -0
  156. data/lib/less/js/test/css/mixins-important.css +7 -0
  157. data/lib/less/js/test/css/mixins-interpolated.css +39 -0
  158. data/lib/less/js/test/css/mixins.css +20 -0
  159. data/lib/less/js/test/css/modifyVars/extended.css +9 -0
  160. data/lib/less/js/test/css/no-output.css +0 -0
  161. data/lib/less/js/test/css/parens.css +3 -0
  162. data/lib/less/js/test/css/property-name-interp.css +20 -0
  163. data/lib/less/js/test/css/selectors.css +12 -0
  164. data/lib/less/js/test/css/static-urls/urls.css +7 -4
  165. data/lib/less/js/test/css/strings.css +3 -0
  166. data/lib/less/js/test/css/url-args/urls.css +56 -0
  167. data/lib/less/js/test/css/urls.css +21 -9
  168. data/lib/less/js/test/index.js +45 -0
  169. data/lib/less/js/test/less-test.js +234 -191
  170. data/lib/less/js/test/less/colors.less +6 -0
  171. data/lib/less/js/test/less/comments.less +7 -1
  172. data/lib/less/js/test/less/compression/compression.less +21 -1
  173. data/lib/less/js/test/less/css-3.less +12 -0
  174. data/lib/less/js/test/less/css-guards.less +99 -0
  175. data/lib/less/js/test/less/debug/linenumbers.less +11 -1
  176. data/lib/less/js/test/less/empty.less +0 -0
  177. data/lib/less/js/test/less/errors/add-mixed-units.txt +4 -2
  178. data/lib/less/js/test/less/errors/add-mixed-units2.txt +4 -2
  179. data/lib/less/js/test/less/errors/color-func-invalid-color.less +3 -0
  180. data/lib/less/js/test/less/errors/color-func-invalid-color.txt +4 -0
  181. data/lib/less/js/test/less/errors/css-guard-default-func.less +4 -0
  182. data/lib/less/js/test/less/errors/css-guard-default-func.txt +4 -0
  183. data/lib/less/js/test/less/errors/import-subfolder2.txt +4 -2
  184. data/lib/less/js/test/less/errors/javascript-undefined-var.less +3 -0
  185. data/lib/less/js/test/less/errors/javascript-undefined-var.txt +4 -0
  186. data/lib/less/js/test/less/errors/mixins-guards-default-func-1.less +9 -0
  187. data/lib/less/js/test/less/errors/mixins-guards-default-func-1.txt +4 -0
  188. data/lib/less/js/test/less/errors/mixins-guards-default-func-2.less +9 -0
  189. data/lib/less/js/test/less/errors/mixins-guards-default-func-2.txt +4 -0
  190. data/lib/less/js/test/less/errors/mixins-guards-default-func-3.less +9 -0
  191. data/lib/less/js/test/less/errors/mixins-guards-default-func-3.txt +4 -0
  192. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors.less +4 -0
  193. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors.txt +4 -0
  194. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors2.less +4 -0
  195. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors2.txt +4 -0
  196. data/lib/less/js/test/less/errors/parse-error-curly-bracket.less +4 -1
  197. data/lib/less/js/test/less/errors/parse-error-curly-bracket.txt +4 -2
  198. data/lib/less/js/test/less/errors/parse-error-extra-parens.less +5 -0
  199. data/lib/less/js/test/less/errors/parse-error-extra-parens.txt +3 -0
  200. data/lib/less/js/test/less/errors/parse-error-missing-bracket.txt +2 -2
  201. data/lib/less/js/test/less/errors/parse-error-missing-parens.less +5 -0
  202. data/lib/less/js/test/less/errors/parse-error-missing-parens.txt +3 -0
  203. data/lib/less/js/test/less/errors/property-asterisk-only-name.less +3 -0
  204. data/lib/less/js/test/less/errors/property-asterisk-only-name.txt +4 -0
  205. data/lib/less/js/test/less/errors/property-interp-not-defined.less +1 -0
  206. data/lib/less/js/test/less/errors/property-interp-not-defined.txt +2 -0
  207. data/lib/less/js/test/less/errors/svg-gradient1.less +3 -0
  208. data/lib/less/js/test/less/errors/svg-gradient1.txt +4 -0
  209. data/lib/less/js/test/less/errors/svg-gradient2.less +3 -0
  210. data/lib/less/js/test/less/errors/svg-gradient2.txt +4 -0
  211. data/lib/less/js/test/less/errors/svg-gradient3.less +3 -0
  212. data/lib/less/js/test/less/errors/svg-gradient3.txt +4 -0
  213. data/lib/less/js/test/less/errors/unit-function.less +3 -0
  214. data/lib/less/js/test/less/errors/unit-function.txt +4 -0
  215. data/lib/less/js/test/less/extend-chaining.less +12 -0
  216. data/lib/less/js/test/less/extend-selector.less +15 -0
  217. data/lib/less/js/test/less/extract-and-length.less +133 -0
  218. data/lib/less/js/test/less/functions.less +15 -2
  219. data/lib/less/js/test/less/globalVars/extended.json +5 -0
  220. data/lib/less/js/test/less/globalVars/extended.less +10 -0
  221. data/lib/less/js/test/less/globalVars/simple.json +3 -0
  222. data/lib/less/js/test/less/globalVars/simple.less +3 -0
  223. data/lib/less/js/test/less/import-inline.less +2 -0
  224. data/lib/less/js/test/less/import-once.less +2 -0
  225. data/lib/less/js/test/less/import-reference.less +18 -0
  226. data/lib/less/js/test/less/import/import-and-relative-paths-test.less +11 -0
  227. data/lib/less/js/test/less/import/import-reference.less +43 -0
  228. data/lib/less/js/test/less/import/import-test-f.less +5 -0
  229. data/lib/less/js/test/less/import/invalid-css.less +1 -0
  230. data/lib/less/js/test/less/media.less +25 -1
  231. data/lib/less/js/test/less/merge.less +59 -0
  232. data/lib/less/js/test/less/mixins-args.less +10 -0
  233. data/lib/less/js/test/less/mixins-guards-default-func.less +195 -0
  234. data/lib/less/js/test/less/mixins-guards.less +16 -0
  235. data/lib/less/js/test/less/mixins-important.less +4 -1
  236. data/lib/less/js/test/less/mixins-interpolated.less +69 -0
  237. data/lib/less/js/test/less/mixins.less +27 -0
  238. data/lib/less/js/test/less/modifyVars/extended.json +5 -0
  239. data/lib/less/js/test/less/modifyVars/extended.less +11 -0
  240. data/lib/less/js/test/less/no-js-errors/no-js-errors.less +3 -0
  241. data/lib/less/js/test/less/no-js-errors/no-js-errors.txt +4 -0
  242. data/lib/less/js/test/less/no-output.less +2 -0
  243. data/lib/less/js/test/less/parens.less +4 -0
  244. data/lib/less/js/test/less/property-name-interp.less +53 -0
  245. data/lib/less/js/test/less/selectors.less +13 -0
  246. data/lib/less/js/test/less/sourcemaps/basic.json +3 -0
  247. data/lib/less/js/test/less/sourcemaps/basic.less +27 -0
  248. data/lib/less/js/test/less/sourcemaps/imported.css +7 -0
  249. data/lib/less/js/test/less/strings.less +6 -0
  250. data/lib/less/js/test/less/url-args/urls.less +63 -0
  251. data/lib/less/js/test/less/urls.less +15 -0
  252. data/lib/less/js/test/rhino/test-header.js +15 -0
  253. data/lib/less/js/test/sourcemaps/basic.json +1 -0
  254. data/lib/less/js/test/sourcemaps/index.html +17 -0
  255. data/lib/less/loader.rb +48 -40
  256. data/lib/less/version.rb +1 -1
  257. data/spec/less/parser_spec.rb +15 -15
  258. metadata +146 -40
  259. data/lib/less/js/Makefile +0 -102
  260. data/lib/less/js/build/header.js +0 -9
  261. data/lib/less/js/test/browser-test-prepare.js +0 -46
  262. data/lib/less/js/test/browser/runner-errors.js +0 -5
  263. data/lib/less/js/test/browser/runner-main.js +0 -15
  264. data/lib/less/js/test/browser/template.htm +0 -10
  265. data/lib/less/js/test/less/errors/color-operation-error.txt +0 -2
@@ -27,9 +27,10 @@
27
27
  },
28
28
  visitImport: function (importNode, visitArgs) {
29
29
  var importVisitor = this,
30
- evaldImportNode;
31
-
32
- if (!importNode.css) {
30
+ evaldImportNode,
31
+ inlineCSS = importNode.options.inline;
32
+
33
+ if (!importNode.css || inlineCSS) {
33
34
 
34
35
  try {
35
36
  evaldImportNode = importNode.evalForImport(this.env);
@@ -41,13 +42,19 @@
41
42
  importNode.error = e;
42
43
  }
43
44
 
44
- if (evaldImportNode && !evaldImportNode.css) {
45
+ if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {
45
46
  importNode = evaldImportNode;
46
47
  this.importCount++;
47
48
  var env = new tree.evalEnv(this.env, this.env.frames.slice(0));
48
- this._importer.push(importNode.getPath(), importNode.currentFileInfo, function (e, root, imported) {
49
+
50
+ if (importNode.options.multiple) {
51
+ env.importMultiple = true;
52
+ }
53
+
54
+ this._importer.push(importNode.getPath(), importNode.currentFileInfo, importNode.options, function (e, root, imported, fullPath) {
49
55
  if (e && !e.filename) { e.index = importNode.index; e.filename = importNode.currentFileInfo.filename; }
50
- if (imported && !importNode.options.multiple) { importNode.skip = imported; }
56
+
57
+ if (imported && !env.importMultiple) { importNode.skip = imported; }
51
58
 
52
59
  var subFinish = function(e) {
53
60
  importVisitor.importCount--;
@@ -59,11 +66,15 @@
59
66
 
60
67
  if (root) {
61
68
  importNode.root = root;
62
- new(tree.importVisitor)(importVisitor._importer, subFinish, env)
63
- .run(root);
64
- } else {
65
- subFinish();
69
+ importNode.importedFilename = fullPath;
70
+ if (!inlineCSS && !importNode.skip) {
71
+ new(tree.importVisitor)(importVisitor._importer, subFinish, env)
72
+ .run(root);
73
+ return;
74
+ }
66
75
  }
76
+
77
+ subFinish();
67
78
  });
68
79
  }
69
80
  }
@@ -1,19 +1,18 @@
1
1
  var path = require('path'),
2
- sys = require('util'),
3
2
  url = require('url'),
4
3
  request,
5
4
  fs = require('fs');
6
5
 
7
6
  var less = {
8
- version: [1, 4, 2],
7
+ version: [1, 6, 2],
9
8
  Parser: require('./parser').Parser,
10
- importer: require('./parser').importer,
11
9
  tree: require('./tree'),
12
10
  render: function (input, options, callback) {
13
11
  options = options || {};
14
12
 
15
13
  if (typeof(options) === 'function') {
16
- callback = options, options = {};
14
+ callback = options;
15
+ options = {};
17
16
  }
18
17
 
19
18
  var parser = new(less.Parser)(options),
@@ -21,15 +20,17 @@ var less = {
21
20
 
22
21
  if (callback) {
23
22
  parser.parse(input, function (e, root) {
24
- callback(e, root && root.toCSS && root.toCSS(options));
23
+ try { callback(e, root && root.toCSS && root.toCSS(options)); }
24
+ catch (err) { callback(err); }
25
25
  });
26
26
  } else {
27
- ee = new(require('events').EventEmitter);
27
+ ee = new (require('events').EventEmitter)();
28
28
 
29
29
  process.nextTick(function () {
30
30
  parser.parse(input, function (e, root) {
31
- if (e) { ee.emit('error', e) }
32
- else { ee.emit('success', root.toCSS(options)) }
31
+ if (e) { return ee.emit('error', e); }
32
+ try { ee.emit('success', root.toCSS(options)); }
33
+ catch (err) { ee.emit('error', err); }
33
34
  });
34
35
  });
35
36
  return ee;
@@ -41,10 +42,10 @@ var less = {
41
42
  var message = "";
42
43
  var extract = ctx.extract;
43
44
  var error = [];
44
- var stylize = options.color ? require('./lessc_helper').stylize : function (str) { return str };
45
+ var stylize = options.color ? require('./lessc_helper').stylize : function (str) { return str; };
45
46
 
46
47
  // only output a stack if it isn't a less error
47
- if (ctx.stack && !ctx.type) { return stylize(ctx.stack, 'red') }
48
+ if (ctx.stack && !ctx.type) { return stylize(ctx.stack, 'red'); }
48
49
 
49
50
  if (!ctx.hasOwnProperty('index') || !extract) {
50
51
  return ctx.stack || ctx.message;
@@ -70,8 +71,10 @@ var less = {
70
71
  error = error.join('\n') + stylize('', 'reset') + '\n';
71
72
 
72
73
  message += stylize(ctx.type + 'Error: ' + ctx.message, 'red');
73
- ctx.filename && (message += stylize(' in ', 'red') + ctx.filename +
74
- stylize(' on line ' + ctx.line + ', column ' + (ctx.column + 1) + ':', 'grey'));
74
+ if (ctx.filename) {
75
+ message += stylize(' in ', 'red') + ctx.filename +
76
+ stylize(' on line ' + ctx.line + ', column ' + (ctx.column + 1) + ':', 'grey');
77
+ }
75
78
 
76
79
  message += '\n' + error;
77
80
 
@@ -84,26 +87,44 @@ var less = {
84
87
  },
85
88
  writeError: function (ctx, options) {
86
89
  options = options || {};
87
- if (options.silent) { return }
88
- sys.error(less.formatError(ctx, options));
90
+ if (options.silent) { return; }
91
+ console.error(less.formatError(ctx, options));
89
92
  }
90
93
  };
91
94
 
92
- ['color', 'directive', 'operation', 'dimension',
93
- 'keyword', 'variable', 'ruleset', 'element',
94
- 'selector', 'quoted', 'expression', 'rule',
95
- 'call', 'url', 'alpha', 'import',
96
- 'mixin', 'comment', 'anonymous', 'value',
97
- 'javascript', 'assignment', 'condition', 'paren',
98
- 'media', 'unicode-descriptor', 'negative', 'extend'
99
- ].forEach(function (n) {
100
- require('./tree/' + n);
101
- });
95
+ require('./tree/color');
96
+ require('./tree/directive');
97
+ require('./tree/operation');
98
+ require('./tree/dimension');
99
+ require('./tree/keyword');
100
+ require('./tree/variable');
101
+ require('./tree/ruleset');
102
+ require('./tree/element');
103
+ require('./tree/selector');
104
+ require('./tree/quoted');
105
+ require('./tree/expression');
106
+ require('./tree/rule');
107
+ require('./tree/call');
108
+ require('./tree/url');
109
+ require('./tree/alpha');
110
+ require('./tree/import');
111
+ require('./tree/mixin');
112
+ require('./tree/comment');
113
+ require('./tree/anonymous');
114
+ require('./tree/value');
115
+ require('./tree/javascript');
116
+ require('./tree/assignment');
117
+ require('./tree/condition');
118
+ require('./tree/paren');
119
+ require('./tree/media');
120
+ require('./tree/unicode-descriptor');
121
+ require('./tree/negative');
122
+ require('./tree/extend');
102
123
 
103
124
 
104
125
  var isUrlRe = /^(?:https?:)?\/\//i;
105
126
 
106
- less.Parser.importer = function (file, currentFileInfo, callback, env) {
127
+ less.Parser.fileLoader = function (file, currentFileInfo, callback, env) {
107
128
  var pathname, dirname, data,
108
129
  newFileInfo = {
109
130
  relativeUrls: env.relativeUrls,
@@ -112,12 +133,7 @@ less.Parser.importer = function (file, currentFileInfo, callback, env) {
112
133
  rootFilename: currentFileInfo.rootFilename
113
134
  };
114
135
 
115
- function parseFile(e, data) {
116
- if (e) { return callback(e); }
117
-
118
- env = new less.tree.parseEnv(env);
119
- env.processImports = false;
120
-
136
+ function handleDataAndCallCallback(data) {
121
137
  var j = file.lastIndexOf('/');
122
138
 
123
139
  // Pass on an updated rootpath if path of imported file is relative and file
@@ -135,12 +151,8 @@ less.Parser.importer = function (file, currentFileInfo, callback, env) {
135
151
  newFileInfo.currentDirectory = pathname.replace(/[^\\\/]*$/, "");
136
152
  newFileInfo.filename = pathname;
137
153
 
138
- env.contents[pathname] = data; // Updating top importing parser content cache.
139
- env.currentFileInfo = newFileInfo;
140
- new(less.Parser)(env).parse(data, function (e, root) {
141
- callback(e, root, pathname);
142
- });
143
- };
154
+ callback(null, data, pathname, newFileInfo);
155
+ }
144
156
 
145
157
  var isUrl = isUrlRe.test( file );
146
158
  if (isUrl || isUrlRe.test(currentFileInfo.currentDirectory)) {
@@ -154,63 +166,71 @@ less.Parser.importer = function (file, currentFileInfo, callback, env) {
154
166
  }
155
167
 
156
168
  var urlStr = isUrl ? file : url.resolve(currentFileInfo.currentDirectory, file),
157
- urlObj = url.parse(urlStr),
158
- req = {
159
- host: urlObj.hostname,
160
- port: urlObj.port || 80,
161
- path: urlObj.pathname + (urlObj.search||'')
162
- };
163
-
164
- request.get(urlStr, function (error, res, body) {
169
+ urlObj = url.parse(urlStr);
170
+
171
+ request.get({uri: urlStr, strictSSL: !env.insecure }, function (error, res, body) {
165
172
  if (res.statusCode === 404) {
166
173
  callback({ type: 'File', message: "resource '" + urlStr + "' was not found\n" });
167
174
  return;
168
175
  }
169
176
  if (!body) {
170
- sys.error( 'Warning: Empty body (HTTP '+ res.statusCode + ') returned by "' + urlStr +'"' );
177
+ console.error( 'Warning: Empty body (HTTP '+ res.statusCode + ') returned by "' + urlStr +'"' );
171
178
  }
172
179
  if (error) {
173
180
  callback({ type: 'File', message: "resource '" + urlStr + "' gave this Error:\n "+ error +"\n" });
174
181
  }
175
182
  pathname = urlStr;
176
183
  dirname = urlObj.protocol +'//'+ urlObj.host + urlObj.pathname.replace(/[^\/]*$/, '');
177
- parseFile(null, body);
184
+ handleDataAndCallCallback(body);
178
185
  });
179
186
  } else {
180
187
 
181
188
  var paths = [currentFileInfo.currentDirectory].concat(env.paths);
182
189
  paths.push('.');
183
190
 
184
- for (var i = 0; i < paths.length; i++) {
185
- try {
186
- pathname = path.join(paths[i], file);
187
- fs.statSync(pathname);
188
- break;
189
- } catch (e) {
190
- pathname = null;
191
+ if (env.syncImport) {
192
+ for (var i = 0; i < paths.length; i++) {
193
+ try {
194
+ pathname = path.join(paths[i], file);
195
+ fs.statSync(pathname);
196
+ break;
197
+ } catch (e) {
198
+ pathname = null;
199
+ }
191
200
  }
192
- }
193
-
194
- if (!pathname) {
195
201
 
196
- callback({ type: 'File', message: "'" + file + "' wasn't found" });
197
- return;
198
- }
199
-
200
- dirname = path.dirname(pathname);
202
+ if (!pathname) {
203
+ callback({ type: 'File', message: "'" + file + "' wasn't found" });
204
+ return;
205
+ }
201
206
 
202
- if (env.syncImport) {
203
207
  try {
204
208
  data = fs.readFileSync(pathname, 'utf-8');
205
- parseFile(null, data);
209
+ handleDataAndCallCallback(data);
206
210
  } catch (e) {
207
- parseFile(e);
211
+ callback(e);
208
212
  }
209
213
  } else {
210
- fs.readFile(pathname, 'utf-8', parseFile);
214
+ (function tryPathIndex(i) {
215
+ if (i < paths.length) {
216
+ pathname = path.join(paths[i], file);
217
+ fs.stat(pathname, function (err) {
218
+ if (err) {
219
+ tryPathIndex(i + 1);
220
+ } else {
221
+ fs.readFile(pathname, 'utf-8', function(e, data) {
222
+ if (e) { callback(e); }
223
+ handleDataAndCallCallback(data);
224
+ });
225
+ }
226
+ });
227
+ } else {
228
+ callback({ type: 'File', message: "'" + file + "' wasn't found" });
229
+ }
230
+ }(0));
211
231
  }
212
232
  }
213
- }
233
+ };
214
234
 
215
235
  require('./env');
216
236
  require('./functions');
@@ -219,5 +239,7 @@ require('./visitor.js');
219
239
  require('./import-visitor.js');
220
240
  require('./extend-visitor.js');
221
241
  require('./join-selector-visitor.js');
242
+ require('./to-css-visitor.js');
243
+ require('./source-map-output.js');
222
244
 
223
- for (var k in less) { exports[k] = less[k]; }
245
+ for (var k in less) { if (less.hasOwnProperty(k)) { exports[k] = less[k]; }}
@@ -16,12 +16,19 @@
16
16
  },
17
17
 
18
18
  visitRuleset: function (rulesetNode, visitArgs) {
19
- var context = this.contexts[this.contexts.length - 1];
20
- var paths = [];
19
+ var context = this.contexts[this.contexts.length - 1],
20
+ paths = [], selectors;
21
+
21
22
  this.contexts.push(paths);
22
23
 
23
24
  if (! rulesetNode.root) {
24
- rulesetNode.joinSelectors(paths, context, rulesetNode.selectors);
25
+ selectors = rulesetNode.selectors;
26
+ if (selectors) {
27
+ selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });
28
+ rulesetNode.selectors = selectors.length ? selectors : (selectors = null);
29
+ if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }
30
+ }
31
+ if (!selectors) { rulesetNode.rules = null; }
25
32
  rulesetNode.paths = paths;
26
33
  }
27
34
  },
@@ -30,7 +37,7 @@
30
37
  },
31
38
  visitMedia: function (mediaNode, visitArgs) {
32
39
  var context = this.contexts[this.contexts.length - 1];
33
- mediaNode.ruleset.root = (context.length === 0 || context[0].multiMedia);
40
+ mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);
34
41
  }
35
42
  };
36
43
 
@@ -1,8 +1,6 @@
1
1
  // lessc_helper.js
2
2
  //
3
3
  // helper functions for lessc
4
- var sys = require('util');
5
-
6
4
  var lessc_helper = {
7
5
 
8
6
  //Stylize a string
@@ -23,49 +21,62 @@ var lessc_helper = {
23
21
 
24
22
  //Print command line options
25
23
  printUsage: function() {
26
- sys.puts("usage: lessc [option option=parameter ...] <source> [destination]");
27
- sys.puts("");
28
- sys.puts("If source is set to `-' (dash or hyphen-minus), input is read from stdin.");
29
- sys.puts("");
30
- sys.puts("options:");
31
- sys.puts(" -h, --help Print help (this message) and exit.");
32
- sys.puts(" --include-path=PATHS Set include paths. Separated by `:'. Use `;' on Windows.");
33
- sys.puts(" -M, --depends Output a makefile import dependency list to stdout");
34
- sys.puts(" --no-color Disable colorized output.");
35
- sys.puts(" --no-ie-compat Disable IE compatibility checks.");
36
- sys.puts(" -l, --lint Syntax check only (lint).");
37
- sys.puts(" -s, --silent Suppress output of error messages.");
38
- sys.puts(" --strict-imports Force evaluation of imports.");
39
- sys.puts(" --verbose Be verbose.");
40
- sys.puts(" -v, --version Print version number and exit.");
41
- sys.puts(" -x, --compress Compress output by removing some whitespaces.");
42
- sys.puts(" --yui-compress Compress output using ycssmin");
43
- sys.puts(" --max-line-len=LINELEN Max line length used by ycssmin");
44
- sys.puts(" -O0, -O1, -O2 Set the parser's optimization level. The lower");
45
- sys.puts(" the number, the less nodes it will create in the");
46
- sys.puts(" tree. This could matter for debugging, or if you");
47
- sys.puts(" want to access the individual nodes in the tree.");
48
- sys.puts(" --line-numbers=TYPE Outputs filename and line numbers.");
49
- sys.puts(" TYPE can be either 'comments', which will output");
50
- sys.puts(" the debug info within comments, 'mediaquery'");
51
- sys.puts(" that will output the information within a fake");
52
- sys.puts(" media query which is compatible with the SASS");
53
- sys.puts(" format, and 'all' which will do both.");
54
- sys.puts(" -rp, --rootpath=URL Set rootpath for url rewriting in relative imports and urls.");
55
- sys.puts(" Works with or without the relative-urls option.");
56
- sys.puts(" -ru, --relative-urls re-write relative urls to the base less file.");
57
- sys.puts(" -sm=on|off Turn on or off strict math, where in strict mode, math");
58
- sys.puts(" --strict-math=on|off requires brackets. This option may default to on and then");
59
- sys.puts(" be removed in the future.");
60
- sys.puts(" -su=on|off Allow mixed units, e.g. 1px+1em or 1px*1px which have units");
61
- sys.puts(" --strict-units=on|off that cannot be represented.");
62
- sys.puts("");
63
- sys.puts("Report bugs to: http://github.com/cloudhead/less.js/issues");
64
- sys.puts("Home page: <http://lesscss.org/>");
24
+ console.log("usage: lessc [option option=parameter ...] <source> [destination]");
25
+ console.log("");
26
+ console.log("If source is set to `-' (dash or hyphen-minus), input is read from stdin.");
27
+ console.log("");
28
+ console.log("options:");
29
+ console.log(" -h, --help Print help (this message) and exit.");
30
+ console.log(" --include-path=PATHS Set include paths. Separated by `:'. Use `;' on Windows.");
31
+ console.log(" -M, --depends Output a makefile import dependency list to stdout");
32
+ console.log(" --no-color Disable colorized output.");
33
+ console.log(" --no-ie-compat Disable IE compatibility checks.");
34
+ console.log(" --no-js Disable JavaScript in less files");
35
+ console.log(" -l, --lint Syntax check only (lint).");
36
+ console.log(" -s, --silent Suppress output of error messages.");
37
+ console.log(" --strict-imports Force evaluation of imports.");
38
+ console.log(" --insecure Allow imports from insecure https hosts.");
39
+ console.log(" -v, --version Print version number and exit.");
40
+ console.log(" -x, --compress Compress output by removing some whitespaces.");
41
+ console.log(" --clean-css Compress output using clean-css");
42
+ console.log(" --clean-option=opt:val Pass an option to clean css, using CLI arguments from ");
43
+ console.log(" https://github.com/GoalSmashers/clean-css e.g.");
44
+ console.log(" --clean-option=--selectors-merge-mode:ie8");
45
+ console.log(" and to switch on advanced use --clean-option=--advanced");
46
+ console.log(" --source-map[=FILENAME] Outputs a v3 sourcemap to the filename (or output filename.map)");
47
+ console.log(" --source-map-rootpath=X adds this path onto the sourcemap filename and less file paths");
48
+ console.log(" --source-map-basepath=X Sets sourcemap base path, defaults to current working directory.");
49
+ console.log(" --source-map-less-inline puts the less files into the map instead of referencing them");
50
+ console.log(" --source-map-map-inline puts the map (and any less files) into the output css file");
51
+ console.log(" --source-map-url=URL the complete url and filename put in the less file");
52
+ console.log(" -rp, --rootpath=URL Set rootpath for url rewriting in relative imports and urls.");
53
+ console.log(" Works with or without the relative-urls option.");
54
+ console.log(" -ru, --relative-urls re-write relative urls to the base less file.");
55
+ console.log(" -sm=on|off Turn on or off strict math, where in strict mode, math");
56
+ console.log(" --strict-math=on|off requires brackets. This option may default to on and then");
57
+ console.log(" be removed in the future.");
58
+ console.log(" -su=on|off Allow mixed units, e.g. 1px+1em or 1px*1px which have units");
59
+ console.log(" --strict-units=on|off that cannot be represented.");
60
+ console.log(" --global-var='VAR=VALUE' Defines a variable that can be referenced by the file.");
61
+ console.log(" --modify-var='VAR=VALUE' Modifies a variable already declared in the file.");
62
+ console.log("");
63
+ console.log("-------------------------- Deprecated ----------------");
64
+ console.log(" -O0, -O1, -O2 Set the parser's optimization level. The lower");
65
+ console.log(" the number, the less nodes it will create in the");
66
+ console.log(" tree. This could matter for debugging, or if you");
67
+ console.log(" want to access the individual nodes in the tree.");
68
+ console.log(" --line-numbers=TYPE Outputs filename and line numbers.");
69
+ console.log(" TYPE can be either 'comments', which will output");
70
+ console.log(" the debug info within comments, 'mediaquery'");
71
+ console.log(" that will output the information within a fake");
72
+ console.log(" media query which is compatible with the SASS");
73
+ console.log(" format, and 'all' which will do both.");
74
+ console.log(" --verbose Be verbose.");
75
+ console.log("");
76
+ console.log("Report bugs to: http://github.com/less/less.js/issues");
77
+ console.log("Home page: <http://lesscss.org/>");
65
78
  }
66
-
67
-
68
- }
79
+ };
69
80
 
70
81
  // Exports helper functions
71
- for (var h in lessc_helper) { exports[h] = lessc_helper[h] }
82
+ for (var h in lessc_helper) { if (lessc_helper.hasOwnProperty(h)) { exports[h] = lessc_helper[h]; }}