From 5d5a52850f21b48f806c65d97a6386370713614c Mon Sep 17 00:00:00 2001 From: Joes Date: Sat, 12 Oct 2024 11:41:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=8F=B0=E8=BE=93=E5=87=BA=E5=8F=AF=E7=82=B9=E5=87=BB=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=8A=9F=E8=83=BD,=E7=B1=BB=E4=BC=BC.NET=20SDK?= =?UTF-8?q?=E4=B8=AD=E5=8F=91=E5=B8=83=E7=A8=8B=E5=BA=8F=E7=9A=84=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E7=BB=93=E6=9E=9C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/EasilyNET.Core/Misc/StringExtension.cs | 59 ++++++++++++++++--- .../Misc/TextWriterExtensions.cs | 35 +++++++++++ 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/src/EasilyNET.Core/Misc/StringExtension.cs b/src/EasilyNET.Core/Misc/StringExtension.cs index 40a3323d..33cd3f2c 100644 --- a/src/EasilyNET.Core/Misc/StringExtension.cs +++ b/src/EasilyNET.Core/Misc/StringExtension.cs @@ -64,7 +64,7 @@ public static string ToTitleUpperCase(this string value, bool lower = true) { var regex = ToTitleUpperCaseRegex(); return regex.Replace(value, - delegate(Match m) + delegate (Match m) { var str = m.ToString(); if (!char.IsLower(str[0])) return str; @@ -163,12 +163,12 @@ public static string Mask(this string value, char mask = '*') return value.Length switch { >= 11 => MaskElevenRegex().Replace(value, $"$1{masks}$2"), - 10 => MaskTenRegex().Replace(value, $"$1{masks}$2"), - 9 => MaskNineRegex().Replace(value, $"$1{masks}$2"), - 8 => MaskEightRegex().Replace(value, $"$1{masks}$2"), - 7 => MaskSevenRegex().Replace(value, $"$1{masks}$2"), - 6 => MaskSixRegex().Replace(value, $"$1{masks}$2"), - _ => MaskLessThanSixRegex().Replace(value, $"$1{masks}") + 10 => MaskTenRegex().Replace(value, $"$1{masks}$2"), + 9 => MaskNineRegex().Replace(value, $"$1{masks}$2"), + 8 => MaskEightRegex().Replace(value, $"$1{masks}$2"), + 7 => MaskSevenRegex().Replace(value, $"$1{masks}$2"), + 6 => MaskSixRegex().Replace(value, $"$1{masks}$2"), + _ => MaskLessThanSixRegex().Replace(value, $"$1{masks}") }; } @@ -683,4 +683,49 @@ public static string SnakeCaseToCamelCase(this string value, ECamelCase toType = } return string.Concat(words); } + + /// + /// 获取一个能在控制台中点击的路径,使用 [] 点击打开对应目录 + /// + /// + /// 使用方式: + /// + /// + /// + /// + /// + /// + /// 需要处理的路径 + /// + public static string GetClickablePath(this string path) => $"\e]8;;file://\e\\{path}\e]8;;\e\\"; + + /// + /// 获取一个能在控制台中点击的相对路径,使用 [] 点击打开对应目录 + /// + /// + /// 使用方式: + /// + /// + /// + /// + /// + /// + /// 需要处理的路径 + /// 仅保留最后 N 层目录,默认5层,当超过最大层数后显示全路径 + /// + public static string GetClickableRelativePath(this string path, int maxDeep = 5) + { + // 分割路径并仅保留最后 N 层目录 + var pathParts = path.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); + var displayPath = pathParts.Length > maxDeep ? string.Join(Path.DirectorySeparatorChar, pathParts[^maxDeep..]) : path; + return $"\e]8;;file://{path}\e\\{displayPath}\e]8;;\e\\"; + } } \ No newline at end of file diff --git a/src/EasilyNET.Core/Misc/TextWriterExtensions.cs b/src/EasilyNET.Core/Misc/TextWriterExtensions.cs index 1f35d197..5b2fbec7 100644 --- a/src/EasilyNET.Core/Misc/TextWriterExtensions.cs +++ b/src/EasilyNET.Core/Misc/TextWriterExtensions.cs @@ -92,6 +92,41 @@ public static async Task SafeClearPreviousLine(this TextWriter _) } } + /// + /// 在控制台输出可点击的路径,使用 [] 即可打开路径 + /// + /// + /// 使用方式: + /// + /// + /// + /// + /// + /// + /// + /// 需要处理的完整路径 + /// 是否输出相对路径,默认: + /// 当为相对路径的时候配置目录深度,仅保留最后 N 层目录 + /// 是否换行,默认: ,行为同: Console.Write() + public static void WriteClickablePath(this TextWriter _, string path, bool relative = false, int deep = 5, bool newLine = false) + { + if (string.IsNullOrWhiteSpace(path)) return; + switch (newLine) + { + case true: + Console.WriteLine(relative ? path.GetClickableRelativePath(deep) : path.GetClickablePath()); + break; + default: + Console.Write(relative ? path.GetClickableRelativePath(deep) : path.GetClickablePath()); + break; + } + } + private static void UpdateClearLine() { if (Console.WindowWidth == _lastWindowWidth) return;