77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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(')');
 | 
						|
    }
 | 
						|
};
 |