// 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()); }
private static string AddMessageReactionHTMLWithEmojiPack( NKDiscordChatWidget.DiscordBot.Classes.EventMessageCreate.EventMessageCreate_Reaction reaction, EmojiPackType emojiPack ) { var longs = Utf8ToUnicode.ToUnicodeCode(reaction.emoji.name); var u = longs.Any(code => !UnicodeEmojiEngine.IsInIntervalEmoji(code, emojiPack)); if (u) { // Реакция без ID, но при этом не является эмодзи, рисуем как есть return(HttpUtility.HtmlEncode(reaction.emoji.name)); } // Реакция без ID и является эмодзи, поэтому рисуем как картинку var localEmojiList = UnicodeEmojiEngine.RenderEmojiAsStringList( emojiPack, longs); var emojiHtml = ""; // ReSharper disable once LoopCanBeConvertedToQuery foreach (var item in localEmojiList) { if (!item.isSuccess) { // Этого символа нет в паке, выводим как есть. Куда деваться emojiHtml += HttpUtility.HtmlEncode(item.rawText); continue; } // hint: localEmojiList.Count может быть больше 1 в случае сложных эмодзи типа :one: var emojiSubFolderName = UnicodeEmojiEngine.GetImageSubFolder(emojiPack); var emojiExtension = UnicodeEmojiEngine.GetImageExtension(emojiPack); var url = string.Format("/images/emoji/{0}/{1}.{2}", emojiSubFolderName, item.emojiCode, emojiExtension ); emojiHtml += string.Format("<img src='{0}' alt=':{1}:'>", HttpUtility.HtmlEncode(url), HttpUtility.HtmlEncode(reaction.emoji.name) ); } return(emojiHtml); }
public static string GetImageSubFolder(EmojiPackType pack) { switch (pack) { case EmojiPackType.Twemoji: return("twemoji"); case EmojiPackType.JoyPixels: return("joypixels"); case EmojiPackType.StandardOS: return(""); default: return(""); } }
public static string GetImageExtension(EmojiPackType pack) { switch (pack) { case EmojiPackType.Twemoji: return("svg"); case EmojiPackType.JoyPixels: return("png"); case EmojiPackType.StandardOS: return(""); default: return(""); } }
public static string RenderEmojiStringListAsHtml( IEnumerable <UnicodeEmojiEngine.EmojiRenderResult> codes, EmojiPackType pack, Dictionary <string, string> waitDictionary, int emojiShow ) { var text = ""; var emojiSubFolderName = UnicodeEmojiEngine.GetImageSubFolder(pack); var emojiExtension = UnicodeEmojiEngine.GetImageExtension(pack); foreach (var item in codes) { if (item.isSuccess) { var wait = GetWaitString(); var url = string.Format("/images/emoji/{0}/{1}.{2}", emojiSubFolderName, item.emojiCode, emojiExtension ); waitDictionary[wait] = string.Format( "<span class='emoji unicode-emoji {0}'><img src='{1}' alt=':{2}:'></span>", (emojiShow == 1) ? "blur" : "", HttpUtility.HtmlEncode(url), HttpUtility.HtmlEncode(item.emojiCode) ); text += wait; } else { text += item.rawText; } } return(text); }
public static bool IsInIntervalEmoji(long code, EmojiPackType pack) { return(IsInStandardUnicodeEmoji(code) || emojiCodesList[pack].Contains(code)); }