#nullable enable using System.Collections; using System.Globalization; using System.Resources; using Terminal.Gui.Resources; namespace Terminal.Gui; /// /// Provides a mapping between and the W3C standard color name strings. /// public static class ColorStrings { private static readonly ResourceManager _resourceManager = new (typeof (Strings)); /// /// Gets the W3C standard string for . /// /// The color. /// if there is no standard color name for the specified color. public static string? GetW3CColorName (Color color) { // Fetch the color name from the resource file return _resourceManager.GetString ($"#{color.R:X2}{color.G:X2}{color.B:X2}", CultureInfo.CurrentUICulture); } /// /// Returns the list of W3C standard color names. /// /// public static IEnumerable GetW3CColorNames () { foreach (DictionaryEntry entry in _resourceManager.GetResourceSet (CultureInfo.CurrentUICulture, true, true)!) { string keyName = entry.Key.ToString () ?? string.Empty; if (entry.Value is string colorName && keyName.StartsWith ('#')) { yield return colorName; } } } /// /// Parses and returns if name is a W3C standard named color. /// /// The name to parse. /// If successful, the color. /// if was parsed successfully. public static bool TryParseW3CColorName (string name, out Color color) { // Iterate through all resource entries to find the matching color name foreach (DictionaryEntry entry in _resourceManager.GetResourceSet (CultureInfo.CurrentUICulture, true, true)!) { if (entry.Value is string colorName && colorName.Equals (name, StringComparison.OrdinalIgnoreCase)) { // Parse the key to extract the color components string key = entry.Key.ToString () ?? string.Empty; if (key.StartsWith ("#") && key.Length == 7) { if (int.TryParse (key.Substring (1, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int r) && int.TryParse (key.Substring (3, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int g) && int.TryParse (key.Substring (5, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int b)) { color = new (r, g, b); return true; } } } } color = default (Color); return false; } }