mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-06-18 21:08:15 +08:00
Add support for fake input in asciicast recordings
* Fixes a bug with `SelectionPrompt` and page size. * Allow `IAnsiConsoleInput` to return `null`.
This commit is contained in:

committed by
Phil Scott

parent
46abadaccb
commit
450d87f5d3
@ -0,0 +1,95 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using Spectre.Console;
|
||||
|
||||
namespace Generator.Commands
|
||||
{
|
||||
public class AsciiCastOut : IAnsiConsoleOutput
|
||||
{
|
||||
private sealed class AsciiCastWriter : TextWriter
|
||||
{
|
||||
private readonly TextWriter _wrappedTextWriter;
|
||||
private readonly StringBuilder _builder = new StringBuilder();
|
||||
private int? _firstTick;
|
||||
|
||||
public AsciiCastWriter(TextWriter wrappedTextWriter)
|
||||
{
|
||||
_wrappedTextWriter = wrappedTextWriter;
|
||||
}
|
||||
|
||||
public override void Write(string value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Append(value);
|
||||
_wrappedTextWriter.Write(value);
|
||||
base.Write(value);
|
||||
}
|
||||
|
||||
public override Encoding Encoding => _wrappedTextWriter.Encoding;
|
||||
|
||||
private void Append(string value)
|
||||
{
|
||||
var tick = 0m;
|
||||
if (_firstTick.HasValue)
|
||||
{
|
||||
tick = Environment.TickCount - _firstTick.Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
_firstTick = Environment.TickCount;
|
||||
}
|
||||
|
||||
tick /= 1000m;
|
||||
|
||||
_builder.Append('[')
|
||||
.AppendFormat(CultureInfo.InvariantCulture, "{0}", tick)
|
||||
.Append(", \"o\", \"").Append(JsonEncodedText.Encode(value)).AppendLine("\"]");
|
||||
}
|
||||
|
||||
public string GetJsonAndClearBuffer()
|
||||
{
|
||||
var json = _builder.ToString();
|
||||
|
||||
// reset the buffer and also reset the first tick count
|
||||
_builder.Clear();
|
||||
_firstTick = null;
|
||||
return json;
|
||||
}
|
||||
}
|
||||
|
||||
private readonly IAnsiConsoleOutput _wrappedAnsiConsole;
|
||||
private readonly AsciiCastWriter _asciiCastWriter;
|
||||
|
||||
public AsciiCastOut(IAnsiConsoleOutput wrappedAnsiConsole)
|
||||
{
|
||||
_wrappedAnsiConsole = wrappedAnsiConsole ?? throw new ArgumentNullException(nameof(wrappedAnsiConsole));
|
||||
_asciiCastWriter = new AsciiCastWriter(_wrappedAnsiConsole.Writer);
|
||||
}
|
||||
|
||||
public TextWriter Writer => _asciiCastWriter;
|
||||
|
||||
public bool IsTerminal => _wrappedAnsiConsole.IsTerminal;
|
||||
|
||||
public int Width => _wrappedAnsiConsole.Width;
|
||||
|
||||
public int Height => _wrappedAnsiConsole.Height;
|
||||
|
||||
public void SetEncoding(Encoding encoding)
|
||||
{
|
||||
_wrappedAnsiConsole.SetEncoding(encoding);
|
||||
}
|
||||
|
||||
public string GetCastJson(string title, int? width = null, int? height = null)
|
||||
{
|
||||
var header = $"{{\"version\": 2, \"width\": {width ?? _wrappedAnsiConsole.Width}, \"height\": {height ?? _wrappedAnsiConsole.Height}, \"title\": \"{JsonEncodedText.Encode(title)}\", \"env\": {{\"TERM\": \"Spectre.Console\"}}}}";
|
||||
return $"{header}{Environment.NewLine}{_asciiCastWriter.GetJsonAndClearBuffer()}{Environment.NewLine}";
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user