refactor toCSS to be in output order

This commit is contained in:
Luke Page
2013-07-16 22:45:21 +01:00
parent 1464d22183
commit 45bc539b57

View File

@@ -152,10 +152,10 @@ tree.Ruleset.prototype = {
},
find: function (selector, self) {
self = self || this;
var rules = [], rule, match,
var rules = [], match,
key = selector.toCSS();
if (key in this._lookups) { return this._lookups[key] }
if (key in this._lookups) { return this._lookups[key]; }
this.rulesets().forEach(function (rule) {
if (rule !== self) {
@@ -185,14 +185,14 @@ tree.Ruleset.prototype = {
toCSS: function (env) {
var i, css = [], // The CSS output
rules = [], // node.Rule instances
rulesets = [], // node.Ruleset instances
ruleNodes = [],
rulesetNodes = [],
selector, // The fully rendered selector
debugInfo, // Line number debugging
rule;
rule,
firstRuleset = true;
this.mergeRules();
this.mergeRules(); //todo move to toCSS Visitor
env.tabLevel = (env.tabLevel || 0);
@@ -212,6 +212,25 @@ tree.Ruleset.prototype = {
}
}
// If this is the root node, we don't render
// a selector, or {}.
if (!this.root) {
debugInfo = tree.debugInfo(env, this, tabSetStr);
selector = this.paths
.map(function (p) {
return p.map(function (s) {
return s.toCSS(env);
}).join('').trim();
}).join(env.compress ? ',' : (',\n' + tabSetStr));
if (debugInfo) {
css.push(debugInfo);
css.push(tabSetStr);
}
css.push(selector + (env.compress ? '{' : ' {\n') + tabRuleStr);
}
// Compile rules and rulesets
for (i = 0; i < ruleNodes.length; i++) {
rule = ruleNodes[i];
@@ -221,59 +240,34 @@ tree.Ruleset.prototype = {
}
if (rule.toCSS) {
rules.push(rule.toCSS(env));
css.push(rule.toCSS(env));
} else if (rule.value) {
rules.push(rule.value.toString());
css.push(rule.value.toString());
}
env.lastRule = false;
}
// If this is the root node, we don't render
// a selector, or {}.
// Otherwise, only output if this ruleset has rules.
if (this.root) {
css.push(rules.join(env.compress ? '' : ('\n' + tabRuleStr)));
} else {
debugInfo = tree.debugInfo(env, this, tabSetStr);
selector = this.paths
.map(function (p) {
return p.map(function (s) {
return s.toCSS(env);
}).join('').trim();
}).join(env.compress ? ',' : (',\n' + tabSetStr));
if (selector) {
if (debugInfo) {
css.push(debugInfo);
css.push(tabSetStr);
}
css.push(selector +
(env.compress ? '{' : ' {\n') + tabRuleStr +
rules.join(env.compress ? '' : ('\n' + tabRuleStr)) +
(env.compress ? '}' : '\n' + tabSetStr + '}'));
if (!env.lastRule) {
css.push(env.compress ? '' : ('\n' + tabRuleStr));
} else {
env.lastRule = false;
}
}
if (!this.root) {
css.push((env.compress ? '}' : '\n' + tabSetStr + '}'));
env.tabLevel--;
}
var firstRuleset = true;
for (i = 0; i < rulesetNodes.length; i++) {
if (rules.length && firstRuleset) {
rulesets.push("\n" + (this.root ? tabRuleStr : tabSetStr));
if (ruleNodes.length && firstRuleset) {
css.push("\n" + (this.root ? tabRuleStr : tabSetStr));
}
if (!firstRuleset) {
rulesets.push('\n' + (this.root ? tabRuleStr : tabSetStr));
css.push('\n' + (this.root ? tabRuleStr : tabSetStr));
}
firstRuleset = false;
rulesets.push(rulesetNodes[i].toCSS(env));
css.push(rulesetNodes[i].toCSS(env));
}
css = css.concat(rulesets);
return css.join('') + (!env.compress && this.firstRoot ? '\n' : '');
},