diff --git a/crates/ruma-common/src/events/room/message/reply.rs b/crates/ruma-common/src/events/room/message/reply.rs index 71972845..963d9fac 100644 --- a/crates/ruma-common/src/events/room/message/reply.rs +++ b/crates/ruma-common/src/events/room/message/reply.rs @@ -4,247 +4,62 @@ use indoc::formatdoc; use super::{FormattedBody, MessageType, OriginalRoomMessageEvent}; -pub fn get_plain_quote_fallback(original_message: &OriginalRoomMessageEvent) -> String { - let sender = &original_message.sender; - +pub fn get_message_quote_fallbacks( + original_message: &OriginalRoomMessageEvent, +) -> (String, String) { match &original_message.content.msgtype { - MessageType::Audio(_) => { - format!("> <{}> sent an audio file.", sender) - } + MessageType::Audio(_) => get_quotes("sent an audio file.", None, original_message, false), MessageType::Emote(content) => { - format!("> * <{}> {}", sender, content.body) - } - MessageType::File(_) => { - format!("> <{}> sent a file.", sender) - } - MessageType::Image(_) => { - format!("> <{}> sent an image.", sender) - } - MessageType::Location(content) => { - format!("> <{}> {}", sender, content.body) + get_quotes(&content.body, content.formatted.as_ref(), original_message, true) } + MessageType::File(_) => get_quotes("sent a file.", None, original_message, false), + MessageType::Image(_) => get_quotes("sent an image.", None, original_message, false), + MessageType::Location(_) => get_quotes("sent a location.", None, original_message, false), MessageType::Notice(content) => { - format!("> <{}> {}", sender, content.body) + get_quotes(&content.body, content.formatted.as_ref(), original_message, false) } MessageType::ServerNotice(content) => { - format!("> <{}> {}", sender, content.body) + get_quotes(&content.body, None, original_message, false) } MessageType::Text(content) => { - format!("> <{}> {}", sender, content.body) - } - MessageType::Video(_) => { - format!("> <{}> sent a video.", sender) - } - MessageType::_Custom(content) => { - format!("> <{}> {}", sender, content.body) + get_quotes(&content.body, content.formatted.as_ref(), original_message, false) } + MessageType::Video(_) => get_quotes("sent a video.", None, original_message, false), + MessageType::_Custom(content) => get_quotes(&content.body, None, original_message, false), MessageType::VerificationRequest(content) => { - format!("> <{}> {}", sender, content.body) - } - } - .replace('\n', "\n> ") -} - -#[allow(clippy::nonstandard_macro_braces)] -pub fn get_html_quote_fallback(original_message: &OriginalRoomMessageEvent) -> String { - match &original_message.content.msgtype { - MessageType::Audio(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent an audio file. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Emote(content) => { - formatdoc!( - " - -
- In reply to - * {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = formatted_or_plain_body(&content.formatted, &content.body), - ) - } - MessageType::File(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent a file. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Image(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent an image. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Location(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent a location. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::Notice(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = formatted_or_plain_body(&content.formatted, &content.body), - ) - } - MessageType::ServerNotice(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = content.body, - ) - } - MessageType::Text(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = formatted_or_plain_body(&content.formatted, &content.body), - ) - } - MessageType::Video(_) => { - formatdoc!( - " - -
- In reply to - {sender} -
- sent a video. -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - ) - } - MessageType::_Custom(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - room_id = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = content.body, - ) - } - MessageType::VerificationRequest(content) => { - formatdoc!( - " - -
- In reply to - {sender} -
- {body} -
-
- ", - server_name = original_message.room_id, - event_id = original_message.event_id, - sender = original_message.sender, - body = content.body, - ) + get_quotes(&content.body, None, original_message, false) } } } -fn formatted_or_plain_body<'a>(formatted: &'a Option, body: &'a str) -> &'a str { +fn get_quotes( + body: &str, + formatted: Option<&FormattedBody>, + original_message: &OriginalRoomMessageEvent, + is_emote: bool, +) -> (String, String) { + let OriginalRoomMessageEvent { room_id, event_id, sender, .. } = original_message; + let emote_sign = is_emote.then(|| "* ").unwrap_or_default(); + let html_body = formatted_or_plain_body(formatted, body); + + ( + format!("> {emote_sign}<{sender}> {body}").replace('\n', "\n> "), + formatdoc!( + " + +
+ In reply to + {emote_sign}{sender} +
+ {html_body} +
+
+ " + ), + ) +} + +fn formatted_or_plain_body<'a>(formatted: Option<&'a FormattedBody>, body: &'a str) -> &'a str { if let Some(formatted_body) = formatted { &formatted_body.body } else { @@ -260,14 +75,13 @@ pub fn plain_and_formatted_reply_body( formatted: Option, original_message: &OriginalRoomMessageEvent, ) -> (String, String) { - let quoted = get_plain_quote_fallback(original_message); - let quoted_html = get_html_quote_fallback(original_message); + let (quoted, quoted_html) = get_message_quote_fallbacks(original_message); - let plain = format!("{}\n\n{}", quoted, body); + let plain = format!("{quoted}\n{body}"); let html = if let Some(formatted) = formatted { - format!("{}\n\n{}", quoted_html, formatted) + format!("{quoted_html}{formatted}") } else { - format!("{}\n\n{}", quoted_html, body) + format!("{quoted_html}{body}") }; (plain, html) @@ -285,16 +99,16 @@ mod tests { #[test] fn plain_quote_fallback_multiline() { - assert_eq!( - super::get_plain_quote_fallback(&OriginalRoomMessageEvent { + let (plain_quote, _html_quote) = + super::get_message_quote_fallbacks(&OriginalRoomMessageEvent { content: RoomMessageEventContent::text_plain("multi\nline"), event_id: event_id!("$1598361704261elfgc:localhost").to_owned(), sender: user_id!("@alice:example.com").to_owned(), origin_server_ts: MilliSecondsSinceUnixEpoch::now(), room_id: room_id!("!n8f893n9:example.com").to_owned(), unsigned: MessageLikeUnsigned::new(), - }), - "> <@alice:example.com> multi\n> line" - ); + }); + + assert_eq!(plain_quote, "> <@alice:example.com> multi\n> line"); } }