Example #1
0
        [MethodImpl(MethodImplOptions.AggressiveInlining)]// Private static function called in loops, inline it
        static CssFunction Consume_Function(DataConsumer <CssToken> Stream)
        {
            if (Stream is null)
            {
                throw new CssParserException(CssErrors.STREAM_IS_NULL);
            }
            if (Stream.Next.Type != ECssTokenType.FunctionName)
            {
                throw new CssParserException(CssErrors.EXPECTING_FUNCTION_NAME_TOKEN, Stream);
            }

            var         name = (Stream.Next as FunctionNameToken).Value;
            CssFunction Func = new CssFunction(name);

            CssToken Token;

            do
            {
                Token = Stream.Consume();
                switch (Token.Type)
                {
                case ECssTokenType.EOF:
                case ECssTokenType.Parenth_Close:
                    return(Func);

                default:
                    Stream.Reconsume();
                    Func.Arguments.Add(Consume_ComponentValue(Stream));
                    break;
                }
            }while (Token.Type != ECssTokenType.EOF);

            return(Func);
        }
Example #2
0
        public void GetFunctionArguments(string cssFunc, int numberOfArgs)
        {
            var cssFunction = new CssFunction(cssFunc);
            var args        = cssFunction.Arguments;

            Assert.AreEqual(args.Count, numberOfArgs);
        }
Example #3
0
        public void GetFunctionNameTest(string cssFunctionString, string name)
        {
            var cssFunction = new CssFunction(cssFunctionString);
            var funcName    = cssFunction.FunctionName;

            Assert.AreEqual(funcName, name);
        }
Example #4
0
        static PseudoElementSelector Consume_Pseudo_Element_Selector(DataConsumer <CssToken> Stream)
        {
            Stream.Consume(2);// Consume the '::' prefix
            switch (Stream.Next.Type)
            {
            case ECssTokenType.Ident:
            {
                return(new PseudoElementSelector(Stream.Consume <IdentToken>().Value));
            }

            case ECssTokenType.FunctionName:
            {
                throw new CssParserException("Encountered unexpected 'FunctionNameToken' in parsed list (Should have been turned into a 'CssFunction' token already!)");
            }

            case ECssTokenType.Function:
            {
                CssFunction func = Stream.Consume <CssFunction>();
                return(new CssPseudoElementSelectorFunction(func.Name, func.Arguments));
            }
            }

            return(null);
        }
Example #5
0
        public static CssValue Consume_CssValue(DataConsumer <CssToken> Stream)
        {
            if (Stream is null)
            {
                throw new CssParserException(CssErrors.STREAM_IS_NULL);
            }
            Contract.EndContractBlock();


            CssToken Token = Stream.Next;

            switch (Token.Type)
            {
            case ECssTokenType.Dimension:
            {
                var      tok  = Stream.Consume() as DimensionToken;
                ECssUnit unit = ECssUnit.PX;

                if (!string.IsNullOrEmpty(tok.Unit))
                {
                    ECssUnit unitLookup = Lookup.Enum <ECssUnit>(tok.Unit);
                    unit = unitLookup;
                }

                return(new CssValue(ECssValueTypes.DIMENSION, tok.Number, unit));
            }

            case ECssTokenType.Number:
            {
                var tok = Stream.Consume() as NumberToken;
                return(new CssValue(ECssValueTypes.NUMBER, tok.Number));
            }

            case ECssTokenType.Percentage:
            {
                var tok = Stream.Consume() as PercentageToken;
                return(new CssValue(ECssValueTypes.PERCENT, tok.Number));
            }

            case ECssTokenType.String:
            {
                var tok = Stream.Consume() as StringToken;
                return(new CssValue(ECssValueTypes.STRING, tok.Value));
            }

            case ECssTokenType.Ident:    // Keyword
            {
                var tok = Stream.Consume() as IdentToken;
                return(new CssValue(ECssValueTypes.KEYWORD, tok.Value));
            }

            case ECssTokenType.FunctionName:
            {
                CssFunction func = Consume_Function(Stream);
                return(new CssValue(func));
            }

            case ECssTokenType.Function:
            {
                var func = Stream.Consume() as CssFunction;
                return(new CssValue(func));
            }

            case ECssTokenType.Url:
            {        /* XXX: Finish this */
                throw new NotSupportedException("URL values are not supported as of yet!");
            }

            case ECssTokenType.EOF:
            {
                return(CssValue.Null);
            }

            default:
            {
                throw new CssParserException(String.Format(CultureInfo.InvariantCulture, CssErrors.UNHANDLED_TOKEN_FOR_CSS_VALUE, Token.Type), Stream);
            }
            }
        }
Example #6
0
        public void CssFunctionTest(string cssFunctionString)
        {
            var cssFunction = new CssFunction(cssFunctionString);

            Assert.IsNotNull(cssFunction);
        }