less 2.1.1 → 2.3.1

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 (333) hide show
  1. package/.idea/inspectionProfiles/Project_Default.xml +1 -0
  2. package/.idea/jsLinters/jscs.xml +4 -0
  3. package/.idea/jsLinters/jshint.xml +58 -4
  4. package/.idea/workspace.xml +451 -758
  5. package/.jscsrc +38 -0
  6. package/.jshintrc +0 -2
  7. package/.travis.yml +0 -1
  8. package/CHANGELOG.md +52 -0
  9. package/Gruntfile.js +37 -3
  10. package/bin/lessc +380 -316
  11. package/bower.json +1 -1
  12. package/dist/less.js +790 -479
  13. package/dist/less.min.js +7 -7
  14. package/lib/less/contexts.js +1 -1
  15. package/lib/less/data/unit-conversions.js +3 -3
  16. package/lib/less/environment/abstract-file-manager.js +4 -4
  17. package/lib/less/environment/environment.js +9 -0
  18. package/lib/less/functions/color-blending.js +3 -3
  19. package/lib/less/functions/color.js +8 -8
  20. package/lib/less/functions/data-uri.js +39 -31
  21. package/lib/less/functions/string.js +3 -1
  22. package/lib/less/functions/svg.js +12 -15
  23. package/lib/less/functions/types.js +15 -2
  24. package/lib/less/import-manager.js +10 -5
  25. package/lib/less/index.js +2 -1
  26. package/lib/less/parse-tree.js +8 -2
  27. package/lib/less/parse.js +65 -0
  28. package/lib/less/parser/parser-input.js +3 -2
  29. package/lib/less/parser/parser.js +24 -11
  30. package/lib/less/render.js +7 -36
  31. package/lib/less/source-map-output.js +3 -3
  32. package/lib/less/transform-tree.js +1 -1
  33. package/lib/less/tree/assignment.js +0 -1
  34. package/lib/less/tree/color.js +4 -4
  35. package/lib/less/tree/condition.js +1 -1
  36. package/lib/less/tree/debug-info.js +6 -2
  37. package/lib/less/tree/dimension.js +1 -1
  38. package/lib/less/tree/directive.js +25 -6
  39. package/lib/less/tree/expression.js +1 -1
  40. package/lib/less/tree/import.js +2 -2
  41. package/lib/less/tree/index.js +1 -0
  42. package/lib/less/tree/media.js +3 -2
  43. package/lib/less/tree/mixin-call.js +3 -4
  44. package/lib/less/tree/mixin-definition.js +4 -3
  45. package/lib/less/tree/quoted.js +1 -1
  46. package/lib/less/tree/rule.js +2 -3
  47. package/lib/less/tree/ruleset.js +263 -157
  48. package/lib/less/tree/selector.js +2 -1
  49. package/lib/less/tree/url.js +5 -2
  50. package/lib/less/tree/value.js +1 -1
  51. package/lib/less/tree/variable.js +1 -1
  52. package/lib/less/visitors/extend-visitor.js +60 -25
  53. package/lib/less/visitors/import-sequencer.js +20 -14
  54. package/lib/less/visitors/import-visitor.js +13 -10
  55. package/lib/less/visitors/to-css-visitor.js +37 -5
  56. package/lib/less-browser/add-default-options.js +5 -1
  57. package/lib/less-browser/bootstrap.js +10 -8
  58. package/lib/less-browser/cache.js +1 -1
  59. package/lib/less-browser/index.js +13 -12
  60. package/lib/less-browser/utils.js +9 -6
  61. package/lib/less-node/file-manager.js +51 -28
  62. package/lib/less-node/image-size.js +34 -0
  63. package/lib/less-node/index.js +3 -0
  64. package/lib/less-node/lessc-helper.js +3 -2
  65. package/lib/less-node/url-file-manager.js +2 -2
  66. package/lib/less-rhino/index.js +2 -4
  67. package/package.json +10 -7
  68. package/test/browser/common.js +13 -11
  69. package/test/browser/css/urls.css +6 -3
  70. package/test/browser/jasmine-jsreporter.js +2 -3
  71. package/test/browser/less/nested-gradient-with-svg-gradient/mixin-consumer.less +5 -0
  72. package/test/browser/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +15 -0
  73. package/test/browser/less/urls.less +1 -0
  74. package/test/browser/less.js +15 -9424
  75. package/test/browser/runner-errors-options.js +0 -1
  76. package/test/browser/runner-errors-spec.js +0 -1
  77. package/test/browser/runner-legacy-options.js +0 -1
  78. package/test/browser/runner-no-js-errors-spec.js +0 -1
  79. package/test/browser/runner-production-options.js +0 -1
  80. package/test/browser/runner-relative-urls-options.js +0 -1
  81. package/test/browser/runner-rootpath-options.js +0 -1
  82. package/test/browser/runner-rootpath-relative-options.js +0 -1
  83. package/test/browser/runner-strict-units-options.js +0 -1
  84. package/test/copy-bom.js +72 -0
  85. package/test/css/comments.css +1 -0
  86. package/test/css/css-3.css +2 -0
  87. package/test/css/functions.css +2 -0
  88. package/test/css/import-interpolation.css +6 -0
  89. package/test/css/import-reference.css +25 -0
  90. package/test/css/include-path/include-path.css +6 -0
  91. package/test/css/mixins-important.css +6 -0
  92. package/test/css/selectors.css +10 -1
  93. package/test/css/url-args/urls.css +3 -3
  94. package/test/css/urls.css +12 -4
  95. package/test/css/variables.css +7 -1
  96. package/test/data/image.svg +3 -0
  97. package/test/index.js +14 -10
  98. package/test/less/comments.less +1 -0
  99. package/test/less/css-3.less +3 -0
  100. package/test/less/css-guards.less +2 -1
  101. package/test/less/errors/detached-ruleset-2.txt +1 -1
  102. package/test/less/errors/import-missing.txt +1 -1
  103. package/test/less/errors/parens-error-1.txt +1 -1
  104. package/test/less/errors/parens-error-2.txt +1 -1
  105. package/test/less/errors/parens-error-3.txt +1 -1
  106. package/test/less/errors/single-character.less +1 -0
  107. package/test/less/errors/single-character.txt +2 -0
  108. package/test/less/functions.less +5 -0
  109. package/test/less/import/import-interpolation.less +1 -0
  110. package/test/less/import/import-reference.less +38 -0
  111. package/test/less/import-reference.less +3 -1
  112. package/test/less/import.less +2 -0
  113. package/test/less/include-path/include-path.less +6 -0
  114. package/test/less/mixins-important.less +12 -0
  115. package/test/less/nested-gradient-with-svg-gradient/mixin-consumer.less +5 -0
  116. package/test/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +15 -0
  117. package/test/less/selectors.less +19 -4
  118. package/test/less/urls.less +10 -1
  119. package/test/less/variables.less +17 -3
  120. package/test/less-bom/charsets.less +3 -0
  121. package/test/less-bom/colors.less +98 -0
  122. package/test/less-bom/comments.less +102 -0
  123. package/test/less-bom/comments2.less +20 -0
  124. package/test/less-bom/compression/compression.less +36 -0
  125. package/test/less-bom/css-3.less +154 -0
  126. package/test/less-bom/css-escapes.less +33 -0
  127. package/test/less-bom/css-guards.less +103 -0
  128. package/test/less-bom/css.less +108 -0
  129. package/test/less-bom/debug/import/test.less +25 -0
  130. package/test/less-bom/debug/linenumbers.less +33 -0
  131. package/test/less-bom/detached-rulesets.less +103 -0
  132. package/test/less-bom/empty.less +1 -0
  133. package/test/less-bom/errors/add-mixed-units.less +3 -0
  134. package/test/less-bom/errors/add-mixed-units.txt +4 -0
  135. package/test/less-bom/errors/add-mixed-units2.less +3 -0
  136. package/test/less-bom/errors/add-mixed-units2.txt +4 -0
  137. package/test/less-bom/errors/at-rules-undefined-var.less +4 -0
  138. package/test/less-bom/errors/at-rules-undefined-var.txt +4 -0
  139. package/test/less-bom/errors/bad-variable-declaration1.less +1 -0
  140. package/test/less-bom/errors/bad-variable-declaration1.txt +2 -0
  141. package/test/less-bom/errors/color-func-invalid-color.less +3 -0
  142. package/test/less-bom/errors/color-func-invalid-color.txt +4 -0
  143. package/test/less-bom/errors/color-invalid-hex-code.less +3 -0
  144. package/test/less-bom/errors/color-invalid-hex-code.txt +4 -0
  145. package/test/less-bom/errors/color-invalid-hex-code2.less +3 -0
  146. package/test/less-bom/errors/color-invalid-hex-code2.txt +4 -0
  147. package/test/less-bom/errors/css-guard-default-func.less +4 -0
  148. package/test/less-bom/errors/css-guard-default-func.txt +4 -0
  149. package/test/less-bom/errors/detached-ruleset-1.less +6 -0
  150. package/test/less-bom/errors/detached-ruleset-1.txt +4 -0
  151. package/test/less-bom/errors/detached-ruleset-2.less +6 -0
  152. package/test/less-bom/errors/detached-ruleset-2.txt +4 -0
  153. package/test/less-bom/errors/detached-ruleset-3.less +4 -0
  154. package/test/less-bom/errors/detached-ruleset-3.txt +4 -0
  155. package/test/less-bom/errors/detached-ruleset-4.less +5 -0
  156. package/test/less-bom/errors/detached-ruleset-4.txt +4 -0
  157. package/test/less-bom/errors/detached-ruleset-5.less +4 -0
  158. package/test/less-bom/errors/detached-ruleset-5.txt +3 -0
  159. package/test/less-bom/errors/detached-ruleset-6.less +5 -0
  160. package/test/less-bom/errors/detached-ruleset-6.txt +4 -0
  161. package/test/less-bom/errors/divide-mixed-units.less +3 -0
  162. package/test/less-bom/errors/divide-mixed-units.txt +4 -0
  163. package/test/less-bom/errors/extend-no-selector.less +3 -0
  164. package/test/less-bom/errors/extend-no-selector.txt +3 -0
  165. package/test/less-bom/errors/extend-not-at-end.less +3 -0
  166. package/test/less-bom/errors/extend-not-at-end.txt +3 -0
  167. package/test/less-bom/errors/import-malformed.less +1 -0
  168. package/test/less-bom/errors/import-malformed.txt +3 -0
  169. package/test/less-bom/errors/import-missing.less +6 -0
  170. package/test/less-bom/errors/import-missing.txt +3 -0
  171. package/test/less-bom/errors/import-no-semi.less +1 -0
  172. package/test/less-bom/errors/import-no-semi.txt +2 -0
  173. package/test/less-bom/errors/import-subfolder1.less +1 -0
  174. package/test/less-bom/errors/import-subfolder1.txt +3 -0
  175. package/test/less-bom/errors/import-subfolder2.less +1 -0
  176. package/test/less-bom/errors/import-subfolder2.txt +4 -0
  177. package/test/less-bom/errors/imports/import-subfolder1.less +1 -0
  178. package/test/less-bom/errors/imports/import-subfolder2.less +1 -0
  179. package/test/less-bom/errors/imports/import-test.less +4 -0
  180. package/test/less-bom/errors/imports/subfolder/mixin-not-defined.less +1 -0
  181. package/test/less-bom/errors/imports/subfolder/parse-error-curly-bracket.less +1 -0
  182. package/test/less-bom/errors/javascript-error.less +3 -0
  183. package/test/less-bom/errors/javascript-error.txt +4 -0
  184. package/test/less-bom/errors/javascript-undefined-var.less +3 -0
  185. package/test/less-bom/errors/javascript-undefined-var.txt +4 -0
  186. package/test/less-bom/errors/mixed-mixin-definition-args-1.less +6 -0
  187. package/test/less-bom/errors/mixed-mixin-definition-args-1.txt +4 -0
  188. package/test/less-bom/errors/mixed-mixin-definition-args-2.less +6 -0
  189. package/test/less-bom/errors/mixed-mixin-definition-args-2.txt +4 -0
  190. package/test/less-bom/errors/mixin-not-defined.less +11 -0
  191. package/test/less-bom/errors/mixin-not-defined.txt +3 -0
  192. package/test/less-bom/errors/mixin-not-matched.less +6 -0
  193. package/test/less-bom/errors/mixin-not-matched.txt +3 -0
  194. package/test/less-bom/errors/mixin-not-matched2.less +6 -0
  195. package/test/less-bom/errors/mixin-not-matched2.txt +3 -0
  196. package/test/less-bom/errors/mixin-not-visible-in-scope-1.less +9 -0
  197. package/test/less-bom/errors/mixin-not-visible-in-scope-1.txt +4 -0
  198. package/test/less-bom/errors/mixins-guards-default-func-1.less +9 -0
  199. package/test/less-bom/errors/mixins-guards-default-func-1.txt +4 -0
  200. package/test/less-bom/errors/mixins-guards-default-func-2.less +9 -0
  201. package/test/less-bom/errors/mixins-guards-default-func-2.txt +4 -0
  202. package/test/less-bom/errors/mixins-guards-default-func-3.less +9 -0
  203. package/test/less-bom/errors/mixins-guards-default-func-3.txt +4 -0
  204. package/test/less-bom/errors/multiple-guards-on-css-selectors.less +4 -0
  205. package/test/less-bom/errors/multiple-guards-on-css-selectors.txt +4 -0
  206. package/test/less-bom/errors/multiple-guards-on-css-selectors2.less +4 -0
  207. package/test/less-bom/errors/multiple-guards-on-css-selectors2.txt +4 -0
  208. package/test/less-bom/errors/multiply-mixed-units.less +7 -0
  209. package/test/less-bom/errors/multiply-mixed-units.txt +4 -0
  210. package/test/less-bom/errors/parens-error-1.less +3 -0
  211. package/test/less-bom/errors/parens-error-1.txt +4 -0
  212. package/test/less-bom/errors/parens-error-2.less +3 -0
  213. package/test/less-bom/errors/parens-error-2.txt +4 -0
  214. package/test/less-bom/errors/parens-error-3.less +3 -0
  215. package/test/less-bom/errors/parens-error-3.txt +4 -0
  216. package/test/less-bom/errors/parse-error-curly-bracket.less +4 -0
  217. package/test/less-bom/errors/parse-error-curly-bracket.txt +4 -0
  218. package/test/less-bom/errors/parse-error-extra-parens.less +5 -0
  219. package/test/less-bom/errors/parse-error-extra-parens.txt +3 -0
  220. package/test/less-bom/errors/parse-error-missing-bracket.less +2 -0
  221. package/test/less-bom/errors/parse-error-missing-bracket.txt +3 -0
  222. package/test/less-bom/errors/parse-error-missing-parens.less +5 -0
  223. package/test/less-bom/errors/parse-error-missing-parens.txt +3 -0
  224. package/test/less-bom/errors/parse-error-with-import.less +13 -0
  225. package/test/less-bom/errors/parse-error-with-import.txt +4 -0
  226. package/test/less-bom/errors/percentage-missing-space.less +3 -0
  227. package/test/less-bom/errors/percentage-missing-space.txt +4 -0
  228. package/test/less-bom/errors/property-asterisk-only-name.less +3 -0
  229. package/test/less-bom/errors/property-asterisk-only-name.txt +4 -0
  230. package/test/less-bom/errors/property-ie5-hack.less +3 -0
  231. package/test/less-bom/errors/property-ie5-hack.txt +3 -0
  232. package/test/less-bom/errors/property-in-root.less +4 -0
  233. package/test/less-bom/errors/property-in-root.txt +4 -0
  234. package/test/less-bom/errors/property-in-root2.less +1 -0
  235. package/test/less-bom/errors/property-in-root2.txt +4 -0
  236. package/test/less-bom/errors/property-in-root3.less +4 -0
  237. package/test/less-bom/errors/property-in-root3.txt +3 -0
  238. package/test/less-bom/errors/property-interp-not-defined.less +1 -0
  239. package/test/less-bom/errors/property-interp-not-defined.txt +2 -0
  240. package/test/less-bom/errors/recursive-variable.less +1 -0
  241. package/test/less-bom/errors/recursive-variable.txt +2 -0
  242. package/test/less-bom/errors/single-character.less +1 -0
  243. package/test/less-bom/errors/single-character.txt +2 -0
  244. package/test/less-bom/errors/svg-gradient1.less +3 -0
  245. package/test/less-bom/errors/svg-gradient1.txt +4 -0
  246. package/test/less-bom/errors/svg-gradient2.less +3 -0
  247. package/test/less-bom/errors/svg-gradient2.txt +4 -0
  248. package/test/less-bom/errors/svg-gradient3.less +3 -0
  249. package/test/less-bom/errors/svg-gradient3.txt +4 -0
  250. package/test/less-bom/errors/unit-function.less +3 -0
  251. package/test/less-bom/errors/unit-function.txt +4 -0
  252. package/test/less-bom/extend-chaining.less +91 -0
  253. package/test/less-bom/extend-clearfix.less +19 -0
  254. package/test/less-bom/extend-exact.less +46 -0
  255. package/test/less-bom/extend-media.less +24 -0
  256. package/test/less-bom/extend-nest.less +65 -0
  257. package/test/less-bom/extend-selector.less +99 -0
  258. package/test/less-bom/extend.less +81 -0
  259. package/test/less-bom/extract-and-length.less +133 -0
  260. package/test/less-bom/functions.less +201 -0
  261. package/test/less-bom/globalVars/extended.json +5 -0
  262. package/test/less-bom/globalVars/extended.less +10 -0
  263. package/test/less-bom/globalVars/simple.json +3 -0
  264. package/test/less-bom/globalVars/simple.less +3 -0
  265. package/test/less-bom/ie-filters.less +15 -0
  266. package/test/less-bom/import/deeper/deeper-2/url-import-2.less +3 -0
  267. package/test/less-bom/import/deeper/deeper-2/url-import.less +1 -0
  268. package/test/less-bom/import/deeper/import-once-test-a.less +1 -0
  269. package/test/less-bom/import/deeper/url-import.less +1 -0
  270. package/test/less-bom/import/import-and-relative-paths-test.less +17 -0
  271. package/test/less-bom/import/import-charset-test.less +1 -0
  272. package/test/less-bom/import/import-interpolation.less +2 -0
  273. package/test/less-bom/import/import-interpolation2.less +5 -0
  274. package/test/less-bom/import/import-once-test-c.less +6 -0
  275. package/test/less-bom/import/import-reference.less +89 -0
  276. package/test/less-bom/import/import-test-a.less +4 -0
  277. package/test/less-bom/import/import-test-b.less +8 -0
  278. package/test/less-bom/import/import-test-c.less +6 -0
  279. package/test/less-bom/import/import-test-d.css +1 -0
  280. package/test/less-bom/import/import-test-e.less +2 -0
  281. package/test/less-bom/import/import-test-f.less +5 -0
  282. package/test/less-bom/import/imports/font.less +8 -0
  283. package/test/less-bom/import/imports/logo.less +5 -0
  284. package/test/less-bom/import/interpolation-vars.less +6 -0
  285. package/test/less-bom/import/invalid-css.less +1 -0
  286. package/test/less-bom/import/urls.less +1 -0
  287. package/test/less-bom/import-inline.less +3 -0
  288. package/test/less-bom/import-interpolation.less +8 -0
  289. package/test/less-bom/import-once.less +6 -0
  290. package/test/less-bom/import-reference.less +23 -0
  291. package/test/less-bom/import.less +30 -0
  292. package/test/less-bom/include-path/include-path.less +6 -0
  293. package/test/less-bom/javascript.less +38 -0
  294. package/test/less-bom/lazy-eval.less +6 -0
  295. package/test/less-bom/legacy/legacy.less +7 -0
  296. package/test/less-bom/media.less +234 -0
  297. package/test/less-bom/merge.less +78 -0
  298. package/test/less-bom/mixins-args.less +215 -0
  299. package/test/less-bom/mixins-closure.less +26 -0
  300. package/test/less-bom/mixins-guards-default-func.less +195 -0
  301. package/test/less-bom/mixins-guards.less +271 -0
  302. package/test/less-bom/mixins-important.less +37 -0
  303. package/test/less-bom/mixins-interpolated.less +75 -0
  304. package/test/less-bom/mixins-named-args.less +36 -0
  305. package/test/less-bom/mixins-nested.less +22 -0
  306. package/test/less-bom/mixins-pattern.less +102 -0
  307. package/test/less-bom/mixins.less +145 -0
  308. package/test/less-bom/modifyVars/extended.json +5 -0
  309. package/test/less-bom/modifyVars/extended.less +11 -0
  310. package/test/less-bom/nested-gradient-with-svg-gradient/mixin-consumer.less +5 -0
  311. package/test/less-bom/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +15 -0
  312. package/test/less-bom/no-js-errors/no-js-errors.less +3 -0
  313. package/test/less-bom/no-js-errors/no-js-errors.txt +4 -0
  314. package/test/less-bom/no-output.less +2 -0
  315. package/test/less-bom/operations.less +62 -0
  316. package/test/less-bom/parens.less +45 -0
  317. package/test/less-bom/property-name-interp.less +56 -0
  318. package/test/less-bom/rulesets.less +30 -0
  319. package/test/less-bom/scope.less +104 -0
  320. package/test/less-bom/selectors.less +174 -0
  321. package/test/less-bom/sourcemaps/basic.json +3 -0
  322. package/test/less-bom/sourcemaps/basic.less +27 -0
  323. package/test/less-bom/sourcemaps/imported.css +7 -0
  324. package/test/less-bom/static-urls/urls.less +33 -0
  325. package/test/less-bom/strict-units/strict-units.less +4 -0
  326. package/test/less-bom/strings.less +73 -0
  327. package/test/less-bom/url-args/urls.less +63 -0
  328. package/test/less-bom/urls.less +94 -0
  329. package/test/less-bom/variables-in-at-rules.less +20 -0
  330. package/test/less-bom/variables.less +119 -0
  331. package/test/less-bom/whitespace.less +44 -0
  332. package/test/less-test.js +127 -28
  333. package/test/modify-vars.js +6 -4
