Ejemplo n.º 1
0
            static string Read(StringBuffer reader, Func <char, bool> criteria)
            {
                var buffer = new StringBuilder();

                while (!reader.Eof)
                {
                    var current = reader.Peek();
                    if (!criteria(current))
                    {
                        break;
                    }

                    buffer.Append(reader.Read());
                }

                return(buffer.ToString());
            }
Ejemplo n.º 2
0
        public bool MoveNext()
        {
            if (_reader.Eof)
            {
                return(false);
            }

            var current = _reader.Peek();

            if (current == '[')
            {
                var position = _reader.Position;

                _reader.Read();

                if (_reader.Eof)
                {
                    throw new InvalidOperationException($"Encountered malformed markup tag at position {_reader.Position}.");
                }

                current = _reader.Peek();
                if (current == '[')
                {
                    _reader.Read();
                    Current = new MarkupToken(MarkupTokenKind.Text, "[", position);
                    return(true);
                }

                if (current == '/')
                {
                    _reader.Read();

                    if (_reader.Eof)
                    {
                        throw new InvalidOperationException($"Encountered malformed markup tag at position {_reader.Position}.");
                    }

                    current = _reader.Peek();
                    if (current != ']')
                    {
                        throw new InvalidOperationException($"Encountered malformed markup tag at position {_reader.Position}.");
                    }

                    _reader.Read();
                    Current = new MarkupToken(MarkupTokenKind.Close, string.Empty, position);
                    return(true);
                }

                var builder = new StringBuilder();
                while (!_reader.Eof)
                {
                    current = _reader.Peek();
                    if (current == ']')
                    {
                        break;
                    }

                    builder.Append(_reader.Read());
                }

                if (_reader.Eof)
                {
                    throw new InvalidOperationException($"Encountered malformed markup tag at position {_reader.Position}.");
                }

                _reader.Read();
                Current = new MarkupToken(MarkupTokenKind.Open, builder.ToString(), position);
                return(true);
            }
            else
            {
                var position = _reader.Position;
                var builder  = new StringBuilder();

                var encounteredClosing = false;
                while (!_reader.Eof)
                {
                    current = _reader.Peek();
                    if (current == '[')
                    {
                        break;
                    }
                    else if (current == ']')
                    {
                        if (encounteredClosing)
                        {
                            _reader.Read();
                            encounteredClosing = false;
                            continue;
                        }

                        encounteredClosing = true;
                    }
                    else
                    {
                        if (encounteredClosing)
                        {
                            throw new InvalidOperationException(
                                      $"Encountered unescaped ']' token at position {_reader.Position}");
                        }
                    }

                    builder.Append(_reader.Read());
                }

                if (encounteredClosing)
                {
                    throw new InvalidOperationException($"Encountered unescaped ']' token at position {_reader.Position}");
                }

                Current = new MarkupToken(MarkupTokenKind.Text, builder.ToString(), position);
                return(true);
            }
        }