summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDennis van der Schagt <dennisschagt@gmail.com>2024-01-21 15:55:26 +0100
committerDennis van der Schagt <dennisschagt@gmail.com>2024-03-31 21:06:21 +0200
commit9c2718ad18586b23d0fa8ced89275949a783eaca (patch)
treef87862c5f0c4c2220f138eb343d2668f35de6b11
parent9cf2f5efdb7524580c67df305cce0654f101f0ba (diff)
Pass StflRichText into ListFormatter
-rw-r--r--include/listformatter.h5
-rw-r--r--src/helpformaction.cpp26
-rw-r--r--src/listformatter.cpp13
-rw-r--r--src/listwidgetbackend.cpp3
-rw-r--r--src/pbview.cpp2
-rw-r--r--test/listformatter.cpp29
-rw-r--r--test/textviewwidget.cpp55
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);