From 3a1dfe84ab12518f6370490a5dd817629eb53ffb Mon Sep 17 00:00:00 2001 From: tg-m Date: Tue, 7 Jun 2022 22:06:59 +0200 Subject: [PATCH] Add support for new lines in Sequence (#40) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add support for new lines in Sequence 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│ └─────┘ └───┘ ``` * Add tests & refactor. Co-authored-by: ArthurSonzogni --- src/translator/sequence/Sequence.cpp | 42 +++++++++++++++++++ src/translator/sequence/Sequence.hpp | 3 ++ 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, 128 insertions(+) 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 7629ea7..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); @@ -211,6 +228,17 @@ std::vector Sequence::Options() { "Use the full unicode charset or only ASCII.", Widget::Checkbox, }, + { + "interpret_backslash_n", + { + "false", + "true", + }, + "true", + "Insert new lines at every occurence of '\\n' (backslash n) in the " + "message field.", + Widget::Checkbox, + }, }; } @@ -254,13 +282,27 @@ std::string Sequence::Translate(const std::string& input, auto options = SerializeOption(options_string); ascii_only_ = (options["ascii_only"] == "true"); + interpret_backslash_n_ = (options["interpret_backslash_n"] == "true"); ComputeInternalRepresentation(input); UniformizeInternalRepresentation(); + SplitByBackslashN(); Layout(); return Draw(); } +void Sequence::SplitByBackslashN() { + if (!interpret_backslash_n_) { + return; + } + for (auto& message : messages) { + std::vector old = std::move(message.messages); + for(auto& it : old) { + SplitString(it, L"\\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..4734a4d 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 SplitByBackslashN(); + // 3) Layout. void Layout(); void LayoutComputeMessageWidth(); @@ -125,4 +127,5 @@ class Sequence : public Translator { std::map message_index; bool ascii_only_; + 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│ +└─┘ └─┘