| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- '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 ]? <media-type>
- 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 <media-condition-without-or>
- 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: {
- // <media-condition>
- 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;
|