aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/colorizer/colors.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/colorizer/colors.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/colorizer/colors.h')
-rw-r--r--library/cpp/colorizer/colors.h228
1 files changed, 228 insertions, 0 deletions
diff --git a/library/cpp/colorizer/colors.h b/library/cpp/colorizer/colors.h
new file mode 100644
index 0000000000..474a918994
--- /dev/null
+++ b/library/cpp/colorizer/colors.h
@@ -0,0 +1,228 @@
+#pragma once
+
+#include "fwd.h"
+
+#include <util/generic/string.h>
+#include <util/generic/strbuf.h>
+
+#include <cstdio>
+
+namespace NColorizer {
+ /**
+ * List of ECMA-48 colors.
+ *
+ * When printing elements of this enum via `operator<<`, `AutoColors()` (see below) function will be used
+ * to produce colors, i.e. nothing will be printed to non-tty streams. When converting elements of this enum
+ * via `ToString`, escape code is always returned.
+ *
+ * Note: as of now (2019-03), `ya make` strips out some escape codes from compiler output.
+ * It also inserts `RESET` before each color code. See https://st.yandex-team.ru/DEVTOOLS-5269 for details.
+ * For now, do not use `OLD`, `ST_*`, `FG_*` and `BG_*` in tools that run through `ya make`.
+ *
+ * Note: refrain from using black colors because there's high chance they'll not be visible on some terminals.
+ * Default windows and ubuntu color schemes shows them as black letters on black background.
+ * Also, white colors are barely visible in default OSX color scheme. Light black is usually fine though.
+ */
+ enum EAnsiCode: i8 {
+ // Note: not using `GENERATE_ENUM_SERIALIZATION` because serialization generator depends on this library.
+
+ /// Does not change anything.
+ INVALID,
+
+ /// Reset all styles and colors. Safe to use in `ya make` tools.
+ RESET,
+
+ /// Change style, don't change anything else.
+ ST_LIGHT,
+ ST_DARK,
+ ST_NORMAL,
+
+ /// Additional styles.
+ ITALIC_ON,
+ ITALIC_OFF,
+ UNDERLINE_ON,
+ UNDERLINE_OFF,
+
+ /// Change foreground color, don't change anything else.
+ FG_DEFAULT,
+ FG_BLACK,
+ FG_RED,
+ FG_GREEN,
+ FG_YELLOW,
+ FG_BLUE,
+ FG_MAGENTA,
+ FG_CYAN,
+ FG_WHITE,
+
+ /// Change background color, don't change anything else.
+ BG_DEFAULT,
+ BG_BLACK,
+ BG_RED,
+ BG_GREEN,
+ BG_YELLOW,
+ BG_BLUE,
+ BG_MAGENTA,
+ BG_CYAN,
+ BG_WHITE,
+
+ /// Reset all styles and colors, then enable a (possibly light or dark) color. Safe to use in `ya make` tools.
+ DEFAULT,
+ BLACK,
+ RED,
+ GREEN,
+ YELLOW,
+ BLUE,
+ MAGENTA,
+ CYAN,
+ WHITE,
+ LIGHT_DEFAULT,
+ LIGHT_BLACK,
+ LIGHT_RED,
+ LIGHT_GREEN,
+ LIGHT_YELLOW,
+ LIGHT_BLUE,
+ LIGHT_MAGENTA,
+ LIGHT_CYAN,
+ LIGHT_WHITE,
+ DARK_DEFAULT,
+ DARK_BLACK,
+ DARK_RED,
+ DARK_GREEN,
+ DARK_YELLOW,
+ DARK_BLUE,
+ DARK_MAGENTA,
+ DARK_CYAN,
+ DARK_WHITE,
+ };
+
+ /**
+ * Produces escape codes or empty stringbuf depending on settings.
+ * All color functions return zero-terminated stringbuf.
+ */
+ class TColors {
+ public:
+ static bool CalcIsTTY(FILE* file);
+
+ public:
+ explicit TColors(FILE* = stderr);
+ explicit TColors(bool ontty);
+
+ TStringBuf Reset() const noexcept;
+
+ TStringBuf StyleLight() const noexcept;
+ TStringBuf StyleDark() const noexcept;
+ TStringBuf StyleNormal() const noexcept;
+
+ TStringBuf ItalicOn() const noexcept;
+ TStringBuf ItalicOff() const noexcept;
+ TStringBuf UnderlineOn() const noexcept;
+ TStringBuf UnderlineOff() const noexcept;
+
+ TStringBuf ForeDefault() const noexcept;
+ TStringBuf ForeBlack() const noexcept;
+ TStringBuf ForeRed() const noexcept;
+ TStringBuf ForeGreen() const noexcept;
+ TStringBuf ForeYellow() const noexcept;
+ TStringBuf ForeBlue() const noexcept;
+ TStringBuf ForeMagenta() const noexcept;
+ TStringBuf ForeCyan() const noexcept;
+ TStringBuf ForeWhite() const noexcept;
+
+ TStringBuf BackDefault() const noexcept;
+ TStringBuf BackBlack() const noexcept;
+ TStringBuf BackRed() const noexcept;
+ TStringBuf BackGreen() const noexcept;
+ TStringBuf BackYellow() const noexcept;
+ TStringBuf BackBlue() const noexcept;
+ TStringBuf BackMagenta() const noexcept;
+ TStringBuf BackCyan() const noexcept;
+ TStringBuf BackWhite() const noexcept;
+
+ TStringBuf Default() const noexcept;
+ TStringBuf Black() const noexcept;
+ TStringBuf Red() const noexcept;
+ TStringBuf Green() const noexcept;
+ TStringBuf Yellow() const noexcept;
+ TStringBuf Blue() const noexcept;
+ TStringBuf Magenta() const noexcept;
+ TStringBuf Cyan() const noexcept;
+ TStringBuf White() const noexcept;
+
+ TStringBuf LightDefault() const noexcept;
+ TStringBuf LightBlack() const noexcept;
+ TStringBuf LightRed() const noexcept;
+ TStringBuf LightGreen() const noexcept;
+ TStringBuf LightYellow() const noexcept;
+ TStringBuf LightBlue() const noexcept;
+ TStringBuf LightMagenta() const noexcept;
+ TStringBuf LightCyan() const noexcept;
+ TStringBuf LightWhite() const noexcept;
+
+ TStringBuf DarkDefault() const noexcept;
+ TStringBuf DarkBlack() const noexcept;
+ TStringBuf DarkRed() const noexcept;
+ TStringBuf DarkGreen() const noexcept;
+ TStringBuf DarkYellow() const noexcept;
+ TStringBuf DarkBlue() const noexcept;
+ TStringBuf DarkMagenta() const noexcept;
+ TStringBuf DarkCyan() const noexcept;
+ TStringBuf DarkWhite() const noexcept;
+
+ /// Compatibility; prefer using methods without `Color` suffix in their names.
+ /// Note: these behave differently from their un-suffixed counterparts.
+ /// While functions declared above will reset colors completely, these will only reset foreground color and
+ /// style, without changing the background color and underline/italic settings. Also, names of these functions
+ /// don't conform with standard, e.g. `YellowColor` actually emits the `lite yellow` escape code.
+ TStringBuf OldColor() const noexcept;
+ TStringBuf BoldColor() const noexcept;
+ TStringBuf BlackColor() const noexcept;
+ TStringBuf BlueColor() const noexcept;
+ TStringBuf GreenColor() const noexcept;
+ TStringBuf CyanColor() const noexcept;
+ TStringBuf RedColor() const noexcept;
+ TStringBuf PurpleColor() const noexcept;
+ TStringBuf BrownColor() const noexcept;
+ TStringBuf LightGrayColor() const noexcept;
+ TStringBuf DarkGrayColor() const noexcept;
+ TStringBuf LightBlueColor() const noexcept;
+ TStringBuf LightGreenColor() const noexcept;
+ TStringBuf LightCyanColor() const noexcept;
+ TStringBuf LightRedColor() const noexcept;
+ TStringBuf LightPurpleColor() const noexcept;
+ TStringBuf YellowColor() const noexcept;
+ TStringBuf WhiteColor() const noexcept;
+
+ inline bool IsTTY() const noexcept {
+ return IsTTY_;
+ }
+
+ inline void SetIsTTY(bool value) noexcept {
+ IsTTY_ = value;
+ }
+
+ inline void Enable() noexcept {
+ SetIsTTY(true);
+ }
+
+ inline void Disable() noexcept {
+ SetIsTTY(false);
+ }
+
+ private:
+ bool IsTTY_;
+ };
+
+ /// Singletone `TColors` instances for stderr/stdout.
+ TColors& StdErr();
+ TColors& StdOut();
+
+ /// Choose `TColors` depending on output stream. If passed stream is stderr/stdout, return a corresponding
+ /// singletone. Otherwise, return a disabled singletone (which you can, but should *not* enable).
+ TColors& AutoColors(IOutputStream& os);
+
+ /// Calculate total length of all ANSI escape codes in the text.
+ size_t TotalAnsiEscapeCodeLen(TStringBuf text);
+}
+
+TStringBuf ToStringBuf(NColorizer::EAnsiCode x);
+TString ToString(NColorizer::EAnsiCode x);