1
1
using System . Collections . Generic ;
2
2
using System . Linq ;
3
+ using Microsoft . Extensions . Configuration ;
4
+ using Umbraco . Cms . Core ;
3
5
using Umbraco . Cms . Core . Configuration . Models ;
4
6
using Umbraco . Cms . Core . Configuration . UmbracoSettings ;
5
7
@@ -11,34 +13,84 @@ namespace Umbraco.Extensions
11
13
/// </summary>
12
14
public static class RequestHandlerSettingsExtension
13
15
{
16
+ /// <summary>
17
+ /// Get concatenated user and default character replacements
18
+ /// taking into account <see cref="RequestHandlerSettings.EnableDefaultCharReplacements"/>
19
+ /// </summary>
14
20
public static IEnumerable < CharItem > GetCharReplacements ( this RequestHandlerSettings requestHandlerSettings )
15
21
{
16
- if ( ! requestHandlerSettings . EnableDefaultCharReplacements )
22
+ if ( requestHandlerSettings . EnableDefaultCharReplacements is false )
17
23
{
18
24
return requestHandlerSettings . UserDefinedCharCollection ?? Enumerable . Empty < CharItem > ( ) ;
19
25
}
20
26
21
- if ( requestHandlerSettings . UserDefinedCharCollection == null || ! requestHandlerSettings . UserDefinedCharCollection . Any ( ) )
27
+ if ( requestHandlerSettings . UserDefinedCharCollection == null || requestHandlerSettings . UserDefinedCharCollection . Any ( ) is false )
22
28
{
23
29
return RequestHandlerSettings . DefaultCharCollection ;
24
30
}
25
31
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 )
27
61
{
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 )
29
83
{
30
- if ( userReplacement . Char == defaultReplacement . Char )
84
+ if ( priorityReplacement . Char == alternativeReplacement . Char )
31
85
{
32
- defaultReplacement . Replacement = userReplacement . Replacement ;
86
+ alternativeReplacement . Replacement = priorityReplacement . Replacement ;
33
87
}
34
88
}
35
89
}
36
90
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 ( ) ) ;
42
94
}
43
95
}
44
96
}
0 commit comments