diff --git a/ui/messages/html/parser.go b/ui/messages/html/parser.go
index 0281e4a..ce4caee 100644
--- a/ui/messages/html/parser.go
+++ b/ui/messages/html/parser.go
@@ -388,16 +388,39 @@ func (parser *htmlParser) tagNodeToEntity(node *html.Node) Entity {
var spaces = regexp.MustCompile("\\s+")
+// textToHTMLEntity converts a plain text string into an HTML Entity while preserving newlines.
+func textToHTMLEntity(text string) Entity {
+ lines := strings.SplitAfter(text, "\n")
+ if len(lines) == 1 {
+ return NewTextEntity(text)
+ }
+ ent := &ContainerEntity{
+ BaseEntity: &BaseEntity{Tag: "span"},
+ }
+ for _, line := range lines {
+ line_len := len(line)
+ if line_len == 0 {
+ continue
+ }
+ if line[line_len-1:] == "\n" {
+ ent.Children = append(ent.Children, NewTextEntity(line[:line_len-1]), NewBreakEntity())
+ } else {
+ ent.Children = append(ent.Children, NewTextEntity(line))
+ }
+ }
+ return ent
+}
+
func TextToEntity(text string, eventID id.EventID, linkify bool) Entity {
if len(text) == 0 {
return nil
}
if !linkify {
- return NewTextEntity(text)
+ return textToHTMLEntity(text)
}
indices := xurls.Strict().FindAllStringIndex(text, -1)
if len(indices) == 0 {
- return NewTextEntity(text)
+ return textToHTMLEntity(text)
}
ent := &ContainerEntity{
BaseEntity: &BaseEntity{Tag: "span"},
@@ -406,7 +429,7 @@ func TextToEntity(text string, eventID id.EventID, linkify bool) Entity {
for i, item := range indices {
start, end := item[0], item[1]
if start > lastEnd {
- ent.Children = append(ent.Children, NewTextEntity(text[lastEnd:start]))
+ ent.Children = append(ent.Children, textToHTMLEntity(text[lastEnd:start]))
}
link := text[start:end]
linkID := fmt.Sprintf("%s-%d", eventID, i)
@@ -414,7 +437,7 @@ func TextToEntity(text string, eventID id.EventID, linkify bool) Entity {
lastEnd = end
}
if lastEnd < len(text) {
- ent.Children = append(ent.Children, NewTextEntity(text[lastEnd:]))
+ ent.Children = append(ent.Children, textToHTMLEntity(text[lastEnd:]))
}
return ent
}