57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
"""Утилиты для парсинга данных."""
|
|
from typing import Dict, Any, List, Set
|
|
import re
|
|
from urllib.parse import urlparse
|
|
|
|
def extract_variables(text: str) -> Set[str]:
|
|
"""Извлекает переменные из шаблона."""
|
|
if not text:
|
|
return set()
|
|
return set(re.findall(r'\{([^}]+)\}', text))
|
|
|
|
def validate_url(url: str) -> bool:
|
|
"""Проверяет валидность URL."""
|
|
try:
|
|
parsed = urlparse(url)
|
|
return bool(parsed.scheme and parsed.netloc)
|
|
except Exception:
|
|
return False
|
|
|
|
def parse_key_value_lines(text: str) -> Dict[str, Any]:
|
|
"""Парсинг клавиатуры из текста формата 'текст = ссылка'."""
|
|
keyboard = {"rows": []}
|
|
current_row = []
|
|
|
|
lines = text.strip().split('\n')
|
|
for line in lines:
|
|
line = line.strip()
|
|
if not line:
|
|
continue
|
|
|
|
if line == "---":
|
|
if current_row:
|
|
keyboard["rows"].append(current_row)
|
|
current_row = []
|
|
continue
|
|
|
|
parts = line.split('=', 1)
|
|
if len(parts) != 2:
|
|
raise ValueError(f"Неверный формат строки: {line}")
|
|
|
|
text, url = parts[0].strip(), parts[1].strip()
|
|
|
|
# Проверка URL
|
|
try:
|
|
parsed = urlparse(url)
|
|
if not parsed.scheme or not parsed.netloc:
|
|
raise ValueError(f"Некорректный URL: {url}")
|
|
except Exception:
|
|
raise ValueError(f"Некорректный URL: {url}")
|
|
|
|
current_row.append({"text": text, "url": url})
|
|
|
|
if current_row:
|
|
keyboard["rows"].append(current_row)
|
|
|
|
return keyboard
|