mirror of
https://github.com/fmtlib/fmt.git
synced 2025-03-30 13:20:18 +00:00
Add faint, blink, reverse and conceal to the emphases (#2394)
This commit is contained in:
parent
d141cdbeb0
commit
02ad5e11da
@ -185,9 +185,13 @@ enum class terminal_color : uint8_t {
|
|||||||
|
|
||||||
enum class emphasis : uint8_t {
|
enum class emphasis : uint8_t {
|
||||||
bold = 1,
|
bold = 1,
|
||||||
italic = 1 << 1,
|
faint = 1 << 1,
|
||||||
underline = 1 << 2,
|
italic = 1 << 2,
|
||||||
strikethrough = 1 << 3
|
underline = 1 << 3,
|
||||||
|
blink = 1 << 4,
|
||||||
|
reverse = 1 << 5,
|
||||||
|
conceal = 1 << 6,
|
||||||
|
strikethrough = 1 << 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
// rgb is a struct for red, green and blue colors.
|
// rgb is a struct for red, green and blue colors.
|
||||||
@ -409,16 +413,18 @@ template <typename Char> struct ansi_color_escape {
|
|||||||
buffer[19] = static_cast<Char>(0);
|
buffer[19] = static_cast<Char>(0);
|
||||||
}
|
}
|
||||||
FMT_CONSTEXPR ansi_color_escape(emphasis em) FMT_NOEXCEPT {
|
FMT_CONSTEXPR ansi_color_escape(emphasis em) FMT_NOEXCEPT {
|
||||||
uint8_t em_codes[4] = {};
|
uint8_t em_codes[num_emphases] = {};
|
||||||
uint8_t em_bits = static_cast<uint8_t>(em);
|
if (has_emphasis(em, emphasis::bold)) em_codes[0] = 1;
|
||||||
if (em_bits & static_cast<uint8_t>(emphasis::bold)) em_codes[0] = 1;
|
if (has_emphasis(em, emphasis::faint)) em_codes[1] = 2;
|
||||||
if (em_bits & static_cast<uint8_t>(emphasis::italic)) em_codes[1] = 3;
|
if (has_emphasis(em, emphasis::italic)) em_codes[2] = 3;
|
||||||
if (em_bits & static_cast<uint8_t>(emphasis::underline)) em_codes[2] = 4;
|
if (has_emphasis(em, emphasis::underline)) em_codes[3] = 4;
|
||||||
if (em_bits & static_cast<uint8_t>(emphasis::strikethrough))
|
if (has_emphasis(em, emphasis::blink)) em_codes[4] = 5;
|
||||||
em_codes[3] = 9;
|
if (has_emphasis(em, emphasis::reverse)) em_codes[5] = 7;
|
||||||
|
if (has_emphasis(em, emphasis::conceal)) em_codes[6] = 8;
|
||||||
|
if (has_emphasis(em, emphasis::strikethrough)) em_codes[7] = 9;
|
||||||
|
|
||||||
size_t index = 0;
|
size_t index = 0;
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (size_t i = 0; i < num_emphases; ++i) {
|
||||||
if (!em_codes[i]) continue;
|
if (!em_codes[i]) continue;
|
||||||
buffer[index++] = static_cast<Char>('\x1b');
|
buffer[index++] = static_cast<Char>('\x1b');
|
||||||
buffer[index++] = static_cast<Char>('[');
|
buffer[index++] = static_cast<Char>('[');
|
||||||
@ -435,7 +441,8 @@ template <typename Char> struct ansi_color_escape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Char buffer[7u + 3u * 4u + 1u];
|
static constexpr size_t num_emphases = 8;
|
||||||
|
Char buffer[7u + 3u * num_emphases + 1u];
|
||||||
|
|
||||||
static FMT_CONSTEXPR void to_esc(uint8_t c, Char* out,
|
static FMT_CONSTEXPR void to_esc(uint8_t c, Char* out,
|
||||||
char delimiter) FMT_NOEXCEPT {
|
char delimiter) FMT_NOEXCEPT {
|
||||||
@ -444,6 +451,10 @@ template <typename Char> struct ansi_color_escape {
|
|||||||
out[2] = static_cast<Char>('0' + c % 10);
|
out[2] = static_cast<Char>('0' + c % 10);
|
||||||
out[3] = static_cast<Char>(delimiter);
|
out[3] = static_cast<Char>(delimiter);
|
||||||
}
|
}
|
||||||
|
static FMT_CONSTEXPR bool has_emphasis(emphasis em,
|
||||||
|
emphasis mask) FMT_NOEXCEPT {
|
||||||
|
return static_cast<uint8_t>(em) & static_cast<uint8_t>(mask);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
|
@ -20,10 +20,16 @@ TEST(color_test, format) {
|
|||||||
fmt::format(fg(fmt::color::blue) | bg(fmt::color::red), "two color"),
|
fmt::format(fg(fmt::color::blue) | bg(fmt::color::red), "two color"),
|
||||||
"\x1b[38;2;000;000;255m\x1b[48;2;255;000;000mtwo color\x1b[0m");
|
"\x1b[38;2;000;000;255m\x1b[48;2;255;000;000mtwo color\x1b[0m");
|
||||||
EXPECT_EQ(fmt::format(fmt::emphasis::bold, "bold"), "\x1b[1mbold\x1b[0m");
|
EXPECT_EQ(fmt::format(fmt::emphasis::bold, "bold"), "\x1b[1mbold\x1b[0m");
|
||||||
|
EXPECT_EQ(fmt::format(fmt::emphasis::faint, "faint"), "\x1b[2mfaint\x1b[0m");
|
||||||
EXPECT_EQ(fmt::format(fmt::emphasis::italic, "italic"),
|
EXPECT_EQ(fmt::format(fmt::emphasis::italic, "italic"),
|
||||||
"\x1b[3mitalic\x1b[0m");
|
"\x1b[3mitalic\x1b[0m");
|
||||||
EXPECT_EQ(fmt::format(fmt::emphasis::underline, "underline"),
|
EXPECT_EQ(fmt::format(fmt::emphasis::underline, "underline"),
|
||||||
"\x1b[4munderline\x1b[0m");
|
"\x1b[4munderline\x1b[0m");
|
||||||
|
EXPECT_EQ(fmt::format(fmt::emphasis::blink, "blink"), "\x1b[5mblink\x1b[0m");
|
||||||
|
EXPECT_EQ(fmt::format(fmt::emphasis::reverse, "reverse"),
|
||||||
|
"\x1b[7mreverse\x1b[0m");
|
||||||
|
EXPECT_EQ(fmt::format(fmt::emphasis::conceal, "conceal"),
|
||||||
|
"\x1b[8mconceal\x1b[0m");
|
||||||
EXPECT_EQ(fmt::format(fmt::emphasis::strikethrough, "strikethrough"),
|
EXPECT_EQ(fmt::format(fmt::emphasis::strikethrough, "strikethrough"),
|
||||||
"\x1b[9mstrikethrough\x1b[0m");
|
"\x1b[9mstrikethrough\x1b[0m");
|
||||||
EXPECT_EQ(
|
EXPECT_EQ(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user