From 78f92150b4ebc723d5eaef8796c7ac41d3afa0f2 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 4 May 2019 15:53:23 +0200 Subject: [PATCH] Use slugify.js table. --- .../StringExtensions.cs | 708 ++++++++++++------ 1 file changed, 460 insertions(+), 248 deletions(-) diff --git a/src/Squidex.Infrastructure/StringExtensions.cs b/src/Squidex.Infrastructure/StringExtensions.cs index 1cda44f3d..e0e198223 100644 --- a/src/Squidex.Infrastructure/StringExtensions.cs +++ b/src/Squidex.Infrastructure/StringExtensions.cs @@ -24,287 +24,499 @@ namespace Squidex.Infrastructure private static readonly Dictionary LowerCaseDiacritics; private static readonly Dictionary Diacritics = new Dictionary { + ['$'] = "dollar", + ['%'] = "percent", + ['&'] = "and", + ['<'] = "less", + ['>'] = "greater", + ['|'] = "or", + ['¢'] = "cent", + ['£'] = "pound", + ['¤'] = "currency", + ['¥'] = "yen", + ['©'] = "(c)", + ['ª'] = "a", + ['®'] = "(r)", + ['º'] = "o", ['À'] = "A", - ['à'] = "a", - ['Ā'] = "A", - ['Ġ'] = "G", - ['ŀ'] = "l", - ['Š'] = "S", - ['Ǡ'] = "A", - ['Ȁ'] = "A", ['Á'] = "A", - ['á'] = "a", - ['ā'] = "a", - ['ġ'] = "g", - ['Ł'] = "L", - ['š'] = "s", - ['ǡ'] = "a", - ['ȁ'] = "a", ['Â'] = "A", - ['â'] = "a", - ['Ă'] = "A", - ['Ģ'] = "G", - ['ł'] = "l", - ['Ţ'] = "T", - ['Ǣ'] = "Ae", - ['Ȃ'] = "A", ['Ã'] = "A", - ['ã'] = "a", - ['ă'] = "a", - ['ģ'] = "g", - ['Ń'] = "N", - ['ţ'] = "t", - ['ǣ'] = "ae", - ['ȃ'] = "a", - ['Ä'] = "Ae", - ['ä'] = "ae", - ['Ą'] = "A", - ['Ĥ'] = "H", - ['ń'] = "n", - ['Ť'] = "T", - ['DŽ'] = "DZ", - ['Ǥ'] = "G", - ['Ȅ'] = "E", + ['Ä'] = "AE", ['Å'] = "A", - ['å'] = "a", - ['ą'] = "a", - ['ĥ'] = "h", - ['Ņ'] = "N", - ['ť'] = "t", - ['Dž'] = "Dz", - ['ǥ'] = "g", - ['ȅ'] = "e", ['Æ'] = "AE", - ['æ'] = "ae", - ['Ć'] = "C", - ['Ħ'] = "H", - ['ņ'] = "n", - ['Ŧ'] = "T", - ['dž'] = "dz", - ['Ǧ'] = "G", - ['Ȇ'] = "E", ['Ç'] = "C", - ['ç'] = "c", - ['ć'] = "c", - ['ħ'] = "h", - ['Ň'] = "N", - ['ŧ'] = "t", - ['LJ'] = "W", - ['ǧ'] = "g", - ['ȇ'] = "e", ['È'] = "E", - ['è'] = "E", - ['Ĉ'] = "C", - ['Ĩ'] = "I", - ['ň'] = "n", - ['Ũ'] = "U", - ['Lj'] = "Lj", - ['Ǩ'] = "K", - ['Ȉ'] = "I", ['É'] = "E", - ['é'] = "e", - ['ĉ'] = "c", - ['ĩ'] = "i", - ['ʼn'] = "n", - ['ũ'] = "u", - ['lj'] = "lj", - ['ǩ'] = "k", - ['ȉ'] = "i", ['Ê'] = "E", - ['ê'] = "e", - ['Ċ'] = "C", - ['Ī'] = "I", - ['Ŋ'] = "n", - ['Ū'] = "U", - ['NJ'] = "NJ", - ['Ǫ'] = "O", - ['Ȋ'] = "I", ['Ë'] = "E", - ['ë'] = "e", - ['ċ'] = "c", - ['ī'] = "i", - ['ŋ'] = "n", - ['ū'] = "u", - ['Nj'] = "Nj", - ['ǫ'] = "o", - ['ȋ'] = "i", ['Ì'] = "I", - ['ì'] = "i", - ['Č'] = "C", - ['Ĭ'] = "I", - ['Ō'] = "O", - ['Ŭ'] = "U", - ['nj'] = "nj", - ['Ǭ'] = "O", - ['Ȍ'] = "O", ['Í'] = "I", - ['í'] = "i", - ['č'] = "c", - ['ĭ'] = "i", - ['ō'] = "o", - ['ŭ'] = "u", - ['Ǎ'] = "A", - ['ǭ'] = "o", - ['ȍ'] = "o", ['Î'] = "I", - ['î'] = "i", - ['Ď'] = "D", - ['Į'] = "I", - ['Ŏ'] = "O", - ['Ů'] = "U", - ['ǎ'] = "a", - ['Ǯ'] = "z", - ['Ȏ'] = "O", ['Ï'] = "I", - ['ï'] = "i", - ['ď'] = "d", - ['į'] = "i", - ['ŏ'] = "o", - ['ů'] = "u", - ['Ǐ'] = "I", - ['ǯ'] = "z", - ['ȏ'] = "o", ['Ð'] = "D", - ['ð'] = "d", - ['Đ'] = "D", - ['İ'] = "I", - ['Ő'] = "O", - ['Ű'] = "U", - ['ǐ'] = "i", - ['ǰ'] = "j", - ['Ȑ'] = "R", ['Ñ'] = "N", - ['ñ'] = "n", - ['đ'] = "d", - ['ı'] = "i", - ['ő'] = "o", - ['ű'] = "u", - ['Ǒ'] = "O", - ['DZ'] = "DZ", - ['ȑ'] = "r", ['Ò'] = "O", - ['ò'] = "o", - ['Ē'] = "E", - ['IJ'] = "LJ", - ['Œ'] = "OE", - ['Ų'] = "U", - ['ǒ'] = "o", - ['Dz'] = "Dz", - ['Ȓ'] = "R", ['Ó'] = "O", - ['ó'] = "o", - ['ē'] = "e", - ['ij'] = "ij", - ['œ'] = "oe", - ['ų'] = "u", - ['Ǔ'] = "U", - ['dz'] = "dz", - ['ȓ'] = "r", ['Ô'] = "O", - ['ô'] = "o", - ['Ĕ'] = "E", - ['Ĵ'] = "J", - ['Ŕ'] = "R", - ['Ŵ'] = "W", - ['ǔ'] = "u", - ['Ǵ'] = "G", - ['Ȕ'] = "U", ['Õ'] = "O", + ['Ö'] = "OE", + ['Ø'] = "O", + ['Ù'] = "U", + ['Ú'] = "U", + ['Û'] = "U", + ['Ü'] = "UE", + ['Ý'] = "Y", + ['Þ'] = "TH", + ['ß'] = "ss", + ['à'] = "a", + ['á'] = "a", + ['â'] = "a", + ['ã'] = "a", + ['ä'] = "ae", + ['å'] = "a", + ['æ'] = "ae", + ['ç'] = "c", + ['è'] = "e", + ['é'] = "e", + ['ê'] = "e", + ['ë'] = "e", + ['ì'] = "i", + ['í'] = "i", + ['î'] = "i", + ['ï'] = "i", + ['ð'] = "d", + ['ñ'] = "n", + ['ò'] = "o", + ['ó'] = "o", + ['ô'] = "o", ['õ'] = "o", - ['ĕ'] = "e", - ['ĵ'] = "j", - ['ŕ'] = "r", - ['ŵ'] = "w", - ['Ǖ'] = "U", - ['ǵ'] = "g", - ['ȕ'] = "u", - ['Ö'] = "Oe", ['ö'] = "oe", - ['Ė'] = "E", - ['Ķ'] = "K", - ['Ŗ'] = "R", - ['Ŷ'] = "Y", - ['ǖ'] = "u", - ['Ƕ'] = "Hj", - ['Ȗ'] = "U", - ['ė'] = "e", - ['ķ'] = "k", - ['ŗ'] = "r", - ['ŷ'] = "y", - ['Ǘ'] = "U", - ['ȗ'] = "u", - ['Ø'] = "O", ['ø'] = "o", - ['Ę'] = "E", - ['ĸ'] = "k", - ['Ř'] = "R", - ['Ÿ'] = "Y", - ['ǘ'] = "u", - ['Ǹ'] = "N", - ['Ș'] = "S", - ['Ù'] = "U", ['ù'] = "u", - ['ę'] = "e", - ['Ĺ'] = "L", - ['ř'] = "r", - ['Ź'] = "Z", - ['Ǚ'] = "U", - ['ǹ'] = "n", - ['ș'] = "s", - ['Ú'] = "U", ['ú'] = "u", - ['Ě'] = "E", - ['ĺ'] = "l", - ['Ś'] = "S", - ['ź'] = "z", - ['ǚ'] = "u", - ['Ǻ'] = "A", - ['Ț'] = "T", - ['Û'] = "U", ['û'] = "u", + ['ü'] = "ue", + ['ý'] = "y", + ['þ'] = "th", + ['ÿ'] = "y", + ['Ā'] = "A", + ['ā'] = "a", + ['Ă'] = "A", + ['ă'] = "a", + ['Ą'] = "A", + ['ą'] = "a", + ['Ć'] = "C", + ['ć'] = "c", + ['Č'] = "C", + ['č'] = "c", + ['Ď'] = "D", + ['ď'] = "d", + ['Đ'] = "DJ", + ['đ'] = "dj", + ['Ē'] = "E", + ['ē'] = "e", + ['Ė'] = "E", + ['ė'] = "e", + ['Ę'] = "e", + ['ę'] = "e", + ['Ě'] = "E", ['ě'] = "e", + ['Ğ'] = "G", + ['ğ'] = "g", + ['Ģ'] = "G", + ['ģ'] = "g", + ['Ĩ'] = "I", + ['ĩ'] = "i", + ['Ī'] = "i", + ['ī'] = "i", + ['Į'] = "I", + ['į'] = "i", + ['İ'] = "I", + ['ı'] = "i", + ['Ķ'] = "k", + ['ķ'] = "k", ['Ļ'] = "L", + ['ļ'] = "l", + ['Ľ'] = "L", + ['ľ'] = "l", + ['Ł'] = "L", + ['ł'] = "l", + ['Ń'] = "N", + ['ń'] = "n", + ['Ņ'] = "N", + ['ņ'] = "n", + ['Ň'] = "N", + ['ň'] = "n", + ['Ő'] = "O", + ['ő'] = "o", + ['Œ'] = "OE", + ['œ'] = "oe", + ['Ŕ'] = "R", + ['ŕ'] = "r", + ['Ř'] = "R", + ['ř'] = "r", + ['Ś'] = "S", ['ś'] = "s", + ['Ş'] = "S", + ['ş'] = "s", + ['Š'] = "S", + ['š'] = "s", + ['Ţ'] = "T", + ['ţ'] = "t", + ['Ť'] = "T", + ['ť'] = "t", + ['Ũ'] = "U", + ['ũ'] = "u", + ['Ū'] = "u", + ['ū'] = "u", + ['Ů'] = "U", + ['ů'] = "u", + ['Ű'] = "U", + ['ű'] = "u", + ['Ų'] = "U", + ['ų'] = "u", + ['Ź'] = "Z", + ['ź'] = "z", ['Ż'] = "Z", - ['Ǜ'] = "U", - ['ǻ'] = "a", - ['ț'] = "t", - ['Ü'] = "Ue", - ['ü'] = "ue", - ['Ĝ'] = "G", - ['ļ'] = "l", - ['Ŝ'] = "S", ['ż'] = "z", - ['ǜ'] = "u", - ['Ǽ'] = "AE", - ['Ȝ'] = "z", - ['Ý'] = "Y", - ['ý'] = "y", - ['ĝ'] = "g", - ['Ľ'] = "L", - ['ŝ'] = "s", ['Ž'] = "Z", - ['ǝ'] = "e", - ['ǽ'] = "ae", - ['ȝ'] = "z", - ['Þ'] = "p", - ['þ'] = "p", - ['Ğ'] = "G", - ['ľ'] = "L", - ['Ş'] = "S", ['ž'] = "z", - ['Ǟ'] = "A", - ['Ǿ'] = "O", - ['Ȟ'] = "H", - ['ß'] = "ss", - ['ÿ'] = "y", - ['ğ'] = "g", - ['Ŀ'] = "L", - ['ş'] = "s", - ['ſ'] = "l", - ['ǟ'] = "a", - ['ǿ'] = "o", - ['ȟ'] = "h" + ['ƒ'] = "f", + ['Ơ'] = "O", + ['ơ'] = "o", + ['Ư'] = "U", + ['ư'] = "u", + ['Lj'] = "LJ", + ['lj'] = "lj", + ['Nj'] = "NJ", + ['nj'] = "nj", + ['Ș'] = "S", + ['ș'] = "s", + ['Ț'] = "T", + ['ț'] = "t", + ['˚'] = "o", + ['Ά'] = "A", + ['Έ'] = "E", + ['Ή'] = "H", + ['Ί'] = "I", + ['Ό'] = "O", + ['Ύ'] = "Y", + ['Ώ'] = "W", + ['ΐ'] = "i", + ['Α'] = "A", + ['Β'] = "B", + ['Γ'] = "G", + ['Δ'] = "D", + ['Ε'] = "E", + ['Ζ'] = "Z", + ['Η'] = "H", + ['Θ'] = "8", + ['Ι'] = "I", + ['Κ'] = "K", + ['Λ'] = "L", + ['Μ'] = "M", + ['Ν'] = "N", + ['Ξ'] = "3", + ['Ο'] = "O", + ['Π'] = "P", + ['Ρ'] = "R", + ['Σ'] = "S", + ['Τ'] = "T", + ['Υ'] = "Y", + ['Φ'] = "F", + ['Χ'] = "X", + ['Ψ'] = "PS", + ['Ω'] = "W", + ['Ϊ'] = "I", + ['Ϋ'] = "Y", + ['ά'] = "a", + ['έ'] = "e", + ['ή'] = "h", + ['ί'] = "i", + ['ΰ'] = "y", + ['α'] = "a", + ['β'] = "b", + ['γ'] = "g", + ['δ'] = "d", + ['ε'] = "e", + ['ζ'] = "z", + ['η'] = "h", + ['θ'] = "8", + ['ι'] = "i", + ['κ'] = "k", + ['λ'] = "l", + ['μ'] = "m", + ['ν'] = "n", + ['ξ'] = "3", + ['ο'] = "o", + ['π'] = "p", + ['ρ'] = "r", + ['ς'] = "s", + ['σ'] = "s", + ['τ'] = "t", + ['υ'] = "y", + ['φ'] = "f", + ['χ'] = "x", + ['ψ'] = "ps", + ['ω'] = "w", + ['ϊ'] = "i", + ['ϋ'] = "y", + ['ό'] = "o", + ['ύ'] = "y", + ['ώ'] = "w", + ['Ё'] = "Yo", + ['Ђ'] = "DJ", + ['Є'] = "Ye", + ['І'] = "I", + ['Ї'] = "Yi", + ['Ј'] = "J", + ['Љ'] = "LJ", + ['Њ'] = "NJ", + ['Ћ'] = "C", + ['Џ'] = "DZ", + ['А'] = "A", + ['Б'] = "B", + ['В'] = "V", + ['Г'] = "G", + ['Д'] = "D", + ['Е'] = "E", + ['Ж'] = "Zh", + ['З'] = "Z", + ['И'] = "I", + ['Й'] = "J", + ['К'] = "K", + ['Л'] = "L", + ['М'] = "M", + ['Н'] = "N", + ['О'] = "O", + ['П'] = "P", + ['Р'] = "R", + ['С'] = "S", + ['Т'] = "T", + ['У'] = "U", + ['Ф'] = "F", + ['Х'] = "H", + ['Ц'] = "C", + ['Ч'] = "Ch", + ['Ш'] = "Sh", + ['Щ'] = "Sh", + ['Ъ'] = "U", + ['Ы'] = "Y", + ['Ь'] = "b", + ['Э'] = "E", + ['Ю'] = "Yu", + ['Я'] = "Ya", + ['а'] = "a", + ['б'] = "b", + ['в'] = "v", + ['г'] = "g", + ['д'] = "d", + ['е'] = "e", + ['ж'] = "zh", + ['з'] = "z", + ['и'] = "i", + ['й'] = "j", + ['к'] = "k", + ['л'] = "l", + ['м'] = "m", + ['н'] = "n", + ['о'] = "o", + ['п'] = "p", + ['р'] = "r", + ['с'] = "s", + ['т'] = "t", + ['у'] = "u", + ['ф'] = "f", + ['х'] = "h", + ['ц'] = "c", + ['ч'] = "ch", + ['ш'] = "sh", + ['щ'] = "sh", + ['ъ'] = "u", + ['ы'] = "y", + ['ь'] = "s", + ['э'] = "e", + ['ю'] = "yu", + ['я'] = "ya", + ['ё'] = "yo", + ['ђ'] = "dj", + ['є'] = "ye", + ['і'] = "i", + ['ї'] = "yi", + ['ј'] = "j", + ['љ'] = "lj", + ['њ'] = "nj", + ['ћ'] = "c", + ['џ'] = "dz", + ['Ґ'] = "G", + ['ґ'] = "g", + ['฿'] = "baht", + ['ა'] = "a", + ['ბ'] = "b", + ['გ'] = "g", + ['დ'] = "d", + ['ე'] = "e", + ['ვ'] = "v", + ['ზ'] = "z", + ['თ'] = "t", + ['ი'] = "i", + ['კ'] = "k", + ['ლ'] = "l", + ['მ'] = "m", + ['ნ'] = "n", + ['ო'] = "o", + ['პ'] = "p", + ['ჟ'] = "zh", + ['რ'] = "r", + ['ს'] = "s", + ['ტ'] = "t", + ['უ'] = "u", + ['ფ'] = "f", + ['ქ'] = "k", + ['ღ'] = "gh", + ['ყ'] = "q", + ['შ'] = "sh", + ['ჩ'] = "ch", + ['ც'] = "ts", + ['ძ'] = "dz", + ['წ'] = "ts", + ['ჭ'] = "ch", + ['ხ'] = "kh", + ['ჯ'] = "j", + ['ჰ'] = "h", + ['ẞ'] = "SS", + ['Ạ'] = "A", + ['ạ'] = "a", + ['Ả'] = "A", + ['ả'] = "a", + ['Ấ'] = "A", + ['ấ'] = "a", + ['Ầ'] = "A", + ['ầ'] = "a", + ['Ẩ'] = "A", + ['ẩ'] = "a", + ['Ẫ'] = "A", + ['ẫ'] = "a", + ['Ậ'] = "A", + ['ậ'] = "a", + ['Ắ'] = "A", + ['ắ'] = "a", + ['Ằ'] = "A", + ['ằ'] = "a", + ['Ẳ'] = "A", + ['ẳ'] = "a", + ['Ẵ'] = "A", + ['ẵ'] = "a", + ['Ặ'] = "A", + ['ặ'] = "a", + ['Ẹ'] = "E", + ['ẹ'] = "e", + ['Ẻ'] = "E", + ['ẻ'] = "e", + ['Ẽ'] = "E", + ['ẽ'] = "e", + ['Ế'] = "E", + ['ế'] = "e", + ['Ề'] = "E", + ['ề'] = "e", + ['Ể'] = "E", + ['ể'] = "e", + ['Ễ'] = "E", + ['ễ'] = "e", + ['Ệ'] = "E", + ['ệ'] = "e", + ['Ỉ'] = "I", + ['ỉ'] = "i", + ['Ị'] = "I", + ['ị'] = "i", + ['Ọ'] = "O", + ['ọ'] = "o", + ['Ỏ'] = "O", + ['ỏ'] = "o", + ['Ố'] = "O", + ['ố'] = "o", + ['Ồ'] = "O", + ['ồ'] = "o", + ['Ổ'] = "O", + ['ổ'] = "o", + ['Ỗ'] = "O", + ['ỗ'] = "o", + ['Ộ'] = "O", + ['ộ'] = "o", + ['Ớ'] = "O", + ['ớ'] = "o", + ['Ờ'] = "O", + ['ờ'] = "o", + ['Ở'] = "O", + ['ở'] = "o", + ['Ỡ'] = "O", + ['ỡ'] = "o", + ['Ợ'] = "O", + ['ợ'] = "o", + ['Ụ'] = "U", + ['ụ'] = "u", + ['Ủ'] = "U", + ['ủ'] = "u", + ['Ứ'] = "U", + ['ứ'] = "u", + ['Ừ'] = "U", + ['ừ'] = "u", + ['Ử'] = "U", + ['ử'] = "u", + ['Ữ'] = "U", + ['ữ'] = "u", + ['Ự'] = "U", + ['ự'] = "u", + ['Ỳ'] = "Y", + ['ỳ'] = "y", + ['Ỵ'] = "Y", + ['ỵ'] = "y", + ['Ỷ'] = "Y", + ['ỷ'] = "y", + ['Ỹ'] = "Y", + ['ỹ'] = "y", + ['‘'] = "\'", + ['’'] = "\'", + ['“'] = "\\\"", + ['”'] = "\\\"", + ['†'] = "+", + ['•'] = "*", + ['…'] = "...", + ['₠'] = "ecu", + ['₢'] = "cruzeiro", + ['₣'] = "french franc", + ['₤'] = "lira", + ['₥'] = "mill", + ['₦'] = "naira", + ['₧'] = "peseta", + ['₨'] = "rupee", + ['₩'] = "won", + ['₪'] = "new shequel", + ['₫'] = "dong", + ['€'] = "euro", + ['₭'] = "kip", + ['₮'] = "tugrik", + ['₯'] = "drachma", + ['₰'] = "penny", + ['₱'] = "peso", + ['₲'] = "guarani", + ['₳'] = "austral", + ['₴'] = "hryvnia", + ['₵'] = "cedi", + ['₹'] = "indian rupee", + ['₽'] = "russian ruble", + ['₿'] = "bitcoin", + ['℠'] = "sm", + ['™'] = "tm", + ['∂'] = "d", + ['∆'] = "delta", + ['∑'] = "sum", + ['∞'] = "infinity", + ['♥'] = "love", + ['元'] = "yuan", + ['円'] = "yen", + ['﷼'] = "rial" }; static StringExtensions() @@ -530,7 +742,7 @@ namespace Squidex.Infrastructure if (LowerCaseDiacritics.TryGetValue(character, out var replacement)) { - if (singleCharDiactric) + if (singleCharDiactric && replacement.Length == 2) { result.Append(replacement[0]); }