public _parseMediaFeature()

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);
	}