less 2.4.0 → 2.5.3

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 (405) hide show
  1. package/.idea/jsLibraryMappings.xml +7 -7
  2. package/.idea/less.js.iml +9 -16
  3. package/.idea/libraries/less_js_node_modules.xml +14 -0
  4. package/.idea/misc.xml +14 -5
  5. package/.idea/modules.xml +8 -9
  6. package/.idea/vcs.xml +6 -7
  7. package/.idea/workspace.xml +592 -806
  8. package/.jscsrc +72 -72
  9. package/.travis.yml +1 -0
  10. package/CHANGELOG.md +54 -8
  11. package/Gruntfile.js +40 -13
  12. package/README.md +2 -0
  13. package/appveyor.yml +0 -6
  14. package/bin/lessc +22 -24
  15. package/bower.json +1 -2
  16. package/dist/less-rolledup.js +8572 -0
  17. package/dist/less.js +807 -401
  18. package/dist/less.min.js +9 -8
  19. package/lib/less/contexts.js +2 -0
  20. package/lib/less/environment/abstract-file-manager.js +5 -1
  21. package/lib/less/functions/color.js +46 -12
  22. package/lib/less/functions/function-caller.js +31 -2
  23. package/lib/less/functions/function-registry.js +28 -17
  24. package/lib/less/functions/math-helper.js +16 -0
  25. package/lib/less/functions/math.js +4 -16
  26. package/lib/less/functions/number.js +7 -2
  27. package/lib/less/functions/string.js +5 -3
  28. package/lib/less/functions/svg.js +19 -11
  29. package/lib/less/functions/types.js +1 -6
  30. package/lib/less/import-manager.js +8 -3
  31. package/lib/less/index.js +1 -1
  32. package/lib/less/parser/parser-input.js +55 -54
  33. package/lib/less/parser/parser.js +168 -52
  34. package/lib/less/plugins/function-importer.js +35 -0
  35. package/lib/less/source-map-output.js +1 -2
  36. package/lib/less/tree/anonymous.js +10 -2
  37. package/lib/less/tree/color.js +4 -1
  38. package/lib/less/tree/comment.js +0 -3
  39. package/lib/less/tree/dimension.js +5 -3
  40. package/lib/less/tree/directive.js +40 -15
  41. package/lib/less/tree/expression.js +5 -0
  42. package/lib/less/tree/import.js +22 -10
  43. package/lib/less/tree/media.js +3 -23
  44. package/lib/less/tree/mixin-call.js +17 -7
  45. package/lib/less/tree/mixin-definition.js +20 -6
  46. package/lib/less/tree/rule.js +19 -1
  47. package/lib/less/tree/ruleset.js +40 -27
  48. package/lib/less/tree/selector.js +8 -1
  49. package/lib/less/visitors/extend-visitor.js +1 -4
  50. package/lib/less/visitors/import-visitor.js +17 -2
  51. package/lib/less/visitors/join-selector-visitor.js +6 -0
  52. package/lib/less/visitors/to-css-visitor.js +48 -14
  53. package/lib/less-browser/bootstrap.js +5 -6
  54. package/lib/less-browser/index.js +20 -12
  55. package/lib/less-node/image-size.js +54 -31
  56. package/lib/less-node/index.js +1 -1
  57. package/lib/less-node/lessc-helper.js +2 -2
  58. package/lib/less-rhino/index.js +12 -8
  59. package/package.json +9 -13
  60. package/test/browser/less/urls.less +7 -1
  61. package/test/browser/less.js +30 -0
  62. package/test/browser/runner-VisitorPlugin-options.js +3 -0
  63. package/test/browser/runner-VisitorPlugin.js +3 -0
  64. package/test/browser/runner-filemanagerPlugin-options.js +4 -0
  65. package/test/browser/runner-filemanagerPlugin.js +3 -0
  66. package/test/browser/runner-global-vars-options.js +2 -1
  67. package/test/browser/runner-main-options.js +11 -11
  68. package/test/browser/runner-postProcessor.js +1 -1
  69. package/test/browser/runner-postProcessorPlugin-options.js +3 -0
  70. package/test/browser/runner-postProcessorPlugin.js +3 -0
  71. package/test/browser/runner-preProcessorPlugin-options.js +3 -0
  72. package/test/browser/runner-preProcessorPlugin.js +3 -0
  73. package/test/css/comments2.css +1 -1
  74. package/test/css/compression/compression.css +1 -1
  75. package/test/css/detached-rulesets.css +5 -0
  76. package/test/css/directives-bubling.css +119 -0
  77. package/test/css/extract-and-length.css +1 -1
  78. package/test/css/filemanagerPlugin/filemanager.css +3 -0
  79. package/test/css/functions.css +17 -1
  80. package/test/css/import-reference.css +5 -1
  81. package/test/css/import.css +4 -0
  82. package/test/css/include-path/include-path.css +4 -1
  83. package/test/css/include-path-string/include-path-string.css +3 -0
  84. package/test/css/legacy/legacy.css +14 -0
  85. package/test/css/media.css +0 -1
  86. package/test/css/mixins-args.css +51 -1
  87. package/test/css/plugin.css +44 -0
  88. package/test/css/postProcessorPlugin/postProcessor.css +4 -0
  89. package/test/css/preProcessorPlugin/preProcessor.css +3 -0
  90. package/test/css/scope.css +1 -1
  91. package/test/css/strings.css +1 -1
  92. package/test/css/url-args/urls.css +5 -5
  93. package/test/css/urls.css +8 -8
  94. package/test/css/variables.css +5 -5
  95. package/test/css/visitorPlugin/visitor.css +3 -0
  96. package/test/data/image.jpg +0 -0
  97. package/test/data/image.svg +2 -1
  98. package/test/data/page.html +1 -1
  99. package/test/index.js +5 -0
  100. package/test/less/detached-rulesets.less +9 -0
  101. package/test/less/directives-bubling.less +142 -0
  102. package/test/less/errors/at-rules-undefined-var.txt +4 -4
  103. package/test/less/errors/css-guard-default-func.txt +4 -4
  104. package/test/less/errors/javascript-undefined-var.txt +4 -4
  105. package/test/less/errors/mixins-guards-default-func-1.txt +4 -4
  106. package/test/less/errors/mixins-guards-default-func-2.txt +4 -4
  107. package/test/less/errors/mixins-guards-default-func-3.txt +4 -4
  108. package/test/less/errors/{parse-error-extra-parens.less → parse-error-media-no-block-1.less} +0 -0
  109. package/test/less/errors/parse-error-media-no-block-1.txt +3 -0
  110. package/test/less/errors/parse-error-media-no-block-2.less +1 -0
  111. package/test/less/errors/parse-error-media-no-block-2.txt +2 -0
  112. package/test/less/errors/parse-error-media-no-block-3.less +4 -0
  113. package/test/less/errors/parse-error-media-no-block-3.txt +3 -0
  114. package/test/less/errors/percentage-non-number-argument.less +3 -0
  115. package/test/less/errors/percentage-non-number-argument.txt +4 -0
  116. package/test/less/errors/property-interp-not-defined.txt +2 -2
  117. package/test/less/errors/svg-gradient2.txt +1 -1
  118. package/test/less/errors/svg-gradient3.txt +1 -1
  119. package/test/less/errors/svg-gradient4.less +4 -0
  120. package/test/less/errors/svg-gradient4.txt +4 -0
  121. package/test/less/errors/svg-gradient5.less +4 -0
  122. package/test/less/errors/svg-gradient5.txt +4 -0
  123. package/test/less/errors/svg-gradient6.less +4 -0
  124. package/test/less/errors/svg-gradient6.txt +4 -0
  125. package/test/less/filemanagerPlugin/colors.test +1 -0
  126. package/test/less/filemanagerPlugin/filemanager.less +4 -0
  127. package/test/less/functions.less +20 -2
  128. package/test/less/import/css-import.less +1 -0
  129. package/test/less/import/import-inline-invalid-css.less +1 -0
  130. package/test/less/import/import-reference.less +10 -1
  131. package/test/less/import/import-test-a.less +1 -0
  132. package/test/less/import-reference.less +4 -1
  133. package/test/less/import.less +1 -0
  134. package/test/less/include-path/include-path.less +3 -1
  135. package/test/less/include-path-string/include-path-string.less +3 -0
  136. package/test/less/legacy/legacy.less +14 -0
  137. package/test/less/mixins-args.less +48 -0
  138. package/test/less/mixins-guards.less +9 -0
  139. package/test/less/no-output.less +1 -1
  140. package/test/less/plugin/plugin-global.js +9 -0
  141. package/test/less/plugin/plugin-local.js +8 -0
  142. package/test/less/plugin/plugin-transitive.js +5 -0
  143. package/test/less/plugin/plugin-transitive.less +5 -0
  144. package/test/less/plugin.less +85 -0
  145. package/test/less/postProcessorPlugin/postProcessor.less +4 -0
  146. package/test/less/preProcessorPlugin/preProcessor.less +3 -0
  147. package/test/less/sourcemaps/imported.css +6 -6
  148. package/test/less/visitorPlugin/visitor.less +4 -0
  149. package/test/less-bom/charsets.less +3 -0
  150. package/test/less-bom/colors.less +98 -0
  151. package/test/less-bom/comments.less +102 -0
  152. package/test/less-bom/comments2.less +20 -0
  153. package/test/less-bom/compression/compression.less +36 -0
  154. package/test/less-bom/css-3.less +154 -0
  155. package/test/less-bom/css-escapes.less +33 -0
  156. package/test/less-bom/css-guards.less +103 -0
  157. package/test/less-bom/css.less +108 -0
  158. package/test/less-bom/debug/import/test.less +25 -0
  159. package/test/less-bom/debug/linenumbers.less +33 -0
  160. package/test/less-bom/detached-rulesets.less +112 -0
  161. package/test/less-bom/directives-bubling.less +142 -0
  162. package/test/less-bom/empty.less +1 -0
  163. package/test/less-bom/errors/add-mixed-units.less +3 -0
  164. package/test/less-bom/errors/add-mixed-units.txt +4 -0
  165. package/test/less-bom/errors/add-mixed-units2.less +3 -0
  166. package/test/less-bom/errors/add-mixed-units2.txt +4 -0
  167. package/test/less-bom/errors/at-rules-undefined-var.less +4 -0
  168. package/test/less-bom/errors/at-rules-undefined-var.txt +4 -0
  169. package/test/less-bom/errors/bad-variable-declaration1.less +1 -0
  170. package/test/less-bom/errors/bad-variable-declaration1.txt +2 -0
  171. package/test/less-bom/errors/color-func-invalid-color.less +3 -0
  172. package/test/less-bom/errors/color-func-invalid-color.txt +4 -0
  173. package/test/less-bom/errors/color-invalid-hex-code.less +3 -0
  174. package/test/less-bom/errors/color-invalid-hex-code.txt +4 -0
  175. package/test/less-bom/errors/color-invalid-hex-code2.less +3 -0
  176. package/test/less-bom/errors/color-invalid-hex-code2.txt +4 -0
  177. package/test/less-bom/errors/css-guard-default-func.less +4 -0
  178. package/test/less-bom/errors/css-guard-default-func.txt +4 -0
  179. package/test/less-bom/errors/detached-ruleset-1.less +6 -0
  180. package/test/less-bom/errors/detached-ruleset-1.txt +4 -0
  181. package/test/less-bom/errors/detached-ruleset-2.less +6 -0
  182. package/test/less-bom/errors/detached-ruleset-2.txt +4 -0
  183. package/test/less-bom/errors/detached-ruleset-3.less +4 -0
  184. package/test/less-bom/errors/detached-ruleset-3.txt +4 -0
  185. package/test/less-bom/errors/detached-ruleset-5.less +4 -0
  186. package/test/less-bom/errors/detached-ruleset-5.txt +3 -0
  187. package/test/less-bom/errors/detached-ruleset-6.less +5 -0
  188. package/test/less-bom/errors/detached-ruleset-6.txt +4 -0
  189. package/test/less-bom/errors/divide-mixed-units.less +3 -0
  190. package/test/less-bom/errors/divide-mixed-units.txt +4 -0
  191. package/test/less-bom/errors/extend-no-selector.less +3 -0
  192. package/test/less-bom/errors/extend-no-selector.txt +3 -0
  193. package/test/less-bom/errors/extend-not-at-end.less +3 -0
  194. package/test/less-bom/errors/extend-not-at-end.txt +3 -0
  195. package/test/less-bom/errors/import-malformed.less +1 -0
  196. package/test/less-bom/errors/import-malformed.txt +3 -0
  197. package/test/less-bom/errors/import-missing.less +6 -0
  198. package/test/less-bom/errors/import-missing.txt +3 -0
  199. package/test/less-bom/errors/import-no-semi.less +1 -0
  200. package/test/less-bom/errors/import-no-semi.txt +2 -0
  201. package/test/less-bom/errors/import-subfolder1.less +1 -0
  202. package/test/less-bom/errors/import-subfolder1.txt +3 -0
  203. package/test/less-bom/errors/import-subfolder2.less +1 -0
  204. package/test/less-bom/errors/import-subfolder2.txt +4 -0
  205. package/test/less-bom/errors/imports/import-subfolder1.less +1 -0
  206. package/test/less-bom/errors/imports/import-subfolder2.less +1 -0
  207. package/test/less-bom/errors/imports/import-test.less +4 -0
  208. package/test/less-bom/errors/imports/subfolder/mixin-not-defined.less +1 -0
  209. package/test/less-bom/errors/imports/subfolder/parse-error-curly-bracket.less +1 -0
  210. package/test/less-bom/errors/javascript-error.less +3 -0
  211. package/test/less-bom/errors/javascript-error.txt +4 -0
  212. package/test/less-bom/errors/javascript-undefined-var.less +3 -0
  213. package/test/less-bom/errors/javascript-undefined-var.txt +4 -0
  214. package/test/less-bom/errors/mixed-mixin-definition-args-1.less +6 -0
  215. package/test/less-bom/errors/mixed-mixin-definition-args-1.txt +4 -0
  216. package/test/less-bom/errors/mixed-mixin-definition-args-2.less +6 -0
  217. package/test/less-bom/errors/mixed-mixin-definition-args-2.txt +4 -0
  218. package/test/less-bom/errors/mixin-not-defined.less +11 -0
  219. package/test/less-bom/errors/mixin-not-defined.txt +3 -0
  220. package/test/less-bom/errors/mixin-not-matched.less +6 -0
  221. package/test/less-bom/errors/mixin-not-matched.txt +3 -0
  222. package/test/less-bom/errors/mixin-not-matched2.less +6 -0
  223. package/test/less-bom/errors/mixin-not-matched2.txt +3 -0
  224. package/test/less-bom/errors/mixin-not-visible-in-scope-1.less +9 -0
  225. package/test/less-bom/errors/mixin-not-visible-in-scope-1.txt +4 -0
  226. package/test/less-bom/errors/mixins-guards-default-func-1.less +9 -0
  227. package/test/less-bom/errors/mixins-guards-default-func-1.txt +4 -0
  228. package/test/less-bom/errors/mixins-guards-default-func-2.less +9 -0
  229. package/test/less-bom/errors/mixins-guards-default-func-2.txt +4 -0
  230. package/test/less-bom/errors/mixins-guards-default-func-3.less +9 -0
  231. package/test/less-bom/errors/mixins-guards-default-func-3.txt +4 -0
  232. package/test/less-bom/errors/multiple-guards-on-css-selectors.less +4 -0
  233. package/test/less-bom/errors/multiple-guards-on-css-selectors.txt +4 -0
  234. package/test/less-bom/errors/multiple-guards-on-css-selectors2.less +4 -0
  235. package/test/less-bom/errors/multiple-guards-on-css-selectors2.txt +4 -0
  236. package/test/less-bom/errors/multiply-mixed-units.less +7 -0
  237. package/test/less-bom/errors/multiply-mixed-units.txt +4 -0
  238. package/test/less-bom/errors/parens-error-1.less +3 -0
  239. package/test/less-bom/errors/parens-error-1.txt +4 -0
  240. package/test/less-bom/errors/parens-error-2.less +3 -0
  241. package/test/less-bom/errors/parens-error-2.txt +4 -0
  242. package/test/less-bom/errors/parens-error-3.less +3 -0
  243. package/test/less-bom/errors/parens-error-3.txt +4 -0
  244. package/test/less-bom/errors/parse-error-curly-bracket.less +4 -0
  245. package/test/less-bom/errors/parse-error-curly-bracket.txt +4 -0
  246. package/test/less-bom/errors/parse-error-media-no-block-1.less +5 -0
  247. package/test/less-bom/errors/parse-error-media-no-block-1.txt +3 -0
  248. package/test/less-bom/errors/parse-error-media-no-block-2.less +1 -0
  249. package/test/less-bom/errors/parse-error-media-no-block-2.txt +2 -0
  250. package/test/less-bom/errors/parse-error-media-no-block-3.less +4 -0
  251. package/test/less-bom/errors/parse-error-media-no-block-3.txt +3 -0
  252. package/test/less-bom/errors/parse-error-missing-bracket.less +2 -0
  253. package/test/less-bom/errors/parse-error-missing-bracket.txt +3 -0
  254. package/test/less-bom/errors/parse-error-missing-parens.less +5 -0
  255. package/test/less-bom/errors/parse-error-missing-parens.txt +3 -0
  256. package/test/less-bom/errors/parse-error-with-import.less +13 -0
  257. package/test/less-bom/errors/parse-error-with-import.txt +4 -0
  258. package/test/less-bom/errors/percentage-missing-space.less +3 -0
  259. package/test/less-bom/errors/percentage-missing-space.txt +4 -0
  260. package/test/less-bom/errors/percentage-non-number-argument.less +3 -0
  261. package/test/less-bom/errors/percentage-non-number-argument.txt +4 -0
  262. package/test/less-bom/errors/property-asterisk-only-name.less +3 -0
  263. package/test/less-bom/errors/property-asterisk-only-name.txt +4 -0
  264. package/test/less-bom/errors/property-ie5-hack.less +3 -0
  265. package/test/less-bom/errors/property-ie5-hack.txt +3 -0
  266. package/test/less-bom/errors/property-in-root.less +4 -0
  267. package/test/less-bom/errors/property-in-root.txt +4 -0
  268. package/test/less-bom/errors/property-in-root2.less +1 -0
  269. package/test/less-bom/errors/property-in-root2.txt +4 -0
  270. package/test/less-bom/errors/property-in-root3.less +4 -0
  271. package/test/less-bom/errors/property-in-root3.txt +3 -0
  272. package/test/less-bom/errors/property-interp-not-defined.less +1 -0
  273. package/test/less-bom/errors/property-interp-not-defined.txt +2 -0
  274. package/test/less-bom/errors/recursive-variable.less +1 -0
  275. package/test/less-bom/errors/recursive-variable.txt +2 -0
  276. package/test/less-bom/errors/single-character.less +1 -0
  277. package/test/less-bom/errors/single-character.txt +2 -0
  278. package/test/less-bom/errors/svg-gradient1.less +3 -0
  279. package/test/less-bom/errors/svg-gradient1.txt +4 -0
  280. package/test/less-bom/errors/svg-gradient2.less +3 -0
  281. package/test/less-bom/errors/svg-gradient2.txt +4 -0
  282. package/test/less-bom/errors/svg-gradient3.less +3 -0
  283. package/test/less-bom/errors/svg-gradient3.txt +4 -0
  284. package/test/less-bom/errors/svg-gradient4.less +4 -0
  285. package/test/less-bom/errors/svg-gradient4.txt +4 -0
  286. package/test/less-bom/errors/svg-gradient5.less +4 -0
  287. package/test/less-bom/errors/svg-gradient5.txt +4 -0
  288. package/test/less-bom/errors/svg-gradient6.less +4 -0
  289. package/test/less-bom/errors/svg-gradient6.txt +4 -0
  290. package/test/less-bom/errors/unit-function.less +3 -0
  291. package/test/less-bom/errors/unit-function.txt +4 -0
  292. package/test/less-bom/extend-chaining.less +91 -0
  293. package/test/less-bom/extend-clearfix.less +19 -0
  294. package/test/less-bom/extend-exact.less +46 -0
  295. package/test/less-bom/extend-media.less +24 -0
  296. package/test/less-bom/extend-nest.less +65 -0
  297. package/test/less-bom/extend-selector.less +99 -0
  298. package/test/less-bom/extend.less +81 -0
  299. package/test/less-bom/extract-and-length.less +133 -0
  300. package/test/less-bom/filemanagerPlugin/colors.test +1 -0
  301. package/test/less-bom/filemanagerPlugin/filemanager.less +4 -0
  302. package/test/less-bom/functions.less +232 -0
  303. package/test/less-bom/globalVars/extended.json +5 -0
  304. package/test/less-bom/globalVars/extended.less +10 -0
  305. package/test/less-bom/globalVars/simple.json +3 -0
  306. package/test/less-bom/globalVars/simple.less +3 -0
  307. package/test/less-bom/ie-filters.less +15 -0
  308. package/test/less-bom/import/css-import.less +1 -0
  309. package/test/less-bom/import/deeper/deeper-2/url-import-2.less +3 -0
  310. package/test/less-bom/import/deeper/deeper-2/url-import.less +1 -0
  311. package/test/less-bom/import/deeper/import-once-test-a.less +1 -0
  312. package/test/less-bom/import/deeper/url-import.less +1 -0
  313. package/test/less-bom/import/import-and-relative-paths-test.less +17 -0
  314. package/test/less-bom/import/import-charset-test.less +1 -0
  315. package/test/less-bom/import/import-inline-invalid-css.less +1 -0
  316. package/test/less-bom/import/import-interpolation.less +2 -0
  317. package/test/less-bom/import/import-interpolation2.less +5 -0
  318. package/test/less-bom/import/import-once-test-c.less +6 -0
  319. package/test/less-bom/import/import-reference.less +98 -0
  320. package/test/less-bom/import/import-test-a.less +5 -0
  321. package/test/less-bom/import/import-test-b.less +8 -0
  322. package/test/less-bom/import/import-test-c.less +6 -0
  323. package/test/less-bom/import/import-test-d.css +1 -0
  324. package/test/less-bom/import/import-test-e.less +2 -0
  325. package/test/less-bom/import/import-test-f.less +5 -0
  326. package/test/less-bom/import/imports/font.less +8 -0
  327. package/test/less-bom/import/imports/logo.less +6 -0
  328. package/test/less-bom/import/interpolation-vars.less +6 -0
  329. package/test/less-bom/import/invalid-css.less +1 -0
  330. package/test/less-bom/import/urls.less +1 -0
  331. package/test/less-bom/import-inline.less +3 -0
  332. package/test/less-bom/import-interpolation.less +8 -0
  333. package/test/less-bom/import-once.less +6 -0
  334. package/test/less-bom/import-reference.less +26 -0
  335. package/test/less-bom/import.less +31 -0
  336. package/test/less-bom/include-path/include-path.less +8 -0
  337. package/test/less-bom/include-path-string/include-path-string.less +3 -0
  338. package/test/less-bom/javascript.less +38 -0
  339. package/test/less-bom/lazy-eval.less +6 -0
  340. package/test/less-bom/legacy/legacy.less +21 -0
  341. package/test/less-bom/media.less +234 -0
  342. package/test/less-bom/merge.less +78 -0
  343. package/test/less-bom/mixins-args.less +263 -0
  344. package/test/less-bom/mixins-closure.less +26 -0
  345. package/test/less-bom/mixins-guards-default-func.less +195 -0
  346. package/test/less-bom/mixins-guards.less +280 -0
  347. package/test/less-bom/mixins-important.less +53 -0
  348. package/test/less-bom/mixins-interpolated.less +75 -0
  349. package/test/less-bom/mixins-named-args.less +36 -0
  350. package/test/less-bom/mixins-nested.less +22 -0
  351. package/test/less-bom/mixins-pattern.less +102 -0
  352. package/test/less-bom/mixins.less +145 -0
  353. package/test/less-bom/modifyVars/extended.json +5 -0
  354. package/test/less-bom/modifyVars/extended.less +11 -0
  355. package/test/less-bom/nested-gradient-with-svg-gradient/mixin-consumer.less +5 -0
  356. package/test/less-bom/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +15 -0
  357. package/test/less-bom/no-js-errors/no-js-errors.less +3 -0
  358. package/test/less-bom/no-js-errors/no-js-errors.txt +4 -0
  359. package/test/less-bom/no-output.less +2 -0
  360. package/test/less-bom/operations.less +62 -0
  361. package/test/less-bom/parens.less +45 -0
  362. package/test/less-bom/plugin/plugin-global.js +9 -0
  363. package/test/less-bom/plugin/plugin-local.js +8 -0
  364. package/test/less-bom/plugin/plugin-transitive.js +5 -0
  365. package/test/less-bom/plugin/plugin-transitive.less +5 -0
  366. package/test/less-bom/plugin.less +85 -0
  367. package/test/less-bom/postProcessorPlugin/postProcessor.less +4 -0
  368. package/test/less-bom/preProcessorPlugin/preProcessor.less +3 -0
  369. package/test/less-bom/property-name-interp.less +56 -0
  370. package/test/less-bom/rulesets.less +30 -0
  371. package/test/less-bom/scope.less +104 -0
  372. package/test/less-bom/selectors.less +184 -0
  373. package/test/less-bom/sourcemaps/basic.json +3 -0
  374. package/test/less-bom/sourcemaps/basic.less +27 -0
  375. package/test/less-bom/sourcemaps/imported.css +7 -0
  376. package/test/less-bom/sourcemaps-empty/empty.less +1 -0
  377. package/test/less-bom/sourcemaps-empty/var-defs.less +1 -0
  378. package/test/less-bom/static-urls/urls.less +33 -0
  379. package/test/less-bom/strict-units/strict-units.less +4 -0
  380. package/test/less-bom/strings.less +73 -0
  381. package/test/less-bom/url-args/urls.less +63 -0
  382. package/test/less-bom/urls.less +94 -0
  383. package/test/less-bom/variables-in-at-rules.less +20 -0
  384. package/test/less-bom/variables.less +119 -0
  385. package/test/less-bom/visitorPlugin/visitor.less +4 -0
  386. package/test/less-bom/whitespace.less +44 -0
  387. package/test/less-test.js +9 -5
  388. package/test/plugins/filemanager/index.js +19 -0
  389. package/test/plugins/postprocess/index.js +14 -0
  390. package/test/plugins/preprocess/index.js +19 -0
  391. package/test/plugins/visitor/index.js +24 -0
  392. package/test.less +1 -0
  393. package/.idea/codeStyleSettings.xml +0 -13
  394. package/.idea/encodings.xml +0 -5
  395. package/.idea/inspectionProfiles/Project_Default.xml +0 -8
  396. package/.idea/inspectionProfiles/profiles_settings.xml +0 -7
  397. package/.idea/jsLinters/jscs.xml +0 -4
  398. package/.idea/jsLinters/jshint.xml +0 -70
  399. package/.idea/libraries/sass_stdlib.xml +0 -8
  400. package/.idea/scopes/scope_settings.xml +0 -5
  401. package/projectFilesBackup/.idea/libraries/sass_stdlib.xml +0 -8
  402. package/test/less/errors/detached-ruleset-4.less +0 -5
  403. package/test/less/errors/detached-ruleset-4.txt +0 -4
  404. package/test/less/errors/parse-error-extra-parens.txt +0 -3
  405. package/test/sourcemaps/maps/import-map.map +0 -1
