diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart index af512b615..ac0d99b12 100644 --- a/lib/pages/chat/events/html_message.dart +++ b/lib/pages/chat/events/html_message.dart @@ -28,30 +28,36 @@ class HtmlMessage extends StatelessWidget { }); dom.Node _linkifyHtml(dom.Node element) { - for (final node in element.nodes) { - if (node is! dom.Text) { - node.replaceWith(_linkifyHtml(node)); - continue; + final nodes = element.nodes; + if (!element.hasChildNodes()) { + return element; + } + for (final dom.Node node in nodes) { + if (node is Element) { + final newNode = _linkifyHtml(node); + node.replaceWith(newNode); + } else if (node is dom.Text) { + final linkified = linkify( + node.text, + options: const LinkifyOptions( + humanize: false, + looseUrl: true, + defaultToHttps: true, + ), + ); + final newNode = dom.Element.tag('span'); + for (final element in linkified) { + if (element is TextElement) { + newNode.nodes.add(dom.Text(element.text)); + } else if (element is LinkableElement) { + final anchor = dom.Element.tag('a'); + anchor.attributes['href'] = element.url; + anchor.nodes.add(dom.Text(element.originText)); + newNode.nodes.add(anchor); + } + } + node.replaceWith(newNode); } - - final parts = linkify( - node.text, - options: const LinkifyOptions(humanize: false), - ); - - if (!parts.any((part) => part is UrlElement)) { - continue; - } - - final newHtml = parts - .map( - (linkifyElement) => linkifyElement is! UrlElement - ? linkifyElement.text - : '${linkifyElement.text}', - ) - .join(' '); - - node.replaceWith(dom.Element.html('
$newHtml
')); } return element; } @@ -350,6 +356,7 @@ class MatrixMathExtension extends HtmlExtension { final TextStyle? style; MatrixMathExtension({this.style}); + @override Set