From 8ac1bdf06c2f56dee6934e7c948934da4998fffc Mon Sep 17 00:00:00 2001 From: cloudhead Date: Sun, 28 Feb 2010 01:06:54 -0500 Subject: [PATCH] proper nested selector rendering, wooh. --- lib/less/node/ruleset.js | 42 ++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/less/node/ruleset.js b/lib/less/node/ruleset.js index a46fde0..eab38da 100644 --- a/lib/less/node/ruleset.js +++ b/lib/less/node/ruleset.js @@ -9,15 +9,29 @@ node.Ruleset.prototype = { if (r instanceof node.Rule && r.variable === true) { return r } }); }, - toCSS: function (path, env) { - var css = [], rules = [], rulesets = []; + toCSS: function (context, env) { + var css = [], + rules = [], + rulesets = [], + paths = [], + selector; - if (! this.root) path.push(this.selectors.map(function (s) { return s.toCSS(env) })); + if (! this.root) { + if (context.length === 0) { + paths = this.selectors.map(function (s) { return [s.toCSS(env)] }); + } else { + for (var s = 0; s < this.selectors.length; s++) { + for (var c = 0; c < context.length; c++) { + paths.push(context[c].concat([this.selectors[s].toCSS()])); + } + } + } + } env.frames.unshift(this); for (var i = 0; i < this.rules.length; i++) { if (this.rules[i] instanceof node.Ruleset) { - rulesets.push(this.rules[i].toCSS(path, env)); + rulesets.push(this.rules[i].toCSS(paths, env)); } else { if (this.rules[i].toCSS) { rules.push(this.rules[i].toCSS(env)); @@ -26,19 +40,23 @@ node.Ruleset.prototype = { } } } + + rulesets = rulesets.join(''); - if (rules.length > 0) { - if (path.length > 0) { - css.push(path.join('').trim(), - " {\n " + rules.join('\n ') + "\n}\n", - rulesets.join('')); - } else { - css.push(rules.join('\n'), rulesets.join('')); + if (this.root) { + css.push(rules.join('\n')); + } else { + if (rules.length > 0) { + selector = paths.map(function (p) { return p.join('').trim() }) + .join(paths.length > 3 ? ',\n' : ', ').trim(); + css.push(selector, " {\n " + rules.join('\n ') + "\n}\n"); } } - path.pop(); + css.push(rulesets); env.frames.shift(); + for (var p = 0; p < paths.length; p++) { paths[p].pop() } + return css.join(''); } };