mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-12-30 12:25:48 +08:00
Change IAnsiConsole to render IRenderable
This makes it possible for encoders to output better representation of the actual objects instead of working with chopped up segments. * IAnsiConsole.Write now takes an IRenderable instead of segments * Calculating cell width does no longer require a render context * Removed RenderContext.LegacyConsole * Removed RenderContext.Encoding * Added Capabilities.Unicode
This commit is contained in:
committed by
Phil Scott
parent
2ba6da3514
commit
20650f1e7e
47
src/Spectre.Console/Extensions/RenderableExtensions.cs
Normal file
47
src/Spectre.Console/Extensions/RenderableExtensions.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Spectre.Console.Rendering;
|
||||
|
||||
namespace Spectre.Console
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains extension methods for <see cref="IRenderable"/>.
|
||||
/// </summary>
|
||||
public static class RenderableExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the segments for a renderable using the specified console.
|
||||
/// </summary>
|
||||
/// <param name="renderable">The renderable.</param>
|
||||
/// <param name="console">The console.</param>
|
||||
/// <returns>An enumerable containing segments representing the specified <see cref="IRenderable"/>.</returns>
|
||||
public static IEnumerable<Segment> GetSegments(this IRenderable renderable, IAnsiConsole console)
|
||||
{
|
||||
if (console is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(console));
|
||||
}
|
||||
|
||||
if (renderable is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(renderable));
|
||||
}
|
||||
|
||||
var context = new RenderContext(console.Profile.Capabilities);
|
||||
var renderables = console.Pipeline.Process(context, new[] { renderable });
|
||||
|
||||
return GetSegments(console, context, renderables);
|
||||
}
|
||||
|
||||
private static IEnumerable<Segment> GetSegments(IAnsiConsole console, RenderContext options, IEnumerable<IRenderable> renderables)
|
||||
{
|
||||
var result = new List<Segment>();
|
||||
foreach (var renderable in renderables)
|
||||
{
|
||||
result.AddRange(renderable.Render(options, console.Profile.Width));
|
||||
}
|
||||
|
||||
return Segment.Merge(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user