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'));