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
@@ -131,6 +131,7 @@ a {
131
131
  }
132
132
  }
133
133
  [prop],
134
+ [prop=10%],
134
135
  [prop="value@{num}"],
135
136
  [prop*="val@{num}"],
136
137
  [|prop~="val@{num}"],
@@ -140,4 +141,16 @@ a {
140
141
  [@{num}=@{num}],
141
142
  [@{num}] {
142
143
  attributes: yes;
144
+ }
145
+
146
+ /*
147
+ Large comment means chunk will be emitted after } which means chunk will begin with whitespace...
148
+ blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank
149
+ blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank
150
+ blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank
151
+ blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank
152
+ blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank
153
+ */
154
+ @{selector} {
155
+ color: red;
143
156
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "my-color": "red"
3
+ }
@@ -0,0 +1,27 @@
1
+ @var: black;
2
+
3
+ .a() {
4
+ color: red;
5
+ }
6
+
7
+ .b {
8
+ color: green;
9
+ .a();
10
+ color: blue;
11
+ background: @var;
12
+ }
13
+
14
+ .a, .b {
15
+ background: green;
16
+ .c, .d {
17
+ background: gray;
18
+ & + & {
19
+ color: red;
20
+ }
21
+ }
22
+ }
23
+
24
+ .extend:extend(.a all) {
25
+ color: pink;
26
+ }
27
+ @import (inline) "imported.css";
@@ -0,0 +1,7 @@
1
+ /*comments*/
2
+ .unused-css {
3
+ color: white;
4
+ }
5
+ .imported {
6
+ color: black;
7
+ }
@@ -49,3 +49,9 @@
49
49
  .mix-mul(black);
50
50
  .mix-mul(orange);
51
51
  }
52
+
53
+ @test: Arial, Verdana, San-Serif;
54
+ .watermark {
55
+ @family: ~"Univers, @{test}";
56
+ family: @family;
57
+ }
@@ -0,0 +1,63 @@
1
+ @font-face {
2
+ src: url("/fonts/garamond-pro.ttf");
3
+ src: local(Futura-Medium),
4
+ url(fonts.svg#MyGeometricModern) format("svg");
5
+ }
6
+ #shorthands {
7
+ background: url("http://www.lesscss.org/spec.html") no-repeat 0 4px;
8
+ background: url("img.jpg") center / 100px;
9
+ background: #fff url(image.png) center / 1px 100px repeat-x scroll content-box padding-box;
10
+ }
11
+ #misc {
12
+ background-image: url(images/image.jpg);
13
+ }
14
+ #data-uri {
15
+ background: url(data:image/png;charset=utf-8;base64,
16
+ kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/
17
+ k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U
18
+ kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);
19
+ background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);
20
+ background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700);
21
+ background-image: url("http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700");
22
+ }
23
+
24
+ #svg-data-uri {
25
+ background: transparent url('data:image/svg+xml, <svg version="1.1"><g></g></svg>');
26
+ }
27
+
28
+ .comma-delimited {
29
+ background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);
30
+ }
31
+ .values {
32
+ @a: 'Trebuchet';
33
+ url: url(@a);
34
+ }
35
+
36
+ @import "../import/imports/font";
37
+
38
+ #data-uri {
39
+ uri: data-uri('image/jpeg;base64', '../../data/image.jpg');
40
+ }
41
+
42
+ #data-uri-guess {
43
+ uri: data-uri('../../data/image.jpg');
44
+ }
45
+
46
+ #data-uri-ascii {
47
+ uri-1: data-uri('text/html', '../../data/page.html');
48
+ uri-2: data-uri('../../data/page.html');
49
+ }
50
+
51
+ #svg-functions {
52
+ background-image: svg-gradient(to bottom, black, white);
53
+ background-image: svg-gradient(to bottom, black, orange 3%, white);
54
+ @green_5: green 5%;
55
+ @orange_percentage: 3%;
56
+ @orange_color: orange;
57
+ background-image: svg-gradient(to bottom, (mix(black, white) + #444) 1%, @orange_color @orange_percentage, ((@green_5)), white 95%);
58
+ }
59
+
60
+ #data-uri-with-spaces {
61
+ background-image: url( data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);
62
+ background-image: url( ' data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==');
63
+ }
@@ -18,6 +18,7 @@
18
18
  kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);
19
19
  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);
20
20
  background-image: url(http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700);
