From 790884f0aa6fdf2d80404b240e6d808e301679fe Mon Sep 17 00:00:00 2001 From: Julian KOUNE Date: Thu, 13 Jul 2023 16:06:17 +0200 Subject: [PATCH] fix: remove url markdown on messages This Closes #221 --- lib/pages/chat/events/message_content.dart | 3 ++- lib/utils/string_extension.dart | 30 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index fee2ae9845..f64efacdd2 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -192,7 +192,8 @@ class MessageContent extends StatelessWidget { if (AppConfig.renderHtml && !event.redacted && event.isRichMessage) { - var html = event.formattedText; + var html = event.formattedText.unMarkdownLinks(event.text); + if (event.messageType == MessageTypes.Emote) { html = '* $html'; } diff --git a/lib/utils/string_extension.dart b/lib/utils/string_extension.dart index 652ca1a69c..266e5112d2 100644 --- a/lib/utils/string_extension.dart +++ b/lib/utils/string_extension.dart @@ -89,4 +89,34 @@ extension StringCasingExtension on String { final String? firstValidLink = matches.firstWhere((link) => AnyLinkPreview.isValidLink(link!)); return firstValidLink; } + + // Removes markdowned links from a string based on the unformatted text + // Workaround for content['formatted_body'] which formats urls in a way that makes them unusable + String unMarkdownLinks(String unformattedText) { + final RegExp regex = RegExp(r'https:\/\/[^\s]+'); + + final Iterable formattedLinksMatches = regex.allMatches(this); + final Iterable unformattedLinksMatches = regex.allMatches(unformattedText); + + if (formattedLinksMatches.isEmpty || + unformattedLinksMatches.isEmpty || + formattedLinksMatches.length != unformattedLinksMatches.length) { + return this; + } + + var unMarkdownedText = this; + + // Replace respectively all formatted links with unformatted links + for (int i = 0; i < formattedLinksMatches.length; i++) { + final Match formattedLinkMatch = formattedLinksMatches.elementAt(i); + final Match unformattedLinkMatch = unformattedLinksMatches.elementAt(i); + + final String formattedLink = formattedLinkMatch.group(0)!; + final String unformattedLink = unformattedLinkMatch.group(0)!; + + unMarkdownedText = unMarkdownedText.replaceFirst(formattedLink, unformattedLink); + } + + return unMarkdownedText; + } }