XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEToolBox

【WPF】XFE工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEToolBox.QuickTools;

public sealed record QuickResult(string Title, string Detail, string? CopyText = null, QuickToolKind? Tool = null, string? Input = null)
{
    public string Glyph => Tool.HasValue ? QuickToolCatalog.Get(Tool.Value).Glyph : "\uE8EF";
    public string ActionText => CopyText is not null ? "Enter 复制" : Tool.HasValue ? "Enter 打开" : "检查输入";
}
public static class QuickQuery
{
    private static readonly string[] Prefixes = ["calc ", "unit ", "time ", "port ", "json ", "base64 ", "unbase64 ", "url ", "unurl ", "qr "];
    public static bool IsQuery(string text)
    { text = text.TrimStart(); return text.StartsWith('=') || text.Equals("uuid", StringComparison.OrdinalIgnoreCase) || text.Equals("ip", StringComparison.OrdinalIgnoreCase) || Prefixes.Any(p => text.StartsWith(p, StringComparison.OrdinalIgnoreCase)); }
    public static QuickResult[] Execute(string query)
    {
        try
        {
            query = query.TrimStart(); if (query.Length > 65536) throw new ArgumentException("快捷输入最多 64 KiB 字符。");
            if (query.StartsWith('=') || query.StartsWith("calc ", StringComparison.OrdinalIgnoreCase)) return Copy(Calculator.Calculate(query.StartsWith('=') ? query : query[5..]), "即时计算 · Enter 复制;不执行脚本");
            if (query.Equals("uuid", StringComparison.OrdinalIgnoreCase)) return Copy(Guid.NewGuid().ToString(), "GUID · Enter 复制");
            if (query.Equals("ip", StringComparison.OrdinalIgnoreCase)) return Copy(SystemActions.LocalAddresses(), "本机活动网卡 · Enter 复制");
            int split = query.IndexOf(' '); if (split < 0) return []; string command = query[..split].ToLowerInvariant(), input = query[(split + 1)..];
            switch (command)
            {
                case "unit": return Copy(Calculator.ConvertUnit(input), "单位换算 · GB 十进制 / GiB 二进制");
                case "time": return Copy(Calculator.Timestamp(input), "时间戳 / 日期转换");
                case "json": return Copy(TextActions.Apply("JSON 格式化", input), "JSON 格式化 · Enter 复制完整结果");
                case "base64": return Copy(TextActions.Apply("Base64 编码", input), "UTF-8 → Base64");
                case "unbase64": return Copy(TextActions.Apply("Base64 解码", input), "Base64 → UTF-8");
                case "url": return Copy(TextActions.Apply("URL 编码", input), "URL 编码");
                case "unurl": return Copy(TextActions.Apply("URL 解码", input), "URL 解码");
                case "qr": return [new("生成二维码", input, Tool: QuickToolKind.Qr, Input: input)];
                case "port":
                    if (!int.TryParse(input, out int port) || port is < 1 or > 65535) throw new ArgumentException("端口须为 1–65535,例如 port 8080。");
                    var rows = PortInspector.Query(port);
                    return rows.Count == 0 ? [new("未发现端口 " + port + " 的本机占用", "这是当前瞬间的查询结果;远程服务及稍后启动的进程不在此结果中。", Tool: QuickToolKind.Ports, Input: input)] : rows.Take(50).Select(r => new QuickResult(r.Display, r.Process.Path, Tool: QuickToolKind.Ports, Input: input)).ToArray();
                default: return [];
            }
        }
        catch (Exception e) { return [new("无法处理输入", e.Message)]; }
    }
    private static QuickResult[] Copy(string value, string detail) => [new(value.Length > 200 ? value[..200] + "…" : value, detail, value)];
}