import { type ParseMode } from "https://dotland.deno.dev/x/grammy@v1.15.2/types.ts";
The Bot API supports basic formatting for messages. You can use bold, italic, underlined, strikethrough, and spoiler text, as well as inline links and pre-formatted code in your bots' messages. Telegram clients will render them accordingly. You can use either markdown-style or HTML-style formatting.
Note that Telegram clients will display an*alert** to the user before opening an inline link ('Open this link?' together with the full URL).
Message entities can be nested, providing following restrictions are met:
- If two entities have common characters, then one of them is fully contained inside another.
- bold, italic, underline, strikethrough, and spoiler entities can contain and can be part of any other entities, except pre and code.
- All other entities can't contain each other.
Links tg://user?id=<user_id>
can be used to mention a user by their ID without using a username. Please note:
- These links will work only if they are used inside an inline link or in an inline keyboard button. For example, they will not work, when used in a message text.
- Unless the user is a member of the chat where they were mentioned, these mentions are only guaranteed to work if the user has contacted the bot in private in the past or has sent a callback query to the bot via an inline button and doesn't have Forwarded Messages privacy enabled for the bot.
MarkdownV2 style
To use this mode, passMarkdownV2* in the parse_mode field. Use the following syntax in your message:
bold \*text*
_italic \text_
__underline__
~strikethrough~
||spoiler||
bold _italic bold ~italic bold strikethrough ||italic bold strikethrough spoiler||~ __underline italic bold___ bold*
[inline URL](http://www.example.com/)
[inline mention of a user](tg://user?id=123456789)
`inline fixed-width code`
```
pre-formatted fixed-width code block
```
```python
pre-formatted fixed-width code block written in the Python programming language
```
Please note:
- Any character with code between 1 and 126 inclusively can be escaped anywhere with a preceding '' character, in which case it is treated as an ordinary character and not a part of the markup. This implies that '' character usually must be escaped with a preceding '' character.
- Inside
pre
andcode
entities, all '`' and '' characters must be escaped with a preceding '' character. - Inside
(...)
part of inline link definition, all ')' and '' must be escaped with a preceding '' character. - In all other places characters '_', '', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!' must be escaped with the preceding character ''.
- In case of ambiguity between
italic
andunderline
entities__
is always greadily treated from left to right as beginning or end ofunderline
entity, so instead of___italic underline___
use___italic underline_\r__
, where\r
is a character with code 13, which will be ignored.
HTML style
To use this mode, passHTML* in the parse_mode field. The following tags are currently supported:
<b>bold</b>, <strong>bold</strong>
<i>italic</i>, <em>italic</em>
<u>underline</u>, <ins>underline</ins>
<s>strikethrough</s>, <strike>strikethrough</strike>, <del>strikethrough</del>
<span class="tg-spoiler">spoiler</span>, <tg-spoiler>spoiler</tg-spoiler>
<b>bold <i>italic bold <s>italic bold strikethrough <span class="tg-spoiler">italic bold strikethrough spoiler</span></s> <u>underline italic bold</u></i> bold</b>
<a href="http://www.example.com/">inline URL</a>
<a href="tg://user?id=123456789">inline mention of a user</a>
<code>inline fixed-width code</code>
<pre>pre-formatted fixed-width code block</pre>
<pre><code class="language-python">pre-formatted fixed-width code block written in the Python programming language</code></pre>
Please note:
- Only the tags mentioned above are currently supported.
- All
<
,>
and&
symbols that are not a part of a tag or an HTML entity must be replaced with the corresponding HTML entities (<
with<
,>
with>
and&
with&
). - All numerical HTML entities are supported.
- The API currently supports only the following named HTML entities:
<
,>
,&
and"
. - Use nested
pre
andcode
tags, to define programming language for pre entity. - Programming language can't be specified for standalone
code
tags.
Markdown style
This is a legacy mode, retained for backward compatibility. To use this mode, passMarkdown* in the parse_mode field. Use the following syntax in your message:
bold text*
_italic text_
[inline URL](http://www.example.com/)
[inline mention of a user](tg://user?id=123456789)
`inline fixed-width code`
```
pre-formatted fixed-width code block
```
```python
pre-formatted fixed-width code block written in the Python programming language
```
Please note:
- Entities must not be nested, use parse mode MarkdownV2 instead.
- There is no way to specify underline and strikethrough entities, use parse mode MarkdownV2 instead.
- To escape characters '_', '', '`', '[' outside of an entity, prepend the characters '' before them.
- Escaping inside entities is not allowed, so entity must be closed first and reopened again: use
_snake_\__case_
for italicsnake_case
and2*\**2=4*
for bold2*2=4
.