aiogram/aiogram/utils/markdown.py
Andrew df7b16d5b3
Some checks failed
Tests / tests (macos-latest, 3.10) (push) Has been cancelled
Tests / tests (macos-latest, 3.11) (push) Has been cancelled
Tests / tests (macos-latest, 3.12) (push) Has been cancelled
Tests / tests (macos-latest, 3.13) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.10) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.11) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.12) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.13) (push) Has been cancelled
Tests / tests (windows-latest, 3.10) (push) Has been cancelled
Tests / tests (windows-latest, 3.11) (push) Has been cancelled
Tests / tests (windows-latest, 3.12) (push) Has been cancelled
Tests / tests (windows-latest, 3.13) (push) Has been cancelled
Tests / pypy-tests (macos-latest, pypy3.10) (push) Has been cancelled
Tests / pypy-tests (macos-latest, pypy3.11) (push) Has been cancelled
Tests / pypy-tests (ubuntu-latest, pypy3.10) (push) Has been cancelled
Tests / pypy-tests (ubuntu-latest, pypy3.11) (push) Has been cancelled
EOL of Py3.9 (#1726)
* Drop py3.9 and pypy3.9

Add pypy3.11 (testing) into `tests.yml`

Remove py3.9 from matrix in `tests.yml`

Refactor not auto-gen code to be compatible with py3.10+, droping ugly 3.9 annotation.

Replace some `from typing` imports to `from collections.abc`, due to deprecation

Add `from __future__ import annotations` and `if TYPE_CHECKING:` where possible

Add some `noqa` to calm down Ruff in some places, if Ruff will be used as default linting+formatting tool in future

Replace some relative imports to absolute

Sort `__all__` tuples in `__init__.py` and some other `.py` files

Sort `__slots__` tuples in classes

Split raises into `msg` and `raise` (`EM101`, `EM102`) to not duplicate error message in the traceback

Add `Self` from `typing_extenstion` where possible

Resolve typing problem in `aiogram/filters/command.py:18`

Concatenate nested `if` statements

Convert `HandlerContainer` into a dataclass in `aiogram/fsm/scene.py`

Bump tests docker-compose.yml `redis:6-alpine` -> `redis:8-alpine`

Bump tests docker-compose.yml `mongo:7.0.6` -> `mongo:8.0.14`

Bump pre-commit-config `black==24.4.2` -> `black==25.9.0`

Bump pre-commit-config `ruff==0.5.1` -> `ruff==0.13.3`

Update Makefile lint for ruff to show fixes

Add `make outdated` into Makefile

Use `pathlib` instead of `os.path`

Bump `redis[hiredis]>=5.0.1,<5.3.0` -> `redis[hiredis]>=6.2.0,<7`

Bump `cryptography>=43.0.0` -> `cryptography>=46.0.0` due to security reasons

Bump `pytz~=2023.3` -> `pytz~=2025.2`

Bump `pycryptodomex~=3.19.0` -> `pycryptodomex~=3.23.0` due to security reasons

Bump linting and formatting tools

* Add `1726.removal.rst`

* Update aiogram/utils/dataclass.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update aiogram/filters/callback_data.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update 1726.removal.rst

* Remove `outdated` from Makefile

* Add `__slots__` to `HandlerContainer`

* Remove unused imports

* Add `@dataclass` with `slots=True` to `HandlerContainer`

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-06 19:19:23 +03:00

209 lines
4.4 KiB
Python

from typing import Any
from .text_decorations import html_decoration, markdown_decoration
def _join(*content: Any, sep: str = " ") -> str:
return sep.join(map(str, content))
def text(*content: Any, sep: str = " ") -> str:
"""
Join all elements with a separator
:param content:
:param sep:
:return:
"""
return _join(*content, sep=sep)
def bold(*content: Any, sep: str = " ") -> str:
"""
Make bold text (Markdown)
:param content:
:param sep:
:return:
"""
return markdown_decoration.bold(value=markdown_decoration.quote(_join(*content, sep=sep)))
def hbold(*content: Any, sep: str = " ") -> str:
"""
Make bold text (HTML)
:param content:
:param sep:
:return:
"""
return html_decoration.bold(value=html_decoration.quote(_join(*content, sep=sep)))
def italic(*content: Any, sep: str = " ") -> str:
"""
Make italic text (Markdown)
:param content:
:param sep:
:return:
"""
return markdown_decoration.italic(value=markdown_decoration.quote(_join(*content, sep=sep)))
def hitalic(*content: Any, sep: str = " ") -> str:
"""
Make italic text (HTML)
:param content:
:param sep:
:return:
"""
return html_decoration.italic(value=html_decoration.quote(_join(*content, sep=sep)))
def code(*content: Any, sep: str = " ") -> str:
"""
Make mono-width text (Markdown)
:param content:
:param sep:
:return:
"""
return markdown_decoration.code(value=markdown_decoration.quote(_join(*content, sep=sep)))
def hcode(*content: Any, sep: str = " ") -> str:
"""
Make mono-width text (HTML)
:param content:
:param sep:
:return:
"""
return html_decoration.code(value=html_decoration.quote(_join(*content, sep=sep)))
def pre(*content: Any, sep: str = "\n") -> str:
"""
Make mono-width text block (Markdown)
:param content:
:param sep:
:return:
"""
return markdown_decoration.pre(value=markdown_decoration.quote(_join(*content, sep=sep)))
def hpre(*content: Any, sep: str = "\n") -> str:
"""
Make mono-width text block (HTML)
:param content:
:param sep:
:return:
"""
return html_decoration.pre(value=html_decoration.quote(_join(*content, sep=sep)))
def underline(*content: Any, sep: str = " ") -> str:
"""
Make underlined text (Markdown)
:param content:
:param sep:
:return:
"""
return markdown_decoration.underline(value=markdown_decoration.quote(_join(*content, sep=sep)))
def hunderline(*content: Any, sep: str = " ") -> str:
"""
Make underlined text (HTML)
:param content:
:param sep:
:return:
"""
return html_decoration.underline(value=html_decoration.quote(_join(*content, sep=sep)))
def strikethrough(*content: Any, sep: str = " ") -> str:
"""
Make strikethrough text (Markdown)
:param content:
:param sep:
:return:
"""
return markdown_decoration.strikethrough(
value=markdown_decoration.quote(_join(*content, sep=sep)),
)
def hstrikethrough(*content: Any, sep: str = " ") -> str:
"""
Make strikethrough text (HTML)
:param content:
:param sep:
:return:
"""
return html_decoration.strikethrough(value=html_decoration.quote(_join(*content, sep=sep)))
def link(title: str, url: str) -> str:
"""
Format URL (Markdown)
:param title:
:param url:
:return:
"""
return markdown_decoration.link(value=markdown_decoration.quote(title), link=url)
def hlink(title: str, url: str) -> str:
"""
Format URL (HTML)
:param title:
:param url:
:return:
"""
return html_decoration.link(value=html_decoration.quote(title), link=url)
def blockquote(*content: Any, sep: str = "\n") -> str:
"""
Make blockquote (Markdown)
:param content:
:param sep:
:return:
"""
return markdown_decoration.blockquote(
value=markdown_decoration.quote(_join(*content, sep=sep)),
)
def hblockquote(*content: Any, sep: str = "\n") -> str:
"""
Make blockquote (HTML)
:param content:
:param sep:
:return:
"""
return html_decoration.blockquote(value=html_decoration.quote(_join(*content, sep=sep)))
def hide_link(url: str) -> str:
"""
Hide URL (HTML only)
Can be used for adding an image to a text message
:param url:
:return:
"""
return f'<a href="{url}">&#8203;</a>'