@@ -57,6 +57,8 @@ var evalCopyProperties = [
57
57
  contexts.Eval = function(options, frames) {
58
58
  copyFromOriginal(options, this, evalCopyProperties);
59
59
 
60
+ if (typeof this.paths === "string") { this.paths = [this.paths]; }
61
+
60
62
  this.frames = frames || [];
61
63
  this.importantScope = this.importantScope || [];
62
64
  };
@@ -16,8 +16,12 @@ abstractFileManager.prototype.getPath = function (filename) {
16
16
  return filename.slice(0, j + 1);
17
17
  };
18
18
 
19
+ abstractFileManager.prototype.tryAppendExtension = function(path, ext) {
20
+ return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext;
21
+ };
22
+
19
23
  abstractFileManager.prototype.tryAppendLessExtension = function(path) {
20
- return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + '.less';
24
+ return this.tryAppendExtension(path, '.less');
21
25
  };
22
26
 
23
27
  abstractFileManager.prototype.supportsSync = function() {
@@ -141,7 +141,7 @@ colorFunctions = {
141
141
 
142
142
  return new Dimension(luminance * color.alpha * 100, '%');
143
143
  },
144
- saturate: function (color, amount) {
144
+ saturate: function (color, amount, method) {
145
145
  // filter: saturate(3.2);
146
146
  // should be kept as is, so check for color
147
147
  if (!color.rgb) {
@@ -149,42 +149,72 @@ colorFunctions = {
149
149
  }
150
150
  var hsl = color.toHSL();
151
151
 
152
- hsl.s += amount.value / 100;
152
+ if (typeof method !== "undefined" && method.value === "relative") {
153
+ hsl.s += hsl.s * amount.value / 100;
154
+ }
155
+ else {
156
+ hsl.s += amount.value / 100;
157
+ }
153
158
  hsl.s = clamp(hsl.s);
154
159
  return hsla(hsl);
155
160
  },
156
- desaturate: function (color, amount) {
161
+ desaturate: function (color, amount, method) {
157
162
  var hsl = color.toHSL();
158
163
 
159
- hsl.s -= amount.value / 100;
164
+ if (typeof method !== "undefined" && method.value === "relative") {
165
+ hsl.s -= hsl.s * amount.value / 100;
166
+ }
167
+ else {
168
+ hsl.s -= amount.value / 100;
169
+ }
160
170
  hsl.s = clamp(hsl.s);
161
171
  return hsla(hsl);
162
172
  },
163
- lighten: function (color, amount) {
173
+ lighten: function (color, amount, method) {
164
174
  var hsl = color.toHSL();
165
175
 
166
- hsl.l += amount.value / 100;
176
+ if (typeof method !== "undefined" && method.value === "relative") {
177
+ hsl.l += hsl.l * amount.value / 100;
178
+ }
179
+ else {
180
+ hsl.l += amount.value / 100;
181
+ }
167
182
  hsl.l = clamp(hsl.l);
168
183
  return hsla(hsl);
169
184
  },
170
- darken: function (color, amount) {
185
+ darken: function (color, amount, method) {
171
186
  var hsl = color.toHSL();
172
187
 
173
- hsl.l -= amount.value / 100;
188
+ if (typeof method !== "undefined" && method.value === "relative") {
189
+ hsl.l -= hsl.l * amount.value / 100;
190
+ }
191
+ else {
192
+ hsl.l -= amount.value / 100;
193
+ }
174
194
  hsl.l = clamp(hsl.l);
175
195
  return hsla(hsl);
176
196
  },
177
- fadein: function (color, amount) {
197
+ fadein: function (color, amount, method) {
178
198
  var hsl = color.toHSL();
179
199
 
180
- hsl.a += amount.value / 100;
200
+ if (typeof method !== "undefined" && method.value === "relative") {
201
+ hsl.a += hsl.a * amount.value / 100;
202
+ }
203
+ else {
204
+ hsl.a += amount.value / 100;
205
+ }
181
206
  hsl.a = clamp(hsl.a);
182
207
  return hsla(hsl);
183
208
  },
184
- fadeout: function (color, amount) {
209
+ fadeout: function (color, amount, method) {
185
210
  var hsl = color.toHSL();
186
211
 
187
- hsl.a -= amount.value / 100;
212
+ if (typeof method !== "undefined" && method.value === "relative") {
213
+ hsl.a -= hsl.a * amount.value / 100;
214
+ }
215
+ else {
216
+ hsl.a -= amount.value / 100;
217
+ }
188
218
  hsl.a = clamp(hsl.a);
189
219
  return hsla(hsl);
190
220
  },
@@ -208,6 +238,10 @@ colorFunctions = {
208
238
  // http://sass-lang.com
209
239
  //
210
240
  mix: function (color1, color2, weight) {
241
+ if (!color1.toHSL || !color2.toHSL) {
242
+ console.log(color2.type);
243
+ console.dir(color2);
244
+ }
211
245
  if (!weight) {
212
246
  weight = new Dimension(50);
213
247
  }
@@ -1,16 +1,45 @@
1
- var functionRegistry = require("./function-registry");
1
+ var Expression = require("../tree/expression");
2
2
 
3
3
  var functionCaller = function(name, context, index, currentFileInfo) {
4
4
  this.name = name.toLowerCase();
5
- this.func = functionRegistry.get(this.name);
6
5
  this.index = index;
7
6
  this.context = context;
8
7
  this.currentFileInfo = currentFileInfo;
8
+
9
+ this.func = context.frames[0].functionRegistry.get(this.name);
9
10
  };
10
11
  functionCaller.prototype.isValid = function() {
11
12
  return Boolean(this.func);
12
13
  };
13
14
  functionCaller.prototype.call = function(args) {
15
+
16
+ // This code is terrible and should be replaced as per this issue...
17
+ // https://github.com/less/less.js/issues/2477
18
+ if (Array.isArray(args)) {
19
+ args = args.filter(function (item) {
20
+ if (item.type === "Comment") {
21
+ return false;
22
+ }
23
+ return true;
24
+ })
25
+ .map(function(item) {
26
+ if (item.type === "Expression") {
27
+ var subNodes = item.value.filter(function (item) {
28
+ if (item.type === "Comment") {
29
+ return false;
30
+ }
31
+ return true;
32
+ });
33
+ if (subNodes.length === 1) {
34
+ return subNodes[0];
35
+ } else {
36
+ return new Expression(subNodes);
37
+ }
38
+ }
39
+ return item;
40
+ });
41
+ }
42
+
14
43
  return this.func.apply(this, args);
15
44
  };
16
45
 
@@ -1,18 +1,29 @@
1
- module.exports = {
2
- _data: {},
3
- add: function(name, func) {
4
- if (this._data.hasOwnProperty(name)) {
5
- //TODO warn
1
+ function makeRegistry( base ) {
2
+ return {
3
+ _data: {},
4
+ add: function(name, func) {
5
+ // precautionary case conversion, as later querying of
6
+ // the registry by function-caller uses lower case as well.
7
+ name = name.toLowerCase();
8
+
9
+ if (this._data.hasOwnProperty(name)) {
10
+ //TODO warn
11
+ }
12
+ this._data[name] = func;
13
+ },
14
+ addMultiple: function(functions) {
15
+ Object.keys(functions).forEach(
16
+ function(name) {
17
+ this.add(name, functions[name]);
18
+ }.bind(this));
19
+ },
20
+ get: function(name) {
21
+ return this._data[name] || ( base && base.get( name ));
22
+ },
23
+ inherit : function() {
24
+ return makeRegistry( this );
6
25
  }
7
- this._data[name] = func;
8
- },
9
- addMultiple: function(functions) {
10
- Object.keys(functions).forEach(
11
- function(name) {
12
- this.add(name, functions[name]);
13
- }.bind(this));
14
- },
15
- get: function(name) {
16
- return this._data[name];
17
- }
18
- };
26
+ };
27
+ }
28
+
29
+ module.exports = makeRegistry( null );
@@ -0,0 +1,16 @@
1
+ var Dimension = require("../tree/dimension");
2
+
3
+ var MathHelper = function() {
4
+ };
5
+ MathHelper._math = function (fn, unit, n) {
6
+ if (!(n instanceof Dimension)) {
7
+ throw { type: "Argument", message: "argument must be a number" };
8
+ }
9
+ if (unit == null) {
10
+ unit = n.unit;
11
+ } else {
12
+ n = n.unify();
13
+ }
14
+ return new Dimension(fn(parseFloat(n.value)), unit);
15
+ };
16
+ module.exports = MathHelper;
@@ -1,5 +1,5 @@
1
- var Dimension = require("../tree/dimension"),
2
- functionRegistry = require("./function-registry");
1
+ var functionRegistry = require("./function-registry"),
2
+ mathHelper = require("./math-helper.js");
3
3
 
4
4
  var mathFunctions = {
5
5
  // name, unit
@@ -15,27 +15,15 @@ var mathFunctions = {
15
15
  acos: "rad"
16
16
  };
17
17
 
18
- function _math(fn, unit, n) {
19
- if (!(n instanceof Dimension)) {
20
- throw { type: "Argument", message: "argument must be a number" };
21
- }
22
- if (unit == null) {
23
- unit = n.unit;
24
- } else {
25
- n = n.unify();
26
- }
27
- return new Dimension(fn(parseFloat(n.value)), unit);
28
- }
29
-
30
18
  for (var f in mathFunctions) {
31
19
  if (mathFunctions.hasOwnProperty(f)) {
32
- mathFunctions[f] = _math.bind(null, Math[f], mathFunctions[f]);
20
+ mathFunctions[f] = mathHelper._math.bind(null, Math[f], mathFunctions[f]);
33
21
  }
34
22
  }
35
23
 
36
24
  mathFunctions.round = function (n, f) {
37
25
  var fraction = typeof f === "undefined" ? 0 : f.value;
38
- return _math(function(num) { return num.toFixed(fraction); }, null, n);
26
+ return mathHelper._math(function(num) { return num.toFixed(fraction); }, null, n);
39
27
  };
40
28
 
41
29
  functionRegistry.addMultiple(mathFunctions);
@@ -1,6 +1,7 @@
1
1
  var Dimension = require("../tree/dimension"),
2
2
  Anonymous = require("../tree/anonymous"),
3
- functionRegistry = require("./function-registry");
3
+ functionRegistry = require("./function-registry"),
4
+ mathHelper = require("./math-helper.js");
4
5
 
5
6
  var minMax = function (isMin, args) {
6
7
  args = Array.prototype.slice.call(args);
@@ -71,6 +72,10 @@ functionRegistry.addMultiple({
71
72
  return new Dimension(Math.pow(x.value, y.value), x.unit);
72
73
  },
73
74
  percentage: function (n) {
74
- return new Dimension(n.value * 100, '%');
75
+ var result = mathHelper._math(function(num) {
76
+ return num * 100;
77
+ }, '%', n);
78
+
79
+ return result;
75
80
  }
76
81
  });
@@ -14,8 +14,9 @@ functionRegistry.addMultiple({
14
14
  },
15
15
  replace: function (string, pattern, replacement, flags) {
16
16
  var result = string.value;
17
-
18
- result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement.value);
17
+ replacement = (replacement.type === "Quoted") ?
18
+ replacement.value : replacement.toCSS();
19
+ result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);
19
20
  return new Quoted(string.quote || '', result, string.escaped);
20
21
  },
21
22
  '%': function (string /* arg, arg, ...*/) {
@@ -25,7 +26,8 @@ functionRegistry.addMultiple({
25
26
  for (var i = 0; i < args.length; i++) {
26
27
  /*jshint loopfunc:true */
27
28
  result = result.replace(/%[sda]/i, function(token) {
28
- var value = token.match(/s/i) ? args[i].value : args[i].toCSS();
29
+ var value = ((args[i].type === "Quoted") &&
30
+ token.match(/s/i)) ? args[i].value : args[i].toCSS();
29
31
  return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;
30
32
  });
31
33
  }
@@ -8,23 +8,31 @@ module.exports = function(environment) {
8
8
 
9
9
  functionRegistry.add("svg-gradient", function(direction) {
10
10
 
11
- function throwArgumentDescriptor() {
12
- throw { type: "Argument",
13
- message: "svg-gradient expects direction, start_color [start_position], [color position,]...," +
14
- " end_color [end_position]" };
15
- }
16
-
17
- if (arguments.length < 3) {
18
- throwArgumentDescriptor();
19
- }
20
- var stops = Array.prototype.slice.call(arguments, 1),
11
+ var stops,
21
12
  gradientDirectionSvg,
22
13
  gradientType = "linear",
23
14
  rectangleDimension = 'x="0" y="0" width="1" height="1"',
24
15
  renderEnv = {compress: false},
25
16
  returner,
26
17
  directionValue = direction.toCSS(renderEnv),
27
- i, color, position, positionValue, alpha;
18
+ i, color, position, positionValue, alpha;
19
+
20
+ function throwArgumentDescriptor() {
21
+ throw { type: "Argument",
22
+ message: "svg-gradient expects direction, start_color [start_position], [color position,]...," +
23
+ " end_color [end_position] or direction, color list" };
24
+ }
25
+
26
+ if (arguments.length == 2) {
27
+ if (arguments[1].value.length < 2) {
28
+ throwArgumentDescriptor();
29
+ }
30
+ stops = arguments[1].value;
31
+ } else if (arguments.length < 3) {
32
+ throwArgumentDescriptor();
33
+ } else {
34
+ stops = Array.prototype.slice.call(arguments, 1);
35
+ }
28
36
 
29
37
  switch (directionValue) {
30
38
  case "to bottom":
@@ -27,12 +27,7 @@ var isa = function (n, Type) {
27
27
  var items = Array.isArray(node.value) ?
28
28
  node.value : Array(node);
29
29
 
30
- return items.filter(function(item) {
31
- if (item.type === "Comment") {
32
- return false;
33
- }
34
- return true;
35
- });
30
+ return items;
36
31
  };
37
32
  functionRegistry.addMultiple({
38
33
  isruleset: function (n) {
@@ -1,5 +1,6 @@
1
1
  var contexts = require("./contexts"),
2
- Parser = require('./parser/parser');
2
+ Parser = require('./parser/parser'),
3
+ FunctionImporter = require('./plugins/function-importer');
3
4
 
4
5
  module.exports = function(environment) {
5
6
 
@@ -65,7 +66,7 @@ module.exports = function(environment) {
65
66
  }
66
67
 
67
68
  if (tryAppendLessExtension) {
68
- path = fileManager.tryAppendLessExtension(path);
69
+ path = fileManager.tryAppendExtension(path, importOptions.plugin ? ".js" : ".less");
69
70
  }
70
71
 
71
72
  var loadFileCallback = function(loadedFile) {
@@ -101,7 +102,11 @@ module.exports = function(environment) {
101
102
  newFileInfo.reference = true;
102
103
  }
103
104
 
104
- if (importOptions.inline) {
105
+ if (importOptions.plugin) {
106
+ new FunctionImporter(newEnv, newFileInfo).eval(contents, function (e, root) {
107
+ fileParsedFunc(e, root, resolvedFilename);
108
+ });
109
+ } else if (importOptions.inline) {
105
110
  fileParsedFunc(null, contents, resolvedFilename);
106
111
  } else {
107
112
  new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {
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, 4, 0],
5
+ version: [2, 5, 3],
6
6
  data: require('./data'),
7
7
  tree: require('./tree'),
8
8
  Environment: (Environment = require("./environment/environment")),
@@ -29,56 +29,11 @@ module.exports = function() {
29
29
  parserInput.forget = function() {
30
30
  saveStack.pop();
31
31
  };
32
- function sync() {
33
- if (parserInput.i > currentPos) {
34
- current = current.slice(parserInput.i - currentPos);
35
- currentPos = parserInput.i;
36
- }
37
- }
38
32
  parserInput.isWhitespace = function (offset) {
39
33
  var pos = parserInput.i + (offset || 0),
40
34
  code = input.charCodeAt(pos);
41
35
  return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);
42
36
  };
43
- //
44
- // Parse from a token, regexp or string, and move forward if match
45
- //
46
- parserInput.$ = function(tok) {
47
- var tokType = typeof tok,
48
- match, length;
49
-
50
- // Either match a single character in the input,
51
- // or match a regexp in the current chunk (`current`).
52
- //
53
- if (tokType === "string") {
54
- if (input.charAt(parserInput.i) !== tok) {
55
- return null;
56
- }
57
- skipWhitespace(1);
58
- return tok;
59
- }
60
-
61
- // regexp
62
- sync();
63
- if (! (match = tok.exec(current))) {
64
- return null;
65
- }
66
-
67
- length = match[0].length;
68
-
69
- // The match is confirmed, add the match length to `i`,
70
- // and consume any extra white-space characters (' ' || '\n')
71
- // which come after that. The reason for this is that LeSS's
72
- // grammar is mostly white-space insensitive.
73
- //
74
- skipWhitespace(length);
75
-
76
- if (typeof match === 'string') {
77
- return match;
78
- } else {
79
- return match.length === 1 ? match[0] : match;
80
- }
81
- };
82
37
 
83
38
  // Specialization of $(tok)
84
39
  parserInput.$re = function(tok) {
@@ -86,6 +41,7 @@ module.exports = function() {
86
41
  current = current.slice(parserInput.i - currentPos);
87
42
  currentPos = parserInput.i;
88
43
  }
44
+
89
45
  var m = tok.exec(current);
90
46
  if (!m) {
91
47
  return null;
@@ -99,7 +55,6 @@ module.exports = function() {
99
55
  return m.length === 1 ? m[0] : m;
100
56
  };
101
57
 
102
- // Specialization of $(tok)
103
58
  parserInput.$char = function(tok) {
104
59
  if (input.charAt(parserInput.i) !== tok) {
105
60
  return null;
@@ -108,6 +63,48 @@ module.exports = function() {
108
63
  return tok;
109
64
  };
110
65
 
66
+ parserInput.$str = function(tok) {
67
+ var tokLength = tok.length;
68
+
69
+ // https://jsperf.com/string-startswith/21
70
+ for (var i = 0; i < tokLength; i++) {
71
+ if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {
72
+ return null;
73
+ }
74
+ }
75
+
76
+ skipWhitespace(tokLength);
77
+ return tok;
78
+ };
79
+
80
+ parserInput.$quoted = function() {
81
+
82
+ var startChar = input.charAt(parserInput.i);
83
+ if (startChar !== "'" && startChar !== '"') {
84
+ return;
85
+ }
86
+ var length = input.length,
87
+ currentPosition = parserInput.i;
88
+
89
+ for (var i = 1; i + currentPosition < length; i++) {
90
+ var nextChar = input.charAt(i + currentPosition);
91
+ switch(nextChar) {
92
+ case "\\":
93
+ i++;
94
+ continue;
95
+ case "\r":
96
+ case "\n":
97
+ break;
98
+ case startChar:
99
+ var str = input.substr(currentPosition, i + 1);
100
+ skipWhitespace(i + 1);
101
+ return str;
102
+ default:
103
+ }
104
+ }
105
+ return null;
106
+ };
107
+
111
108
  var CHARCODE_SPACE = 32,
112
109
  CHARCODE_TAB = 9,
113
110
  CHARCODE_LF = 10,
@@ -136,7 +133,7 @@ module.exports = function() {
136
133
  nextChar = inp.charAt(parserInput.i + 1);
137
134
  if (nextChar === '/') {
138
135
  comment = {index: parserInput.i, isLineComment: true};
139
- var nextNewLine = inp.indexOf("\n", parserInput.i + 1);
136
+ var nextNewLine = inp.indexOf("\n", parserInput.i + 2);
140
137
  if (nextNewLine < 0) {
141
138
  nextNewLine = endIndex;
142
139
  }
@@ -145,12 +142,11 @@ module.exports = function() {
145
142
  parserInput.commentStore.push(comment);
146
143
  continue;
147
144
  } else if (nextChar === '*') {
148
- var haystack = inp.substr(parserInput.i);
149
- var comment_search_result = haystack.match(/^\/\*(?:[^*]|\*+[^\/*])*\*+\//);
150
- if (comment_search_result) {
145
+ var nextStarSlash = inp.indexOf("*/", parserInput.i + 2);
146
+ if (nextStarSlash >= 0) {
151
147
  comment = {
152
148
  index: parserInput.i,
153
- text: comment_search_result[0],
149
+ text: inp.substr(parserInput.i, nextStarSlash + 2 - parserInput.i),
154
150
  isLineComment: false
155
151
  };
156
152
  parserInput.i += comment.text.length - 1;
@@ -170,8 +166,7 @@ module.exports = function() {
170
166
  currentPos = parserInput.i;
171
167
 
172
168
  if (!current.length) {
173
- if (j < chunks.length - 1)
174
- {
169
+ if (j < chunks.length - 1) {
175
170
  current = chunks[++j];
176
171
  skipWhitespace(0); // skip space at the beginning of a chunk
177
172
  return true; // things changed
@@ -186,7 +181,13 @@ module.exports = function() {
186
181
  // just return the match.
187
182
  parserInput.peek = function(tok) {
188
183
  if (typeof tok === 'string') {
189
- return input.charAt(parserInput.i) === tok;
184
+ // https://jsperf.com/string-startswith/21
185
+ for (var i = 0; i < tok.length; i++) {
186
+ if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {
187
+ return false;
188
+ }
189
+ }
190
+ return true;
190
191
  } else {
191
192
  return tok.test(current);
192
193
  }