src/SimplCommerce.Infrastructure/Helpers/StringHelper.cs (121 lines of code) (raw):

using System; using System.Globalization; using System.Text; namespace SimplCommerce.Infrastructure.Helpers { public static class StringHelper { [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1055:Uri return values should not be strings", Justification = "<Pending>")] public static string ToUrlFriendly(this string name) { // Fallback for product variations if (string.IsNullOrWhiteSpace(name)) { return Guid.NewGuid().ToString(); } name = name.ToLower(CultureInfo.CurrentCulture); name = RemoveDiacritics(name); name = ConvertEdgeCases(name); name = name.Replace(" ", "-", StringComparison.OrdinalIgnoreCase); name = name.Strip(c => c != '-' && c != '_' && !Char.IsLetter(c) && !Char.IsDigit(c) ); while (name.Contains("--", StringComparison.OrdinalIgnoreCase)) name = name.Replace("--", "-", StringComparison.OrdinalIgnoreCase); if (name.Length > 200) name = name.Substring(0, 200); if (string.IsNullOrWhiteSpace(name)) { return Guid.NewGuid().ToString(); } return name; } public static string RemoveDiacritics(string text) { var normalizedString = text.Normalize(NormalizationForm.FormD); var stringBuilder = new StringBuilder(); foreach (var c in normalizedString) { var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); if (unicodeCategory != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(c); } } return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } public static string Strip(this string subject, params char[] stripped) { if (stripped == null || stripped.Length == 0 || String.IsNullOrEmpty(subject)) { return subject; } var result = new char[subject.Length]; var cursor = 0; for (var i = 0; i < subject.Length; i++) { char current = subject[i]; if (Array.IndexOf(stripped, current) < 0) { result[cursor++] = current; } } return new string(result, 0, cursor); } public static string Strip(this string subject, Func<char, bool> predicate) { var result = new char[subject.Length]; var cursor = 0; for (var i = 0; i < subject.Length; i++) { char current = subject[i]; if (!predicate(current)) { result[cursor++] = current; } } return new string(result, 0, cursor); } private static string ConvertEdgeCases(string text) { var sb = new StringBuilder(); foreach (var c in text) { sb.Append(ConvertEdgeCases(c)); } return sb.ToString(); } private static string ConvertEdgeCases(char c) { string swap; switch (c) { case 'ı': swap = "i"; break; case 'ł': case 'Ł': swap = "l"; break; case 'đ': swap = "d"; break; case 'ß': swap = "ss"; break; case 'ø': swap = "o"; break; case 'Þ': swap = "th"; break; default: swap = c.ToString(); break; } return swap; } } }