import json
import re
import pandas as pd
# Шаблон HTML (встроен в код)
html_template = '''
'''
# Маппинг для сокращения дней недели
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)