From a329b451227dd3487bc7ace08f303ba6a10a279a Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Fri, 17 Mar 2023 02:19:21 +0100 Subject: [PATCH] Update annotation spliting --- src/bots/approved_bot/modules/annotations.rs | 19 +++----- src/bots/approved_bot/modules/utils.rs | 50 ++++++++++++++++++++ 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/bots/approved_bot/modules/annotations.rs b/src/bots/approved_bot/modules/annotations.rs index a327c8d..7fb2dcb 100644 --- a/src/bots/approved_bot/modules/annotations.rs +++ b/src/bots/approved_bot/modules/annotations.rs @@ -17,7 +17,7 @@ use crate::bots::{ BotHandlerInternal, }; -use super::utils::{filter_command, CommandParse, GetPaginationCallbackData}; +use super::utils::{filter_command, CommandParse, GetPaginationCallbackData, split_text_to_chunks}; #[derive(Clone)] pub enum AnnotationCommand { @@ -138,7 +138,7 @@ impl AnnotationFormat for AuthorAnnotation { } fn is_normal_text(&self) -> bool { - self.text.replace('\n', "").replace(' ', "").len() != 0 + self.text.replace("\n", "").replace(' ', "").len() != 0 } } @@ -217,11 +217,8 @@ where return Ok(()); } - let chunked_text: Vec = textwrap::wrap(annotation.get_text(), 512) - .into_iter() - .filter(|text| text.replace('\r', "").len() != 0) - .map(|text| text.to_string()) - .collect(); + let annotation_text = annotation.get_text(); + let chunked_text = split_text_to_chunks(annotation_text, 512); let current_text = chunked_text.get(0).unwrap(); let callback_data = match command { @@ -272,11 +269,9 @@ where }; let page_index: usize = page.try_into().unwrap(); - let chunked_text: Vec = textwrap::wrap(annotation.get_text(), 512) - .into_iter() - .filter(|text| text.replace('\r', "").len() != 0) - .map(|text| text.to_string()) - .collect(); + + let annotation_text = annotation.get_text(); + let chunked_text = split_text_to_chunks(annotation_text, 512); let current_text = chunked_text.get(page_index - 1).unwrap(); let keyboard = generic_get_pagination_keyboard( diff --git a/src/bots/approved_bot/modules/utils.rs b/src/bots/approved_bot/modules/utils.rs index 2edd74a..7e15f79 100644 --- a/src/bots/approved_bot/modules/utils.rs +++ b/src/bots/approved_bot/modules/utils.rs @@ -112,3 +112,53 @@ where inline_keyboard: buttons, } } + +pub fn split_text_to_chunks(text: &str, width: usize) -> Vec { + let mut result: Vec = vec![]; + + let chunks = textwrap::wrap(text, 512) + .into_iter() + .filter(|text| text.replace('\r', "").len() != 0) + .map(|text| text.to_string()); + + let mut index = 0; + + for val in chunks { + if result.len() == index { + result.push(val); + continue; + } + + if result[index].len() + val.len() + 1 > width { + result.push(val); + index += 1; + continue; + } + + result[index] += &format!("\n{}", &val); + } + + result +} + +#[cfg(test)] +mod tests { + use crate::bots::approved_bot::modules::utils::split_text_to_chunks; + + #[test] + fn test_fix_annotation_text() { + let input = "\n Библиотека современной фантастики. Том 21\n Содержание:\n РОМАН И ПОВЕСТИ:\n Разбивая стеклянные двери… Предисловие В. Ревича\n Джон Бойнтон Пристли. Дженни Вильерс. Роман о театре. Перевод с английского В. Ашкенази\n Уильям Сароян. Тигр Тома Трейси. Повесть. Перевод с английского Р. Рыбкина\n Роберт Янг. Срубить дерево. Повесть. Перевод с английского С. Васильевой\n РАССКАЗЫ:\n Жан Рей. Рука Геца фон Берлихингена. Перевод с французского А. Григорьева\n Клод Легран. По мерке. Перевод с французского А. Григорьева\n Саке Комацу. Смерть Бикуни. Перевод с японского З. Рахима\n Ана Мария Матуте. Король Зеннов. Перевод с испанского Е. Любимовой\n Антонио Минготе. Николас. Перевод с испанского Р. Рыбкина\n Юн Бинг. Риестофер Юсеф. Перевод с норвежского Л. Жданова\n Гораций Голд. Чего стоят крылья. Перевод с английского Ф. Мендельсона\n Питер С. Бигл. Милости просим, леди Смерть! Перевод с английского Я. Евдокимовой\n Андре Майе. Как я стала писательницей. Перевод с французского Р. Рыбкина\n Джеймс Поллард. Заколдованный поезд. Перевод с английского Р. Рыбкина\n Рэй Брэдбери. Апрельское колдовство. Перевод с английского Л. Жданова\n Айзек Азимов. Небывальщина. Перевод с английского К. Сенина и В. Тальми\n Р.А. Лэфферти. Семь дней ужаса. Перевод с английского И. Почиталина\n Генри Каттнер. Сим удостоверяется… Перевод с английского К. Сенина и В. Тальми\n "; + let expected_result: Vec = vec![ + " Библиотека современной фантастики. Том 21\n Содержание:\n РОМАН И ПОВЕСТИ:\n Разбивая стеклянные двери… Предисловие В. Ревича\n Джон Бойнтон Пристли. Дженни Вильерс. Роман о театре. Перевод с английского В. Ашкенази".to_string(), + " Уильям Сароян. Тигр Тома Трейси. Повесть. Перевод с английского Р. Рыбкина\n Роберт Янг. Срубить дерево. Повесть. Перевод с английского С. Васильевой\n РАССКАЗЫ:\n Жан Рей. Рука Геца фон Берлихингена. Перевод с французского А. Григорьева".to_string(), + " Клод Легран. По мерке. Перевод с французского А. Григорьева\n Саке Комацу. Смерть Бикуни. Перевод с японского З. Рахима\n Ана Мария Матуте. Король Зеннов. Перевод с испанского Е. Любимовой\n Антонио Минготе. Николас. Перевод с испанского Р. Рыбкина".to_string(), + " Юн Бинг. Риестофер Юсеф. Перевод с норвежского Л. Жданова\n Гораций Голд. Чего стоят крылья. Перевод с английского Ф. Мендельсона\n Питер С. Бигл. Милости просим, леди Смерть! Перевод с английского Я. Евдокимовой\n Андре Майе. Как я стала писательницей. Перевод с французского Р. Рыбкина".to_string(), + " Джеймс Поллард. Заколдованный поезд. Перевод с английского Р. Рыбкина\n Рэй Брэдбери. Апрельское колдовство. Перевод с английского Л. Жданова\n Айзек Азимов. Небывальщина. Перевод с английского К. Сенина и В. Тальми\n Р.А. Лэфферти. Семь дней ужаса. Перевод с английского И. Почиталина".to_string(), + " Генри Каттнер. Сим удостоверяется… Перевод с английского К. Сенина и В. Тальми".to_string() + ]; + + let result = split_text_to_chunks(input, 512); + + assert_eq!(result, expected_result); + } +}