diff --git a/Wox.Infrastructure/Alphabet.cs b/Wox.Infrastructure/Alphabet.cs index 00d5f95a7b..6c0dc1e6d9 100644 --- a/Wox.Infrastructure/Alphabet.cs +++ b/Wox.Infrastructure/Alphabet.cs @@ -2,11 +2,19 @@ using System.Collections.Generic; using System.Linq; using hyjiacan.util.p4n; +using hyjiacan.util.p4n.format; namespace Wox.Infrastructure { public static class Alphabet { + public static HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); + + static Alphabet() + { + format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + } + /// /// replace chinese character with pinyin, non chinese character won't be modified /// should be word or sentence, instead of single character. e.g. 微软 @@ -14,11 +22,11 @@ namespace Wox.Infrastructure public static string[] Pinyin(string word) { var pinyin = word.Select(c => - { - var pinyins = PinyinHelper.toHanyuPinyinStringArray(c); - var result = pinyins == null ? c.ToString() : pinyins[0]; - return result; - }).ToArray(); + { + var pinyins = PinyinHelper.toHanyuPinyinStringArray(c); + var result = pinyins == null ? c.ToString() : pinyins[0]; + return result; + }).ToArray(); return pinyin; } @@ -26,19 +34,29 @@ namespace Wox.Infrastructure /// replace chinese character with pinyin, non chinese character won't be modified /// Because we don't have words dictionary, so we can only return all possiblie pinyin combination /// e.g. 音乐 will return yinyue and yinle - /// should be word or sentence, instead of single character. e.g. 微软 + /// should be word or sentence, instead of single character. e.g. 微软 /// - public static string[][] PinyinComination(string word) + public static IEnumerable PinyinComination(string characters) { - var combination = word.Select(c => - { - var pinyins = PinyinHelper.toHanyuPinyinStringArray(c); - var result = pinyins ?? new[] { c.ToString() }; - return result; - }).Aggregate(Combination) - .Select(c => c.Split(';')) - .ToArray(); - return combination; + var allPinyins = new List(); + foreach (var c in characters) + { + var pinyins = PinyinHelper.toHanyuPinyinStringArray(c, format); + if (pinyins != null) + { + var r = pinyins.Distinct().ToArray(); + allPinyins.Add(r); + } + else + { + var r = new[] { c.ToString() }; + allPinyins.Add(r); + } + } + + var comination = allPinyins.Aggregate(Combination).Select(c => c.Split(';')); + + return comination; } public static string Acronym(string[] pinyin)