From c7a22fc14fd9803493ece8786b7c4ed8053b7af6 Mon Sep 17 00:00:00 2001
From: lovetox <philipp@hoerist.com>
Date: Fri, 30 Apr 2021 14:05:20 +0200
Subject: [PATCH] Add Links to MessageLabel

---
 gajim/common/styling.py                | 17 ++++++++++++-----
 gajim/gtk/conversation/plain_widget.py | 12 +++++++++---
 2 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/gajim/common/styling.py b/gajim/common/styling.py
index 1f5ccc95fc..124da22bb6 100644
--- a/gajim/common/styling.py
+++ b/gajim/common/styling.py
@@ -3,6 +3,8 @@
 from dataclasses import dataclass
 from dataclasses import field
 
+from gi.repository import GLib
+
 PRE = '`'
 STRONG = '*'
 STRIKE = '~'
@@ -41,23 +43,28 @@ class StyleObject:
     text: str
 
 
+class URIMarkup:
+    def get_markup_string(self):
+        return f'<a href="{self.text}">{self.text}</a>'
+
+
 @dataclass
-class Uri(StyleObject):
+class Uri(StyleObject, URIMarkup):
     name: str = field(default='uri', init=False)
 
 
 @dataclass
-class Address(StyleObject):
+class Address(StyleObject, URIMarkup):
     name: str = field(default='address', init=False)
 
 
 @dataclass
-class XMPPAddress(StyleObject):
+class XMPPAddress(StyleObject, URIMarkup):
     name: str = field(default='xmppadr', init=False)
 
 
 @dataclass
-class MailAddress(StyleObject):
+class MailAddress(StyleObject, URIMarkup):
     name: str = field(default='mailadr', init=False)
 
 
@@ -135,7 +142,7 @@ def process(text, nested=False):
     blocks = _parse_blocks(text, nested)
     for block in blocks:
         if isinstance(block, PlainBlock):
-            offset = block.start
+            offset = 0
             for line in block.text.splitlines(keepends=True):
                 block.spans += _parse_line(line, offset)
                 block.uris += _parse_uris(line, offset)
diff --git a/gajim/gtk/conversation/plain_widget.py b/gajim/gtk/conversation/plain_widget.py
index 8c2bc962a5..1e247b0610 100644
--- a/gajim/gtk/conversation/plain_widget.py
+++ b/gajim/gtk/conversation/plain_widget.py
@@ -18,6 +18,7 @@
 from gi.repository import Gtk
 from gi.repository import Pango
 from gi.repository import Gdk
+from gi.repository import GLib
 
 from gajim.common import app
 from gajim.common import i18n
@@ -42,8 +43,8 @@ def __init__(self, account):
 
         self._account = account
 
-        self._text_widget = MessageTextview(self._account)
-        # self._text_widget = MessageLabel(self._account)
+        # self._text_widget = MessageTextview(self._account)
+        self._text_widget = MessageLabel(self._account)
         self.add(self._text_widget)
 
     def add_content(self, block):
@@ -58,16 +59,21 @@ def __init__(self, account):
         self.set_line_wrap(True)
         self.set_xalign(0)
         self.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR)
+        self.set_track_visited_links(False)
 
         self._account = account
 
     def print_text_with_styling(self, block):
+        text = GLib.markup_escape_text(block.text.strip())
+        for uri in block.uris:
+            text = text.replace(uri.text, uri.get_markup_string())
+
         attr_list = Pango.AttrList()
         for span in block.spans:
             attr = make_pango_attribute(span.name, span.start, span.end)
             attr_list.insert(attr)
 
-        self.set_text(block.text.strip())
+        self.set_markup(text)
         self.set_attributes(attr_list)
 
 
-- 
GitLab