less 2.0.0 → 2.6.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 (468) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -4
  4. data/.travis.yml +12 -0
  5. data/Changelog.md +17 -0
  6. data/Gemfile +10 -2
  7. data/README.md +30 -14
  8. data/Rakefile +2 -0
  9. data/bin/lessc +101 -1
  10. data/less.gemspec +5 -8
  11. data/lib/less/defaults.rb +13 -0
  12. data/lib/less/errors.rb +44 -0
  13. data/lib/less/java_script/rhino_context.rb +100 -0
  14. data/lib/less/java_script/v8_context.rb +105 -0
  15. data/lib/less/java_script.rb +34 -0
  16. data/lib/less/js/.gitattributes +10 -0
  17. data/lib/less/js/.gitignore +24 -0
  18. data/lib/less/js/.jshintrc +11 -0
  19. data/lib/less/js/.npmignore +1 -0
  20. data/lib/less/js/.travis.yml +8 -0
  21. data/lib/less/js/CHANGELOG.md +299 -0
  22. data/lib/less/js/CONTRIBUTING.md +50 -0
  23. data/lib/less/js/Gruntfile.js +298 -0
  24. data/lib/less/js/README.md +43 -12
  25. data/lib/less/js/benchmark/benchmark.less +205 -205
  26. data/lib/less/js/benchmark/less-benchmark.js +11 -14
  27. data/lib/less/js/bin/lessc +350 -43
  28. data/lib/less/js/bower.json +18 -0
  29. data/lib/less/js/build/README.md +51 -0
  30. data/lib/less/js/build/amd.js +6 -0
  31. data/lib/less/js/build/browser-header.js +4 -0
  32. data/lib/less/js/build/build.yml +162 -0
  33. data/lib/less/js/build/require-rhino.js +12 -0
  34. data/lib/less/js/build/rhino-header.js +4 -0
  35. data/lib/less/js/build/rhino-modules.js +131 -0
  36. data/lib/less/js/build/tasks/.gitkeep +1 -0
  37. data/lib/less/js/build.gradle +347 -0
  38. data/lib/less/js/dist/{less-1.0.44.js → less-1.1.4.js} +159 -45
  39. data/lib/less/js/dist/less-1.1.4.min.js +16 -0
  40. data/lib/less/js/dist/less-1.1.5.js +2805 -0
  41. data/lib/less/js/dist/less-1.1.5.min.js +9 -0
  42. data/lib/less/js/dist/less-1.1.6.js +3004 -0
  43. data/lib/less/js/dist/less-1.1.6.min.js +9 -0
  44. data/lib/less/js/dist/less-1.2.0.js +3293 -0
  45. data/lib/less/js/dist/less-1.2.0.min.js +9 -0
  46. data/lib/less/js/dist/less-1.2.1.js +3318 -0
  47. data/lib/less/js/dist/less-1.2.1.min.js +9 -0
  48. data/lib/less/js/dist/less-1.2.2.js +3337 -0
  49. data/lib/less/js/dist/less-1.2.2.min.js +9 -0
  50. data/lib/less/js/dist/less-1.3.0.js +3478 -0
  51. data/lib/less/js/dist/less-1.3.0.min.js +9 -0
  52. data/lib/less/js/dist/less-1.3.1.js +4011 -0
  53. data/lib/less/js/dist/less-1.3.1.min.js +9 -0
  54. data/lib/less/js/dist/less-1.3.2.js +4401 -0
  55. data/lib/less/js/dist/less-1.3.2.min.js +9 -0
  56. data/lib/less/js/dist/less-1.3.3.js +4413 -0
  57. data/lib/less/js/dist/less-1.3.3.min.js +9 -0
  58. data/lib/less/js/dist/less-1.4.0-beta.js +5830 -0
  59. data/lib/less/js/dist/less-1.4.0-beta.min.js +11 -0
  60. data/lib/less/js/dist/less-1.4.0.js +5830 -0
  61. data/lib/less/js/dist/less-1.4.0.min.js +11 -0
  62. data/lib/less/js/dist/less-1.4.1.js +5837 -0
  63. data/lib/less/js/dist/less-1.4.1.min.js +11 -0
  64. data/lib/less/js/dist/less-1.4.2.js +5837 -0
  65. data/lib/less/js/dist/less-1.4.2.min.js +11 -0
  66. data/lib/less/js/dist/less-1.5.0.js +6914 -0
  67. data/lib/less/js/dist/less-1.5.0.min.js +13 -0
  68. data/lib/less/js/dist/less-1.5.1.js +6941 -0
  69. data/lib/less/js/dist/less-1.5.1.min.js +13 -0
  70. data/lib/less/js/dist/less-1.6.0.js +7485 -0
  71. data/lib/less/js/dist/less-1.6.0.min.js +16 -0
  72. data/lib/less/js/dist/less-1.6.1.js +7513 -0
  73. data/lib/less/js/dist/less-1.6.1.min.js +16 -0
  74. data/lib/less/js/dist/less-1.6.2.js +7624 -0
  75. data/lib/less/js/dist/less-1.6.2.min.js +16 -0
  76. data/lib/less/js/dist/less-1.6.3.js +7627 -0
  77. data/lib/less/js/dist/less-1.6.3.min.js +16 -0
  78. data/lib/less/js/dist/less-1.7.0.js +7921 -0
  79. data/lib/less/js/dist/less-1.7.0.min.js +16 -0
  80. data/lib/less/js/dist/less-rhino-1.1.3.js +2460 -0
  81. data/lib/less/js/dist/less-rhino-1.1.5.js +2481 -0
  82. data/lib/less/js/dist/less-rhino-1.3.1.js +3725 -0
  83. data/lib/less/js/dist/less-rhino-1.3.2.js +3990 -0
  84. data/lib/less/js/dist/less-rhino-1.3.3.js +4002 -0
  85. data/lib/less/js/dist/less-rhino-1.4.0.js +4273 -0
  86. data/lib/less/js/dist/less-rhino-1.5.1.js +6831 -0
  87. data/lib/less/js/dist/less-rhino-1.6.2.js +9017 -0
  88. data/lib/less/js/dist/less-rhino-1.6.3.js +9020 -0
  89. data/lib/less/js/dist/less-rhino-1.7.0.js +9301 -0
  90. data/lib/less/js/dist/lessc-rhino-1.6.2.js +449 -0
  91. data/lib/less/js/dist/lessc-rhino-1.6.3.js +449 -0
  92. data/lib/less/js/dist/lessc-rhino-1.7.0.js +449 -0
  93. data/lib/less/js/gradle/wrapper/gradle-wrapper.jar +0 -0
  94. data/lib/less/js/gradle/wrapper/gradle-wrapper.properties +6 -0
  95. data/lib/less/js/gradlew +164 -0
  96. data/lib/less/js/gradlew.bat +90 -0
  97. data/lib/less/js/lib/less/browser.js +556 -248
  98. data/lib/less/js/lib/less/colors.js +151 -0
  99. data/lib/less/js/lib/less/encoder.js +4 -0
  100. data/lib/less/js/lib/less/env.js +136 -0
  101. data/lib/less/js/lib/less/extend-visitor.js +416 -0
  102. data/lib/less/js/lib/less/functions.js +622 -28
  103. data/lib/less/js/lib/less/import-visitor.js +142 -0
  104. data/lib/less/js/lib/less/index.js +198 -83
  105. data/lib/less/js/lib/less/join-selector-visitor.js +44 -0
  106. data/lib/less/js/lib/less/lessc_helper.js +82 -0
  107. data/lib/less/js/lib/less/parser.js +1419 -449
  108. data/lib/less/js/lib/less/rhino.js +448 -0
  109. data/lib/less/js/lib/less/source-map-output.js +141 -0
  110. data/lib/less/js/lib/less/to-css-visitor.js +240 -0
  111. data/lib/less/js/lib/less/tree/alpha.js +18 -6
  112. data/lib/less/js/lib/less/tree/anonymous.js +26 -5
  113. data/lib/less/js/lib/less/tree/assignment.js +29 -0
  114. data/lib/less/js/lib/less/tree/call.js +40 -14
  115. data/lib/less/js/lib/less/tree/color.js +122 -31
  116. data/lib/less/js/lib/less/tree/comment.js +19 -5
  117. data/lib/less/js/lib/less/tree/condition.js +49 -0
  118. data/lib/less/js/lib/less/tree/detached-ruleset.js +20 -0
  119. data/lib/less/js/lib/less/tree/dimension.js +304 -14
  120. data/lib/less/js/lib/less/tree/directive.js +57 -21
  121. data/lib/less/js/lib/less/tree/element.js +89 -13
  122. data/lib/less/js/lib/less/tree/expression.js +40 -9
  123. data/lib/less/js/lib/less/tree/extend.js +53 -0
  124. data/lib/less/js/lib/less/tree/import.js +84 -37
  125. data/lib/less/js/lib/less/tree/javascript.js +18 -11
  126. data/lib/less/js/lib/less/tree/keyword.js +19 -4
  127. data/lib/less/js/lib/less/tree/media.js +157 -0
  128. data/lib/less/js/lib/less/tree/mixin.js +261 -52
  129. data/lib/less/js/lib/less/tree/negative.js +24 -0
  130. data/lib/less/js/lib/less/tree/operation.js +39 -14
  131. data/lib/less/js/lib/less/tree/paren.js +23 -0
  132. data/lib/less/js/lib/less/tree/quoted.js +30 -11
  133. data/lib/less/js/lib/less/tree/rule.js +79 -27
  134. data/lib/less/js/lib/less/tree/ruleset-call.js +16 -0
  135. data/lib/less/js/lib/less/tree/ruleset.js +469 -94
  136. data/lib/less/js/lib/less/tree/selector.js +119 -18
  137. data/lib/less/js/lib/less/tree/unicode-descriptor.js +15 -0
  138. data/lib/less/js/lib/less/tree/url.js +44 -16
  139. data/lib/less/js/lib/less/tree/value.js +17 -7
  140. data/lib/less/js/lib/less/tree/variable.js +29 -9
  141. data/lib/less/js/lib/less/tree.js +88 -4
  142. data/lib/less/js/lib/less/visitor.js +146 -0
  143. data/lib/less/js/lib/source-map/source-map-0.1.31.js +1933 -0
  144. data/lib/less/js/lib/source-map/source-map-footer.js +4 -0
  145. data/lib/less/js/lib/source-map/source-map-header.js +3 -0
  146. data/lib/less/js/package.json +86 -11
  147. data/lib/less/js/test/browser/common.js +201 -0
  148. data/lib/less/js/test/browser/css/global-vars/simple.css +3 -0
  149. data/lib/less/js/test/browser/css/modify-vars/simple.css +8 -0
  150. data/lib/less/js/test/browser/css/postProcessor/postProcessor.css +4 -0
  151. data/lib/less/js/test/browser/css/relative-urls/urls.css +35 -0
  152. data/lib/less/js/test/browser/css/rootpath/urls.css +35 -0
  153. data/lib/less/js/test/browser/css/rootpath-relative/urls.css +35 -0
  154. data/lib/less/js/test/browser/css/urls.css +53 -0
  155. data/lib/less/js/test/browser/es5.js +27 -0
  156. data/lib/less/js/test/browser/jasmine-html.js +681 -0
  157. data/lib/less/js/test/browser/jasmine.css +82 -0
  158. data/lib/less/js/test/browser/jasmine.js +2600 -0
  159. data/lib/less/js/test/browser/less/console-errors/test-error.less +3 -0
  160. data/lib/less/js/test/browser/less/console-errors/test-error.txt +2 -0
  161. data/lib/less/js/test/browser/less/global-vars/simple.less +3 -0
  162. data/lib/less/js/test/browser/less/imports/urls.less +4 -0
  163. data/lib/less/js/test/browser/less/imports/urls2.less +4 -0
  164. data/lib/less/js/test/browser/less/modify-vars/imports/simple2.less +4 -0
  165. data/lib/less/js/test/browser/less/modify-vars/simple.less +8 -0
  166. data/lib/less/js/test/browser/less/postProcessor/postProcessor.less +4 -0
  167. data/lib/less/js/test/browser/less/relative-urls/urls.less +33 -0
  168. data/lib/less/js/test/browser/less/rootpath/urls.less +33 -0
  169. data/lib/less/js/test/browser/less/rootpath-relative/urls.less +33 -0
  170. data/lib/less/js/test/browser/less/urls.less +57 -0
  171. data/lib/less/js/test/browser/phantom-runner.js +150 -0
  172. data/lib/less/js/test/browser/runner-browser-options.js +42 -0
  173. data/lib/less/js/test/browser/runner-browser-spec.js +12 -0
  174. data/lib/less/js/test/browser/runner-console-errors.js +5 -0
  175. data/lib/less/js/test/browser/runner-errors-options.js +5 -0
  176. data/lib/less/js/test/browser/runner-errors-spec.js +4 -0
  177. data/lib/less/js/test/browser/runner-global-vars-options.js +4 -0
  178. data/lib/less/js/test/browser/runner-global-vars-spec.js +3 -0
  179. data/lib/less/js/test/browser/runner-legacy-options.js +4 -0
  180. data/lib/less/js/test/browser/runner-legacy-spec.js +3 -0
  181. data/lib/less/js/test/browser/runner-main-options.js +15 -0
  182. data/lib/less/js/test/browser/runner-main-spec.js +3 -0
  183. data/lib/less/js/test/browser/runner-modify-vars-options.js +2 -0
  184. data/lib/less/js/test/browser/runner-modify-vars-spec.js +43 -0
  185. data/lib/less/js/test/browser/runner-no-js-errors-options.js +4 -0
  186. data/lib/less/js/test/browser/runner-no-js-errors-spec.js +4 -0
  187. data/lib/less/js/test/browser/runner-postProcessor-options.js +4 -0
  188. data/lib/less/js/test/browser/runner-postProcessor.js +3 -0
  189. data/lib/less/js/test/browser/runner-production-options.js +3 -0
  190. data/lib/less/js/test/browser/runner-production-spec.js +5 -0
  191. data/lib/less/js/test/browser/runner-relative-urls-options.js +3 -0
  192. data/lib/less/js/test/browser/runner-relative-urls-spec.js +3 -0
  193. data/lib/less/js/test/browser/runner-rootpath-options.js +3 -0
  194. data/lib/less/js/test/browser/runner-rootpath-relative-options.js +4 -0
  195. data/lib/less/js/test/browser/runner-rootpath-relative-spec.js +3 -0
  196. data/lib/less/js/test/browser/runner-rootpath-spec.js +3 -0
  197. data/lib/less/js/test/browser/test-runner-template.tmpl +47 -0
  198. data/lib/less/js/test/css/charsets.css +1 -0
  199. data/lib/less/js/test/css/colors.css +45 -0
  200. data/lib/less/js/test/css/comments.css +24 -7
  201. data/lib/less/js/test/css/compression/compression.css +3 -0
  202. data/lib/less/js/test/css/css-3.css +91 -4
  203. data/lib/less/js/test/css/css-escapes.css +5 -1
  204. data/lib/less/js/test/css/css-guards.css +37 -0
  205. data/lib/less/js/test/css/css.css +29 -16
  206. data/lib/less/js/test/css/debug/linenumbers-all.css +49 -0
  207. data/lib/less/js/test/css/debug/linenumbers-comments.css +40 -0
  208. data/lib/less/js/test/css/debug/linenumbers-mediaquery.css +40 -0
  209. data/lib/less/js/test/css/detached-rulesets.css +71 -0
  210. data/lib/less/js/test/css/empty.css +0 -0
  211. data/lib/less/js/test/css/extend-chaining.css +81 -0
  212. data/lib/less/js/test/css/extend-clearfix.css +19 -0
  213. data/lib/less/js/test/css/extend-exact.css +37 -0
  214. data/lib/less/js/test/css/extend-media.css +24 -0
  215. data/lib/less/js/test/css/extend-nest.css +57 -0
  216. data/lib/less/js/test/css/extend-selector.css +80 -0
  217. data/lib/less/js/test/css/extend.css +76 -0
  218. data/lib/less/js/test/css/extract-and-length.css +133 -0
  219. data/lib/less/js/test/css/functions.css +128 -0
  220. data/lib/less/js/test/css/globalVars/extended.css +12 -0
  221. data/lib/less/js/test/css/globalVars/simple.css +6 -0
  222. data/lib/less/js/test/css/ie-filters.css +9 -0
  223. data/lib/less/js/test/css/import-inline.css +5 -0
  224. data/lib/less/js/test/css/import-interpolation.css +6 -0
  225. data/lib/less/js/test/css/import-once.css +15 -0
  226. data/lib/less/js/test/css/import-reference.css +68 -0
  227. data/lib/less/js/test/css/import.css +30 -8
  228. data/lib/less/js/test/css/javascript.css +3 -2
  229. data/lib/less/js/test/css/legacy/legacy.css +7 -0
  230. data/lib/less/js/test/css/media.css +200 -2
  231. data/lib/less/js/test/css/merge.css +34 -0
  232. data/lib/less/js/test/css/mixins-args.css +58 -6
  233. data/lib/less/js/test/css/mixins-guards-default-func.css +129 -0
  234. data/lib/less/js/test/css/mixins-guards.css +82 -0
  235. data/lib/less/js/test/css/mixins-important.css +45 -0
  236. data/lib/less/js/test/css/mixins-interpolated.css +39 -0
  237. data/lib/less/js/test/css/mixins-named-args.css +27 -0
  238. data/lib/less/js/test/css/mixins-pattern.css +8 -6
  239. data/lib/less/js/test/css/mixins.css +91 -0
  240. data/lib/less/js/test/css/modifyVars/extended.css +9 -0
  241. data/lib/less/js/test/css/no-output.css +0 -0
  242. data/lib/less/js/test/css/operations.css +3 -0
  243. data/lib/less/js/test/css/parens.css +22 -6
  244. data/lib/less/js/test/css/property-name-interp.css +20 -0
  245. data/lib/less/js/test/css/rulesets.css +6 -2
  246. data/lib/less/js/test/css/scope.css +29 -6
  247. data/lib/less/js/test/css/selectors.css +122 -1
  248. data/lib/less/js/test/css/static-urls/urls.css +45 -0
  249. data/lib/less/js/test/css/strings.css +10 -5
  250. data/lib/less/js/test/css/url-args/urls.css +56 -0
  251. data/lib/less/js/test/css/urls.css +71 -0
  252. data/lib/less/js/test/css/variables-in-at-rules.css +18 -0
  253. data/lib/less/js/test/css/variables.css +23 -2
  254. data/lib/less/js/test/css/whitespace.css +9 -3
  255. data/lib/less/js/test/data/data-uri-fail.png +0 -0
  256. data/lib/less/js/test/data/image.jpg +1 -0
  257. data/lib/less/js/test/data/page.html +1 -0
  258. data/lib/less/js/test/index.js +45 -0
  259. data/lib/less/js/test/less/charsets.less +3 -0
  260. data/lib/less/js/test/less/colors.less +56 -4
  261. data/lib/less/js/test/less/comments.less +28 -8
  262. data/lib/less/js/test/less/compression/compression.less +36 -0
  263. data/lib/less/js/test/less/css-3.less +80 -6
  264. data/lib/less/js/test/less/css-escapes.less +6 -1
  265. data/lib/less/js/test/less/css-guards.less +102 -0
  266. data/lib/less/js/test/less/css.less +25 -13
  267. data/lib/less/js/test/less/debug/import/test.less +25 -0
  268. data/lib/less/js/test/less/debug/linenumbers.less +33 -0
  269. data/lib/less/js/test/less/detached-rulesets.less +103 -0
  270. data/lib/less/js/test/less/empty.less +0 -0
  271. data/lib/less/js/test/less/errors/add-mixed-units.less +3 -0
  272. data/lib/less/js/test/less/errors/add-mixed-units.txt +4 -0
  273. data/lib/less/js/test/less/errors/add-mixed-units2.less +3 -0
  274. data/lib/less/js/test/less/errors/add-mixed-units2.txt +4 -0
  275. data/lib/less/js/test/less/errors/at-rules-undefined-var.less +4 -0
  276. data/lib/less/js/test/less/errors/at-rules-undefined-var.txt +4 -0
  277. data/lib/less/js/test/less/errors/bad-variable-declaration1.less +1 -0
  278. data/lib/less/js/test/less/errors/bad-variable-declaration1.txt +2 -0
  279. data/lib/less/js/test/less/errors/color-func-invalid-color.less +3 -0
  280. data/lib/less/js/test/less/errors/color-func-invalid-color.txt +4 -0
  281. data/lib/less/js/test/less/errors/comment-in-selector.less +1 -0
  282. data/lib/less/js/test/less/errors/comment-in-selector.txt +2 -0
  283. data/lib/less/js/test/less/errors/css-guard-default-func.less +4 -0
  284. data/lib/less/js/test/less/errors/css-guard-default-func.txt +4 -0
  285. data/lib/less/js/test/less/errors/detached-ruleset-1.less +6 -0
  286. data/lib/less/js/test/less/errors/detached-ruleset-1.txt +4 -0
  287. data/lib/less/js/test/less/errors/detached-ruleset-2.less +6 -0
  288. data/lib/less/js/test/less/errors/detached-ruleset-2.txt +4 -0
  289. data/lib/less/js/test/less/errors/detached-ruleset-3.less +4 -0
  290. data/lib/less/js/test/less/errors/detached-ruleset-3.txt +4 -0
  291. data/lib/less/js/test/less/errors/detached-ruleset-4.less +5 -0
  292. data/lib/less/js/test/less/errors/detached-ruleset-4.txt +3 -0
  293. data/lib/less/js/test/less/errors/detached-ruleset-5.less +4 -0
  294. data/lib/less/js/test/less/errors/detached-ruleset-5.txt +3 -0
  295. data/lib/less/js/test/less/errors/detached-ruleset-6.less +5 -0
  296. data/lib/less/js/test/less/errors/detached-ruleset-6.txt +4 -0
  297. data/lib/less/js/test/less/errors/divide-mixed-units.less +3 -0
  298. data/lib/less/js/test/less/errors/divide-mixed-units.txt +4 -0
  299. data/lib/less/js/test/less/errors/extend-no-selector.less +3 -0
  300. data/lib/less/js/test/less/errors/extend-no-selector.txt +3 -0
  301. data/lib/less/js/test/less/errors/extend-not-at-end.less +3 -0
  302. data/lib/less/js/test/less/errors/extend-not-at-end.txt +3 -0
  303. data/lib/less/js/test/less/errors/import-missing.less +6 -0
  304. data/lib/less/js/test/less/errors/import-missing.txt +3 -0
  305. data/lib/less/js/test/less/errors/import-no-semi.less +1 -0
  306. data/lib/less/js/test/less/errors/import-no-semi.txt +2 -0
  307. data/lib/less/js/test/less/errors/import-subfolder1.less +1 -0
  308. data/lib/less/js/test/less/errors/import-subfolder1.txt +3 -0
  309. data/lib/less/js/test/less/errors/import-subfolder2.less +1 -0
  310. data/lib/less/js/test/less/errors/import-subfolder2.txt +4 -0
  311. data/lib/less/js/test/less/errors/imports/import-subfolder1.less +1 -0
  312. data/lib/less/js/test/less/errors/imports/import-subfolder2.less +1 -0
  313. data/lib/less/js/test/less/errors/imports/import-test.less +4 -0
  314. data/lib/less/js/test/less/errors/imports/subfolder/mixin-not-defined.less +1 -0
  315. data/lib/less/js/test/less/errors/imports/subfolder/parse-error-curly-bracket.less +1 -0
  316. data/lib/less/js/test/less/errors/javascript-error.less +3 -0
  317. data/lib/less/js/test/less/errors/javascript-error.txt +4 -0
  318. data/lib/less/js/test/less/errors/javascript-undefined-var.less +3 -0
  319. data/lib/less/js/test/less/errors/javascript-undefined-var.txt +4 -0
  320. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-1.less +6 -0
  321. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-1.txt +4 -0
  322. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-2.less +6 -0
  323. data/lib/less/js/test/less/errors/mixed-mixin-definition-args-2.txt +4 -0
  324. data/lib/less/js/test/less/errors/mixin-not-defined.less +11 -0
  325. data/lib/less/js/test/less/errors/mixin-not-defined.txt +3 -0
  326. data/lib/less/js/test/less/errors/mixin-not-matched.less +6 -0
  327. data/lib/less/js/test/less/errors/mixin-not-matched.txt +3 -0
  328. data/lib/less/js/test/less/errors/mixin-not-matched2.less +6 -0
  329. data/lib/less/js/test/less/errors/mixin-not-matched2.txt +3 -0
  330. data/lib/less/js/test/less/errors/mixin-not-visible-in-scope-1.less +9 -0
  331. data/lib/less/js/test/less/errors/mixin-not-visible-in-scope-1.txt +4 -0
  332. data/lib/less/js/test/less/errors/mixins-guards-default-func-1.less +9 -0
  333. data/lib/less/js/test/less/errors/mixins-guards-default-func-1.txt +4 -0
  334. data/lib/less/js/test/less/errors/mixins-guards-default-func-2.less +9 -0
  335. data/lib/less/js/test/less/errors/mixins-guards-default-func-2.txt +4 -0
  336. data/lib/less/js/test/less/errors/mixins-guards-default-func-3.less +9 -0
  337. data/lib/less/js/test/less/errors/mixins-guards-default-func-3.txt +4 -0
  338. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors.less +4 -0
  339. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors.txt +4 -0
  340. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors2.less +4 -0
  341. data/lib/less/js/test/less/errors/multiple-guards-on-css-selectors2.txt +4 -0
  342. data/lib/less/js/test/less/errors/multiply-mixed-units.less +7 -0
  343. data/lib/less/js/test/less/errors/multiply-mixed-units.txt +4 -0
  344. data/lib/less/js/test/less/errors/parens-error-1.less +3 -0
  345. data/lib/less/js/test/less/errors/parens-error-1.txt +4 -0
  346. data/lib/less/js/test/less/errors/parens-error-2.less +3 -0
  347. data/lib/less/js/test/less/errors/parens-error-2.txt +4 -0
  348. data/lib/less/js/test/less/errors/parens-error-3.less +3 -0
  349. data/lib/less/js/test/less/errors/parens-error-3.txt +4 -0
  350. data/lib/less/js/test/less/errors/parse-error-curly-bracket.less +4 -0
  351. data/lib/less/js/test/less/errors/parse-error-curly-bracket.txt +4 -0
  352. data/lib/less/js/test/less/errors/parse-error-extra-parens.less +5 -0
  353. data/lib/less/js/test/less/errors/parse-error-extra-parens.txt +3 -0
  354. data/lib/less/js/test/less/errors/parse-error-missing-bracket.less +2 -0
  355. data/lib/less/js/test/less/errors/parse-error-missing-bracket.txt +3 -0
  356. data/lib/less/js/test/less/errors/parse-error-missing-parens.less +5 -0
  357. data/lib/less/js/test/less/errors/parse-error-missing-parens.txt +3 -0
  358. data/lib/less/js/test/less/errors/parse-error-with-import.less +13 -0
  359. data/lib/less/js/test/less/errors/parse-error-with-import.txt +4 -0
  360. data/lib/less/js/test/less/errors/percentage-missing-space.less +3 -0
  361. data/lib/less/js/test/less/errors/percentage-missing-space.txt +4 -0
  362. data/lib/less/js/test/less/errors/property-asterisk-only-name.less +3 -0
  363. data/lib/less/js/test/less/errors/property-asterisk-only-name.txt +4 -0
  364. data/lib/less/js/test/less/errors/property-ie5-hack.less +3 -0
  365. data/lib/less/js/test/less/errors/property-ie5-hack.txt +4 -0
  366. data/lib/less/js/test/less/errors/property-in-root.less +4 -0
  367. data/lib/less/js/test/less/errors/property-in-root.txt +4 -0
  368. data/lib/less/js/test/less/errors/property-in-root2.less +1 -0
  369. data/lib/less/js/test/less/errors/property-in-root2.txt +4 -0
  370. data/lib/less/js/test/less/errors/property-in-root3.less +4 -0
  371. data/lib/less/js/test/less/errors/property-in-root3.txt +3 -0
  372. data/lib/less/js/test/less/errors/property-interp-not-defined.less +1 -0
  373. data/lib/less/js/test/less/errors/property-interp-not-defined.txt +2 -0
  374. data/lib/less/js/test/less/errors/recursive-variable.less +1 -0
  375. data/lib/less/js/test/less/errors/recursive-variable.txt +2 -0
  376. data/lib/less/js/test/less/errors/svg-gradient1.less +3 -0
  377. data/lib/less/js/test/less/errors/svg-gradient1.txt +4 -0
  378. data/lib/less/js/test/less/errors/svg-gradient2.less +3 -0
  379. data/lib/less/js/test/less/errors/svg-gradient2.txt +4 -0
  380. data/lib/less/js/test/less/errors/svg-gradient3.less +3 -0
  381. data/lib/less/js/test/less/errors/svg-gradient3.txt +4 -0
  382. data/lib/less/js/test/less/errors/unit-function.less +3 -0
  383. data/lib/less/js/test/less/errors/unit-function.txt +4 -0
  384. data/lib/less/js/test/less/extend-chaining.less +91 -0
  385. data/lib/less/js/test/less/extend-clearfix.less +19 -0
  386. data/lib/less/js/test/less/extend-exact.less +46 -0
  387. data/lib/less/js/test/less/extend-media.less +24 -0
  388. data/lib/less/js/test/less/extend-nest.less +65 -0
  389. data/lib/less/js/test/less/extend-selector.less +99 -0
  390. data/lib/less/js/test/less/extend.less +81 -0
  391. data/lib/less/js/test/less/extract-and-length.less +133 -0
  392. data/lib/less/js/test/less/functions.less +142 -4
  393. data/lib/less/js/test/less/globalVars/extended.json +5 -0
  394. data/lib/less/js/test/less/globalVars/extended.less +10 -0
  395. data/lib/less/js/test/less/globalVars/simple.json +3 -0
  396. data/lib/less/js/test/less/globalVars/simple.less +3 -0
  397. data/lib/less/js/test/less/ie-filters.less +15 -0
  398. data/lib/less/js/test/less/import/deeper/import-once-test-a.less +1 -0
  399. data/lib/less/js/test/less/import/import-and-relative-paths-test.less +17 -0
  400. data/lib/less/js/test/less/import/import-charset-test.less +1 -0
  401. data/lib/less/js/test/less/import/import-interpolation.less +1 -0
  402. data/lib/less/js/test/less/import/import-interpolation2.less +5 -0
  403. data/lib/less/js/test/less/import/import-once-test-c.less +6 -0
  404. data/lib/less/js/test/less/import/import-reference.less +51 -0
  405. data/lib/less/js/test/less/import/import-test-a.less +1 -0
  406. data/lib/less/js/test/less/import/import-test-c.less +0 -1
  407. data/lib/less/js/test/less/import/import-test-e.less +2 -0
  408. data/lib/less/js/test/less/import/import-test-f.less +5 -0
  409. data/lib/less/js/test/less/import/imports/font.less +8 -0
  410. data/lib/less/js/test/less/import/imports/logo.less +5 -0
  411. data/lib/less/js/test/less/import/invalid-css.less +1 -0
  412. data/lib/less/js/test/less/import/urls.less +1 -0
  413. data/lib/less/js/test/less/import-inline.less +2 -0
  414. data/lib/less/js/test/less/import-interpolation.less +8 -0
  415. data/lib/less/js/test/less/import-once.less +6 -0
  416. data/lib/less/js/test/less/import-reference.less +21 -0
  417. data/lib/less/js/test/less/import.less +16 -3
  418. data/lib/less/js/test/less/javascript.less +5 -3
  419. data/lib/less/js/test/less/legacy/legacy.less +7 -0
  420. data/lib/less/js/test/less/media.less +212 -3
  421. data/lib/less/js/test/less/merge.less +78 -0
  422. data/lib/less/js/test/less/mixins-args.less +113 -16
  423. data/lib/less/js/test/less/mixins-guards-default-func.less +195 -0
  424. data/lib/less/js/test/less/mixins-guards.less +159 -0
  425. data/lib/less/js/test/less/mixins-important.less +25 -0
  426. data/lib/less/js/test/less/mixins-interpolated.less +69 -0
  427. data/lib/less/js/test/less/mixins-named-args.less +36 -0
  428. data/lib/less/js/test/less/mixins-nested.less +2 -2
  429. data/lib/less/js/test/less/mixins-pattern.less +7 -1
  430. data/lib/less/js/test/less/mixins.less +94 -0
  431. data/lib/less/js/test/less/modifyVars/extended.json +5 -0
  432. data/lib/less/js/test/less/modifyVars/extended.less +11 -0
  433. data/lib/less/js/test/less/no-js-errors/no-js-errors.less +3 -0
  434. data/lib/less/js/test/less/no-js-errors/no-js-errors.txt +4 -0
  435. data/lib/less/js/test/less/no-output.less +2 -0
  436. data/lib/less/js/test/less/operations.less +30 -26
  437. data/lib/less/js/test/less/parens.less +24 -5
  438. data/lib/less/js/test/less/property-name-interp.less +53 -0
  439. data/lib/less/js/test/less/scope.less +73 -1
  440. data/lib/less/js/test/less/selectors.less +132 -0
  441. data/lib/less/js/test/less/sourcemaps/basic.json +3 -0
  442. data/lib/less/js/test/less/sourcemaps/basic.less +27 -0
  443. data/lib/less/js/test/less/sourcemaps/imported.css +7 -0
  444. data/lib/less/js/test/less/static-urls/urls.less +33 -0
  445. data/lib/less/js/test/less/strings.less +9 -1
  446. data/lib/less/js/test/less/url-args/urls.less +63 -0
  447. data/lib/less/js/test/less/urls.less +72 -0
  448. data/lib/less/js/test/less/variables-in-at-rules.less +20 -0
  449. data/lib/less/js/test/less/variables.less +44 -11
  450. data/lib/less/js/test/less/whitespace.less +7 -0
  451. data/lib/less/js/test/less-test.js +244 -60
  452. data/lib/less/js/test/rhino/test-header.js +15 -0
  453. data/lib/less/js/test/sourcemaps/basic.json +1 -0
  454. data/lib/less/js/test/sourcemaps/index.html +17 -0
  455. data/lib/less/loader.rb +208 -42
  456. data/lib/less/parser.rb +91 -30
  457. data/lib/less/version.rb +2 -2
  458. data/lib/less.rb +23 -8
  459. data/spec/less/faulty/faulty.less +3 -0
  460. data/spec/less/loader_spec.rb +45 -0
  461. data/spec/less/parser_spec.rb +141 -4
  462. data/spec/less/some/some.css +0 -0
  463. data/spec/less/some/some.less +4 -0
  464. data/spec/spec_helper.rb +4 -2
  465. metadata +418 -76
  466. data/lib/less/js/Makefile +0 -56
  467. data/lib/less/js/build/ecma-5.js +0 -120
  468. data/lib/less/js/build/header.js +0 -7
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 792bbf2f97fe5b11d31fba7f199cf862ed7cc4c0
4
+ data.tar.gz: 766dd0f65348fceb17aaf77e3057b6dfe52f7f3a
5
+ SHA512:
6
+ metadata.gz: 8e01c4a9d2bdb3d04341b96c4b71ff9967d20b63715a9d699752a9ae8e2bd105bbb832bd73450c98d22225b3b9add67d750877b13f0619612e8fb330e904742b
7
+ data.tar.gz: 492ade4340c93627608eed38084e9151dd86cc4fc13ef7f99d7ecf398c13cc85f15f10fe3f594f6084bf0f381ba224f0a7633914681e3eef189ea7b7f12d1fb5
data/.gitignore CHANGED
@@ -2,4 +2,6 @@
2
2
  *.gem
