diff --git a/src/modules/envelope/extractor.rs b/src/modules/envelope/extractor.rs index 7a17ba4..ec958c0 100644 --- a/src/modules/envelope/extractor.rs +++ b/src/modules/envelope/extractor.rs @@ -134,7 +134,9 @@ pub fn extract_envelope_from_eml( let text = if let Some(text) = message.body_text(0).map(|cow| cow.into_owned()) { text } else if let Some(html) = message.body_html(0).map(|cow| cow.into_owned()) { - from_read(html.as_bytes(), 0) + html2text::config::plain() + .allow_width_overflow() + .string_from_read(html.as_bytes(), 100) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))? } else { String::new() @@ -229,3 +231,52 @@ fn extract_references(message: &Message<'_>) -> Option> { _ => None, } } + +#[cfg(test)] +mod test { + use html2text::config; + + #[test] + fn test_various_html_with_overflow_enabled() { + let cases = [ + ("

Hello World

", "Simple paragraph"), + ("

Title

Content

", "Heading + paragraph"), + ("", "Unordered list"), + ( + "Bold and italic", + "Inline formatting", + ), + ( + "
Nested elements
", + "Nested inline elements inside block", + ), + ( + "
AB
", + "Simple table", + ), + ( + "
  preformatted text\n  line2
", + "Preformatted block", + ), + ("😃 emoji test", "Wide emoji"), + ("link", "Anchor tag"), + ( + "

Quoted text

", + "Blockquote with paragraph", + ), + ]; + + for (html, desc) in cases { + let result = config::plain() + .allow_width_overflow() + .string_from_read(html.as_bytes(), 100); + + match result { + Ok(output) => { + println!("✓ Rendered ({}) =>\n{}", desc, output); + } + Err(e) => panic!("Unexpected error for {}: {:?}", desc, e), + } + } + } +}