less 2.2.2 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (441) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog.md +17 -0
  3. data/Gemfile +7 -3
  4. data/README.md +29 -13
  5. data/bin/lessc +3 -1
  6. data/less.gemspec +2 -6
  7. data/lib/less/defaults.rb +3 -3
  8. data/lib/less/java_script/rhino_context.rb +17 -27
  9. data/lib/less/java_script/v8_context.rb +11 -11
  10. data/lib/less/js/.gitattributes +10 -0
  11. data/lib/less/js/.gitignore +24 -0
  12. data/lib/less/js/.jshintrc +11 -0
  13. data/lib/less/js/.npmignore +1 -0
  14. data/lib/less/js/.travis.yml +8 -0
  15. data/lib/less/js/CHANGELOG.md +299 -0
  16. data/lib/less/js/CONTRIBUTING.md +50 -0
  17. data/lib/less/js/Gruntfile.js +298 -0
  18. data/lib/less/js/README.md +43 -12
  19. data/lib/less/js/benchmark/benchmark.less +194 -194
  20. data/lib/less/js/benchmark/less-benchmark.js +9 -10
  21. data/lib/less/js/bin/lessc +310 -37
  22. data/lib/less/js/bower.json +18 -0
  23. data/lib/less/js/build/README.md +51 -0
  24. data/lib/less/js/build/amd.js +1 -1
  25. data/lib/less/js/build/browser-header.js +4 -0
  26. data/lib/less/js/build/build.yml +162 -0
  27. data/lib/less/js/build/require-rhino.js +7 -2
  28. data/lib/less/js/build/rhino-header.js +4 -0
  29. data/lib/less/js/build/rhino-modules.js +131 -0
  30. data/lib/less/js/build/tasks/.gitkeep +1 -0
  31. data/lib/less/js/build.gradle +347 -0
  32. data/lib/less/js/dist/less-1.3.1.js +4011 -0
  33. data/lib/less/js/dist/less-1.3.1.min.js +9 -0
  34. data/lib/less/js/dist/less-1.3.2.js +4401 -0
  35. data/lib/less/js/dist/less-1.3.2.min.js +9 -0
  36. data/lib/less/js/dist/less-1.3.3.js +4413 -0
  37. data/lib/less/js/dist/less-1.3.3.min.js +9 -0
  38. data/lib/less/js/dist/less-1.4.0-beta.js +5830 -0
  39. data/lib/less/js/dist/less-1.4.0-beta.min.js +11 -0
  40. data/lib/less/js/dist/less-1.4.0.js +5830 -0
  41. data/lib/less/js/dist/less-1.4.0.min.js +11 -0
  42. data/lib/less/js/dist/less-1.4.1.js +5837 -0
  43. data/lib/less/js/dist/less-1.4.1.min.js +11 -0
  44. data/lib/less/js/dist/less-1.4.2.js +5837 -0
  45. data/lib/less/js/dist/less-1.4.2.min.js +11 -0
  46. data/lib/less/js/dist/less-1.5.0.js +6914 -0
  47. data/lib/less/js/dist/less-1.5.0.min.js +13 -0
  48. data/lib/less/js/dist/less-1.5.1.js +6941 -0
  49. data/lib/less/js/dist/less-1.5.1.min.js +13 -0
  50. data/lib/less/js/dist/less-1.6.0.js +7485 -0
  51. data/lib/less/js/dist/less-1.6.0.min.js +16 -0
  52. data/lib/less/js/dist/less-1.6.1.js +7513 -0
  53. data/lib/less/js/dist/less-1.6.1.min.js +16 -0
  54. data/lib/less/js/dist/less-1.6.2.js +7624 -0
  55. data/lib/less/js/dist/less-1.6.2.min.js +16 -0
  56. data/lib/less/js/dist/less-1.6.3.js +7627 -0
  57. data/lib/less/js/dist/less-1.6.3.min.js +16 -0
  58. data/lib/less/js/dist/less-1.7.0.js +7921 -0
  59. data/lib/less/js/dist/less-1.7.0.min.js +16 -0
  60. data/lib/less/js/dist/less-rhino-1.3.1.js +3725 -0
  61. data/lib/less/js/dist/less-rhino-1.3.2.js +3990 -0
  62. data/lib/less/js/dist/less-rhino-1.3.3.js +4002 -0
  63. data/lib/less/js/dist/less-rhino-1.4.0.js +4273 -0
  64. data/lib/less/js/dist/less-rhino-1.5.1.js +6831 -0
  65. data/lib/less/js/dist/less-rhino-1.6.2.js +9017 -0
  66. data/lib/less/js/dist/less-rhino-1.6.3.js +9020 -0
  67. data/lib/less/js/dist/less-rhino-1.7.0.js +9301 -0
  68. data/lib/less/js/dist/lessc-rhino-1.6.2.js +449 -0
  69. data/lib/less/js/dist/lessc-rhino-1.6.3.js +449 -0
  70. data/lib/less/js/dist/lessc-rhino-1.7.0.js +449 -0
  71. data/lib/less/js/gradle/wrapper/gradle-wrapper.jar +0 -0
  72. data/lib/less/js/gradle/wrapper/gradle-wrapper.properties +6 -0
  73. data/lib/less/js/gradlew +164 -0
  74. data/lib/less/js/gradlew.bat +90 -0
  75. data/lib/less/js/lib/less/browser.js +547 -250
  76. data/lib/less/js/lib/less/encoder.js +4 -0
  77. data/lib/less/js/lib/less/env.js +136 -0
  78. data/lib/less/js/lib/less/extend-visitor.js +416 -0
  79. data/lib/less/js/lib/less/functions.js +576 -36
  80. data/lib/less/js/lib/less/import-visitor.js +142 -0
  81. data/lib/less/js/lib/less/index.js +187 -83
  82. data/lib/less/js/lib/less/join-selector-visitor.js +44 -0
  83. data/lib/less/js/lib/less/lessc_helper.js +82 -0
  84. data/lib/less/js/lib/less/parser.js +1286 -523
  85. data/lib/less/js/lib/less/rhino.js +415 -29
  86. data/lib/less/js/lib/less/source-map-output.js +141 -0
  87. data/lib/less/js/lib/less/to-css-visitor.js +240 -0
  88. data/lib/less/js/lib/less/tree/alpha.js +17 -5
  89. data/lib/less/js/lib/less/tree/anonymous.js +25 -4
  90. data/lib/less/js/lib/less/tree/assignment.js +17 -5
  91. data/lib/less/js/lib/less/tree/call.js +36 -13
  92. data/lib/less/js/lib/less/tree/color.js +119 -31
  93. data/lib/less/js/lib/less/tree/comment.js +18 -4
  94. data/lib/less/js/lib/less/tree/condition.js +35 -28
  95. data/lib/less/js/lib/less/tree/detached-ruleset.js +20 -0
  96. data/lib/less/js/lib/less/tree/dimension.js +291 -16
  97. data/lib/less/js/lib/less/tree/directive.js +56 -22
  98. data/lib/less/js/lib/less/tree/element.js +78 -17
  99. data/lib/less/js/lib/less/tree/expression.js +39 -8
  100. data/lib/less/js/lib/less/tree/extend.js +53 -0
  101. data/lib/less/js/lib/less/tree/import.js +81 -36
  102. data/lib/less/js/lib/less/tree/javascript.js +17 -10
  103. data/lib/less/js/lib/less/tree/keyword.js +8 -3
  104. data/lib/less/js/lib/less/tree/media.js +70 -27
  105. data/lib/less/js/lib/less/tree/mixin.js +250 -70
  106. data/lib/less/js/lib/less/tree/negative.js +24 -0
  107. data/lib/less/js/lib/less/tree/operation.js +38 -13
  108. data/lib/less/js/lib/less/tree/paren.js +9 -2
  109. data/lib/less/js/lib/less/tree/quoted.js +29 -10
  110. data/lib/less/js/lib/less/tree/rule.js +77 -29
  111. data/lib/less/js/lib/less/tree/ruleset-call.js +16 -0
  112. data/lib/less/js/lib/less/tree/ruleset.js +445 -107
  113. data/lib/less/js/lib/less/tree/selector.js +117 -30
  114. data/lib/less/js/lib/less/tree/unicode-descriptor.js +15 -0
  115. data/lib/less/js/lib/less/tree/url.js +43 -15
  116. data/lib/less/js/lib/less/tree/value.js +16 -6
  117. data/lib/less/js/lib/less/tree/variable.js +26 -8
  118. data/lib/less/js/lib/less/tree.js +82 -2
  119. data/lib/less/js/lib/less/visitor.js +146 -0
  120. data/lib/less/js/lib/source-map/source-map-0.1.31.js +1933 -0
  121. data/lib/less/js/lib/source-map/source-map-footer.js +4 -0
  122. data/lib/less/js/lib/source-map/source-map-header.js +3 -0
  123. data/lib/less/js/package.json +86 -11
  124. data/lib/less/js/test/browser/common.js +201 -0
  125. data/lib/less/js/test/browser/css/global-vars/simple.css +3 -0
  126. data/lib/less/js/test/browser/css/modify-vars/simple.css +8 -0
  127. data/lib/less/js/test/browser/css/postProcessor/postProcessor.css +4 -0
  128. data/lib/less/js/test/browser/css/relative-urls/urls.css +35 -0
  129. data/lib/less/js/test/browser/css/rootpath/urls.css +35 -0
  130. data/lib/less/js/test/browser/css/rootpath-relative/urls.css +35 -0
  131. data/lib/less/js/test/browser/css/urls.css +53 -0
  132. data/lib/less/js/test/browser/es5.js +27 -0
  133. data/lib/less/js/test/browser/jasmine-html.js +681 -0
  134. data/lib/less/js/test/browser/jasmine.css +82 -0
  135. data/lib/less/js/test/browser/jasmine.js +2600 -0
  136. data/lib/less/js/test/browser/less/console-errors/test-error.less +3 -0
  137. data/lib/less/js/test/browser/less/console-errors/test-error.txt +2 -0
  138. data/lib/less/js/test/browser/less/global-vars/simple.less +3 -0
  139. data/lib/less/js/test/browser/less/imports/urls.less +4 -0
  140. data/lib/less/js/test/browser/less/imports/urls2.less +4 -0
  141. data/lib/less/js/test/browser/less/modify-vars/imports/simple2.less +4 -0
  142. data/lib/less/js/test/browser/less/modify-vars/simple.less +8 -0
  143. data/lib/less/js/test/browser/less/postProcessor/postProcessor.less +4 -0
  144. data/lib/less/js/test/browser/less/relative-urls/urls.less +33 -0
  145. data/lib/less/js/test/browser/less/rootpath/urls.less +33 -0
  146. data/lib/less/js/test/browser/less/rootpath-relative/urls.less +33 -0
  147. data/lib/less/js/test/browser/less/urls.less +57 -0
  148. data/lib/less/js/test/browser/phantom-runner.js +150 -0
  149. data/lib/less/js/test/browser/runner-browser-options.js +42 -0
  150. data/lib/less/js/test/browser/runner-browser-spec.js +12 -0
  151. data/lib/less/js/test/browser/runner-console-errors.js +5 -0
  152. data/lib/less/js/test/browser/runner-errors-options.js +5 -0
  153. data/lib/less/js/test/browser/runner-errors-spec.js +4 -0
  154. data/lib/less/js/test/browser/runner-global-vars-options.js +4 -0
  155. data/lib/less/js/test/browser/runner-global-vars-spec.js +3 -0
  156. data/lib/less/js/test/browser/runner-legacy-options.js +4 -0
  157. data/lib/less/js/test/browser/runner-legacy-spec.js +3 -0
  158. data/lib/less/js/test/browser/runner-main-options.js +15 -0
  159. data/lib/less/js/test/browser/runner-main-spec.js +3 -0
  160. data/lib/less/js/test/browser/runner-modify-vars-options.js +2 -0
  161. data/lib/less/js/test/browser/runner-modify-vars-spec.js +43 -0
  162. data/lib/less/js/test/browser/runner-no-js-errors-options.js +4 -0
  163. data/lib/less/js/test/browser/runner-no-js-errors-spec.js +4 -0
  164. data/lib/less/js/test/browser/runner-postProcessor-options.js +4 -0
  165. data/lib/less/js/test/browser/runner-postProcessor.js +3 -0
  166. data/lib/less/js/test/browser/runner-production-options.js +3 -0
  167. data/lib/less/js/test/browser/runner-production-spec.js +5 -0
  168. data/lib/less/js/test/browser/runner-relative-urls-options.js +3 -0
  169. data/lib/less/js/test/browser/runner-relative-urls-spec.js +3 -0
  170. data/lib/less/js/test/browser/runner-rootpath-options.js +3 -0
  171. data/lib/less/js/test/browser/runner-rootpath-relative-options.js +4 -0
  172. data/lib/less/js/test/browser/runner-rootpath-relative-spec.js +3 -0
  173. data/lib/less/js/test/browser/runner-rootpath-spec.js +3 -0
  174. data/lib/less/js/test/browser/test-runner-template.tmpl +47 -0
  175. data/lib/less/js/test/css/charsets.css +1 -0
  176. data/lib/less/js/test/css/colors.css +29 -0
  177. data/lib/less/js/test/css/comments.css +15 -2
  178. data/lib/less/js/test/css/compression/compression.css +3 -0
  179. data/lib/less/js/test/css/css-3.css +73 -2
  180. data/lib/less/js/test/css/css-escapes.css +4 -0
  181. data/lib/less/js/test/css/css-guards.css +37 -0
  182. data/lib/less/js/test/css/css.css +20 -14
  183. data/lib/less/js/test/css/debug/linenumbers-all.css +49 -0
  184. data/lib/less/js/test/css/debug/linenumbers-comments.css +40 -0
  185. data/lib/less/js/test/css/debug/linenumbers-mediaquery.css +40 -0
  186. data/lib/less/js/test/css/detached-rulesets.css +71 -0
  187. data/lib/less/js/test/css/empty.css +0 -0
  188. data/lib/less/js/test/css/extend-chaining.css +81 -0
  189. data/lib/less/js/test/css/extend-clearfix.css +19 -0
  190. data/lib/less/js/test/css/extend-exact.css +37 -0
  191. data/lib/less/js/test/css/extend-media.css +24 -0
  192. data/lib/less/js/test/css/extend-nest.css +57 -0
  193. data/lib/less/js/test/css/extend-selector.css +80 -0
  194. data/lib/less/js/test/css/extend.css +76 -0
  195. data/lib/less/js/test/css/extract-and-length.css +133 -0
  196. data/lib/less/js/test/css/functions.css +117 -2
  197. data/lib/less/js/test/css/globalVars/extended.css +12 -0
  198. data/lib/less/js/test/css/globalVars/simple.css +6 -0
  199. data/lib/less/js/test/css/ie-filters.css +7 -3
  200. data/lib/less/js/test/css/import-inline.css +5 -0
  201. data/lib/less/js/test/css/import-interpolation.css +6 -0
  202. data/lib/less/js/test/css/import-once.css +15 -0
  203. data/lib/less/js/test/css/import-reference.css +68 -0
  204. data/lib/less/js/test/css/import.css +23 -10
  205. data/lib/less/js/test/css/javascript.css +3 -2
  206. data/lib/less/js/test/css/legacy/legacy.css +7 -0
  207. data/lib/less/js/test/css/media.css +141 -1
  208. data/lib/less/js/test/css/merge.css +34 -0
  209. data/lib/less/js/test/css/mixins-args.css +41 -4
  210. data/lib/less/js/test/css/mixins-guards-default-func.css +129 -0
  211. data/lib/less/js/test/css/mixins-guards.css +24 -0
  212. data/lib/less/js/test/css/mixins-important.css +28 -0
  213. data/lib/less/js/test/css/mixins-interpolated.css +39 -0
  214. data/lib/less/js/test/css/mixins-named-args.css +27 -0
  215. data/lib/less/js/test/css/mixins-pattern.css +4 -0
  216. data/lib/less/js/test/css/mixins.css +70 -0
  217. data/lib/less/js/test/css/modifyVars/extended.css +9 -0
  218. data/lib/less/js/test/css/no-output.css +0 -0
  219. data/lib/less/js/test/css/parens.css +21 -5
  220. data/lib/less/js/test/css/property-name-interp.css +20 -0
  221. data/lib/less/js/test/css/scope.css +23 -0
  222. data/lib/less/js/test/css/selectors.css +84 -0
  223. data/lib/less/js/test/css/static-urls/urls.css +45 -0
  224. data/lib/less/js/test/css/strings.css +5 -2
  225. data/lib/less/js/test/css/url-args/urls.css +56 -0
  226. data/lib/less/js/test/css/urls.css +71 -0
  227. data/lib/less/js/test/css/variables-in-at-rules.css +18 -0
  228. data/lib/less/js/test/css/variables.css +22 -4
  229. data/lib/less/js/test/css/whitespace.css +4 -0
  230. data/lib/less/js/test/data/data-uri-fail.png +0 -0
  231. data/lib/less/js/test/data/image.jpg +1 -0
  232. data/lib/less/js/test/data/page.html +1 -0
  233. data/lib/less/js/test/index.js +45 -0
  234. data/lib/less/js/test/less/charsets.less +3 -0
  235. data/lib/less/js/test/less/colors.less +37 -4
  236. data/lib/less/js/test/less/comments.less +21 -3
  237. data/lib/less/js/test/less/compression/compression.less +36 -0
  238. data/lib/less/js/test/less/css-3.less +70 -6
  239. data/lib/less/js/test/less/css-escapes.less +6 -1
  240. data/lib/less/js/test/less/css-guards.less +102 -0
  241. data/lib/less/js/test/less/css.less +23 -15
  242. data/lib/less/js/test/less/debug/import/test.less +25 -0
  243. data/lib/less/js/test/less/debug/linenumbers.less +33 -0
  244. data/lib/less/js/test/less/detached-rulesets.less +103 -0
  245. data/lib/less/js/test/less/empty.less +0 -0
  246. data/lib/less/js/test/less/errors/add-mixed-units.less +3 -0
  247. data/lib/less/js/test/less/errors/add-mixed-units.txt +4 -0
  248. data/lib/less/js/test/less/errors/add-mixed-units2.less +3 -0
  249. data/lib/less/js/test/less/errors/add-mixed-units2.txt +4 -0
  250. data/lib/less/js/test/less/errors/at-rules-undefined-var.less +4 -0
  251. data/lib/less/js/test/less/errors/at-rules-undefined-var.txt +4 -0
  252. data/lib/less/js/test/less/errors/bad-variable-declaration1.less +1 -0
  253. data/lib/less/js/test/less/errors/bad-variable-declaration1.txt +2 -0
  254. data/lib/less/js/test/less/errors/color-func-invalid-color.less +3 -0
  255. data/lib/less/js/test/less/errors/color-func-invalid-color.txt +4 -0
  256. data/lib/less/js/test/less/errors/comment-in-selector.less +1 -0
  257. data/lib/less/js/test/less/errors/comment-in-selector.txt +2 -0
  258. data/lib/less/js/test/less/errors/css-guard-default-func.less +4 -0
  259. data/lib/less/js/test/less/errors/css-guard-default-func.txt +4 -0
  260. data/lib/less/js/test/less/errors/detached-ruleset-1.less +6 -0
  261. data/lib/less/js/test/less/errors/detached-ruleset-1.txt +4 -0
  262. data/lib/less/js/test/less/errors/detached-ruleset-2.less +6 -0
  263. data/lib/less/js/test/less/errors/detached-ruleset-2.txt +4 -0
  264. data/lib/less/js/test/less/errors/detached-ruleset-3.less +4 -0
  265. data/lib/less/js/test/less/errors/detached-ruleset-3.txt +4 -0
  266. data/lib/less/js/test/less/errors/detached-ruleset-4.less +5 -0
  267. data/lib/less/js/test/less/errors/detached-ruleset-4.txt +3 -0
  268. data/lib/less/js/test/less/errors/detached-ruleset-5.less +4 -0
  269. data/lib/less/js/test/less/errors/detached-ruleset-5.txt +3 -0
  270. data/lib/less/js/test/less/errors/detached-ruleset-6.less +5 -0
  271. data/lib/less/js/test/less/errors/detached-ruleset-6.txt +4 -0
  272. data/lib/less/js/test/less/errors/divide-mixed-units.less +3 -0
  273. data/lib/less/js/test/less/errors/divide-mixed-units.txt +4 -0
  274. data/lib/less/js/test/less/errors/extend-no-selector.less +3 -0
  275. data/lib/less/js/test/less/errors/extend-no-selector.txt +3 -0
  276. data/lib/less/js/test/less/errors/extend-not-at-end.less +3 -0
  277. data/lib/less/js/test/less/errors/extend-not-at-end.txt +3 -0
  278. data/lib/less/js/test/less/errors/import-missing.less +6 -0
  279. data/lib/less/js/test/less/errors/import-missing.txt +3 -0
  280. data/lib/less/js/test/less/errors/import-no-semi.less +1 -0
  281. data/lib/less/js/test/less/errors/import-no-semi.txt +2 -0
  282. data/lib/less/js/test/less/errors/import-subfolder1.less +1 -0
  283. data/lib/less/js/test/less/errors/import-subfolder1.txt +3 -0
  284. data/lib/less/js/test/less/errors/import-subfolder2.less +1 -0
  285. data/lib/less/js/test/less/errors/import-subfolder2.txt +4 -0
  286. data/lib/less/js/test/less/errors/imports/import-subfolder1.less +1 -0
  287. data/lib/less/js/test/less/errors/imports/import-subfolder2.less +1 -0
  288. data/lib/less/js/test/less/errors/imports/import-test.less +4 -0
  289. data/lib/less/js/test/less/errors/imports/subfolder/mixin-not-defined.less +1 -0
  290. data/lib/less/js/test/less/errors/imports/subfolder/parse-error-curly-bracket.less +1 -0
  291. data/lib/less/js/test/less/errors/javascript-error.less +3 -0
  292. data/lib/less/js/test/less/errors/javascript-error.txt +4 -0
  293. data/lib/less/js/test/less/errors/javascript-undefined-var.less +3 -0
  294. data/lib/less/js/test/less/errors/javascript-undefined-var.txt +4 -0
  295. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-1.less +6 -0
  296. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-1.txt +4 -0
  297. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-2.less +6 -0
  298. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-2.txt +4 -0
  299. data/lib/less/js/test/less/errors/mixin-not-defined.less +11 -0
  300. data/lib/less/js/test/less/errors/mixin-not-defined.txt +3 -0
  301. data/lib/less/js/test/less/errors/mixin-not-matched.less +6 -0
  302. data/lib/less/js/test/less/errors/mixin-not-matched.txt +3 -0
  303. data/lib/less/js/test/less/errors/mixin-not-matched2.less +6 -0
  304. data/lib/less/js/test/less/errors/mixin-not-matched2.txt +3 -0
  305. data/lib/less/js/test/less/errors/mixin-not-visible-in-scope-1.less +9 -0
  306. data/lib/less/js/test/less/errors/mixin-not-visible-in-scope-1.txt +4 -0
  307. data/lib/less/js/test/less/errors/mixins-guards-default-func-1.less +9 -0
  308. data/lib/less/js/test/less/errors/mixins-guards-default-func-1.txt +4 -0
  309. data/lib/less/js/test/less/errors/mixins-guards-default-func-2.less +9 -0
  310. data/lib/less/js/test/less/errors/mixins-guards-default-func-2.txt +4 -0
  311. data/lib/less/js/test/less/errors/mixins-guards-default-func-3.less +9 -0
  312. data/lib/less/js/test/less/errors/mixins-guards-default-func-3.txt +4 -0
  313. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors.less +4 -0
  314. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors.txt +4 -0
  315. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors2.less +4 -0
  316. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors2.txt +4 -0
  317. data/lib/less/js/test/less/errors/multiply-mixed-units.less +7 -0
  318. data/lib/less/js/test/less/errors/multiply-mixed-units.txt +4 -0
  319. data/lib/less/js/test/less/errors/parens-error-1.less +3 -0
  320. data/lib/less/js/test/less/errors/parens-error-1.txt +4 -0
  321. data/lib/less/js/test/less/errors/parens-error-2.less +3 -0
  322. data/lib/less/js/test/less/errors/parens-error-2.txt +4 -0
  323. data/lib/less/js/test/less/errors/parens-error-3.less +3 -0
  324. data/lib/less/js/test/less/errors/parens-error-3.txt +4 -0
  325. data/lib/less/js/test/less/errors/parse-error-curly-bracket.less +4 -0
  326. data/lib/less/js/test/less/errors/parse-error-curly-bracket.txt +4 -0
  327. data/lib/less/js/test/less/errors/parse-error-extra-parens.less +5 -0
  328. data/lib/less/js/test/less/errors/parse-error-extra-parens.txt +3 -0
  329. data/lib/less/js/test/less/errors/parse-error-missing-bracket.less +2 -0
  330. data/lib/less/js/test/less/errors/parse-error-missing-bracket.txt +3 -0
  331. data/lib/less/js/test/less/errors/parse-error-missing-parens.less +5 -0
  332. data/lib/less/js/test/less/errors/parse-error-missing-parens.txt +3 -0
  333. data/lib/less/js/test/less/errors/parse-error-with-import.less +13 -0
  334. data/lib/less/js/test/less/errors/parse-error-with-import.txt +4 -0
  335. data/lib/less/js/test/less/errors/percentage-missing-space.less +3 -0
  336. data/lib/less/js/test/less/errors/percentage-missing-space.txt +4 -0
  337. data/lib/less/js/test/less/errors/property-asterisk-only-name.less +3 -0
  338. data/lib/less/js/test/less/errors/property-asterisk-only-name.txt +4 -0
  339. data/lib/less/js/test/less/errors/property-ie5-hack.less +3 -0
  340. data/lib/less/js/test/less/errors/property-ie5-hack.txt +4 -0
  341. data/lib/less/js/test/less/errors/property-in-root.less +4 -0
  342. data/lib/less/js/test/less/errors/property-in-root.txt +4 -0
  343. data/lib/less/js/test/less/errors/property-in-root2.less +1 -0
  344. data/lib/less/js/test/less/errors/property-in-root2.txt +4 -0
  345. data/lib/less/js/test/less/errors/property-in-root3.less +4 -0
  346. data/lib/less/js/test/less/errors/property-in-root3.txt +3 -0
  347. data/lib/less/js/test/less/errors/property-interp-not-defined.less +1 -0
  348. data/lib/less/js/test/less/errors/property-interp-not-defined.txt +2 -0
  349. data/lib/less/js/test/less/errors/recursive-variable.less +1 -0
  350. data/lib/less/js/test/less/errors/recursive-variable.txt +2 -0
  351. data/lib/less/js/test/less/errors/svg-gradient1.less +3 -0
  352. data/lib/less/js/test/less/errors/svg-gradient1.txt +4 -0
  353. data/lib/less/js/test/less/errors/svg-gradient2.less +3 -0
  354. data/lib/less/js/test/less/errors/svg-gradient2.txt +4 -0
  355. data/lib/less/js/test/less/errors/svg-gradient3.less +3 -0
  356. data/lib/less/js/test/less/errors/svg-gradient3.txt +4 -0
  357. data/lib/less/js/test/less/errors/unit-function.less +3 -0
  358. data/lib/less/js/test/less/errors/unit-function.txt +4 -0
  359. data/lib/less/js/test/less/extend-chaining.less +91 -0
  360. data/lib/less/js/test/less/extend-clearfix.less +19 -0
  361. data/lib/less/js/test/less/extend-exact.less +46 -0
  362. data/lib/less/js/test/less/extend-media.less +24 -0
  363. data/lib/less/js/test/less/extend-nest.less +65 -0
  364. data/lib/less/js/test/less/extend-selector.less +99 -0
  365. data/lib/less/js/test/less/extend.less +81 -0
  366. data/lib/less/js/test/less/extract-and-length.less +133 -0
  367. data/lib/less/js/test/less/functions.less +130 -6
  368. data/lib/less/js/test/less/globalVars/extended.json +5 -0
  369. data/lib/less/js/test/less/globalVars/extended.less +10 -0
  370. data/lib/less/js/test/less/globalVars/simple.json +3 -0
  371. data/lib/less/js/test/less/globalVars/simple.less +3 -0
  372. data/lib/less/js/test/less/ie-filters.less +7 -0
  373. data/lib/less/js/test/less/import/deeper/import-once-test-a.less +1 -0
  374. data/lib/less/js/test/less/import/import-and-relative-paths-test.less +17 -0
  375. data/lib/less/js/test/less/import/import-charset-test.less +1 -0
  376. data/lib/less/js/test/less/import/import-interpolation.less +1 -0
  377. data/lib/less/js/test/less/import/import-interpolation2.less +5 -0
  378. data/lib/less/js/test/less/import/import-once-test-c.less +6 -0
  379. data/lib/less/js/test/less/import/import-reference.less +51 -0
  380. data/lib/less/js/test/less/import/import-test-a.less +1 -0
  381. data/lib/less/js/test/less/import/import-test-c.less +0 -1
  382. data/lib/less/js/test/less/import/import-test-f.less +5 -0
  383. data/lib/less/js/test/less/import/imports/font.less +8 -0
  384. data/lib/less/js/test/less/import/imports/logo.less +5 -0
  385. data/lib/less/js/test/less/import/invalid-css.less +1 -0
  386. data/lib/less/js/test/less/import/urls.less +1 -0
  387. data/lib/less/js/test/less/import-inline.less +2 -0
  388. data/lib/less/js/test/less/import-interpolation.less +8 -0
  389. data/lib/less/js/test/less/import-once.less +6 -0
  390. data/lib/less/js/test/less/import-reference.less +21 -0
  391. data/lib/less/js/test/less/import.less +13 -3
  392. data/lib/less/js/test/less/javascript.less +5 -3
  393. data/lib/less/js/test/less/legacy/legacy.less +7 -0
  394. data/lib/less/js/test/less/media.less +158 -3
  395. data/lib/less/js/test/less/merge.less +78 -0
  396. data/lib/less/js/test/less/mixins-args.less +93 -15
  397. data/lib/less/js/test/less/mixins-guards-default-func.less +195 -0
  398. data/lib/less/js/test/less/mixins-guards.less +65 -0
  399. data/lib/less/js/test/less/mixins-important.less +8 -1
  400. data/lib/less/js/test/less/mixins-interpolated.less +69 -0
  401. data/lib/less/js/test/less/mixins-named-args.less +36 -0
  402. data/lib/less/js/test/less/mixins-nested.less +2 -2
  403. data/lib/less/js/test/less/mixins-pattern.less +4 -1
  404. data/lib/less/js/test/less/mixins.less +74 -0
  405. data/lib/less/js/test/less/modifyVars/extended.json +5 -0
  406. data/lib/less/js/test/less/modifyVars/extended.less +11 -0
  407. data/lib/less/js/test/less/no-js-errors/no-js-errors.less +3 -0
  408. data/lib/less/js/test/less/no-js-errors/no-js-errors.txt +4 -0
  409. data/lib/less/js/test/less/no-output.less +2 -0
  410. data/lib/less/js/test/less/operations.less +27 -27
  411. data/lib/less/js/test/less/parens.less +24 -5
  412. data/lib/less/js/test/less/property-name-interp.less +53 -0
  413. data/lib/less/js/test/less/scope.less +73 -1
  414. data/lib/less/js/test/less/selectors.less +101 -0
  415. data/lib/less/js/test/less/sourcemaps/basic.json +3 -0
  416. data/lib/less/js/test/less/sourcemaps/basic.less +27 -0
  417. data/lib/less/js/test/less/sourcemaps/imported.css +7 -0
  418. data/lib/less/js/test/less/static-urls/urls.less +33 -0
  419. data/lib/less/js/test/less/strings.less +7 -1
  420. data/lib/less/js/test/less/url-args/urls.less +63 -0
  421. data/lib/less/js/test/less/urls.less +72 -0
  422. data/lib/less/js/test/less/variables-in-at-rules.less +20 -0
  423. data/lib/less/js/test/less/variables.less +42 -13
  424. data/lib/less/js/test/less/whitespace.less +7 -0
  425. data/lib/less/js/test/less-test.js +251 -65
  426. data/lib/less/js/test/rhino/test-header.js +15 -0
  427. data/lib/less/js/test/sourcemaps/basic.json +1 -0
  428. data/lib/less/js/test/sourcemaps/index.html +17 -0
  429. data/lib/less/loader.rb +191 -27
  430. data/lib/less/parser.rb +47 -8
  431. data/lib/less/version.rb +2 -2
  432. data/spec/less/loader_spec.rb +45 -0
  433. data/spec/less/parser_spec.rb +43 -17
  434. data/spec/less/some/some.css +0 -0
  435. data/spec/less/some/some.less +4 -0
  436. metadata +352 -57
  437. data/lib/less/js/CHANGELOG +0 -41
  438. data/lib/less/js/Makefile +0 -75
  439. data/lib/less/js/build/ecma-5.js +0 -120
  440. data/lib/less/js/build/header.js +0 -7
  441. data/lib/less/js/lib/less/cssmin.js +0 -355
