only render message as html when content is set to html

This commit is contained in:
Henry Hiles 2026-04-03 20:00:04 -04:00
commit 35bf379f03
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 47 additions and 21 deletions

View file

@ -47,6 +47,7 @@ class MessageController extends AsyncNotifier<Message?> {
"eventType": type,
"pmp": event.content["com.beeper.per_message_profile"],
"error": event.sendError,
"format": content["format"],
"editSource":
event.localContent?.editSource ??
newContent?["body"] ??

View file

@ -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\\b[^>]*>.*?<\\/a>)|(\\bhttps?:\\/\\/[^\\s<]+)",
caseSensitive: false,
),
(m) {
// If it's already an <a> 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\\b[^>]*>.*?<\\/a>)|(\\bhttps?:\\/\\/[^\\s<]+)",
caseSensitive: false,
dotAll: true,
),
(m) {
// If it's already an <a> tag, leave it unchanged
if (m.group(1) != null) {
return m.group(1)!;
}
// Otherwise, wrap the bare URL
final url = m.group(2)!;
return "<a href=\"$url\">$url</a>";
},
// Otherwise, wrap the bare URL
final url = m.group(2)!;
return "<a href=\"$url\">$url</a>";
},
),
)
.replaceAll("\n", "<br class=\"fake-break\"/>"),
),
: 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)

View file

@ -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:

View file

@ -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