Skip to content

Commit 8ca2d38

Browse files
committed
Merge pull request #35 from fracmak/calc_support
added support for calc wherever <length> is expected
2 parents a2aed01 + ebf3f4a commit 8ca2d38

File tree

5 files changed

+21
-8
lines changed

5 files changed

+21
-8
lines changed

src/css/Parser.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -708,18 +708,21 @@ Parser.prototype = function(){
708708
});
709709
},
710710

711-
_operator: function(){
711+
_operator: function(inFunction){
712712

713713
/*
714-
* operator
714+
* operator (outside function)
715715
* : '/' S* | ',' S* | /( empty )/
716+
* operator (inside function)
717+
* : '/' S* | '+' S* | '*' S* | '-' S* /( empty )/
716718
* ;
717719
*/
718720

719721
var tokenStream = this._tokenStream,
720722
token = null;
721723

722-
if (tokenStream.match([Tokens.SLASH, Tokens.COMMA])){
724+
if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) ||
725+
(inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))){
723726
token = tokenStream.token();
724727
this._readWhitespace();
725728
}
@@ -1506,7 +1509,7 @@ Parser.prototype = function(){
15061509
return result;
15071510
},
15081511

1509-
_expr: function(){
1512+
_expr: function(inFunction){
15101513
/*
15111514
* expr
15121515
* : term [ operator term ]*
@@ -1525,8 +1528,8 @@ Parser.prototype = function(){
15251528
values.push(value);
15261529

15271530
do {
1528-
operator = this._operator();
1529-
1531+
operator = this._operator(inFunction);
1532+
15301533
//if there's an operator, keep building up the value parts
15311534
if (operator){
15321535
values.push(operator);
@@ -1662,7 +1665,7 @@ Parser.prototype = function(){
16621665
if (tokenStream.match(Tokens.FUNCTION)){
16631666
functionText = tokenStream.token().value;
16641667
this._readWhitespace();
1665-
expr = this._expr();
1668+
expr = this._expr(true);
16661669
functionText += expr;
16671670

16681671
//START: Horrible hack in case it's an IE filter

src/css/ValidationTypes.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ var ValidationTypes = {
121121
},
122122

123123
"<length>": function(part){
124-
return part.type == "length" || part.type == "number" || part.type == "integer" || part == "0";
124+
if (part.type == "function" && /^(?:\-(?:ms|moz|o|webkit)\-)?calc/i.test(part)){
125+
return true;
126+
}else{
127+
return part.type == "length" || part.type == "number" || part.type == "integer" || part == "0";
128+
}
125129
},
126130

127131
"<color>": function(part){

tests/css/CSSTokensTests.htm

+1
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ <h1>CSS Tokens Tests</h1>
420420
//regular CSS functions
421421
"rgb(255,0,1)" : [CSSTokens.FUNCTION, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.RPAREN],
422422
"counter(par-num,upper-roman)" : [CSSTokens.FUNCTION, CSSTokens.IDENT, CSSTokens.COMMA, CSSTokens.IDENT, CSSTokens.RPAREN],
423+
"calc(100% - 5px)" : [CSSTokens.FUNCTION, CSSTokens.PERCENTAGE, CSSTokens.S, CSSTokens.MINUS, CSSTokens.S, CSSTokens.LENGTH, CSSTokens.RPAREN],
423424

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

tests/css/TokenStream.js

+1
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@
405405
//regular CSS functions
406406
"rgb(255,0,1)" : [CSSTokens.FUNCTION, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.COMMA, CSSTokens.NUMBER, CSSTokens.RPAREN],
407407
"counter(par-num,upper-roman)" : [CSSTokens.FUNCTION, CSSTokens.IDENT, CSSTokens.COMMA, CSSTokens.IDENT, CSSTokens.RPAREN],
408+
"calc(100% - 5px)" : [CSSTokens.FUNCTION, CSSTokens.PERCENTAGE, CSSTokens.S, CSSTokens.MINUS, CSSTokens.S, CSSTokens.LENGTH, CSSTokens.RPAREN],
408409

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

tests/css/Validation.js

+4
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,10 @@
492492
valid: [
493493
"1px",
494494
"1%",
495+
"calc(100% - 5px)",
496+
"calc(100% + 1em)",
497+
"calc(100%/6)",
498+
"calc(10%*6)",
495499
"inherit"
496500
],
497501

0 commit comments

Comments
 (0)