Top.Mail.Ru
import json import re import pandas as pd # Шаблон HTML (встроен в код) html_template = '''

Мероприятия пространства SPACE с 13.01 по 18.01.2024

SPACE Pass
''' # Маппинг для сокращения дней недели weekday_short = { 'Понедельник': 'Пн', 'Вторник': 'Вт', 'Среда': 'Ср', 'Четверг': 'Чт', 'Пятница': 'Пт', 'Суббота': 'Сб', 'Воскресенье': 'Вс' } # Дефолтная ссылка на изображение DEFAULT_IMAGE_URL = 'https://api.elskrugi.ru/static/avatars/activity.png' # Получаем уникальные дни с мероприятиями, отсортированные по дате unique_days = events[['weekday', 'start_date_page', 'start_date']].drop_duplicates() unique_days = unique_days.sort_values('start_date').reset_index(drop=True) # Генерируем кнопки дней day_buttons_html = [] for idx, row in unique_days.iterrows(): weekday_short_name = weekday_short.get(row['weekday'], row['weekday'][:2]) day_value = f"{weekday_short_name}, {row['start_date_page']}" active_class = " active" if idx == 0 else "" day_buttons_html.append(f''' ''') day_buttons_html_str = ''.join(day_buttons_html) # Формируем JavaScript массив событий events_js_list = [] for _, row in events.iterrows(): weekday_short_name = weekday_short.get(row['weekday'], row['weekday'][:2]) day_value = f"{weekday_short_name}, {row['start_date_page']}" # Определяем формат для отображения if pd.isna(row['city']) or row['city'] is None or str(row['city']).strip() == '': format_display = 'Онлайн' else: format_display = f"Офлайн • {row['city']}" # Определяем изображение: если image_link пустой/NaN, используем дефолтную ссылку if pd.notna(row['image_link']) and str(row['image_link']).strip() != '': image_url = str(row['image_link']).strip() else: image_url = DEFAULT_IMAGE_URL event_dict = { 'id': str(row['event_id']), 'title': str(row['name']), 'date': str(row['start_date_page']), 'day': day_value, 'format': str(row['format']).lower() if pd.notna(row['format']) else 'online', 'city': str(row['city']) if pd.notna(row['city']) else None, 'pass_status': int(row['pass_status']) if pd.notna(row['pass_status']) else 0, 'image': image_url, 'link': str(row['link']) if pd.notna(row['link']) else '#' } events_js_list.append(event_dict) # Преобразуем в JSON для JavaScript events_js_json = json.dumps(events_js_list, ensure_ascii=False, indent=12) # Определяем первый день для активной кнопки first_day = unique_days.iloc[0] first_day_short = weekday_short.get(first_day['weekday'], first_day['weekday'][:2]) first_day_value = f"{first_day_short}, {first_day['start_date_page']}" # Заменяем заголовок html_template = html_template.replace( 'Мероприятия пространства SPACE с 13.01 по 18.01.2024', f'Мероприятия пространства SPACE {date_range_text}' ) # Заменяем кнопки дней days_pattern = r'
.*?
' days_replacement = f'
{day_buttons_html_str}\n
' html_template = re.sub(days_pattern, days_replacement, html_template, flags=re.DOTALL) # Заменяем массив событий в JavaScript mock_events_pattern = r'const mockEvents = \[.*?\];' mock_events_replacement = f'const mockEvents = {events_js_json};' html_template = re.sub(mock_events_pattern, mock_events_replacement, html_template, flags=re.DOTALL) # Обновляем начальное состояние фильтров (первый день) filters_pattern = r'selectedDay: "Пн, 13\.01"' filters_replacement = f'selectedDay: "{first_day_value}"' html_template = re.sub(filters_pattern, filters_replacement, html_template) # Выводим результат print("HTML код готов для копирования в Tilda!") print("\n" + "="*80 + "\n") print(html_template)
Made on
Tilda