diff --git a/post_parser.py b/post_parser.py index 6fbe494..e4e2dee 100644 --- a/post_parser.py +++ b/post_parser.py @@ -172,8 +172,16 @@ class PostParser: # Process long strings cut_at = 37 - if len(first_line) > cut_at: return f"{first_line[:cut_at]}..." - + max_extra_chars = 15 + if len(first_line) > cut_at: + # Find the next space after cut_at, but not more than 15 chars forward + extended_cut = cut_at + for i in range(cut_at, min(cut_at + max_extra_chars, len(first_line))): + extended_cut = i + if first_line[i] == ' ': + break + return f"{first_line[:extended_cut]}..." + return first_line # Process media content diff --git a/tests/test_post_parser.py b/tests/test_post_parser.py index 1474453..b9f3df5 100644 --- a/tests/test_post_parser.py +++ b/tests/test_post_parser.py @@ -116,13 +116,20 @@ class TestPostParserGenerateTitle(unittest.TestCase): def test_generate_title_long_text_trimming(self): long_text = "This is a very long line of text that definitely exceeds the maximum length allowed for a title, so it should be trimmed intelligently at the last space before the limit." message = self._create_mock_message(text=long_text) - expected_title = "This is a very long line of text that..." #cut at 30 symbols + expected_title = "This is a very long line of text that..." #cut at 37 + self.assertEqual(self.parser._generate_title(message), expected_title) + + def test_generate_title_break_word_after_limit(self): + # Test with a specific text example from the user's query + text = "На прошлой неделе предложил своим подписчикам рассказать, как бы они хотели улучшить функциональность государственного сервиса" + message = self._create_mock_message(text=text) + expected_title = "На прошлой неделе предложил своим подписчикам..." self.assertEqual(self.parser._generate_title(message), expected_title) def test_generate_title_long_text_no_space_trimming(self): long_text = "Thisisaverylonglineoftextthatdefinitelyexceedsthemaximumlengthallowedforatitlesoitshouldbetrimmedatthelimitbecausehasnospaces." message = self._create_mock_message(text=long_text) - expected_title = "Thisisaverylonglineoftextthatdefinite..." #cut at 30 symbols + expected_title = "Thisisaverylonglineoftextthatdefinitelyexceedsthema..." #cut at 30+15 symbols without space self.assertEqual(self.parser._generate_title(message), expected_title) def test_generate_title_text_with_only_html_and_urls(self):