From f1e05eb96438a19c51ffe8aff63faa37ae1cbd99 Mon Sep 17 00:00:00 2001 From: TrigamDev Date: Thu, 24 Apr 2025 22:40:28 -0400 Subject: [PATCH 1/7] feat: links in text fields are clickable --- src/tagstudio/qt/widgets/text.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/tagstudio/qt/widgets/text.py b/src/tagstudio/qt/widgets/text.py index 90b3008e1..9fb040d67 100644 --- a/src/tagstudio/qt/widgets/text.py +++ b/src/tagstudio/qt/widgets/text.py @@ -6,8 +6,12 @@ from PySide6.QtCore import Qt from PySide6.QtWidgets import QHBoxLayout, QLabel +import re +import structlog + from tagstudio.qt.widgets.fields import FieldWidget +logger = structlog.get_logger(__name__) class TextWidget(FieldWidget): def __init__(self, title, text: str) -> None: @@ -16,12 +20,28 @@ def __init__(self, title, text: str) -> None: self.base_layout = QHBoxLayout() self.base_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.base_layout) + + # Label self.text_label = QLabel() self.text_label.setStyleSheet("font-size: 12px") self.text_label.setWordWrap(True) - self.text_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse) + self.text_label.setTextFormat(Qt.TextFormat.RichText) + self.text_label.setOpenExternalLinks(True) + self.text_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextBrowserInteraction) self.base_layout.addWidget(self.text_label) self.set_text(text) def set_text(self, text: str): + text = linkify(text) self.text_label.setText(text) + +# A more complete regex should be used +# This one is fairly basic and limited, but works +def linkify(text: str): + url_pattern = "(https?://[^\s]+)" + return re.sub( + url_pattern, + lambda url: f'{url.group(0)}', + text, + re.IGNORECASE + ) \ No newline at end of file From 5bca2766e1c572234edbaf33ba6ce206c5e3fa40 Mon Sep 17 00:00:00 2001 From: TrigamDev Date: Thu, 24 Apr 2025 22:47:18 -0400 Subject: [PATCH 2/7] style: fix linting errors --- src/tagstudio/qt/widgets/text.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/tagstudio/qt/widgets/text.py b/src/tagstudio/qt/widgets/text.py index 9fb040d67..fafc6ec1c 100644 --- a/src/tagstudio/qt/widgets/text.py +++ b/src/tagstudio/qt/widgets/text.py @@ -3,15 +3,13 @@ # Created for TagStudio: https://github.com/CyanVoxel/TagStudio +import re + from PySide6.QtCore import Qt from PySide6.QtWidgets import QHBoxLayout, QLabel -import re -import structlog - from tagstudio.qt.widgets.fields import FieldWidget -logger = structlog.get_logger(__name__) class TextWidget(FieldWidget): def __init__(self, title, text: str) -> None: @@ -43,5 +41,5 @@ def linkify(text: str): url_pattern, lambda url: f'{url.group(0)}', text, - re.IGNORECASE + flags=re.IGNORECASE ) \ No newline at end of file From 31cff34013acfdcf2087c10010a1619f4bf8a689 Mon Sep 17 00:00:00 2001 From: TrigamDev Date: Thu, 24 Apr 2025 22:53:13 -0400 Subject: [PATCH 3/7] style: remove unnecessary comment --- src/tagstudio/qt/widgets/text.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tagstudio/qt/widgets/text.py b/src/tagstudio/qt/widgets/text.py index fafc6ec1c..420cc68bc 100644 --- a/src/tagstudio/qt/widgets/text.py +++ b/src/tagstudio/qt/widgets/text.py @@ -18,8 +18,6 @@ def __init__(self, title, text: str) -> None: self.base_layout = QHBoxLayout() self.base_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.base_layout) - - # Label self.text_label = QLabel() self.text_label.setStyleSheet("font-size: 12px") self.text_label.setWordWrap(True) From fe3bcc92a7cf3bada1755d886fff33c7032f3f79 Mon Sep 17 00:00:00 2001 From: TrigamDev Date: Fri, 25 Apr 2025 11:49:58 -0400 Subject: [PATCH 4/7] feat: better url pattern --- src/tagstudio/qt/widgets/text.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/tagstudio/qt/widgets/text.py b/src/tagstudio/qt/widgets/text.py index 420cc68bc..a603b662c 100644 --- a/src/tagstudio/qt/widgets/text.py +++ b/src/tagstudio/qt/widgets/text.py @@ -31,10 +31,9 @@ def set_text(self, text: str): text = linkify(text) self.text_label.setText(text) -# A more complete regex should be used -# This one is fairly basic and limited, but works +# Regex from https://stackoverflow.com/a/6041965 def linkify(text: str): - url_pattern = "(https?://[^\s]+)" + url_pattern = r"(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-*]*[\w@?^=%&\/~+#-*])" return re.sub( url_pattern, lambda url: f'{url.group(0)}', From c377938f9f541640f400924407b44e99ebeaafd9 Mon Sep 17 00:00:00 2001 From: TrigamDev Date: Sat, 7 Jun 2025 10:10:48 -0400 Subject: [PATCH 5/7] chore: disable Ruff error --- src/tagstudio/qt/widgets/text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tagstudio/qt/widgets/text.py b/src/tagstudio/qt/widgets/text.py index a603b662c..33b7fce9c 100644 --- a/src/tagstudio/qt/widgets/text.py +++ b/src/tagstudio/qt/widgets/text.py @@ -33,7 +33,7 @@ def set_text(self, text: str): # Regex from https://stackoverflow.com/a/6041965 def linkify(text: str): - url_pattern = r"(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-*]*[\w@?^=%&\/~+#-*])" + url_pattern = r"(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-*]*[\w@?^=%&\/~+#-*])" # noqa: E501 return re.sub( url_pattern, lambda url: f'{url.group(0)}', From bdebe107ba0ad67ed9f06b5a47d3846d5a889599 Mon Sep 17 00:00:00 2001 From: TrigamDev Date: Sat, 7 Jun 2025 10:13:52 -0400 Subject: [PATCH 6/7] style: add trailing line --- src/tagstudio/qt/widgets/text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tagstudio/qt/widgets/text.py b/src/tagstudio/qt/widgets/text.py index 33b7fce9c..e45cd00c3 100644 --- a/src/tagstudio/qt/widgets/text.py +++ b/src/tagstudio/qt/widgets/text.py @@ -39,4 +39,4 @@ def linkify(text: str): lambda url: f'{url.group(0)}', text, flags=re.IGNORECASE - ) \ No newline at end of file + ) From f939ce792e03cacdc4486af2466eb220ec5d4203 Mon Sep 17 00:00:00 2001 From: TrigamDev Date: Sat, 7 Jun 2025 10:23:24 -0400 Subject: [PATCH 7/7] style: maybe format it? that'd be smart --- src/tagstudio/qt/widgets/text.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tagstudio/qt/widgets/text.py b/src/tagstudio/qt/widgets/text.py index e45cd00c3..94386b21a 100644 --- a/src/tagstudio/qt/widgets/text.py +++ b/src/tagstudio/qt/widgets/text.py @@ -31,12 +31,15 @@ def set_text(self, text: str): text = linkify(text) self.text_label.setText(text) + # Regex from https://stackoverflow.com/a/6041965 def linkify(text: str): - url_pattern = r"(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-*]*[\w@?^=%&\/~+#-*])" # noqa: E501 + url_pattern = ( + r"(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-*]*[\w@?^=%&\/~+#-*])" + ) return re.sub( url_pattern, lambda url: f'{url.group(0)}', text, - flags=re.IGNORECASE + flags=re.IGNORECASE, )