예제 #1
0
        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);
        }
예제 #2
0
        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]);
        }
예제 #4
0
        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);
 }
예제 #8
0
 internal TokenItem AddCurrentAndAdvance(TokenStream tokens, CssClassifierContextType ct)
 {
     return(AddCurrentAndAdvance(tokens, CssClassifierContextCache.FromTypeEnum(ct)));
 }
예제 #9
0
        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);
        }
예제 #10
0
 internal TokenItem(CssToken token, CssClassifierContextType context)
     : this(token, CssClassifierContextCache.FromTypeEnum(context))
 {
 }