Skip to content

Commit 46fa131

Browse files
committed
Adding attribute selector with variable concatenation feature
1 parent 53f84f0 commit 46fa131

File tree

5 files changed

+41
-6
lines changed

5 files changed

+41
-6
lines changed

packages/less/src/less/parser/parser.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1448,8 +1448,18 @@ const Parser = function Parser(context, imports, fileInfo, currentIndex) {
14481448
//
14491449
let cif;
14501450

1451-
if (!(key = entities.variableCurly())) {
1452-
key = expect(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/);
1451+
let keys;
1452+
while((key = entities.variableCurly()) || (key = parserInput.$re(/^(?:[_A-Za-z0-9-*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/))){
1453+
if(keys){
1454+
keys.push(key);
1455+
}else{
1456+
keys = [key];
1457+
}
1458+
key = null
1459+
}
1460+
1461+
if(keys.length == 0){
1462+
error('unexpected token');
14531463
}
14541464

14551465
op = parserInput.$re(/^[|~*$^]?=/);
@@ -1462,7 +1472,7 @@ const Parser = function Parser(context, imports, fileInfo, currentIndex) {
14621472

14631473
expectChar(']');
14641474

1465-
return new(tree.Attribute)(key, op, val, cif);
1475+
return new(tree.Attribute)(keys, op, val, cif);
14661476
},
14671477

14681478
//

packages/less/src/less/tree/attribute.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ Attribute.prototype = Object.assign(new Node(), {
1111
type: 'Attribute',
1212

1313
eval(context) {
14+
let key = [];
15+
for(let i=0;i<this.key.length;++i){
16+
key.push(this.key[i].eval?this.key[i].eval(context):this.key[i]);
17+
}
1418
return new Attribute(
15-
this.key.eval ? this.key.eval(context) : this.key,
19+
key,
1620
this.op,
1721
(this.value && this.value.eval) ? this.value.eval(context) : this.value,
1822
this.cif
@@ -24,7 +28,10 @@ Attribute.prototype = Object.assign(new Node(), {
2428
},
2529

2630
toCSS(context) {
27-
let value = this.key.toCSS ? this.key.toCSS(context) : this.key;
31+
let value = '';
32+
for(let i=0;i<this.key.length;++i){
33+
value += this.key[i].toCSS ? this.key[i].toCSS(context) : this.key[i];
34+
}
2835

2936
if (this.op) {
3037
value += this.op;

packages/less/src/less/visitors/extend-visitor.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,17 @@ class ProcessExtendsVisitor {
375375
return elementValue1 === elementValue2;
376376
}
377377
if (elementValue1 instanceof tree.Attribute) {
378-
if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {
378+
if (elementValue1.op !== elementValue2.op) {
379379
return false;
380380
}
381+
if (elementValue1.key.length !== elementValue2.key.length) {
382+
return false;
383+
}
384+
for(let i=0;i<elementValue1.key.length;++i){
385+
if(elementValue1.key[i] !== elementValue2.key[i]){
386+
return false;
387+
}
388+
}
381389
if (!elementValue1.value || !elementValue2.value) {
382390
if (elementValue1.value || elementValue2.value) {
383391
return false;

packages/test-data/css/_main/selectors.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ p a span {
143143
[p] {
144144
attributes: yes;
145145
}
146+
[p-attr^="val3"],
147+
[p-attr=3],
148+
[p-attr] {
149+
attributes: yes;
150+
}
146151
/**
147152
* https://www.w3.org/TR/selectors-4/#attribute-case
148153
*/

packages/test-data/less/_main/selectors.less

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ a {
146146
[@{prop}] {
147147
attributes: yes;
148148
}
149+
[@{prop}-attr^="val@{num}"],
150+
[@{prop}-attr=@{num}],
151+
[@{prop}-attr] {
152+
attributes: yes;
153+
}
149154

150155
/**
151156
* https://www.w3.org/TR/selectors-4/#attribute-case

0 commit comments

Comments
 (0)