diff --git a/ui/messages/html/parser.go b/ui/messages/html/parser.go
index d706bf6..e68b7aa 100644
--- a/ui/messages/html/parser.go
+++ b/ui/messages/html/parser.go
@@ -381,6 +381,7 @@ func (parser *htmlParser) tagNodeToEntity(node *html.Node) Entity {
}
var spaces = regexp.MustCompile("\\s+")
+var links = regexp.MustCompile(`https?://\S+`)
func (parser *htmlParser) singleNodeToEntity(node *html.Node) Entity {
switch node.Type {
@@ -392,7 +393,28 @@ func (parser *htmlParser) singleNodeToEntity(node *html.Node) Entity {
if len(node.Data) == 0 {
return nil
}
- return NewTextEntity(node.Data)
+ indices := links.FindAllStringIndex(node.Data, -1)
+ if len(indices) == 0 {
+ return NewTextEntity(node.Data)
+ }
+ ent := &ContainerEntity{
+ BaseEntity: &BaseEntity{Tag: "span"},
+ }
+ var lastEnd int
+ for i, item := range indices {
+ start, end := item[0], item[1]
+ if start > lastEnd {
+ ent.Children = append(ent.Children, NewTextEntity(node.Data[lastEnd:start]))
+ }
+ link := node.Data[start:end]
+ linkID := fmt.Sprintf("%s-%d", parser.evt.ID, i)
+ ent.Children = append(ent.Children, NewTextEntity(link).AdjustStyle(AdjustStyleLink(link, linkID), AdjustStyleReasonNormal))
+ lastEnd = end
+ }
+ if lastEnd < len(node.Data) {
+ ent.Children = append(ent.Children, NewTextEntity(node.Data[lastEnd:]))
+ }
+ return ent
case html.ElementNode:
parsed := parser.tagNodeToEntity(node)
if parsed != nil && !parsed.IsBlock() && parsed.IsEmpty() {
diff --git a/ui/messages/textmessage.go b/ui/messages/textmessage.go
index 202452c..a986366 100644
--- a/ui/messages/textmessage.go
+++ b/ui/messages/textmessage.go
@@ -76,7 +76,7 @@ func (msg *TextMessage) getCache(uiMsg *UIMessage) tstring.TString {
link := msg.Text[start:end]
linkID := fmt.Sprintf("%s-%d", msg.eventID, i)
content = content.
- Append(msg.Text[:start]).
+ Append(msg.Text[lastEnd:start]).
AppendTString(tstring.NewStyleTString(link, tcell.StyleDefault.Hyperlink(link, linkID)))
lastEnd = end
}