Skip to content

Commit 2a44071

Browse files
committed
Extended model for css integer
1 parent e8dab26 commit 2a44071

File tree

11 files changed

+59
-55
lines changed

11 files changed

+59
-55
lines changed

src/AngleSharp.Css/Constants/Map.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ static class Map
157157
{ CssKeywords.EaseOut, new CssCubicBezierValue(0.0, 0.0, 0.58, 1.0) },
158158
{ CssKeywords.EaseInOut, new CssCubicBezierValue(0.42, 0.0, 0.58, 1.0) },
159159
{ CssKeywords.Linear, new CssCubicBezierValue(0.0, 0.0, 1.0, 1.0) },
160-
{ CssKeywords.StepStart, new CssStepsValue(1, true) },
161-
{ CssKeywords.StepEnd, new CssStepsValue(1, false) },
160+
{ CssKeywords.StepStart, new CssStepsValue(CssIntegerValue.One, true) },
161+
{ CssKeywords.StepEnd, new CssStepsValue(CssIntegerValue.One, false) },
162162
};
163163

164164
/// <summary>

src/AngleSharp.Css/Converters/CounterValueConverter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ sealed class CounterValueConverter : IValueConverter
1111
{
1212
private static readonly CssCounterValue[] NoneValue = Array.Empty<CssCounterValue>();
1313

14-
private readonly Int32 _defaultValue;
14+
private readonly ICssValue _defaultValue;
1515

16-
public CounterValueConverter(Int32 defaultValue)
16+
public CounterValueConverter(ICssValue defaultValue)
1717
{
1818
_defaultValue = defaultValue;
1919
}

src/AngleSharp.Css/Declarations/CounterIncrementDeclaration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ namespace AngleSharp.Css.Declarations
22
{
33
using AngleSharp.Css.Converters;
44
using AngleSharp.Css.Dom;
5+
using AngleSharp.Css.Values;
56
using System;
67

78
static class CounterIncrementDeclaration
89
{
910
public static String Name = PropertyNames.CounterIncrement;
1011

11-
public static IValueConverter Converter = new CounterValueConverter(1);
12+
public static IValueConverter Converter = new CounterValueConverter(CssIntegerValue.One);
1213

1314
public static ICssValue InitialValue = InitialValues.CounterIncrementDecl;
1415

src/AngleSharp.Css/Declarations/CounterResetDeclaration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ namespace AngleSharp.Css.Declarations
22
{
33
using AngleSharp.Css.Converters;
44
using AngleSharp.Css.Dom;
5+
using AngleSharp.Css.Values;
56
using System;
67

78
static class CounterResetDeclaration
89
{
910
public static String Name = PropertyNames.CounterReset;
1011

11-
public static IValueConverter Converter = new CounterValueConverter(0);
12+
public static IValueConverter Converter = new CounterValueConverter(CssIntegerValue.Zero);
1213

1314
public static ICssValue InitialValue = InitialValues.CounterResetDecl;
1415

src/AngleSharp.Css/Parser/Micro/GridParser.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -266,17 +266,7 @@ private static ICssValue ParseAutoCount(this StringSource source)
266266
return null;
267267
}
268268

269-
private static ICssValue ParseIntegerCount(this StringSource source)
270-
{
271-
var arg = source.ParsePositiveInteger();
272-
273-
if (arg.HasValue)
274-
{
275-
return new CssLengthValue(arg.Value, CssLengthValue.Unit.None);
276-
}
277-
278-
return null;
279-
}
269+
private static ICssValue ParseIntegerCount(StringSource source) => source.ParsePositiveInteger();
280270

281271
private static ICssValue ParseRepeat(this StringSource source, Func<StringSource, ICssValue> parseCount, Func<StringSource, ICssValue> parseValue)
282272
{

src/AngleSharp.Css/Parser/Micro/NumberParser.cs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ public static class NumberParser
8484
/// <summary>
8585
/// Parses the natural integer (int) value.
8686
/// </summary>
87-
public static Int32? ParseNaturalInteger(this StringSource source)
87+
public static CssIntegerValue? ParseNaturalInteger(this StringSource source)
8888
{
8989
var pos = source.Index;
9090
var element = source.ParseInteger();
9191

92-
if (element.HasValue && element.Value >= 0)
92+
if (element.HasValue && element.Value.IntValue >= 0)
9393
{
9494
return element;
9595
}
@@ -101,12 +101,12 @@ public static class NumberParser
101101
/// <summary>
102102
/// Parses the positive integer (int) value.
103103
/// </summary>
104-
public static Int32? ParsePositiveInteger(this StringSource source)
104+
public static CssIntegerValue? ParsePositiveInteger(this StringSource source)
105105
{
106106
var pos = source.Index;
107107
var element = source.ParseInteger();
108108

109-
if (element.HasValue && element.Value > 0)
109+
if (element.HasValue && element.Value.IntValue > 0)
110110
{
111111
return element;
112112
}
@@ -118,12 +118,12 @@ public static class NumberParser
118118
/// <summary>
119119
/// Parses the weight (int) value.
120120
/// </summary>
121-
public static Int32? ParseWeightInteger(this StringSource source)
121+
public static CssIntegerValue? ParseWeightInteger(this StringSource source)
122122
{
123123
var pos = source.Index;
124124
var element = source.ParsePositiveInteger();
125125

126-
if (element.HasValue && IsWeight(element.Value))
126+
if (element.HasValue && IsWeight(element.Value.IntValue))
127127
{
128128
return element;
129129
}
@@ -135,14 +135,19 @@ public static class NumberParser
135135
/// <summary>
136136
/// Parses the binary (int) value.
137137
/// </summary>
138-
public static Int32? ParseBinary(this StringSource source)
138+
public static CssIntegerValue? ParseBinary(this StringSource source)
139139
{
140140
var pos = source.Index;
141141
var element = source.ParseInteger();
142142

143-
if (element.HasValue && (element.Value == 0 || element.Value == 1))
143+
if (element.HasValue)
144144
{
145-
return element;
145+
var val = element.Value.IntValue;
146+
147+
if (val == 0 || val == 1)
148+
{
149+
return element;
150+
}
146151
}
147152

148153
source.BackTo(pos);
@@ -152,7 +157,7 @@ public static class NumberParser
152157
/// <summary>
153158
/// Parses the integer (int) value.
154159
/// </summary>
155-
public static Int32? ParseInteger(this StringSource source)
160+
public static CssIntegerValue? ParseInteger(this StringSource source)
156161
{
157162
var unit = source.ParseUnit();
158163

@@ -162,15 +167,15 @@ public static class NumberParser
162167

163168
if (Int32.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result))
164169
{
165-
return result;
170+
return new CssIntegerValue(result);
166171
}
167172

168173
var negative = value.StartsWith("-");
169174
var allNumbers = (negative ? value.Substring(1) : value).All(m => m.IsDigit());
170175

171176
if (allNumbers)
172177
{
173-
return negative ? Int32.MinValue : Int32.MaxValue;
178+
return new CssIntegerValue(negative ? Int32.MinValue : Int32.MaxValue);
174179
}
175180
}
176181

src/AngleSharp.Css/ValueConverters.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,27 +141,27 @@ static class ValueConverters
141141
/// Represents an integer object.
142142
/// https://developer.mozilla.org/en-US/docs/Web/CSS/integer
143143
/// </summary>
144-
public static readonly IValueConverter OnlyIntegerConverter = new StructValueConverter<CssLengthValue>(FromInteger(NumberParser.ParseInteger));
144+
public static readonly IValueConverter OnlyIntegerConverter = new StructValueConverter<CssIntegerValue>(NumberParser.ParseInteger);
145145

146146
/// <summary>
147147
/// Represents an integer object that is zero or greater.
148148
/// </summary>
149-
public static readonly IValueConverter NaturalIntegerConverter = new StructValueConverter<CssLengthValue>(FromInteger(NumberParser.ParseNaturalInteger));
149+
public static readonly IValueConverter NaturalIntegerConverter = new StructValueConverter<CssIntegerValue>(NumberParser.ParseNaturalInteger);
150150

151151
/// <summary>
152152
/// Represents an integer object that only allows values \in { 100, 200, ..., 900 }.
153153
/// </summary>
154-
public static readonly IValueConverter WeightIntegerConverter = new StructValueConverter<CssLengthValue>(FromInteger(NumberParser.ParseWeightInteger));
154+
public static readonly IValueConverter WeightIntegerConverter = new StructValueConverter<CssIntegerValue>(NumberParser.ParseWeightInteger);
155155

156156
/// <summary>
157157
/// Represents an integer object that is greater tha zero.
158158
/// </summary>
159-
public static readonly IValueConverter PositiveIntegerConverter = new StructValueConverter<CssLengthValue>(FromInteger(NumberParser.ParsePositiveInteger));
159+
public static readonly IValueConverter PositiveIntegerConverter = new StructValueConverter<CssIntegerValue>(NumberParser.ParsePositiveInteger);
160160

161161
/// <summary>
162162
/// Represents an integer object with 0 or 1.
163163
/// </summary>
164-
public static readonly IValueConverter BinaryConverter = new StructValueConverter<CssLengthValue>(FromInteger(NumberParser.ParseBinary));
164+
public static readonly IValueConverter BinaryConverter = new StructValueConverter<CssIntegerValue>(NumberParser.ParseBinary);
165165

166166
/// <summary>
167167
/// Represents a number object.

src/AngleSharp.Css/Values/Functions/CssStepsValue.cs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ sealed class CssStepsValue : ICssTimingFunctionValue, IEquatable<CssStepsValue>
1414
{
1515
#region Fields
1616

17-
private readonly Int32 _intervals;
17+
private readonly ICssValue _intervals;
1818
private readonly Boolean _start;
1919

2020
#endregion
@@ -28,9 +28,9 @@ sealed class CssStepsValue : ICssTimingFunctionValue, IEquatable<CssStepsValue>
2828
/// </summary>
2929
/// <param name="intervals">It must be a positive integer (greater than 0).</param>
3030
/// <param name="start">Optional: If not specified then the change occurs at the end.</param>
31-
public CssStepsValue(Int32 intervals, Boolean start = false)
31+
public CssStepsValue(ICssValue intervals, Boolean start = false)
3232
{
33-
_intervals = Math.Max(1, intervals);
33+
_intervals = intervals;
3434
_start = start;
3535
}
3636

@@ -52,7 +52,7 @@ public ICssValue[] Arguments
5252
{
5353
var args = new List<ICssValue>
5454
{
55-
new CssLengthValue(_intervals, CssLengthValue.Unit.None),
55+
_intervals
5656
};
5757

5858
if (_start)
@@ -71,9 +71,8 @@ public String CssText
7171
{
7272
get
7373
{
74-
if (_intervals != 1)
74+
if (!_intervals.Equals(CssIntegerValue.One))
7575
{
76-
var fn = FunctionNames.Steps;
7776
return Name.CssFunction(Arguments.Join(", "));
7877
}
7978
else if (_start)
@@ -90,7 +89,7 @@ public String CssText
9089
/// <summary>
9190
/// Gets the numbers of intervals.
9291
/// </summary>
93-
public Int32 Intervals => _intervals;
92+
public ICssValue Intervals => _intervals;
9493

9594
/// <summary>
9695
/// Gets if the steps should occur in the beginning.
@@ -106,17 +105,11 @@ public String CssText
106105
/// </summary>
107106
/// <param name="other">The value to check against.</param>
108107
/// <returns>True if both are equal, otherwise false.</returns>
109-
public Boolean Equals(CssStepsValue other)
110-
{
111-
return _start == other._start && _intervals == other._intervals;
112-
}
108+
public Boolean Equals(CssStepsValue other) => _start == other._start && _intervals.Equals(other._intervals);
113109

114110
Boolean IEquatable<ICssValue>.Equals(ICssValue other) => other is CssStepsValue value && Equals(value);
115111

116-
ICssValue ICssValue.Compute(ICssComputeContext context)
117-
{
118-
return this;
119-
}
112+
ICssValue ICssValue.Compute(ICssComputeContext context) => this;
120113

121114
#endregion
122115
}

src/AngleSharp.Css/Values/Primitives/CssCounterValue.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace AngleSharp.Css.Values
1212
#region Fields
1313

1414
private readonly String _name;
15-
private readonly Int32 _value;
15+
private readonly ICssValue _value;
1616

1717
#endregion
1818

@@ -23,7 +23,7 @@ namespace AngleSharp.Css.Values
2323
/// </summary>
2424
/// <param name="name">The name of the referenced counter.</param>
2525
/// <param name="value">The new value of the counter.</param>
26-
public CssCounterValue(String name, Int32 value)
26+
public CssCounterValue(String name, ICssValue value)
2727
{
2828
_name = name;
2929
_value = value;
@@ -36,7 +36,7 @@ public CssCounterValue(String name, Int32 value)
3636
/// <summary>
3737
/// Gets the CSS text representation.
3838
/// </summary>
39-
public String CssText => String.Concat(_name, " ", _value.ToString());
39+
public String CssText => String.Concat(_name, " ", _value.CssText);
4040

4141
/// <summary>
4242
/// Gets the identifier of the counter.
@@ -46,7 +46,7 @@ public CssCounterValue(String name, Int32 value)
4646
/// <summary>
4747
/// Gets the value of the counter.
4848
/// </summary>
49-
public Int32 Value => _value;
49+
public ICssValue Value => _value;
5050

5151
#endregion
5252

@@ -57,7 +57,7 @@ public CssCounterValue(String name, Int32 value)
5757
/// </summary>
5858
/// <param name="other">The other counter to check against.</param>
5959
/// <returns>True if both are equal, otherwise false.</returns>
60-
public Boolean Equals(CssCounterValue other) => Name.Is(other.Name) && Value == other.Value;
60+
public Boolean Equals(CssCounterValue other) => Name.Is(other.Name) && _value.Equals(other._value);
6161

6262
Boolean IEquatable<ICssValue>.Equals(ICssValue other) => other is CssCounterValue value && Equals(value);
6363

src/AngleSharp.Css/Values/Primitives/CssIntegerValue.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,20 @@ namespace AngleSharp.Css.Values
88
/// </summary>
99
public readonly struct CssIntegerValue : IEquatable<CssIntegerValue>, IComparable<CssIntegerValue>, ICssMetricValue
1010
{
11+
#region Basic lengths
12+
13+
/// <summary>
14+
/// Gets the 0.0.
15+
/// </summary>
16+
public static readonly CssIntegerValue Zero = new(0);
17+
18+
/// <summary>
19+
/// Gets the 1.0.
20+
/// </summary>
21+
public static readonly CssIntegerValue One = new(1);
22+
23+
#endregion
24+
1125
#region Fields
1226

1327
private readonly Int32 _value;

0 commit comments

Comments
 (0)