From 9577c2e852005a05bb80775c47f69ff6170bb625 Mon Sep 17 00:00:00 2001 From: TGMarkiewicz Date: Tue, 7 Jun 2022 19:14:55 +0200 Subject: [PATCH 1/2] Add support for new lines in Sequence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When using `diagon Sequence` it is not possible (at least I couldn't find a way) to add new lines to the messages in the Sequence submodule. This patch adds parameter `--new_lines_at_bsn` that results in substituting literal `\n` with new lines. Example: ```bash $ echo "Alice -> Bob: send(\n msg="Hello...",\n length=8,\n)" | \ diagon Sequence --new_lines_at_bsn=true ``` output: ``` ┌─────┐ ┌───┐ │Alice│ │Bob│ └──┬──┘ └─┬─┘ │ │ │send( │ │ msg=Hello...,│ │ length=8, │ │) │ │──────────────>│ ┌──┴──┐ ┌─┴─┐ │Alice│ │Bob│ └─────┘ └───┘ ``` --- src/translator/sequence/Sequence.cpp | 53 ++++++++++++++++++++++++++++ src/translator/sequence/Sequence.hpp | 3 ++ 2 files changed, 56 insertions(+) diff --git a/src/translator/sequence/Sequence.cpp b/src/translator/sequence/Sequence.cpp index 7629ea7..d6fc756 100644 --- a/src/translator/sequence/Sequence.cpp +++ b/src/translator/sequence/Sequence.cpp @@ -211,6 +211,17 @@ std::vector Sequence::Options() { "Use the full unicode charset or only ASCII.", Widget::Checkbox, }, + { + "new_lines_at_bsn", + { + "false", + "true", + }, + "false", + "Insert new lines at every occurence of '\\n' (backslash n)\n" + " in the message field.", + Widget::Checkbox, + }, }; } @@ -254,13 +265,55 @@ std::string Sequence::Translate(const std::string& input, auto options = SerializeOption(options_string); ascii_only_ = (options["ascii_only"] == "true"); + new_lines_at_bsn_ = (options["new_lines_at_bsn"] == "true"); ComputeInternalRepresentation(input); UniformizeInternalRepresentation(); + SplitMessagesAtBackslashNIfRequested(); Layout(); return Draw(); } +void Sequence::SplitMessagesAtBackslashNIfRequested() { + if (false == new_lines_at_bsn_) { + return; + } + + auto const split_at_bslash_n_single = [](std::wstring const& input) { + std::vector result{}; + + std::wstring const bslash_n = L"\\n"; + + std::decay_t begin = 0; + + while (true) { + auto end = input.find(bslash_n, begin); + if (std::wstring::npos == end) { + result.push_back(input.substr(begin, input.size() - begin)); + break; + } + result.push_back(input.substr(begin, end - begin)); + begin = end + 2; + } + + return result; + }; + auto const split_at_bslash_n = [&](std::vector const& input) { + std::vector result{}; + + for (auto const& e : input) { + auto const splitted = split_at_bslash_n_single(e); + result.insert(std::end(result), std::begin(splitted), std::end(splitted)); + } + + return result; + }; + + for (auto& message : messages) { + message.messages = split_at_bslash_n(message.messages); + } +} + void Sequence::ComputeInternalRepresentation(const std::string& input) { antlr4::ANTLRInputStream input_stream(input); diff --git a/src/translator/sequence/Sequence.hpp b/src/translator/sequence/Sequence.hpp index b5fb01a..09fce07 100644 --- a/src/translator/sequence/Sequence.hpp +++ b/src/translator/sequence/Sequence.hpp @@ -100,6 +100,8 @@ class Sequence : public Translator { void UniformizeActors(); void UniformizeMessageID(); + void SplitMessagesAtBackslashNIfRequested(); + // 3) Layout. void Layout(); void LayoutComputeMessageWidth(); @@ -125,4 +127,5 @@ class Sequence : public Translator { std::map message_index; bool ascii_only_; + bool new_lines_at_bsn_ = false; }; From 8795e09f8ea0188dacf076195faf5c23a433bc73 Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Tue, 7 Jun 2022 22:02:24 +0200 Subject: [PATCH 2/2] Add tests & refactor. --- src/translator/sequence/Sequence.cpp | 69 ++++++++----------- src/translator/sequence/Sequence.hpp | 4 +- test/Sequence/multiline/input | 3 + test/Sequence/multiline/output | 18 +++++ test/Sequence/multiline_interleaved/input | 5 ++ test/Sequence/multiline_interleaved/output | 17 +++++ .../multiline_interleaved_mixed/input | 5 ++ .../multiline_interleaved_mixed/output | 15 ++++ .../multiline_interleaved_mixed_2/input | 5 ++ .../multiline_interleaved_mixed_2/output | 15 ++++ 10 files changed, 114 insertions(+), 42 deletions(-) create mode 100644 test/Sequence/multiline/input create mode 100644 test/Sequence/multiline/output create mode 100644 test/Sequence/multiline_interleaved/input create mode 100644 test/Sequence/multiline_interleaved/output create mode 100644 test/Sequence/multiline_interleaved_mixed/input create mode 100644 test/Sequence/multiline_interleaved_mixed/output create mode 100644 test/Sequence/multiline_interleaved_mixed_2/input create mode 100644 test/Sequence/multiline_interleaved_mixed_2/output diff --git a/src/translator/sequence/Sequence.cpp b/src/translator/sequence/Sequence.cpp index d6fc756..d7057c5 100644 --- a/src/translator/sequence/Sequence.cpp +++ b/src/translator/sequence/Sequence.cpp @@ -14,6 +14,23 @@ #include "translator/antlr_error_listener.h" #include "translator/sequence/Graph.hpp" +namespace { + +void SplitString(std::wstring input, + const std::wstring& delimiter, + std::vector* out) { + size_t start = 0U; + size_t end = input.find(delimiter); + while (end != std::wstring::npos) { + out->push_back(input.substr(start, end - start)); + start = end + delimiter.length(); + end = input.find(delimiter, start); + } + out->push_back(input.substr(start)); +} + +} // namespace + void Actor::Draw(Screen& screen, int height) { screen.DrawBoxedText(left, 0, name); screen.DrawVerticalLine(3, height - 4, center); @@ -212,14 +229,14 @@ std::vector Sequence::Options() { Widget::Checkbox, }, { - "new_lines_at_bsn", + "interpret_backslash_n", { "false", "true", }, - "false", - "Insert new lines at every occurence of '\\n' (backslash n)\n" - " in the message field.", + "true", + "Insert new lines at every occurence of '\\n' (backslash n) in the " + "message field.", Widget::Checkbox, }, }; @@ -265,52 +282,24 @@ std::string Sequence::Translate(const std::string& input, auto options = SerializeOption(options_string); ascii_only_ = (options["ascii_only"] == "true"); - new_lines_at_bsn_ = (options["new_lines_at_bsn"] == "true"); + interpret_backslash_n_ = (options["interpret_backslash_n"] == "true"); ComputeInternalRepresentation(input); UniformizeInternalRepresentation(); - SplitMessagesAtBackslashNIfRequested(); + SplitByBackslashN(); Layout(); return Draw(); } -void Sequence::SplitMessagesAtBackslashNIfRequested() { - if (false == new_lines_at_bsn_) { +void Sequence::SplitByBackslashN() { + if (!interpret_backslash_n_) { return; } - - auto const split_at_bslash_n_single = [](std::wstring const& input) { - std::vector result{}; - - std::wstring const bslash_n = L"\\n"; - - std::decay_t begin = 0; - - while (true) { - auto end = input.find(bslash_n, begin); - if (std::wstring::npos == end) { - result.push_back(input.substr(begin, input.size() - begin)); - break; - } - result.push_back(input.substr(begin, end - begin)); - begin = end + 2; - } - - return result; - }; - auto const split_at_bslash_n = [&](std::vector const& input) { - std::vector result{}; - - for (auto const& e : input) { - auto const splitted = split_at_bslash_n_single(e); - result.insert(std::end(result), std::begin(splitted), std::end(splitted)); - } - - return result; - }; - for (auto& message : messages) { - message.messages = split_at_bslash_n(message.messages); + std::vector old = std::move(message.messages); + for(auto& it : old) { + SplitString(it, L"\\n", &message.messages); + } } } diff --git a/src/translator/sequence/Sequence.hpp b/src/translator/sequence/Sequence.hpp index 09fce07..4734a4d 100644 --- a/src/translator/sequence/Sequence.hpp +++ b/src/translator/sequence/Sequence.hpp @@ -100,7 +100,7 @@ class Sequence : public Translator { void UniformizeActors(); void UniformizeMessageID(); - void SplitMessagesAtBackslashNIfRequested(); + void SplitByBackslashN(); // 3) Layout. void Layout(); @@ -127,5 +127,5 @@ class Sequence : public Translator { std::map message_index; bool ascii_only_; - bool new_lines_at_bsn_ = false; + bool interpret_backslash_n_ = false; }; diff --git a/test/Sequence/multiline/input b/test/Sequence/multiline/input new file mode 100644 index 0000000..059a076 --- /dev/null +++ b/test/Sequence/multiline/input @@ -0,0 +1,3 @@ +A -> B: This is a\nmultiline string. +A -> B: This is another\nmultiline string. +B -> A: This is the \nlast one. diff --git a/test/Sequence/multiline/output b/test/Sequence/multiline/output new file mode 100644 index 0000000..1023415 --- /dev/null +++ b/test/Sequence/multiline/output @@ -0,0 +1,18 @@ +┌─┐ ┌─┐ +│A│ │B│ +└┬┘ └┬┘ + │ │ + │This is a │ + │multiline string.│ + │────────────────>│ + │ │ + │This is another │ + │multiline string.│ + │────────────────>│ + │ │ + │ This is the │ + │ last one. │ + │<────────────────│ +┌┴┐ ┌┴┐ +│A│ │B│ +└─┘ └─┘ diff --git a/test/Sequence/multiline_interleaved/input b/test/Sequence/multiline_interleaved/input new file mode 100644 index 0000000..6eb48fa --- /dev/null +++ b/test/Sequence/multiline_interleaved/input @@ -0,0 +1,5 @@ +1) A -> B : message\nnumber\n1 +2) A -> B : message\nnumber\n2 + +A: 1<2 +B: 1>2 diff --git a/test/Sequence/multiline_interleaved/output b/test/Sequence/multiline_interleaved/output new file mode 100644 index 0000000..83d6c25 --- /dev/null +++ b/test/Sequence/multiline_interleaved/output @@ -0,0 +1,17 @@ +┌─┐ ┌─┐ +│A│ │B│ +└┬┘ └┬┘ + │ │ + │──┐ │ + │message│ + │number │ + │2 │ │ + │──────>│ + │ │ │ + │message│ + │number │ + │1 │ │ + │ └───>│ +┌┴┐ ┌┴┐ +│A│ │B│ +└─┘ └─┘ diff --git a/test/Sequence/multiline_interleaved_mixed/input b/test/Sequence/multiline_interleaved_mixed/input new file mode 100644 index 0000000..016dd17 --- /dev/null +++ b/test/Sequence/multiline_interleaved_mixed/input @@ -0,0 +1,5 @@ +1) A -> B : message number 1 +2) A -> B : message\nnumber\n2 + +A: 1<2 +B: 1>2 diff --git a/test/Sequence/multiline_interleaved_mixed/output b/test/Sequence/multiline_interleaved_mixed/output new file mode 100644 index 0000000..e1ab710 --- /dev/null +++ b/test/Sequence/multiline_interleaved_mixed/output @@ -0,0 +1,15 @@ +┌─┐ ┌─┐ +│A│ │B│ +└┬┘ └┬┘ + │ │ + │──┐ │ + │ │ message │ + │ │ number │ + │ │ 2 │ + │───────────────>│ + │ │ │ + │message number 1│ + │ └────────────>│ +┌┴┐ ┌┴┐ +│A│ │B│ +└─┘ └─┘ diff --git a/test/Sequence/multiline_interleaved_mixed_2/input b/test/Sequence/multiline_interleaved_mixed_2/input new file mode 100644 index 0000000..a5234c8 --- /dev/null +++ b/test/Sequence/multiline_interleaved_mixed_2/input @@ -0,0 +1,5 @@ +1) A -> B : message\nnumber\n1 +2) A -> B : message number 2 + +A: 1<2 +B: 1>2 diff --git a/test/Sequence/multiline_interleaved_mixed_2/output b/test/Sequence/multiline_interleaved_mixed_2/output new file mode 100644 index 0000000..2c964e0 --- /dev/null +++ b/test/Sequence/multiline_interleaved_mixed_2/output @@ -0,0 +1,15 @@ +┌─┐ ┌─┐ +│A│ │B│ +└┬┘ └┬┘ + │ │ + │──┐ │ + │message number 2│ + │───────────────>│ + │ │ │ + │ │ message │ + │ │ number │ + │ │ 1 │ + │ └────────────>│ +┌┴┐ ┌┴┐ +│A│ │B│ +└─┘ └─┘