File: clAnsiEscapeCodeColourBuilder.cpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (106 lines) | stat: -rw-r--r-- 3,308 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "clAnsiEscapeCodeColourBuilder.hpp"

namespace
{
constexpr wxChar ESC = 0x1B;
};

clAnsiEscapeCodeColourBuilder::clAnsiEscapeCodeColourBuilder()
    : clAnsiEscapeCodeColourBuilder(&m_internalBuffer)
{
}

clAnsiEscapeCodeColourBuilder::clAnsiEscapeCodeColourBuilder(wxString* string)
    : m_string(string)
{
    m_activeColours = &m_lightThemeColours;

    m_lightThemeColours.insert({ eAsciiColours::RED, 124 });
    m_lightThemeColours.insert({ eAsciiColours::YELLOW, 136 });
    m_lightThemeColours.insert({ eAsciiColours::GREEN, 28 });
    m_lightThemeColours.insert({ eAsciiColours::GRAY, 251 });
    m_lightThemeColours.insert({ eAsciiColours::NORMAL_TEXT, 240 });

    m_darkThemeColours.insert({ eAsciiColours::RED, 196 });
    m_darkThemeColours.insert({ eAsciiColours::YELLOW, 214 });
    m_darkThemeColours.insert({ eAsciiColours::GREEN, 34 });
    m_darkThemeColours.insert({ eAsciiColours::GRAY, 243 });
    m_darkThemeColours.insert({ eAsciiColours::NORMAL_TEXT, 254 });
}

clAnsiEscapeCodeColourBuilder::~clAnsiEscapeCodeColourBuilder() {}

clAnsiEscapeCodeColourBuilder& clAnsiEscapeCodeColourBuilder::Add(const wxString& text, eAsciiColours textColour,
                                                                  bool bold)
{
    if(m_activeColours->count(textColour) == 0) {
        return *this;
    }

    int colour_number = m_activeColours->find(textColour)->second;
    return Add(text, colour_number, bold);
}

clAnsiEscapeCodeColourBuilder& clAnsiEscapeCodeColourBuilder::Add(const wxString& text, int textColour, bool bold)
{
    DoAddTextToBuffer(m_string, text, textColour, bold);
    return *this;
}
clAnsiEscapeCodeColourBuilder& clAnsiEscapeCodeColourBuilder::Add(const wxString& text, const wxColour& colour,
                                                                  bool bold)
{
    if(!colour.IsOk()) {
        return Add(text, eAsciiColours::NORMAL_TEXT, bold);
    }

    wxString prefix;
    wxString suffix;

    // prepare the prefix
    prefix << ESC << "[";
    prefix << "38;2;" << (int)colour.Red() << ";" << (int)colour.Green() << ";" << (int)colour.Blue() << "m";

    // and suffix
    suffix << ESC << "[0m";

    (*m_string) << prefix << text << suffix;
    return *this;
}

clAnsiEscapeCodeColourBuilder& clAnsiEscapeCodeColourBuilder::SetTheme(eAsciiTheme theme)
{
    if(theme == eAsciiTheme::DARK) {
        m_activeColours = &m_darkThemeColours;
    } else {
        m_activeColours = &m_lightThemeColours;
    }
    return *this;
}

wxString& clAnsiEscapeCodeColourBuilder::WrapWithColour(wxString& line, eAsciiColours colour, bool bold_font) const
{
    if(m_activeColours->count(colour) == 0) {
        return line;
    }

    int colour_number = m_activeColours->find(colour)->second;
    wxString buffer;
    DoAddTextToBuffer(&buffer, line, colour_number, bold_font);
    line.swap(buffer);
    return line;
}

void clAnsiEscapeCodeColourBuilder::DoAddTextToBuffer(wxString* buffer, const wxString& text, int textColour,
                                                      bool bold) const
{
    wxString prefix;
    wxString suffix;

    prefix << ESC << "[";
    if(bold) {
        prefix << "1;";
    }
    prefix << "38;5;" << textColour << "m";
    suffix << ESC << "[0m";
    (*buffer) << prefix << text << suffix;
}