diff options
author | Dennis van der Schagt <dennisschagt@gmail.com> | 2024-01-21 15:55:26 +0100 |
---|---|---|
committer | Dennis van der Schagt <dennisschagt@gmail.com> | 2024-03-31 21:06:21 +0200 |
commit | 9c2718ad18586b23d0fa8ced89275949a783eaca (patch) | |
tree | f87862c5f0c4c2220f138eb343d2668f35de6b11 | |
parent | 9cf2f5efdb7524580c67df305cce0654f101f0ba (diff) |
Pass StflRichText into ListFormatter
-rw-r--r-- | include/listformatter.h | 5 | ||||
-rw-r--r-- | src/helpformaction.cpp | 26 | ||||
-rw-r--r-- | src/listformatter.cpp | 13 | ||||
-rw-r--r-- | src/listwidgetbackend.cpp | 3 | ||||
-rw-r--r-- | src/pbview.cpp | 2 | ||||
-rw-r--r-- | test/listformatter.cpp | 29 | ||||
-rw-r--r-- | test/textviewwidget.cpp | 55 |
7 files changed, 84 insertions, 49 deletions
diff --git a/include/listformatter.h b/include/listformatter.h index 5fe07f37..9e71be77 100644 --- a/include/listformatter.h +++ b/include/listformatter.h @@ -15,9 +15,8 @@ class ListFormatter { public: ListFormatter(RegexManager* r = nullptr, const std::string& loc = ""); ~ListFormatter(); - void add_line(const std::string& text); - void set_line(const unsigned int itempos, - const std::string& text); + void add_line(const StflRichText& text); + void set_line(const unsigned int itempos, const StflRichText& text); void clear() { lines.clear(); diff --git a/src/helpformaction.cpp b/src/helpformaction.cpp index 7f479c08..315b2ebb 100644 --- a/src/helpformaction.cpp +++ b/src/helpformaction.cpp @@ -120,14 +120,14 @@ void HelpFormAction::prepare() desc.desc); line = utils::quote_for_stfl(line); line = apply_highlights(line); - listfmt.add_line(line); + listfmt.add_line(StflRichText::from_quoted(line)); } } if (!syskey_descriptions.empty()) { - listfmt.add_line(""); - listfmt.add_line(_("Generic bindings:")); - listfmt.add_line(""); + listfmt.add_line(StflRichText::from_plaintext_string("")); + listfmt.add_line(StflRichText::from_plaintext_string(_("Generic bindings:"))); + listfmt.add_line(StflRichText::from_plaintext_string("")); for (const auto& desc : syskey_descriptions) { if (should_be_visible(desc)) { @@ -137,31 +137,31 @@ void HelpFormAction::prepare() desc.desc); line = utils::quote_for_stfl(line); line = apply_highlights(line); - listfmt.add_line(line); + listfmt.add_line(StflRichText::from_quoted(line)); } } } if (!unbound_descriptions.empty()) { - listfmt.add_line(""); - listfmt.add_line(_("Unbound functions:")); - listfmt.add_line(""); + listfmt.add_line(StflRichText::from_plaintext_string("")); + listfmt.add_line(StflRichText::from_plaintext_string(_("Unbound functions:"))); + listfmt.add_line(StflRichText::from_plaintext_string("")); for (const auto& desc : unbound_descriptions) { if (should_be_visible(desc)) { std::string line = strprintf::fmt("%-39s %s", desc.cmd, desc.desc); line = utils::quote_for_stfl(line); line = apply_highlights(line); - listfmt.add_line(line); + listfmt.add_line(StflRichText::from_quoted(line)); } } } const auto macros = v.get_keymap()->get_macro_descriptions(); if (!macros.empty()) { - listfmt.add_line(""); - listfmt.add_line(_("Macros:")); - listfmt.add_line(""); + listfmt.add_line(StflRichText::from_plaintext_string("")); + listfmt.add_line(StflRichText::from_plaintext_string(_("Macros:"))); + listfmt.add_line(StflRichText::from_plaintext_string("")); for (const auto& macro : macros) { const std::string key = macro.first.to_bindkey_string(); @@ -171,7 +171,7 @@ void HelpFormAction::prepare() std::string line = strprintf::fmt("<macro-prefix>%s %s", key, description); line = utils::quote_for_stfl(line); line = apply_highlights(line); - listfmt.add_line(line); + listfmt.add_line(StflRichText::from_quoted(line)); } } diff --git a/src/listformatter.cpp b/src/listformatter.cpp index 6eb3fd3b..d18b3be8 100644 --- a/src/listformatter.cpp +++ b/src/listformatter.cpp @@ -17,19 +17,18 @@ ListFormatter::ListFormatter(RegexManager* r, const std::string& loc) ListFormatter::~ListFormatter() {} -void ListFormatter::add_line(const std::string& text) +void ListFormatter::add_line(const StflRichText& text) { + LOG(Level::DEBUG, "ListFormatter::add_line: `%s'", text.stfl_quoted_string()); set_line(UINT_MAX, text); - LOG(Level::DEBUG, "ListFormatter::add_line: `%s'", text); } void ListFormatter::set_line(const unsigned int itempos, - const std::string& text) + const StflRichText& text) { - const std::string formatted_text = utils::wstr2str(utils::clean_nonprintable_characters( - utils::str2wstr(text))); - - // TODO: Propagate usage of StflRichText + const std::wstring wide = utils::str2wstr(text.stfl_quoted_string()); + const std::wstring cleaned = utils::clean_nonprintable_characters(wide); + const std::string formatted_text = utils::wstr2str(cleaned); const StflRichText stflRichText = StflRichText::from_quoted(formatted_text); if (itempos == UINT_MAX) { diff --git a/src/listwidgetbackend.cpp b/src/listwidgetbackend.cpp index 760774d5..31331992 100644 --- a/src/listwidgetbackend.cpp +++ b/src/listwidgetbackend.cpp @@ -92,7 +92,8 @@ void ListWidgetBackend::render() formatted_line = get_formatted_line(line, viewport_width); line_cache.insert({line, formatted_line}); } - listfmt.add_line(formatted_line); + // TODO: Propagate usage of StflRichText + listfmt.add_line(StflRichText::from_quoted(formatted_line)); } form.modify(list_name, "replace_inner", listfmt.format_list()); diff --git a/src/pbview.cpp b/src/pbview.cpp index 8066fdcb..1f2926dc 100644 --- a/src/pbview.cpp +++ b/src/pbview.cpp @@ -314,7 +314,7 @@ void PbView::run_help() desc.cmd, desc.desc); - listfmt.add_line(descline); + listfmt.add_line(StflRichText::from_plaintext_string(descline)); } help_textview.stfl_replace_lines(listfmt.get_lines_count(), diff --git a/test/listformatter.cpp b/test/listformatter.cpp index 3e58e615..b6fa99f4 100644 --- a/test/listformatter.cpp +++ b/test/listformatter.cpp @@ -4,6 +4,17 @@ using namespace newsboat; +namespace { + +void add_lines(ListFormatter& listfmt, std::vector<std::string> lines) +{ + for (const auto& line : lines) { + listfmt.add_line(StflRichText::from_plaintext_string(line)); + } +} + +} + TEST_CASE("add_line(), get_lines_count() and clear()", "[ListFormatter]") { @@ -12,10 +23,10 @@ TEST_CASE("add_line(), get_lines_count() and clear()", REQUIRE(fmt.get_lines_count() == 0); SECTION("add_line() adds a line") { - fmt.add_line("one"); + add_lines(fmt, {"one"}); REQUIRE(fmt.get_lines_count() == 1); - fmt.add_line("two"); + add_lines(fmt, {"two"}); REQUIRE(fmt.get_lines_count() == 2); SECTION("clear() removes all lines") { @@ -29,9 +40,11 @@ TEST_CASE("set_line() replaces the item in a list", "[ListFormatter]") { ListFormatter fmt; - fmt.add_line("hello"); - fmt.add_line("goodb"); - fmt.add_line("ye"); + add_lines(fmt, { + "hello", + "goodb", + "ye", + }); std::string expected = "{list" @@ -41,7 +54,7 @@ TEST_CASE("set_line() replaces the item in a list", "[ListFormatter]") "}"; REQUIRE(fmt.format_list() == expected); - fmt.set_line(1, "oh"); + fmt.set_line(1, StflRichText::from_plaintext_string("oh")); expected = "{list" @@ -58,7 +71,9 @@ TEST_CASE("format_list() uses regex manager if one is passed", RegexManager rxmgr; ListFormatter fmt(&rxmgr, "article"); - fmt.add_line("Highlight me please!"); + add_lines(fmt, { + "Highlight me please!", + }); // the choice of green text on red background does not reflect my // personal taste (or lack thereof) :) diff --git a/test/textviewwidget.cpp b/test/textviewwidget.cpp index f14bfbc7..58a76f5c 100644 --- a/test/textviewwidget.cpp +++ b/test/textviewwidget.cpp @@ -1,11 +1,15 @@ #include <textviewwidget.h> +#include <vector> + #include "3rd-party/catch.hpp" #include "listformatter.h" #include "stflpp.h" using namespace newsboat; +namespace { + const static std::string stflTextviewForm = "vbox\n" " textview[textview-name]\n" @@ -16,6 +20,15 @@ const static std::string stflTextviewForm = const static std::string widgetName = "textview-name"; +void add_lines(ListFormatter& listfmt, std::vector<std::string> lines) +{ + for (const auto& line : lines) { + listfmt.add_line(StflRichText::from_plaintext_string(line)); + } +} + +} + TEST_CASE("stfl_replace_lines() keeps text in view", "[TextviewWidget]") { Stfl::Form form(stflTextviewForm); @@ -24,9 +37,11 @@ TEST_CASE("stfl_replace_lines() keeps text in view", "[TextviewWidget]") REQUIRE(widget.get_scroll_offset() == 0); ListFormatter listfmt; - listfmt.add_line("one"); - listfmt.add_line("two"); - listfmt.add_line("three"); + add_lines(listfmt, { + "one", + "two", + "three", + }); widget.stfl_replace_lines(listfmt.get_lines_count(), listfmt.format_list()); widget.set_scroll_offset(2); @@ -41,16 +56,20 @@ TEST_CASE("stfl_replace_lines() keeps text in view", "[TextviewWidget]") SECTION("widget scrolls upwards if lines are removed") { listfmt.clear(); - listfmt.add_line("one"); - listfmt.add_line("two"); + add_lines(listfmt, { + "one", + "two", + }); widget.stfl_replace_lines(listfmt.get_lines_count(), listfmt.format_list()); REQUIRE(widget.get_scroll_offset() == 1); } SECTION("no change in scroll location when adding lines") { - listfmt.add_line("four"); - listfmt.add_line("five"); + add_lines(listfmt, { + "four", + "five", + }); widget.stfl_replace_lines(listfmt.get_lines_count(), listfmt.format_list()); REQUIRE(widget.get_scroll_offset() == 2); @@ -72,16 +91,18 @@ TEST_CASE("Basic movements work as expected", "[TextviewWidget]") REQUIRE(widget.get_scroll_offset() == 0); ListFormatter listfmt; - listfmt.add_line("one"); - listfmt.add_line("two"); - listfmt.add_line("three"); - listfmt.add_line("four"); - listfmt.add_line("five"); - listfmt.add_line("six"); - listfmt.add_line("seven"); - listfmt.add_line("eight"); - listfmt.add_line("nine"); - listfmt.add_line("ten"); + add_lines(listfmt, { + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "ten", + }); widget.stfl_replace_lines(listfmt.get_lines_count(), listfmt.format_list()); widget.set_scroll_offset(2); |