diff --git a/code-rs/tui/src/chatwidget.rs b/code-rs/tui/src/chatwidget.rs index c79cdbfc96d..a2309223469 100644 --- a/code-rs/tui/src/chatwidget.rs +++ b/code-rs/tui/src/chatwidget.rs @@ -3717,12 +3717,19 @@ impl ChatWidget<'_> { display_text = display_text.replace("\r\n", "\n"); let mut _lines_tmp: Vec = display_text .lines() - .map(|l| l.trim_end().to_string()) + .map(|l| { + l.trim_end_matches(|c: char| c.is_ascii_whitespace()) + .to_string() + }) .collect(); - while _lines_tmp.first().map_or(false, |s| s.trim().is_empty()) { + while _lines_tmp.first().map_or(false, |s| { + s.trim_matches(|c: char| c.is_ascii_whitespace()).is_empty() + }) { _lines_tmp.remove(0); } - while _lines_tmp.last().map_or(false, |s| s.trim().is_empty()) { + while _lines_tmp.last().map_or(false, |s| { + s.trim_matches(|c: char| c.is_ascii_whitespace()).is_empty() + }) { _lines_tmp.pop(); } display_text = _lines_tmp.join("\n"); diff --git a/code-rs/tui/src/chatwidget/message.rs b/code-rs/tui/src/chatwidget/message.rs index 5811c688b81..773e9eddd9c 100644 --- a/code-rs/tui/src/chatwidget/message.rs +++ b/code-rs/tui/src/chatwidget/message.rs @@ -18,7 +18,7 @@ pub struct UserMessage { impl From for UserMessage { fn from(text: String) -> Self { let mut ordered = Vec::new(); - if !text.trim().is_empty() { + if !text.trim_matches(|c: char| c.is_ascii_whitespace()).is_empty() { ordered.push(InputItem::Text { text: text.clone() }); } Self { @@ -34,7 +34,7 @@ pub fn create_initial_user_message(text: String, image_paths: Vec) -> O None } else { let mut ordered: Vec = Vec::new(); - if !text.trim().is_empty() { + if !text.trim_matches(|c: char| c.is_ascii_whitespace()).is_empty() { ordered.push(InputItem::Text { text: text.clone() }); } for path in image_paths { diff --git a/code-rs/tui/tests/fullwidth_ime.rs b/code-rs/tui/tests/fullwidth_ime.rs new file mode 100644 index 00000000000..a9266c02e8d --- /dev/null +++ b/code-rs/tui/tests/fullwidth_ime.rs @@ -0,0 +1,10 @@ +use code_tui::chatwidget::message::UserMessage; + +#[test] +fn preserves_fullwidth_space_only_message() { + let fullwidth_space = "\u{3000}".repeat(2); + let msg = UserMessage::from(fullwidth_space.clone()); + assert_eq!(msg.display_text, fullwidth_space); + assert_eq!(msg.ordered_items.len(), 1, "full-width space should be treated as content"); +} +