in src/parser/cssParser.ts [992:1046]
public _parseMediaFeature(): nodes.Node | null {
const resyncStopToken = [TokenType.ParenthesisR];
const node = this.create(nodes.MediaFeature);
// <media-feature> = ( [ <mf-plain> | <mf-boolean> | <mf-range> ] )
// <mf-plain> = <mf-name> : <mf-value>
// <mf-boolean> = <mf-name>
// <mf-range> = <mf-name> [ '<' | '>' ]? '='? <mf-value> | <mf-value> [ '<' | '>' ]? '='? <mf-name> | <mf-value> '<' '='? <mf-name> '<' '='? <mf-value> | <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>
const parseRangeOperator = () => {
if (this.acceptDelim('<') || this.acceptDelim('>')) {
if (!this.hasWhitespace()) {
this.acceptDelim('=');
}
return true;
} else if (this.acceptDelim('=')) {
return true;
}
return false;
};
if (node.addChild(this._parseMediaFeatureName())) {
if (this.accept(TokenType.Colon)) {
if (!node.addChild(this._parseMediaFeatureValue())) {
return this.finish(node, ParseError.TermExpected, [], resyncStopToken);
}
} else if (parseRangeOperator()) {
if (!node.addChild(this._parseMediaFeatureValue())) {
return this.finish(node, ParseError.TermExpected, [], resyncStopToken);
}
if (parseRangeOperator()) {
if (!node.addChild(this._parseMediaFeatureValue())) {
return this.finish(node, ParseError.TermExpected, [], resyncStopToken);
}
}
} else {
// <mf-boolean> = <mf-name>
}
} else if (node.addChild(this._parseMediaFeatureValue())) {
if (!parseRangeOperator()) {
return this.finish(node, ParseError.OperatorExpected, [], resyncStopToken);
}
if (!node.addChild(this._parseMediaFeatureName())) {
return this.finish(node, ParseError.IdentifierExpected, [], resyncStopToken);
}
if (parseRangeOperator()) {
if (!node.addChild(this._parseMediaFeatureValue())) {
return this.finish(node, ParseError.TermExpected, [], resyncStopToken);
}
}
} else {
return this.finish(node, ParseError.IdentifierExpected, [], resyncStopToken);
}
return this.finish(node);
}