private static Style?Parse(string text, out string?error) { var effectiveDecoration = (Decoration?)null; var effectiveForeground = (Color?)null; var effectiveBackground = (Color?)null; var effectiveLink = (string?)null; var parts = text.Split(new[] { ' ' }); var foreground = true; foreach (var part in parts) { if (part.Equals("default", StringComparison.OrdinalIgnoreCase)) { continue; } if (part.Equals("on", StringComparison.OrdinalIgnoreCase)) { foreground = false; continue; } if (part.StartsWith("link=", StringComparison.OrdinalIgnoreCase)) { if (effectiveLink != null) { error = "A link has already been set."; return(null); } effectiveLink = part.Substring(5); continue; } else if (part.StartsWith("link", StringComparison.OrdinalIgnoreCase)) { effectiveLink = Constants.EmptyLink; continue; } var decoration = DecorationTable.GetDecoration(part); if (decoration != null) { effectiveDecoration ??= Decoration.None; effectiveDecoration |= decoration.Value; } else { var color = ColorTable.GetColor(part); if (color == null) { if (part.StartsWith("#", StringComparison.OrdinalIgnoreCase)) { color = ParseHexColor(part, out error); if (!string.IsNullOrWhiteSpace(error)) { return(null); } } else if (part.StartsWith("rgb", StringComparison.OrdinalIgnoreCase)) { color = ParseRgbColor(part, out error); if (!string.IsNullOrWhiteSpace(error)) { return(null); } } else if (int.TryParse(part, out var number)) { if (number < 0) { error = $"Color number must be greater than or equal to 0 (was {number})"; return(null); } else if (number > 255) { error = $"Color number must be less than or equal to 255 (was {number})"; return(null); } color = number; } else { error = !foreground ? $"Could not find color '{part}'." : $"Could not find color or style '{part}'."; return(null); } } if (foreground) { if (effectiveForeground != null) { error = "A foreground color has already been set."; return(null); } effectiveForeground = color; } else { if (effectiveBackground != null) { error = "A background color has already been set."; return(null); } effectiveBackground = color; } } } error = null; return(new Style( effectiveForeground, effectiveBackground, effectiveDecoration, effectiveLink)); }