結果差不多是這樣
class TelegramText
@toHTML: (text, entities)->
chars = text.split ''
# remove special entities
chars = chars.map (i)->
switch i
when '&' then '&'
when '<' then '<'
when '>' then '>'
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 /&|<|>|.|\r|\n/g
.map (i)->
switch i
when '&' then '&'
when '<' then '<'
when '>' 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 ''