using Microsoft.Extensions.Configuration; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Configuration.UmbracoSettings; namespace Umbraco.Extensions; /// /// Get concatenated user and default character replacements /// taking into account . /// public static class RequestHandlerSettingsExtension { /// /// Get concatenated user and default character replacements /// taking into account . /// public static IEnumerable GetCharReplacements(this RequestHandlerSettings requestHandlerSettings) { if (requestHandlerSettings.EnableDefaultCharReplacements is false) { return requestHandlerSettings.UserDefinedCharCollection ?? Enumerable.Empty(); } if (requestHandlerSettings.UserDefinedCharCollection == null || requestHandlerSettings.UserDefinedCharCollection.Any() is false) { return RequestHandlerSettings.DefaultCharCollection; } /// Merges CharCollection and UserDefinedCharCollection, prioritizing UserDefinedCharCollection. return MergeUnique(requestHandlerSettings.UserDefinedCharCollection, RequestHandlerSettings.DefaultCharCollection); } private static IEnumerable GetReplacements(IConfiguration configuration, string key) { var replacements = new List(); IEnumerable config = configuration.GetSection(key).GetChildren(); foreach (IConfigurationSection section in config) { var @char = section.GetValue(nameof(CharItem.Char)); var replacement = section.GetValue(nameof(CharItem.Replacement)); if (@char is null || replacement is null) { continue; } replacements.Add(new CharItem { Char = @char, Replacement = replacement }); } return replacements; } /// /// Merges two IEnumerable of CharItem without any duplicates, items in priorityReplacements will override those in alternativeReplacements. /// private static IEnumerable MergeUnique( IEnumerable priorityReplacements, IEnumerable alternativeReplacements) { var priorityReplacementsList = priorityReplacements.ToList(); var alternativeReplacementsList = alternativeReplacements.ToList(); foreach (CharItem alternativeReplacement in alternativeReplacementsList) { foreach (CharItem priorityReplacement in priorityReplacementsList) { if (priorityReplacement.Char == alternativeReplacement.Char) { alternativeReplacement.Replacement = priorityReplacement.Replacement; } } } return priorityReplacementsList.Union( alternativeReplacementsList, new CharacterReplacementEqualityComparer()); } }