mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-28 06:02:49 +08:00
69 lines
2.5 KiB
C#
69 lines
2.5 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Spectre.Console.Internal
|
|
{
|
|
internal static class ConsoleBuilder
|
|
{
|
|
public static IAnsiConsole Build(AnsiConsoleSettings settings)
|
|
{
|
|
if (settings is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(settings));
|
|
}
|
|
|
|
var buffer = settings.Out ?? System.Console.Out;
|
|
|
|
var supportsAnsi = settings.Ansi == AnsiSupport.Yes;
|
|
var legacyConsole = false;
|
|
|
|
if (settings.Ansi == AnsiSupport.Detect)
|
|
{
|
|
(supportsAnsi, legacyConsole) = AnsiDetector.Detect(true);
|
|
|
|
// Check whether or not this is a legacy console from the existing instance (if any).
|
|
// We need to do this because once we upgrade the console to support ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
|
// on Windows, there is no way of detecting whether or not we're running on a legacy console or not.
|
|
if (AnsiConsole.Created && !legacyConsole && buffer.IsStandardOut() && AnsiConsole.Capabilities.LegacyConsole)
|
|
{
|
|
legacyConsole = AnsiConsole.Capabilities.LegacyConsole;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (buffer.IsStandardOut())
|
|
{
|
|
// Are we running on Windows?
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
// Not the first console we're creating?
|
|
if (AnsiConsole.Created)
|
|
{
|
|
legacyConsole = AnsiConsole.Capabilities.LegacyConsole;
|
|
}
|
|
else
|
|
{
|
|
// Try detecting whether or not this
|
|
(_, legacyConsole) = AnsiDetector.Detect(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var colorSystem = settings.ColorSystem == ColorSystemSupport.Detect
|
|
? ColorSystemDetector.Detect(supportsAnsi)
|
|
: (ColorSystem)settings.ColorSystem;
|
|
|
|
if (supportsAnsi)
|
|
{
|
|
return new AnsiConsoleRenderer(buffer, colorSystem, legacyConsole)
|
|
{
|
|
Decoration = Decoration.None,
|
|
};
|
|
}
|
|
|
|
return new FallbackConsoleRenderer(buffer, colorSystem, legacyConsole);
|
|
}
|
|
}
|
|
}
|