Skip to content

Commit 278ca96

Browse files
Merge branch 'next'
2 parents 9d3a80c + fd1182b commit 278ca96

File tree

5 files changed

+282
-7
lines changed

5 files changed

+282
-7
lines changed

lib/less/functions.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,17 @@ tree.functions = {
432432
},
433433
shade: function(color, amount) {
434434
return this.mix(this.rgb(0, 0, 0), color, amount);
435-
},
435+
},
436436
extract: function(values, index) {
437-
index = index.value - 1; // (1-based index)
438-
return values.value[index];
437+
index = index.value - 1; // (1-based index)
438+
// handle non-array values as an array of length 1
439+
// return 'undefined' if index is invalid
440+
return Array.isArray(values.value)
441+
? values.value[index] : Array(values)[index];
442+
},
443+
length: function(values) {
444+
var n = Array.isArray(values.value) ? values.value.length : 1;
445+
return new tree.Dimension(n);
439446
},
440447

441448
"data-uri": function(mimetypeNode, filePathNode) {

test/css/extract-and-length.css

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
.multiunit {
2+
length: 6;
3+
extract: abc "abc" 1 1px 1% #112233;
4+
}
5+
.incorrect-index {
6+
v1: extract(a b c, 5);
7+
v2: extract(a, b, c, -2);
8+
}
9+
.scalar {
10+
var-value: variable;
11+
var-length: 1;
12+
ill-index: extract(variable, 2);
13+
name-value: name;
14+
string-value: "string";
15+
number-value: 12345678;
16+
color-value: #0000ff;
17+
rgba-value: rgba(80, 160, 240, 0.67);
18+
empty-value: ;
19+
name-length: 1;
20+
string-length: 1;
21+
number-length: 1;
22+
color-length: 1;
23+
rgba-length: 1;
24+
empty-length: 1;
25+
}
26+
.mixin-arguments-1 {
27+
length: 4;
28+
extract: c | b | a;
29+
}
30+
.mixin-arguments-2 {
31+
length: 4;
32+
extract: c | b | a;
33+
}
34+
.mixin-arguments-3 {
35+
length: 4;
36+
extract: c | b | a;
37+
}
38+
.mixin-arguments-4 {
39+
length: 0;
40+
extract: extract(, 2) | extract(, 1);
41+
}
42+
.mixin-arguments-2 {
43+
length: 4;
44+
extract: c | b | a;
45+
}
46+
.mixin-arguments-3 {
47+
length: 4;
48+
extract: c | b | a;
49+
}
50+
.mixin-arguments-4 {
51+
length: 3;
52+
extract: c | b;
53+
}
54+
.mixin-arguments-2 {
55+
length: 4;
56+
extract: 3 | 2 | 1;
57+
}
58+
.mixin-arguments-3 {
59+
length: 4;
60+
extract: 3 | 2 | 1;
61+
}
62+
.mixin-arguments-4 {
63+
length: 3;
64+
extract: 3 | 2;
65+
}
66+
.md-space-comma {
67+
length-1: 3;
68+
extract-1: 1 2 3;
69+
length-2: 3;
70+
extract-2: 2;
71+
}
72+
.md-space-comma-as-args-2 {
73+
length: 3;
74+
extract: "x" "y" "z" | 1 2 3 | a b c;
75+
}
76+
.md-space-comma-as-args-3 {
77+
length: 3;
78+
extract: "x" "y" "z" | 1 2 3 | a b c;
79+
}
80+
.md-space-comma-as-args-4 {
81+
length: 2;
82+
extract: "x" "y" "z" | 1 2 3;
83+
}
84+
.md-cat-space-comma {
85+
length-1: 3;
86+
extract-1: 1 2 3;
87+
length-2: 3;
88+
extract-2: 2;
89+
}
90+
.md-cat-space-comma-as-args-2 {
91+
length: 3;
92+
extract: "x" "y" "z" | 1 2 3 | a b c;
93+
}
94+
.md-cat-space-comma-as-args-3 {
95+
length: 3;
96+
extract: "x" "y" "z" | 1 2 3 | a b c;
97+
}
98+
.md-cat-space-comma-as-args-4 {
99+
length: 2;
100+
extract: "x" "y" "z" | 1 2 3;
101+
}
102+
.md-cat-comma-space {
103+
length-1: 3;
104+
extract-1: 1, 2, 3;
105+
length-2: 3;
106+
extract-2: 2;
107+
}
108+
.md-cat-comma-space-as-args-1 {
109+
length: 3;
110+
extract: "x", "y", "z" | 1, 2, 3 | a, b, c;
111+
}
112+
.md-cat-comma-space-as-args-2 {
113+
length: 3;
114+
extract: "x", "y", "z" | 1, 2, 3 | a, b, c;
115+
}
116+
.md-cat-comma-space-as-args-3 {
117+
length: 3;
118+
extract: "x", "y", "z" | 1, 2, 3 | a, b, c;
119+
}
120+
.md-cat-comma-space-as-args-4 {
121+
length: 0;
122+
extract: extract(, 2) | extract(, 1);
123+
}
124+
.md-3D {
125+
length-1: 2;
126+
extract-1: a b c d, 1 2 3 4;
127+
length-2: 2;
128+
extract-2: 5 6 7 8;
129+
length-3: 4;
130+
extract-3: 7;
131+
length-4: 1;
132+
extract-4: 8;
133+
}

test/css/functions.css

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
average: #7b007b;
134134
negation: #d73131;
135135
}
136-
#extract {
137-
result: 3 2 1 C B A;
136+
#extract-and-length {
137+
extract: 3 2 1 C B A;
138+
length: 6;
138139
}

