Esempio n. 1
0
        public override bool Parse(ParseContext context, ref ParseResult <TextSpan> result)
        {
            if (context.Scanner.Cursor.Eof)
            {
                return(false);
            }

            context.EnterParser(this);

            var start = context.Scanner.Cursor.Position;

            var parsed = new ParseResult <T>();

            if (_delimiter.Parse(context, ref parsed))
            {
                context.Scanner.Cursor.ResetPosition(start);
                return(false);
            }

            while (true)
            {
                if (_delimiter.Parse(context, ref parsed) || (!_failOnEof && context.Scanner.Cursor.Eof))
                {
                    var end = context.Scanner.Cursor.Eof ? context.Scanner.Cursor.Position : parsed.Start;

                    var length = end - start;

                    if (length == 0)
                    {
                        return(false);
                    }

                    if (!_consumeDelimiter)
                    {
                        context.Scanner.Cursor.ResetPosition(end);
                    }

                    result.Set(context.Scanner.Buffer, start, end, new TextSpan(context.Scanner.Buffer, start.Offset, length));
                    return(true);
                }

                context.Scanner.Cursor.Advance();

                if (context.Scanner.Cursor.Eof)
                {
                    if (_failOnEof)
                    {
                        context.Scanner.Cursor.ResetPosition(start);
                        return(false);
                    }
                }
            }
        }
Esempio n. 2
0
        public override bool Parse(ParseContext context, ref ParseResult <char> result)
        {
            context.EnterParser(this);

            if (SkipWhiteSpace)
            {
                context.SkipWhiteSpace();
            }

            var start = context.Scanner.Cursor.Position;

            if (context.Scanner.ReadChar(Char))
            {
                result.Set(context.Scanner.Buffer, start, context.Scanner.Cursor.Position, Char);
                return(true);
            }

            return(false);
        }
Esempio n. 3
0
        public override bool Parse(ParseContext context, ref ParseResult <TextSpan> result)
        {
            context.EnterParser(this);
            var cursor = context.Scanner.Cursor;

            var current = cursor.Current;

            var nonDigits  = 0;
            var lastIsDash = false;

            var start            = cursor.Position;
            var lastDashPosition = cursor.Position;

            if (IsNonDigitStart(current))
            {
                nonDigits++;
            }
            else if (char.IsDigit(current))
            {
            }
            else
            {
                // Doesn't start with a letter or a digit
                return(false);
            }

            // Read while it's an identifier part. and ensure we have at least a letter or it's a number

            cursor.Advance();

            while (!context.Scanner.Cursor.Eof)
            {
                current = cursor.Current;

                if (IsNonDigitStart(current))
                {
                    nonDigits++;
                    lastIsDash = false;
                }
                else if (current == '-')
                {
                    lastDashPosition = cursor.Position;
                    nonDigits++;
                    lastIsDash = true;
                }
                else if (char.IsDigit(current))
                {
                    lastIsDash = false;
                }
                else
                {
                    break;
                }

                cursor.Advance();
            }

            var end = cursor.Offset;

            // Exclude the trailing '-' if it is next to an end tag
            // c.f. https://github.com/sebastienros/fluid/issues/347
            current = cursor.Current;

            if (lastIsDash && !cursor.Eof && (current == '%' || current == '}'))
            {
                nonDigits--;
                end = end - 1;
                cursor.ResetPosition(lastDashPosition);
            }

            if (nonDigits == 0)
            {
                // Invalid identifier, only digits
                cursor.ResetPosition(start);
                return(false);
            }

            result.Set(start.Offset, end, new TextSpan(context.Scanner.Buffer, start.Offset, end - start.Offset));
            return(true);
        }