Compare commits
No commits in common. "6b4fa3d63b384669176055f51f8292904366a315" and "c53cbe009668f81c53900b93c45c8747dce78f9f" have entirely different histories.
6b4fa3d63b
...
c53cbe0096
@ -51,14 +51,4 @@ public static class ServicesExtensions
|
|||||||
return (f is not null && type.GetInterface(f) is not null)
|
return (f is not null && type.GetInterface(f) is not null)
|
||||||
|| (nf is not null && type.GetInterface(nf) is not null);
|
|| (nf is not null && type.GetInterface(nf) is not null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string AsUrlFriendly(this string value)
|
|
||||||
{
|
|
||||||
return UrlGenerator.Generate(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string AsUrlFriendly(this string value, IEnumerable<string> existing)
|
|
||||||
{
|
|
||||||
return UrlGenerator.Generate(value, existing);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,112 +0,0 @@
|
|||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Connected.Services;
|
|
||||||
internal static class UrlGenerator
|
|
||||||
{
|
|
||||||
private const string ValidCharacters = "abcdefghijklmnopqrstuvzxyw-";
|
|
||||||
private const string MinusReplacements = "_ .\t\r\n";
|
|
||||||
static UrlGenerator()
|
|
||||||
{
|
|
||||||
Replacements = new(StringComparer.OrdinalIgnoreCase)
|
|
||||||
{
|
|
||||||
{"č", "c"},
|
|
||||||
{"š", "s"},
|
|
||||||
{"ž", "z"},
|
|
||||||
{"đ", "d"},
|
|
||||||
{"ć", "c"}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Dictionary<string, string> Replacements { get; }
|
|
||||||
|
|
||||||
public static string Generate(string text)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(text))
|
|
||||||
throw new NullReferenceException(nameof(text));
|
|
||||||
|
|
||||||
var result = new StringBuilder();
|
|
||||||
/*
|
|
||||||
* Analyze each character.
|
|
||||||
*/
|
|
||||||
foreach (var s in text.Trim())
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If it's in a ValidCharacters collection that's fine, we just copy it
|
|
||||||
* into the result.
|
|
||||||
*/
|
|
||||||
if (ValidCharacters.Contains(s, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
result.Append(s);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Look if it's in the MinusReplacements collection which means we'll
|
|
||||||
* replace the character with the minus sign.
|
|
||||||
*/
|
|
||||||
if (MinusReplacements.Contains(s, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
result.Append('-');
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Last chance for the character to be included in the result is to
|
|
||||||
* resolve the hardcoded character replacements.
|
|
||||||
*/
|
|
||||||
if (Replacements.TryGetValue(s.ToString(), out var replacement))
|
|
||||||
result.Append(replacement);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* It's possible that no characters are included in the result. If that's
|
|
||||||
* the case we are going to include an a character just for the sake of
|
|
||||||
* being a valid string.
|
|
||||||
*/
|
|
||||||
if (result.Length == 0)
|
|
||||||
result.Append('a');
|
|
||||||
/*
|
|
||||||
* Remove any redundant minus characters and we are done.
|
|
||||||
*/
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
var active = false;
|
|
||||||
|
|
||||||
for (var i = 0; i < result.Length; i++)
|
|
||||||
{
|
|
||||||
if (result[i] == '-')
|
|
||||||
{
|
|
||||||
if (active)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
active = true;
|
|
||||||
sb.Append(result[i]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
active = false;
|
|
||||||
sb.Append(result[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Remove trailing minus if exists.
|
|
||||||
*/
|
|
||||||
return sb.ToString().Trim().Trim('-').ToLowerInvariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string Generate(string text, IEnumerable<string> existing)
|
|
||||||
{
|
|
||||||
var prepared = Generate(text);
|
|
||||||
|
|
||||||
if (!existing.Any())
|
|
||||||
return prepared;
|
|
||||||
|
|
||||||
var idx = 0;
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
var key = $"{prepared}-{idx}";
|
|
||||||
|
|
||||||
if (!existing.Contains(key, StringComparer.OrdinalIgnoreCase))
|
|
||||||
return key;
|
|
||||||
|
|
||||||
idx++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user