@@ -0,0 +1,142 @@
1
+ (function (tree) {
2
+ tree.importVisitor = function(importer, finish, evalEnv, onceFileDetectionMap, recursionDetector) {
3
+ this._visitor = new tree.visitor(this);
4
+ this._importer = importer;
5
+ this._finish = finish;
6
+ this.env = evalEnv || new tree.evalEnv();
7
+ this.importCount = 0;
8
+ this.onceFileDetectionMap = onceFileDetectionMap || {};
9
+ this.recursionDetector = {};
10
+ if (recursionDetector) {
11
+ for(var fullFilename in recursionDetector) {
12
+ if (recursionDetector.hasOwnProperty(fullFilename)) {
13
+ this.recursionDetector[fullFilename] = true;
14
+ }
15
+ }
16
+ }
17
+ };
18
+
19
+ tree.importVisitor.prototype = {
20
+ isReplacing: true,
21
+ run: function (root) {
22
+ var error;
23
+ try {
24
+ // process the contents
25
+ this._visitor.visit(root);
26
+ }
27
+ catch(e) {
28
+ error = e;
29
+ }
30
+
31
+ this.isFinished = true;
32
+
33
+ if (this.importCount === 0) {
34
+ this._finish(error);
35
+ }
36
+ },
37
+ visitImport: function (importNode, visitArgs) {
38
+ var importVisitor = this,
39
+ evaldImportNode,
40
+ inlineCSS = importNode.options.inline;
41
+
42
+ if (!importNode.css || inlineCSS) {
43
+
44
+ try {
45
+ evaldImportNode = importNode.evalForImport(this.env);
46
+ } catch(e){
47
+ if (!e.filename) { e.index = importNode.index; e.filename = importNode.currentFileInfo.filename; }
48
+ // attempt to eval properly and treat as css
49
+ importNode.css = true;
50
+ // if that fails, this error will be thrown
51
+ importNode.error = e;
52
+ }
53
+
54
+ if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {
55
+ importNode = evaldImportNode;
56
+ this.importCount++;
57
+ var env = new tree.evalEnv(this.env, this.env.frames.slice(0));
58
+
59
+ if (importNode.options.multiple) {
60
+ env.importMultiple = true;
61
+ }
62
+
63
+ this._importer.push(importNode.getPath(), importNode.currentFileInfo, importNode.options, function (e, root, importedAtRoot, fullPath) {
64
+ if (e && !e.filename) { e.index = importNode.index; e.filename = importNode.currentFileInfo.filename; }
65
+
66
+ if (!env.importMultiple) {
67
+ if (importedAtRoot) {
68
+ importNode.skip = true;
69
+ } else {
70
+ importNode.skip = function() {
71
+ if (fullPath in importVisitor.onceFileDetectionMap) {
72
+ return true;
73
+ }
74
+ importVisitor.onceFileDetectionMap[fullPath] = true;
75
+ return false;
76
+ };
77
+ }
78
+ }
79
+
80
+ var subFinish = function(e) {
81
+ importVisitor.importCount--;
82
+
83
+ if (importVisitor.importCount === 0 && importVisitor.isFinished) {
84
+ importVisitor._finish(e);
85
+ }
86
+ };
87
+
88
+ if (root) {
89
+ importNode.root = root;
90
+ importNode.importedFilename = fullPath;
91
+ var duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;
92
+
93
+ if (!inlineCSS && (env.importMultiple || !duplicateImport)) {
94
+ importVisitor.recursionDetector[fullPath] = true;
95
+ new(tree.importVisitor)(importVisitor._importer, subFinish, env, importVisitor.onceFileDetectionMap, importVisitor.recursionDetector)
96
+ .run(root);
97
+ return;
98
+ }
99
+ }
100
+
101
+ subFinish();
102
+ });
103
+ }
104
+ }
105
+ visitArgs.visitDeeper = false;
106
+ return importNode;
107
+ },
108
+ visitRule: function (ruleNode, visitArgs) {
109
+ visitArgs.visitDeeper = false;
110
+ return ruleNode;
111
+ },
112
+ visitDirective: function (directiveNode, visitArgs) {
113
+ this.env.frames.unshift(directiveNode);
114
+ return directiveNode;
115
+ },
116
+ visitDirectiveOut: function (directiveNode) {
117
+ this.env.frames.shift();
118
+ },
119
+ visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {
120
+ this.env.frames.unshift(mixinDefinitionNode);
121
+ return mixinDefinitionNode;
122
+ },
123
+ visitMixinDefinitionOut: function (mixinDefinitionNode) {
124
+ this.env.frames.shift();
125
+ },
126
+ visitRuleset: function (rulesetNode, visitArgs) {
127
+ this.env.frames.unshift(rulesetNode);
128
+ return rulesetNode;
129
+ },
130
+ visitRulesetOut: function (rulesetNode) {
131
+ this.env.frames.shift();
132
+ },
133
+ visitMedia: function (mediaNode, visitArgs) {
134
+ this.env.frames.unshift(mediaNode.ruleset);
135
+ return mediaNode;
136
+ },
137
+ visitMediaOut: function (mediaNode) {
138
+ this.env.frames.shift();
139
+ }
140
+ };
141
+
142
+ })(require('./tree'));
@@ -1,17 +1,18 @@
1
1
  var path = require('path'),