21
+ background-image: url("http://fonts.googleapis.com/css?family=\"Rokkitt\":\(400\),700");
21
22
  }
22
23
 
23
24
  #svg-data-uri {
@@ -34,6 +35,11 @@
34
35
 
35
36
  @import "import/import-and-relative-paths-test";
36
37
 
38
+ #relative-url-import {
39
+ .unquoted-relative-path-bg;
40
+ .quoted-relative-path-border-image;
41
+ }
42
+
37
43
  #data-uri {
38
44
  uri: data-uri('image/jpeg;base64', '../data/image.jpg');
39
45
  }
@@ -55,3 +61,12 @@
55
61
  }
56
62
 
57
63
  .add_an_import("file.css");
64
+
65
+ #svg-functions {
66
+ background-image: svg-gradient(to bottom, black, white);
67
+ background-image: svg-gradient(to bottom, black, orange 3%, white);
68
+ @green_5: green 5%;
69
+ @orange_percentage: 3%;
70
+ @orange_color: orange;
71
+ background-image: svg-gradient(to bottom, (mix(black, white) + #444) 1%, @orange_color @orange_percentage, ((@green_5)), white 95%);
72
+ }
@@ -0,0 +1,15 @@
1
+ function initRhinoTest() {
2
+ process = { title: 'dummy' };
3
+
4
+ less.tree.functions.add = function (a, b) {
5
+ return new(less.tree.Dimension)(a.value + b.value);
6
+ };
7
+ less.tree.functions.increment = function (a) {
8
+ return new(less.tree.Dimension)(a.value + 1);
9
+ };
10
+ less.tree.functions._color = function (str) {
11
+ if (str.value === "evil red") { return new(less.tree.Color)("600"); }
12
+ };
13
+ }
14
+
15
+ initRhinoTest();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourcemaps/basic.css","sources":["testweb/sourcemaps/imported.css","testweb/sourcemaps/basic.less"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;ACAA;EACE,YAAA;EAJA,UAAA;EAWA,iBAAA;EALA,WAAA;EACA,mBAAA;;AAJF,EASE;AATF,EASM;EACF,gBAAA;;AACA,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFA;AAEF,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFA;EAGA,UAAA;;AALN;AAAI;AAUJ;EATE,iBAAA;;AADF,EAEE;AAFE,EAEF;AAFF,EAEM;AAFF,EAEE;AAQN,OARE;AAQF,OARM;EACF,gBAAA;;AACA,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFA;AAEF,EAFF,GAEI,KAFA;AAEF,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFA;AAEF,EAFF,GAEI,KAFA;AAEF,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFA;AAEF,EAFE,GAEA,KAFA;AAEF,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFA;AAEF,EAFE,GAEA,KAFA;AAQN,OARE,GAQF,UARE;AAQF,OARE,GAEI,KAFJ;AAQF,OARE,GAQF,UARM;AAQN,OARE,GAEI,KAFA;AAEF,EAFF,GAQF,UARE;AAEE,EAFF,GAQF,UARM;AAQN,OARM,GAQN,UARE;AAQF,OARM,GAEA,KAFJ;AAQF,OARM,GAQN,UARM;AAQN,OARM,GAEA,KAFA;AAEF,EAFE,GAQN,UARE;AAEE,EAFE,GAQN,UARM;EAGA,UAAA;;AAKN;EACE,WAAA"}
@@ -0,0 +1,17 @@
1
+ <html>
2
+ <link type="text/css" rel="stylesheet" media="all" href="import.css">
3
+ <link type="text/css" rel="stylesheet" media="all" href="basic.css">
4
+ <head>
5
+ </head>
6
+ <body>
7
+ <div id="import-test">id import-test</div>
8
+ <div id="import">id import-test</div>
9
+ <div class="imported inline">class imported inline</div>
10
+ <div id="mixin">class mixin</div>
11
+ <div class="a">class a</div>
12
+ <div class="b">class b</div>
13
+ <div class="b">class b<div class="c">class c</div></div>
14
+ <div class="a">class a<div class="d">class d</div></div>
15
+ <div class="extend">class extend<div class="c">class c</div></div>
16
+ </body>
17
+ </html>
@@ -6,14 +6,15 @@ require 'base64'
6
6
 
7
7
  module Less
8
8
  class Loader
9
-
9
+
10
10
  attr_reader :environment
