예제 #1
0
        /// <summary>
        /// Consumes and returns an An+B token from a <see cref="TokenStream"/>
        /// </summary>
        /// <param name="Tokens"></param>
        /// <returns></returns>
        public static CssAnBMatcher Consume(DataConsumer <CssToken> Stream)
        {
            // TODO: Test An+B syntax parsing
            int A = 0;
            int B = 0;

            if (Stream.Next.Type == ECssTokenType.Ident)// this token is a word, but we only accept 'even' or 'odd'
            {
                IdentToken word = Stream.Consume <IdentToken>();
                if (word.Value.Equals("even", StringComparison.OrdinalIgnoreCase))
                {
                    return(new CssAnBMatcher(2, 0));                                                              //{ A = 2; B = 0; }
                }
                else if (word.Value.Equals("odd", StringComparison.OrdinalIgnoreCase))
                {
                    return(new CssAnBMatcher(2, 1));                                                                  //{ A = 2; B = 1; }
                }
                else
                {
                    throw new CssSyntaxErrorException($"Invalid identity token ({word.Value}) within An+B syntax");
                }

                // if (Stream.Next != Stream.EOF_ITEM) throw new CssSyntaxError("Expected EOF!");
                // return null;
            }
            else if (Stream.Next.Type == ECssTokenType.Dimension)
            {
                DimensionToken dim = Stream.Consume() as DimensionToken;
                if (dim.DataType == ENumericTokenType.Integer && dim.Unit.Equals("n", StringComparison.OrdinalIgnoreCase))
                {// <n-dimension>
                    throw new NotImplementedException($"{nameof(CssAnBMatcher)} Has not implemented parsing support for {nameof(ECssTokenType.Dimension)}");
                }
                else if (dim.DataType == ENumericTokenType.Integer && dim.Unit.Equals("n-", StringComparison.OrdinalIgnoreCase))
                {// <ndash-dimension>
                    throw new NotImplementedException($"{nameof(CssAnBMatcher)} Has not implemented parsing support for {nameof(ECssTokenType.Dimension)}");
                }
                else if (dim.DataType == ENumericTokenType.Integer && dim.Unit.StartsWith("n-", StringComparison.OrdinalIgnoreCase))
                {// <ndashdigit-dimension>
                    throw new NotImplementedException($"{nameof(CssAnBMatcher)} Has not implemented parsing support for {nameof(ECssTokenType.Dimension)}");
                }
            }
            else if (Stream.Next.Type == ECssTokenType.Ident)
            {
                throw new NotImplementedException($"{nameof(CssAnBMatcher)} Has not implemented parsing support for {nameof(ECssTokenType.Ident)}");
            }
            else if (Stream.Next.Type == ECssTokenType.Number)
            {
                throw new NotImplementedException($"{nameof(CssAnBMatcher)} Has not implemented parsing support for {nameof(ECssTokenType.Number)}");
            }

            return(new CssAnBMatcher(A, B));
        }
예제 #2
0
        public void EncodeTest(ENumericTokenType Type, string Value, double Number, string Unit, string Expected)
        {
            string Actual = new DimensionToken(Type, Value, Number, Unit).Encode();

            Assert.Equal(Expected, Actual);
        }