Таблица в code-блоке: 3 колонки, 2 строки на пару, влезает на телефон

Формат:
#  │ Игрок                  │ О
───┼────────────────────────┼────
1  │ Мармылев Александр Д.  │ 4.0
   │ Нестеров Мирон А.      │ 4.0

Внутри code-блока MarkdownV2 не нужен (literal text).
This commit is contained in:
Roman Vrubel 2026-06-14 21:03:59 +00:00
parent a17e21c983
commit 70ff9bfc4b

View file

@ -44,14 +44,39 @@ def _md_escape(text: str) -> str:
return ''.join(result) return ''.join(result)
def _display_width(s: str) -> int:
w = 0
for ch in s:
cp = ord(ch)
if (0x0400 <= cp <= 0x04FF or 0x0500 <= cp <= 0x052F or
0x2E80 <= cp <= 0x9FFF or 0xF900 <= cp <= 0xFAFF or
0xFE30 <= cp <= 0xFE4F):
w += 2
else:
w += 1
return w
def _pad_col(s: str, width: int) -> str:
cur = _display_width(s)
if cur >= width:
return s
return s + ' ' * (width - cur)
def format_pairings(pairings_data: dict, tournament_name: str) -> str: def format_pairings(pairings_data: dict, tournament_name: str) -> str:
pairings = pairings_data['pairings'] pairings = pairings_data['pairings']
rnd = pairings_data['round'] rnd = pairings_data['round']
w_name, w_pts = 28, 5
border = '─┼─'.join('' * w for w in [4, w_name, w_pts])
lines = [ lines = [
f'*{_md_escape(tournament_name)}*', f'*{_md_escape(tournament_name)}*',
f'📋 *Тур {rnd}* — пары', f'📋 *Тур {rnd}* — пары',
'', '',
'```',
f'{_pad_col("#", 4)}{_pad_col("Игрок", w_name)}{_pad_col("О", w_pts)}',
border,
] ]
board = 1 board = 1
@ -61,7 +86,14 @@ def format_pairings(pairings_data: dict, tournament_name: str) -> str:
p1, p2, color = pairing p1, p2, color = pairing
if color == 'bye': if color == 'bye':
lines.append(f'{board}\\. {_md_escape(p1.name)} — BYE') lines.append(
f'{_pad_col(str(board), 4)}{_pad_col(p1.name, w_name)}'
f'{_pad_col(str(p1.points), w_pts)}'
)
lines.append(
f'{_pad_col("", 4)}{_pad_col("— BYE —", w_name)}'
f'{_pad_col("", w_pts)}'
)
board += 1 board += 1
continue continue
@ -71,15 +103,17 @@ def format_pairings(pairings_data: dict, tournament_name: str) -> str:
white, black = p2, p1 white, black = p2, p1
lines.append( lines.append(
f'{board}\\. {_md_escape(white.name)} ' f'{_pad_col(str(board), 4)}{_pad_col(white.name, w_name)} '
f'\\({_md_escape(f"{white.points:.1f}")}\\)' f'{_pad_col(f"{white.points:.1f}", w_pts)}'
) )
lines.append( lines.append(
f' {_md_escape(black.name)} ' f'{_pad_col("", 4)}{_pad_col(black.name, w_name)} '
f'\\({_md_escape(f"{black.points:.1f}")}\\)' f'{_pad_col(f"{black.points:.1f}", w_pts)}'
) )
board += 1 board += 1
lines.append('```')
source = pairings_data.get('source', 'algorithm') source = pairings_data.get('source', 'algorithm')
if source == 'bbp_pairings_fide_2025': if source == 'bbp_pairings_fide_2025':
lines.append('\n_FIDE 2025 \(bbpPairings\)_') lines.append('\n_FIDE 2025 \(bbpPairings\)_')