From 45bc539b571c085fe68ac3140bc57f89de4f2172 Mon Sep 17 00:00:00 2001 From: Luke Page Date: Tue, 16 Jul 2013 22:45:21 +0100 Subject: [PATCH] refactor toCSS to be in output order --- lib/less/tree/ruleset.js | 76 ++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/lib/less/tree/ruleset.js b/lib/less/tree/ruleset.js index f97b6034..c2e650a9 100644 --- a/lib/less/tree/ruleset.js +++ b/lib/less/tree/ruleset.js @@ -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' : ''); },