Skip to content

Commit 4f8d1bf

Browse files
committed
Add support for recursive extends. fix #19
1 parent 7f67e72 commit 4f8d1bf

File tree

1 file changed

+60
-33
lines changed

1 file changed

+60
-33
lines changed

src/com/inet/lib/less/LessExtendMap.java

Lines changed: 60 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -79,53 +79,80 @@ void add( LessExtend lessExtend, String[] mainSelector ) {
7979

8080
/**
8181
* Add to the given selectors all possible extends and return the resulting selectors.
82-
* @param selectors current selectors
83-
* @param isReference if the current rul is in a less file which was import with "reference" keyword
82+
*
83+
* @param selectors
84+
* current selectors
85+
* @param isReference
86+
* if the current rule is in a less file which was import with "reference" keyword
8487
* @return the selectors concatenate with extends or the original if there are no etends.
8588
*/
8689
public String[] concatenateExtends( String[] selectors, boolean isReference ) {
8790
selectorList.clear();
8891
for( String selector : selectors ) {
89-
List<String[]> list = exact.get( selector );
90-
if( list != null ) {
91-
for( String[] lessExtend : list ) {
92-
for( String sel : lessExtend ) {
93-
selectorList.add( sel );
94-
}
95-
}
96-
}
97-
SelectorTokenizer tokenizer = new SelectorTokenizer( selector );
98-
do {
99-
String token = tokenizer.next();
100-
if( token == null ) {
101-
break;
102-
}
103-
List<LessExtendResult> results = all.get( token );
104-
if( results != null ) {
105-
for( LessExtendResult lessExtend : results ) {
106-
for( String extendingSelector : lessExtend.getExtendingSelectors() ) {
107-
if( selector.contains( extendingSelector ) ) {
108-
for( String replace : lessExtend.getSelectors() ) {
109-
selectorList.add( selector.replace( extendingSelector, replace ) );
110-
}
111-
}
112-
}
113-
}
114-
}
115-
} while( true );
92+
concatenateExtendsRecursive( selector, isReference );
11693
}
11794

11895
if( isReference ) {
11996
return selectorList.toArray( new String[selectorList.size()] );
12097
}
12198

12299
if( selectorList.size() > 0 ) {
123-
int off = selectors.length;
124-
selectors = Arrays.copyOf( selectors, off + selectorList.size() );
125-
for( String str : selectorList ) {
126-
selectors[off++] = str;
100+
for( String selector : selectors ) {
101+
selectorList.remove( selector ); // remove duplicates
102+
}
103+
if( selectorList.size() > 0 ) {
104+
int off = selectors.length;
105+
selectors = Arrays.copyOf( selectors, off + selectorList.size() );
106+
for( String str : selectorList ) {
107+
selectors[off++] = str;
108+
}
127109
}
128110
}
129111
return selectors;
130112
}
113+
114+
/**
115+
* Add to the given selector all possible extends to the internal selectorList. This method is call recursive.
116+
*
117+
* @param selector
118+
* current selector
119+
* @param isReference
120+
* if the current rule is in a less file which was import with "reference" keyword
121+
*/
122+
private void concatenateExtendsRecursive( String selector, boolean isReference ) {
123+
List<String[]> list = exact.get( selector );
124+
if( list != null ) {
125+
for( String[] lessExtend : list ) {
126+
for( String sel : lessExtend ) {
127+
boolean needRecursion = selectorList.add( sel );
128+
if( needRecursion ) { //only if there are new entries then we need to try a recursion, else we have a stack overflow
129+
concatenateExtendsRecursive( sel, isReference );
130+
}
131+
}
132+
}
133+
}
134+
SelectorTokenizer tokenizer = new SelectorTokenizer( selector );
135+
do {
136+
String token = tokenizer.next();
137+
if( token == null ) {
138+
break;
139+
}
140+
List<LessExtendResult> results = all.get( token );
141+
if( results != null ) {
142+
for( LessExtendResult lessExtend : results ) {
143+
for( String extendingSelector : lessExtend.getExtendingSelectors() ) {
144+
if( selector.contains( extendingSelector ) ) {
145+
for( String replace : lessExtend.getSelectors() ) {
146+
String replacedSelector = selector.replace( extendingSelector, replace );
147+
boolean needRecursion = selectorList.add( replacedSelector );
148+
if( needRecursion && !replacedSelector.contains( extendingSelector ) ) {
149+
concatenateExtendsRecursive( replacedSelector, isReference );
150+
}
151+
}
152+
}
153+
}
154+
}
155+
}
156+
} while( true );
157+
}
131158
}

0 commit comments

Comments
 (0)