11
-
11
+
12
12
  def initialize
13
13
  context_wrapper = Less::JavaScript.context_wrapper.instance
14
14
  @context = context_wrapper.unwrap
15
15
  @context['process'] = Process.new
16
16
  @context['console'] = Console.new
17
+ @context['Buffer'] = Buffer
17
18
  path = Pathname(__FILE__).dirname.join('js', 'lib')
18
19
  @environment = CommonJS::Environment.new(@context, :path => path.to_s)
19
20
  @environment.native('path', Path)
@@ -22,13 +23,13 @@ module Less
22
23
  @environment.native('url', Url)
23
24
  @environment.native('http', Http)
24
25
  end
25
-
26
+
26
27
  def require(module_id)
27
28
  @environment.require(module_id)
28
29
  end
29
-
30
+
30
31
  # JS exports (required by less.js) :
31
-
32
+
32
33
  class Process # :nodoc:
33
34
  def exit(*args)
34
35
  warn("JS process.exit(#{args.first}) called from: \n#{caller.join("\n")}")
@@ -44,9 +45,9 @@ module Less
44
45
  $stderr.puts msgs.join(', ')
45
46
  end
46
47
  end
47
-
48
+
48
49
  # stubbed JS modules (required by less.js) :
49
-
50
+
50
51
  module Path # :nodoc:
51
52
  def self.join(*components)
52
53
  # node.js expands path on join
@@ -60,31 +61,31 @@ module Less
60
61
  def self.basename(path)
61
62
  File.basename(path)
62
63
  end
63
-
64
+
64
65
  def self.extname(path)
65
66
  File.extname(path)
66
67
  end
67
-
68
+
68
69
  def self.resolve(path)
69
70
  File.basename(path)
70
71
  end
71
-
72
+
72
73
  end
73
-
74
+
74
75
  module Util # :nodoc:
75
-
76
+
76
77
  def self.error(*errors)
77
78
  raise errors.join(' ')
78
79
  end
79
-
80
+
80
81
  def self.puts(*args)
81
82
  args.each { |arg| STDOUT.puts(arg) }
82
83
  end
83
-
84
+
84
85
  end
85
86
 
86
87
  module FS # :nodoc:
87
-
88
+
88
89
  def self.statSync(path)
89
90
  File.stat(path)
90
91
  end
@@ -92,35 +93,42 @@ module Less
92
93
  def self.readFile(path, encoding, callback)
93
94
  callback.call(nil, File.read(path))
94
95
  end
95
-
96
- def self.readFileSync(path, encoding)
97
- Buffer.new(path)
96
+
97
+ def self.readFileSync(path, encoding = nil)
98
+ buf = Buffer.new(File.read(path), encoding)
99
+ encoding.nil? ? buf : buf.toString(encoding)
98
100
  end
99
101
 
100
- class Buffer
101
- attr_accessor :data
102
+ end
102
103
 
103
- def initialize(path)
104
- @data = File.read(path)
105
- end
104
+ class Buffer # :nodoc:
106
105
 
107
- def length
108
- @data.length
109
- end
106
+ attr_accessor :data
110
107
 
111
- def toString(*args)
112
- if args.last == "base64"
113
- Base64.strict_encode64(@data)
114
- else
115
- @data
116
- end
108
+ def initialize(data, encoding = nil)
109
+ unless data.is_a? String
110
+ data = data.to_ruby
117
111
  end
112
+ @data = data
113
+ end
114
+
115
+ def length
116
+ @data.length
118
117
  end
119
118
 
119
+ def toString(encoding = nil, begPos = 0, endPos = length)
120
+ data = @data[ begPos..endPos ]
121
+ if encoding == 'base64'
122
+ data = Base64.encode64(data)
123
+ data.delete!("\n"); data
124
+ else # encoding == 'binary'
125
+ data
126
+ end
127
+ end
120
128
  end
121
129
 
122
130
  module Url # :nodoc:
123
-
131
+
124
132
  def self.resolve(*args)
125
133
  URI.join(*args)
126
134
  end
@@ -137,11 +145,11 @@ module Less
137
145
  result['hash'] = '#' + u.fragment if u.fragment
138
146
  result
139
147
  end
140
-
148
+
141
149
  end
142
-
150
+
143
151
  module Http # :nodoc:
144
-
152
+
145
153
  def self.get(options, callback)
146
154
  err = nil
147
155
  begin
