diff --git a/src/Spectre.Console/Internal/Text/Markup/MarkupTokenizer.cs b/src/Spectre.Console/Internal/Text/Markup/MarkupTokenizer.cs index df62a94..6ed39df 100644 --- a/src/Spectre.Console/Internal/Text/Markup/MarkupTokenizer.cs +++ b/src/Spectre.Console/Internal/Text/Markup/MarkupTokenizer.cs @@ -66,13 +66,39 @@ internal sealed class MarkupTokenizer : IDisposable var builder = new StringBuilder(); while (!_reader.Eof) { - current = _reader.Peek(); - if (current == ']') + current = _reader.Read(); + var next = '\0'; + if (!_reader.Eof) { - break; + next = _reader.Peek(); } - builder.Append(_reader.Read()); + if (current == ']') + { + if (next != ']') + { + break; + } + + _reader.Read(); + } + + builder.Append(current); + + if (current != '[') + { + continue; + } + + if (next == '[') + { + _reader.Read(); + } + else + { + throw new InvalidOperationException( + $"Encountered malformed markup tag at position {_reader.Position - 1}."); + } } if (_reader.Eof) @@ -80,7 +106,6 @@ internal sealed class MarkupTokenizer : IDisposable throw new InvalidOperationException($"Encountered malformed markup tag at position {_reader.Position}."); } - _reader.Read(); Current = new MarkupToken(MarkupTokenKind.Open, builder.ToString(), position); return true; } diff --git a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs b/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs index 325ed53..58d0a90 100644 --- a/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs +++ b/test/Spectre.Console.Tests/Unit/AnsiConsoleTests.Markup.cs @@ -100,6 +100,7 @@ public partial class AnsiConsoleTests [InlineData("[yellow]Hello[/", "Encountered malformed markup tag at position 15.")] [InlineData("[yellow]Hello[/foo", "Encountered malformed markup tag at position 15.")] [InlineData("[yellow Hello", "Encountered malformed markup tag at position 13.")] + [InlineData("[yellow[green]]Hello", "Encountered malformed markup tag at position 7.")] public void Should_Throw_If_Encounters_Malformed_Tag(string markup, string expected) { // Given