Fish Wang says to SITCON BOT Testpool
結果差不多是這樣 class TelegramText @toHTML: (text, entities)-> chars = text.split '' # remove special entities chars = chars.map (i)-> switch i when '&' then '&amp;' when '<' then '&lt;' when '>' then '&gt;' when '\n' then '<br/>' else i offset = 0 for entity in entities switch entity.type when 'url' realOffset = offset + entity.offset url = chars.slice realOffset, realOffset + entity.length .join '' url = url.match /&amp;|&lt;|&gt;|.|\r|\n/g .map (i)-> switch i when '&amp;' then '&' when '&lt;' then '<' when '&gt;' then '>' else i .join '' chars.splice realOffset, 0, "<a href=\"#{url}\">" chars.splice realOffset + entity.length + 1, 0, '</a>' offset += 2 when 'mention' realOffset = offset + entity.offset name = chars.slice realOffset + 1, realOffset + entity.length .join '' url = "https://telegram.me/#{encodeURIComponent name}" chars.splice realOffset, 0, " <a href=\"#{url}\" data-tg-type=\"mention\" >" chars.splice realOffset + entity.length + 1, 0, '</a>' offset += 2 when 'code' realOffset = offset + entity.offset chars.splice realOffset, 0, '<code>' chars.splice realOffset + entity.length + 1, 0, '</code>' offset += 2 when 'pre' realOffset = offset + entity.offset for i in [realOffset..realOffset + entity.length - 1] if chars[i] is '<br/>' chars[i] = '\n' chars.splice realOffset, 0, '<pre>' chars.splice realOffset + entity.length + 1, 0, '</pre>' offset += 2 when 'text_mention' realOffset = offset + entity.offset name = chars.slice realOffset, realOffset + entity.length .join '' url = encodeURIComponent "https://telegram.me/#{name}" chars.splice realOffset, 0, " <a href=\"#\" data-tg-type=\"text_mention\" data-tg-id=\"#{entity.user.id}\" data-tg-first_name=\"#{entity.user.first_name}\" data-tg-last_name=\"#{entity.user.last_name}\" >" chars.splice realOffset + entity.length + 1, 0, '</a>' offset += 2 chars.join ''