@@ -1,12 +1,7 @@
1
- var PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise,
2
- contexts = require("./contexts"),
3
- Parser = require('./parser/parser'),
4
- PluginManager = require('./plugin-manager');
1
+ var PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise;
5
2
 
6
3
  module.exports = function(environment, ParseTree, ImportManager) {
7
4
  var render = function (input, options, callback) {
8
- options = options || {};
9
-
10
5
  if (typeof(options) === 'function') {
11
6
  callback = options;
12
7
  options = {};
@@ -24,44 +19,20 @@ module.exports = function(environment, ParseTree, ImportManager) {
24
19
  });
25
20
  });
26
21
  } else {
27
- var context,
28
- rootFileInfo,
29
- pluginManager = new PluginManager(this);
30
-
31
- pluginManager.addPlugins(options.plugins);
32
- options.pluginManager = pluginManager;
33
-
34
- context = new contexts.Parse(options);
35
-
36
- if (options.rootFileInfo) {
37
- rootFileInfo = options.rootFileInfo;
38
- } else {
39
- var filename = options.filename || "input";
40
- var entryPath = filename.replace(/[^\/\\]*$/, "");
41
- rootFileInfo = {
42
- filename: filename,
43
- relativeUrls: context.relativeUrls,
44
- rootpath: context.rootpath || "",
45
- currentDirectory: entryPath,
46
- entryPath: entryPath,
47
- rootFilename: filename
48
- };
49
- }
22
+ this.parse(input, options, function(err, root, imports, options) {
23
+ if (err) { return callback(err); }
50
24
 
51
- var imports = new ImportManager(context, rootFileInfo);
52
-
53
- new Parser(context, imports, rootFileInfo)
54
- .parse(input, function (e, root) {
55
- if (e) { return callback(e); }
56
25
  var result;
57
26
  try {
58
27
  var parseTree = new ParseTree(root, imports);
59
28
  result = parseTree.toCSS(options);
60
29
  }
61
- catch (err) { return callback( err); }
30
+ catch (err) { return callback(err); }
31
+
62
32
  callback(null, result);
63
- }, options);
33
+ });
64
34
  }
