Refactor title generation to remove punctuation

This commit is contained in:
vvzvlad
2025-04-09 03:07:12 +03:00
parent c78d8c93f6
commit c730d5bb7f
2 changed files with 81 additions and 3 deletions
+4 -2
View File
@@ -163,7 +163,7 @@ class PostParser:
# Process line breaks - take only the first line
first_line = clean_text.split('\n', 1)[0]
first_line = re.sub(r'\.$', '', first_line) #Remove dot
first_line = re.sub(r'[.,;:]+$', '', first_line) #Remove dot
first_line = first_line.strip()
# Handle uppercase text - convert to title case if the text is all uppercase
@@ -180,7 +180,9 @@ class PostParser:
extended_cut = i
if first_line[i] == ' ':
break
return f"{first_line[:extended_cut]}..."
title = f"{first_line[:extended_cut]}"
title = re.sub(r'[.,;:]+$', '', title)
return f"{title}..."
return first_line
+77 -1
View File
@@ -91,7 +91,7 @@ class TestPostParserGenerateTitle(unittest.TestCase):
def test_generate_title_text_with_url_and_text(self):
message = self._create_mock_message(text="Check out this link: https://example.com")
self.assertEqual(self.parser._generate_title(message), "Check out this link:") # URL is stripped
self.assertEqual(self.parser._generate_title(message), "Check out this link") # URL is stripped
def test_generate_title_text_only_url(self):
message = self._create_mock_message(text="https://example.com")
@@ -191,5 +191,81 @@ class TestPostParserGenerateTitle(unittest.TestCase):
message = self._create_mock_message(web_page=web_page_mock) # Text is whitespace only
self.assertEqual(self.parser._generate_title(message), "🔗 Web page title")
def test_generate_title_punctuation_removal(self):
"""Test removing punctuation marks from the end of titles."""
test_cases = {
# Одиночные символы
"Привет.": "Привет",
"Привет,": "Привет",
"Привет;": "Привет",
"Привет:": "Привет",
"Привет!": "Привет!",
# Комбинация символов
"Привет...": "Привет",
"Привет.,;:": "Привет",
"Привет.!": "Привет.!",
"Строка.....": "Строка",
# Символы не в конце не должны удаляться
"При.вет": "При.вет",
"При,вет": "При,вет",
"При;вет": "При;вет",
"При:вет": "При:вет",
"При!вет": "При!вет",
"При\"вет": "При\"вет",
"При'вет": "При'вет",
"Привет": "Привет",
# Строки с пробелами после пунктуации
"Привет. ": "Привет",
"Привет, ": "Привет",
# Языки
"Привет на русском.": "Привет на русском",
"Hello.": "Hello",
"Hello,": "Hello",
"Привіт українською.": "Привіт українською",
"Hola en español.": "Hola en español",
# Цифры
"Число 123.": "Число 123",
# Многострочный текст
"Привет.\nКак дела?": "Привет",
# Сложные случаи с кавычками
"Текст с \"кавычками внутри\".": "Текст с \"кавычками внутри\"",
"Текст с 'одинарными' кавычками.": "Текст с 'одинарными' кавычками",
"Текст с \"вложенными 'кавычками'\".": "Текст с \"вложенными 'кавычками'\"",
"Цитата: \"Это цитата.\".": "Цитата: \"Это цитата.\"",
# Специальные случаи
"Предложение с восклицанием!": "Предложение с восклицанием!",
"Предложение с вопросом?": "Предложение с вопросом?",
"Эллипсис...": "Эллипсис",
"Конец текста.,;:": "Конец текста",
"Много точек....": "Много точек",
"Разные знаки.,;": "Разные знаки",
# Реальные примеры
"Анонс конференции:": "Анонс конференции",
"Новый релиз v1.0!": "Новый релиз v1.0!",
"Важная информация!!!": "Важная информация!!!",
"Автор сказал: \"Это важно\".": "Автор сказал: \"Это важно\"",
"Код программы: function() { return true; }": "Код программы: function() { return true...",
# Проверяем краевые случаи
"Статья...": "Статья",
"Вопросы и ответы.": "Вопросы и ответы",
"Конец,": "Конец",
}
for input_text, expected_output in test_cases.items():
message = self._create_mock_message(text=input_text)
title = self.parser._generate_title(message)
self.assertEqual(title, expected_output, f"Ошибка при обработке '{input_text}': получено '{title}', ожидалось '{expected_output}'")
if __name__ == '__main__':
unittest.main()