@@ -70,6 +70,7 @@ import org.w3c.css.values.CssCheckableValue;
70
70
import org.w3c.css.values.CssClamp;
71
71
import org.w3c.css.values.CssColor;
72
72
import org.w3c.css.values.CssComparator;
73
+ import org.w3c.css.values.CssEnv;
73
74
import org.w3c.css.values.CssExpression;
74
75
import org.w3c.css.values.CssFlexibleLength;
75
76
import org.w3c.css.values.CssFrequency;
@@ -431,6 +432,10 @@ public abstract class CssParser {
431
432
if (v.getType() == CssTypes.CSS_VARIABLE) {
432
433
expr.markCssVariable();
433
434
}
435
+ } else if ( token == FUNCTIONENV ) {
436
+ if (v.getType() == CssTypes.CSS_ENV) {
437
+ expr.markCssVariable();
438
+ }
434
439
} else if ( token == FUNCTIONCALC ) {
435
440
CssCalc c = (CssCalc) v;
436
441
if (c.hasCssVariable()) {
@@ -773,7 +778,8 @@ TOKEN [IGNORE_CASE] :
773
778
| <FUNCTIONMAX : "max(" >
774
779
| <FUNCTIONCLAMP : "clamp(" >
775
780
| <FUNCTIONATTR : "attr(" >
776
- | <FUNCTIONVAR : "var(" >
781
+ | <FUNCTIONVAR : "var(" >
782
+ | <FUNCTIONENV : "env(" >
777
783
}
778
784
779
785
<DEFAULT>
@@ -2948,6 +2954,7 @@ void term(CssExpression exp) :
2948
2954
| func=mathclamp() { setValue(func, exp, operator, null, FUNCTION); }
2949
2955
| func=attr() { setValue(func, exp, operator, null, FUNCTION); }
2950
2956
| func=functionvar() { setValue(func, exp, operator, null, FUNCTIONVAR); }
2957
+ | func=functionenv() { setValue(func, exp, operator, null, FUNCTIONENV); }
2951
2958
| func=function() { setValue(func, exp, operator, null, FUNCTION); }
2952
2959
| n=<STRING> { setValue(new CssString(), exp, operator, n, STRING); }
2953
2960
| n=<DIV> { setValue(new CssSwitch(), exp, operator, n, DIV); }
@@ -3362,6 +3369,38 @@ CssExpression exp = null;
3362
3369
}
3363
3370
}
3364
3371
3372
+ CssCheckableValue functionenv() :
3373
+ { Token n;
3374
+ CssExpression exp = null;
3375
+ CssExpression e;
3376
+ CssEnv env = null;
3377
+ String skipped = null;
3378
+ }
3379
+ {
3380
+ <FUNCTIONENV> ( <S> )* n=<IDENT> ( <S> )* {
3381
+ env = new CssEnv(ac, convertIdent(n.image));
3382
+ e = new CssExpression();
3383
+ }
3384
+ ( term(e) )*
3385
+ ( <COMMA> ( <S> )* try {
3386
+ exp = expr()
3387
+ } catch (ParseException pe) {
3388
+ skipped = skip_to_matching_paren();
3389
+ // FIXME do something meaningful with that string
3390
+ exp = null;
3391
+ }
3392
+ )? <RPAREN>
3393
+ {
3394
+ env.setNumberExp(e);
3395
+ if (exp != null) {
3396
+ env.setDeclaration(exp);
3397
+ } else if (skipped != null) {
3398
+ // do something fancy here
3399
+ }
3400
+ return env;
3401
+ }
3402
+ }
3403
+
3365
3404
CssCheckableValue functionvar() :
3366
3405
{ Token n;
3367
3406
CssExpression exp = null;
@@ -3633,6 +3672,7 @@ String skip_to_matching_paren() {
3633
3672
case FUNCTIONCLAMP:
3634
3673
case FUNCTIONATTR:
3635
3674
case FUNCTIONVAR:
3675
+ case FUNCTIONENV:
3636
3676
s.append(tok.image);
3637
3677
nesting++;
3638
3678
getNextToken();
0 commit comments