mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-04 10:35:27 +08:00 
			
		
		
		
	Added hex color conversion (#1432)
* Added hex color conversion --------- Co-authored-by: Frank Ray <52075808+FrankRay78@users.noreply.github.com> Co-authored-by: Nils Andresen <nils@nils-andresen.de>
This commit is contained in:
		@@ -213,6 +213,50 @@ public partial struct Color : IEquatable<Color>
 | 
			
		||||
        return ColorTable.GetColor(number);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Creates a color from a hexadecimal string representation.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="hex">The hexadecimal string representation of the color.</param>
 | 
			
		||||
    /// <returns>The color created from the hexadecimal string.</returns>
 | 
			
		||||
    public static Color FromHex(string hex)
 | 
			
		||||
    {
 | 
			
		||||
        if (hex is null)
 | 
			
		||||
        {
 | 
			
		||||
            throw new ArgumentNullException(nameof(hex));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (hex.StartsWith("#"))
 | 
			
		||||
        {
 | 
			
		||||
            hex = hex.Substring(1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var r = byte.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
 | 
			
		||||
        var g = byte.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
 | 
			
		||||
        var b = byte.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);
 | 
			
		||||
 | 
			
		||||
        return new Color(r, g, b);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Tries to convert a hexadecimal color code to a <see cref="Color"/> object.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="hex">The hexadecimal color code.</param>
 | 
			
		||||
    /// <param name="color">When this method returns, contains the <see cref="Color"/> equivalent of the hexadecimal color code, if the conversion succeeded, or <see cref="Color.Default"/> if the conversion failed.</param>
 | 
			
		||||
    /// <returns><c>true</c> if the conversion succeeded; otherwise, <c>false</c>.</returns>
 | 
			
		||||
    public static bool TryFromHex(string hex, out Color color)
 | 
			
		||||
    {
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            color = FromHex(hex);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        catch
 | 
			
		||||
        {
 | 
			
		||||
            color = Color.Default;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Converts a <see cref="ConsoleColor"/> to a <see cref="Color"/>.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,73 @@
 | 
			
		||||
using System.Drawing;
 | 
			
		||||
 | 
			
		||||
namespace Spectre.Console.Tests.Unit;
 | 
			
		||||
 | 
			
		||||
public sealed class ColorTests
 | 
			
		||||
{
 | 
			
		||||
    public sealed class TheEqualsMethod
 | 
			
		||||
    {
 | 
			
		||||
        [Theory]
 | 
			
		||||
        [InlineData("800080")]
 | 
			
		||||
        [InlineData("#800080")]
 | 
			
		||||
        public void Should_Consider_Color_And_Color_From_Hex_Equal(string color)
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var color1 = new Color(128, 0, 128);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            var color2 = Color.FromHex(color);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            color2.ShouldBe(color1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Theory]
 | 
			
		||||
        [InlineData("800080")]
 | 
			
		||||
        [InlineData("#800080")]
 | 
			
		||||
        public void Should_Consider_Color_And_Color_Try_From_Hex_Equal(string color)
 | 
			
		||||
        {
 | 
			
		||||
            // Given
 | 
			
		||||
            var color1 = new Color(128, 0, 128);
 | 
			
		||||
 | 
			
		||||
            // When
 | 
			
		||||
            var result = Color.TryFromHex(color, out var color2);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            result.ShouldBeTrue();
 | 
			
		||||
            color2.ShouldBe(color1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Theory]
 | 
			
		||||
        [InlineData(null)]
 | 
			
		||||
        [InlineData("")]
 | 
			
		||||
        [InlineData("#")]
 | 
			
		||||
        [InlineData("#80")]
 | 
			
		||||
        [InlineData("FOO")]
 | 
			
		||||
        public void Should_Not_Parse_Non_Color_From_Hex(string noncolor)
 | 
			
		||||
        {
 | 
			
		||||
            // Given, When
 | 
			
		||||
            var result = Record.Exception(() => Color.FromHex(noncolor));
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            result.ShouldBeAssignableTo<Exception>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Theory]
 | 
			
		||||
        [InlineData(null)]
 | 
			
		||||
        [InlineData("")]
 | 
			
		||||
        [InlineData("#")]
 | 
			
		||||
        [InlineData("#80")]
 | 
			
		||||
        [InlineData("FOO")]
 | 
			
		||||
        public void Should_Not_Parse_Non_Color_Try_From_Hex(string noncolor)
 | 
			
		||||
        {
 | 
			
		||||
            // Given, When
 | 
			
		||||
            var result = Color.TryFromHex(noncolor, out var color);
 | 
			
		||||
 | 
			
		||||
            // Then
 | 
			
		||||
            result.ShouldBeFalse();
 | 
			
		||||
            color.ShouldBe(Color.Default);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Should_Consider_Color_And_Non_Color_Equal()
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user