Skip to content

Commit 04d2026

Browse files
Merge CharCollection and UserDefinedCharCollection
Otherwise only CharCollection would work, and that's obsolete, now you can use either, but UserDefinedCharCollection takes priority
1 parent 53e5a25 commit 04d2026

File tree

2 files changed

+65
-28
lines changed

2 files changed

+65
-28
lines changed

src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Configuration.cs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.Extensions.Options;
77
using Umbraco.Cms.Core.Configuration.Models;
88
using Umbraco.Cms.Core.Configuration.Models.Validation;
9+
using Umbraco.Extensions;
910

1011
namespace Umbraco.Cms.Core.DependencyInjection
1112
{
@@ -78,23 +79,7 @@ public static IUmbracoBuilder AddConfiguration(this IUmbracoBuilder builder)
7879
.AddUmbracoOptions<LegacyPasswordMigrationSettings>()
7980
.AddUmbracoOptions<PackageMigrationSettings>();
8081

81-
builder.Services.Configure<RequestHandlerSettings>(options =>
82-
{
83-
var userDefinedReplacements = new List<CharItem>();
84-
IEnumerable<IConfigurationSection> config = builder.Config
85-
.GetSection(
86-
$"{Constants.Configuration.ConfigRequestHandler}:{nameof(RequestHandlerSettings.CharCollection)}")
87-
.GetChildren();
88-
89-
foreach (IConfigurationSection section in config)
90-
{
91-
var @char = section.GetValue<string>(nameof(CharItem.Char));
92-
var replacement = section.GetValue<string>(nameof(CharItem.Replacement));
93-
userDefinedReplacements.Add(new CharItem { Char = @char, Replacement = replacement });
94-
}
95-
96-
options.UserDefinedCharCollection = userDefinedReplacements;
97-
});
82+
builder.Services.Configure<RequestHandlerSettings>(options => options.MergeReplacements(builder.Config));
9883

9984
return builder;
10085
}
Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using Microsoft.Extensions.Configuration;
4+
using Umbraco.Cms.Core;
35
using Umbraco.Cms.Core.Configuration.Models;
46
using Umbraco.Cms.Core.Configuration.UmbracoSettings;
57

@@ -11,34 +13,84 @@ namespace Umbraco.Extensions
1113
/// </summary>
1214
public static class RequestHandlerSettingsExtension
1315
{
16+
/// <summary>
17+
/// Get concatenated user and default character replacements
18+
/// taking into account <see cref="RequestHandlerSettings.EnableDefaultCharReplacements"/>
19+
/// </summary>
1420
public static IEnumerable<CharItem> GetCharReplacements(this RequestHandlerSettings requestHandlerSettings)
1521
{
16-
if (!requestHandlerSettings.EnableDefaultCharReplacements)
22+
if (requestHandlerSettings.EnableDefaultCharReplacements is false)
1723
{
1824
return requestHandlerSettings.UserDefinedCharCollection ?? Enumerable.Empty<CharItem>();
1925
}
2026

21-
if (requestHandlerSettings.UserDefinedCharCollection == null || !requestHandlerSettings.UserDefinedCharCollection.Any())
27+
if (requestHandlerSettings.UserDefinedCharCollection == null || requestHandlerSettings.UserDefinedCharCollection.Any() is false)
2228
{
2329
return RequestHandlerSettings.DefaultCharCollection;
2430
}
2531

26-
foreach (CharItem defaultReplacement in RequestHandlerSettings.DefaultCharCollection)
32+
return MergeUnique(requestHandlerSettings.UserDefinedCharCollection, RequestHandlerSettings.DefaultCharCollection);
33+
}
34+
35+
/// <summary>
36+
/// Merges CharCollection and UserDefinedCharCollection, prioritizing UserDefinedCharCollection
37+
/// </summary>
38+
internal static void MergeReplacements(this RequestHandlerSettings requestHandlerSettings, IConfiguration configuration)
39+
{
40+
string sectionKey = $"{Constants.Configuration.ConfigRequestHandler}:";
41+
42+
IEnumerable<CharItem> charCollection = GetReplacements(
43+
configuration,
44+
$"{sectionKey}{nameof(RequestHandlerSettings.CharCollection)}");
45+
46+
IEnumerable<CharItem> userDefinedCharCollection = GetReplacements(
47+
configuration,
48+
$"{sectionKey}{nameof(requestHandlerSettings.UserDefinedCharCollection)}");
49+
50+
IEnumerable<CharItem> mergedCollection = MergeUnique(userDefinedCharCollection, charCollection);
51+
52+
requestHandlerSettings.UserDefinedCharCollection = mergedCollection;
53+
}
54+
55+
private static IEnumerable<CharItem> GetReplacements(IConfiguration configuration, string key)
56+
{
57+
var replacements = new List<CharItem>();
58+
IEnumerable<IConfigurationSection> config = configuration.GetSection(key).GetChildren();
59+
60+
foreach (IConfigurationSection section in config)
2761
{
28-
foreach (CharItem userReplacement in requestHandlerSettings.UserDefinedCharCollection)
62+
var @char = section.GetValue<string>(nameof(CharItem.Char));
63+
var replacement = section.GetValue<string>(nameof(CharItem.Replacement));
64+
replacements.Add(new CharItem { Char = @char, Replacement = replacement });
65+
}
66+
67+
return replacements;
68+
}
69+
70+
/// <summary>
71+
/// Merges two IEnumerable of CharItem without any duplicates, items in priorityReplacements will override those in alternativeReplacements
72+
/// </summary>
73+
private static IEnumerable<CharItem> MergeUnique(
74+
IEnumerable<CharItem> priorityReplacements,
75+
IEnumerable<CharItem> alternativeReplacements)
76+
{
77+
var priorityReplacementsList = priorityReplacements.ToList();
78+
var alternativeReplacementsList = alternativeReplacements.ToList();
79+
80+
foreach (CharItem alternativeReplacement in alternativeReplacementsList)
81+
{
82+
foreach (CharItem priorityReplacement in priorityReplacementsList)
2983
{
30-
if (userReplacement.Char == defaultReplacement.Char)
84+
if (priorityReplacement.Char == alternativeReplacement.Char)
3185
{
32-
defaultReplacement.Replacement = userReplacement.Replacement;
86+
alternativeReplacement.Replacement = priorityReplacement.Replacement;
3387
}
3488
}
3589
}
3690

37-
IEnumerable<CharItem> mergedCollections =
38-
RequestHandlerSettings.DefaultCharCollection.Union<CharItem>(
39-
requestHandlerSettings.UserDefinedCharCollection, new CharacterReplacementEqualityComparer());
40-
41-
return mergedCollections;
91+
return priorityReplacementsList.Union<CharItem>(
92+
alternativeReplacementsList,
93+
new CharacterReplacementEqualityComparer());
4294
}
4395
}
4496
}

0 commit comments

Comments
 (0)