Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        /// <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);
        }