В Телеграме появилась подсветка синтаксиса, и она бесит
В новом обновлении Телеграма появилась подсветка синтаксиса кода внутри сообщений. Сейчас я покажу, как она выглядит, поругаю Телеграм, а ещё объясню, как мы использовали эту фичу за месяцы до её появления.
Вчера вышло обновление Телеграма с кучей новых фич для форматирования сообщений: цитатами, ответами на сообщения из других чатов и всем таким.
Теперь можно подсвечивать синтаксис в блоках кода:
И хотя обновления уже вышли и под Андроид, и под Айос, и под десктоп, обновиться на Линуксе вы сейчас вряд ли сможете. Новые версии Телеграма во всех репозиториях появляются с задержкой, к сожалению.
Как подсветить синтаксис
Короткий ответ: танцуя с бубном.
Во-первых, как и в маркдауне, в Телеграме есть два вида моноширинного текста: просто кусочком текста и отдельным блоком.
До этого обновления оба вида отображались в приложениях почти одинаково. А теперь смотрите, какое оно разное: блок кода отображается прям прямоугольничком, и шрифт там меньше. Так вот, подсветка синтаксиса может быть только в блоке.
Но если вы будете писать сообщение, выделите текст, откроете меню форматирования и сделаете его моноширинным — так же, как сделали бы его жирным или наклонным — вы получите простой моноширинный текст, не блоком. Соответственно, никакой вам подсветки.
Сочетание клавиш на десктопе тоже непонятно как работают. Поэтому, чтобы сделать блок кода, вы должны пользоваться этим ужасным встроенным псевдомаркдауном —, а именно поставить вокруг кода по три обратных апострофа:
```
print('hello world')
```
Во-вторых, несмотря на то, что Телеграм недавно проводил очередной конкурс среди разработчиков на автоматическое определение языка кода, язык здесь не определяется. Вы должны явно указать его, как в том же маркдауне:
```python
print('hello world')
```
И вот тогда код наконец раскрасится в разные цвета.
А потом начинаются баги. Если отредактировать сообщение с блоком кода, то в начале кода может появиться пустая строчка. Отделить блок кода от следующего параграфа пустой строкой вы не сможете — по крайней мере, у меня на Андроиде не получилось. Написать ```
на Андроиде внутри кода тоже, например, не получится.
На самом деле подсветка синтаксиса была всегда
Сначала небольшое отступление.
Мы разрабатываем тгпай — инструмент для запуска Питона в Телеграм-сообщениях. Это работает так: вы отправляете код, он мгновенно выполняется на сервере, и результат появляется прямо в вашем сообщении.
В коде можно дёргать апи Телеграма и писать свои функции. Поэтому вы можете сделать функцию, которая, к примеру, ищет песню по названию и отправляет её в чат, откуда вы её вызвали. Но про магию тгпая я ещё как-нибудь расскажу в другой статье.
Так вот.
Если вы сейчас зайдёте в Телеграм и посмотрите на сообщения, которые пользователи отправляли через тгпай за последние полгода — вы увидите подсвеченный синтаксис Питона.
Наше приложение подсвечивало синтаксис, хотя Телеграм-клиенты это не показывали.
И подсвечивать синтаксис можно было уже много лет.
На стороне сервера эта фича есть так же долго, как и разметка сообщений в принципе. Уже лет семь — или сколько времени существует возможность сделать сообщение жирным или моноширинным? — можно помечать язык кода в сообщении. Просто до сих пор приложения это не использовали.
Теперь подсветку синтаксиса добавили в одном обновлении с другими изменениями внешнего вида сообщений: появилась возможность отвечать на цитаты из сообщений, настраивать превью ссылок, менять цвет своего имени и некоторые другие фичи.
Вот такое обновление
В целом это обновление улучшило UX мессенджера: меню настройки ответов, превью ссылок и пересылки сообщений стали единообразными и довольно удобными, а на плашки ответов и превью теперь кайфово тыкать.
Тем не менее в обновлениях последних лет Телеграм регулярно добавляет фичи в маркетинговых целях и где-нибудь их втыкает, только усложняя интерфейс.
А подсветка синтаксиса бесит :)
Если вы пишете бота, читайте про разметку сообщений в моём хендбуке. Я ещё не добавил туда информацию про виды разметки из последнего обновления, но зато там объясняется, как боты могут форматировать сообщения и упоминать пользователей по юзернеймам и без юзернеймов.