Loading TestV/PlaygroundLauncher.cs +4 −4 Original line number Diff line number Diff line Loading @@ -23,9 +23,9 @@ public class PlaygroundLauncher(Action onReload) /// <param name="args">命令行参数数组,用于检查是否需要显示游乐场列表等。</param> public void Startup(string[] args) { Console.WriteLine($"PlaygroundLauncher: {GetType()}"); Thread.Sleep(2000); // Console.WriteLine($"PlaygroundLauncher: {GetType()}"); // // Thread.Sleep(2000); try { AnsiConsole.Clear(); Loading Loading @@ -291,7 +291,7 @@ public class PlaygroundLauncher(Action onReload) /// <exception cref="ArgumentException">当添加的游乐场与已有游乐场具有相同的LaunchCmd属性值时抛出。</exception> public PlaygroundLauncher Add<TP>() where TP : class, IPlayground, new() { Console.WriteLine($"<{typeof(TP).FullName}> Loaded"); // Console.WriteLine($"<{typeof(TP).FullName}> Loaded"); if (_running) throw new Exception("无法在运行 Startup() 后添加 Playground."); Loading TestV/Playgrounds/Base64Tool/B64TextEncoding.cs 0 → 100644 +62 −0 Original line number Diff line number Diff line using System.Text; using Spectre.Console; using TestV.Tools; namespace TestV.Playgrounds.Base64Tool; public class B64TextEncoding { public class Encoder : IPlayground { public string LaunchCmd { get; } = "btoa"; public string? Name { get; } = "String To Base64String"; public string? Description { get; } = "btoa [Text] <Encoder> <Order> <BOM>\n" + " 可选编码器:\n" + " --u8(UTF-8编解码,默认)、\n" + " --u16(UTF-16编解码)。\n" + " 可选字节序:\n" + " --le:小端序\n" + " --be:大端序(默认)\n" + " 可选字节序标记:" + " --bom:带字节序标记" + " 不填:不带字节序标记(默认)"; public Task Run(string[] args) { if (Errors.ValidArgsLength(args, 1)) { var text = args[0]; var encoderArg = args.Length > 1 ? args[1].ToLower() : "--u8"; var orderArg = args.Length > 2 ? args[2].ToLower() : "--be"; var bomArg = args.Length > 3 ? args[3].ToLower() : string.Empty; if (Errors.ValidArrowsArgWithName(encoderArg, "Encoder", "--u8", "--u16") && Errors.ValidArrowsArgWithName(orderArg, "Order", "--le", "--be") && Errors.ValidArrowsArgWithName(bomArg, "BOM", "--bom", string.Empty)) { var isBigEndian = orderArg switch { "--be" => true, _ => false }; var isBom = bomArg switch { "--bom" => true, _ => false }; Encoding encoder = encoderArg switch { "--u16" => new UnicodeEncoding(isBigEndian, isBom), _ => new UTF8Encoding(isBigEndian, isBom) }; AnsiConsole.WriteLine(Convert.ToBase64String(encoder.GetBytes(text))); AnsiConsole.WriteLine(); } } return Task.CompletedTask; } } } No newline at end of file TestV/Program.cs +13 −11 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ using System.Runtime.Intrinsics.Arm; using System.Runtime.Intrinsics.X86; using System.Text; using TestV.Playgrounds; using TestV.Playgrounds.Base64Tool; using TestV.Playgrounds.Ts; namespace TestV; Loading Loading @@ -120,17 +121,17 @@ class Program var reload = false; do { Console.WriteLine(new string('0', DateTime.Now.Second)); Console.WriteLine($"TestV -> {Assembly.GetExecutingAssembly().EntryPoint}"); Console.WriteLine($"{Assembly.GetExecutingAssembly()}"); Console.WriteLine("shRabbit, 2026/3/28"); Console.WriteLine(DateTime.Now.ToString("O")); Console.WriteLine("0x" + DateTime.Now.Ticks.ToString("x")); Console.WriteLine(new string('=', 32)); foreach (var t in GetAllTypes()) Console.WriteLine(t); // Console.WriteLine(new string('0', DateTime.Now.Second)); // Console.WriteLine($"TestV -> {Assembly.GetExecutingAssembly().EntryPoint}"); // Console.WriteLine($"{Assembly.GetExecutingAssembly()}"); // Console.WriteLine("shRabbit, 2026/3/28"); // Console.WriteLine(DateTime.Now.ToString("O")); // Console.WriteLine("0x" + DateTime.Now.Ticks.ToString("x")); // // Console.WriteLine(new string('=', 32)); // // foreach (var t in GetAllTypes()) // Console.WriteLine(t); reload = false; Loading @@ -156,6 +157,7 @@ class Program .Add<MemoryAdd>() .Add<Ref>() .Add<SliInt>() .Add<B64TextEncoding.Encoder>() .Add<Exp1>(); play.Startup(args); Loading TestV/Tools/Errors.cs +43 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,49 @@ public class Errors public static void NoArgs(int needMinArgs) { AnsiConsole.MarkupLine(" [red]└ 错误:参数太少。[/]\n" + $" [darkred]最少需要 {needMinArgs} 个。[/]\n"); $" [red]最少需要 {needMinArgs} 个。[/]\n"); } public static void NotArrow(ReadOnlySpan<char> argName, params ReadOnlySpan<string> arrowsArg) { AnsiConsole.MarkupLine($" [red]└ 错误:参数{argName}不被允许。[/]\n" + $" [red]可选参数为:{string.Join(", ", arrowsArg)}[/]\n"); } public static void NotArrow(params ReadOnlySpan<string> arrowsArg) { AnsiConsole.MarkupLine($" [red]└ 错误:参数不被允许。[/]\n" + $" [red]可选参数为:{string.Join(", ", arrowsArg)}[/]\n"); } public static bool ValidArgsLength(ReadOnlySpan<string> args, int minArgsLength) { if (args.Length >= minArgsLength) return true; NoArgs(minArgsLength); return false; } public static bool ValidArrowsArg(ReadOnlySpan<char> arg, params ReadOnlySpan<string> arrowsArg) { foreach (var arrow in arrowsArg) { if (arg.Equals(arrow.AsSpan(), StringComparison.Ordinal)) return true; } NotArrow(arrowsArg); return false; } public static bool ValidArrowsArgWithName(ReadOnlySpan<char> arg, ReadOnlySpan<char> argName, params ReadOnlySpan<string> arrowsArg) { foreach (var arrow in arrowsArg) { if (arg.Equals(arrow.AsSpan(), StringComparison.Ordinal)) return true; } NotArrow(argName, arrowsArg); return false; } } Loading
TestV/PlaygroundLauncher.cs +4 −4 Original line number Diff line number Diff line Loading @@ -23,9 +23,9 @@ public class PlaygroundLauncher(Action onReload) /// <param name="args">命令行参数数组,用于检查是否需要显示游乐场列表等。</param> public void Startup(string[] args) { Console.WriteLine($"PlaygroundLauncher: {GetType()}"); Thread.Sleep(2000); // Console.WriteLine($"PlaygroundLauncher: {GetType()}"); // // Thread.Sleep(2000); try { AnsiConsole.Clear(); Loading Loading @@ -291,7 +291,7 @@ public class PlaygroundLauncher(Action onReload) /// <exception cref="ArgumentException">当添加的游乐场与已有游乐场具有相同的LaunchCmd属性值时抛出。</exception> public PlaygroundLauncher Add<TP>() where TP : class, IPlayground, new() { Console.WriteLine($"<{typeof(TP).FullName}> Loaded"); // Console.WriteLine($"<{typeof(TP).FullName}> Loaded"); if (_running) throw new Exception("无法在运行 Startup() 后添加 Playground."); Loading
TestV/Playgrounds/Base64Tool/B64TextEncoding.cs 0 → 100644 +62 −0 Original line number Diff line number Diff line using System.Text; using Spectre.Console; using TestV.Tools; namespace TestV.Playgrounds.Base64Tool; public class B64TextEncoding { public class Encoder : IPlayground { public string LaunchCmd { get; } = "btoa"; public string? Name { get; } = "String To Base64String"; public string? Description { get; } = "btoa [Text] <Encoder> <Order> <BOM>\n" + " 可选编码器:\n" + " --u8(UTF-8编解码,默认)、\n" + " --u16(UTF-16编解码)。\n" + " 可选字节序:\n" + " --le:小端序\n" + " --be:大端序(默认)\n" + " 可选字节序标记:" + " --bom:带字节序标记" + " 不填:不带字节序标记(默认)"; public Task Run(string[] args) { if (Errors.ValidArgsLength(args, 1)) { var text = args[0]; var encoderArg = args.Length > 1 ? args[1].ToLower() : "--u8"; var orderArg = args.Length > 2 ? args[2].ToLower() : "--be"; var bomArg = args.Length > 3 ? args[3].ToLower() : string.Empty; if (Errors.ValidArrowsArgWithName(encoderArg, "Encoder", "--u8", "--u16") && Errors.ValidArrowsArgWithName(orderArg, "Order", "--le", "--be") && Errors.ValidArrowsArgWithName(bomArg, "BOM", "--bom", string.Empty)) { var isBigEndian = orderArg switch { "--be" => true, _ => false }; var isBom = bomArg switch { "--bom" => true, _ => false }; Encoding encoder = encoderArg switch { "--u16" => new UnicodeEncoding(isBigEndian, isBom), _ => new UTF8Encoding(isBigEndian, isBom) }; AnsiConsole.WriteLine(Convert.ToBase64String(encoder.GetBytes(text))); AnsiConsole.WriteLine(); } } return Task.CompletedTask; } } } No newline at end of file
TestV/Program.cs +13 −11 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ using System.Runtime.Intrinsics.Arm; using System.Runtime.Intrinsics.X86; using System.Text; using TestV.Playgrounds; using TestV.Playgrounds.Base64Tool; using TestV.Playgrounds.Ts; namespace TestV; Loading Loading @@ -120,17 +121,17 @@ class Program var reload = false; do { Console.WriteLine(new string('0', DateTime.Now.Second)); Console.WriteLine($"TestV -> {Assembly.GetExecutingAssembly().EntryPoint}"); Console.WriteLine($"{Assembly.GetExecutingAssembly()}"); Console.WriteLine("shRabbit, 2026/3/28"); Console.WriteLine(DateTime.Now.ToString("O")); Console.WriteLine("0x" + DateTime.Now.Ticks.ToString("x")); Console.WriteLine(new string('=', 32)); foreach (var t in GetAllTypes()) Console.WriteLine(t); // Console.WriteLine(new string('0', DateTime.Now.Second)); // Console.WriteLine($"TestV -> {Assembly.GetExecutingAssembly().EntryPoint}"); // Console.WriteLine($"{Assembly.GetExecutingAssembly()}"); // Console.WriteLine("shRabbit, 2026/3/28"); // Console.WriteLine(DateTime.Now.ToString("O")); // Console.WriteLine("0x" + DateTime.Now.Ticks.ToString("x")); // // Console.WriteLine(new string('=', 32)); // // foreach (var t in GetAllTypes()) // Console.WriteLine(t); reload = false; Loading @@ -156,6 +157,7 @@ class Program .Add<MemoryAdd>() .Add<Ref>() .Add<SliInt>() .Add<B64TextEncoding.Encoder>() .Add<Exp1>(); play.Startup(args); Loading
TestV/Tools/Errors.cs +43 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,49 @@ public class Errors public static void NoArgs(int needMinArgs) { AnsiConsole.MarkupLine(" [red]└ 错误:参数太少。[/]\n" + $" [darkred]最少需要 {needMinArgs} 个。[/]\n"); $" [red]最少需要 {needMinArgs} 个。[/]\n"); } public static void NotArrow(ReadOnlySpan<char> argName, params ReadOnlySpan<string> arrowsArg) { AnsiConsole.MarkupLine($" [red]└ 错误:参数{argName}不被允许。[/]\n" + $" [red]可选参数为:{string.Join(", ", arrowsArg)}[/]\n"); } public static void NotArrow(params ReadOnlySpan<string> arrowsArg) { AnsiConsole.MarkupLine($" [red]└ 错误:参数不被允许。[/]\n" + $" [red]可选参数为:{string.Join(", ", arrowsArg)}[/]\n"); } public static bool ValidArgsLength(ReadOnlySpan<string> args, int minArgsLength) { if (args.Length >= minArgsLength) return true; NoArgs(minArgsLength); return false; } public static bool ValidArrowsArg(ReadOnlySpan<char> arg, params ReadOnlySpan<string> arrowsArg) { foreach (var arrow in arrowsArg) { if (arg.Equals(arrow.AsSpan(), StringComparison.Ordinal)) return true; } NotArrow(arrowsArg); return false; } public static bool ValidArrowsArgWithName(ReadOnlySpan<char> arg, ReadOnlySpan<char> argName, params ReadOnlySpan<string> arrowsArg) { foreach (var arrow in arrowsArg) { if (arg.Equals(arrow.AsSpan(), StringComparison.Ordinal)) return true; } NotArrow(argName, arrowsArg); return false; } }