diff --git a/lib/less/index.js b/lib/less/index.js index ec37017d..9bf4b7c5 100644 --- a/lib/less/index.js +++ b/lib/less/index.js @@ -73,11 +73,12 @@ var less = { } }; -['color', 'directive', 'operation', 'dimension', - 'keyword', 'variable', 'ruleset', 'element', - 'selector', 'quoted', 'expression', 'rule', - 'call', 'url', 'alpha', 'import', - 'mixin', 'comment', 'anonymous', 'value', 'javascript' +['color', 'directive', 'operation', 'dimension', + 'keyword', 'variable', 'ruleset', 'element', + 'selector', 'quoted', 'expression', 'rule', + 'call', 'url', 'alpha', 'import', + 'mixin', 'comment', 'anonymous', 'value', + 'javascript', 'assignment' ].forEach(function (n) { require('./tree/' + n); }); diff --git a/lib/less/parser.js b/lib/less/parser.js index 29dc210b..f8bee863 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -502,7 +502,7 @@ less.Parser = function Parser(env) { call: function () { var name, args, index = i; - if (! (name = /^([\w-]+|%)\(/.exec(chunks[j]))) return; + if (! (name = /^([\w-]+|%|progid:[\w\.]+)\(/.exec(chunks[j]))) return; name = name[1].toLowerCase(); @@ -522,7 +522,7 @@ less.Parser = function Parser(env) { arguments: function () { var args = [], arg; - while (arg = $(this.expression)) { + while (arg = $(this.entities.assignment) || $(this.expression)) { args.push(arg); if (! $(',')) { break } } @@ -534,6 +534,19 @@ less.Parser = function Parser(env) { $(this.entities.quoted); }, + // Assignments are argument entities for calls. + // They are present in ie filter properties as shown below. + // + // filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* ) + // + + assignment: function () { + var key, value; + if ((key = $(/^\w+(?=\s?=)/i)) && $('=') && (value = $(this.entity))) { + return new(tree.Assignment)(key, value); + } + }, + // // Parse url() tokens // diff --git a/lib/less/tree/assignment.js b/lib/less/tree/assignment.js new file mode 100644 index 00000000..70ce6e2f --- /dev/null +++ b/lib/less/tree/assignment.js @@ -0,0 +1,17 @@ +(function (tree) { + +tree.Assignment = function (key, val) { + this.key = key; + this.value = val; +}; +tree.Assignment.prototype = { + toCSS: function () { + return this.key + '=' + (this.value.toCSS ? this.value.toCSS() : this.value); + }, + eval: function (env) { + if (this.value.eval) { this.value = this.value.eval(env) } + return this; + } +}; + +})(require('../tree')); \ No newline at end of file diff --git a/test/css/ie-filters.css b/test/css/ie-filters.css new file mode 100644 index 00000000..933318ab --- /dev/null +++ b/test/css/ie-filters.css @@ -0,0 +1,5 @@ +.nav { + filter: progid:dximagetransform.microsoft.alpha(opacity=20); + filter: progid:dximagetransform.microsoft.alpha(opacity=0); + filter: progid:dximagetransform.microsoft.gradient(startColorstr="#333333", endColorstr="#000000", GradientType=0); +} diff --git a/test/less/ie-filters.less b/test/less/ie-filters.less new file mode 100644 index 00000000..bea85b82 --- /dev/null +++ b/test/less/ie-filters.less @@ -0,0 +1,8 @@ +@fat: 0; +@cloudhead: "#000000"; + +.nav { + filter: progid:DXImageTransform.Microsoft.Alpha(opacity = 20); + filter: progid:DXImageTransform.Microsoft.Alpha(opacity=@fat); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#333333", endColorstr=@cloudhead, GradientType=@fat); +} \ No newline at end of file