test/less/extract-and-length.less

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
2+
// simple array/list:
3+
4+
.multiunit {
5+
@v: abc "abc" 1 1px 1% #123;
6+
length: length(@v);
7+
extract: extract(@v, 1) extract(@v, 2) extract(@v, 3) extract(@v, 4) extract(@v, 5) extract(@v, 6);
8+
}
9+
10+
.incorrect-index {
11+
@v1: a b c;
12+
@v2: a, b, c;
13+
v1: extract(@v1, 5);
14+
v2: extract(@v2, -2);
15+
}
16+
17+
.scalar {
18+
@var: variable;
19+
var-value: extract(@var, 1);
20+
var-length: length(@var);
21+
ill-index: extract(@var, 2);
22+
23+
name-value: extract(name, 1);
24+
string-value: extract("string", 1);
25+
number-value: extract(12345678, 1);
26+
color-value: extract(blue, 1);
27+
rgba-value: extract(rgba(80, 160, 240, 0.67), 1);
28+
empty-value: extract(~'', 1);
29+
30+
name-length: length(name);
31+
string-length: length("string");
32+
number-length: length(12345678);
33+
color-length: length(blue);
34+
rgba-length: length(rgba(80, 160, 240, 0.67));
35+
empty-length: length(~'');
36+
}
37+
38+
.mixin-arguments {
39+
.mixin-args(a b c d);
40+
.mixin-args(a, b, c, d);
41+
.mixin-args(1; 2; 3; 4);
42+
}
43+
44+
.mixin-args(@value) {
45+
&-1 {
46+
length: length(@value);
47+
extract: extract(@value, 3) ~"|" extract(@value, 2) ~"|" extract(@value, 1);
48+
}
49+
}
50+
51+
.mixin-args(...) {
52+
&-2 {
53+
length: length(@arguments);
54+
extract: extract(@arguments, 3) ~"|" extract(@arguments, 2) ~"|" extract(@arguments, 1);
55+
}
56+
}
57+
58+
.mixin-args(@values...) {
59+
&-3 {
60+
length: length(@values);
61+
extract: extract(@values, 3) ~"|" extract(@values, 2) ~"|" extract(@values, 1);
62+
}
63+
}
64+
65+
.mixin-args(@head, @tail...) {
66+
&-4 {
67+
length: length(@tail);
68+
extract: extract(@tail, 2) ~"|" extract(@tail, 1);
69+
}
70+
}
71+
72+
// "multidimensional" array/list
73+
74+
.md-space-comma {
75+
@v: a b c, 1 2 3, "x" "y" "z";
76+
length-1: length(@v);
77+
extract-1: extract(@v, 2);
78+
length-2: length(extract(@v, 2));
79+
extract-2: extract(extract(@v, 2), 2);
80+
81+
&-as-args {.mixin-args(a b c, 1 2 3, "x" "y" "z")}
82+
}
83+
84+
.md-cat-space-comma {
85+
@a: a b c;
86+
@b: 1 2 3;
87+
@c: "x" "y" "z";
88+
@v: @a, @b, @c;
89+
length-1: length(@v);
90+
extract-1: extract(@v, 2);
91+
length-2: length(extract(@v, 2));
92+
extract-2: extract(extract(@v, 2), 2);
93+
94+
&-as-args {.mixin-args(@a, @b, @c)}
95+
}
96+
97+
.md-cat-comma-space {
98+
@a: a, b, c;
99+
@b: 1, 2, 3;
100+
@c: "x", "y", "z";
101+
@v: @a @b @c;
102+
length-1: length(@v);
103+
extract-1: extract(@v, 2);
104+
length-2: length(extract(@v, 2));
105+
extract-2: extract(extract(@v, 2), 2);
106+
107+
&-as-args {.mixin-args(@a @b @c)}
108+
}
109+
110+
.md-3D {
111+
@a: a b c d, 1 2 3 4;
112+
@b: 5 6 7 8, e f g h;
113+
.3D(@a, @b);
114+
115+
.3D(...) {
116+
117+
@v1: @arguments;
118+
length-1: length(@v1);
119+
extract-1: extract(@v1, 1);
120+
121+
@v2: extract(@v1, 2);
122+
length-2: length(@v2);
123+
extract-2: extract(@v2, 1);
124+
125+
@v3: extract(@v2, 1);
126+
length-3: length(@v3);
127+
extract-3: extract(@v3, 3);
128+
129+
@v4: extract(@v3, 4);
130+
length-4: length(@v4);
131+
extract-4: extract(@v4, 1);
132+
}
133+
}

test/less/functions.less

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@
146146
negation: negation(#f60000, #313131);
147147
}
148148

149-
#extract {
149+
#extract-and-length {
150150
@anon: A B C 1 2 3;
151-
result: extract(@anon, 6) extract(@anon, 5) extract(@anon, 4) extract(@anon, 3) extract(@anon, 2) extract(@anon, 1);
151+
extract: extract(@anon, 6) extract(@anon, 5) extract(@anon, 4) extract(@anon, 3) extract(@anon, 2) extract(@anon, 1);
152+
length: length(@anon);
152153
}

0 commit comments

Comments
 (0)