MrModest

TelegramMessageMarkup

Feb 23rd, 2021
704
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. public static string GetMarkupMessage(this string plainText, MessageEntity[] entities, ParseMode parseMode)
  2.         {
  3.             var dict = new Dictionary<(MessageEntityType, ParseMode), (string open, string close)>
  4.             {
  5.                 [(MessageEntityType.Bold, ParseMode.Html)] = ("<b>", "</b>"),
  6.                 [(MessageEntityType.Italic, ParseMode.Html)] = ("<i>", "</i>"),
  7.                 [(MessageEntityType.Underline, ParseMode.Html)] = ("<u>", "</u>"),
  8.                 [(MessageEntityType.Strikethrough, ParseMode.Html)] = ("<s>", "</s>"),
  9.                 [(MessageEntityType.Code, ParseMode.Html)] = ("<code>", "</code>"),
  10.                 [(MessageEntityType.Pre, ParseMode.Html)] = ("<pre>", "</pre>"),
  11.                
  12.                 [(MessageEntityType.TextLink, ParseMode.Html)] = ("<a href='{{url}}'>", "</a>"),
  13.                 [(MessageEntityType.TextLink, ParseMode.MarkdownV2)] = ("[", "]({{url}})"),
  14.             };
  15.  
  16.             var formatEntities = entities
  17.                 .Where(e => e.Type.In(MessageEntityType.Code, MessageEntityType.Pre,
  18.                     MessageEntityType.Bold, MessageEntityType.Italic,
  19.                     MessageEntityType.Underline, MessageEntityType.Strikethrough,
  20.                     MessageEntityType.Url, MessageEntityType.TextLink))
  21.                 .Select(e => new
  22.                 {
  23.                     StartIndex = e.Offset,
  24.                     EndIndex = e.Offset + e.Length - 1,
  25.                     OpenBrace = dict[(e.Type, parseMode)].open,
  26.                     CloseBrace = dict[(e.Type, parseMode)].close
  27.                 })
  28.                 .ToArray();
  29.  
  30.             var insertBefore = formatEntities.ToLookup(e => e.StartIndex, e => e.OpenBrace);
  31.             var insertAfter = formatEntities.Reverse().ToLookup(e => e.EndIndex, e => e.CloseBrace);
  32.  
  33.             var markupText = new StringBuilder();
  34.  
  35.             for (int i = 0; i < plainText.Length; i++)
  36.             {
  37.                 var currentInsertBefore = insertBefore[i].ToArray();
  38.                 var currentInsertAfter = insertAfter[i].ToArray();
  39.                 if (currentInsertBefore.Any())
  40.                 {
  41.                     markupText.Append(string.Join("", currentInsertBefore));
  42.                 }
  43.  
  44.                 markupText.Append(plainText[i]);
  45.  
  46.                 if (currentInsertAfter.Any())
  47.                 {
  48.                     markupText.Append(string.Join("", currentInsertAfter));
  49.                 }
  50.             }
  51.  
  52.             return markupText.ToString();
  53.         }
RAW Paste Data