|
'use strict'; |
|
|
|
const types = require('../../tokenizer/types.cjs'); |
|
|
|
const MediaFeatureToken = new Set([types.Colon, types.RightParenthesis, types.EOF]); |
|
|
|
const name = 'MediaCondition'; |
|
const structure = { |
|
children: [[ |
|
'Identifier', |
|
'MediaFeature', |
|
'MediaFeatureRange' |
|
]] |
|
}; |
|
|
|
function parse() { |
|
const children = this.createList(); |
|
|
|
scan: while (!this.eof) { |
|
switch (this.tokenType) { |
|
case types.Comment: |
|
case types.WhiteSpace: |
|
this.next(); |
|
continue; |
|
|
|
case types.Ident: |
|
children.push(this.Identifier()); |
|
break; |
|
|
|
case types.LeftParenthesis: |
|
if (this.lookupTypeNonSC(1) === types.Ident && MediaFeatureToken.has(this.lookupTypeNonSC(2))) { |
|
children.push(this.MediaFeature()); |
|
} else if (this.lookupTypeNonSC(1) === types.LeftParenthesis || this.lookupTypeNonSC(2) === types.LeftParenthesis) { |
|
this.next(); |
|
children.push(this.MediaCondition()); |
|
this.eat(types.RightParenthesis); |
|
} else { |
|
children.push(this.MediaFeatureRange()); |
|
} |
|
|
|
break; |
|
|
|
default: |
|
break scan; |
|
} |
|
} |
|
|
|
return { |
|
type: 'MediaCondition', |
|
loc: this.getLocationFromList(children), |
|
children |
|
}; |
|
} |
|
|
|
function generate(node) { |
|
node.children.forEach(child => { |
|
if (child.type === 'MediaCondition') { |
|
this.token(types.LeftParenthesis, '('); |
|
this.node(child); |
|
this.token(types.RightParenthesis, ')'); |
|
} else { |
|
this.node(child); |
|
} |
|
}); |
|
} |
|
|
|
exports.generate = generate; |
|
exports.name = name; |
|
exports.parse = parse; |
|
exports.structure = structure; |
|
|