lib/less/js/lib/less/tree/ruleset.js in less-2.0.5 vs lib/less/js/lib/less/tree/ruleset.js in less-2.0.6

- old
+ new

@@ -118,15 +118,11 @@ if (! this.root) { if (context.length === 0) { paths = this.selectors.map(function (s) { return [s] }); } 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]])); - } - } + this.joinSelectors( paths, context, this.selectors ); } } // Compile rules and rulesets for (var i = 0; i < this.rules.length; i++) { @@ -172,8 +168,45 @@ } } css.push(rulesets); return css.join('') + (env.compress ? '\n' : ''); + }, + + joinSelectors: function (paths, context, selectors) { + for (var s = 0; s < selectors.length; s++) { + this.joinSelector(paths, context, selectors[s]); + } + }, + + joinSelector: function (paths, context, selector) { + var before = [], after = [], beforeElements = [], + afterElements = [], hasParentSelector = false, el; + + for (var i = 0; i < selector.elements.length; i++) { + el = selector.elements[i]; + if (el.combinator.value[0] === '&') { + hasParentSelector = true; + } + if (hasParentSelector) afterElements.push(el); + else beforeElements.push(el); + } + + if (! hasParentSelector) { + afterElements = beforeElements; + beforeElements = []; + } + + if (beforeElements.length > 0) { + before.push(new(tree.Selector)(beforeElements)); + } + + if (afterElements.length > 0) { + after.push(new(tree.Selector)(afterElements)); + } + + for (var c = 0; c < context.length; c++) { + paths.push(before.concat(context[c]).concat(after)); + } } }; })(require('less/tree'));