// Copyright (c) Microsoft Corporation // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; using Wox.Plugin; namespace PowerLauncher.Plugin { public static class QueryBuilder { public static Dictionary Build(string text) { if (text == null) { throw new ArgumentNullException(nameof(text)); } text = text.Trim(); int longestActionKeywordLength = 0; // This Dictionary contains the corresponding query for each plugin Dictionary pluginQueryPair = new Dictionary(); foreach (var nonGlobalPlugin in PluginManager.NonGlobalPlugins) { var pluginActionKeyword = nonGlobalPlugin.Metadata.ActionKeyword; if (nonGlobalPlugin.Metadata.Disabled || !text.StartsWith(pluginActionKeyword, StringComparison.Ordinal)) { continue; } // Save the length of the longest matching keyword for later use if (pluginActionKeyword.Length > longestActionKeywordLength) { longestActionKeywordLength = pluginActionKeyword.Length; } // A new query is constructed for each plugin var query = new Query(text, pluginActionKeyword); pluginQueryPair.TryAdd(nonGlobalPlugin, query); } // If we have plugin action keywords that start with the same char we get false positives (Example: ? and ??) // Here we remove each query pair that has a shorter keyword than the longest matching one foreach (PluginPair plugin in pluginQueryPair.Keys) { if (plugin.Metadata.ActionKeyword.Length < longestActionKeywordLength) { pluginQueryPair.Remove(plugin); } } // If the user has specified a matching action keyword, then do not // add the global plugins to the list. if (pluginQueryPair.Count == 0) { foreach (PluginPair globalPlugin in PluginManager.GlobalPlugins) { if (!globalPlugin.Metadata.Disabled && !pluginQueryPair.ContainsKey(globalPlugin)) { var query = new Query(text); pluginQueryPair.Add(globalPlugin, query); } } } return pluginQueryPair; } } }