diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/colorizer/colors.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/colorizer/colors.h')
-rw-r--r-- | library/cpp/colorizer/colors.h | 228 |
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); |