protected virtual ParseItem ParseName(ItemFactory itemFactory, ITextProvider text, TokenStream tokens) { ParseItem name = null; if (tokens.CurrentToken.TokenType == CssTokenType.Asterisk) { StarHackPropertyName customName = new StarHackPropertyName(); if (customName.Parse(itemFactory, text, tokens)) { name = customName; Children.Add(customName); } } else if (tokens.CurrentToken.TokenType == CssTokenType.Identifier) { CssClassifierContextType contextType = CssClassifierContextType.PropertyName; if (text.CompareTo(tokens.CurrentToken.Start, "--", true)) { IsCustomProperty = true; contextType = CssClassifierContextType.CustomPropertyName; } name = Children.AddCurrentAndAdvance(tokens, contextType); } return(name); }
public override bool Parse(ItemFactory itemFactory, ITextProvider text, TokenStream tokens) { UnitType = UnitType.Unknown; if (tokens.CurrentToken.TokenType == CssTokenType.Number) { if (!base.Parse(itemFactory, text, tokens)) { return(false); } } Debug.Assert(tokens.CurrentToken.TokenType == CssTokenType.Units); UnitToken = Children.AddCurrentAndAdvance(tokens, CssClassifierContextType.Units); UnitType = UnitHelpers.GetUnitType(text, UnitToken.Start, UnitToken.Length); CssClassifierContextType ct = CssClassifierContextType.Units; switch (UnitType) { case UnitType.Angle: ct = CssClassifierContextType.AngleUnits; break; case UnitType.Frequency: ct = CssClassifierContextType.FrequencyUnits; break; case UnitType.Grid: ct = CssClassifierContextType.GridUnits; break; case UnitType.Length: ct = CssClassifierContextType.LengthUnits; break; case UnitType.Percentage: ct = CssClassifierContextType.PercentUnits; break; case UnitType.Resolution: ct = CssClassifierContextType.ResolutionUnits; break; case UnitType.Time: ct = CssClassifierContextType.TimeUnits; break; case UnitType.Viewport: ct = CssClassifierContextType.ViewUnits; break; } UnitToken.Context = CssClassifierContextCache.FromTypeEnum(ct); return(Children.Count > 0); }
internal static IClassifierContext FromTypeEnum(CssClassifierContextType contextType) { int index = (int)contextType; if (s_cachedContexts[index] == null) { s_cachedContexts[index] = new CssClassifierContext(contextType); } return(s_cachedContexts[index]); }
public override bool Parse(ItemFactory itemFactory, ITextProvider text, TokenStream tokens) { CssTokenType tokenType = tokens.CurrentToken.TokenType; if (tokenType == CssTokenType.CommentText || tokenType == CssTokenType.SingleTokenComment || tokenType == CssTokenType.SingleLineComment) { CssClassifierContextType context = tokenType == CssTokenType.CommentText ? CssClassifierContextType.Default : CssClassifierContextType.Comment; Comment = Children.AddCurrentAndAdvance(tokens, context); } return(Children.Count > 0); }
public void GetClassificationNameTest() { // For every single classifier context, make sure that the name returned by // IClassifierContext.GetClassificationName is correct. int length = (int)CssClassifierContextType.CssClassifierContextTypeCount; for (int i = 0; i < length; i++) { CssClassifierContextType contextType = (CssClassifierContextType)i; IClassifierContext context = CssClassifierContextCache.FromTypeEnum(contextType); // Make sure I got the right thing from the cache Assert.IsNotNull(context); Assert.AreEqual((int)contextType, context.ContextValue); Assert.IsTrue(context.ClassificationName == "Default" || context.ClassificationName == "Css" + contextType.ToString()); } }
private static string InternalGetClassificationName(CssClassifierContextType contextType) { switch (contextType) { default: return("Default"); case CssClassifierContextType.Comment: return(ClassificationTypes.Comment); case CssClassifierContextType.String: return(ClassificationTypes.String); case CssClassifierContextType.Number: return(ClassificationTypes.Number); case CssClassifierContextType.Units: return(ClassificationTypes.Units); case CssClassifierContextType.Important: return(ClassificationTypes.Important); case CssClassifierContextType.ItemName: return(ClassificationTypes.ItemName); case CssClassifierContextType.ItemNamespace: return(ClassificationTypes.ItemNamespace); case CssClassifierContextType.CurlyBrace: return(ClassificationTypes.CurlyBrace); case CssClassifierContextType.FunctionName: return(ClassificationTypes.FunctionName); case CssClassifierContextType.FunctionBrace: return(ClassificationTypes.FunctionBrace); case CssClassifierContextType.FunctionArgument: return(ClassificationTypes.FunctionArgument); case CssClassifierContextType.AtDirectiveName: return(ClassificationTypes.AtDirectiveName); case CssClassifierContextType.AtDirectiveKeyword: return(ClassificationTypes.AtDirectiveKeyword); case CssClassifierContextType.CharsetName: return(ClassificationTypes.CharsetName); case CssClassifierContextType.ImportUrl: return(ClassificationTypes.ImportUrl); case CssClassifierContextType.UrlFunction: return(ClassificationTypes.UrlFunction); case CssClassifierContextType.UrlString: return(ClassificationTypes.UrlString); case CssClassifierContextType.HexColor: return(ClassificationTypes.HexColor); case CssClassifierContextType.FunctionColor: return(ClassificationTypes.FunctionColor); case CssClassifierContextType.ElementTagName: return(ClassificationTypes.ElementTagName); case CssClassifierContextType.ElementAttribute: return(ClassificationTypes.ElementAttribute); case CssClassifierContextType.ElementAttributeValue: return(ClassificationTypes.ElementAttributeValue); case CssClassifierContextType.LengthUnits: return(ClassificationTypes.LengthUnits); case CssClassifierContextType.TimeUnits: return(ClassificationTypes.TimeUnits); case CssClassifierContextType.ViewUnits: return(ClassificationTypes.ViewUnits); case CssClassifierContextType.GridUnits: return(ClassificationTypes.GridUnits); case CssClassifierContextType.PercentUnits: return(ClassificationTypes.PercentUnits); case CssClassifierContextType.FrequencyUnits: return(ClassificationTypes.FrequencyUnits); case CssClassifierContextType.ResolutionUnits: return(ClassificationTypes.ResolutionUnits); case CssClassifierContextType.AngleUnits: return(ClassificationTypes.AngleUnits); case CssClassifierContextType.PropertyDeclaration: return(ClassificationTypes.PropertyDeclaration); case CssClassifierContextType.PropertyName: return(ClassificationTypes.PropertyName); case CssClassifierContextType.PropertyValue: return(ClassificationTypes.PropertyValue); case CssClassifierContextType.PseudoClass: return(ClassificationTypes.PseudoClass); case CssClassifierContextType.PseudoElement: return(ClassificationTypes.PseudoElement); case CssClassifierContextType.PseudoPageType: return(ClassificationTypes.PseudoPageType); case CssClassifierContextType.CalcExpression: return(ClassificationTypes.CalcExpression); case CssClassifierContextType.MediaQuery: return(ClassificationTypes.MediaQuery); case CssClassifierContextType.MediaQueryOperation: return(ClassificationTypes.MediaQueryOperation); case CssClassifierContextType.MediaType: return(ClassificationTypes.MediaType); case CssClassifierContextType.MediaFeatureName: return(ClassificationTypes.MediaFeatureName); case CssClassifierContextType.MediaFeatureValue: return(ClassificationTypes.MediaFeatureValue); case CssClassifierContextType.MediaCombineOperator: return(ClassificationTypes.MediaCombineOperator); case CssClassifierContextType.Selector: return(ClassificationTypes.Selector); case CssClassifierContextType.SelectorCombineOperator: return(ClassificationTypes.SelectorCombineOperator); case CssClassifierContextType.SelectorOperator: return(ClassificationTypes.SelectorOperator); case CssClassifierContextType.SquareBracket: return(ClassificationTypes.SquareBracket); case CssClassifierContextType.ClassSelector: return(ClassificationTypes.ClassSelector); case CssClassifierContextType.IdSelector: return(ClassificationTypes.IdSelector); case CssClassifierContextType.UnicodeRange: return(ClassificationTypes.UnicodeRange); case CssClassifierContextType.CustomPropertyName: return(ClassificationTypes.CustomPropertyName); } }
public CssClassifierContext(CssClassifierContextType contextType) { _contextType = contextType; ClassificationName = InternalGetClassificationName(contextType); }
internal TokenItem AddCurrentAndAdvance(TokenStream tokens, CssClassifierContextType ct) { return(AddCurrentAndAdvance(tokens, CssClassifierContextCache.FromTypeEnum(ct))); }
public static ParseItem ParseUnknown( ComplexItem parent, ItemFactory itemFactory, ITextProvider text, TokenStream tokens, ParseErrorType?errorType = null) { ParseItem pi = null; bool alreadyParsed = false; // For a single unknown token, let this switch fall through where a // ParseErrorItem will get created. For multiple unknown tokens, deal with // them in this switch and let them automatically get wrapped in an unknown block. CssClassifierContextType contextType = CssClassifierContextType.Default; switch (tokens.CurrentToken.TokenType) { case CssTokenType.Url: pi = itemFactory.Create <UrlItem>(parent); break; case CssTokenType.Function: pi = Function.ParseFunction(parent, itemFactory, text, tokens); alreadyParsed = true; break; case CssTokenType.OpenFunctionBrace: case CssTokenType.OpenSquareBracket: case CssTokenType.OpenCurlyBrace: pi = itemFactory.Create <UnknownBlock>(parent); break; case CssTokenType.String: case CssTokenType.MultilineString: case CssTokenType.InvalidString: contextType = CssClassifierContextType.String; break; } if (pi == null) { pi = new TokenItem(tokens.CurrentToken, contextType); } if (!alreadyParsed && !pi.Parse(itemFactory, text, tokens)) { Debug.Fail("Parse of an unknown item failed."); // I've done all I can do to deal with this unknown token, but now // it must be totally ignored so that parsing doesn't get into an infinite loop. tokens.AdvanceToken(); pi = null; } if (pi != null && errorType.HasValue) { pi.AddParseError(errorType.Value, ParseErrorLocation.WholeItem); } return(pi); }
internal TokenItem(CssToken token, CssClassifierContextType context) : this(token, CssClassifierContextCache.FromTypeEnum(context)) { }