Skip to content

Commit f9e8776

Browse files
committed
Support simple blocks in functions
This adds support for simple blocks within functions, for example: calc((100% - 1px) / 2)
1 parent 694fac4 commit f9e8776

File tree

6 files changed

+30
-4
lines changed

6 files changed

+30
-4
lines changed

src/css/Parser.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,7 +1563,7 @@ Parser.prototype = function(){
15631563
value = null,
15641564
operator = null;
15651565

1566-
value = this._term();
1566+
value = this._term(inFunction);
15671567
if (value !== null){
15681568

15691569
values.push(value);
@@ -1580,7 +1580,7 @@ Parser.prototype = function(){
15801580
valueParts = [];
15811581
}*/
15821582

1583-
value = this._term();
1583+
value = this._term(inFunction);
15841584

15851585
if (value === null){
15861586
break;
@@ -1598,7 +1598,7 @@ Parser.prototype = function(){
15981598
return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null;
15991599
},
16001600

1601-
_term: function(){
1601+
_term: function(inFunction){
16021602

16031603
/*
16041604
* term
@@ -1612,6 +1612,7 @@ Parser.prototype = function(){
16121612
var tokenStream = this._tokenStream,
16131613
unary = null,
16141614
value = null,
1615+
endChar = null,
16151616
token,
16161617
line,
16171618
col;
@@ -1632,6 +1633,20 @@ Parser.prototype = function(){
16321633
col = tokenStream.token().startCol;
16331634
}
16341635

1636+
//see if it's a simple block
1637+
} else if (inFunction && tokenStream.match([Tokens.LPAREN, Tokens.LBRACE, Tokens.LBRACKET])){
1638+
1639+
token = tokenStream.token();
1640+
endChar = token.endChar;
1641+
value = token.value + this._expr(inFunction).text;
1642+
if (unary === null){
1643+
line = tokenStream.token().startLine;
1644+
col = tokenStream.token().startCol;
1645+
}
1646+
tokenStream.mustMatch(Tokens.type(endChar));
1647+
value += endChar;
1648+
this._readWhitespace();
1649+
16351650
//see if there's a simple match
16361651
} else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH,
16371652
Tokens.ANGLE, Tokens.TIME,

src/css/TokenStream.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
314314
value: value,
315315
type: tt,
316316
channel: options.channel,
317+
endChar: options.endChar,
317318
hide: options.hide || false,
318319
startLine: startLine,
319320
startCol: startCol,
@@ -383,12 +384,15 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
383384
*/
384385
charToken: function(c, startLine, startCol){
385386
var tt = Tokens.type(c);
387+
var opts = {};
386388

387389
if (tt == -1){
388390
tt = Tokens.CHAR;
391+
} else {
392+
opts.endChar = Tokens[tt].endChar;
389393
}
390394

391-
return this.createToken(tt, c, startLine, startCol);
395+
return this.createToken(tt, c, startLine, startCol, opts);
392396
},
393397

394398
/**

src/css/Tokens.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ var Tokens = [
132132

133133
{
134134
name: "LBRACE",
135+
endChar: "}",
135136
text: "{"
136137
},
137138
{
@@ -140,6 +141,7 @@ var Tokens = [
140141
},
141142
{
142143
name: "LBRACKET",
144+
endChar: "]",
143145
text: "["
144146
},
145147
{
@@ -161,6 +163,7 @@ var Tokens = [
161163

162164
{
163165
name: "LPAREN",
166+
endChar: ")",
164167
text: "("
165168
},
166169
{

tests/css/CSSTokensTests.htm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ <h1>CSS Tokens Tests</h1>
424424
"rgb(255,0,1)" : [CSSTokens.FUNCTION, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.RPAREN],
425425
"counter(par-num,upper-roman)" : [CSSTokens.FUNCTION, CSSTokens.IDENT, CSSTokens.COMMA, CSSTokens.IDENT, CSSTokens.RPAREN],
426426
"calc(100% - 5px)" : [CSSTokens.FUNCTION, CSSTokens.PERCENTAGE, CSSTokens.S, CSSTokens.MINUS, CSSTokens.S, CSSTokens.LENGTH, CSSTokens.RPAREN],
427+
"calc((5em - 100%) / -2)" : [CSSTokens.FUNCTION, CSSTokens.LPAREN, CSSTokens.LENGTH, CSSTokens.S, CSSTokens.MINUS, CSSTokens.S, CSSTokens.PERCENTAGE, CSSTokens.RPAREN, CSSTokens.S, CSSTokens.SLASH, CSSTokens.S, CSSTokens.MINUS, CSSTokens.NUMBER, CSSTokens.RPAREN],
427428

428429
//old-style IE filters - interpreted as bunch of tokens
429430
"alpha(opacity=50)" : [CSSTokens.FUNCTION, CSSTokens.IDENT, CSSTokens.EQUALS, CSSTokens.NUMBER, CSSTokens.RPAREN],

tests/css/TokenStream.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@
410410
"rgb(255,0,1)" : [CSSTokens.FUNCTION, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.RPAREN],
411411
"counter(par-num,upper-roman)" : [CSSTokens.FUNCTION, CSSTokens.IDENT, CSSTokens.COMMA, CSSTokens.IDENT, CSSTokens.RPAREN],
412412
"calc(100% - 5px)" : [CSSTokens.FUNCTION, CSSTokens.PERCENTAGE, CSSTokens.S, CSSTokens.MINUS, CSSTokens.S, CSSTokens.LENGTH, CSSTokens.RPAREN],
413+
"calc((5em - 100%) / -2)" : [CSSTokens.FUNCTION, CSSTokens.LPAREN, CSSTokens.LENGTH, CSSTokens.S, CSSTokens.MINUS, CSSTokens.S, CSSTokens.PERCENTAGE, CSSTokens.RPAREN, CSSTokens.S, CSSTokens.SLASH, CSSTokens.S, CSSTokens.MINUS, CSSTokens.NUMBER, CSSTokens.RPAREN],
413414

414415
//old-style IE filters - interpreted as bunch of tokens
415416
"alpha(opacity=50)" : [CSSTokens.FUNCTION, CSSTokens.IDENT, CSSTokens.EQUALS, CSSTokens.NUMBER, CSSTokens.RPAREN],

tests/css/Validation.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,8 @@
633633
"calc(100% + 1em)",
634634
"calc(100%/6)",
635635
"calc(10%*6)",
636+
"calc((5em - 100%) / -2)",
637+
"calc(((100% - 15%) / 3 - 1px) * 3 + 10%)",
636638
"min-content",
637639
"-moz-fit-content",
638640
"-moz-available",

0 commit comments

Comments
 (0)