diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart
index 94db697fa..4be47ce07 100644
--- a/lib/pages/chat/events/html_message.dart
+++ b/lib/pages/chat/events/html_message.dart
@@ -83,21 +83,25 @@ class HtmlMessage extends StatelessWidget {
/// We add line breaks before these tags:
static const Set blockHtmlTags = {
'p',
+ 'ul',
+ 'ol',
+ 'pre',
+ 'br',
+ 'div',
+ 'table',
+ 'details',
+ 'blockquote',
+ };
+
+ /// We add line breaks before these tags:
+ static const Set fullLineHtmlTag = {
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
- 'ul',
- 'ol',
'li',
- 'pre',
- 'br',
- 'div',
- 'table',
- 'blockquote',
- 'details',
};
/// Adding line breaks before block elements.
@@ -105,17 +109,24 @@ class HtmlMessage extends StatelessWidget {
dom.NodeList nodes,
BuildContext context, {
int depth = 1,
- }) =>
- [
- for (var i = 0; i < nodes.length; i++) ...[
- if (i > 0 &&
- nodes[i] is dom.Element &&
- blockHtmlTags.contains((nodes[i] as dom.Element).localName))
- const TextSpan(text: '\n'), // Add linebreak
- // Actually render the node child:
- _renderHtml(nodes[i], context, depth: depth + 1),
+ }) {
+ final onlyElements = nodes.whereType().toList();
+ return [
+ for (var i = 0; i < nodes.length; i++) ...[
+ // Actually render the node child:
+ _renderHtml(nodes[i], context, depth: depth + 1),
+ // Add linebreaks between blocks:
+ if (nodes[i] is dom.Element &&
+ onlyElements.indexOf(nodes[i] as dom.Element) <
+ onlyElements.length - 1) ...[
+ if (blockHtmlTags.contains((nodes[i] as dom.Element).localName))
+ const TextSpan(text: '\n\n'),
+ if (fullLineHtmlTag.contains((nodes[i] as dom.Element).localName))
+ const TextSpan(text: '\n'),
],
- ];
+ ],
+ ];
+ }
/// Transforms a Node to an InlineSpan.
InlineSpan _renderHtml(
@@ -144,6 +155,8 @@ class HtmlMessage extends StatelessWidget {
if (!allowedHtmlTags.contains(node.localName)) return const TextSpan();
switch (node.localName) {
+ case 'br':
+ return const TextSpan(text: '\n');
case 'a':
final href = node.attributes['href'];
if (href == null) continue block;