mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-14 16:02:50 +08:00
modified tokenizer to not break on on ]]] at the end of a style
This commit is contained in:
parent
4258cbfb85
commit
f895bb175d
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user