-
Notifications
You must be signed in to change notification settings - Fork 24
/
ConsoleExtensions.cs
158 lines (112 loc) · 6.1 KB
/
ConsoleExtensions.cs
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
namespace Pastel
{
using System;
using System.Drawing;
using System.Globalization;
using System.Runtime.InteropServices;
public static class ConsoleExtensions
{
private const int STD_OUTPUT_HANDLE = -11;
private const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004;
private const uint DISABLE_NEWLINE_AUTO_RETURN = 0x0008;
[DllImport("kernel32.dll")]
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
public static extern uint GetLastError();
private delegate string ColorFormat( string input, Color color);
private delegate string ColorFormatHex(string input, string hexColor);
private const string _formatString = "\u001b[{0};2;{1};{2};{3}m{4}\u001b[0m";
private const string _foregroundModifier = "38";
private const string _backgroundModifier = "48";
private static readonly Func<string, int> _parseHexColor = hc => int.Parse(hc.Replace("#", ""), NumberStyles.HexNumber);
private static readonly Func<string, Color, string, string> _colorFormat = (s, c, f) => string.Format(_formatString, f, c.R, c.G, c.B, s);
private static readonly Func<string, string, string, string> _colorHexFormat = (s, c, f) => _colorFormat(s, Color.FromArgb(_parseHexColor(c)), f);
private static readonly ColorFormat _noColorOutputFormat = (s, _) => s;
private static readonly ColorFormatHex _noColorOutputHexFormat = (s, _) => s;
private static readonly ColorFormat _foregroundColorFormat = (s, c) => _colorFormat( s, c, _foregroundModifier);
private static readonly ColorFormatHex _foregroundColorHexFormat = (s, c) => _colorHexFormat(s, c, _foregroundModifier);
private static readonly ColorFormat _backgroundColorFormat = (s, c) => _colorFormat( s, c, _backgroundModifier);
private static readonly ColorFormatHex _backgroundColorHexFormat = (s, c) => _colorHexFormat(s, c, _backgroundModifier);
private static ColorFormat _foregroundColorFormatFunc;
private static ColorFormatHex _foregroundColorHexFormatFunc;
private static ColorFormat _backgroundColorFormatFunc;
private static ColorFormatHex _backgroundColorHexFormatFunc;
static ConsoleExtensions()
{
if (Environment.GetEnvironmentVariable("NO_COLOR") == null)
{
Enable();
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
var enable = GetConsoleMode(iStdOut, out var outConsoleMode)
&& SetConsoleMode(iStdOut, outConsoleMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN);
}
}
else
{
Disable();
}
}
/// <summary>
/// Enables any future console color output produced by Pastel.
/// </summary>
public static void Enable()
{
_foregroundColorFormatFunc = _foregroundColorFormat;
_foregroundColorHexFormatFunc = _foregroundColorHexFormat;
_backgroundColorFormatFunc = _backgroundColorFormat;
_backgroundColorHexFormatFunc = _backgroundColorHexFormat;
}
/// <summary>
/// Disables any future console color output produced by Pastel.
/// </summary>
public static void Disable()
{
_foregroundColorFormatFunc = _noColorOutputFormat;
_foregroundColorHexFormatFunc = _noColorOutputHexFormat;
_backgroundColorFormatFunc = _noColorOutputFormat;
_backgroundColorHexFormatFunc = _noColorOutputHexFormat;
}
/// <summary>
/// Returns a string wrapped in an ANSI foreground color code using the specified color.
/// </summary>
/// <param name="input">The string to color.</param>
/// <param name="color">The color to use on the specified string.</param>
public static string Pastel(this string input, Color color)
{
return _foregroundColorFormatFunc(input, color);
}
/// <summary>
/// Returns a string wrapped in an ANSI foreground color code using the specified color.
/// </summary>
/// <param name="input">The string to color.</param>
/// <param name="hexColor">The color to use on the specified string.<para>Supported format: [#]RRGGBB.</para></param>
public static string Pastel(this string input, string hexColor)
{
return _foregroundColorHexFormatFunc(input, hexColor);
}
/// <summary>
/// Returns a string wrapped in an ANSI background color code using the specified color.
/// </summary>
/// <param name="input">The string to color.</param>
/// <param name="color">The color to use on the specified string.</param>
public static string PastelBg(this string input, Color color)
{
return _backgroundColorFormatFunc(input, color);
}
/// <summary>
/// Returns a string wrapped in an ANSI background color code using the specified color.
/// </summary>
/// <param name="input">The string to color.</param>
/// <param name="hexColor">The color to use on the specified string.<para>Supported format: [#]RRGGBB.</para></param>
public static string PastelBg(this string input, string hexColor)
{
return _backgroundColorHexFormatFunc(input, hexColor);
}
}
}