Beispiel #1
0
        /// <summary>
        /// 4.4.13. Number-rest state
        /// </summary>
        CssToken NumberRest()
        {
            var current = GetNext();

            while (true)
            {
                if (current.IsDigit())
                {
                    _stringBuffer.Append(current);
                }
                else if (current.IsNameStart())
                {
                    var number = FlushBuffer();
                    _stringBuffer.Append(current);
                    return(Dimension(number));
                }
                else if (IsValidEscape(current))
                {
                    current = GetNext();
                    var number = FlushBuffer();
                    _stringBuffer.Append(ConsumeEscape(current));
                    return(Dimension(number));
                }
                else
                {
                    break;
                }

                current = GetNext();
            }

            switch (current)
            {
            case Symbols.Dot:
                current = GetNext();

                if (current.IsDigit())
                {
                    _stringBuffer.Append(Symbols.Dot).Append(current);
                    return(NumberFraction());
                }

                Back();
                return(new CssNumberToken(FlushBuffer()));

            case '%':
                return(CssUnitToken.Percentage(FlushBuffer()));

            case 'e':
            case 'E':
                return(NumberExponential());

            case Symbols.Minus:
                return(NumberDash());

            default:
                Back();
                return(new CssNumberToken(FlushBuffer()));
            }
        }
Beispiel #2
0
        /// <summary>
        /// 4.4.13. Number-rest state
        /// </summary>
        CssToken NumberRest(Char current)
        {
            while (true)
            {
                if (current.IsDigit())
                {
                    _stringBuffer.Append(current);
                }
                else if (current.IsNameStart())
                {
                    var number = FlushBuffer();
                    _stringBuffer.Append(current);
                    return(Dimension(_src.Next, number));
                }
                else if (IsValidEscape(current))
                {
                    current = _src.Next;
                    var number = FlushBuffer();
                    _stringBuffer.Append(ConsumeEscape(current));
                    return(Dimension(_src.Next, number));
                }
                else
                {
                    break;
                }

                current = _src.Next;
            }

            switch (current)
            {
            case Specification.Dot:
                current = _src.Next;

                if (current.IsDigit())
                {
                    _stringBuffer.Append(Specification.Dot).Append(current);
                    return(NumberFraction(_src.Next));
                }

                _src.Back();
                return(CssToken.Number(FlushBuffer()));

            case '%':
                return(CssUnitToken.Percentage(FlushBuffer()));

            case 'e':
            case 'E':
                return(NumberExponential(current));

            case Specification.Minus:
                return(NumberDash(current));

            default:
                _src.Back();
                return(CssToken.Number(FlushBuffer()));
            }
        }
Beispiel #3
0
        /// <summary>
        /// 4.4.15. Dimension state
        /// </summary>
        CssToken Dimension(String number)
        {
            while (true)
            {
                var current = GetNext();

                if (current.IsLetter())
                {
                    _stringBuffer.Append(current);
                }
                else if (IsValidEscape(current))
                {
                    current = GetNext();
                    _stringBuffer.Append(ConsumeEscape(current));
                }
                else
                {
                    Back();
                    return(CssUnitToken.Dimension(number, FlushBuffer()));
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// 4.4.15. Dimension state
        /// </summary>
        CssToken Dimension(Char current, String number)
        {
            while (true)
            {
                if (current.IsName())
                {
                    _stringBuffer.Append(current);
                }
                else if (IsValidEscape(current))
                {
                    current = _src.Next;
                    _stringBuffer.Append(ConsumeEscape(current));
                }
                else
                {
                    _src.Back();
                    return(CssUnitToken.Dimension(number, FlushBuffer()));
                }

                current = _src.Next;
            }
        }