@@ -182,7 +190,7 @@ module Less
182
190
  end
183
191
  ret
184
192
  end
185
-
193
+
186
194
  class HttpGetResult
187
195
  attr_accessor :err
188
196
 
@@ -218,8 +226,8 @@ module Less
218
226
  end
219
227
  end
220
228
  end
221
-
229
+
222
230
  end
223
-
231
+
224
232
  end
225
- end
233
+ end
@@ -1,3 +1,3 @@
1
1
  module Less
2
- VERSION = '2.4.0'
2
+ VERSION = '2.5.0'
3
3
  end
@@ -20,7 +20,7 @@ describe Less::Parser do
20
20
  end
21
21
 
22
22
  it "throws a ParseError if the lesscss is bogus" do
23
- lambda { subject.parse('{^)') }.should raise_error(Less::ParseError, /missing closing `\}`/)
23
+ lambda { subject.parse('{^)') }.should raise_error(Less::ParseError, /missing opening `\(`/)
24
24
  end
25
25
 
26
26
  it "passes exceptions from the less compiler" do
@@ -29,13 +29,13 @@ describe Less::Parser do
29
29
 
30
30
  describe "when configured with source mapping" do
31
31
  subject { Less::Parser.new(:filename => 'one.less', :paths => [ cwd.join('one'), cwd.join('two') ], :dumpLineNumbers => 'mediaquery') }
32
-
32
+
33
33
  it "prints source maps" do
34
34
  subject.parse('@import "one.less"; @import "two.less";').to_css(:compress => false).gsub(/\n/,'').strip.should eql "@media -sass-debug-info{filename{font-family:file\\:\\/\\/one\\.less}line{font-family:\\000031}}.one { width: 1;}@media -sass-debug-info{filename{font-family:file\\:\\/\\/two\\.less}line{font-family:\\000031}}.two { width: 1;}"
35
35
  end
36
-
36
+
37
37
  end
38
-
38
+
39
39
  describe "when configured with multiple load paths" do
40
40
  subject { Less::Parser.new :paths => [ cwd.join('one'), cwd.join('two'), cwd.join('faulty') ] }
41
41
 
@@ -100,12 +100,12 @@ describe Less::Parser do
100
100
  expected = "@import \"some.css\";\nbody {\n background: url('assets/logo.png');\n}\n"
101
101
  expect( parser.parse('@import "some/some.less";').to_css ).to eql expected
102
102
  end
103
-
103
+
104
104
  end
105
-
105
+
106
106
  # NOTE: runs JS tests from less.js it's a replacement for less-test.js
107
107
  describe "less-test", :integration => true do
108
-
108
+
109
109
  TEST_LESS_DIR = File.expand_path('../../lib/less/js/test/less', File.dirname(__FILE__))
110
110
  TEST_CSS_DIR = File.expand_path('../../lib/less/js/test/css' , File.dirname(__FILE__))
111
111
 
@@ -130,19 +130,19 @@ describe Less::Parser do
130
130
  end
131
131
  end
132
132
  end
133
-
133
+
134
134
  after :all do
135
135
  Less.tree.functions[:add] = nil
136
136
  Less.tree.functions[:increment] = nil
137
137
  Less.tree.functions[:_color] = nil
138
138
  end
139
-
139
+
140
140
  Dir.glob(File.join(TEST_LESS_DIR, '*.less')).each do |less_file|
141
-
141
+
142
142
  base_name = File.basename(less_file, '.less')
143
143
  css_file = File.join(TEST_CSS_DIR, "#{base_name}.css")
144
144
  raise "missing css file: #{css_file}" unless File.exists?(css_file)
145
-
145
+
146
146
  less_content = File.read(less_file)
147
147
  case base_name
148
148
  when 'javascript'
@@ -153,15 +153,15 @@ describe Less::Parser do
153
153
  # with something that won't fail (since we're not in Node.JS)
154
154
  less_content.sub!('process.title', '"node"')
155
155
  end
156
-
156
+
157
157
  it "#{base_name}.less" do
158
158
  parser = Less::Parser.new(:filename => less_file, :paths => [ File.dirname(less_file) ])
159
159
  less = parser.parse( less_content )
160
160
  less.to_css(:strictMath => true, :silent => true).should == File.read(css_file)
161
161
  end
162
-
162
+
163
163
  end
164
-
164
+
165
165
  end
166
-
166
+
167
167
  end