mirror of
https://github.com/chatmail/core.git
synced 2026-04-28 19:06:35 +03:00
truncate long texts and make the whole text accessible via has_html()/get_html()
This commit is contained in:
@@ -165,8 +165,16 @@ pub const DC_MSG_ID_MARKER1: u32 = 1;
|
|||||||
pub const DC_MSG_ID_DAYMARKER: u32 = 9;
|
pub const DC_MSG_ID_DAYMARKER: u32 = 9;
|
||||||
pub const DC_MSG_ID_LAST_SPECIAL: u32 = 9;
|
pub const DC_MSG_ID_LAST_SPECIAL: u32 = 9;
|
||||||
|
|
||||||
|
/// string that indicates sth. is left out or truncated
|
||||||
|
pub const DC_ELLIPSE: &str = "[...]";
|
||||||
|
|
||||||
|
/// to keep bubbles and chat flow usable, we limit the text length to DC_DESIRED_TEXT_LEN.
|
||||||
|
/// if the text is longer, the full text can be retrieved usind has_html()/get_html().
|
||||||
|
pub const DC_DESIRED_TEXT_LEN: usize = 20000;
|
||||||
|
|
||||||
/// approx. max. length returned by dc_msg_get_text()
|
/// approx. max. length returned by dc_msg_get_text()
|
||||||
pub const DC_MAX_GET_TEXT_LEN: usize = 30000;
|
pub const DC_MAX_GET_TEXT_LEN: usize = 30000;
|
||||||
|
|
||||||
/// approx. max. length returned by dc_get_msg_info()
|
/// approx. max. length returned by dc_get_msg_info()
|
||||||
pub const DC_MAX_GET_INFO_LEN: usize = 100_000;
|
pub const DC_MAX_GET_INFO_LEN: usize = 100_000;
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ use chrono::{Local, TimeZone};
|
|||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
|
|
||||||
use crate::chat::{add_device_msg, add_device_msg_with_importance};
|
use crate::chat::{add_device_msg, add_device_msg_with_importance};
|
||||||
use crate::constants::{Viewtype, DC_OUTDATED_WARNING_DAYS};
|
use crate::constants::{Viewtype, DC_ELLIPSE, DC_OUTDATED_WARNING_DAYS};
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::events::EventType;
|
use crate::events::EventType;
|
||||||
use crate::message::Message;
|
use crate::message::Message;
|
||||||
@@ -28,10 +28,8 @@ use crate::stock_str;
|
|||||||
/// end of the shortened string.
|
/// end of the shortened string.
|
||||||
#[allow(clippy::indexing_slicing)]
|
#[allow(clippy::indexing_slicing)]
|
||||||
pub(crate) fn dc_truncate(buf: &str, approx_chars: usize) -> Cow<str> {
|
pub(crate) fn dc_truncate(buf: &str, approx_chars: usize) -> Cow<str> {
|
||||||
let ellipse = "[...]";
|
|
||||||
|
|
||||||
let count = buf.chars().count();
|
let count = buf.chars().count();
|
||||||
if approx_chars > 0 && count > approx_chars + ellipse.len() {
|
if approx_chars > 0 && count > approx_chars + DC_ELLIPSE.len() {
|
||||||
let end_pos = buf
|
let end_pos = buf
|
||||||
.char_indices()
|
.char_indices()
|
||||||
.nth(approx_chars)
|
.nth(approx_chars)
|
||||||
@@ -39,9 +37,9 @@ pub(crate) fn dc_truncate(buf: &str, approx_chars: usize) -> Cow<str> {
|
|||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
if let Some(index) = buf[..end_pos].rfind(|c| c == ' ' || c == '\n') {
|
if let Some(index) = buf[..end_pos].rfind(|c| c == ' ' || c == '\n') {
|
||||||
Cow::Owned(format!("{}{}", &buf[..=index], ellipse))
|
Cow::Owned(format!("{}{}", &buf[..=index], DC_ELLIPSE))
|
||||||
} else {
|
} else {
|
||||||
Cow::Owned(format!("{}{}", &buf[..end_pos], ellipse))
|
Cow::Owned(format!("{}{}", &buf[..end_pos], DC_ELLIPSE))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Cow::Borrowed(buf)
|
Cow::Borrowed(buf)
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ use percent_encoding::percent_decode_str;
|
|||||||
|
|
||||||
use crate::aheader::Aheader;
|
use crate::aheader::Aheader;
|
||||||
use crate::blob::BlobObject;
|
use crate::blob::BlobObject;
|
||||||
use crate::constants::Viewtype;
|
use crate::constants::{Viewtype, DC_DESIRED_TEXT_LEN, DC_ELLIPSE};
|
||||||
use crate::contact::addr_normalize;
|
use crate::contact::addr_normalize;
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::dc_tools::dc_get_filemeta;
|
use crate::dc_tools::{dc_get_filemeta, dc_truncate};
|
||||||
use crate::dehtml::dehtml;
|
use crate::dehtml::dehtml;
|
||||||
use crate::e2ee;
|
use crate::e2ee;
|
||||||
use crate::events::EventType;
|
use crate::events::EventType;
|
||||||
@@ -817,6 +817,14 @@ impl MimeMessage {
|
|||||||
(simplified_txt, top_quote)
|
(simplified_txt, top_quote)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let simplified_txt =
|
||||||
|
if simplified_txt.len() > DC_DESIRED_TEXT_LEN + DC_ELLIPSE.len() {
|
||||||
|
self.is_mime_modified = true;
|
||||||
|
dc_truncate(&*simplified_txt, DC_DESIRED_TEXT_LEN).to_string()
|
||||||
|
} else {
|
||||||
|
simplified_txt
|
||||||
|
};
|
||||||
|
|
||||||
if !simplified_txt.is_empty() || simplified_quote.is_some() {
|
if !simplified_txt.is_empty() || simplified_quote.is_some() {
|
||||||
let mut part = Part {
|
let mut part = Part {
|
||||||
dehtml_failed,
|
dehtml_failed,
|
||||||
@@ -2781,6 +2789,7 @@ On 2020-10-25, Bob wrote:
|
|||||||
static REPEAT_TXT: &str = "this text with 42 chars is just repeated.\n";
|
static REPEAT_TXT: &str = "this text with 42 chars is just repeated.\n";
|
||||||
static REPEAT_CNT: usize = 2000; // results in a text of 84k, should be more than DC_MAX_GET_TEXT_LEN
|
static REPEAT_CNT: usize = 2000; // results in a text of 84k, should be more than DC_MAX_GET_TEXT_LEN
|
||||||
let long_txt = format!("From: alice@c.de\n\n{}", REPEAT_TXT.repeat(REPEAT_CNT));
|
let long_txt = format!("From: alice@c.de\n\n{}", REPEAT_TXT.repeat(REPEAT_CNT));
|
||||||
|
assert!(DC_DESIRED_TEXT_LEN + DC_ELLIPSE.len() < DC_MAX_GET_TEXT_LEN);
|
||||||
|
|
||||||
let mimemsg = MimeMessage::from_bytes(&t, long_txt.as_ref())
|
let mimemsg = MimeMessage::from_bytes(&t, long_txt.as_ref())
|
||||||
.await
|
.await
|
||||||
|
|||||||
Reference in New Issue
Block a user