daydream

A small matrix web client written in rust
git clone git://archive.git.mtrnord.blog/daydream-mx/daydream.git
Log | Files | Refs | README | LICENSE

commit 80c9da538552e39d62b69cd566f2380f52d0fc7d
parent 5904c5c97812db400f3a74c0304072c58cead008
Author: Marcel <mtrnord1@gmail.com>
Date:   Fri, 29 May 2020 10:05:44 +0200

Add markdown sending

Took 15 minutes

Diffstat:
MCargo.toml | 1+
Msrc/app/matrix.rs | 29+++++++++++++++++++++++++++--
2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml @@ -28,6 +28,7 @@ url = "2.1.1" thiserror = "1.0" futures-locks = { git = "https://github.com/asomers/futures-locks", default-features = false } linked_hash_set = {version = "0.1.3", features = ["serde"] } +comrak = "0.7" [dev-dependencies] wasm-bindgen-test = "0.3" diff --git a/src/app/matrix.rs b/src/app/matrix.rs @@ -23,6 +23,7 @@ use yew::worker::*; use crate::app::matrix::types::{MessageWrapper, SmallRoom}; use crate::constants::AUTH_KEY; use crate::errors::MatrixError; +use comrak::{Arena, ComrakOptions, parse_document, format_html}; mod sync; pub mod types; @@ -335,9 +336,33 @@ impl Agent for MatrixAgent { } Request::SendMessage((room_id, message)) => { let client = self.matrix_client.clone().unwrap(); - let content = - MessageEventContent::Text(TextMessageEventContent::new_plain(message.clone())); spawn_local(async move { + let arena = Arena::new(); + + let root = parse_document( + &arena, + message.clone().as_str(), + &ComrakOptions::default()); + + let mut html = vec![]; + format_html(root, &ComrakOptions::default(), &mut html).unwrap(); + let mut formatted_message = String::from_utf8(html).unwrap(); + formatted_message = formatted_message.replace("<p>", "").replace("</p>",""); + formatted_message.pop(); + + let content; + if formatted_message == message { + content = + MessageEventContent::Text(TextMessageEventContent::new_plain(message.clone())); + } else { + content = + MessageEventContent::Text(TextMessageEventContent { + body: message.into(), + format: Some("org.matrix.custom.html".to_string()), + formatted_body: Some(formatted_message), + relates_to: None, + }); + } client.room_send(&room_id, content, None).await; }); }