less 2.4.0 → 2.5.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 (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]; }}