2
- sys = require('util'),
2
+ url = require('url'),
3
+ request,
3
4
  fs = require('fs');
4
5
 
5
6
  var less = {
6
- version: [1, 3, 0],
7
+ version: [1, 7, 0],
7
8
  Parser: require('./parser').Parser,
8
- importer: require('./parser').importer,
9
9
  tree: require('./tree'),
10
10
  render: function (input, options, callback) {
11
11
  options = options || {};
12
12
 
13
13
  if (typeof(options) === 'function') {
14
- callback = options, options = {};
14
+ callback = options;
15
+ options = {};
15
16
  }
16
17
 
17
18
  var parser = new(less.Parser)(options),
@@ -19,130 +20,233 @@ var less = {
19
20
 
20
21
  if (callback) {
21
22
  parser.parse(input, function (e, root) {
22
- callback(e, root && root.toCSS && root.toCSS(options));
23
+ if (e) { callback(e); return; }
24
+ var css;
25
+ try {
26
+ css = root && root.toCSS && root.toCSS(options);
27
+ }
28
+ catch (err) { callback(err); return; }
29
+ callback(null, css);
23
30
  });
24
31
  } else {
25
- ee = new(require('events').EventEmitter);
32
+ ee = new (require('events').EventEmitter)();
26
33
 
27
34
  process.nextTick(function () {
28
35
  parser.parse(input, function (e, root) {
29
- if (e) { ee.emit('error', e) }
30
- else { ee.emit('success', root.toCSS(options)) }
36
+ if (e) { return ee.emit('error', e); }
37
+ try { ee.emit('success', root.toCSS(options)); }
38
+ catch (err) { ee.emit('error', err); }
31
39
  });
32
40
  });
33
41
  return ee;
34
42
  }
35
43
  },
36
- writeError: function (ctx, options) {
44
+ formatError: function(ctx, options) {
37
45
  options = options || {};
38
46
 
39
47
  var message = "";
40
48
  var extract = ctx.extract;
41
49
  var error = [];
42
- var stylize = options.color ? less.stylize : function (str) { return str };
43
-
44
- if (options.silent) { return }
50
+ var stylize = options.color ? require('./lessc_helper').stylize : function (str) { return str; };
45
51
 
46
- if (ctx.stack) { return sys.error(stylize(ctx.stack, 'red')) }
52
+ // only output a stack if it isn't a less error
53
+ if (ctx.stack && !ctx.type) { return stylize(ctx.stack, 'red'); }
47
54
 
48
- if (!ctx.hasOwnProperty('index')) {
49
- return sys.error(ctx.stack || ctx.message);
55
+ if (!ctx.hasOwnProperty('index') || !extract) {
56
+ return ctx.stack || ctx.message;
50
57
  }
51
58
 
52
59
  if (typeof(extract[0]) === 'string') {
53
60
  error.push(stylize((ctx.line - 1) + ' ' + extract[0], 'grey'));
54
61
  }
55
62
 
56
- if (extract[1]) {
57
- error.push(ctx.line + ' ' + extract[1].slice(0, ctx.column)
58
- + stylize(stylize(stylize(extract[1][ctx.column], 'bold')
59
- + extract[1].slice(ctx.column + 1), 'red'), 'inverse'));
63
+ if (typeof(extract[1]) === 'string') {
64
+ var errorTxt = ctx.line + ' ';
65
+ if (extract[1]) {
66
+ errorTxt += extract[1].slice(0, ctx.column) +
67
+ stylize(stylize(stylize(extract[1][ctx.column], 'bold') +
68
+ extract[1].slice(ctx.column + 1), 'red'), 'inverse');
69
+ }
70
+ error.push(errorTxt);
60
71
  }
61
72
 
62
73
  if (typeof(extract[2]) === 'string') {
63
74
  error.push(stylize((ctx.line + 1) + ' ' + extract[2], 'grey'));
64
75
  }
65
- error = error.join('\n') + '\033[0m\n';
76
+ error = error.join('\n') + stylize('', 'reset') + '\n';
66
77
 
67
78
  message += stylize(ctx.type + 'Error: ' + ctx.message, 'red');
68
- ctx.filename && (message += stylize(' in ', 'red') + ctx.filename +
69
- stylize(':' + ctx.line + ':' + ctx.column, 'grey'));
79
+ if (ctx.filename) {
80
+ message += stylize(' in ', 'red') + ctx.filename +
81
+ stylize(' on line ' + ctx.line + ', column ' + (ctx.column + 1) + ':', 'grey');
82
+ }
70
83
 
71
- sys.error(message, error);
84
+ message += '\n' + error;
72
85
 
73
86
  if (ctx.callLine) {
74
- sys.error(stylize('from ', 'red') + (ctx.filename || ''));
75
- sys.error(stylize(ctx.callLine, 'grey') + ' ' + ctx.callExtract);
87
+ message += stylize('from ', 'red') + (ctx.filename || '') + '/n';
88
+ message += stylize(ctx.callLine, 'grey') + ' ' + ctx.callExtract + '/n';
76
89
  }
90
+
91
+ return message;
92
+ },
93
+ writeError: function (ctx, options) {
94
+ options = options || {};
95
+ if (options.silent) { return; }
96
+ console.error(less.formatError(ctx, options));
77
97
  }
78
98
  };
79
99
 
80
- ['color', 'directive', 'operation', 'dimension',
81
- 'keyword', 'variable', 'ruleset', 'element',
82
- 'selector', 'quoted', 'expression', 'rule',
83
- 'call', 'url', 'alpha', 'import',
84
- 'mixin', 'comment', 'anonymous', 'value',
85
- 'javascript', 'assignment', 'condition', 'paren',
86
- 'media'
87
- ].forEach(function (n) {
88
- require('./tree/' + n);
89
- });
90
-
91
- less.Parser.importer = function (file, paths, callback, env) {
92
- var pathname;
93
-
94
- // TODO: Undo this at some point,
95
- // or use different approach.
96
- paths.unshift('.');
97
-
98
- for (var i = 0; i < paths.length; i++) {
99
- try {
100
- pathname = path.join(paths[i], file);
101
- fs.statSync(pathname);
102
- break;
103
- } catch (e) {
104
- pathname = null;
100
+ require('./tree/color');
101
+ require('./tree/directive');
102
+ require('./tree/detached-ruleset');
103
+ require('./tree/operation');
104
+ require('./tree/dimension');
105
+ require('./tree/keyword');
106
+ require('./tree/variable');
107
+ require('./tree/ruleset');
108
+ require('./tree/element');
109
+ require('./tree/selector');
110
+ require('./tree/quoted');
111
+ require('./tree/expression');
112
+ require('./tree/rule');
113
+ require('./tree/call');
114
+ require('./tree/url');
115
+ require('./tree/alpha');
116
+ require('./tree/import');
117
+ require('./tree/mixin');
118
+ require('./tree/comment');
119
+ require('./tree/anonymous');
120
+ require('./tree/value');
121
+ require('./tree/javascript');
122
+ require('./tree/assignment');
123
+ require('./tree/condition');
124
+ require('./tree/paren');
125
+ require('./tree/media');
126
+ require('./tree/unicode-descriptor');
127
+ require('./tree/negative');
128
+ require('./tree/extend');
129
+ require('./tree/ruleset-call');
130
+
131
+
132
+ var isUrlRe = /^(?:https?:)?\/\//i;
133
+
134
+ less.Parser.fileLoader = function (file, currentFileInfo, callback, env) {
135
+ var pathname, dirname, data,
136
+ newFileInfo = {
137
+ relativeUrls: env.relativeUrls,
138
+ entryPath: currentFileInfo.entryPath,
139
+ rootpath: currentFileInfo.rootpath,
140
+ rootFilename: currentFileInfo.rootFilename
141
+ };
142
+
143
+ function handleDataAndCallCallback(data) {
144
+ var j = file.lastIndexOf('/');
145
+
146
+ // Pass on an updated rootpath if path of imported file is relative and file
147
+ // is in a (sub|sup) directory
148
+ //
149
+ // Examples:
150
+ // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',
151
+ // then rootpath should become 'less/module/nav/'
152
+ // - If path of imported file is '../mixins.less' and rootpath is 'less/',
153
+ // then rootpath should become 'less/../'
154
+ if(newFileInfo.relativeUrls && !/^(?:[a-z-]+:|\/)/.test(file) && j != -1) {
155
+ var relativeSubDirectory = file.slice(0, j+1);
156
+ newFileInfo.rootpath = newFileInfo.rootpath + relativeSubDirectory; // append (sub|sup) directory path of imported file
105
157
  }
106
- }
158
+ newFileInfo.currentDirectory = pathname.replace(/[^\\\/]*$/, "");
159
+ newFileInfo.filename = pathname;
107
160
 
108
- if (pathname) {
109
- fs.readFile(pathname, 'utf-8', function(e, data) {
110
- if (e) return callback(e);
161
+ callback(null, data, pathname, newFileInfo);
162
+ }
163
+
164
+ var isUrl = isUrlRe.test( file );
165
+ if (isUrl || isUrlRe.test(currentFileInfo.currentDirectory)) {
166
+ if (request === undefined) {
167
+ try { request = require('request'); }
168
+ catch(e) { request = null; }
169
+ }
170
+ if (!request) {
171
+ callback({ type: 'File', message: "optional dependency 'request' required to import over http(s)\n" });
172
+ return;
173
+ }
111
174
 
112
- new(less.Parser)({
113
- paths: [path.dirname(pathname)].concat(paths),
114
- filename: pathname
115
- }).parse(data, function (e, root) {
116
- callback(e, root, data);
117
- });
175
+ var urlStr = isUrl ? file : url.resolve(currentFileInfo.currentDirectory, file),
176
+ urlObj = url.parse(urlStr);
177
+
178
+ request.get({uri: urlStr, strictSSL: !env.insecure }, function (error, res, body) {
179
+ if (res.statusCode === 404) {
180
+ callback({ type: 'File', message: "resource '" + urlStr + "' was not found\n" });
181
+ return;
182
+ }
183
+ if (!body) {
184
+ console.error( 'Warning: Empty body (HTTP '+ res.statusCode + ') returned by "' + urlStr +'"' );
185
+ }
186
+ if (error) {
187
+ callback({ type: 'File', message: "resource '" + urlStr + "' gave this Error:\n "+ error +"\n" });
188
+ }
189
+ pathname = urlStr;
190
+ dirname = urlObj.protocol +'//'+ urlObj.host + urlObj.pathname.replace(/[^\/]*$/, '');
191
+ handleDataAndCallCallback(body);
118
192
  });
119
193
  } else {
120
- if (typeof(env.errback) === "function") {
121
- env.errback(file, paths, callback);
194
+
195
+ var paths = [currentFileInfo.currentDirectory].concat(env.paths);
196
+ paths.push('.');
197
+
198
+ if (env.syncImport) {
199
+ for (var i = 0; i < paths.length; i++) {
200
+ try {
201
+ pathname = path.join(paths[i], file);
202
+ fs.statSync(pathname);
203
+ break;
204
+ } catch (e) {
205
+ pathname = null;
206
+ }
207
+ }
208
+
209
+ if (!pathname) {
210
+ callback({ type: 'File', message: "'" + file + "' wasn't found" });
211
+ return;
212
+ }
213
+
214
+ try {
215
+ data = fs.readFileSync(pathname, 'utf-8');
216
+ handleDataAndCallCallback(data);
217
+ } catch (e) {
218
+ callback(e);
219
+ }
122
220
  } else {
123
- callback({ type: 'File', message: "'" + file + "' wasn't found.\n" });
221
+ (function tryPathIndex(i) {
222
+ if (i < paths.length) {
223
+ pathname = path.join(paths[i], file);
224
+ fs.stat(pathname, function (err) {
225
+ if (err) {
226
+ tryPathIndex(i + 1);
227
+ } else {
228
+ fs.readFile(pathname, 'utf-8', function(e, data) {
229
+ if (e) { callback(e); }
230
+ handleDataAndCallCallback(data);
231
+ });
232
+ }
233
+ });
234
+ } else {
235
+ callback({ type: 'File', message: "'" + file + "' wasn't found" });
236
+ }
237
+ }(0));
124
238
  }
125
239
  }
126
- }
240
+ };
127
241
 
242
+ require('./env');
128
243
  require('./functions');
129
244
  require('./colors');
130
-
131
- for (var k in less) { exports[k] = less[k] }
132
-
133
- // Stylize a string
134
- function stylize(str, style) {
135
- var styles = {
136
- 'bold' : [1, 22],
137
- 'inverse' : [7, 27],
138
- 'underline' : [4, 24],
139
- 'yellow' : [33, 39],
140
- 'green' : [32, 39],
141
- 'red' : [31, 39],
142
- 'grey' : [90, 39]
143
- };
144
- return '\033[' + styles[style][0] + 'm' + str +
145
- '\033[' + styles[style][1] + 'm';
146
- }
147
- less.stylize = stylize;
148
-
245
+ require('./visitor.js');
246
+ require('./import-visitor.js');
247
+ require('./extend-visitor.js');
248
+ require('./join-selector-visitor.js');
249
+ require('./to-css-visitor.js');
250
+ require('./source-map-output.js');
251
+
252
+ for (var k in less) { if (less.hasOwnProperty(k)) { exports[k] = less[k]; }}
@@ -0,0 +1,44 @@
1
+ (function (tree) {
2
+ tree.joinSelectorVisitor = function() {
3
+ this.contexts = [[]];
4
+ this._visitor = new tree.visitor(this);
5
+ };
6
+
7
+ tree.joinSelectorVisitor.prototype = {
8
+ run: function (root) {
9
+ return this._visitor.visit(root);
10
+ },
11
+ visitRule: function (ruleNode, visitArgs) {
12
+ visitArgs.visitDeeper = false;
13
+ },
14
+ visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {
15
+ visitArgs.visitDeeper = false;
16
+ },
17
+
18
+ visitRuleset: function (rulesetNode, visitArgs) {
19
+ var context = this.contexts[this.contexts.length - 1],
20
+ paths = [], selectors;
21
+
22
+ this.contexts.push(paths);
23
+
24
+ if (! rulesetNode.root) {
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; }
32
+ rulesetNode.paths = paths;
33
+ }
34
+ },
35
+ visitRulesetOut: function (rulesetNode) {
36
+ this.contexts.length = this.contexts.length - 1;
37
+ },
38
+ visitMedia: function (mediaNode, visitArgs) {
39
+ var context = this.contexts[this.contexts.length - 1];
40
+ mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);
41
+ }
42
+ };
43
+
44
+ })(require('./tree'));
@@ -0,0 +1,82 @@
1
+ // lessc_helper.js
2
+ //
3
+ // helper functions for lessc
4
+ var lessc_helper = {
5
+
6
+ //Stylize a string
7
+ stylize : function(str, style) {
8
+ var styles = {
9
+ 'reset' : [0, 0],
10
+ 'bold' : [1, 22],
11
+ 'inverse' : [7, 27],
12
+ 'underline' : [4, 24],
13
+ 'yellow' : [33, 39],
14
+ 'green' : [32, 39],
15
+ 'red' : [31, 39],
16
+ 'grey' : [90, 39]
17
+ };
18
+ return '\033[' + styles[style][0] + 'm' + str +
19
+ '\033[' + styles[style][1] + 'm';
20
+ },
21
+
22
+ //Print command line options
23
+ printUsage: function() {
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/>");
78
+ }
79
+ };
80
+
81
+ // Exports helper functions
82
+ for (var h in lessc_helper) { if (lessc_helper.hasOwnProperty(h)) { exports[h] = lessc_helper[h]; }}