aboutsummaryrefslogblamecommitdiffstats
path: root/library/cpp/colorizer/colors.h
blob: 474a918994ec2571c0861bd64eb580154c62e58e (plain) (tree)
1
2
3
4
5
6
7
8
9
            
 
                
 
                                
                                
 
                 
 
                      





























































































                                                                                                                      
           
                                         
 



















































































                                                                                                                      
                                            
                          
 
                                                   

                           
                                       

                           
                                        



                            
      
 
                                                         

                      
                                                                                                              
                                           

                                                                    
 

                                                
#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);