Таблица: ширина колонки — по самой длинной фамилии +3 пробела, разделители между парами

- w_name вычисляется динамически (max + 3, до 42)
- Горизонтальная линия (───┼───┼───) между каждой парой
This commit is contained in:
Roman Vrubel 2026-06-14 21:08:04 +00:00
parent 70ff9bfc4b
commit 6bb1d238aa

View file

@ -67,31 +67,45 @@ def _pad_col(s: str, width: int) -> str:
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]) # Find the longest player name + 3 spaces padding
max_name_w = 20
for pairing in pairings:
if len(pairing) == 3:
for p in (pairing[0], pairing[1]):
w = _display_width(p.name)
if w > max_name_w:
max_name_w = w
max_name_w = min(max_name_w + 3, 42)
w_board, w_pts = 4, 5
border = '─┼─'.join('' * w for w in [w_board, max_name_w, 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)}', f'{_pad_col("#", w_board)}{_pad_col("Игрок", max_name_w)}'
f'{_pad_col("О", w_pts)}',
border, border,
] ]
board = 1 board = 1
for pairing in pairings: for pi, pairing in enumerate(pairings):
if len(pairing) != 3: if len(pairing) != 3:
continue continue
p1, p2, color = pairing p1, p2, color = pairing
if color == 'bye': if color == 'bye':
lines.append( lines.append(
f'{_pad_col(str(board), 4)}{_pad_col(p1.name, w_name)}' f'{_pad_col(str(board), w_board)}'
f'{_pad_col(p1.name, max_name_w)}'
f'{_pad_col(str(p1.points), w_pts)}' f'{_pad_col(str(p1.points), w_pts)}'
) )
lines.append( lines.append(
f'{_pad_col("", 4)}{_pad_col("— BYE —", w_name)}' f'{_pad_col("", w_board)}'
f'{_pad_col("— BYE —", max_name_w)}'
f'{_pad_col("", w_pts)}' f'{_pad_col("", w_pts)}'
) )
board += 1 board += 1
@ -103,15 +117,23 @@ def format_pairings(pairings_data: dict, tournament_name: str) -> str:
white, black = p2, p1 white, black = p2, p1
lines.append( lines.append(
f'{_pad_col(str(board), 4)}{_pad_col(white.name, w_name)}' f'{_pad_col(str(board), w_board)}'
f'{_pad_col(white.name, max_name_w)}'
f'{_pad_col(f"{white.points:.1f}", w_pts)}' f'{_pad_col(f"{white.points:.1f}", w_pts)}'
) )
lines.append( lines.append(
f'{_pad_col("", 4)}{_pad_col(black.name, w_name)}' f'{_pad_col("", w_board)}'
f'{_pad_col(black.name, max_name_w)}'
f'{_pad_col(f"{black.points:.1f}", w_pts)}' f'{_pad_col(f"{black.points:.1f}", w_pts)}'
) )
board += 1 board += 1
# Separator between pairs
if pi < len(pairings) - 1:
next_p = pairings[pi + 1]
if len(next_p) == 3 and next_p[2] != 'bye':
lines.append(border)
lines.append('```') lines.append('```')
source = pairings_data.get('source', 'algorithm') source = pairings_data.get('source', 'algorithm')