public static TextPosition ToPosition(this TextOffset offset, string data) { if (string.IsNullOrEmpty(data)) { throw new ArgumentNullException(data); } var lines = data.Replace("\r", "").Split("\n"); var numLinesBeforeOffset = 0; var pos = 0; for (var i = 0; i < lines.Length; ++i) { if (offset < pos + lines[i].Length + 1) { break; } ++numLinesBeforeOffset; pos += lines[i].Length + 1; } var character = offset - pos; return(new TextPosition( new LineNumber(numLinesBeforeOffset + 1), new CharacterNumber(character + 1))); }
public string ReadTo(TextOffset end) { var text = _text.Substring(Position, end - Position); Position = new TextOffset(end); return(text); }
public Optional <TextOffset> ScanToAny(char [] patterns) { var index = _text.IndexOfAny(patterns, Position); if (index == -1) { return(Optional.None()); } Position = new TextOffset(index + 1); return(new TextOffset(index)); }
public Optional <TextOffset> ScanTo(string pattern) { var index = _text.IndexOf(pattern, Position, StringComparison.Ordinal); if (index == -1) { return(Optional.None()); } Position = new TextOffset(index + pattern.Length); return(new TextOffset(index)); }
public Optional <TextOffset> PeekToAnyPattern(string[] patterns) { var endIndex = new TextOffset(End + 1); var currentIndex = endIndex; foreach (var pattern in patterns) { var index = PeekTo(pattern); if (index.HasValue && index.Value < currentIndex) { currentIndex = index.Value; } } return(currentIndex < endIndex?Optional.Some(currentIndex) : Optional.None()); }
public string GetLineContaining(TextOffset offset) { var lastLineStart = 0; var currentLineStart = 0; for (var i = 0; i < _text.Length; ++i) { if (_text[i] == '\n') { lastLineStart = currentLineStart; currentLineStart = i; } if (offset <= currentLineStart && offset >= lastLineStart) { return(_text.Substring(lastLineStart, currentLineStart - lastLineStart)); } } throw new ArgumentOutOfRangeException("offset"); }
public TextScanner(string text) { _text = text; Position = new TextOffset(0); }