processMediaQuery method

CSSMediaQuery? processMediaQuery()

//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////

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;
}