From 94d1d9dc9cd8026cd65c825180b36c5e319bb08e Mon Sep 17 00:00:00 2001 From: Ly-sec Date: Wed, 26 Nov 2025 15:00:27 +0100 Subject: [PATCH] Tray: fix blacklist wildcardc --- Modules/Bar/Widgets/Tray.qml | 12 ++++++++---- Modules/Panels/Tray/TrayDrawerPanel.qml | 10 ++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Modules/Bar/Widgets/Tray.qml b/Modules/Bar/Widgets/Tray.qml index dfd98fee..c3fd3307 100644 --- a/Modules/Bar/Widgets/Tray.qml +++ b/Modules/Bar/Widgets/Tray.qml @@ -161,10 +161,14 @@ Rectangle { } //Logger.d("Tray", "wildCardMatch - Input str:", str, "rule:", rule) - // Escape all special regex characters in the rule - let escapedRule = rule.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - // Convert '*' to '.*' for wildcard matching - let pattern = escapedRule.replace(/\\\*/g, '.*'); + // First, convert '*' to a placeholder to preserve it, then escape other special regex characters + // Use a unique placeholder that won't appear in normal strings + const placeholder = '\uE000'; // Private use character + let processedRule = rule.replace(/\*/g, placeholder); + // Escape all special regex characters (but placeholder won't match this) + let escapedRule = processedRule.replace(/[.+?^${}()|[\]\\]/g, '\\$&'); + // Convert placeholder back to '.*' for wildcard matching + let pattern = escapedRule.replace(new RegExp(placeholder, 'g'), '.*'); // Add ^ and $ to match the entire string pattern = '^' + pattern + '$'; diff --git a/Modules/Panels/Tray/TrayDrawerPanel.qml b/Modules/Panels/Tray/TrayDrawerPanel.qml index 2573f439..c114c74c 100644 --- a/Modules/Panels/Tray/TrayDrawerPanel.qml +++ b/Modules/Panels/Tray/TrayDrawerPanel.qml @@ -43,8 +43,14 @@ SmartPanel { function wildCardMatch(str, rule) { if (!str || !rule) return false; - let escaped = rule.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - let pattern = '^' + escaped.replace(/\\\*/g, '.*') + '$'; + // First, convert '*' to a placeholder to preserve it, then escape other special regex characters + // Use a unique placeholder that won't appear in normal strings + const placeholder = '\uE000'; // Private use character + let processedRule = rule.replace(/\*/g, placeholder); + // Escape all special regex characters (but placeholder won't match this) + let escaped = processedRule.replace(/[.+?^${}()|[\]\\]/g, '\\$&'); + // Convert placeholder back to '.*' for wildcard matching + let pattern = '^' + escaped.replace(new RegExp(placeholder, 'g'), '.*') + '$'; try { return new RegExp(pattern, 'i').test(str); } catch (e) {