summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2024-04-19 15:57:23 +0200
committerJulian Andres Klode <julian.klode@canonical.com>2024-04-19 16:58:24 +0200
commit58ee0fabc9028fcdf86faab3bb9c1db2b27e3644 (patch)
treec437646c2a6e69f2d2d242369969f766f197816a
parent633f6d67a28b375cf1f225f14d3c926e618d46af (diff)
Add APT::Configuration::color helper to colorize things
-rw-r--r--apt-pkg/aptconfiguration.cc35
-rw-r--r--apt-pkg/aptconfiguration.h2
-rw-r--r--test/libapt/configuration_test.cc30
3 files changed, 67 insertions, 0 deletions
diff --git a/apt-pkg/aptconfiguration.cc b/apt-pkg/aptconfiguration.cc
index 982e68bb1..f462b6eda 100644
--- a/apt-pkg/aptconfiguration.cc
+++ b/apt-pkg/aptconfiguration.cc
@@ -563,4 +563,39 @@ bool Configuration::checkUsrMerged()
return true;
}
/*}}}*/
+// isUsrMerged - whether usr is merged t /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+std::string Configuration::color(std::string const &colorName, std::string const &content)
+{
+ if (not _config->FindB("APT::Color"))
+ return content;
+
+ auto colors = ::Configuration(_config->Tree("APT::Color"));
+ auto color = colors.Find(colorName);
+
+ // Resolve the color recursively. A color string has the following format
+ // <color> := \x1B<word> ; fully resolved color
+ // | \\x1B<word> ; color escaped.
+ // | <word> ; a simple color name
+ // | <color> <color> ; a sequence of colors
+ if (color.find(" ") != color.npos)
+ {
+ std::string res;
+ for (auto &&colorPart : VectorizeString(color, ' '))
+ res += Configuration::color(colorPart);
+ color = res;
+ }
+ else if (not color.empty() && color[0] != '\x1B')
+ {
+ if (APT::String::Startswith(color, "\\x1B"))
+ color = "\x1B" + color.substr(4);
+ else
+ color = Configuration::color(color);
+ }
+ if (content.empty())
+ return color;
+ return color + content + Configuration::color("Neutral");
+}
+ /*}}}*/
}
diff --git a/apt-pkg/aptconfiguration.h b/apt-pkg/aptconfiguration.h
index 3e2636edc..58c925b7f 100644
--- a/apt-pkg/aptconfiguration.h
+++ b/apt-pkg/aptconfiguration.h
@@ -130,7 +130,9 @@ namespace Configuration { /*{{{*/
APT_PUBLIC bool isChroot();
/** \return Check usr is merged or produce error. */
APT_PUBLIC bool checkUsrMerged();
+ APT_PUBLIC std::string color(std::string const &colorName, std::string const &content = "");
#endif
+
/*}}}*/
}
/*}}}*/
diff --git a/test/libapt/configuration_test.cc b/test/libapt/configuration_test.cc
index 4d297a9f2..61c7348a2 100644
--- a/test/libapt/configuration_test.cc
+++ b/test/libapt/configuration_test.cc
@@ -230,3 +230,33 @@ List::Option2 { "Multi";
EXPECT_TRUE(Cnf.FindB("Trailing"));
EXPECT_FALSE(Cnf.Exists("Commented::Out"));
}
+
+TEST(ConfigurationTest, Color)
+{
+ _config->Clear();
+ _config->Set("APT::Color::Neutral", "\x1B[N");
+ _config->Set("APT::Color::Green", "\x1B[G");
+ // This is escaped for extra fun
+ _config->Set("APT::Color::Bold", "\\x1B[B");
+ _config->Set("APT::Color::BoldGreen", "bold green");
+ _config->Set("APT::Color::BoldGreenRef", "boldgreen");
+ _config->Set("APT::Color::BoldGreenNeutral", "boldgreen neutral");
+ _config->Set("APT::Color::BoldGreenRefNeutral", "boldgreenref neutral");
+
+ EXPECT_EQ("", APT::Configuration::color("bold"));
+ EXPECT_EQ("", APT::Configuration::color("green"));
+ EXPECT_EQ("content", APT::Configuration::color("green", "content"));
+ EXPECT_EQ("", APT::Configuration::color("boldgreen"));
+ EXPECT_EQ("", APT::Configuration::color("boldgreenref"));
+ EXPECT_EQ("", APT::Configuration::color("boldgreenneutral"));
+ EXPECT_EQ("", APT::Configuration::color("boldgreenrefneutral"));
+
+ _config->Set("APT::Color", "true");
+ EXPECT_EQ("\x1B[B", APT::Configuration::color("bold"));
+ EXPECT_EQ("\x1B[G", APT::Configuration::color("green"));
+ EXPECT_EQ("\x1B[Gcontent\x1B[N", APT::Configuration::color("green", "content"));
+ EXPECT_EQ("\x1B[B\x1B[G", APT::Configuration::color("boldgreen"));
+ EXPECT_EQ("\x1B[B\x1B[G", APT::Configuration::color("boldgreenref"));
+ EXPECT_EQ("\x1B[B\x1B[G\x1B[N", APT::Configuration::color("boldgreenneutral"));
+ EXPECT_EQ("\x1B[B\x1B[G\x1B[N", APT::Configuration::color("boldgreenrefneutral"));
+}