mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-15 00:12:50 +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:
parent
a87277e859
commit
574ead6d46
@ -213,6 +213,50 @@ public partial struct Color : IEquatable<Color>
|
|||||||
return ColorTable.GetColor(number);
|
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>
|
/// <summary>
|
||||||
/// Converts a <see cref="ConsoleColor"/> to a <see cref="Color"/>.
|
/// Converts a <see cref="ConsoleColor"/> to a <see cref="Color"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1,9 +1,73 @@
|
|||||||
|
using System.Drawing;
|
||||||
|
|
||||||
namespace Spectre.Console.Tests.Unit;
|
namespace Spectre.Console.Tests.Unit;
|
||||||
|
|
||||||
public sealed class ColorTests
|
public sealed class ColorTests
|
||||||
{
|
{
|
||||||
public sealed class TheEqualsMethod
|
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]
|
[Fact]
|
||||||
public void Should_Consider_Color_And_Non_Color_Equal()
|
public void Should_Consider_Color_And_Non_Color_Equal()
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user