3
3
  .bundle
4
4
  *.rbc
5
+ .yardoc
5
6
  Gemfile.lock
7
+ nbproject
data/.gitmodules CHANGED
@@ -1,6 +1,3 @@
1
- [submodule "deps/less.js"]
2
- path = deps/less.js
3
- url = http://github.com/cloudhead/less.js.git
4
1
  [submodule "lib/less/js"]
5
2
  path = lib/less/js
6
- url = https://github.com/cloudhead/less.js.git
3
+ url = git://github.com/cloudhead/less.js.git
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ree
6
+ - jruby-18mode
7
+ - jruby-19mode
8
+ notifications:
9
+ recipients:
10
+ - cowboyd@thefrontside.net
11
+
12
+ before_script: git submodule update --init
data/Changelog.md ADDED
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ## 2.6.9 2014/06/02
4
+
5
+ * upgrade to less 1.7.0
6
+
7
+ ## 2.5.1 2014/05/30
8
+
9
+ * upgrade to less 1.6.3
10
+
11
+ ## 2.5.0 2014/02/17
12
+
13
+ * upgrade to less 1.6.2
14
+
15
+ ## 2.4.0 2013/09/02
16
+
17
+ * upgrade to less 1.4.2
data/Gemfile CHANGED
@@ -1,3 +1,11 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ gemspec
4
+
5
+ gem "therubyracer", "~> 0.12.0", :require => nil, :platforms => :ruby
6
+ gem "therubyrhino", ">= 2.0.2", :require => nil, :platforms => :jruby
7
+
8
+ group :development do
9
+ gem "rake", :require => nil
10
+ gem "rspec", "~> 2.0"
11
+ end
data/README.md CHANGED
@@ -1,41 +1,57 @@
1
- less.rb
2
- =======
1
+ # less.rb
3
2
 
