Repository navigation
Expand file tree
/
Copy pathStringExtensions.cs
More file actions
85 lines (66 loc) · 2.67 KB
/
Copy pathStringExtensions.cs
File metadata and controls
85 lines (66 loc) · 2.67 KB
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
using System;
using System.Text.RegularExpressions;
using JetBrains.Annotations;
namespace NTRightsNet
{
/// <summary>
/// Extension methods for <see cref="string"/>.
/// </summary>
internal static class StringExtensions
{
//--------------------------------------------------
[NotNull] public static string EscapeForColourOutput([CanBeNull] this string value)
{
return (string.IsNullOrEmpty(value)
? string.Empty
: value.Replace("&", "&"));
}
//--------------------------------------------------
public static void WriteToConsoleWithColour([CanBeNull] this string value)
{
if (string.IsNullOrEmpty(value)) { return; }
var currentIndex = 0;
var currentColour = default(ConsoleColor?);
var match = StringExtensions.ColourSpecRegex.Match(value);
while (match.Success)
{
if (match.Index > currentIndex)
{
Console.Write(value.Substring(currentIndex, match.Index - currentIndex));
}
var spec = match.Value.Substring(1, match.Value.Length - 2);
switch (spec)
{
case string s when StringComparer.OrdinalIgnoreCase.Equals("amp", s):
Console.Write('&');
break;
case string s when StringComparer.OrdinalIgnoreCase.Equals("reset", s):
currentColour = default;
Console.ResetColor();
break;
default:
if (Enum.TryParse<ConsoleColor>(spec, ignoreCase: true, result: out var parsedColour) && parsedColour != currentColour)
{
Console.ForegroundColor = parsedColour;
currentColour = parsedColour;
}
break;
}
currentIndex = match.Index + match.Length;
match = match.NextMatch();
}
if (currentIndex < value.Length)
{
Console.Write(currentIndex > 0 ? value.Substring(currentIndex) : value);
}
if (currentColour.HasValue)
{
Console.ResetColor();
}
}
//**************************************************
//* Private
//**************************************************
[NotNull] private static readonly Regex ColourSpecRegex = new Regex("&[a-zA-Z]+;", RegexOptions.CultureInvariant);
}
}