将Javascript slugifier转换为C#

本文关键字:转换 slugifier Javascript | 更新日期: 2023-09-27 17:58:55

我正在考虑由diegok转换JS slugify函数,他正在使用这个JavaScript构造:

function turkish_map() {
    return {
        'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U',
        'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G'
    };
}

这是一个字符到字符翻译的映射。然而,我不知道这是哪个JS构造,如何在C#中重写它,而不需要花费太多时间?(它还有更多功能,这只是其中一个功能)。

我应该做一个数组、字典还是其他什么?

将Javascript slugifier转换为C#

Dictionary<char, char> turkish_map() {
    return new Dictionary<char, char> {
        {'ş','s'}, {'Ş','S'}, {'ı','i'}, {'İ','I'} {'ç','c'} , {'Ç','C' }, {'ü','u'}, {'Ü','U'}, {'ö','o'}, {'Ö','O'}, {'ğ','g'}, {'Ğ','G'} }; 
}

像这样使用:

turkish_map()['İ'] // returns I

或者,您可以将它保存到字段中并使用它,而无需每次都创建它。

使用这些方法删除变音符号,结果将是sSıIcCuUoOgG

namespace Test
{
    public class Program
    {
        public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm, Func<char, char> customFolding)
        {
            foreach (char c in src.Normalize(compatNorm ? NormalizationForm.FormKD : NormalizationForm.FormD))
                switch (CharUnicodeInfo.GetUnicodeCategory(c))
                {
                    case UnicodeCategory.NonSpacingMark:
                    case UnicodeCategory.SpacingCombiningMark:
                    case UnicodeCategory.EnclosingMark:
                        //do nothing
                        break;
                    default:
                        yield return customFolding(c);
                        break;
                }
        }
        public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm)
        {
            return RemoveDiacritics(src, compatNorm, c => c);
        }
        public static string RemoveDiacritics(string src, bool compatNorm, Func<char, char> customFolding)
        {
            StringBuilder sb = new StringBuilder();
            foreach (char c in RemoveDiacriticsEnum(src, compatNorm, customFolding))
                sb.Append(c);
            return sb.ToString();
        }
        public static string RemoveDiacritics(string src, bool compatNorm)
        {
            return RemoveDiacritics(src, compatNorm, c => c);
        }

        static void Main(string[] args)
        {
            var str = "şŞıİçÇüÜöÖğĞ";
            Console.Write(RemoveDiacritics(str, false));
            // output: sSıIcCuUoOgG
            Console.ReadKey();
        }
    }
}

对于其他未转换的字符,如ı,以及您提到的@,您可以使用该方法删除变音符号,然后使用正则表达式删除无效字符。如果你足够关心某些字符,你可以制作一个Dictionary<char, char>,并用它来替换每个字符。

然后你可以这样做:

var input = "Şöme-p@ttern"; // text to convert into a slug
var replaces = new Dictionary<char, char> { { '@', 'a' } }; // list of chars you care
var pattern = @"[^A-Z0-9_-]+"; // regex to remove invalid characters
var result = new StringBuilder(RemoveDiacritics(input, false)); // convert Ş to S
                                                                // and so on
foreach (var item in replaces)
{
    result = result.Replace(item.Key, item.Value); // replace @ with a and so on
}
// remove invalid characters which weren't converted
var slug = Regex.Replace(result.ToString(), pattern, String.Empty,
    RegexOptions.IgnoreCase);
// output: Some-pattern