less 2.3.1 → 2.4.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 (301) hide show
  1. package/.idea/workspace.xml +277 -237
  2. package/.jscsrc +36 -1
  3. package/.travis.yml +1 -0
  4. package/CHANGELOG.md +14 -0
  5. package/Gruntfile.js +1 -1
  6. package/appveyor.yml +5 -0
  7. package/bin/lessc +8 -5
  8. package/bower.json +1 -1
  9. package/dist/less.js +909 -814
  10. package/dist/less.min.js +6 -6
  11. package/lib/less/contexts.js +2 -2
  12. package/lib/less/environment/abstract-file-manager.js +6 -6
  13. package/lib/less/environment/environment.js +2 -2
  14. package/lib/less/functions/color.js +13 -5
  15. package/lib/less/functions/math.js +1 -1
  16. package/lib/less/functions/number.js +2 -2
  17. package/lib/less/functions/types.js +18 -8
  18. package/lib/less/import-manager.js +5 -5
  19. package/lib/less/index.js +1 -1
  20. package/lib/less/less-error.js +1 -1
  21. package/lib/less/logger.js +2 -2
  22. package/lib/less/parse-tree.js +45 -45
  23. package/lib/less/parse.js +5 -2
  24. package/lib/less/parser/parser-input.js +3 -3
  25. package/lib/less/parser/parser.js +52 -18
  26. package/lib/less/plugin-manager.js +30 -3
  27. package/lib/less/render.js +5 -2
  28. package/lib/less/source-map-builder.js +4 -0
  29. package/lib/less/source-map-output.js +3 -3
  30. package/lib/less/transform-tree.js +4 -4
  31. package/lib/less/tree/anonymous.js +1 -1
  32. package/lib/less/tree/call.js +1 -1
  33. package/lib/less/tree/color.js +2 -2
  34. package/lib/less/tree/condition.js +8 -4
  35. package/lib/less/tree/dimension.js +4 -4
  36. package/lib/less/tree/element.js +1 -1
  37. package/lib/less/tree/expression.js +1 -1
  38. package/lib/less/tree/extend.js +3 -3
  39. package/lib/less/tree/javascript.js +2 -2
  40. package/lib/less/tree/media.js +20 -20
  41. package/lib/less/tree/mixin-call.js +2 -2
  42. package/lib/less/tree/mixin-definition.js +29 -8
  43. package/lib/less/tree/quoted.js +3 -3
  44. package/lib/less/tree/rule.js +1 -1
  45. package/lib/less/tree/ruleset.js +35 -28
  46. package/lib/less/tree/selector.js +1 -1
  47. package/lib/less/tree/unit.js +2 -0
  48. package/lib/less/tree/value.js +1 -1
  49. package/lib/less/visitors/extend-visitor.js +15 -14
  50. package/lib/less/visitors/import-sequencer.js +2 -2
  51. package/lib/less/visitors/import-visitor.js +2 -2
  52. package/lib/less/visitors/to-css-visitor.js +5 -5
  53. package/lib/less-browser/cache.js +2 -2
  54. package/lib/less-browser/file-manager.js +96 -96
  55. package/lib/less-browser/index.js +205 -205
  56. package/lib/less-browser/log-listener.js +2 -2
  57. package/lib/less-browser/utils.js +6 -6
  58. package/lib/less-node/file-manager.js +9 -4
  59. package/lib/less-node/index.js +3 -3
  60. package/lib/less-node/plugin-loader.js +3 -3
  61. package/lib/less-node/url-file-manager.js +5 -2
  62. package/lib/less-rhino/index.js +13 -9
  63. package/lib/source-map/source-map-0.1.31.js +1 -1
  64. package/package.json +1 -1
  65. package/test/browser/css/relative-urls/urls.css +1 -0
  66. package/test/browser/less/relative-urls/urls.less +1 -0
  67. package/test/browser/runner-browser-options.js +23 -23
  68. package/test/browser/runner-errors-spec.js +1 -1
  69. package/test/browser/runner-global-vars-spec.js +1 -1
  70. package/test/browser/runner-main-options.js +5 -5
  71. package/test/browser/runner-main-spec.js +1 -1
  72. package/test/copy-bom.js +35 -35
  73. package/test/css/functions.css +8 -0
  74. package/test/css/import-interpolation.css +1 -0
  75. package/test/css/mixins-important.css +6 -0
  76. package/test/css/selectors.css +5 -0
  77. package/test/css/static-urls/urls.css +1 -0
  78. package/test/css/urls.css +1 -0
  79. package/test/index.js +2 -1
  80. package/test/less/functions.less +13 -0
  81. package/test/less/import/imports/logo.less +1 -0
  82. package/test/less/mixins-important.less +17 -1
  83. package/test/less/selectors.less +10 -0
  84. package/test/less/sourcemaps-empty/empty.less +0 -0
  85. package/test/less/sourcemaps-empty/var-defs.less +1 -0
  86. package/test/less/urls.less +1 -1
  87. package/test/less-test.js +49 -27
  88. package/test/modify-vars.js +13 -13
  89. package/test/browser/less.js +0 -29
  90. package/test/less-bom/charsets.less +0 -3
  91. package/test/less-bom/colors.less +0 -98
  92. package/test/less-bom/comments.less +0 -102
  93. package/test/less-bom/comments2.less +0 -20
  94. package/test/less-bom/compression/compression.less +0 -36
  95. package/test/less-bom/css-3.less +0 -154
  96. package/test/less-bom/css-escapes.less +0 -33
  97. package/test/less-bom/css-guards.less +0 -103
  98. package/test/less-bom/css.less +0 -108
  99. package/test/less-bom/debug/import/test.less +0 -25
  100. package/test/less-bom/debug/linenumbers.less +0 -33
  101. package/test/less-bom/detached-rulesets.less +0 -103
  102. package/test/less-bom/empty.less +0 -1
  103. package/test/less-bom/errors/add-mixed-units.less +0 -3
  104. package/test/less-bom/errors/add-mixed-units.txt +0 -4
  105. package/test/less-bom/errors/add-mixed-units2.less +0 -3
  106. package/test/less-bom/errors/add-mixed-units2.txt +0 -4
  107. package/test/less-bom/errors/at-rules-undefined-var.less +0 -4
  108. package/test/less-bom/errors/at-rules-undefined-var.txt +0 -4
  109. package/test/less-bom/errors/bad-variable-declaration1.less +0 -1
  110. package/test/less-bom/errors/bad-variable-declaration1.txt +0 -2
  111. package/test/less-bom/errors/color-func-invalid-color.less +0 -3
  112. package/test/less-bom/errors/color-func-invalid-color.txt +0 -4
  113. package/test/less-bom/errors/color-invalid-hex-code.less +0 -3
  114. package/test/less-bom/errors/color-invalid-hex-code.txt +0 -4
  115. package/test/less-bom/errors/color-invalid-hex-code2.less +0 -3
  116. package/test/less-bom/errors/color-invalid-hex-code2.txt +0 -4
  117. package/test/less-bom/errors/css-guard-default-func.less +0 -4
  118. package/test/less-bom/errors/css-guard-default-func.txt +0 -4
  119. package/test/less-bom/errors/detached-ruleset-1.less +0 -6
  120. package/test/less-bom/errors/detached-ruleset-1.txt +0 -4
  121. package/test/less-bom/errors/detached-ruleset-2.less +0 -6
  122. package/test/less-bom/errors/detached-ruleset-2.txt +0 -4
  123. package/test/less-bom/errors/detached-ruleset-3.less +0 -4
  124. package/test/less-bom/errors/detached-ruleset-3.txt +0 -4
  125. package/test/less-bom/errors/detached-ruleset-4.less +0 -5
  126. package/test/less-bom/errors/detached-ruleset-4.txt +0 -4
  127. package/test/less-bom/errors/detached-ruleset-5.less +0 -4
  128. package/test/less-bom/errors/detached-ruleset-5.txt +0 -3
  129. package/test/less-bom/errors/detached-ruleset-6.less +0 -5
  130. package/test/less-bom/errors/detached-ruleset-6.txt +0 -4
  131. package/test/less-bom/errors/divide-mixed-units.less +0 -3
  132. package/test/less-bom/errors/divide-mixed-units.txt +0 -4
  133. package/test/less-bom/errors/extend-no-selector.less +0 -3
  134. package/test/less-bom/errors/extend-no-selector.txt +0 -3
  135. package/test/less-bom/errors/extend-not-at-end.less +0 -3
  136. package/test/less-bom/errors/extend-not-at-end.txt +0 -3
  137. package/test/less-bom/errors/import-malformed.less +0 -1
  138. package/test/less-bom/errors/import-malformed.txt +0 -3
  139. package/test/less-bom/errors/import-missing.less +0 -6
  140. package/test/less-bom/errors/import-missing.txt +0 -3
  141. package/test/less-bom/errors/import-no-semi.less +0 -1
  142. package/test/less-bom/errors/import-no-semi.txt +0 -2
  143. package/test/less-bom/errors/import-subfolder1.less +0 -1
  144. package/test/less-bom/errors/import-subfolder1.txt +0 -3
  145. package/test/less-bom/errors/import-subfolder2.less +0 -1
  146. package/test/less-bom/errors/import-subfolder2.txt +0 -4
  147. package/test/less-bom/errors/imports/import-subfolder1.less +0 -1
  148. package/test/less-bom/errors/imports/import-subfolder2.less +0 -1
  149. package/test/less-bom/errors/imports/import-test.less +0 -4
  150. package/test/less-bom/errors/imports/subfolder/mixin-not-defined.less +0 -1
  151. package/test/less-bom/errors/imports/subfolder/parse-error-curly-bracket.less +0 -1
  152. package/test/less-bom/errors/javascript-error.less +0 -3
  153. package/test/less-bom/errors/javascript-error.txt +0 -4
  154. package/test/less-bom/errors/javascript-undefined-var.less +0 -3
  155. package/test/less-bom/errors/javascript-undefined-var.txt +0 -4
  156. package/test/less-bom/errors/mixed-mixin-definition-args-1.less +0 -6
  157. package/test/less-bom/errors/mixed-mixin-definition-args-1.txt +0 -4
  158. package/test/less-bom/errors/mixed-mixin-definition-args-2.less +0 -6
  159. package/test/less-bom/errors/mixed-mixin-definition-args-2.txt +0 -4
  160. package/test/less-bom/errors/mixin-not-defined.less +0 -11
  161. package/test/less-bom/errors/mixin-not-defined.txt +0 -3
  162. package/test/less-bom/errors/mixin-not-matched.less +0 -6
  163. package/test/less-bom/errors/mixin-not-matched.txt +0 -3
  164. package/test/less-bom/errors/mixin-not-matched2.less +0 -6
  165. package/test/less-bom/errors/mixin-not-matched2.txt +0 -3
  166. package/test/less-bom/errors/mixin-not-visible-in-scope-1.less +0 -9
  167. package/test/less-bom/errors/mixin-not-visible-in-scope-1.txt +0 -4
  168. package/test/less-bom/errors/mixins-guards-default-func-1.less +0 -9
  169. package/test/less-bom/errors/mixins-guards-default-func-1.txt +0 -4
  170. package/test/less-bom/errors/mixins-guards-default-func-2.less +0 -9
  171. package/test/less-bom/errors/mixins-guards-default-func-2.txt +0 -4
  172. package/test/less-bom/errors/mixins-guards-default-func-3.less +0 -9
  173. package/test/less-bom/errors/mixins-guards-default-func-3.txt +0 -4
  174. package/test/less-bom/errors/multiple-guards-on-css-selectors.less +0 -4
  175. package/test/less-bom/errors/multiple-guards-on-css-selectors.txt +0 -4
  176. package/test/less-bom/errors/multiple-guards-on-css-selectors2.less +0 -4
  177. package/test/less-bom/errors/multiple-guards-on-css-selectors2.txt +0 -4
  178. package/test/less-bom/errors/multiply-mixed-units.less +0 -7
  179. package/test/less-bom/errors/multiply-mixed-units.txt +0 -4
  180. package/test/less-bom/errors/parens-error-1.less +0 -3
  181. package/test/less-bom/errors/parens-error-1.txt +0 -4
  182. package/test/less-bom/errors/parens-error-2.less +0 -3
  183. package/test/less-bom/errors/parens-error-2.txt +0 -4
  184. package/test/less-bom/errors/parens-error-3.less +0 -3
  185. package/test/less-bom/errors/parens-error-3.txt +0 -4
  186. package/test/less-bom/errors/parse-error-curly-bracket.less +0 -4
  187. package/test/less-bom/errors/parse-error-curly-bracket.txt +0 -4
  188. package/test/less-bom/errors/parse-error-extra-parens.less +0 -5
  189. package/test/less-bom/errors/parse-error-extra-parens.txt +0 -3
  190. package/test/less-bom/errors/parse-error-missing-bracket.less +0 -2
  191. package/test/less-bom/errors/parse-error-missing-bracket.txt +0 -3
  192. package/test/less-bom/errors/parse-error-missing-parens.less +0 -5
  193. package/test/less-bom/errors/parse-error-missing-parens.txt +0 -3
  194. package/test/less-bom/errors/parse-error-with-import.less +0 -13
  195. package/test/less-bom/errors/parse-error-with-import.txt +0 -4
  196. package/test/less-bom/errors/percentage-missing-space.less +0 -3
  197. package/test/less-bom/errors/percentage-missing-space.txt +0 -4
  198. package/test/less-bom/errors/property-asterisk-only-name.less +0 -3
  199. package/test/less-bom/errors/property-asterisk-only-name.txt +0 -4
  200. package/test/less-bom/errors/property-ie5-hack.less +0 -3
  201. package/test/less-bom/errors/property-ie5-hack.txt +0 -3
  202. package/test/less-bom/errors/property-in-root.less +0 -4
  203. package/test/less-bom/errors/property-in-root.txt +0 -4
  204. package/test/less-bom/errors/property-in-root2.less +0 -1
  205. package/test/less-bom/errors/property-in-root2.txt +0 -4
  206. package/test/less-bom/errors/property-in-root3.less +0 -4
  207. package/test/less-bom/errors/property-in-root3.txt +0 -3
  208. package/test/less-bom/errors/property-interp-not-defined.less +0 -1
  209. package/test/less-bom/errors/property-interp-not-defined.txt +0 -2
  210. package/test/less-bom/errors/recursive-variable.less +0 -1
  211. package/test/less-bom/errors/recursive-variable.txt +0 -2
  212. package/test/less-bom/errors/single-character.less +0 -1
  213. package/test/less-bom/errors/single-character.txt +0 -2
  214. package/test/less-bom/errors/svg-gradient1.less +0 -3
  215. package/test/less-bom/errors/svg-gradient1.txt +0 -4
  216. package/test/less-bom/errors/svg-gradient2.less +0 -3
  217. package/test/less-bom/errors/svg-gradient2.txt +0 -4
  218. package/test/less-bom/errors/svg-gradient3.less +0 -3
  219. package/test/less-bom/errors/svg-gradient3.txt +0 -4
  220. package/test/less-bom/errors/unit-function.less +0 -3
  221. package/test/less-bom/errors/unit-function.txt +0 -4
  222. package/test/less-bom/extend-chaining.less +0 -91
  223. package/test/less-bom/extend-clearfix.less +0 -19
  224. package/test/less-bom/extend-exact.less +0 -46
  225. package/test/less-bom/extend-media.less +0 -24
  226. package/test/less-bom/extend-nest.less +0 -65
  227. package/test/less-bom/extend-selector.less +0 -99
  228. package/test/less-bom/extend.less +0 -81
  229. package/test/less-bom/extract-and-length.less +0 -133
  230. package/test/less-bom/functions.less +0 -201
  231. package/test/less-bom/globalVars/extended.json +0 -5
  232. package/test/less-bom/globalVars/extended.less +0 -10
  233. package/test/less-bom/globalVars/simple.json +0 -3
  234. package/test/less-bom/globalVars/simple.less +0 -3
  235. package/test/less-bom/ie-filters.less +0 -15
  236. package/test/less-bom/import/deeper/deeper-2/url-import-2.less +0 -3
  237. package/test/less-bom/import/deeper/deeper-2/url-import.less +0 -1
  238. package/test/less-bom/import/deeper/import-once-test-a.less +0 -1
  239. package/test/less-bom/import/deeper/url-import.less +0 -1
  240. package/test/less-bom/import/import-and-relative-paths-test.less +0 -17
  241. package/test/less-bom/import/import-charset-test.less +0 -1
  242. package/test/less-bom/import/import-interpolation.less +0 -2
  243. package/test/less-bom/import/import-interpolation2.less +0 -5
  244. package/test/less-bom/import/import-once-test-c.less +0 -6
  245. package/test/less-bom/import/import-reference.less +0 -89
  246. package/test/less-bom/import/import-test-a.less +0 -4
  247. package/test/less-bom/import/import-test-b.less +0 -8
  248. package/test/less-bom/import/import-test-c.less +0 -6
  249. package/test/less-bom/import/import-test-d.css +0 -1
  250. package/test/less-bom/import/import-test-e.less +0 -2
  251. package/test/less-bom/import/import-test-f.less +0 -5
  252. package/test/less-bom/import/imports/font.less +0 -8
  253. package/test/less-bom/import/imports/logo.less +0 -5
  254. package/test/less-bom/import/interpolation-vars.less +0 -6
  255. package/test/less-bom/import/invalid-css.less +0 -1
  256. package/test/less-bom/import/urls.less +0 -1
  257. package/test/less-bom/import-inline.less +0 -3
  258. package/test/less-bom/import-interpolation.less +0 -8
  259. package/test/less-bom/import-once.less +0 -6
  260. package/test/less-bom/import-reference.less +0 -23
  261. package/test/less-bom/import.less +0 -30
  262. package/test/less-bom/include-path/include-path.less +0 -6
  263. package/test/less-bom/javascript.less +0 -38
  264. package/test/less-bom/lazy-eval.less +0 -6
  265. package/test/less-bom/legacy/legacy.less +0 -7
  266. package/test/less-bom/media.less +0 -234
  267. package/test/less-bom/merge.less +0 -78
  268. package/test/less-bom/mixins-args.less +0 -215
  269. package/test/less-bom/mixins-closure.less +0 -26
  270. package/test/less-bom/mixins-guards-default-func.less +0 -195
  271. package/test/less-bom/mixins-guards.less +0 -271
  272. package/test/less-bom/mixins-important.less +0 -37
  273. package/test/less-bom/mixins-interpolated.less +0 -75
  274. package/test/less-bom/mixins-named-args.less +0 -36
  275. package/test/less-bom/mixins-nested.less +0 -22
  276. package/test/less-bom/mixins-pattern.less +0 -102
  277. package/test/less-bom/mixins.less +0 -145
  278. package/test/less-bom/modifyVars/extended.json +0 -5
  279. package/test/less-bom/modifyVars/extended.less +0 -11
  280. package/test/less-bom/nested-gradient-with-svg-gradient/mixin-consumer.less +0 -5
  281. package/test/less-bom/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +0 -15
  282. package/test/less-bom/no-js-errors/no-js-errors.less +0 -3
  283. package/test/less-bom/no-js-errors/no-js-errors.txt +0 -4
  284. package/test/less-bom/no-output.less +0 -2
  285. package/test/less-bom/operations.less +0 -62
  286. package/test/less-bom/parens.less +0 -45
  287. package/test/less-bom/property-name-interp.less +0 -56
  288. package/test/less-bom/rulesets.less +0 -30
  289. package/test/less-bom/scope.less +0 -104
  290. package/test/less-bom/selectors.less +0 -174
  291. package/test/less-bom/sourcemaps/basic.json +0 -3
  292. package/test/less-bom/sourcemaps/basic.less +0 -27
  293. package/test/less-bom/sourcemaps/imported.css +0 -7
  294. package/test/less-bom/static-urls/urls.less +0 -33
  295. package/test/less-bom/strict-units/strict-units.less +0 -4
  296. package/test/less-bom/strings.less +0 -73
  297. package/test/less-bom/url-args/urls.less +0 -63
  298. package/test/less-bom/urls.less +0 -94
  299. package/test/less-bom/variables-in-at-rules.less +0 -20
  300. package/test/less-bom/variables.less +0 -119
  301. package/test/less-bom/whitespace.less +0 -44
