From 21bda6678d926bdc854775d55d69f1fdd29ddfbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Wed, 19 Oct 2022 17:28:25 +0200 Subject: [PATCH] events: Enable more markdown syntax Enable markdown extensions that produces spec-compliant HTML. --- crates/ruma-common/src/events/room/message.rs | 8 +++--- .../ruma-common/tests/events/room_message.rs | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/crates/ruma-common/src/events/room/message.rs b/crates/ruma-common/src/events/room/message.rs index 299a422c..e9c0660a 100644 --- a/crates/ruma-common/src/events/room/message.rs +++ b/crates/ruma-common/src/events/room/message.rs @@ -634,11 +634,13 @@ pub struct CustomEventContent { #[cfg(feature = "markdown")] pub(crate) fn parse_markdown(text: &str) -> Option { - use pulldown_cmark::{Event, Parser, Tag}; + use pulldown_cmark::{Event, Options, Parser, Tag}; + + const OPTIONS: Options = Options::ENABLE_TABLES.union(Options::ENABLE_STRIKETHROUGH); let mut found_first_paragraph = false; - let has_markdown = Parser::new(text).any(|ref event| { + let has_markdown = Parser::new_ext(text, OPTIONS).any(|ref event| { let is_text = matches!(event, Event::Text(_)); let is_break = matches!(event, Event::SoftBreak | Event::HardBreak); let is_first_paragraph_start = if matches!(event, @@ -667,7 +669,7 @@ pub(crate) fn parse_markdown(text: &str) -> Option { } let mut html_body = String::new(); - pulldown_cmark::html::push_html(&mut html_body, Parser::new(text)); + pulldown_cmark::html::push_html(&mut html_body, Parser::new_ext(text, OPTIONS)); Some(html_body) } diff --git a/crates/ruma-common/tests/events/room_message.rs b/crates/ruma-common/tests/events/room_message.rs index 255a7777..d9d734e0 100644 --- a/crates/ruma-common/tests/events/room_message.rs +++ b/crates/ruma-common/tests/events/room_message.rs @@ -324,6 +324,31 @@ fn markdown_detection() { formatted_body.unwrap(); } +#[test] +#[cfg(feature = "markdown")] +fn markdown_options() { + use ruma_common::events::room::message::FormattedBody; + + // Tables + let formatted_body = FormattedBody::markdown( + "|head1|head2|\n\ + |---|---|\n\ + |body1|body2|\ + ", + ); + assert_eq!( + formatted_body.unwrap().body, + "\ + \ + \n\n\ +
head1head2
body1body2
\n" + ); + + // Strikethrough + let formatted_body = FormattedBody::markdown("A message with a ~~strike~~"); + assert_eq!(formatted_body.unwrap().body, "

A message with a strike

\n"); +} + #[test] fn verification_request_deserialization() { let user_id = user_id!("@example2:localhost");