Update annotation spliting

This commit is contained in:
2023-03-17 02:19:21 +01:00
parent 517a5e0222
commit a329b45122
2 changed files with 57 additions and 12 deletions

View File

@@ -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<String> = 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<String> = 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(

View File

@@ -112,3 +112,53 @@ where
inline_keyboard: buttons,
}
}
pub fn split_text_to_chunks(text: &str, width: usize) -> Vec<String> {
let mut result: Vec<String> = 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<String> = 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);
}
}