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)));
        }
Esempio n. 2
0
        public string ReadTo(TextOffset end)
        {
            var text = _text.Substring(Position, end - Position);

            Position = new TextOffset(end);

            return(text);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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());
        }
Esempio n. 6
0
        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");
        }
Esempio n. 7
0
 public TextScanner(string text)
 {
     _text    = text;
     Position = new TextOffset(0);
 }