diff --git a/src/dc_simplify.rs b/src/dc_simplify.rs index 33f6b4721..142ca7349 100644 --- a/src/dc_simplify.rs +++ b/src/dc_simplify.rs @@ -1,5 +1,3 @@ -use crate::dehtml::*; - /// Remove standard (RFC 3676, §4.3) footer if it is found. fn remove_message_footer<'a>(lines: &'a [&str]) -> &'a [&'a str] { for (ix, &line) in lines.iter().enumerate() { @@ -38,15 +36,9 @@ fn split_lines(buf: &str) -> Vec<&str> { /// Simplify message text for chat display. /// Remove quotes, signatures, trailing empty lines etc. -pub fn simplify(input: &str, is_html: bool, is_chat_message: bool) -> (String, bool) { - let mut out = if is_html { - dehtml(input) - } else { - input.to_string() - }; - - out.retain(|c| c != '\r'); - let lines = split_lines(&out); +pub fn simplify(mut input: String, is_chat_message: bool) -> (String, bool) { + input.retain(|c| c != '\r'); + let lines = split_lines(&input); let (lines, is_forwarded) = skip_forward_header(&lines); let lines = remove_message_footer(lines); @@ -207,61 +199,29 @@ mod tests { #[test] // proptest does not support [[:graphical:][:space:]] regex. fn test_simplify_plain_text_fuzzy(input in "[!-~\t \n]+") { - let (output, _is_forwarded) = simplify(&input, false, true); + let (output, _is_forwarded) = simplify(input, true); assert!(output.split('\n').all(|s| s != "-- ")); } } #[test] fn test_simplify_trim() { - let html = "\r\r\nline1
\r\n\r\n\r\rline2\n\r"; - let (plain, is_forwarded) = simplify(html, true, false); + let input = "line1\n\r\r\rline2".to_string(); + let (plain, is_forwarded) = simplify(input, false); assert_eq!(plain, "line1\nline2"); assert!(!is_forwarded); } - #[test] - fn test_simplify_parse_href() { - let html = "text"); - assert!(!is_forwarded); - } - #[test] fn test_simplify_forwarded_message() { - let text = "---------- Forwarded message ----------\r\nFrom: test@example.com\r\n\r\nForwarded message\r\n-- \r\nSignature goes here"; - let (plain, is_forwarded) = simplify(text, false, false); + let input = "---------- Forwarded message ----------\r\nFrom: test@example.com\r\n\r\nForwarded message\r\n-- \r\nSignature goes here".to_string(); + let (plain, is_forwarded) = simplify(input, false); assert_eq!(plain, "Forwarded message"); assert!(is_forwarded); } - #[test] - fn test_simplify_html_encoded() { - let html = - "<>"'& äÄöÖüÜß fooÆçÇ ♦‎‏‌&noent;‍"; - - let (plain, is_forwarded) = simplify(html, true, false); - - assert_eq!( - plain, - "<>\"\'& äÄöÖüÜß fooÆçÇ \u{2666}\u{200e}\u{200f}\u{200c}&noent;\u{200d}" - ); - assert!(!is_forwarded); - } - #[test] fn test_simplify_utilities() { assert!(is_empty_line(" \t")); diff --git a/src/dehtml.rs b/src/dehtml.rs index 8cdaacb13..0b2f5435f 100644 --- a/src/dehtml.rs +++ b/src/dehtml.rs @@ -188,4 +188,41 @@ mod tests { assert_eq!(dehtml(input), output); } } + + #[test] + fn test_dehtml_parse_br() { + let html = "\r\r\nline1
\r\n\r\n\r\rline2\n\r"; + let plain = dehtml(html); + + assert_eq!(plain, "line1\n\r\r\rline2"); + } + + #[test] + fn test_dehtml_parse_href() { + let html = "
text"); + } + + #[test] + fn test_dehtml_html_encoded() { + let html = + "<>"'& äÄöÖüÜß fooÆçÇ ♦‎‏‌&noent;‍"; + + let plain = dehtml(html); + + assert_eq!( + plain, + "<>\"\'& äÄöÖüÜß fooÆçÇ \u{2666}\u{200e}\u{200f}\u{200c}&noent;\u{200d}" + ); + } } diff --git a/src/mimeparser.rs b/src/mimeparser.rs index e86af1fe2..e3685ec4e 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -12,6 +12,7 @@ use crate::contact::*; use crate::context::Context; use crate::dc_simplify::*; use crate::dc_tools::*; +use crate::dehtml::dehtml; use crate::e2ee; use crate::error::Result; use crate::events::Event; @@ -580,7 +581,12 @@ impl<'a> MimeParser<'a> { ("".into(), false) } else { let is_html = mime_type == mime::TEXT_HTML; - simplify(&decoded_data, is_html, self.has_chat_version()) + let out = if is_html { + dehtml(&decoded_data) + } else { + decoded_data.clone() + }; + simplify(out, self.has_chat_version()) }; if !simplified_txt.is_empty() {