From ff580f800769abaa3ddb7785edefb257fa2d71be Mon Sep 17 00:00:00 2001 From: Egil Hansen Date: Sun, 13 Oct 2024 18:16:22 +0000 Subject: [PATCH] fix: code clean up, optimizing string comparison --- src/.editorconfig | 3 + .../Core/HtmlDifferenceEngineTest.cs | 4 +- .../DiffBuilderTest.cs | 4 +- .../DiffingTestBase.cs | 2 +- src/AngleSharp.Diffing.sln | 6 +- .../AngleSharp.Diffing.csproj | 66 ++++++++++--------- .../Core/AttributeComparison.cs | 3 + src/AngleSharp.Diffing/Core/CompareResult.cs | 14 ++-- src/AngleSharp.Diffing/Core/Comparison.cs | 3 + ...{SourceType.cs => ComparisonSourceType.cs} | 0 src/AngleSharp.Diffing/Core/DiffTarget.cs | 21 ------ src/AngleSharp.Diffing/Core/FilterDecision.cs | 16 ----- .../Core/FilterDecisionExtensions.cs | 17 +++++ .../Core/NodeTypeExtensions.cs | 22 +++++++ src/AngleSharp.Diffing/Core/SourceMap.cs | 4 +- src/AngleSharp.Diffing/DiffBuilder.cs | 4 +- ...tensions.cs => AngleSharpDomExtensions.cs} | 2 +- .../ClassAttributeComparer.cs | 2 +- .../OrderingStyleAttributeComparer.cs | 4 +- .../Strategies/DiffingStrategyPipeline.cs | 24 +++---- .../TextNodeStrategies/TextNodeComparer.cs | 2 +- 21 files changed, 119 insertions(+), 104 deletions(-) rename src/AngleSharp.Diffing/Core/{SourceType.cs => ComparisonSourceType.cs} (100%) create mode 100644 src/AngleSharp.Diffing/Core/FilterDecisionExtensions.cs create mode 100644 src/AngleSharp.Diffing/Core/NodeTypeExtensions.cs rename src/AngleSharp.Diffing/Extensions/{NodeListExtensions.cs => AngleSharpDomExtensions.cs} (95%) diff --git a/src/.editorconfig b/src/.editorconfig index 8dea088..daaaa18 100644 --- a/src/.editorconfig +++ b/src/.editorconfig @@ -225,3 +225,6 @@ dotnet_naming_style.fields_begin_with__.required_prefix = _ dotnet_naming_style.fields_begin_with__.required_suffix = dotnet_naming_style.fields_begin_with__.word_separator = dotnet_naming_style.fields_begin_with__.capitalization = camel_case + +# MA0012: Do not raise reserved exception type +dotnet_diagnostic.MA0012.severity = none \ No newline at end of file diff --git a/src/AngleSharp.Diffing.Tests/Core/HtmlDifferenceEngineTest.cs b/src/AngleSharp.Diffing.Tests/Core/HtmlDifferenceEngineTest.cs index 32ba4c4..1383304 100644 --- a/src/AngleSharp.Diffing.Tests/Core/HtmlDifferenceEngineTest.cs +++ b/src/AngleSharp.Diffing.Tests/Core/HtmlDifferenceEngineTest.cs @@ -451,7 +451,7 @@ private static IEnumerable NoneNodeMatcher(IDiffContext ctx, SourceC private static Func> SpecificIndexNodeMatcher(int index) => (ctx, controlNodes, testNodes) => { - return new List { new Comparison(controlNodes[index], testNodes[index]) }; + return new List { new(controlNodes[index], testNodes[index]) }; }; private static IEnumerable OneToOneNodeListMatcher( @@ -477,7 +477,7 @@ private static Func new List { - new AttributeComparison(ctrlAttrs[matchAttrName], testAttrs[matchAttrName] ) + new(ctrlAttrs[matchAttrName], testAttrs[matchAttrName] ) }; } diff --git a/src/AngleSharp.Diffing.Tests/DiffBuilderTest.cs b/src/AngleSharp.Diffing.Tests/DiffBuilderTest.cs index 9287f03..9769990 100644 --- a/src/AngleSharp.Diffing.Tests/DiffBuilderTest.cs +++ b/src/AngleSharp.Diffing.Tests/DiffBuilderTest.cs @@ -20,8 +20,8 @@ public void Test001() [Fact(DisplayName = "Builder throws if null is passed to control and test")] public void Test002() { - Should.Throw(() => DiffBuilder.Compare(null!)).ParamName.ShouldBe(nameof(DiffBuilder.Control)); - Should.Throw(() => DiffBuilder.Compare("").WithTest(null!)).ParamName.ShouldBe(nameof(DiffBuilder.Test)); + Should.Throw(() => DiffBuilder.Compare(null!)).ParamName.ShouldBe("value"); + Should.Throw(() => DiffBuilder.Compare("").WithTest(null!)).ParamName.ShouldBe("value"); } [Fact(DisplayName = "Calling Build() with DefaultOptions() returns expected diffs")] diff --git a/src/AngleSharp.Diffing.Tests/DiffingTestBase.cs b/src/AngleSharp.Diffing.Tests/DiffingTestBase.cs index 08ab929..41d41ce 100644 --- a/src/AngleSharp.Diffing.Tests/DiffingTestBase.cs +++ b/src/AngleSharp.Diffing.Tests/DiffingTestBase.cs @@ -5,7 +5,7 @@ public abstract class DiffingTestBase : IClassFixture private readonly DiffingTestFixture _testFixture; - public static readonly TheoryData SameAndSkipCompareResult = new TheoryData + public static readonly TheoryData SameAndSkipCompareResult = new() { CompareResult.Same, CompareResult.Skip, diff --git a/src/AngleSharp.Diffing.sln b/src/AngleSharp.Diffing.sln index c93f6cd..83fb1ab 100644 --- a/src/AngleSharp.Diffing.sln +++ b/src/AngleSharp.Diffing.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29230.61 +# Visual Studio Version 17 +VisualStudioVersion = 17.11.35312.102 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AngleSharp.Diffing", "AngleSharp.Diffing\AngleSharp.Diffing.csproj", "{2BFFA992-22C2-4A65-94D8-CA06E81D2364}" EndProject @@ -9,7 +9,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AngleSharp.DiffingTests", " EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E8E3C8B4-92C3-4DB7-B920-D28651E24A57}" ProjectSection(SolutionItems) = preProject - ..\.editorconfig = ..\.editorconfig + .editorconfig = .editorconfig ..\tools\anglesharp.cake = ..\tools\anglesharp.cake ..\build.cake = ..\build.cake ..\build.ps1 = ..\build.ps1 diff --git a/src/AngleSharp.Diffing/AngleSharp.Diffing.csproj b/src/AngleSharp.Diffing/AngleSharp.Diffing.csproj index 0b06153..0594b2d 100644 --- a/src/AngleSharp.Diffing/AngleSharp.Diffing.csproj +++ b/src/AngleSharp.Diffing/AngleSharp.Diffing.csproj @@ -1,39 +1,43 @@ - - netstandard2.0 - true - + + netstandard2.0 + true + - - Provides a complete diffing model of HTML. - AngleSharp.Diffing - AngleSharp - AngleSharp.Diffing - MIT - https://anglesharp.github.io - logo.png - https://raw.github.com/AngleSharp/AngleSharp.Diffing/master/logo.png - html html5 css css3 dom library diffing anglesharp diff difference compare comparison testing - Egil Hansen - https://github.com/AngleSharp/AngleSharp.Diffing - git - true - true - snupkg - + + Provides a complete diffing model of HTML. + AngleSharp.Diffing + AngleSharp + AngleSharp.Diffing + MIT + https://anglesharp.github.io + logo.png + https://raw.github.com/AngleSharp/AngleSharp.Diffing/master/logo.png + html html5 css css3 dom library diffing anglesharp diff difference compare comparison testing + Egil Hansen + https://github.com/AngleSharp/AngleSharp.Diffing + git + true + true + snupkg + - - - + + + - - - - + + + all + runtime; build; native; contentfiles; analyzers + + + + - - - + + + \ No newline at end of file diff --git a/src/AngleSharp.Diffing/Core/AttributeComparison.cs b/src/AngleSharp.Diffing/Core/AttributeComparison.cs index b61fb39..5f69f71 100644 --- a/src/AngleSharp.Diffing/Core/AttributeComparison.cs +++ b/src/AngleSharp.Diffing/Core/AttributeComparison.cs @@ -1,3 +1,5 @@ +using System.Runtime.InteropServices; + namespace AngleSharp.Diffing.Core; /// @@ -5,6 +7,7 @@ namespace AngleSharp.Diffing.Core; /// /// Gets the control attribute which the attribute is supposed to match. /// Gets the test attribute which should be compared to the attribute. +[StructLayout(LayoutKind.Auto)] public readonly record struct AttributeComparison(in AttributeComparisonSource Control, in AttributeComparisonSource Test) { /// diff --git a/src/AngleSharp.Diffing/Core/CompareResult.cs b/src/AngleSharp.Diffing/Core/CompareResult.cs index 33b536a..cd3de65 100644 --- a/src/AngleSharp.Diffing/Core/CompareResult.cs +++ b/src/AngleSharp.Diffing/Core/CompareResult.cs @@ -15,39 +15,39 @@ public readonly record struct CompareResult(CompareDecision Decision, IDiff? Dif /// /// Use when the two compared nodes or attributes are the same. /// - public static readonly CompareResult Same = new CompareResult(CompareDecision.Same); + public static readonly CompareResult Same = new(CompareDecision.Same); /// /// Use when the comparison should be skipped and any child-nodes or attributes skipped as well. /// - public static readonly CompareResult Skip = new CompareResult(CompareDecision.Skip); + public static readonly CompareResult Skip = new(CompareDecision.Skip); /// /// Use when the comparison should skip any child-nodes. /// - public static readonly CompareResult SkipChildren = new CompareResult(CompareDecision.SkipChildren); + public static readonly CompareResult SkipChildren = new(CompareDecision.SkipChildren); /// /// Use when the comparison should skip any attributes. /// - public static readonly CompareResult SkipAttributes = new CompareResult(CompareDecision.SkipAttributes); + public static readonly CompareResult SkipAttributes = new(CompareDecision.SkipAttributes); /// /// Use when the comparison should skip any attributes. /// - public static readonly CompareResult SkipChildrenAndAttributes = new CompareResult(CompareDecision.SkipChildren | CompareDecision.SkipAttributes); + public static readonly CompareResult SkipChildrenAndAttributes = new(CompareDecision.SkipChildren | CompareDecision.SkipAttributes); /// /// Use when the two compared nodes or attributes are the different. /// - public static CompareResult Different => new CompareResult(CompareDecision.Different); + public static CompareResult Different => new(CompareDecision.Different); /// /// Use when the two compared nodes or attributes are the different. /// /// The associated describing the difference. /// Returns a with set to . - public static CompareResult FromDiff(IDiff diff) => new CompareResult(CompareDecision.Different, diff); + public static CompareResult FromDiff(IDiff diff) => new(CompareDecision.Different, diff); /// /// Checks if a is either a or . diff --git a/src/AngleSharp.Diffing/Core/Comparison.cs b/src/AngleSharp.Diffing/Core/Comparison.cs index cdab391..41742e8 100644 --- a/src/AngleSharp.Diffing/Core/Comparison.cs +++ b/src/AngleSharp.Diffing/Core/Comparison.cs @@ -1,3 +1,5 @@ +using System.Runtime.InteropServices; + namespace AngleSharp.Diffing.Core; /// @@ -5,6 +7,7 @@ namespace AngleSharp.Diffing.Core; /// /// Gets the control source in the comparison. /// Gets the test source in the comparison. +[StructLayout(LayoutKind.Auto)] public readonly record struct Comparison(in ComparisonSource Control, in ComparisonSource Test) { /// diff --git a/src/AngleSharp.Diffing/Core/SourceType.cs b/src/AngleSharp.Diffing/Core/ComparisonSourceType.cs similarity index 100% rename from src/AngleSharp.Diffing/Core/SourceType.cs rename to src/AngleSharp.Diffing/Core/ComparisonSourceType.cs diff --git a/src/AngleSharp.Diffing/Core/DiffTarget.cs b/src/AngleSharp.Diffing/Core/DiffTarget.cs index af6579b..a4f400b 100644 --- a/src/AngleSharp.Diffing/Core/DiffTarget.cs +++ b/src/AngleSharp.Diffing/Core/DiffTarget.cs @@ -30,24 +30,3 @@ public enum DiffTarget /// Text } - -/// -/// Helper methods for working with . -/// -public static class NodeTypeExtensions -{ - /// - /// Gets the diff target based on the node type. - /// - /// Mode type to get the diff target off. - public static DiffTarget ToDiffTarget(this NodeType nodeType) - { - return nodeType switch - { - NodeType.Element => DiffTarget.Element, - NodeType.Comment => DiffTarget.Comment, - NodeType.Text => DiffTarget.Text, - _ => DiffTarget.Node - }; - } -} diff --git a/src/AngleSharp.Diffing/Core/FilterDecision.cs b/src/AngleSharp.Diffing/Core/FilterDecision.cs index 1274efb..ad80d89 100644 --- a/src/AngleSharp.Diffing/Core/FilterDecision.cs +++ b/src/AngleSharp.Diffing/Core/FilterDecision.cs @@ -14,19 +14,3 @@ public enum FilterDecision /// Exclude } - -/// -/// Helper methods for . -/// -public static class FilterDecisionExtensions -{ - /// - /// Gets whether the is . - /// - public static bool IsExclude(this FilterDecision decision) => decision == FilterDecision.Exclude; - - /// - /// Gets whether the is . - /// - public static bool IsKeep(this FilterDecision decision) => decision == FilterDecision.Keep; -} diff --git a/src/AngleSharp.Diffing/Core/FilterDecisionExtensions.cs b/src/AngleSharp.Diffing/Core/FilterDecisionExtensions.cs new file mode 100644 index 0000000..ba7d609 --- /dev/null +++ b/src/AngleSharp.Diffing/Core/FilterDecisionExtensions.cs @@ -0,0 +1,17 @@ +namespace AngleSharp.Diffing.Core; + +/// +/// Helper methods for . +/// +public static class FilterDecisionExtensions +{ + /// + /// Gets whether the is . + /// + public static bool IsExclude(this FilterDecision decision) => decision == FilterDecision.Exclude; + + /// + /// Gets whether the is . + /// + public static bool IsKeep(this FilterDecision decision) => decision == FilterDecision.Keep; +} diff --git a/src/AngleSharp.Diffing/Core/NodeTypeExtensions.cs b/src/AngleSharp.Diffing/Core/NodeTypeExtensions.cs new file mode 100644 index 0000000..4467e48 --- /dev/null +++ b/src/AngleSharp.Diffing/Core/NodeTypeExtensions.cs @@ -0,0 +1,22 @@ +namespace AngleSharp.Diffing.Core; + +/// +/// Helper methods for working with . +/// +public static class NodeTypeExtensions +{ + /// + /// Gets the diff target based on the node type. + /// + /// Mode type to get the diff target off. + public static DiffTarget ToDiffTarget(this NodeType nodeType) + { + return nodeType switch + { + NodeType.Element => DiffTarget.Element, + NodeType.Comment => DiffTarget.Comment, + NodeType.Text => DiffTarget.Text, + _ => DiffTarget.Node + }; + } +} diff --git a/src/AngleSharp.Diffing/Core/SourceMap.cs b/src/AngleSharp.Diffing/Core/SourceMap.cs index 47e504d..4f99c8d 100644 --- a/src/AngleSharp.Diffing/Core/SourceMap.cs +++ b/src/AngleSharp.Diffing/Core/SourceMap.cs @@ -6,8 +6,8 @@ namespace AngleSharp.Diffing.Core; [SuppressMessage("Naming", "CA1710:Identifiers should have correct suffix")] public class SourceMap : IEnumerable { - private readonly HashSet _matched = new HashSet(); - private readonly Dictionary _sources = new Dictionary(); + private readonly HashSet _matched = new(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _sources = new(StringComparer.OrdinalIgnoreCase); /// /// Gets the type of the sources in the collection. diff --git a/src/AngleSharp.Diffing/DiffBuilder.cs b/src/AngleSharp.Diffing/DiffBuilder.cs index ee40b9e..bf94b6c 100644 --- a/src/AngleSharp.Diffing/DiffBuilder.cs +++ b/src/AngleSharp.Diffing/DiffBuilder.cs @@ -17,12 +17,12 @@ public class DiffBuilder /// /// Gets or sets the control markup string. /// - public string Control { get => _control; set => _control = value ?? throw new ArgumentNullException(nameof(Control)); } + public string Control { get => _control; set => _control = value ?? throw new ArgumentNullException(nameof(value)); } /// /// Gets or sets the test markup string. /// - public string Test { get => _test; set => _test = value ?? throw new ArgumentNullException(nameof(Test)); } + public string Test { get => _test; set => _test = value ?? throw new ArgumentNullException(nameof(value)); } private DiffBuilder(string control) { diff --git a/src/AngleSharp.Diffing/Extensions/NodeListExtensions.cs b/src/AngleSharp.Diffing/Extensions/AngleSharpDomExtensions.cs similarity index 95% rename from src/AngleSharp.Diffing/Extensions/NodeListExtensions.cs rename to src/AngleSharp.Diffing/Extensions/AngleSharpDomExtensions.cs index 14ca9d5..2049656 100644 --- a/src/AngleSharp.Diffing/Extensions/NodeListExtensions.cs +++ b/src/AngleSharp.Diffing/Extensions/AngleSharpDomExtensions.cs @@ -34,5 +34,5 @@ public static IEnumerable ToComparisonSourceList(this IEnumera /// Creates a comparison source from a node. /// public static ComparisonSource ToComparisonSource(this INode node, int index, ComparisonSourceType sourceType, string path = "") - => new ComparisonSource(node, index, path, sourceType); + => new(node, index, path, sourceType); } diff --git a/src/AngleSharp.Diffing/Strategies/AttributeStrategies/ClassAttributeComparer.cs b/src/AngleSharp.Diffing/Strategies/AttributeStrategies/ClassAttributeComparer.cs index 448c22b..5cd59c5 100644 --- a/src/AngleSharp.Diffing/Strategies/AttributeStrategies/ClassAttributeComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/AttributeStrategies/ClassAttributeComparer.cs @@ -22,7 +22,7 @@ public static CompareResult Compare(in AttributeComparison comparison, CompareRe if (ctrlElm.ClassList.Length != testElm.ClassList.Length) return CompareResult.FromDiff(new AttrDiff(comparison, AttrDiffKind.Value)); - return ctrlElm.ClassList.All(x => testElm.ClassList.Contains(x)) + return ctrlElm.ClassList.All(x => testElm.ClassList.Contains(x, StringComparer.Ordinal)) ? CompareResult.Same : CompareResult.FromDiff(new AttrDiff(comparison, AttrDiffKind.Value)); } diff --git a/src/AngleSharp.Diffing/Strategies/AttributeStrategies/OrderingStyleAttributeComparer.cs b/src/AngleSharp.Diffing/Strategies/AttributeStrategies/OrderingStyleAttributeComparer.cs index 72fcba7..19fcb5e 100644 --- a/src/AngleSharp.Diffing/Strategies/AttributeStrategies/OrderingStyleAttributeComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/AttributeStrategies/OrderingStyleAttributeComparer.cs @@ -39,8 +39,8 @@ private static bool CompareCssStyleDeclarations(ICssStyleDeclaration control, IC if (control.Length != test.Length) return false; - var orderedControl = control.CssText.Split(';').Select(x => x.Trim()).OrderBy(x => x); - var orderedTest = test.CssText.Split(';').Select(x => x.Trim()).OrderBy(x => x); + var orderedControl = control.CssText.Split(';').Select(x => x.Trim()).OrderBy(x => x, StringComparer.Ordinal); + var orderedTest = test.CssText.Split(';').Select(x => x.Trim()).OrderBy(x => x, StringComparer.Ordinal); return orderedControl.SequenceEqual(orderedTest, StringComparer.Ordinal); } diff --git a/src/AngleSharp.Diffing/Strategies/DiffingStrategyPipeline.cs b/src/AngleSharp.Diffing/Strategies/DiffingStrategyPipeline.cs index e4febee..b4348c0 100644 --- a/src/AngleSharp.Diffing/Strategies/DiffingStrategyPipeline.cs +++ b/src/AngleSharp.Diffing/Strategies/DiffingStrategyPipeline.cs @@ -6,12 +6,12 @@ namespace AngleSharp.Diffing.Strategies; /// public class DiffingStrategyPipeline : IDiffingStrategy, IDiffingStrategyCollection { - private readonly List> _nodeFilters = new List>(); - private readonly List> _attrsFilters = new List>(); - private readonly List> _nodeMatchers = new List>(); - private readonly List> _attrsMatchers = new List>(); - private readonly List> _nodeComparers = new List>(); - private readonly List> _attrComparers = new List>(); + private readonly List> _nodeFilters = new(); + private readonly List> _attrsFilters = new(); + private readonly List> _nodeMatchers = new(); + private readonly List> _attrsMatchers = new(); + private readonly List> _nodeComparers = new(); + private readonly List> _attrComparers = new(); /// /// Gets whether the pipeline have any matchers registered. @@ -64,7 +64,7 @@ public IEnumerable Match(IDiffContext context, SourceMap co public CompareResult Compare(in AttributeComparison comparison) => Compare(comparison, _attrComparers, CompareResult.Different); /// - public IDiffingStrategyCollection AddFilter(FilterStrategy filterStrategy, StrategyType strategyType) + public IDiffingStrategyCollection AddFilter(FilterStrategy filterStrategy, StrategyType strategyType = StrategyType.Specialized) { if (strategyType == StrategyType.Specialized) _nodeFilters.Add(filterStrategy); @@ -74,7 +74,7 @@ public IDiffingStrategyCollection AddFilter(FilterStrategy fil } /// - public IDiffingStrategyCollection AddFilter(FilterStrategy filterStrategy, StrategyType strategyType) + public IDiffingStrategyCollection AddFilter(FilterStrategy filterStrategy, StrategyType strategyType = StrategyType.Specialized) { if (strategyType == StrategyType.Specialized) _attrsFilters.Add(filterStrategy); @@ -84,7 +84,7 @@ public IDiffingStrategyCollection AddFilter(FilterStrategy - public IDiffingStrategyCollection AddMatcher(MatchStrategy matchStrategy, StrategyType strategyType) + public IDiffingStrategyCollection AddMatcher(MatchStrategy matchStrategy, StrategyType strategyType = StrategyType.Specialized) { if (strategyType == StrategyType.Specialized) _nodeMatchers.Insert(0, matchStrategy); @@ -94,7 +94,7 @@ public IDiffingStrategyCollection AddMatcher(MatchStrategy - public IDiffingStrategyCollection AddMatcher(MatchStrategy matchStrategy, StrategyType strategyType) + public IDiffingStrategyCollection AddMatcher(MatchStrategy matchStrategy, StrategyType strategyType = StrategyType.Specialized) { if (strategyType == StrategyType.Specialized) _attrsMatchers.Insert(0, matchStrategy); @@ -104,7 +104,7 @@ public IDiffingStrategyCollection AddMatcher(MatchStrategy - public IDiffingStrategyCollection AddComparer(CompareStrategy compareStrategy, StrategyType strategyType) + public IDiffingStrategyCollection AddComparer(CompareStrategy compareStrategy, StrategyType strategyType = StrategyType.Specialized) { if (strategyType == StrategyType.Specialized) _nodeComparers.Add(compareStrategy); @@ -114,7 +114,7 @@ public IDiffingStrategyCollection AddComparer(CompareStrategy compar } /// - public IDiffingStrategyCollection AddComparer(CompareStrategy compareStrategy, StrategyType strategyType) + public IDiffingStrategyCollection AddComparer(CompareStrategy compareStrategy, StrategyType strategyType = StrategyType.Specialized) { if (strategyType == StrategyType.Specialized) _attrComparers.Add(compareStrategy); diff --git a/src/AngleSharp.Diffing/Strategies/TextNodeStrategies/TextNodeComparer.cs b/src/AngleSharp.Diffing/Strategies/TextNodeStrategies/TextNodeComparer.cs index bfe64f0..9f6f5fe 100644 --- a/src/AngleSharp.Diffing/Strategies/TextNodeStrategies/TextNodeComparer.cs +++ b/src/AngleSharp.Diffing/Strategies/TextNodeStrategies/TextNodeComparer.cs @@ -11,7 +11,7 @@ public class TextNodeComparer private const string WHITESPACE_ATTR_NAME = "diff:whitespace"; private const string IGNORECASE_ATTR_NAME = "diff:ignorecase"; private const string REGEX_ATTR_NAME = "diff:regex"; - private static readonly Regex WhitespaceReplace = new Regex(@"\s+", RegexOptions.Compiled | RegexOptions.CultureInvariant, TimeSpan.FromSeconds(5)); + private static readonly Regex WhitespaceReplace = new(@"\s+", RegexOptions.Compiled | RegexOptions.CultureInvariant, TimeSpan.FromSeconds(5)); /// /// Gets the whitespace option of the comparer instance.