65
35
  };
36
+
66
37
  return render;
67
38
  };
@@ -15,7 +15,7 @@ module.exports = function (environment) {
15
15
  }
16
16
  if (options.sourceMapRootpath) {
17
17
  this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\/g, '/');
18
- if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length-1) !== '/') {
18
+ if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {
19
19
  this._sourceMapRootpath += '/';
20
20
  }
21
21
  } else {
@@ -66,11 +66,11 @@ module.exports = function (environment) {
66
66
  }
67
67
  inputSource = inputSource.substring(0, index);
68
68
  sourceLines = inputSource.split("\n");
69
- sourceColumns = sourceLines[sourceLines.length-1];
69
+ sourceColumns = sourceLines[sourceLines.length - 1];
70
70
  }
71
71
 
72
72
  lines = chunk.split("\n");
73
- columns = lines[lines.length-1];
73
+ columns = lines[lines.length - 1];
74
74
 
75
75
  if (fileInfo) {
76
76
  if (!mapLines) {
@@ -45,7 +45,7 @@ module.exports = function(root, options) {
45
45
 
46
46
  if (options.pluginManager) {
47
47
  var pluginVisitors = options.pluginManager.getVisitors();
48
- for(i =0; i < pluginVisitors.length; i++) {
48
+ for(i = 0; i < pluginVisitors.length; i++) {
49
49
  var pluginVisitor = pluginVisitors[i];
50
50
  if (pluginVisitor.isPreEvalVisitor) {
51
51
  preEvalVisitors.push(pluginVisitor);
@@ -25,4 +25,3 @@ Assignment.prototype.genCSS = function (context, output) {
25
25
  }
26
26
  };
27
27
  module.exports = Assignment;
28
-
@@ -56,11 +56,11 @@ Color.prototype.genCSS = function (context, output) {
56
56
  Color.prototype.toCSS = function (context, doNotCompress) {
57
57
  var compress = context && context.compress && !doNotCompress, color, alpha;
58
58
 
59
- // `keyword` is set if this color was originally
59
+ // `value` is set if this color was originally
60
60
  // converted from a named color string so we need
61
61
  // to respect this and try to output named color too.
62
- if (this.keyword) {
63
- return this.keyword;
62
+ if (this.value) {
63
+ return this.value;
64
64
  }
65
65
 
66
66
  // If we have some transparency, the only way to represent it
@@ -179,7 +179,7 @@ Color.fromKeyword = function(keyword) {
179
179
  }
180
180
 
181
181
  if (c) {
182
- c.keyword = keyword;
182
+ c.value = keyword;
183
183
  return c;
184
184
  }
185
185
  };
@@ -26,7 +26,7 @@ Condition.prototype.eval = function (context) {
26
26
  default: return false;
27
27
  }
28
28
  }
29
- }) (this.op, this.lvalue.eval(context), this.rvalue.eval(context));
29
+ })(this.op, this.lvalue.eval(context), this.rvalue.eval(context));
30
30
 
31
31
  return this.negate ? !result : result;
32
32
  };
@@ -1,5 +1,5 @@
1
1
  var debugInfo = function(context, ctx, lineSeparator) {
2
- var result="";
2
+ var result = "";
3
3
  if (context.dumpLineNumbers && !context.compress) {
4
4
  switch(context.dumpLineNumbers) {
5
5
  case 'comments':
@@ -21,8 +21,12 @@ debugInfo.asComment = function(ctx) {
21
21
  };
22
22
 
23
23
  debugInfo.asMediaQuery = function(ctx) {
24
+ var filenameWithProtocol = ctx.debugInfo.fileName;
25
+ if (!/^[a-z]+:\/\//i.test(filenameWithProtocol)) {
26
+ filenameWithProtocol = 'file://' + filenameWithProtocol;
27
+ }
24
28
  return '@media -sass-debug-info{filename{font-family:' +
25
- ('file://' + ctx.debugInfo.fileName).replace(/([.:\/\\])/g, function (a) {
29
+ filenameWithProtocol.replace(/([.:\/\\])/g, function (a) {
26
30
  if (a == '\\') {
27
31
  a = '\/';
28
32
  }
@@ -25,7 +25,7 @@ Dimension.prototype.toColor = function () {
25
25
  };
26
26
  Dimension.prototype.genCSS = function (context, output) {
27
27
  if ((context && context.strictUnits) && !this.unit.isSingular()) {
28
- throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: "+this.unit.toString());
28
+ throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: " + this.unit.toString());
29
29
  }
30
30
 
31
31
  var value = this.fround(context, this.value),
@@ -1,7 +1,7 @@
1
1
  var Node = require("./node"),
2
2
  Ruleset = require("./ruleset");
3
3
 
4
- var Directive = function (name, value, rules, index, currentFileInfo, debugInfo) {
4
+ var Directive = function (name, value, rules, index, currentFileInfo, debugInfo, isReferenced) {
5
5
  this.name = name;
6
6
  this.value = value;
7
7
  if (rules) {
@@ -11,6 +11,7 @@ var Directive = function (name, value, rules, index, currentFileInfo, debugInfo)
11
11
  this.index = index;
12
12
  this.currentFileInfo = currentFileInfo;
13
13
  this.debugInfo = debugInfo;
14
+ this.isReferenced = isReferenced;
14
15
  };
15
16
 
16
17
  Directive.prototype = new Node();
@@ -38,7 +39,10 @@ Directive.prototype.genCSS = function (context, output) {
38
39
  value.genCSS(context, output);
39
40
  }
40
41
  if (rules) {
41
- this.outputRuleset(context, output, [rules]);
42
+ if (rules.type === "Ruleset") {
43
+ rules = [rules];
44
+ }
45
+ this.outputRuleset(context, output, rules);
42
46
  } else {
43
47
  output.add(';');
44
48
  }
@@ -53,11 +57,23 @@ Directive.prototype.eval = function (context) {
53
57
  rules.root = true;
54
58
  }
55
59
  return new Directive(this.name, value, rules,
56
- this.index, this.currentFileInfo, this.debugInfo);
60
+ this.index, this.currentFileInfo, this.debugInfo, this.isReferenced);
61
+ };
62
+ Directive.prototype.variable = function (name) {
63
+ if (this.rules) {
64
+ return Ruleset.prototype.variable.call(this.rules, name);
65
+ }
66
+ };
67
+ Directive.prototype.find = function () {
68
+ if (this.rules) {
69
+ return Ruleset.prototype.find.apply(this.rules, arguments);
70
+ }
71
+ };
72
+ Directive.prototype.rulesets = function () {
73
+ if (this.rules) {
74
+ return Ruleset.prototype.rulesets.apply(this.rules);
75
+ }
57
76
  };
58
- Directive.prototype.variable = function (name) { if (this.rules) return Ruleset.prototype.variable.call(this.rules, name); };
59
- Directive.prototype.find = function () { if (this.rules) return Ruleset.prototype.find.apply(this.rules, arguments); };
60
- Directive.prototype.rulesets = function () { if (this.rules) return Ruleset.prototype.rulesets.apply(this.rules); };
61
77
  Directive.prototype.markReferenced = function () {
62
78
  var i, rules;
63
79
  this.isReferenced = true;
@@ -70,6 +86,9 @@ Directive.prototype.markReferenced = function () {
70
86
  }
71
87
  }
72
88
  };
89
+ Directive.prototype.getIsReferenced = function () {
90
+ return !this.currentFileInfo || !this.currentFileInfo.reference || this.isReferenced;
91
+ };
73
92
  Directive.prototype.outputRuleset = function (context, output, rules) {
74
93
  var ruleCnt = rules.length, i;
75
94
  context.tabLevel = (context.tabLevel | 0) + 1;
@@ -5,7 +5,7 @@ var Node = require("./node"),
5
5
  var Expression = function (value) {
6
6
  this.value = value;
7
7
  if (!value) {
8
- throw new Error("Expression requires a array parameter");
8
+ throw new Error("Expression requires an array parameter");
9
9
  }
10
10
  };
11
11
  Expression.prototype = new Node();
@@ -28,7 +28,7 @@ var Import = function (path, features, options, index, currentFileInfo) {
28
28
  this.css = !this.options.less || this.options.inline;
29
29
  } else {
30
30
  var pathValue = this.getPath();
31
- if (pathValue && /css([\?;].*)?$/.test(pathValue)) {
31
+ if (pathValue && /[#\.\&\?\/]css([\?;].*)?$/.test(pathValue)) {
32
32
  this.css = true;
33
33
  }
34
34
  }
@@ -100,7 +100,7 @@ Import.prototype.evalPath = function (context) {
100
100
  var pathValue = path.value;
101
101
  // Add the base path if the import is relative
102
102
  if (pathValue && context.isPathRelative(pathValue)) {
103
- path.value = rootpath +pathValue;
103
+ path.value = rootpath + pathValue;
104
104
  }
105
105
  }
106
106
  path.value = context.normalizePath(path.value);
@@ -1,5 +1,6 @@
1
1
  var tree = {};
2
2
 
3
+ tree.Node = require('./node');
3
4
  tree.Alpha = require('./alpha');
4
5
  tree.Color = require('./color');
5
6
  tree.Directive = require('./directive');
@@ -154,8 +154,9 @@ Media.prototype.permute = function (arr) {
154
154
  }
155
155
  };
156
156
  Media.prototype.bubbleSelectors = function (selectors) {
157
- if (!selectors)
158
- return;
157
+ if (!selectors) {
158
+ return;
159
+ }
159
160
  this.rules = [new Ruleset(selectors.slice(0), [this.rules[0]])];
160
161
  };
161
162
  module.exports = Media;
@@ -22,7 +22,7 @@ MixinCall.prototype.accept = function (visitor) {
22
22
  };
23
23
  MixinCall.prototype.eval = function (context) {
24
24
  var mixins, mixin, mixinPath, args, rules = [], match = false, i, m, f, isRecursive, isOneFound, rule,
25
- candidates = [], candidate, conditionResult = [], defaultResult, defFalseEitherCase=-1,
25
+ candidates = [], candidate, conditionResult = [], defaultResult, defFalseEitherCase = -1,
26
26
  defNone = 0, defTrue = 1, defFalse = 2, count, originalRuleset, noArgumentsFilter;
27
27
 
28
28
  function calcDefGroup(mixin, mixinPath) {
@@ -84,7 +84,7 @@ MixinCall.prototype.eval = function (context) {
84
84
  if (mixin.matchArgs(args, context)) {
85
85
  candidate = {mixin: mixin, group: calcDefGroup(mixin, mixinPath)};
86
86
 
87
- if (candidate.group!==defFalseEitherCase) {
87
+ if (candidate.group !== defFalseEitherCase) {
88
88
  candidates.push(candidate);
89
89
  }
90
90
 
@@ -105,8 +105,7 @@ MixinCall.prototype.eval = function (context) {
105
105
  defaultResult = defTrue;
106
106
  if ((count[defTrue] + count[defFalse]) > 1) {
107
107
  throw { type: 'Runtime',
108
- message: 'Ambiguous use of `default()` found when matching for `'
109
- + this.format(args) + '`',
108
+ message: 'Ambiguous use of `default()` found when matching for `' + this.format(args) + '`',
110
109
  index: this.index, filename: this.currentFileInfo.filename };
111
110
  }
112
111
  }
@@ -132,9 +132,10 @@ Definition.prototype.evalCall = function (context, args, important) {
132
132
  Definition.prototype.matchCondition = function (args, context) {
133
133
  if (this.condition && !this.condition.eval(
134
134
  new contexts.Eval(context,
135
- [this.evalParams(context, new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])] // the parameter variables
136
- .concat(this.frames) // the parent namespace/mixin frames
137
- .concat(context.frames)))) { // the current environment frames
135
+ [this.evalParams(context, /* the parameter variables*/
136
+ new contexts.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]
137
+ .concat(this.frames) // the parent namespace/mixin frames
138
+ .concat(context.frames)))) { // the current environment frames
138
139
  return false;
139
140
  }
140
141
  return true;
@@ -37,7 +37,7 @@ Quoted.prototype.eval = function (context) {
37
37
  do {
38
38
  value = evaluatedValue;
39
39
  evaluatedValue = value.replace(regexp, replacementFnc);
40
- } while (value!==evaluatedValue);
40
+ } while (value !== evaluatedValue);
41
41
  return evaluatedValue;
42
42
  }
43
43
  value = iterativeReplace(value, /`([^`]+)`/g, javascriptReplacement);
@@ -42,9 +42,8 @@ Rule.prototype.eval = function (context) {
42
42
  if (typeof name !== "string") {
43
43
  // expand 'primitive' name directly to get
44
44
  // things faster (~10% for benchmark.less):
45
- name = (name.length === 1)
46
- && (name[0] instanceof Keyword)
47
- ? name[0].value : evalName(context, name);
45
+ name = (name.length === 1) && (name[0] instanceof Keyword) ?
46
+ name[0].value : evalName(context, name);
48
47
  variable = false; // never treat expanded interpolation as new variable name
49
48
  }
50
49
  if (name === "font" && !context.strictMath) {