From 2b228fbd32c494314dc92095a38c7a390883f24e Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 21 May 2022 22:02:03 +0300 Subject: [PATCH] Fix tagged text escaping & tests --- libs/ui/source/tagged_text.cpp | 31 ++++++++++++++++++------------- libs/ui/tests/tagged_text.cpp | 9 +++++---- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/libs/ui/source/tagged_text.cpp b/libs/ui/source/tagged_text.cpp index 359bd9ad..40082bee 100644 --- a/libs/ui/source/tagged_text.cpp +++ b/libs/ui/source/tagged_text.cpp @@ -56,19 +56,10 @@ namespace psemek::ui } else { - auto start = current; - - if (*current == '\\') - { - ++current; - if (current == text.end()) - error("unexpected end"); - } - auto append = [&](std::string_view & target) { if (target.empty()) - target = {start, current + 1}; + target = {current, current + 1}; else target = {target.data(), current + 1}; }; @@ -87,9 +78,23 @@ namespace psemek::ui } else { - if (result.tokens.empty() || !std::get_if(&result.tokens.back())) - result.tokens.push_back(std::string_view{}); - append(std::get(result.tokens.back())); + if (*current == '\\') + { + ++current; + if (current < text.end()) + { + result.tokens.push_back(std::string_view{}); + append(std::get(result.tokens.back())); + } + else + --current; + } + else + { + if (result.tokens.empty() || !std::get_if(&result.tokens.back())) + result.tokens.push_back(std::string_view{}); + append(std::get(result.tokens.back())); + } } } diff --git a/libs/ui/tests/tagged_text.cpp b/libs/ui/tests/tagged_text.cpp index 9efb2f4a..5f9c2c94 100644 --- a/libs/ui/tests/tagged_text.cpp +++ b/libs/ui/tests/tagged_text.cpp @@ -93,10 +93,11 @@ test_case(ui_tagged__text_tag__attribute) 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)