From 4fbd74a14d14cc680a85d25b18a30cdc200229b1 Mon Sep 17 00:00:00 2001 From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:07:57 +0500 Subject: [PATCH 1/2] [WebSearch] Add copy URL to menu --- .../Images/copylink.png | Bin 0 -> 3242 bytes .../Languages/en.xaml | 3 +- .../Languages/ru.xaml | 3 +- .../Flow.Launcher.Plugin.WebSearch/Main.cs | 26 ++++++++++++++++-- 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 Plugins/Flow.Launcher.Plugin.WebSearch/Images/copylink.png diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Images/copylink.png b/Plugins/Flow.Launcher.Plugin.WebSearch/Images/copylink.png new file mode 100644 index 0000000000000000000000000000000000000000..3218c94c9a0fb53f923197042c20cc994b22d5c9 GIT binary patch literal 3242 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 tZoO{?HSJz0(Q3fW&j#(;6%(K^!0cZ>DW!Smyf^ - + Copy URL + Copy search URL to clipboard Title diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml index a2ec9405a16..b8757f67b1a 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml @@ -29,7 +29,8 @@ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} - + Скопировать URL-адрес + Скопировать URL поиска в буфер обмена Title diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs index 39aa1738fca..9b3dd06f505 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs @@ -11,7 +11,7 @@ namespace Flow.Launcher.Plugin.WebSearch { - public class Main : IAsyncPlugin, ISettingProvider, IPluginI18n, IResultUpdated + public class Main : IAsyncPlugin, ISettingProvider, IPluginI18n, IResultUpdated, IContextMenu { private PluginInitContext _context; @@ -76,7 +76,8 @@ public async Task> QueryAsync(Query query, CancellationToken token) _context.API.OpenUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(keyword))); return true; - } + }, + ContextData = searchSource.Url.Replace("{q}", Uri.EscapeDataString(keyword)), }; results.Add(result); @@ -139,11 +140,30 @@ private async Task> SuggestionsAsync(string keyword, string _context.API.OpenUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(o))); return true; - } + }, + ContextData = searchSource.Url.Replace("{q}", Uri.EscapeDataString(o)), }); return resultsFromSuggestion; } + public List LoadContextMenus(Result selected) + { + return new List() { + new Result + { + Title = _context.API.GetTranslation("flowlauncher_plugin_websearch_copyurl_title"), + SubTitle = _context.API.GetTranslation("flowlauncher_plugin_websearch_copyurl_subtitle"), + IcoPath = "Images/copylink.png", + Action = c => + { + _context.API.CopyToClipboard(selected.ContextData as string); + + return true; + } + }, + }; + } + public Task InitAsync(PluginInitContext context) { return Task.Run(Init); From 386ac9735f3a53f3fbd12a3a8c01523c49cae818 Mon Sep 17 00:00:00 2001 From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:43:22 +0500 Subject: [PATCH 2/2] [WebSearch] sanitize ContextData --- Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs index 9b3dd06f505..bf5fadc5451 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs @@ -148,6 +148,7 @@ private async Task> SuggestionsAsync(string keyword, string public List LoadContextMenus(Result selected) { + if (selected?.ContextData == null || selected.ContextData is not string) return new List(); return new List() { new Result {