feat: add default input parser

- define standard key names for normalized input events

- parse common terminal key sequences and bracketed paste

- update example to display parsed input events
This commit is contained in:
chuan
2026-06-03 21:53:18 +08:00
parent 0d9a36b6a6
commit 0fd4465aa8
3 changed files with 220 additions and 11 deletions
+29 -11
View File
@@ -1,31 +1,34 @@
using TinyTUI;
using TinyTUI.Input;
using TinyTUI.Stdio;
using TinyTUI.Stdout;
using var input = new ConsoleTerminalInput();
var output = new ConsoleTerminalOutput();
var parser = new DefaultInputParser();
var done = new ManualResetEventSlim();
var latestSize = input.CurrentSize;
output.ClearScreen();
output.HideCursor();
Render(output, latestSize, "等待输入");
Render(output, latestSize, "等待输入", []);
input.DataReceived += (_, data) =>
{
if (data == "\x1b")
var events = parser.Parse(data);
if (events.Any(static e => e is { Kind: TuiInputEventKind.Key, Value: KeyNames.Escape }))
{
done.Set();
return;
}
Render(output, latestSize, $"按键: {FormatInput(data)}");
Render(output, latestSize, $"原始输入: {FormatInput(data)}", events);
};
input.Resized += (_, size) =>
{
latestSize = size;
Render(output, latestSize, "窗口尺寸已变化");
Render(output, latestSize, "窗口尺寸已变化", [new TuiInputEvent(TuiInputEventKind.Resize, $"{size.Columns}x{size.Rows}")]);
};
try
@@ -41,18 +44,33 @@ finally
output.Flush();
}
static void Render(ConsoleTerminalOutput output, TerminalSize size, string message)
static void Render(ConsoleTerminalOutput output, TerminalSize size, string message, IReadOnlyList<TuiInputEvent> events)
{
output.ClearScreen();
output.Write("TinyTUI IO 示例\r\n");
output.Write("================\r\n");
output.Write("TinyTUI Input 示例\r\n");
output.Write("===================\r\n");
output.Write($"尺寸: {size.Columns} x {size.Rows}\r\n");
output.Write($"{message}\r\n");
output.Write("\r\n");
output.Write("解析事件:\r\n");
if (events.Count == 0)
{
output.Write("- 无\r\n");
}
else
{
foreach (var inputEvent in events)
{
output.Write($"- {inputEvent.Kind}: {FormatInput(inputEvent.Value)}\r\n");
}
}
output.Write("\r\n");
output.Write("测试方式:\r\n");
output.Write("- 输入普通字符 观察按键内容\r\n");
output.Write("- 按方向键 Home End Delete F1-F12 观察原始序列\r\n");
output.Write("- 改变终端窗口大小 观察尺寸刷新\r\n");
output.Write("- 输入普通字符 应解析为 Text\r\n");
output.Write("- 按方向键 Home End Delete F1-F12 应解析为 Key\r\n");
output.Write("- 改变终端窗口大小 应解析为 Resize\r\n");
output.Write("- 按 Esc 退出\r\n");
output.Flush();
}
@@ -65,7 +83,7 @@ static string FormatInput(string data)
'\n' => "\\n",
'\t' => "\\t",
'\b' => "\\b",
'\x1b' => "\\x1b",
'\e' => "\\e",
_ when char.IsControl(c) => $"\\x{(int)c:x2}",
_ => c.ToString(),
}));