Наверняка вы замечали баг в Телеграме. Написал сообщение, поправил разметку, а она поехала (см. картинку). Выделил болдом одно, а оказалось помечено другое. То же самое с моноширинным текстом. Ну а самая печаль — разметка кода. Иногда так плывет, что проще удалить сообщение и разместить по-новой.

Дело в том, как передается разметка в Телеграме. Многие полагают, что в нем маркдаун, но на самом деле это не так. Телеграм может принимать маркдаун от ботов, но разметка приводится ко внутреннему виду, примерно такому:

{:message "Welcome back, Ivan Grishaev!",
 :entities
 [{:type :text_mention,
   :offset 14,
   :length 13,
   :user {:id 100500 :nickname "igrishaev"}}]}

Смысл в том, что есть сообщение и набор размеченных зон. Каждая зона знает смещение в символах и длину (поля offset и length). У зоны есть тип и дополнительные параметры, которые влияют на рендер. В примере выше слова “Ivan Grishaev” будут выглядеть как ссылка на пользователя с нужными атрибутами.

У этой системы следствие: если поправить текст, смещения зон должны быть скорректированы. Например, я поменял Welcome back на просто Welcome. Пропали пять символов, и смещения всех зон должны уменьшится на 5. На простых случаях это работает, но когда зон много (болды, италики и прочее), что-то идет не так. Возможно, виноват многострочный код: он как-то оптимизируется, а смещения зон не принимают его во внимание.

Если бы в Телеграме была система тегов вроде markdown или xml/html, такой проблемы бы не было. Братьям Дуровым, конечно, виднее, но я тоже могу высказаться.