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