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); } } } }
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); }
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); }