@@ -4,7 +4,7 @@ module.exports = contexts;
4
4
  var copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {
5
5
  if (!original) { return; }
6
6
 
7
- for(var i = 0; i < propertiesToCopy.length; i++) {
7
+ for (var i = 0; i < propertiesToCopy.length; i++) {
8
8
  if (original.hasOwnProperty(propertiesToCopy[i])) {
9
9
  destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];
10
10
  }
@@ -77,7 +77,7 @@ contexts.Eval.prototype.isMathOn = function () {
77
77
  };
78
78
 
79
79
  contexts.Eval.prototype.isPathRelative = function (path) {
80
- return !/^(?:[a-z-]+:|\/)/i.test(path);
80
+ return !/^(?:[a-z-]+:|\/|#)/i.test(path);
81
81
  };
82
82
 
83
83
  contexts.Eval.prototype.normalizePath = function( path ) {
@@ -29,7 +29,7 @@ abstractFileManager.prototype.alwaysMakePathsAbsolute = function() {
29
29
  };
30
30
 
31
31
  abstractFileManager.prototype.isPathAbsolute = function(filename) {
32
- return (/^(?:[a-z-]+:|\/|\\)/i).test(filename);
32
+ return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename);
33
33
  };
34
34
 
35
35
  abstractFileManager.prototype.join = function(basePath, laterPath) {
@@ -48,15 +48,15 @@ abstractFileManager.prototype.pathDiff = function pathDiff(url, baseUrl) {
48
48
  return "";
49
49
  }
50
50
  max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);
51
- for(i = 0; i < max; i++) {
51
+ for (i = 0; i < max; i++) {
52
52
  if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }
53
53
  }
54
54
  baseUrlDirectories = baseUrlParts.directories.slice(i);
55
55
  urlDirectories = urlParts.directories.slice(i);
56
- for(i = 0; i < baseUrlDirectories.length - 1; i++) {
56
+ for (i = 0; i < baseUrlDirectories.length - 1; i++) {
57
57
  diff += "../";
58
58
  }
59
- for(i = 0; i < urlDirectories.length - 1; i++) {
59
+ for (i = 0; i < urlDirectories.length - 1; i++) {
60
60
  diff += urlDirectories[i] + "/";
61
61
  }
62
62
  return diff;
@@ -93,14 +93,14 @@ abstractFileManager.prototype.extractUrlParts = function extractUrlParts(url, ba
93
93
  directories = urlParts[3].replace(/\\/g, "/").split("/");
94
94
 
95
95
  // extract out . before .. so .. doesn't absorb a non-directory
96
- for(i = 0; i < directories.length; i++) {
96
+ for (i = 0; i < directories.length; i++) {
97
97
  if (directories[i] === ".") {
98
98
  directories.splice(i, 1);
99
99
  i -= 1;
100
100
  }
101
101
  }
102
102
 
103
- for(i = 0; i < directories.length; i++) {
103
+ for (i = 0; i < directories.length; i++) {
104
104
  if (directories[i] === ".." && i > 0) {
105
105
  directories.splice(i - 1, 2);
106
106
  i -= 2;
@@ -7,7 +7,7 @@ var environment = function(externalEnvironment, fileManagers) {
7
7
  requiredFunctions = [],
8
8
  functions = requiredFunctions.concat(optionalFunctions);
9
9
 
10
- for(var i = 0; i < functions.length; i++) {
10
+ for (var i = 0; i < functions.length; i++) {
11
11
  var propName = functions[i],
12
12
  environmentFunc = externalEnvironment[propName];
13
13
  if (environmentFunc) {
@@ -31,7 +31,7 @@ environment.prototype.getFileManager = function (filename, currentDirectory, opt
31
31
  if (options.pluginManager) {
32
32
  fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());
33
33
  }
34
- for(var i = fileManagers.length - 1; i >= 0 ; i--) {
34
+ for (var i = fileManagers.length - 1; i >= 0 ; i--) {
35
35
  var fileManager = fileManagers[i];
36
36
  if (fileManager[isSync ? "supportsSync" : "supports"](filename, currentDirectory, options, environment)) {
37
37
  return fileManager;
@@ -14,7 +14,7 @@ function hsla(color) {
14
14
  function number(n) {
15
15
  if (n instanceof Dimension) {
16
16
  return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);
17
- } else if (typeof(n) === 'number') {
17
+ } else if (typeof n === 'number') {
18
18
  return n;
19
19
  } else {
20
20
  throw {
@@ -45,10 +45,18 @@ colorFunctions = {
45
45
  hsla: function (h, s, l, a) {
46
46
  function hue(h) {
47
47
  h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);
48
- if (h * 6 < 1) { return m1 + (m2 - m1) * h * 6; }
49
- else if (h * 2 < 1) { return m2; }
50
- else if (h * 3 < 2) { return m1 + (m2 - m1) * (2 / 3 - h) * 6; }
51
- else { return m1; }
48
+ if (h * 6 < 1) {
49
+ return m1 + (m2 - m1) * h * 6;
50
+ }
51
+ else if (h * 2 < 1) {
52
+ return m2;
53
+ }
54
+ else if (h * 3 < 2) {
55
+ return m1 + (m2 - m1) * (2 / 3 - h) * 6;
56
+ }
57
+ else {
58
+ return m1;
59
+ }
52
60
  }
53
61
 
54
62
  h = (number(h) % 360) / 360;
@@ -34,7 +34,7 @@ for (var f in mathFunctions) {
34
34
  }
35
35
 
36
36
  mathFunctions.round = function (n, f) {
37
- var fraction = typeof(f) === "undefined" ? 0 : f.value;
37
+ var fraction = typeof f === "undefined" ? 0 : f.value;
38
38
  return _math(function(num) { return num.toFixed(fraction); }, null, n);
39
39
  };
40
40
 
@@ -14,7 +14,7 @@ var minMax = function (isMin, args) {
14
14
  for (i = 0; i < args.length; i++) {
15
15
  current = args[i];
16
16
  if (!(current instanceof Dimension)) {
17
- if(Array.isArray(args[i].value)) {
17
+ if (Array.isArray(args[i].value)) {
18
18
  Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));
19
19
  }
20
20
  continue;
@@ -25,7 +25,7 @@ var minMax = function (isMin, args) {
25
25
  unitClone = unit !== "" && unitClone === undefined ? current.unit.toString() : unitClone;
26
26
  j = values[""] !== undefined && unit !== "" && unit === unitStatic ? values[""] : values[unit];
27
27
  if (j === undefined) {
28
- if(unitStatic !== undefined && unit !== unitStatic) {
28
+ if (unitStatic !== undefined && unit !== unitStatic) {
29
29
  throw{ type: "Argument", message: "incompatible types" };
30
30
  }
31
31
  values[unit] = order.length;
@@ -9,7 +9,7 @@ var Keyword = require("../tree/keyword"),
9
9
  functionRegistry = require("./function-registry");
10
10
 
11
11
  var isa = function (n, Type) {
12
- return (n instanceof Type) ? Keyword.True : Keyword.False;
12
+ return (n instanceof Type) ? Keyword.True : Keyword.False;
13
13
  },
14
14
  isunit = function (n, unit) {
15
15
  if (unit === undefined) {
@@ -20,6 +20,19 @@ var isa = function (n, Type) {
20
20
  throw { type: "Argument", message: "Second argument to isunit should be a unit or a string." };
21
21
  }
22
22
  return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;
23
+ },
24
+ getItemsFromNode = function(node) {
25
+ // handle non-array values as an array of length 1
26
+ // return 'undefined' if index is invalid
27
+ var items = Array.isArray(node.value) ?
28
+ node.value : Array(node);
29
+
30
+ return items.filter(function(item) {
31
+ if (item.type === "Comment") {
32
+ return false;
33
+ }
34
+ return true;
35
+ });
23
36
  };
24
37
  functionRegistry.addMultiple({
25
38
  isruleset: function (n) {
@@ -51,7 +64,7 @@ functionRegistry.addMultiple({
51
64
  },
52
65
  isunit: isunit,
53
66
  unit: function (val, unit) {
54
- if(!(val instanceof Dimension)) {
67
+ if (!(val instanceof Dimension)) {
55
68
  throw { type: "Argument",
56
69
  message: "the first argument to unit must be a number" +
57
70
  (val instanceof Operation ? ". Have you forgotten parenthesis?" : "") };
@@ -72,13 +85,10 @@ functionRegistry.addMultiple({
72
85
  },
73
86
  extract: function(values, index) {
74
87
  index = index.value - 1; // (1-based index)
75
- // handle non-array values as an array of length 1
76
- // return 'undefined' if index is invalid
77
- return Array.isArray(values.value) ?
78
- values.value[index] : Array(values)[index];
88
+
89
+ return getItemsFromNode(values)[index];
79
90
  },
80
91
  length: function(values) {
81
- var n = Array.isArray(values.value) ? values.value.length : 1;
82
- return new Dimension(n);
92
+ return new Dimension(getItemsFromNode(values).length);
83
93
  }
84
94
  });
@@ -41,12 +41,12 @@ module.exports = function(environment) {
41
41
 
42
42
  var importedEqualsRoot = fullPath === importManager.rootFilename;
43
43
  if (importOptions.optional && e) {
44
- callback(null, {rules:[]}, false, null);
44
+ callback(null, {rules:[]}, false, null);
45
45
  }
46
46
  else {
47
- importManager.files[fullPath] = root;
48
- if (e && !importManager.error) { importManager.error = e; }
49
- callback(e, root, importedEqualsRoot, fullPath);
47
+ importManager.files[fullPath] = root;
48
+ if (e && !importManager.error) { importManager.error = e; }
49
+ callback(e, root, importedEqualsRoot, fullPath);
50
50
  }
51
51
  };
52
52
 
@@ -81,7 +81,7 @@ module.exports = function(environment) {
81
81
  // - If path of imported file is '../mixins.less' and rootpath is 'less/',
82
82
  // then rootpath should become 'less/../'
83
83
  newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);
84
- if(newFileInfo.relativeUrls) {
84
+ if (newFileInfo.relativeUrls) {
85
85
  newFileInfo.rootpath = fileManager.join(
86
86
  (importManager.context.rootpath || ""),
87
87
  fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));
package/lib/less/index.js CHANGED
@@ -2,7 +2,7 @@ module.exports = function(environment, fileManagers) {
2
2
  var SourceMapOutput, SourceMapBuilder, ParseTree, ImportManager, Environment;
3
3
 
4
4
  var less = {
5
- version: [2, 3, 1],
5
+ version: [2, 4, 0],
6
6
  data: require('./data'),
7
7
  tree: require('./tree'),
8
8
  Environment: (Environment = require("./environment/environment")),
@@ -17,7 +17,7 @@ var LessError = module.exports = function LessError(e, importManager, currentFil
17
17
  this.type = e.type || 'Syntax';
18
18
  this.filename = filename;
19
19
  this.index = e.index;
20
- this.line = typeof(line) === 'number' ? line + 1 : null;
20
+ this.line = typeof line === 'number' ? line + 1 : null;
21
21
  this.callLine = callLine + 1;
22
22
  this.callExtract = lines[callLine];
23
23
  this.column = col;
@@ -15,7 +15,7 @@ module.exports = {
15
15
  this._listeners.push(listener);
16
16
  },
17
17
  removeListener: function(listener) {
18
- for(var i = 0; i < this._listeners.length; i++) {
18
+ for (var i = 0; i < this._listeners.length; i++) {
19
19
  if (this._listeners[i] === listener) {
20
20
  this._listeners.splice(i, 1);
21
21
  return;
@@ -23,7 +23,7 @@ module.exports = {
23
23
  }
24
24
  },
25
25
  _fireEvent: function(type, msg) {
26
- for(var i = 0; i < this._listeners.length; i++) {
26
+ for (var i = 0; i < this._listeners.length; i++) {
27
27
  var logFunction = this._listeners[i][type];
28
28
  if (logFunction) {
29
29
  logFunction(msg);
@@ -3,58 +3,58 @@ var LessError = require('./less-error'),
3
3
  logger = require("./logger");
4
4
 
5
5
  module.exports = function(SourceMapBuilder) {
6
- var ParseTree = function(root, imports) {
7
- this.root = root;
8
- this.imports = imports;
9
- };
10
-
11
- ParseTree.prototype.toCSS = function(options) {
12
- var evaldRoot, result = {}, sourceMapBuilder;
13
- try {
14
- evaldRoot = transformTree(this.root, options);
15
- } catch (e) {
16
- throw new LessError(e, this.imports);
17
- }
6
+ var ParseTree = function(root, imports) {
7
+ this.root = root;
8
+ this.imports = imports;
9
+ };
18
10
 
19
- try {
20
- var compress = Boolean(options.compress);
21
- if (compress) {
22
- logger.warn("The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.");
11
+ ParseTree.prototype.toCSS = function(options) {
12
+ var evaldRoot, result = {}, sourceMapBuilder;
13
+ try {
14
+ evaldRoot = transformTree(this.root, options);
15
+ } catch (e) {
16
+ throw new LessError(e, this.imports);
23
17
  }
24
18
 
25
- var toCSSOptions = {
26
- compress: compress,
27
- dumpLineNumbers: options.dumpLineNumbers,
28
- strictUnits: Boolean(options.strictUnits),
29
- numPrecision: 8};
19
+ try {
20
+ var compress = Boolean(options.compress);
21
+ if (compress) {
22
+ logger.warn("The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.");
23
+ }
30
24
 
31
- if (options.sourceMap) {
32
- sourceMapBuilder = new SourceMapBuilder(options.sourceMap);
33
- result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);
34
- } else {
35
- result.css = evaldRoot.toCSS(toCSSOptions);
25
+ var toCSSOptions = {
26
+ compress: compress,
27
+ dumpLineNumbers: options.dumpLineNumbers,
28
+ strictUnits: Boolean(options.strictUnits),
29
+ numPrecision: 8};
30
+
31
+ if (options.sourceMap) {
32
+ sourceMapBuilder = new SourceMapBuilder(options.sourceMap);
33
+ result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);
34
+ } else {
35
+ result.css = evaldRoot.toCSS(toCSSOptions);
36
+ }
37
+ } catch (e) {
38
+ throw new LessError(e, this.imports);
36
39
  }
37
- } catch (e) {
38
- throw new LessError(e, this.imports);
39
- }
40
40
 
41
- if (options.pluginManager) {
42
- var postProcessors = options.pluginManager.getPostProcessors();
43
- for(var i = 0; i < postProcessors.length; i++) {
44
- result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports });
41
+ if (options.pluginManager) {
42
+ var postProcessors = options.pluginManager.getPostProcessors();
43
+ for (var i = 0; i < postProcessors.length; i++) {
44
+ result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports });
45
+ }
46
+ }
47
+ if (options.sourceMap) {
48
+ result.map = sourceMapBuilder.getExternalSourceMap();
45
49
  }
46
- }
47
- if (options.sourceMap) {
48
- result.map = sourceMapBuilder.getExternalSourceMap();
49
- }
50
50
 
51
- result.imports = [];
52
- for(var file in this.imports.files) {
53
- if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {
54
- result.imports.push(file);
51
+ result.imports = [];
52
+ for (var file in this.imports.files) {
53
+ if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {
54
+ result.imports.push(file);
55
+ }
55
56
  }
56
- }
57
- return result;
58
- };
59
- return ParseTree;
57
+ return result;
58
+ };
59
+ return ParseTree;
60
60
  };
package/lib/less/parse.js CHANGED
@@ -1,4 +1,4 @@
1
- var PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise,
1
+ var PromiseConstructor,
2
2
  contexts = require("./contexts"),
3
3
  Parser = require('./parser/parser'),
4
4
  PluginManager = require('./plugin-manager');
@@ -7,12 +7,15 @@ module.exports = function(environment, ParseTree, ImportManager) {
7
7
  var parse = function (input, options, callback) {
8
8
  options = options || {};
9
9
 
10
- if (typeof(options) === 'function') {
10
+ if (typeof options === 'function') {
11
11
  callback = options;
12
12
  options = {};
13
13
  }
14
14
 
15
15
  if (!callback) {
16
+ if (!PromiseConstructor) {
17
+ PromiseConstructor = typeof Promise === 'undefined' ? require('promise') : Promise;
18
+ }
16
19
  var self = this;
17
20
  return new PromiseConstructor(function (resolve, reject) {
18
21
  parse.call(self, input, options, function(err, output) {
@@ -73,7 +73,7 @@ module.exports = function() {
73
73
  //
74
74
  skipWhitespace(length);
75
75
 
76
- if(typeof(match) === 'string') {
76
+ if (typeof match === 'string') {
77
77
  return match;
78
78
  } else {
79
79
  return match.length === 1 ? match[0] : match;
@@ -92,7 +92,7 @@ module.exports = function() {
92
92
  }
93
93
 
94
94
  skipWhitespace(m[0].length);
95
- if(typeof m === "string") {
95
+ if (typeof m === "string") {
96
96
  return m;
97
97
  }
98
98
 
@@ -185,7 +185,7 @@ module.exports = function() {
185
185
  // Same as $(), but don't change the state of the parser,
186
186
  // just return the match.
187
187
  parserInput.peek = function(tok) {
188
- if (typeof(tok) === 'string') {
188
+ if (typeof tok === 'string') {
189
189
  return input.charAt(parserInput.i) === tok;
190
190
  } else {
191
191
  return tok.test(current);
@@ -47,7 +47,7 @@ var Parser = function Parser(context, imports, fileInfo) {
47
47
  if (result) {
48
48
  return result;
49
49
  }
50
- error(msg || (typeof(arg) === 'string' ? "expected '" + arg + "' got '" + parserInput.currentChar() + "'"
50
+ error(msg || (typeof arg === 'string' ? "expected '" + arg + "' got '" + parserInput.currentChar() + "'"
51
51
  : "unexpected token"));
52
52
  }
53
53
 
@@ -92,17 +92,26 @@ var Parser = function Parser(context, imports, fileInfo) {
92
92
  // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply
93
93
  //
94
94
  parse: function (str, callback, additionalData) {
95
- var root, error = null, globalVars, modifyVars, preText = "";
95
+ var root, error = null, globalVars, modifyVars, ignored, preText = "";
96
96
 
97
97
  globalVars = (additionalData && additionalData.globalVars) ? Parser.serializeVars(additionalData.globalVars) + '\n' : '';
98
98
  modifyVars = (additionalData && additionalData.modifyVars) ? '\n' + Parser.serializeVars(additionalData.modifyVars) : '';
99
99
 
100
+ if (context.pluginManager) {
101
+ var preProcessors = context.pluginManager.getPreProcessors();
102
+ for (var i = 0; i < preProcessors.length; i++) {
103
+ str = preProcessors[i].process(str, { context: context, imports: imports, fileInfo: fileInfo });
104
+ }
105
+ }
106
+
100
107
  if (globalVars || (additionalData && additionalData.banner)) {
101
108
  preText = ((additionalData && additionalData.banner) ? additionalData.banner : "") + globalVars;
102
- imports.contentsIgnoredChars[fileInfo.filename] = preText.length;
109
+ ignored = imports.contentsIgnoredChars;
110
+ ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;
111
+ ignored[fileInfo.filename] += preText.length;
103
112
  }
104
113
 
105
- str = str.replace(/\r\n/g, '\n');
114
+ str = str.replace(/\r\n?/g, '\n');
106
115
  // Remove potential UTF Byte Order Mark
107
116
  str = preText + str.replace(/^\uFEFF/, '') + modifyVars;
108
117
  imports.contents[fileInfo.filename] = str;
@@ -233,7 +242,7 @@ var Parser = function Parser(context, imports, fileInfo) {
233
242
 
234
243
  while (true)
235
244
  {
236
- while(true) {
245
+ while (true) {
237
246
  node = this.comment();
238
247
  if (!node) { break; }
239
248
  root.push(node);
@@ -332,7 +341,7 @@ var Parser = function Parser(context, imports, fileInfo) {
332
341
 
333
342
  if (nameLC === 'alpha') {
334
343
  alpha = parsers.alpha();
335
- if(alpha) {
344
+ if (alpha) {
336
345
  return alpha;
337
346
  }
338
347
  }
@@ -547,8 +556,14 @@ var Parser = function Parser(context, imports, fileInfo) {
547
556
  elements = null;
548
557
  while (! (option = parserInput.$re(/^(all)(?=\s*(\)|,))/))) {
549
558
  e = this.element();
550
- if (!e) { break; }
551
- if (elements) { elements.push(e); } else { elements = [ e ]; }
559
+ if (!e) {
560
+ break;
561
+ }
562
+ if (elements) {
563
+ elements.push(e);
564
+ } else {
565
+ elements = [ e ];
566
+ }
552
567
  }
553
568
 
554
569
  option = option && option[1];
@@ -556,9 +571,12 @@ var Parser = function Parser(context, imports, fileInfo) {
556
571
  error("Missing target selector for :extend().");
557
572
  }
558
573
  extend = new(tree.Extend)(new(tree.Selector)(elements), option, index);
559
- if (extendList) { extendList.push(extend); } else { extendList = [ extend ]; }
560
-
561
- } while(parserInput.$char(","));
574
+ if (extendList) {
575
+ extendList.push(extend);
576
+ } else {
577
+ extendList = [ extend ];
578
+ }
579
+ } while (parserInput.$char(","));
562
580
 
563
581
  expect(/^\)/);
564
582
 
@@ -606,7 +624,11 @@ var Parser = function Parser(context, imports, fileInfo) {
606
624
  break;
607
625
  }
608
626
  elem = new(tree.Element)(c, e, elemIndex, fileInfo);
609
- if (elements) { elements.push(elem); } else { elements = [ elem ]; }
627
+ if (elements) {
628
+ elements.push(elem);
629
+ } else {
630
+ elements = [ elem ];
631
+ }
610
632
  c = parserInput.$char('>');
611
633
  }
612
634
 
@@ -947,11 +969,19 @@ var Parser = function Parser(context, imports, fileInfo) {
947
969
  } else if (condition) {
948
970
  error("CSS guard can only be used at the end of selector");
949
971
  } else if (extendList) {
950
- if (allExtends) { allExtends = allExtends.concat(extendList); } else { allExtends = extendList; }
972
+ if (allExtends) {
973
+ allExtends = allExtends.concat(extendList);
974
+ } else {
975
+ allExtends = extendList;
976
+ }
951
977
  } else {
952
978
  if (allExtends) { error("Extend can only be used at the end of selector"); }
953
979
  c = parserInput.currentChar();
954
- if (elements) { elements.push(e); } else { elements = [ e ]; }
980
+ if (elements) {
981
+ elements.push(e);
982
+ } else {
983
+ elements = [ e ];
984
+ }
955
985
  e = null;
956
986
  }
957
987
  if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {
@@ -1026,7 +1056,11 @@ var Parser = function Parser(context, imports, fileInfo) {
1026
1056
  if (!s) {
1027
1057
  break;
1028
1058
  }
1029
- if (selectors) { selectors.push(s); } else { selectors = [ s ]; }
1059
+ if (selectors) {
1060
+ selectors.push(s);
1061
+ } else {
1062
+ selectors = [ s ];
1063
+ }
1030
1064
  parserInput.commentStore.length = 0;
1031
1065
  if (s.condition && selectors.length > 1) {
1032
1066
  error("Guards are only currently allowed on a single selector.");
@@ -1163,11 +1197,11 @@ var Parser = function Parser(context, imports, fileInfo) {
1163
1197
  case "css":
1164
1198
  optionName = "less";
1165
1199
  value = false;
1166
- break;
1200
+ break;
1167
1201
  case "once":
1168
1202
  optionName = "multiple";
1169
1203
  value = false;
1170
- break;
1204
+ break;
1171
1205
  }
1172
1206
  options[optionName] = value;
1173
1207
  if (! parserInput.$char(',')) { break; }
@@ -1378,7 +1412,7 @@ var Parser = function Parser(context, imports, fileInfo) {
1378
1412
  expressions.push(e);
1379
1413
  if (! parserInput.$char(',')) { break; }
1380
1414
  }
1381
- } while(e);
1415
+ } while (e);
1382
1416
 
1383
1417
  if (expressions.length > 0) {
1384
1418
  return new(tree.Value)(expressions);
@@ -4,6 +4,7 @@
4
4
  var PluginManager = function(less) {
5
5
  this.less = less;
6
6
  this.visitors = [];
7
+ this.preProcessors = [];
7
8
  this.postProcessors = [];
8
9
  this.installedPlugins = [];
9
10
  this.fileManagers = [];
@@ -14,7 +15,7 @@ var PluginManager = function(less) {
14
15
  */
15
16
  PluginManager.prototype.addPlugins = function(plugins) {
16
17
  if (plugins) {
17
- for(var i = 0;i < plugins.length; i++) {
18
+ for (var i = 0; i < plugins.length; i++) {
18
19
  this.addPlugin(plugins[i]);
19
20
  }
20
21
  }
@@ -35,6 +36,20 @@ PluginManager.prototype.addPlugin = function(plugin) {
35
36
  PluginManager.prototype.addVisitor = function(visitor) {
36
37
  this.visitors.push(visitor);
37
38
  };
39
+ /**
40
+ * Adds a pre processor object
41
+ * @param {object} preProcessor
42
+ * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import
43
+ */
44
+ PluginManager.prototype.addPreProcessor = function(preProcessor, priority) {
45
+ var indexToInsertAt;
46
+ for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {
47
+ if (this.preProcessors[indexToInsertAt].priority >= priority) {
48
+ break;
49
+ }
50
+ }
51
+ this.preProcessors.splice(indexToInsertAt, 0, {preProcessor: preProcessor, priority: priority});
52
+ };
38
53
  /**
39
54
  * Adds a post processor object
40
55
  * @param {object} postProcessor
@@ -42,7 +57,7 @@ PluginManager.prototype.addVisitor = function(visitor) {
42
57
  */
43
58
  PluginManager.prototype.addPostProcessor = function(postProcessor, priority) {
44
59
  var indexToInsertAt;
45
- for(indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {
60
+ for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {
46
61
  if (this.postProcessors[indexToInsertAt].priority >= priority) {
47
62
  break;
48
63
  }
@@ -56,6 +71,18 @@ PluginManager.prototype.addPostProcessor = function(postProcessor, priority) {
56
71
  PluginManager.prototype.addFileManager = function(manager) {
57
72
  this.fileManagers.push(manager);
58
73
  };
74
+ /**
75
+ *
76
+ * @returns {Array}
77
+ * @private
78
+ */
79
+ PluginManager.prototype.getPreProcessors = function() {
80
+ var preProcessors = [];
81
+ for (var i = 0; i < this.preProcessors.length; i++) {
82
+ preProcessors.push(this.preProcessors[i].preProcessor);
83
+ }
84
+ return preProcessors;
85
+ };
59
86
  /**
60
87
  *
61
88
  * @returns {Array}
@@ -63,7 +90,7 @@ PluginManager.prototype.addFileManager = function(manager) {
63
90
  */
64
91
  PluginManager.prototype.getPostProcessors = function() {
65
92
  var postProcessors = [];
66
- for(var i = 0; i < this.postProcessors.length; i++) {
93
+ for (var i = 0; i < this.postProcessors.length; i++) {
67
94
  postProcessors.push(this.postProcessors[i].postProcessor);
68
95
  }
69
96
  return postProcessors;