From 35bf379f030b10ffe95569aa58d35facc1a0045c Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 3 Apr 2026 20:00:04 -0400 Subject: [PATCH] only render message as html when content is set to html --- lib/controllers/message_controller.dart | 1 + .../wrappers/text_message_wrapper.dart | 50 +++++++++++-------- pubspec.lock | 16 ++++++ pubspec.yaml | 1 + 4 files changed, 47 insertions(+), 21 deletions(-) diff --git a/lib/controllers/message_controller.dart b/lib/controllers/message_controller.dart index ed52ef2..6ec62c9 100644 --- a/lib/controllers/message_controller.dart +++ b/lib/controllers/message_controller.dart @@ -47,6 +47,7 @@ class MessageController extends AsyncNotifier { "eventType": type, "pmp": event.content["com.beeper.per_message_profile"], "error": event.sendError, + "format": content["format"], "editSource": event.localContent?.editSource ?? newContent?["body"] ?? diff --git a/lib/widgets/chat_page/wrappers/text_message_wrapper.dart b/lib/widgets/chat_page/wrappers/text_message_wrapper.dart index 08e583e..f6fe13d 100644 --- a/lib/widgets/chat_page/wrappers/text_message_wrapper.dart +++ b/lib/widgets/chat_page/wrappers/text_message_wrapper.dart @@ -2,6 +2,7 @@ import "package:cross_cache/cross_cache.dart"; import "package:flutter/material.dart"; import "package:flutter_chat_core/flutter_chat_core.dart"; import "package:flutter_link_previewer/flutter_link_previewer.dart"; +import "package:flutter_linkify/flutter_linkify.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/cross_cache_controller.dart"; import "package:nexus/controllers/url_preview_controller.dart"; @@ -60,29 +61,36 @@ class TextMessageWrapper extends ConsumerWidget { onTapReply: onTapReply, ), if (content != null) - Html( - textStyle: message.metadata?["big"] == true - ? TextStyle(fontSize: 32) - : null, - content! - .replaceAllMapped( - RegExp( - "(]*>.*?<\\/a>)|(\\bhttps?:\\/\\/[^\\s<]+)", - caseSensitive: false, - ), - (m) { - // If it's already an tag, leave it unchanged - if (m.group(1) != null) { - return m.group(1)!; - } + message.metadata?["format"] == "org.matrix.custom.html" + ? Html( + textStyle: message.metadata?["big"] == true + ? TextStyle(fontSize: 32) + : null, + content!.replaceAllMapped( + RegExp( + "(]*>.*?<\\/a>)|(\\bhttps?:\\/\\/[^\\s<]+)", + caseSensitive: false, + dotAll: true, + ), + (m) { + // If it's already an tag, leave it unchanged + if (m.group(1) != null) { + return m.group(1)!; + } - // Otherwise, wrap the bare URL - final url = m.group(2)!; - return "$url"; - }, + // Otherwise, wrap the bare URL + final url = m.group(2)!; + return "$url"; + }, + ), ) - .replaceAll("\n", "
"), - ), + : Linkify( + text: content!, + options: LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + ), if (textMessage?.editedAt != null) Text("(edited)", style: theme.textTheme.labelSmall), if (textMessage != null) diff --git a/pubspec.lock b/pubspec.lock index 46b8ee6..ce90832 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -495,6 +495,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.0" + flutter_linkify: + dependency: "direct main" + description: + name: flutter_linkify + sha256: "74669e06a8f358fee4512b4320c0b80e51cffc496607931de68d28f099254073" + url: "https://pub.dev" + source: hosted + version: "6.0.0" flutter_lints: dependency: "direct dev" description: @@ -822,6 +830,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + linkify: + dependency: transitive + description: + name: linkify + sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" + url: "https://pub.dev" + source: hosted + version: "5.0.0" lints: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 482e809..f7fe258 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,6 +57,7 @@ dependencies: ffigen: ^20.1.1 timeago: ^3.7.1 http: ^1.6.0 + flutter_linkify: ^6.0.0 dev_dependencies: build_runner: ^2.4.11