processMediaQuery method
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
Implementation
// Top level productions
///////////////////////////////////////////////////////////////////
CSSMediaQuery? processMediaQuery() {
// Grammar: [ONLY | NOT]? S* media_type S*
// [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]*
// Is it a unary media operator?
// @media only screen
var op = _peekToken.text; //only
var opLen = op.length;
var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen);
if (unaryOp != -1) {
_next();
}
Identifier? type;
// Get the media type.
if (_peekIdentifier()) type = identifier(); // screen
var exprs = <CSSMediaExpression>[];
while (true) {
// Parse AND if query has a media_type or previous expression.
if (exprs.isEmpty && type == null) {
op = MediaOperator.AND;
} else {
var andOp = exprs.isNotEmpty || type != null;
if (andOp) {
op = _peekToken.text; // and
opLen = op.length;
int matchMOP = TokenKind.matchMediaOperator(op, 0, opLen);
if (matchMOP != TokenKind.MEDIA_OP_AND && matchMOP != TokenKind.MEDIA_OP_OR) {
break;
}
_next();
}
}
var expr = processMediaExpression(op);
if (expr == null) break;
exprs.add(expr);
}
if (unaryOp != -1 || type != null || exprs.isNotEmpty) {
return CSSMediaQuery(unaryOp, type, exprs);
}
return null;
}