private MediaFeature CreateFeature(ref Token token) { if (token.Type == TokenType.Ident) { var start = token.Position; var val = TokenValue.Empty; var feature = _parser.Options.AllowInvalidConstraints ? new UnknownMediaFeature(token.Data) : MediaFeatureFactory.Instance.Create(token.Data); token = NextToken(); if (token.Type == TokenType.Colon) { var value = Pool.NewValueBuilder(); token = NextToken(); while (token.IsNot(TokenType.RoundBracketClose, TokenType.EndOfFile) || !value.IsReady) { value.Apply(token); token = NextToken(); } val = value.ToPool(); } else if (token.Type == TokenType.EndOfFile) { return(null); } if ((feature != null) && feature.TrySetValue(val)) { var node = feature as StylesheetNode; if (node != null) { var end = token.Position.Shift(-1); node.StylesheetText = CreateView(start, end); } return(feature); } } else { JumpToArgEnd(ref token); } return(null); }
private TokenValue CreateValue(TokenType closing, ref Token token, out bool important) { var value = Pool.NewValueBuilder(); _lexer.IsInValue = true; token = NextToken(); var start = token.Position; while (token.IsNot(TokenType.EndOfFile, TokenType.Semicolon, closing)) { value.Apply(token); token = NextToken(); } important = value.IsImportant; _lexer.IsInValue = false; var valueIsValid = value.IsValid; var result = value.ToPool(); //var node = result as StylesheetNode; var node = (StylesheetNode)result; if (node != null) { var end = token.Position.Shift(-1); node.StylesheetText = CreateView(start, end); } if (!valueIsValid && !_parser.Options.AllowInvalidValues) { RaiseErrorOccurred(ParseError.InvalidValue, start); result = null; } return(result); }