2020-06-29 09:56:28 +00:00
|
|
|
using System;
|
2020-05-24 09:09:44 +00:00
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace Flow.Launcher.Plugin.Explorer.Search
|
|
|
|
|
{
|
|
|
|
|
public static class EnvironmentVariables
|
|
|
|
|
{
|
|
|
|
|
internal static bool IsEnvironmentVariableSearch(string search)
|
|
|
|
|
{
|
2020-06-20 04:26:13 +00:00
|
|
|
return LoadEnvironmentStringPaths().Count > 0
|
|
|
|
|
&& search.StartsWith("%")
|
|
|
|
|
&& search != "%%"
|
|
|
|
|
&& !search.Contains("\\");
|
2020-05-24 09:09:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static Dictionary<string, string> LoadEnvironmentStringPaths()
|
|
|
|
|
{
|
2020-06-29 09:56:28 +00:00
|
|
|
var envStringPaths = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
|
2020-05-24 09:09:44 +00:00
|
|
|
|
|
|
|
|
foreach (DictionaryEntry special in Environment.GetEnvironmentVariables())
|
|
|
|
|
{
|
2020-08-24 21:20:39 +00:00
|
|
|
var path = special.Value.ToString();
|
|
|
|
|
if (Directory.Exists(path))
|
2020-05-24 09:09:44 +00:00
|
|
|
{
|
2020-08-24 21:20:39 +00:00
|
|
|
// we add a trailing slash to the path to make sure drive paths become valid absolute paths.
|
|
|
|
|
// for example, if %systemdrive% is C: we turn it to C:\
|
|
|
|
|
path = path.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;
|
2020-08-25 05:00:17 +00:00
|
|
|
|
2020-08-24 21:20:39 +00:00
|
|
|
// if we don't have an absolute path, we use Path.GetFullPath to get one.
|
|
|
|
|
// for example, if %homepath% is \Users\John we turn it to C:\Users\John
|
|
|
|
|
path = Path.IsPathFullyQualified(path) ? path : Path.GetFullPath(path);
|
2020-08-25 05:00:17 +00:00
|
|
|
|
2020-06-29 09:56:28 +00:00
|
|
|
// Variables are returned with a mixture of all upper/lower case.
|
2020-06-29 11:53:01 +00:00
|
|
|
// Call ToLower() to make the results look consistent
|
2020-08-24 21:20:39 +00:00
|
|
|
envStringPaths.Add(special.Key.ToString().ToLower(), path);
|
2020-05-24 09:09:44 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return envStringPaths;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static string TranslateEnvironmentVariablePath(string environmentVariablePath)
|
|
|
|
|
{
|
|
|
|
|
var envStringPaths = LoadEnvironmentStringPaths();
|
|
|
|
|
var splitSearch = environmentVariablePath.Substring(1).Split("%");
|
|
|
|
|
var exactEnvStringPath = splitSearch[0];
|
|
|
|
|
|
|
|
|
|
// if there are more than 2 % characters in the query, don't bother
|
|
|
|
|
if (splitSearch.Length == 2 && envStringPaths.ContainsKey(exactEnvStringPath))
|
|
|
|
|
{
|
|
|
|
|
var queryPartToReplace = $"%{exactEnvStringPath}%";
|
|
|
|
|
var expandedPath = envStringPaths[exactEnvStringPath];
|
|
|
|
|
// replace the %envstring% part of the query with its expanded equivalent
|
|
|
|
|
return environmentVariablePath.Replace(queryPartToReplace, expandedPath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return environmentVariablePath;
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-08 04:20:22 +00:00
|
|
|
internal static List<Result> GetEnvironmentStringPathSuggestions(string querySearch, Query query, PluginInitContext context)
|
2020-05-24 09:09:44 +00:00
|
|
|
{
|
|
|
|
|
var results = new List<Result>();
|
|
|
|
|
|
|
|
|
|
var environmentVariables = LoadEnvironmentStringPaths();
|
|
|
|
|
var search = querySearch;
|
|
|
|
|
|
|
|
|
|
if (querySearch.EndsWith("%") && search.Length > 1)
|
|
|
|
|
{
|
|
|
|
|
// query starts and ends with a %, find an exact match from env-string paths
|
|
|
|
|
search = querySearch.Substring(1, search.Length - 2);
|
|
|
|
|
|
|
|
|
|
if (environmentVariables.ContainsKey(search))
|
|
|
|
|
{
|
|
|
|
|
var expandedPath = environmentVariables[search];
|
|
|
|
|
|
2020-06-08 04:20:22 +00:00
|
|
|
results.Add(new ResultManager(context).CreateFolderResult($"%{search}%", expandedPath, expandedPath, query));
|
2020-05-24 09:09:44 +00:00
|
|
|
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (querySearch == "%")
|
|
|
|
|
{
|
|
|
|
|
search = ""; // Get all paths
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
search = search.Substring(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var p in environmentVariables)
|
|
|
|
|
{
|
2020-06-29 09:56:28 +00:00
|
|
|
if (p.Key.StartsWith(search, StringComparison.InvariantCultureIgnoreCase))
|
2020-05-24 09:09:44 +00:00
|
|
|
{
|
2020-06-08 04:20:22 +00:00
|
|
|
results.Add(new ResultManager(context).CreateFolderResult($"%{p.Key}%", p.Value, p.Value, query));
|
2020-05-24 09:09:44 +00:00
|
|
|
}
|
|
|
|
|
}
|
2020-06-29 09:56:28 +00:00
|
|
|
|
2020-05-24 09:09:44 +00:00
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|