85 lines
3.5 KiB
Python
85 lines
3.5 KiB
Python
"""
|
||
Утилиты форматирования данных для Telegram
|
||
"""
|
||
|
||
|
||
def get_us_state_name(state_code: str) -> str:
|
||
"""
|
||
Конвертирует двухбуквенный код штата США в полное название
|
||
"""
|
||
states = {
|
||
'AL': 'Alabama', 'AK': 'Alaska', 'AZ': 'Arizona', 'AR': 'Arkansas', 'CA': 'California',
|
||
'CO': 'Colorado', 'CT': 'Connecticut', 'DE': 'Delaware', 'FL': 'Florida', 'GA': 'Georgia',
|
||
'HI': 'Hawaii', 'ID': 'Idaho', 'IL': 'Illinois', 'IN': 'Indiana', 'IA': 'Iowa',
|
||
'KS': 'Kansas', 'KY': 'Kentucky', 'LA': 'Louisiana', 'ME': 'Maine', 'MD': 'Maryland',
|
||
'MA': 'Massachusetts', 'MI': 'Michigan', 'MN': 'Minnesota', 'MS': 'Mississippi', 'MO': 'Missouri',
|
||
'MT': 'Montana', 'NE': 'Nebraska', 'NV': 'Nevada', 'NH': 'New Hampshire', 'NJ': 'New Jersey',
|
||
'NM': 'New Mexico', 'NY': 'New York', 'NC': 'North Carolina', 'ND': 'North Dakota', 'OH': 'Ohio',
|
||
'OK': 'Oklahoma', 'OR': 'Oregon', 'PA': 'Pennsylvania', 'RI': 'Rhode Island', 'SC': 'South Carolina',
|
||
'SD': 'South Dakota', 'TN': 'Tennessee', 'TX': 'Texas', 'UT': 'Utah', 'VT': 'Vermont',
|
||
'VA': 'Virginia', 'WA': 'Washington', 'WV': 'West Virginia', 'WI': 'Wisconsin', 'WY': 'Wyoming',
|
||
'DC': 'District of Columbia'
|
||
}
|
||
return states.get(state_code.upper(), state_code)
|
||
|
||
|
||
def format_sale_date(date_str: str) -> str:
|
||
"""
|
||
Форматирует дату продажи из MM/YYYY в красивый формат
|
||
"""
|
||
if not date_str or date_str == 'None' or '/' not in date_str:
|
||
return "Unknown"
|
||
|
||
try:
|
||
month, year = date_str.split('/')
|
||
months = {
|
||
'1': 'January', '2': 'February', '3': 'March', '4': 'April',
|
||
'5': 'May', '6': 'June', '7': 'July', '8': 'August',
|
||
'9': 'September', '10': 'October', '11': 'November', '12': 'December'
|
||
}
|
||
month_name = months.get(month.lstrip('0'), month)
|
||
return f"{month_name} {year}"
|
||
except:
|
||
return date_str
|
||
|
||
|
||
def parse_location(location_str: str) -> str:
|
||
r"""
|
||
Парсит и форматирует локацию из формата ST/TOWN или ST\TOWN
|
||
"""
|
||
if not location_str or location_str == 'None':
|
||
return "Unknown Location"
|
||
|
||
try:
|
||
# Проверяем оба варианта разделителей: / и \
|
||
if '/' in location_str:
|
||
state_code, city = location_str.split('/', 1)
|
||
state_name = get_us_state_name(state_code.strip())
|
||
city_formatted = city.strip().title()
|
||
return f"{city_formatted}, {state_name}"
|
||
elif '\\' in location_str:
|
||
state_code, city = location_str.split('\\', 1)
|
||
state_name = get_us_state_name(state_code.strip())
|
||
city_formatted = city.strip().title()
|
||
return f"{city_formatted}, {state_name}"
|
||
else:
|
||
return location_str
|
||
except:
|
||
return location_str
|
||
|
||
|
||
def escape_markdown(text: str) -> str:
|
||
"""
|
||
Экранирует специальные символы Markdown для безопасной отправки в Telegram
|
||
"""
|
||
if not text:
|
||
return ""
|
||
|
||
# Символы которые нужно экранировать для Markdown
|
||
escape_chars = ['*', '_', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!']
|
||
|
||
escaped_text = str(text)
|
||
for char in escape_chars:
|
||
escaped_text = escaped_text.replace(char, f'\\{char}')
|
||
|
||
return escaped_text |