|
34 | 34 |
|
35 | 35 | // now find every selector and apply the extends that apply to all extends
|
36 | 36 | // and the ones which apply to an individual extend
|
37 |
| - for(i = 0; i < rulesetNode.selectors.length; i++) { |
38 |
| - var selector = rulesetNode.selectors[i]; |
39 |
| - extendList = selector.extendList.slice(0).concat(allSelectorsExtendList.map(function(allSelectorsExtend) { |
| 37 | + for(i = 0; i < rulesetNode.paths.length; i++) { |
| 38 | + var selectorPath = rulesetNode.paths[i], |
| 39 | + selector = selectorPath[selectorPath.length-1]; |
| 40 | + extendList = selector.extendList.slice(0).concat(allSelectorsExtendList).map(function(allSelectorsExtend) { |
40 | 41 | return allSelectorsExtend.clone();
|
41 |
| - })); |
| 42 | + }); |
42 | 43 | for(j = 0; j < extendList.length; j++) {
|
43 | 44 | extend = extendList[j];
|
44 |
| - extend.findSelfSelectors([[selector]].concat(this.contexts.slice(0))); |
| 45 | + extend.findSelfSelectors(selectorPath); |
45 | 46 | this.allExtendsStack[this.allExtendsStack.length-1].push(extend);
|
46 | 47 | }
|
47 | 48 | }
|
|
97 | 98 | var i, j, k, selector, element, allExtends = this.allExtendsStack[this.allExtendsStack.length-1], selectorsToAdd = [];
|
98 | 99 |
|
99 | 100 | for(k = 0; k < allExtends.length; k++) {
|
100 |
| - for(i = 0; i < rulesetNode.selectors.length; i++) { |
101 |
| - selector = rulesetNode.selectors[i]; |
102 |
| - var match = this.findMatch(allExtends[k], selector); |
| 101 | + for(i = 0; i < rulesetNode.paths.length; i++) { |
| 102 | + selectorPath = rulesetNode.paths[i]; |
| 103 | + var match = this.findMatch(allExtends[k], selectorPath); |
103 | 104 | if (match) {
|
| 105 | + selector = selectorPath[match.pathIndex]; |
104 | 106 | allExtends[k].selfSelectors.forEach(function(selfSelector) {
|
105 |
| - var firstElement = new tree.Element( |
| 107 | + var path = selectorPath.slice(0, match.pathIndex), |
| 108 | + firstElement = new tree.Element( |
106 | 109 | match.initialCombinator,
|
107 | 110 | selfSelector.elements[0].value,
|
108 | 111 | selfSelector.elements[0].index
|
109 | 112 | );
|
110 |
| - selectorsToAdd.push(new tree.Selector( |
| 113 | + path.push(new tree.Selector( |
111 | 114 | selector.elements
|
112 | 115 | .slice(0, match.index)
|
113 | 116 | .concat([firstElement])
|
114 | 117 | .concat(selfSelector.elements.slice(1))
|
115 | 118 | .concat(selector.elements.slice(match.index + match.length))
|
116 | 119 | ));
|
| 120 | + path = path.concat(selectorPath.slice(match.pathIndex + 1, selectorPath.length)); |
| 121 | + selectorsToAdd.push(path); |
117 | 122 | });
|
118 | 123 | }
|
119 | 124 | }
|
120 | 125 | }
|
121 |
| - rulesetNode.selectors = rulesetNode.selectors.concat(selectorsToAdd); |
122 |
| - }, |
123 |
| - findMatch: function (extend, selector) { |
124 |
| - var i, j, element, hasMatch; |
125 |
| - for(i = 0; i <= (selector.elements.length - extend.selector.elements.length); i++) { |
126 |
| - hasMatch = true; |
127 |
| - for(j = 0; j < extend.selector.elements.length; j++) { |
128 |
| - if (extend.selector.elements[j].value !== selector.elements[i+j].value) { |
129 |
| - hasMatch = false; |
130 |
| - break; |
| 126 | + rulesetNode.paths = rulesetNode.paths.concat(selectorsToAdd); |
| 127 | + }, |
| 128 | + findMatch: function (extend, selectorPath) { |
| 129 | + var i, j, k, element, hasMatch, potentialMatches = [], potentialMatch; |
| 130 | + for(k = 0; k < selectorPath.length; k++) { |
| 131 | + selector = selectorPath[k]; |
| 132 | + for(i = 0; i < selector.elements.length; i++) { |
| 133 | + hasMatch = true; |
| 134 | + potentialMatch = {pathIndex: k, index: i}; |
| 135 | + for(j = 0; j < extend.selector.elements.length && i+j < selector.elements.length; j++) { |
| 136 | + potentialMatch.matched = j; |
| 137 | + if (extend.selector.elements[j].value !== selector.elements[i+j].value || |
| 138 | + (j > 0 && extend.selector.elements[j].combinator.value !== selector.elements[i+j].combinator.value)) { |
| 139 | + potentialMatch = null; |
| 140 | + break; |
| 141 | + } |
| 142 | + } |
| 143 | + if (potentialMatch && potentialMatch.matched+1 === extend.selector.elements.length) { |
| 144 | + potentialMatch.initialCombinator = selector.elements[i].combinator; |
| 145 | + potentialMatch.length = extend.selector.elements.length; |
| 146 | + return potentialMatch; |
131 | 147 | }
|
132 |
| - } |
133 |
| - if (hasMatch) { |
134 |
| - return {index: i, initialCombinator: selector.elements[i].combinator, length: extend.selector.elements.length}; |
135 | 148 | }
|
136 | 149 | }
|
137 | 150 | return null;
|
|
0 commit comments