コード例 #1
0
        /// <summary>
        /// The general state.
        /// </summary>
        /// <param name="token">The current token.</param>
        /// <returns>The status.</returns>
        Boolean Data(CssToken token)
        {
            if (token.Type == CssTokenType.AtKeyword)
            {
                switch (((CssKeywordToken)token).Data)
                {
                case RuleNames.MEDIA:
                {
                    AddRule(new CSSMediaRule());
                    SwitchTo(CssState.InMediaList);
                    break;
                }

                case RuleNames.PAGE:
                {
                    AddRule(new CSSPageRule());
                    SwitchTo(CssState.InSelector);
                    break;
                }

                case RuleNames.IMPORT:
                {
                    AddRule(new CSSImportRule());
                    SwitchTo(CssState.BeforeImport);
                    break;
                }

                case RuleNames.FONT_FACE:
                {
                    AddRule(new CSSFontFaceRule());
                    SwitchTo(CssState.InDeclaration);
                    break;
                }

                case RuleNames.CHARSET:
                {
                    AddRule(new CSSCharsetRule());
                    SwitchTo(CssState.BeforeCharset);
                    break;
                }

                case RuleNames.NAMESPACE:
                {
                    AddRule(new CSSNamespaceRule());
                    SwitchTo(CssState.BeforeNamespacePrefix);
                    break;
                }

                case RuleNames.SUPPORTS:
                {
                    buffer = Pool.NewStringBuilder();
                    AddRule(new CSSSupportsRule());
                    SwitchTo(CssState.InCondition);
                    break;
                }

                case RuleNames.KEYFRAMES:
                {
                    AddRule(new CSSKeyframesRule());
                    SwitchTo(CssState.BeforeKeyframesName);
                    break;
                }

                case RuleNames.DOCUMENT:
                {
                    AddRule(new CSSDocumentRule());
                    SwitchTo(CssState.BeforeDocumentFunction);
                    break;
                }

                default:
                {
                    buffer = Pool.NewStringBuilder();
                    AddRule(new CSSUnknownRule());
                    SwitchTo(CssState.InUnknown);
                    InUnknown(token);
                    break;
                }
                }

                return(true);
            }
            else if (token.Type == CssTokenType.CurlyBracketClose)
            {
                return(CloseRule());
            }
            else
            {
                AddRule(new CSSStyleRule());
                SwitchTo(CssState.InSelector);
                InSelector(token);
                return(true);
            }
        }
コード例 #2
0
        public Property CreateDeclarationWith(Func<string, Property> createProperty, ref Token token)
        {
            var property = default(Property);

            var sb = Pool.NewStringBuilder();
            var start = token.Position;

            while (token.IsDeclarationName())
            {
                sb.Append(token.ToValue());
                token = NextToken();
            }

            var propertyName = sb.ToPool();

            if (propertyName.Length > 0)
            {
                property = _parser.Options.IncludeUnknownDeclarations ||
                           _parser.Options.AllowInvalidValues
                    ? new UnknownProperty(propertyName)
                    : createProperty(propertyName);

                if (property == null)
                {
                    RaiseErrorOccurred(ParseError.UnknownDeclarationName, start);
                }
                else
                {
                    _nodes.Push(property);
                }

                ParseComments(ref token);

                if (token.Type == TokenType.Colon)
                {
                    bool important;
                    var value = CreateValue(TokenType.CurlyBracketClose, ref token, out important);

                    if (value == null)
                    {
                        RaiseErrorOccurred(ParseError.ValueMissing, token.Position);
                    }
                    else if ((property != null) && property.TrySetValue(value))
                    {
                        property.IsImportant = important;
                    }

                    ParseComments(ref token);
                }
                else
                {
                    RaiseErrorOccurred(ParseError.ColonMissing, token.Position);
                }

                JumpToDeclEnd(ref token);

                if (property != null)
                {
                    _nodes.Pop();
                }
            }
            else if (token.Type != TokenType.EndOfFile)
            {
                RaiseErrorOccurred(ParseError.IdentExpected, start);
                JumpToDeclEnd(ref token);
            }

            if (token.Type == TokenType.Semicolon)
            {
                token = NextToken();
            }

            return property;
        }