10000 make mixins work better with complex selectors · websdotcom/less.js@3331637 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3331637

Browse files
committed
make mixins work better with complex selectors
1 parent 15d6127 commit 3331637

File tree

5 files changed

+52
-15
lines changed

5 files changed

+52
-15
lines changed

lib/less/parser.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -889,16 +889,11 @@ less.Parser = function Parser(env) {
889889
var selectors = [], s, rules, match;
890890
save();
891891

892-
if (match = /^([.#:% \w-]+)[\s\n]*\{/.exec(chunks[j])) {
893-
i += match[0].length - 1;
894-
selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])];
895-
} else {
896-
while (s = $(this.selector)) {
897-
selectors.push(s);
898-
$(this.comment);
899-
if (! $(',')) { break }
900-
$(this.comment);
901-
}
892+
while (s = $(this.selector)) {
893+
selectors.push(s);
894+
$(this.comment);
895+
if (! $(',')) { break }
896+
$(this.comment);
902897
}
903898

904899
if (selectors.length > 0 && (rules = $(this.block))) {

lib/less/tree/ruleset.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ tree.Ruleset.prototype = {
9090
if (rule !== self) {
9191
for (var j = 0; j < rule.selectors.length; j++) {
9292
if (match = selector.match(rule.selectors[j])) {
93-
if (selector.elements.length > 1) {
93+
if (selector.elements.length > rule.selectors[j].elements.length) {
9494
Array.prototype.push.apply(rules, rule.find(
9595
new(tree.Selector)(selector.elements.slice(1)), self));
9696
} else {

lib/less/tree/selector.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,25 @@ tree.Selector = function (elements) {
77
}
88
};
99
tree.Selector.prototype.match = function (other) {
10-
if (this.elements[0].value === other.elements[0].value) {
11-
return true;
12-
} else {
13-
return false;
10+
var value = this.elements[0].value,
11+
len = this.elements.length,
12+
olen = other.elements.length;
13+
14+
if (len > olen) {
15+
return value === other.elements[0].value;
16+
}
17+
18+
for (var i = 0; i < olen; i ++) {
19+
if (value === other.elements[i].value) {
20+
for (var j = 1; j < len; j ++) {
21+
if (this.elements[j].value !== other.elements[i + j].value) {
22+
return false;
23+
}
24+
}
25+
return true;
26+
}
1427
}
28+
return false;
1529
};
1630
tree.Selector.prototype.toCSS = function (env) {
1731
if (this._css) { return this._css }

test/css/mixins.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,17 @@
4848
.direct {
4949
border-style: dotted;
5050
}
51+
.bo {
52+
border: 1px;
53+
}
54+
.ar.bo.ca {
55+
color: black;
56+
}
57+
.jo.ki {
58+
background: none;
59+
}
60+
.extended {
61+
border: 1px;
62+
color: black;
63+
background: none;
64+
}

test/less/mixins.less

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,17 @@
4545
.direct {
4646
#namespace > .borders;
4747
}
48+
49+
.bo {
50+
border: 1px;
51+
}
52+
.ar.bo.ca {
53+
color: black;
54+
}
55+
.jo.ki {
56+
background: none;
57+
}
58+
.extended {
59+
.bo;
60+
.jo.ki;
61+
}

0 commit comments

Comments
 (0)
0