def _apply_entities(text, entities, escape_map, format_map):
# Split string into char sequence and escape in-place to
# preserve index positions.
seq = list(map(lambda c, i:
escape_map[c] # escape special characters
if c in escape_map
else c,
list(text), # split string to char sequence
range(0, len(text)))) # along with each char's index
# Ensure smaller offsets come first
sorted_entities = sorted(entities, key=lambda e: e['offset'])
offset = 0
result = ''
for e in sorted_entities:
f, n, t = e['offset'], e['length'], e['type']
result += ''.join(seq[offset:f])
if t in format_map:
# apply format
result += format_map[t](''.join(seq[f:f + n]), e)
else:
result += ''.join(seq[f:f + n])
offset = f + n
result += ''.join(seq[offset:])
return result
[docs]def apply_entities_as_markdown(text, entities):
"""
Format text as Markdown. Also take care of escaping special characters.
Returned value can be passed to :meth:`.Bot.sendMessage` with appropriate
``parse_mode``.
:param text:
plain text
:param entities:
a list of `MessageEntity <https://core.telegram.org/bots/api#messageentity>`_ objects
"""
escapes = {
'*': '\\*',
'_': '\\_',
'[': '\\[',
']': '\\]',
'`': '\\`',
'(': '\\(',
')': '\\)',
'~': '\\~',
'>': '\\>',
'#': '\\#',
'+': '\\+',
'-': '\\-',
'=': '\\=',
'|': '\\|',
'{': '\\{',
'}': '\\}',
'.': '\\.',
'!': '\\!'
}
formatters = {
'bold': lambda s, e: '*' + s + '*',
'italic': lambda s, e: '_' + s + '_',
'text_link': lambda s, e: '[' + s + '](' + e['url'] + ')',
'text_mention': lambda s, e: '[' + s + '](tg://user?id=' + str(e['user']['id']) + ')',
'code': lambda s, e: '`' + s + '`',
'pre': lambda s, e: '```text\n' + s + '```',
'underline': lambda s, e: '__' + s + '__',
'strikethrough': lambda s, e: '~' + s + '~'
}
return _apply_entities(text, entities, escapes, formatters)
[docs]def apply_entities_as_html(text, entities):
"""
Format text as HTML. Also take care of escaping special characters.
Returned value can be passed to :meth:`.Bot.sendMessage` with appropriate
``parse_mode``.
:param text:
plain text
:param entities:
a list of `MessageEntity <https://core.telegram.org/bots/api#messageentity>`_ objects
"""
escapes = {'<': '<',
'>': '>',
'&': '&', }
formatters = {
'bold': lambda s, e: '<b>' + s + '</b>',
'italic': lambda s, e: '<i>' + s + '</i>',
'text_link': lambda s, e: '<a href="' + e['url'] + '">' + s + '</a>',
'text_mention': lambda s, e: '<a href="tg://user?id=' + str(e['user']['id']) + '">' + s + '</a>',
'code': lambda s, e: '<code>' + s + '</code>',
'pre': lambda s, e: '<pre>' + s + '</pre>',
'underline': lambda s, e: '<u>' + s + '</u>',
'strikethrough': lambda s, e: '<s>' + s + '</s>'
}
return _apply_entities(text, entities, escapes, formatters)