From 12cc259536b7d3fedddc677adbc7c47f0dbbbb13 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Mon, 4 Jan 2021 09:58:08 +0100 Subject: [PATCH 01/11] Update html2pango to 0.4.1 anyhow needed to be updated to 1.0.37. --- Cargo.lock | 8 ++++---- fractal-gtk/Cargo.toml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f70a8f2cc..37b0ee69f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -117,9 +117,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.34" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7" +checksum = "ee67c11feeac938fae061b232e38e0b6d94f97a9df10e6271319325ac4c56a86" [[package]] name = "arrayref" @@ -1536,9 +1536,9 @@ dependencies = [ [[package]] name = "html2pango" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469b284033c3c93e7df758d316cb2e0da4408e4138d5add903b8be356a841738" +checksum = "a2a7f65103a4da1b629f519474a51ae89077c61f88954eb9e6df7b22e1a7fd98" dependencies = [ "ammonia", "anyhow", diff --git a/fractal-gtk/Cargo.toml b/fractal-gtk/Cargo.toml index 937265d50..44d6ec928 100644 --- a/fractal-gtk/Cargo.toml +++ b/fractal-gtk/Cargo.toml @@ -6,7 +6,7 @@ workspace = "../" edition = "2018" [dependencies] -anyhow = "1.0.32" +anyhow = "1.0.37" async-trait = "0.1.40" clap = "2.33.0" chrono = "0.4.10" @@ -19,7 +19,7 @@ gdk = "0.13.0" gdk-pixbuf = "0.9.0" gstreamer-pbutils = "0.16.0" glib = "0.10.1" -html2pango = "0.3.2" +html2pango = "0.4.1" http = "0.2.1" itertools = "0.8.2" lazy_static = "1.4.0" -- GitLab From 6457c34192ae314b23ff6af5232902a0ed1220f7 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Sat, 10 Oct 2020 23:15:24 +0200 Subject: [PATCH 02/11] Message Widget: Initial html support Following !399. Ensure build_room_msg_body returns errors --- fractal-gtk/src/widgets/message.rs | 91 +++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index 2c89063a7..e5fbd6a42 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -10,10 +10,12 @@ use crate::widgets::message_menu::MessageMenu; use crate::widgets::AvatarExt; use crate::widgets::ClipContainer; use crate::widgets::{AudioPlayerWidget, PlayerExt, VideoPlayerWidget}; +use anyhow::Context; use chrono::prelude::*; use either::Either; use glib::clone; use gtk::{prelude::*, ButtonExt, ContainerExt, LabelExt, Overlay, WidgetExt}; +use html2pango::block::{HtmlBlock, markup_html}; use itertools::Itertools; use matrix_sdk::Client as MatrixClient; use std::cmp::max; @@ -517,6 +519,83 @@ fn build_room_msg( (body, type_extras) } +fn build_room_msg_body_html(_container: &MessageBoxContainer, msg: &Message) -> anyhow::Result { + let raw = msg.msg.formatted_body.clone().unwrap_or_default(); + + let blocks = + markup_html(&raw).with_context(|| format!("Could not render message: {}", &raw))?; + let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); + for b in blocks { + let widget = render_html_block(&b); + bx.add(&widget); + } + Ok(bx) +} + +fn render_html_block(block: &HtmlBlock) -> gtk::Widget { + match block { + HtmlBlock::Heading(n, s) => { + let w = gtk::Label::new(None); + set_label_styles(&w); + w.set_markup(&s); + w.get_style_context().add_class(&format!("h{}", n)); + w.upcast::() + } + HtmlBlock::UList(elements) => { + let w = gtk::Label::new(None); + set_label_styles(&w); + + let text = elements + .iter() + .map(|li| format!(" • {}", li)) + .collect::>() + .join("\n"); + w.set_markup(&text); + + w.upcast::() + } + HtmlBlock::OList(elements) => { + let w = gtk::Label::new(None); + set_label_styles(&w); + + let text = elements + .iter() + .enumerate() + .map(|(i, li)| format!(" {}. {}", i + 1, li)) + .collect::>() + .join("\n"); + + w.set_markup(&text); + + w.upcast::() + } + HtmlBlock::Code(s) => { + let buffer = sourceview4::Buffer::new::(None); + buffer.set_text(&s); + let view = sourceview4::View::with_buffer(&buffer); + view.set_editable(false); + view.set_wrap_mode(gtk::WrapMode::WordChar); + view.get_style_context().add_class("codeview"); + view.upcast::() + } + HtmlBlock::Quote(blocks) => { + let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); + bx.get_style_context().add_class("quote"); + for b in blocks.iter() { + let w = render_html_block(&b); + bx.add(&w); + } + bx.upcast::() + } + HtmlBlock::Text(s) => { + let w = gtk::Label::new(None); + set_label_styles(&w); + w.set_markup(&s); + w.upcast::() + } + } +} + fn build_room_msg_sticker(session_client: MatrixClient, msg: &Message) -> BodyAndType { let bx = gtk::Box::new(gtk::Orientation::Horizontal, 0); if let Some(url) = msg.msg.url.clone() { @@ -751,6 +830,16 @@ fn build_room_msg_file(msg: &Message) -> BodyAndType { } fn build_room_msg_body(container: &MessageBoxContainer, msg: &Message) -> BodyAndType { + let bx = match msg.msg.format.as_deref() { + Some("org.matrix.custom.html") => + build_room_msg_body_html(container, &msg) + .unwrap_or_else(|_err| build_room_msg_body_text(container, &msg)), + _ => build_room_msg_body_text(container, &msg), + }; + (bx, MessageBodyType::Text) +} + +fn build_room_msg_body_text(container: &MessageBoxContainer, msg: &Message) -> gtk::Box { let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); let msgs_by_kind_of_line = msg.msg.body.lines().group_by(|&line| kind_of_line(line)); @@ -811,7 +900,7 @@ fn build_room_msg_body(container: &MessageBoxContainer, msg: &Message) -> BodyAn bx.add(&part); } - (bx, MessageBodyType::Text) + bx } #[derive(Clone, Debug)] -- GitLab From 1ec9ca3955a4a1eedb6a6719a071fd498c7dd0f5 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Sat, 10 Oct 2020 23:54:46 +0200 Subject: [PATCH 03/11] Add css for headlines --- fractal-gtk/res/app.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/fractal-gtk/res/app.css b/fractal-gtk/res/app.css index 3a6c598df..c5ef1af42 100644 --- a/fractal-gtk/res/app.css +++ b/fractal-gtk/res/app.css @@ -412,6 +412,22 @@ box.folded-history padding-right: 6px; } +.h1, .h2, .h3, .h4, .h5, .h6 { + font-weight: bold; +} + +.h1 { + font-size: xx-large; +} + +.h2 { + font-size: x-large; +} + +.h3 { + font-size: large; +} + #clip-container { border-radius: 6px; } -- GitLab From 6e98d2b7d7eac470155e833b8690f5d3aca1ea29 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Tue, 13 Oct 2020 01:38:58 +0200 Subject: [PATCH 04/11] Add css for code blocks --- fractal-gtk/res/app.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fractal-gtk/res/app.css b/fractal-gtk/res/app.css index c5ef1af42..287913f4c 100644 --- a/fractal-gtk/res/app.css +++ b/fractal-gtk/res/app.css @@ -428,6 +428,18 @@ box.folded-history font-size: large; } +.codeview { + border-radius: 5px; + padding: 6px; + font-family: monospace; + background-color: @text_view_bg; + color: @theme_text_color; +} + +.codeview > text { + background: none; +} + #clip-container { border-radius: 6px; } -- GitLab From 2276b85228e2e0f0da37c6d4122dc6ff67674df6 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Thu, 22 Oct 2020 13:14:37 +0200 Subject: [PATCH 05/11] Message Widget: Don't highlight matching brackets --- fractal-gtk/src/widgets/message.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index e5fbd6a42..db66185b4 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -18,6 +18,7 @@ use gtk::{prelude::*, ButtonExt, ContainerExt, LabelExt, Overlay, WidgetExt}; use html2pango::block::{HtmlBlock, markup_html}; use itertools::Itertools; use matrix_sdk::Client as MatrixClient; +use sourceview4::BufferExt; use std::cmp::max; use std::rc::Rc; @@ -571,6 +572,7 @@ fn render_html_block(block: &HtmlBlock) -> gtk::Widget { } HtmlBlock::Code(s) => { let buffer = sourceview4::Buffer::new::(None); + buffer.set_highlight_matching_brackets(false); buffer.set_text(&s); let view = sourceview4::View::with_buffer(&buffer); view.set_editable(false); -- GitLab From 4712f9dfdb22c2c9ffe0ee3997348fa88a48af6e Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Thu, 19 Nov 2020 12:33:03 +0100 Subject: [PATCH 06/11] Message Widget: Connect right click menu for html html formatted messaged were not connecting the right click menu. connect_right_click_menu was changed to accept arbitrary widgets as input instead of gtk::Label only. --- fractal-gtk/src/widgets/message.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index db66185b4..ea8103ec8 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -172,11 +172,11 @@ impl MessageBoxContainer { None } - fn connect_right_click_menu(&self, msg: &Message, label: Option<>k::Label>) -> Option<()> { + fn connect_right_click_menu(&self, msg: &Message, w: Option<>k::Widget>) -> Option<()> { let mtype = msg.mtype; let redactable = msg.redactable; - let widget = if let Some(l) = label { - l.upcast_ref::() + let widget = if let Some(l) = w { + l } else { self.eventbox.upcast_ref::() }; @@ -512,7 +512,7 @@ fn build_room_msg( container.connect_media_viewer(msg); } MessageBodyType::Emote(ref msg_label) => { - container.connect_right_click_menu(msg, Some(msg_label)); + container.connect_right_click_menu(msg, Some(msg_label.upcast_ref::())); } _ => {} } @@ -520,21 +520,21 @@ fn build_room_msg( (body, type_extras) } -fn build_room_msg_body_html(_container: &MessageBoxContainer, msg: &Message) -> anyhow::Result { +fn build_room_msg_body_html(container: &MessageBoxContainer, msg: &Message) -> anyhow::Result { let raw = msg.msg.formatted_body.clone().unwrap_or_default(); let blocks = markup_html(&raw).with_context(|| format!("Could not render message: {}", &raw))?; let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); for b in blocks { - let widget = render_html_block(&b); + let widget = render_html_block(container, msg, &b); bx.add(&widget); } Ok(bx) } -fn render_html_block(block: &HtmlBlock) -> gtk::Widget { - match block { +fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &HtmlBlock) -> gtk::Widget { + let widget = match block { HtmlBlock::Heading(n, s) => { let w = gtk::Label::new(None); set_label_styles(&w); @@ -584,7 +584,7 @@ fn render_html_block(block: &HtmlBlock) -> gtk::Widget { let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); bx.get_style_context().add_class("quote"); for b in blocks.iter() { - let w = render_html_block(&b); + let w = render_html_block(container, msg, &b); bx.add(&w); } bx.upcast::() @@ -595,7 +595,9 @@ fn render_html_block(block: &HtmlBlock) -> gtk::Widget { w.set_markup(&s); w.upcast::() } - } + }; + container.connect_right_click_menu(msg, Some(&widget)); + widget } fn build_room_msg_sticker(session_client: MatrixClient, msg: &Message) -> BodyAndType { @@ -898,7 +900,7 @@ fn build_room_msg_body_text(container: &MessageBoxContainer, msg: &Message) -> g part.set_attributes(Some(&attr)); } - container.connect_right_click_menu(msg, Some(&part)); + container.connect_right_click_menu(msg, Some(&part.upcast_ref::())); bx.add(&part); } -- GitLab From 9ccb4ecdc141de7516a558f38b6a3ab1b39a1393 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Thu, 19 Nov 2020 15:14:34 +0100 Subject: [PATCH 07/11] Message Widget: Make ol/ul a list of boxes Instead of adding a bullet to each label, create a horizontal box with a bullet and the text, this way the text is properly spaced after wrapping, i.e. * some wrapped text * some wrapped text where the second is the implemented and correct behavior. Additionally, the bullet cannot be selected as part of the message. --- fractal-gtk/src/widgets/message.rs | 52 ++++++++++++++++++------------ 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index ea8103ec8..fe5b40b50 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -540,35 +540,44 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm set_label_styles(&w); w.set_markup(&s); w.get_style_context().add_class(&format!("h{}", n)); + container.connect_right_click_menu(msg, Some(&w.upcast_ref::())); w.upcast::() } HtmlBlock::UList(elements) => { - let w = gtk::Label::new(None); - set_label_styles(&w); + let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); - let text = elements - .iter() - .map(|li| format!(" • {}", li)) - .collect::>() - .join("\n"); - w.set_markup(&text); + for li in elements.iter() { + let h_box = gtk::Box::new(gtk::Orientation::Horizontal, 6); + let bullet = gtk::Label::new(Some("•")); + bullet.set_valign(gtk::Align::Start); + let w = gtk::Label::new(None); + set_label_styles(&w); + h_box.add(&bullet); + h_box.add(&w); + w.set_markup(&li); + container.connect_right_click_menu(msg, Some(&w.upcast_ref::())); + bx.add(&h_box); + } - w.upcast::() + bx.upcast::() } HtmlBlock::OList(elements) => { - let w = gtk::Label::new(None); - set_label_styles(&w); - - let text = elements - .iter() - .enumerate() - .map(|(i, li)| format!(" {}. {}", i + 1, li)) - .collect::>() - .join("\n"); + let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); - w.set_markup(&text); + for (i, ol) in elements.iter().enumerate() { + let h_box = gtk::Box::new(gtk::Orientation::Horizontal, 6); + let bullet = gtk::Label::new(Some(&format!("{}.", i + 1))); + bullet.set_valign(gtk::Align::Start); + let w = gtk::Label::new(None); + set_label_styles(&w); + h_box.add(&bullet); + h_box.add(&w); + w.set_markup(&ol); + bx.add(&h_box); + container.connect_right_click_menu(msg, Some(&w.upcast_ref::())); + } - w.upcast::() + bx.upcast::() } HtmlBlock::Code(s) => { let buffer = sourceview4::Buffer::new::(None); @@ -578,6 +587,7 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm view.set_editable(false); view.set_wrap_mode(gtk::WrapMode::WordChar); view.get_style_context().add_class("codeview"); + container.connect_right_click_menu(msg, Some(&view.upcast_ref::())); view.upcast::() } HtmlBlock::Quote(blocks) => { @@ -593,10 +603,10 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm let w = gtk::Label::new(None); set_label_styles(&w); w.set_markup(&s); + container.connect_right_click_menu(msg, Some(&w.upcast_ref::())); w.upcast::() } }; - container.connect_right_click_menu(msg, Some(&widget)); widget } -- GitLab From 735ca936f4f2195664ce07588b8c536e49e7ca04 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Thu, 19 Nov 2020 16:38:05 +0100 Subject: [PATCH 08/11] Message Widget: Wrap SourceView in scrolled window This way the code blocks do not try to take up all the space, prevents the collapse of the leaflet when there are big code chunks. --- fractal-gtk/src/widgets/message.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index fe5b40b50..218906d06 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -580,15 +580,17 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm bx.upcast::() } HtmlBlock::Code(s) => { + let scrolled = gtk::ScrolledWindow::new(gtk::NONE_ADJUSTMENT, gtk::NONE_ADJUSTMENT); + scrolled.set_policy(gtk::PolicyType::Automatic, gtk::PolicyType::Never); let buffer = sourceview4::Buffer::new::(None); buffer.set_highlight_matching_brackets(false); buffer.set_text(&s); let view = sourceview4::View::with_buffer(&buffer); view.set_editable(false); - view.set_wrap_mode(gtk::WrapMode::WordChar); view.get_style_context().add_class("codeview"); container.connect_right_click_menu(msg, Some(&view.upcast_ref::())); - view.upcast::() + scrolled.add(&view); + scrolled.upcast::() } HtmlBlock::Quote(blocks) => { let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); -- GitLab From 8bf85c11d7483d339b4e8b2325f1db64159e8190 Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Tue, 22 Dec 2020 15:11:44 +0100 Subject: [PATCH 09/11] Message Widget: Do not render incomplete messages If a message contains raw html, the formatted body will contain a comment, and instead of showing an incomplete message, the plain text message is used. --- fractal-gtk/src/widgets/message.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index 218906d06..319d7a242 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -523,6 +523,12 @@ fn build_room_msg( fn build_room_msg_body_html(container: &MessageBoxContainer, msg: &Message) -> anyhow::Result { let raw = msg.msg.formatted_body.clone().unwrap_or_default(); + if raw.contains("") { + anyhow::bail!( + "Empty message omited: , using plain text instead." + ); + } + let blocks = markup_html(&raw).with_context(|| format!("Could not render message: {}", &raw))?; let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); -- GitLab From 7bec0f36dbd7bc8b0b04b1117fa19631228db65e Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Tue, 22 Dec 2020 18:50:08 +0100 Subject: [PATCH 10/11] Message Widget: Add margins for lists Ordered and unordered lists now have margins. --- fractal-gtk/src/widgets/message.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index 319d7a242..ad80b058c 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -551,6 +551,8 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm } HtmlBlock::UList(elements) => { let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); + bx.set_margin_end(6); + bx.set_margin_start(6); for li in elements.iter() { let h_box = gtk::Box::new(gtk::Orientation::Horizontal, 6); @@ -569,6 +571,8 @@ fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &Htm } HtmlBlock::OList(elements) => { let bx = gtk::Box::new(gtk::Orientation::Vertical, 6); + bx.set_margin_end(6); + bx.set_margin_start(6); for (i, ol) in elements.iter().enumerate() { let h_box = gtk::Box::new(gtk::Orientation::Horizontal, 6); -- GitLab From 48c5ede3a3273dfb28c6b7ffed2b9258ebbceedc Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Mon, 1 Feb 2021 13:05:02 +0100 Subject: [PATCH 11/11] message: Run rustfmt --- fractal-gtk/src/widgets/message.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/fractal-gtk/src/widgets/message.rs b/fractal-gtk/src/widgets/message.rs index ad80b058c..f3429a75b 100644 --- a/fractal-gtk/src/widgets/message.rs +++ b/fractal-gtk/src/widgets/message.rs @@ -15,7 +15,7 @@ use chrono::prelude::*; use either::Either; use glib::clone; use gtk::{prelude::*, ButtonExt, ContainerExt, LabelExt, Overlay, WidgetExt}; -use html2pango::block::{HtmlBlock, markup_html}; +use html2pango::block::{markup_html, HtmlBlock}; use itertools::Itertools; use matrix_sdk::Client as MatrixClient; use sourceview4::BufferExt; @@ -520,13 +520,14 @@ fn build_room_msg( (body, type_extras) } -fn build_room_msg_body_html(container: &MessageBoxContainer, msg: &Message) -> anyhow::Result { +fn build_room_msg_body_html( + container: &MessageBoxContainer, + msg: &Message, +) -> anyhow::Result { let raw = msg.msg.formatted_body.clone().unwrap_or_default(); if raw.contains("") { - anyhow::bail!( - "Empty message omited: , using plain text instead." - ); + anyhow::bail!("Empty message omited: , using plain text instead."); } let blocks = @@ -539,7 +540,11 @@ fn build_room_msg_body_html(container: &MessageBoxContainer, msg: &Message) -> a Ok(bx) } -fn render_html_block(container: &MessageBoxContainer, msg: &Message, block: &HtmlBlock) -> gtk::Widget { +fn render_html_block( + container: &MessageBoxContainer, + msg: &Message, + block: &HtmlBlock, +) -> gtk::Widget { let widget = match block { HtmlBlock::Heading(n, s) => { let w = gtk::Label::new(None); @@ -857,8 +862,7 @@ fn build_room_msg_file(msg: &Message) -> BodyAndType { fn build_room_msg_body(container: &MessageBoxContainer, msg: &Message) -> BodyAndType { let bx = match msg.msg.format.as_deref() { - Some("org.matrix.custom.html") => - build_room_msg_body_html(container, &msg) + Some("org.matrix.custom.html") => build_room_msg_body_html(container, &msg) .unwrap_or_else(|_err| build_room_msg_body_text(container, &msg)), _ => build_room_msg_body_text(container, &msg), }; -- GitLab