slight restructure and tests to show we allow multiple extends

This commit is contained in:
agatronic
2013-03-04 11:54:11 +00:00
parent 464e777db5
commit 1970be737b
4 changed files with 39 additions and 27 deletions

View File

@@ -71,6 +71,7 @@
tree.processExtendsVisitor = function() {
this._visitor = new tree.visitor(this);
this._searches
};
tree.processExtendsVisitor.prototype = {
@@ -94,32 +95,40 @@
return;
}
var i, j, k, selector, element, allExtends = this.allExtendsStack[this.allExtendsStack.length-1], selectorsToAdd = [];
if (allExtends.length) {
for(k = 0; k < allExtends.length; k++) {
for(i = 0; i < rulesetNode.selectors.length; i++) {
selector = rulesetNode.selectors[i];
for(j = 0; j < selector.elements.length; j++) {
element = selector.elements[j];
for(k = 0; k < allExtends.length; k++) {
if (allExtends[k].selector.elements[0].value === element.value) {
allExtends[k].selfSelectors.forEach(function(selfSelector) {
selfSelector.elements[0] = new tree.Element(
element.combinator,
selfSelector.elements[0].value,
selfSelector.elements[0].index
);
selectorsToAdd.push(new tree.Selector(
selector.elements
.slice(0, j)
.concat(selfSelector.elements)
.concat(selector.elements.slice(j + 1))
));
});
}
}
var match = this.findMatch(allExtends[k], selector);
if (match) {
allExtends[k].selfSelectors.forEach(function(selfSelector) {
var firstElement = new tree.Element(
match.initialCombinator,
selfSelector.elements[0].value,
selfSelector.elements[0].index
);
selectorsToAdd.push(new tree.Selector(
selector.elements
.slice(0, match.index)
.concat([firstElement])
.concat(selfSelector.elements.slice(1))
.concat(selector.elements.slice(match.index + 1))
));
});
}
}
rulesetNode.selectors = rulesetNode.selectors.concat(selectorsToAdd);
}
rulesetNode.selectors = rulesetNode.selectors.concat(selectorsToAdd);
},
findMatch: function (extend, selector) {
var j = 0, element;
for(j = 0; j < selector.elements.length; j++) {
element = selector.elements[j];
if (extend.selector.elements[0].value === element.value) {
return {index: j, initialCombinator: element.combinator};
}
}
return null;
},
visitRulesetOut: function (rulesetNode) {
},