From 3568aa5e629bea9cb744cf3278949563651b98f4 Mon Sep 17 00:00:00 2001 From: Christian Wall Date: Mon, 14 Oct 2024 10:07:16 +0200 Subject: [PATCH 1/2] Refactor opacity parsing and add percent/number converters Updated OpacityPropertyTests to include additional test cases for parsing opacity values and modified expected results for existing tests. Added ToPercentOrNumber method to ValueExtensions for parsing tokens as percentages or numbers. Introduced PercentOrNumberConverter and OptionalPercentOrNumberConverter in Converters, with the latter providing a default value of 1. Modified OpacityProperty to use OptionalPercentOrNumberConverter. Updated Number class to include a Percent as an unit in the Unit enum and modified ToString methods to append '%' for Percent unit. --- .../PropertyTests/OpacityPropertyTests.cs | 10 ++++--- src/ExCSS/Extensions/ValueExtensions.cs | 27 +++++++++++++++++++ src/ExCSS/Model/Converters.cs | 4 +++ .../Visibility/OpacityProperty.cs | 2 +- src/ExCSS/Values/Number.cs | 7 ++--- 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/ExCSS.Tests/PropertyTests/OpacityPropertyTests.cs b/src/ExCSS.Tests/PropertyTests/OpacityPropertyTests.cs index 9adc4457..c5065554 100644 --- a/src/ExCSS.Tests/PropertyTests/OpacityPropertyTests.cs +++ b/src/ExCSS.Tests/PropertyTests/OpacityPropertyTests.cs @@ -25,16 +25,20 @@ public void OpacityVarianceTests() var result = (OpacityProperty)property; Assert.Equal("50%", result.Value); + property = ParseDeclaration("opacity: 0.4"); + result = (OpacityProperty)property; + Assert.Equal("0.4", result.Value); + property = ParseDeclaration("opacity: .50"); result = (OpacityProperty)property; - Assert.Equal("50%", result.Value); + Assert.Equal("0.5", result.Value); property = ParseDeclaration("opacity: 1"); result = (OpacityProperty)property; - Assert.Equal("100%", result.Value); + Assert.Equal("1", result.Value); property = ParseDeclaration("opacity: 0"); result = (OpacityProperty)property; - Assert.Equal("0%", result.Value); + Assert.Equal("0", result.Value); } } diff --git a/src/ExCSS/Extensions/ValueExtensions.cs b/src/ExCSS/Extensions/ValueExtensions.cs index 43cdddb6..6c491f23 100644 --- a/src/ExCSS/Extensions/ValueExtensions.cs +++ b/src/ExCSS/Extensions/ValueExtensions.cs @@ -120,6 +120,33 @@ public static Length ToLength(this FontSize fontSize) } } + public static Number? ToPercentOrNumber(this IEnumerable value) + { + var enumerable = value as Token[] ?? value.ToArray(); + var percent = ToPercent(enumerable); + + if (percent is not null) + { + return new Number(percent.Value.Value, Number.Unit.Percent); + } + + var element = value.OnlyOrDefault(); + if (element is not NumberToken token) + { + return null; + } + + try + { + var number = token.Value; + return new Number(number, Number.Unit.Float); + } + catch + { + return null; + } + } + public static string ToCssString(this IEnumerable value) { var element = value.OnlyOrDefault(); diff --git a/src/ExCSS/Model/Converters.cs b/src/ExCSS/Model/Converters.cs index 594de14d..21b51ef1 100644 --- a/src/ExCSS/Model/Converters.cs +++ b/src/ExCSS/Model/Converters.cs @@ -70,6 +70,9 @@ public static readonly IValueConverter public static readonly IValueConverter PercentOrFractionConverter = new StructValueConverter(ValueExtensions.ToPercentOrFraction); + public static readonly IValueConverter PercentOrNumberConverter = + new StructValueConverter(ValueExtensions.ToPercentOrNumber); + public static readonly IValueConverter AngleNumberConverter = new StructValueConverter(ValueExtensions.ToAngleNumber); @@ -323,6 +326,7 @@ public static readonly IValueConverter public static readonly IValueConverter OptionalLengthOrPercentConverter = LengthOrPercentConverter.OrNone(); public static readonly IValueConverter AutoLengthOrPercentConverter = LengthOrPercentConverter.OrAuto(); public static readonly IValueConverter OptionalPercentOrFractionConverter = PercentOrFractionConverter.OrDefault(1f); + public static readonly IValueConverter OptionalPercentOrNumberConverter = PercentOrNumberConverter.OrDefault(1f); public static readonly IValueConverter FontSizeConverter = LengthOrPercentConverter.Or(Map.FontSizes.ToConverter()); diff --git a/src/ExCSS/StyleProperties/Visibility/OpacityProperty.cs b/src/ExCSS/StyleProperties/Visibility/OpacityProperty.cs index 14e65230..e9ec499a 100644 --- a/src/ExCSS/StyleProperties/Visibility/OpacityProperty.cs +++ b/src/ExCSS/StyleProperties/Visibility/OpacityProperty.cs @@ -2,7 +2,7 @@ { internal sealed class OpacityProperty : Property { - private static readonly IValueConverter StyleConverter = Converters.OptionalPercentOrFractionConverter; + private static readonly IValueConverter StyleConverter = Converters.OptionalPercentOrNumberConverter; internal OpacityProperty() : base(PropertyNames.Opacity, PropertyFlags.Animatable) { diff --git a/src/ExCSS/Values/Number.cs b/src/ExCSS/Values/Number.cs index be31eca0..b64223b6 100644 --- a/src/ExCSS/Values/Number.cs +++ b/src/ExCSS/Values/Number.cs @@ -65,7 +65,8 @@ public bool Equals(Number other) public enum Unit : byte { Integer, - Float + Float, + Percent } public static bool operator ==(Number a, Number b) @@ -90,12 +91,12 @@ public override int GetHashCode() public override string ToString() { - return Value.ToString(); + return Value.ToString() + (_unit == Unit.Percent ? "%" : string.Empty); } public string ToString(string format, IFormatProvider formatProvider) { - return Value.ToString(format, formatProvider); + return Value.ToString(format, formatProvider) + (_unit == Unit.Percent ? "%" : string.Empty); } } } \ No newline at end of file From 15bf42de6fee1c3288a063ff21c24830864d4242 Mon Sep 17 00:00:00 2001 From: Christian Wall Date: Mon, 14 Oct 2024 10:21:37 +0200 Subject: [PATCH 2/2] Refactor --- src/ExCSS/Extensions/ValueExtensions.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ExCSS/Extensions/ValueExtensions.cs b/src/ExCSS/Extensions/ValueExtensions.cs index 6c491f23..4afdb115 100644 --- a/src/ExCSS/Extensions/ValueExtensions.cs +++ b/src/ExCSS/Extensions/ValueExtensions.cs @@ -138,8 +138,7 @@ public static Length ToLength(this FontSize fontSize) try { - var number = token.Value; - return new Number(number, Number.Unit.Float); + return new Number(token.Value, Number.Unit.Float); } catch {