コード例 #1
0
        public void Consume_NumberTest(object expected, string input, ENumericTokenType tokenType)
        {
            var Stream = new DataConsumer <char>(input.AsMemory());

            CssTokenizer.Consume_Number(Stream, out ReadOnlyMemory <char> outResult, out object outNumber, out ENumericTokenType outTokenType);

            Assert.Equal(tokenType, outTokenType);
            Assert.Equal(expected, outNumber);
        }
コード例 #2
0
        public void EncodeTest(ENumericTokenType Type, string Value, double Number)
        {
            string Actual = new NumberToken(Type, Value, Number).Encode();

            Assert.Equal(Value, Actual);
        }
コード例 #3
0
        public static void Consume_Number(DataConsumer <char> Stream, out ReadOnlyMemory <char> /*  */ outResult, out object outNumber, out ENumericTokenType outType)
        {/* Docs: https://www.w3.org/TR/css-syntax-3/#consume-number */
            if (Stream is null)
            {
                throw new ArgumentNullException(nameof(Stream));
            }
            Contract.EndContractBlock();

            outType = ENumericTokenType.Integer;

            bool IsPositive          = true;
            bool Exponent_IsPositive = true;
            bool Decimal             = false;
            bool HasExponent         = false;

            int Start = Stream.Position;

            if (Stream.Next == CHAR_HYPHEN_MINUS)
            {
                IsPositive = false;
                Stream.Consume();
            }
            else if (Stream.Next == CHAR_PLUS_SIGN)
            {
                Stream.Consume();
            }

            if (!Stream.Consume_While(Is_Ascii_Digit, out ReadOnlySpan <char> Integer))
            {
                throw new CssParserException(ParserErrors.PARSING_FAILED);
            }

            if (Stream.Next == CHAR_FULL_STOP)
            {
                outType = ENumericTokenType.Number;
                Decimal = true;
                Stream.Consume();
            }

            if (!Stream.Consume_While(Is_Ascii_Digit, out ReadOnlySpan <char> Fraction) && Decimal)
            {
                throw new CssParserException(ParserErrors.PARSING_FAILED);
            }

            if (Stream.Next == CHAR_E_UPPER || Stream.Next == CHAR_E_LOWER)
            {
                HasExponent = true;
                outType     = ENumericTokenType.Number;
                Stream.Consume();
            }

            if (Stream.Next == CHAR_HYPHEN_MINUS)
            {
                Exponent_IsPositive = false;
                Stream.Consume();
            }
            else if (Stream.Next == CHAR_PLUS_SIGN)
            {
                Stream.Consume();
            }

            if (!Stream.Consume_While(Is_Ascii_Digit, out ReadOnlySpan <char> Exponent) && HasExponent)
            {
                throw new CssParserException(ParserErrors.PARSING_FAILED);
            }

            int len = Stream.Position - Start;

            outResult = Stream.AsMemory().Slice(Start, len);

            //return S * (I + (F * Math.Pow(10, -D))) * Math.Pow(10, T*E);
            if (Decimal)
            {
                outNumber = ParsingCommon.ToDecimal(IsPositive ? 1 : -1, Integer, Fraction, Exponent_IsPositive ? 1 : -1, Exponent);
            }
            else
            {
                outNumber = ParsingCommon.ToInteger(IsPositive ? 1 : -1, Integer, Exponent_IsPositive ? 1 : -1, Exponent);
            }
        }
コード例 #4
0
 public void EqualsTest(ENumericTokenType Type, string Value, double Number)
 {
     Assert.Equal(new NumberToken(Type, Value, Number), new NumberToken(Type, Value, Number));
 }
コード例 #5
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);
        }
コード例 #6
0
 public void EqualsTest(ENumericTokenType Type, string Value, double Number, string Unit)
 {
     Assert.Equal(new DimensionToken(Type, Value, Number, Unit), new DimensionToken(Type, Value, Number, Unit));
 }
コード例 #7
0
ファイル: DimensionToken.cs プロジェクト: dsisco11/CssUI
 public DimensionToken(ENumericTokenType DataType, ReadOnlySpan <char> Value, object Number, ReadOnlySpan <char> Unit) : base(ECssTokenType.Dimension, Value)
 {
     this.Number   = Number;
     this.DataType = DataType;
     this.Unit     = Unit.ToString();
 }
コード例 #8
0
ファイル: NumberToken.cs プロジェクト: dsisco11/CssUI
 public NumberToken(ENumericTokenType DataType, ReadOnlySpan <char> Value, object Number) : base(ECssTokenType.Number, Value)
 {
     this.DataType = DataType;
     this.Number   = Number;
 }