/// <summary> /// Consumes a sequence of tokens representing a UVSS style or UVSS trigger. /// </summary> /// <param name="state">The parser state.</param> /// <param name="styles">The list containing the styles being created.</param> /// <param name="triggers">The list containing the triggers being created.</param> /// <returns><c>true</c> if a style or trigger was successfully consumed; otherwise, <c>false</c>.</returns> private static Boolean ConsumeStyleOrTrigger(UvssParserState state, List<UvssStyle> styles, List<Trigger> triggers) { state.AdvanceBeyondWhiteSpace(); if (state.IsPastEndOfStream) return false; var qualifierImportant = false; var nameToken = state.TryConsumeNonWhiteSpace(); if (nameToken.HasValue && nameToken.Value.TokenType == UvssLexerTokenType.TriggerKeyword) { return ConsumeTrigger(state, triggers); } MatchTokenOrFail(state, nameToken, UvssLexerTokenType.StyleName); AdvanceBeyondWhiteSpaceOrFail(state); UvssStyleArgumentsCollection arguments; if (state.CurrentToken.TokenType == UvssLexerTokenType.OpenParenthesis) { arguments = ConsumeStyleArguments(state); ValidateStyleArguments(state, nameToken.Value.Value, arguments); } else { arguments = new UvssStyleArgumentsCollection(null); } var colonToken = state.TryConsumeNonWhiteSpace(); MatchTokenOrFail(state, colonToken, UvssLexerTokenType.Colon); var valueTokens = new List<UvssLexerToken>(); while (!state.IsPastEndOfStream) { var token = state.Consume(); if (token.TokenType == UvssLexerTokenType.Semicolon) { break; } if (token.TokenType == UvssLexerTokenType.StyleQualifier) { if (String.Equals("!important", token.Value, StringComparison.OrdinalIgnoreCase)) { qualifierImportant = true; } continue; } valueTokens.Add(token); } var container = default(String); var name = nameToken.Value.Value; var value = String.Join(String.Empty, valueTokens.Select(x => x.Value)).Trim(); if (name.Contains('.')) { var nameParts = name.Split('.'); container = nameParts[0]; name = nameParts[1]; } var style = new UvssStyle(arguments, container, name, value, qualifierImportant); styles.Add(style); return true; }
/// <summary> /// Validates a style argument list. /// </summary> /// <param name="state">The parser state.</param> /// <param name="style">The name of the style being validated.</param> /// <param name="arguments">The style argument list being validated.</param> private static void ValidateStyleArguments(UvssParserState state, String style, UvssStyleArgumentsCollection arguments) { if (!String.Equals(style, "transition", StringComparison.OrdinalIgnoreCase)) ThrowInvalidStyleArguments(state, style); if (arguments.Count != 2 && arguments.Count != 3) ThrowInvalidStyleArguments(state, style); }