Fix tagged text escaping & tests

This commit is contained in:
Nikita Lisitsa 2022-05-21 22:02:03 +03:00
parent 183f5283e2
commit 2b228fbd32
2 changed files with 23 additions and 17 deletions

View file

@ -56,19 +56,10 @@ namespace psemek::ui
} }
else else
{ {
auto start = current;
if (*current == '\\')
{
++current;
if (current == text.end())
error("unexpected end");
}
auto append = [&](std::string_view & target) auto append = [&](std::string_view & target)
{ {
if (target.empty()) if (target.empty())
target = {start, current + 1}; target = {current, current + 1};
else else
target = {target.data(), current + 1}; target = {target.data(), current + 1};
}; };
@ -87,9 +78,23 @@ namespace psemek::ui
} }
else else
{ {
if (result.tokens.empty() || !std::get_if<std::string_view>(&result.tokens.back())) if (*current == '\\')
result.tokens.push_back(std::string_view{}); {
append(std::get<std::string_view>(result.tokens.back())); ++current;
if (current < text.end())
{
result.tokens.push_back(std::string_view{});
append(std::get<std::string_view>(result.tokens.back()));
}
else
--current;
}
else
{
if (result.tokens.empty() || !std::get_if<std::string_view>(&result.tokens.back()))
result.tokens.push_back(std::string_view{});
append(std::get<std::string_view>(result.tokens.back()));
}
} }
} }

View file

@ -93,10 +93,11 @@ test_case(ui_tagged__text_tag__attribute)
test_case(ui_tagged__text_escape) test_case(ui_tagged__text_escape)
{ {
test("\\[", {{"\\["}}); test("\\[", {{"["}});
test("\\]", {{"\\]"}}); test("\\]", {{"]"}});
test("\\\\", {{"\\\\"}}); test("\\\\", {{"\\"}});
test("\\[\\]", {{"\\[\\]"}}); test("\\[\\]", {{"[", "]"}});
test(R"(text \[not \\ tag\] end)", {{"text ", "[not ", "\\ tag", "] end"}});
} }
test_case(ui_tagged__text_error) test_case(ui_tagged__text_error)