Skip to content

Instantly share code, notes, and snippets.

@patriksvensson
Last active August 31, 2024 18:53
Show Gist options
  • Save patriksvensson/7af07f46e207ff873f9e734ac9ee95ff to your computer and use it in GitHub Desktop.
Save patriksvensson/7af07f46e207ff873f9e734ac9ee95ff to your computer and use it in GitHub Desktop.
Spectre.Console typewriter
using Spectre.Console;
using Spectre.Console.Rendering;
var renderable = new Markup("[yellow]H[/]ello [blue]W[/]orld");
foreach (var segment in SplitSegments(renderable))
{
AnsiConsole.Write(new SegmentRenderable(segment));
Thread.Sleep(Random.Shared.Next(100, 500));
}
// Splits all segments in a renderable into segments of 1 character
IEnumerable<Segment> SplitSegments(IRenderable renderable)
{
foreach (var segment in renderable.GetSegments(AnsiConsole.Console))
{
if (segment is { IsLineBreak: false, Text.Length: > 1 })
{
foreach (var text in segment.Text)
{
yield return new Segment(text.ToString(), segment.Style);
}
}
else
{
yield return segment;
}
}
}
// Renders a segment as a renderable
public sealed class SegmentRenderable : Renderable
{
private readonly Segment _segment;
public SegmentRenderable(Segment segment)
{
_segment = segment ?? throw new ArgumentNullException(nameof(segment));
}
protected override IEnumerable<Segment> Render(RenderOptions options, int maxWidth)
{
return new[] { _segment };
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment