You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.9 KiB
76 lines
1.9 KiB
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(')'); |
|
} |
|
};
|
|
|