modified tokenizer to not break on on ]]] at the end of a style

This commit is contained in:
Nils Andresen 2022-10-23 21:07:10 +02:00 committed by Patrik Svensson
parent 4258cbfb85
commit f895bb175d
2 changed files with 60 additions and 19 deletions

View File

@ -122,34 +122,55 @@ internal sealed class MarkupTokenizer : IDisposable
var encounteredClosing = false;
while (!_reader.Eof)
{
var currentStylePartCanContainMarkup =
builder.ToString()
.Split(' ')
.Last()
.StartsWith("link=", StringComparison.OrdinalIgnoreCase);
current = _reader.Peek();
if (current == ']' && !encounteredOpening)
if (currentStylePartCanContainMarkup)
{
if (encounteredClosing)
switch (current)
{
builder.Append(_reader.Read());
encounteredClosing = false;
continue;
}
case ']' when !encounteredOpening:
if (encounteredClosing)
{
builder.Append(_reader.Read());
encounteredClosing = false;
continue;
}
_reader.Read();
encounteredClosing = true;
continue;
_reader.Read();
encounteredClosing = true;
continue;
case '[' when !encounteredClosing:
if (encounteredOpening)
{
builder.Append(_reader.Read());
encounteredOpening = false;
continue;
}
_reader.Read();
encounteredOpening = true;
continue;
}
}
if (current == '[' && !encounteredClosing)
else
{
if (encounteredOpening)
switch (current)
{
builder.Append(_reader.Read());
encounteredOpening = false;
continue;
case ']':
_reader.Read();
encounteredClosing = true;
break;
case '[':
_reader.Read();
encounteredOpening = true;
break;
}
_reader.Read();
encounteredOpening = true;
continue;
}
if (encounteredClosing)

View File

@ -154,5 +154,25 @@ public partial class AnsiConsoleTests
// Then
console.Output.ShouldBe("[grey][white]");
}
[Theory]
[InlineData("[white][[[/][white]]][/]", "[]")]
[InlineData("[white][[[/]", "[")]
[InlineData("[white]]][/]", "]")]
[InlineData("[black on white link=https://www.gooole.com/q=]]]Search for a bracket[/]", "Search for a bracket")]
[InlineData("[link=https://www.gooole.com/q=]] black on white]Search for a bracket[/]", "Search for a bracket")]
[InlineData("[link]https://www.gooole.com/q=]][/]", "https://www.gooole.com/q=]")]
public void Should_Not_Fail_As_In_GH1024(string markup, string expected)
{
// Given
var console = new TestConsole();
console.EmitAnsiSequences = false;
// When
console.Markup(markup);
// Then
console.Output.ShouldBe(expected);
}
}
}