move rule duplication removal into the toCSS visitor

This commit is contained in:
Luke Page
2013-07-16 22:25:23 +01:00
parent 190bcca19f
commit 1464d22183
2 changed files with 27 additions and 11 deletions

View File

@@ -111,6 +111,8 @@
}
visitArgs.visitDeeper = false;
this._removeDuplicateRules(rulesetNode.rules);
// now decide whether we keep the ruleset
if (rulesetNode.rules.length > 0 && rulesetNode.paths.length > 0) {
rulesets.splice(0, 0, rulesetNode);
@@ -126,6 +128,31 @@
return rulesets[0];
}
return rulesets;
},
_removeDuplicateRules: function(rules) {
// remove duplicates
var ruleCache = {},
ruleList, rule, i;
for(i = rules.length - 1; i >= 0 ; i--) {
rule = rules[i];
if (rule instanceof tree.Rule) {
if (!ruleCache[rule.name]) {
ruleCache[rule.name] = rule;
} else {
ruleList = ruleCache[rule.name];
if (ruleList instanceof tree.Rule) {
ruleList = ruleCache[rule.name] = [ruleCache[rule.name].toCSS(this._env)];
}
var ruleCSS = rule.toCSS(this._env);
if (ruleList.indexOf(ruleCSS) !== -1) {
rules.splice(i, 1);
} else {
ruleList.push(ruleCSS);
}
}
}
}
}
};

View File

@@ -185,7 +185,6 @@ tree.Ruleset.prototype = {
toCSS: function (env) {
var i, css = [], // The CSS output
rules = [], // node.Rule instances
_rules = [], //
rulesets = [], // node.Ruleset instances
ruleNodes = [],
rulesetNodes = [],
@@ -245,16 +244,6 @@ tree.Ruleset.prototype = {
}).join(env.compress ? ',' : (',\n' + tabSetStr));
if (selector) {
//TODO need to do this in the toCSS visitor
//only bother doing if compression is on?
// Remove duplicates
for (var i = rules.length - 1; i >= 0; i--) {
if (rules[i].slice(0, 2) === "/*" || _rules.indexOf(rules[i]) === -1) {
_rules.unshift(rules[i]);
}
}
rules = _rules;
if (debugInfo) {
css.push(debugInfo);
css.push(tabSetStr);