// ReSharper disable once ReturnTypeCanBeEnumerable.Global public static EmojiRenderResult[] RenderEmojiAsStringList(EmojiPackType pack, IList <long> activeEmoji) { var result = new List <EmojiRenderResult>(); var dictionary = emojiList[pack]; for (int i = 0; i < activeEmoji.Count; i++) { bool u = false; int max = Math.Min(i + 3, activeEmoji.Count - 1); int j = max; for (; j >= i; j--) { var a = new List <long>(); for (int n = i; n <= j; n++) { a.Add(activeEmoji[n]); } var emojiString = GetStringForCodes(a); if (dictionary.Contains(emojiString)) { u = true; result.Add(new EmojiRenderResult() { emojiCode = emojiString }); break; } } if (u) { // Такой сиквенс, который начинается на activeEmoji[i] есть в словаре i = j; } else { // Такого сиквенса не существует result.Add(new EmojiRenderResult() { isSuccess = false, rawText = Utf8ToUnicode.UnicodeCodeToString(activeEmoji[i]) }); } } return(result.ToArray()); }
/// <summary> /// Парсинг эмодзи из дополнительных plain'ов в Unicode /// </summary> /// <param name="text">Текст с сырым Markdown</param> /// <param name="chatOption">Опции чата, заданные стримером для виджета</param> /// <param name="waitDictionary">Dictionary для саб-блоков</param> /// <returns></returns> public static string MarkEmojiUnicode( string text, ChatDrawOption chatOption, Dictionary <string, string> waitDictionary ) { if (!UnicodeEmojiEngine.emojiList[chatOption.unicode_emoji_displaying].Any()) { return(text); } var activeEmoji = new List <long>(); var longs = Utf8ToUnicode.ToUnicodeCode(text); var textAfter = ""; var containEmoji = false; foreach (var code in longs) { if (!UnicodeEmojiEngine.IsInIntervalEmoji(code, chatOption.unicode_emoji_displaying)) { // Этот символ НЕ является unicode emoji if (activeEmoji.Any()) { // У нас непустой буффер emoji символов, надо их записать в строку var localEmojiList = UnicodeEmojiEngine.RenderEmojiAsStringList( chatOption.unicode_emoji_displaying, activeEmoji); textAfter += RenderEmojiStringListAsHtml( localEmojiList, chatOption.unicode_emoji_displaying, waitDictionary, chatOption.emoji_relative ); activeEmoji = new List <long>(); } textAfter += Utf8ToUnicode.UnicodeCodeToString(code); continue; } // Этот символ ЯВЛЯЕТСЯ unicode emoji containEmoji = true; activeEmoji.Add(code); } // foreach if (activeEmoji.Any()) { // У нас не пустой буффер emoji символов, надо их записать в строку var localEmojiList = UnicodeEmojiEngine.RenderEmojiAsStringList( chatOption.unicode_emoji_displaying, activeEmoji); textAfter += RenderEmojiStringListAsHtml( localEmojiList, chatOption.unicode_emoji_displaying, waitDictionary, chatOption.emoji_relative ); } if (containEmoji) { text = textAfter; } return(text); }