[UI][Common] Wrap torrent comment and tracker status URLs in HTML (clickable)

Closes: https://github.com/deluge-torrent/deluge/pull/460
This commit is contained in:
zakary 2024-08-26 03:34:27 -05:00 committed by Calum Lind
parent 9d802b2a91
commit 3bceb4bfc1
No known key found for this signature in database
GPG Key ID: 90597A687B836BA3
3 changed files with 18 additions and 5 deletions

View File

@ -720,6 +720,16 @@ def parse_human_size(size):
raise InvalidSize(msg % (size, tokens)) raise InvalidSize(msg % (size, tokens))
def anchorify_urls(text: str) -> str:
"""
Wrap all occurrences of text URLs with HTML
"""
url_pattern = r'((htt)|(ft)|(ud))ps?://\S+'
html_href_pattern = r'<a href="\g<0>">\g<0></a>'
return re.sub(url_pattern, html_href_pattern, text)
def is_url(url): def is_url(url):
""" """
A simple test to check if the URL is valid A simple test to check if the URL is valid

View File

@ -10,7 +10,7 @@ import logging
from xml.sax.saxutils import escape as xml_escape from xml.sax.saxutils import escape as xml_escape
import deluge.component as component import deluge.component as component
from deluge.common import decode_bytes, fdate, fsize, is_url from deluge.common import anchorify_urls, decode_bytes, fdate, fsize
from .tab_data_funcs import fdate_or_dash, fpieces_num_size from .tab_data_funcs import fdate_or_dash, fpieces_num_size
from .torrentdetails import Tab from .torrentdetails import Tab
@ -61,8 +61,8 @@ class DetailsTab(Tab):
for widget in self.tab_widgets.values(): for widget in self.tab_widgets.values():
txt = xml_escape(self.widget_status_as_fstr(widget, status)) txt = xml_escape(self.widget_status_as_fstr(widget, status))
if decode_bytes(widget.obj.get_text()) != txt: if decode_bytes(widget.obj.get_text()) != txt:
if 'comment' in widget.status_keys and is_url(txt): if 'comment' in widget.status_keys:
widget.obj.set_markup(f'<a href="{txt}">{txt}</a>') widget.obj.set_markup(anchorify_urls(txt))
else: else:
widget.obj.set_markup(txt) widget.obj.set_markup(txt)

View File

@ -9,7 +9,7 @@
import logging import logging
import deluge.component as component import deluge.component as component
from deluge.common import ftime from deluge.common import anchorify_urls, ftime
from .tab_data_funcs import fcount, ftranslate, fyes_no from .tab_data_funcs import fcount, ftranslate, fyes_no
from .torrentdetails import Tab from .torrentdetails import Tab
@ -54,7 +54,10 @@ class TrackersTab(Tab):
for widget in self.tab_widgets.values(): for widget in self.tab_widgets.values():
txt = self.widget_status_as_fstr(widget, status) txt = self.widget_status_as_fstr(widget, status)
if widget.obj.get_text() != txt: if widget.obj.get_text() != txt:
widget.obj.set_text(txt) if 'tracker_status' in widget.status_keys:
widget.obj.set_markup(anchorify_urls(txt))
else:
widget.obj.set_text(txt)
def clear(self): def clear(self):
for widget in self.tab_widgets.values(): for widget in self.tab_widgets.values():