'use strict'; const types = require('../../tokenizer/types.cjs'); const name = 'MediaQuery'; const structure = { modifier: [String, null], mediaType: [String, null], condition: ['Condition', null] }; function parse() { const start = this.tokenStart; let modifier = null; let mediaType = null; let condition = null; this.skipSC(); if (this.tokenType === types.Ident && this.lookupTypeNonSC(1) !== types.LeftParenthesis) { // [ not | only ]? const ident = this.consume(types.Ident); const identLowerCase = ident.toLowerCase(); if (identLowerCase === 'not' || identLowerCase === 'only') { this.skipSC(); modifier = identLowerCase; mediaType = this.consume(types.Ident); } else { mediaType = ident; } switch (this.lookupTypeNonSC(0)) { case types.Ident: { // and this.skipSC(); this.eatIdent('and'); condition = this.Condition('media'); break; } case types.LeftCurlyBracket: case types.Semicolon: case types.Comma: case types.EOF: break; default: this.error('Identifier or parenthesis is expected'); } } else { switch (this.tokenType) { case types.Ident: case types.LeftParenthesis: case types.Function: { // condition = this.Condition('media'); break; } case types.LeftCurlyBracket: case types.Semicolon: case types.EOF: break; default: this.error('Identifier or parenthesis is expected'); } } return { type: 'MediaQuery', loc: this.getLocation(start, this.tokenStart), modifier, mediaType, condition }; } function generate(node) { if (node.mediaType) { if (node.modifier) { this.token(types.Ident, node.modifier); } this.token(types.Ident, node.mediaType); if (node.condition) { this.token(types.Ident, 'and'); this.node(node.condition); } } else if (node.condition) { this.node(node.condition); } } exports.generate = generate; exports.name = name; exports.parse = parse; exports.structure = structure;