mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-16 08:52:50 +08:00

Also refactors the code quite a bit, to make it a bit more easier to add features like this in the future. Closes #75
46 lines
1.4 KiB
C#
46 lines
1.4 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Spectre.Console.Rendering;
|
|
|
|
namespace Spectre.Console
|
|
{
|
|
/// <summary>
|
|
/// Contains extension methods for <see cref="IAnsiConsole"/>.
|
|
/// </summary>
|
|
public static partial class AnsiConsoleExtensions
|
|
{
|
|
/// <summary>
|
|
/// Renders the specified object to the console.
|
|
/// </summary>
|
|
/// <param name="console">The console to render to.</param>
|
|
/// <param name="renderable">The object to render.</param>
|
|
public static void Render(this IAnsiConsole console, IRenderable renderable)
|
|
{
|
|
if (console is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(console));
|
|
}
|
|
|
|
if (renderable is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(renderable));
|
|
}
|
|
|
|
var options = new RenderContext(console.Encoding, console.Capabilities.LegacyConsole);
|
|
var segments = renderable.Render(options, console.Width).Where(x => !(x.Text.Length == 0 && !x.IsLineBreak)).ToArray();
|
|
segments = Segment.Merge(segments).ToArray();
|
|
|
|
var current = Style.Plain;
|
|
foreach (var segment in segments)
|
|
{
|
|
if (string.IsNullOrEmpty(segment.Text))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
console.Write(segment.Text, segment.Style);
|
|
}
|
|
}
|
|
}
|
|
}
|