| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | var TYPE = require('../../tokenizer').TYPE;var IDENT = TYPE.Ident;var NUMBER = TYPE.Number;var DIMENSION = TYPE.Dimension;var LEFTPARENTHESIS = TYPE.LeftParenthesis;var RIGHTPARENTHESIS = TYPE.RightParenthesis;var COLON = TYPE.Colon;var DELIM = TYPE.Delim;module.exports = {    name: 'MediaFeature',    structure: {        name: String,        value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]    },    parse: function() {        var start = this.scanner.tokenStart;        var name;        var value = null;        this.eat(LEFTPARENTHESIS);        this.scanner.skipSC();        name = this.consume(IDENT);        this.scanner.skipSC();        if (this.scanner.tokenType !== RIGHTPARENTHESIS) {            this.eat(COLON);            this.scanner.skipSC();            switch (this.scanner.tokenType) {                case NUMBER:                    if (this.lookupNonWSType(1) === DELIM) {                        value = this.Ratio();                    } else {                        value = this.Number();                    }                    break;                case DIMENSION:                    value = this.Dimension();                    break;                case IDENT:                    value = this.Identifier();                    break;                default:                    this.error('Number, dimension, ratio or identifier is expected');            }            this.scanner.skipSC();        }        this.eat(RIGHTPARENTHESIS);        return {            type: 'MediaFeature',            loc: this.getLocation(start, this.scanner.tokenStart),            name: name,            value: value        };    },    generate: function(node) {        this.chunk('(');        this.chunk(node.name);        if (node.value !== null) {            this.chunk(':');            this.node(node.value);        }        this.chunk(')');    }};
 |