4
3
  The **dynamic** stylesheet language.
5
4
 
6
5
  <http://lesscss.org>
7
6
 
8
- about
9
- -----
7
+ [![Build Status](https://secure.travis-ci.org/cowboyd/less.rb.png)](http://travis-ci.org/cowboyd/less.rb)
8
+
9
+ ## About
10
10
 
11
11
  These are Ruby bindings for the next generation LESS, which is implemented in JavaScript
12
12
 
13
13
  For more information, visit <http://lesscss.org>.
14
14
 
15
- usage
16
- ------
15
+ ## Usage
17
16
 
18
17
  less.rb exposes the `less.Parser` constructor to ruby code via `Less::Parser`. You can instate it
19
18
  context free:
20
19
 
21
- parser = Less::Parser.new
20
+ ```ruby
21
+ parser = Less::Parser.new
22
+ ```
22
23
 
23
24
  or with configuration options:
24
25
 
25
- parser = Less::Parser.new :paths => ['./lib', 'other/lib'], :filename => 'mystyles.less'
26
+ ```ruby
27
+ parser = Less::Parser.new :paths => ['./lib', 'other/lib'], :filename => 'mystyles.less'
28
+ ```
26
29
 
27
30
  Once you have a parser instantiated, you can parse code to get your AST !
28
31
 
29
- tree = parser.parse(".class {width: 1+1}") # => Less::Tree
30
- tree.to_css #=> .class {\n width: 2;\n}\n
31
- tree.to_css(:compress => true) #=> .class{width:2;}
32
+ ```ruby
33
+ tree = parser.parse(".class {width: 1+1}") # => Less::Tree
34
+ tree.to_css #=> .class {\n width: 2;\n}\n
35
+ tree.to_css(:compress => true) #=> .class{width:2;}
36
+ ```
37
+
38
+ ## Development
39
+
40
+ This repository contains less.js as a submodule, so to run the tests,
41
+ you'll need to grab that code as well. To do that, run `git submodule update --init`
42
+ from the root directory of the project.
43
+
44
+ To run the tests:
45
+
46
+ bundle
47
+ rake
48
+
32
49
 
33
- license
34
- -------
50
+ ## License
35
51
 
36
52
  less.rb is licensed under the same terms as less.js
37
53
 
38
54
  See `lib/js/LICENSE` file.
39
55
 
40
56
 
41
- > copyright 2011 Charles Lowell
57
+ > copyright 2011,2012 Charles Lowell
data/Rakefile CHANGED
@@ -5,3 +5,5 @@ require "rspec/core/rake_task"
5
5
  Bundler::GemHelper.install_tasks
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
+ task :default => :spec
9
+
data/bin/lessc CHANGED
@@ -1,3 +1,103 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- puts "yeah."
3
+ require 'less'
4
+
5
+ compress = false
6
+ yuicompress = false
7
+
8
+ options = {
9
+ :paths => [],
10
+ :strictImports => false,
11
+ :silent => false,
12
+ :optimization => 1
13
+ }
14
+
15
+ output = nil
16
+
17
+ require 'optparse'
18
+
19
+ opts = OptionParser.new do |opts|
20
+ opts.summary_width = 37
21
+
22
+ opts.banner = 'Usage: lessc [options] [INPUT]'
23
+
24
+ opts.on('-h', '--help', 'print this help') do
25
+ puts opts
26
+ exit
27
+ end
28
+
29
+ opts.on('-v', '--version', 'print version') do
30
+ puts("lessc #{Less['version'].join('.')} (LESS Compiler) [Ruby] #{Less::VERSION}")
31
+ exit(0)
32
+ end
33
+
34
+ opts.on('-s', '--silent') do
35
+ options[:silent] = true
36
+ end
37
+
38
+ opts.on('--strict-imports') do
39
+ options[:strictImports] = true
40
+ end
41
+
42
+ opts.on('-x', '--compress') do
43
+ compress = true
44
+ end
45
+
46
+ opts.on('--yui-compress') do
47
+ yuicompress = true
48
+ end
49
+
50
+ opts.on('--no-color') do
51
+ options[:color] = false
52
+ end
53
+
54
+ require 'rbconfig'
55
+ is_windows = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
56
+ separator = is_windows ? ';' : ':'
57
+ opts.on('--paths PATHS', '--include-path PATHS',
58
+ "paths to include separated by '#{separator}'") do |paths|
59
+ paths = paths.split(separator).map do |path|
60
+ path.empty? ? nil : File.expand_path(path)
61
+ end
62
+ options[:paths] = paths.compact
63
+ end
64
+
65
+ # NOTE: not present in JS version, has: --00, --01 and --02
66
+ opts.on('--optimization [0, 1 or 2]', "default: 1") do |num|
67
+ options[:optimization] = (num || 1).to_i
68
+ end
69
+
70
+ [0, 1, 2].each do |num| # --00 --01 --02
71
+ opts.on("--0#{num}", "optimization: #{num}") do
72
+ options[:optimization] = num
73
+ end
74
+ end
75
+
76
+ # NOTE: not present in JS version, does [INPUT] [OUTPUT]
77
+ #opts.on('--output file', "specify an output path") do |path|
78
+ # output = File.expand_path(path)
79
+ #end
80
+
81
+ end
82
+
83
+ opts.parse! ARGV
84
+
85
+ if ARGV.empty?
86
+ puts("lessc: no input files")
87
+ exit(1)
88
+ end
89
+
90
+ if ARGV.size == 1
91
+ options[:filename] = ARGV.first
92
+ end
93
+
94
+ ARGV.each do |path|
95
+ options[:paths].unshift File.dirname(path)
96
+ end
97
+ options[:paths].uniq!
98
+
99
+ parser = Less::Parser.new(options)
100
+ tree = parser.parse(ARGF.read)
101
+ css = tree.to_css(:compress => compress, :yuicompress => yuicompress)
102
+
103
+ puts css # we do not support [INPUT] [OUTPUT] as the JS version does
data/less.gemspec CHANGED
@@ -8,11 +8,11 @@ Gem::Specification.new do |s|
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Charles Lowell"]
10
10
  s.email = ["cowboyd@thefrontside.net"]
11
- s.homepage = "http://github.com/cowboyd/less.rb"
11
+ s.homepage = "http://lesscss.org"
12
12
  s.summary = %q{Leaner CSS, in your browser or Ruby (via less.js)}
13
- s.description = %q{Invoke the Less CSS compiler from Ruby (http://lesscss.org)}
14
-
13
+ s.description = %q{Invoke the Less CSS compiler from Ruby}
15
14
  s.rubyforge_project = "less"
15
+ s.license = 'Apache 2.0'
16
16
 
17
17
  s.files = `git ls-files`.split("\n")
18
18
  Dir.chdir('lib/less/js') do
@@ -21,9 +21,6 @@ Gem::Specification.new do |s|
21
21
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
22
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
23
  s.require_paths = ["lib"]
24
-
25
- s.add_dependency "therubyracer", "~> 0.9.0beta6"
26
- s.add_development_dependency "rake", "~> 0.9.1"
27
- s.add_development_dependency "rspec", "~> 2.0"
28
- end
29
24
 
25
+ s.add_dependency "commonjs", "~> 0.2.7"
26
+ end
@@ -0,0 +1,13 @@
1
+ module Less
2
+ module Defaults
3
+
4
+ def defaults
5
+ @defaults ||= { :paths => [], :relativeUrls => true, :syncImport => true }
6
+ end
7
+
8
+ def paths
9
+ defaults[:paths]
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,44 @@
1
+ module Less
2
+
3
+ class Error < ::StandardError
4
+
5
+ def initialize(cause, value = nil)
6
+ @value = value
7
+ message = nil
8
+ if @value # 2 args passed
9
+ message = @value['message']
10
+ else # allow passing only value as first arg cause :
11
+ if cause.respond_to?(:'[]') && message = cause['message']
12
+ @value = cause
13
+ end
14
+ end
15
+
16
+ if cause.is_a?(::Exception)
17
+ @cause = cause
18
+ super(message || cause.message)
19
+ else
20
+ super(message || cause)
21
+ end
22
+ end
23
+
24
+ def cause
25
+ @cause
26
+ end
27
+
28
+ def backtrace
29
+ @cause ? @cause.backtrace : super
30
+ end
31
+
32
+ # function LessError(e, env) { ... }
33
+ %w{ type filename stack extract }.each do |key|
34
+ class_eval "def #{key}; @value && @value['#{key}']; end"
35
+ end
36
+ %w{ index line column }.each do |key|
37
+ class_eval "def #{key}; @value && @value['#{key}'].to_i; end"
38
+ end
39
+
40
+ end
41
+
42
+ class ParseError < Error; end
43
+
44
+ end
@@ -0,0 +1,100 @@
1
+ begin
2
+ require 'rhino' unless defined?(Rhino)
3
+ rescue LoadError => e
4
+ warn "[WARNING] Please install gem 'therubyrhino' to use Less under JRuby."
5
+ raise e
6
+ end
7
+
8
+ require 'rhino/version'
9
+ if Rhino::VERSION < '2.0.2'
10
+ raise LoadError, "expected gem 'therubyrhino' '>= 2.0.2' but got '#{Rhino::VERSION}'"
11
+ end
12
+
13
+ module Less
14
+ module JavaScript
15
+ class RhinoContext
16
+
17
+ def self.instance
18
+ return new # NOTE: for Rhino a context should be kept open per thread !
19
+ end
20
+
21
+ def initialize(globals = nil)
22
+ @rhino_context = Rhino::Context.new :java => true
23
+ if @rhino_context.respond_to?(:version)
24
+ @rhino_context.version = '1.8'
25
+ apply_1_8_compatibility! if @rhino_context.version.to_s != '1.8'
26
+ else
27
+ apply_1_8_compatibility!
28
+ end
29
+ globals.each { |key, val| @rhino_context[key] = val } if globals
30
+ end
31
+
32
+ def unwrap
33
+ @rhino_context
34
+ end
35
+
36
+ def exec(&block)
37
+ @rhino_context.open(&block)
38
+ rescue Rhino::JSError => e
39
+ handle_js_error(e)
40
+ end
41
+
42
+ def eval(source, options = {})
43
+ source = source.encode('UTF-8') if source.respond_to?(:encode)
44
+
45
+ source_name = options[:source_name] || "<eval>"
46
+ line_number = options[:line_number] || 1
47
+ @rhino_context.eval("(#{source})", source_name, line_number)
48
+ rescue Rhino::JSError => e
49
+ handle_js_error(e)
50
+ end
51
+
52
+ def call(properties, *args)
53
+ options = args.last.is_a?(::Hash) ? args.pop : {} # extract_option!
54
+
55
+ source_name = options[:source_name] || "<eval>"
56
+ line_number = options[:line_number] || 1
57
+ @rhino_context.eval(properties, source_name, line_number).call(*args)
58
+ rescue Rhino::JSError => e
59
+ handle_js_error(e)
60
+ end
61
+
62
+ def method_missing(symbol, *args)
63
+ if @rhino_context.respond_to?(symbol)
64
+ @rhino_context.send(symbol, *args)
65
+ else
66
+ super
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def handle_js_error(e)
73
+ if e.value && ( e.value['message'] || e.value['type'].is_a?(String) )
74
+ raise Less::ParseError.new(e, e.value) # LessError
75
+ end
76
+ if e.unwrap.to_s =~ /missing opening `\(`/
77
+ raise Less::ParseError.new(e.unwrap.to_s)
78
+ end
79
+ if e.message && e.message[0, 12] == "Syntax Error"
80
+ raise Less::ParseError.new(e)
81
+ else
82
+ raise Less::Error.new(e)
83
+ end
84
+ end
85
+
86
+ def apply_1_8_compatibility!
87
+ # TODO rather load ecma-5.js ...
88
+ @rhino_context.eval("
89
+ // String
90
+ if ( ! String.prototype.trim ) {
91
+ String.prototype.trim = function () {
92
+ return this.replace(/^\s+|\s+$/g,'');
93
+ };
94
+ }
95
+ ")
96
+ end
97
+
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,105 @@
1
+ begin
2
+ require 'v8' unless defined?(V8)
3
+ rescue LoadError => e
4
+ warn "[WARNING] Please install gem 'therubyracer' to use Less."
5
+ raise e
6
+ end
7
+
8
+ require 'pathname'
9
+
10
+ module Less
11
+ module JavaScript
12
+ class V8Context
13
+
14
+ def self.instance
15
+ return new
16
+ end
17
+
18
+ def initialize(globals = nil)
19
+ lock do
20
+ @v8_context = V8::Context.new
21
+ globals.each { |key, val| @v8_context[key] = val } if globals
22
+ end
23
+ end
24
+
25
+ def unwrap
26
+ @v8_context
27
+ end
28
+
29
+ def exec(&block)
30
+ lock(&block)
31
+ end
32
+
33
+ def eval(source, options = nil) # passing options not supported
34
+ source = source.encode('UTF-8') if source.respond_to?(:encode)
35
+
36
+ lock do
37
+ @v8_context.eval("(#{source})")
38
+ end
39
+ end
40
+
41
+ def call(properties, *args)
42
+ args.last.is_a?(::Hash) ? args.pop : nil # extract_options!
43
+
44
+ lock do
45
+ @v8_context.eval(properties).call(*args)
46
+ end
47
+ end
48
+
49
+ def method_missing(symbol, *args)
50
+ if @v8_context.respond_to?(symbol)
51
+ @v8_context.send(symbol, *args)
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def lock(&block)
60
+ do_lock(&block)
61
+ rescue V8::JSError => e
62
+ if e.in_javascript?
63
+ js_value = e.value.respond_to?(:'[]')
64
+ name = js_value && e.value["name"]
65
+ constructor = js_value && e.value['constructor']
66
+ if name == "SyntaxError" ||
67
+ ( constructor && constructor.name == "LessError" )
68
+ raise Less::ParseError.new(e, js_value ? e.value : nil)
69
+ end
70
+ # NOTE: less/parser.js :
71
+ #
72
+ # error = new(LessError)({
73
+ # index: i,
74
+ # type: 'Parse',
75
+ # message: "missing closing `}`",
76
+ # filename: env.filename
77
+ # }, env);
78
+ #
79
+ # comes back as value: RuntimeError !
80
+ elsif e.value.to_s =~ /missing opening `\(`/
81
+ raise Less::ParseError.new(e.value.to_s)
82
+ end
83
+ raise Less::Error.new(e)
84
+ end
85
+
86
+ def do_lock
87
+ result, exception = nil, nil
88
+ V8::C::Locker() do
89
+ begin
90
+ result = yield
91
+ rescue Exception => e
92
+ exception = e
93
+ end
94
+ end
95
+
96
+ if exception
97
+ raise exception
98
+ else
99
+ result
100
+ end
101
+ end
102
+
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,34 @@
1
+ module Less
2
+ module JavaScript
3
+
4
+ def self.default_context_wrapper
5
+ if defined?(JRUBY_VERSION)
6
+ require 'less/java_script/rhino_context'
7
+ RhinoContext
8
+ else
9
+ require 'less/java_script/v8_context'
10
+ V8Context
11
+ end
12
+ end
13
+
14
+ @@context_wrapper = nil
15
+
16
+ def self.context_wrapper
17
+ @@context_wrapper ||= default_context_wrapper
18
+ end
19
+
20
+ def self.context_wrapper=(klass)
21
+ @@context_wrapper = klass
22
+ end
23
+
24
+ # execute a block as JS
25
+ def self.exec(&block)
26
+ context_wrapper.instance.exec(&block)
27
+ end
28
+
29
+ def self.eval(source)
30
+ context_wrapper.instance.eval(source)
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ *.js text eol=lf
2
+ lessc text eol=lf
3
+ *.less text eol=lf
4
+ *.css text eol=lf
5
+ *.htm text eol=lf
6
+ gradlew.bat text eol=crlf
7
+ *.html text eol=lf
8
+ *.jpg binary
9
+ *.png binary
10
+ *.jpeg binary
@@ -0,0 +1,24 @@
1
+ # OS and IDE
2
+ .emacs*
3
+ *.flymake
4
+ *~
5
+ .#*
6
+ .idea
7
+ *.sublime-*
8
+
9
+ # npm
10
+ node_modules
11
+ npm-debug.log
12
+
13
+ # project-specific
14
+ tmp
15
+ test/browser/less.js
16
+ test/sourcemaps/*.map
17
+ test/sourcemaps/*.css
18
+
19
+ # grunt
20
+ .grunt
21
+
22
+ # gradle
23
+ .gradle
24
+ out
@@ -0,0 +1,11 @@
1
+ {
2
+ "evil": true,
3
+ "laxbreak": true,
4
+ "latedef": true,
5
+ "node": true,
6
+ "undef": true,
7
+ "unused": "vars",
8
+ "noarg": true,
9
+ "eqnull": true,
10
+ "forin": true
11
+ }
@@ -0,0 +1 @@
1
+ .gitattributes
@@ -0,0 +1,8 @@
1
+ language: node_js
2
+ node_js:
3
+ - "0.11"
4
+ - "0.10"
5
+ - "0.8"
6
+ install:
7
+ - npm install -g grunt-cli
8
+ - npm install