BlockIPAddr/ClassObj/ANSI.cs

137 lines
4.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace BlockIPAddr.ClassObj;
internal class ANSI
{
/*
ANSI Console Color Codes
8 Colors Foreground
The most basic terminals have a set of 8 different colors:
Black: \u001b[30m
Red: \u001b[31m
Green: \u001b[32m
Yellow: \u001b[33m
Blue: \u001b[34m
Magenta: \u001b[35m
Cyan: \u001b[36m
White: \u001b[37m
Reset: \u001b[0m
16 Colors Foreground
Most terminals, apart from the basic set of 8 colors, also support the "bright" or "bold" colors. These have their own set of codes, mirroring the normal
colors, but with an additional ;1 in their codes:
Bright Black: \u001b[30;1m
Bright Red: \u001b[31;1m
Bright Green: \u001b[32;1m
Bright Yellow: \u001b[33;1m
Bright Blue: \u001b[34;1m
Bright Magenta: \u001b[35;1m
Bright Cyan: \u001b[36;1m
Bright White: \u001b[37;1m
Reset: \u001b[0m
Background Colors
The Ansi escape codes let you set the color of the text-background the same way it lets you set the color of the foregrond. For example, the 8 background
colors correspond to the codes:
Background Black: \u001b[40m
Background Red: \u001b[41m
Background Green: \u001b[42m
Background Yellow: \u001b[43m
Background Blue: \u001b[44m
Background Magenta: \u001b[45m
Background Cyan: \u001b[46m
Background White: \u001b[47m
With the bright versions being:
Background Bright Black: \u001b[40;1m
Background Bright Red: \u001b[41;1m
Background Bright Green: \u001b[42;1m
Background Bright Yellow: \u001b[43;1m
Background Bright Blue: \u001b[44;1m
Background Bright Magenta: \u001b[45;1m
Background Bright Cyan: \u001b[46;1m
Background Bright White: \u001b[47;1m
Decorations
Apart from colors, and background-colors, Ansi escape codes also allow decorations on the text:
Bold: \u001b[1m
Underline: \u001b[4m
Reversed: \u001b[7m
Source: https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html
*/
internal const string fgReset = "\u001b[0m";
internal const string fgBrightBlack = "\u001b[30;1m";
internal const string fgBrightRed = "\u001b[31;1m";
internal const string fgBrightGreen = "\u001b[32;1m";
internal const string fgBrightYellow = "\u001b[33;1m";
internal const string fgBrightBlue = "\u001b[34;1m";
internal const string fgBrightMagenta = "\u001b[35;1m";
internal const string fgBrightCyan = "\u001b[36;1m";
internal const string fgBrightWhite = "\u001b[37;1m";
internal const string fgNormalBlack = "\u001b[30m";
internal const string fgNormalRed = "\u001b[31m";
internal const string fgNormalGreen = "\u001b[32m";
internal const string fgNormalYellow = "\u001b[33m";
internal const string fgNormalBlue = "\u001b[34m";
internal const string fgNormalMagenta = "\u001b[35m";
internal const string fgNormalCyan = "\u001b[36m";
internal const string fgNormalWhite = "\u001b[37m";
public static class ConsoleColorization
{
private const int STD_OUTPUT_HANDLE = -11;
private const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004;
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
public static void Initialize()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
EnableAnsiEscapeSequencesOnWindows();
Console.OutputEncoding = System.Text.Encoding.UTF8;
}
} //Initialize
private static void EnableAnsiEscapeSequencesOnWindows()
{
IntPtr handle = GetStdHandle(STD_OUTPUT_HANDLE);
if (handle == IntPtr.Zero)
{
throw new Exception("Cannot get standard output handle");
}
if (!GetConsoleMode(handle, out uint mode))
{
throw new Exception("Cannot get console mode");
}
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(handle, mode))
{
throw new Exception("Cannot set console mode");
}
} //EnableAnsiEscapeSequencesOnWindows
} //ConsoleColor
}