Allow comparing colors and strings. Fix a bug whereby sometimes a mixin-call or import would disappear. This makes the import test fail consistently instead of once out of 8 times depending on async order I think.

This commit is contained in:
Luke Page
2012-08-05 22:47:05 +01:00
parent d22bcdc828
commit a702b282e6
7 changed files with 80 additions and 7 deletions

View File

@@ -7,7 +7,21 @@ tree.Anonymous.prototype = {
toCSS: function () {
return this.value;
},
eval: function () { return this }
eval: function () { return this },
compare: function (x) {
if (!x.toCSS) {
return -1;
}
var left = this.toCSS(),
right = x.toCSS();
if (left === right) {
return 0;
}
return left < right ? -1 : 1;
}
};
})(require('../tree'));

View File

@@ -94,6 +94,16 @@ tree.Color.prototype = {
i = (i > 255 ? 255 : (i < 0 ? 0 : i)).toString(16);
return i.length === 1 ? '0' + i : i;
}).join('');
},
compare: function (x) {
if (!x.rgb) {
return -1;
}
return (x.rgb[0] === this.rgb[0] &&
x.rgb[1] === this.rgb[1] &&
x.rgb[2] === this.rgb[2] &&
x.alpha === this.alpha) ? 0 : -1;
}
};

View File

@@ -23,6 +23,20 @@ tree.Quoted.prototype = {
return ('value' in v) ? v.value : v.toCSS();
});
return new(tree.Quoted)(this.quote + value + this.quote, value, this.escaped, this.index);
},
compare: function (x) {
if (!x.toCSS) {
return -1;
}
var left = this.toCSS(),
right = x.toCSS();
if (left === right) {
return 0;
}
return left < right ? -1 : 1;
}
};

View File

@@ -10,7 +10,8 @@ tree.Ruleset.prototype = {
eval: function (env) {
var selectors = this.selectors && this.selectors.map(function (s) { return s.eval(env) });
var ruleset = new(tree.Ruleset)(selectors, this.rules.slice(0), this.strictImports);
var rules = [];
ruleset.root = this.root;
ruleset.allowImports = this.allowImports;
@@ -21,10 +22,13 @@ tree.Ruleset.prototype = {
if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
for (var i = 0; i < ruleset.rules.length; i++) {
if (ruleset.rules[i] instanceof tree.Import) {
Array.prototype.splice
.apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env)));
rules = rules.concat(ruleset.rules[i].eval(env));
} else {
rules.push(ruleset.rules[i]);
}
}
ruleset.rules = rules;
rules = [];
}
// Store the frames around mixin definitions,
@@ -38,10 +42,12 @@ tree.Ruleset.prototype = {
// Evaluate mixin calls.
for (var i = 0; i < ruleset.rules.length; i++) {
if (ruleset.rules[i] instanceof tree.mixin.Call) {
Array.prototype.splice
.apply(ruleset.rules, [i, 1].concat(ruleset.rules[i].eval(env)));
rules = rules.concat(ruleset.rules[i].eval(env));
} else {
rules.push(ruleset.rules[i]);
}
}
ruleset.rules = rules;
// Evaluate everything else
for (var i = 0, rule; i < ruleset.rules.length; i++) {

View File

@@ -56,3 +56,13 @@
content: not false;
content: not false and false, not false;
}
.colorguardtest {
content: is #ff0000;
content: is not #0000ff its #ff0000;
content: is not #0000ff its #800080;
}
.stringguardtest {
content: is theme1;
content: is not theme2;
content: is theme1 no quotes;
}

View File

@@ -29,7 +29,7 @@ fs.readdirSync('test/less').forEach(function (file) {
else if (err) {
sys.print(stylize("ERROR: " + (err && err.message), 'red'));
} else {
sys.print(stylize("FAIL", 'yellow'));
sys.print(stylize("FAIL", 'yellow') + '\n');
require('diff').diffLines(css, less).forEach(function(item) {
if(item.added || item.removed) {

View File

@@ -92,3 +92,22 @@
.bool () when not (false) and (false), not (false) { content: not false and false, not false }
.bool1 { .bool }
.colorguard(@col) when (@col = red) { content: is @col; }
.colorguard(@col) when not (blue = @col) { content: is not blue its @col; }
.colorguard(@col) {}
.colorguardtest {
.colorguard(red);
.colorguard(blue);
.colorguard(purple);
}
.stringguard(@str) when (@str = "theme1") { content: is theme1; }
.stringguard(@str) when not ("theme2" = @str) { content: is not theme2; }
.stringguard(@str) when (~"theme1" = @str) { content: is theme1 no quotes; }
.stringguard(@str) {}
.stringguardtest {
.stringguard("theme1");
.stringguard("theme2");
.stringguard(theme1);
}