Email or username:

Password:

Forgot your password?
Top-level
Шуро

@skobkin @supportfireman @strizhechenko Всё правильно. И это надо парсить :) Это т.н. entities, там указан тип, содержимое (ссылка, жырно/курсив, т.д.) и смещение в тексте.

Вот берёшь текст, берёшь этот словарь и генерируешь мракдаун на основе этого.

Может, в библиотеке есть готовая функция, но не факт.

5 comments
[DATA EXPUNGED]
Шуро
@skobkin @supportfireman @strizhechenko Ну, мне в своё время надо было в BBCode и такого там точно не было, пришлось писать. Вышло как-то так. Это другая либа, надеюсь, что автору не придётся - но она явно похожая :))
def parse_bbcode(message_text, entities, urled=False):
    """BBCode parsing function"""
    if message_text is None:
        return None

    if not sys.maxunicode == 0xffff:
        message_text = message_text.encode('utf-16-le')

    bbcode_text = ''
    last_offset = 0

    for entity, text in sorted(entities.items(), key=(lambda item: item[0].offset)):

        trailingnewline = ''
        nl = re.compile('\n$', re.IGNORECASE)
        nlr = nl.search(text)
        if (nlr):
            print('Trailing NEWLINE detected in entiry, stripping...')
            text = text.rstrip("\n")
            trailingnewline = '\n'

        if entity.type == 'text_link':
            dm = (re.compile('![a-z0-9.]*@[a-z0-9.]*', re.IGNORECASE)).search(text)
            if not (dm):
                insert = '[url={}]{}[/url]'.format(entity.url, text)
            else: insert = text
        elif entity.type == 'mention':
            insert = '[url=https://t.me/{0}]{1}[/url]'.format(text.strip('@'),text)
        elif entity.type == 'url' and urled:
            dm = (re.compile('![a-z0-9.]*@[a-z0-9.]*', re.IGNORECASE)).search(text)
            if not (dm):
                insert = '[url={0}]{0}[/url]'.format(text)
            else: insert = text
        elif entity.type == 'bold':
            insert = '[b]' + text + '[/b]'
        elif entity.type == 'italic':
            insert = '[i]' + text + '[/i]'
        elif entity.type == 'underline':
            insert = '[u]' + text + '[/u]'
        elif entity.type == 'strikethrough':
            insert = '[s]' + text + '[/s]'
        elif entity.type == 'code':
            insert = '[c0de]' + text + '[/c0de]'
        elif entity.type == 'pre':
            insert = '[pre]' + text + '[/pre]'
        else:
            insert = text
        if sys.maxunicode == 0xffff:
            bbcode_text += message_text[last_offset:entity.offset] + insert + trailingnewline
        else:
            bbcode_text += message_text[last_offset * 2:entity.offset * 2].decode('utf-16-le') + insert + trailingnewline

        last_offset = entity.offset + entity.length

    if sys.maxunicode == 0xffff:
        bbcode_text += message_text[last_offset:]
    else:
        bbcode_text += message_text[last_offset * 2:].decode('utf-16-le')
    return bbcode_text
@skobkin @supportfireman @strizhechenko Ну, мне в своё время надо было в BBCode и такого там точно не было, пришлось писать. Вышло как-то так. Это другая либа, надеюсь, что автору не придётся - но она явно похожая :))
def parse_bbcode(message_text, entities, urled=False): """BBCode parsing function""" if message_text is None: return None if not sys.maxunicode == 0xffff: message_text = message_text.encode('utf-16-le') bbcode_text = '' last_offset...
Сапортер/ПМ 🇷🇺

@shuro @skobkin @strizhechenko

в целом да, уже вижу что дернуть. Спасибо за entities - нашел в доке интересное!

Alexey Skobkin

@strizhechenko @shuro @supportfireman
Это ж не либа, а часть Telegram Bot API.

[DATA EXPUNGED]
Alexey Skobkin

@strizhechenko @supportfireman @shuro
Чо склеивает? Там же, ЕМНИП, сущности отдельно от сырого текста идут.

Go Up