From 20650f1e7e81d4c38f4ff3d4fb96392203912921 Mon Sep 17 00:00:00 2001 From: Patrik Svensson Date: Wed, 24 Mar 2021 23:09:24 +0100 Subject: [PATCH] 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 --- examples/Console/Info/Program.cs | 1 + examples/Console/Tables/Program.cs | 1 + .../Fakes/FakeAnsiConsole.cs | 14 +-- .../Fakes/FakeCapabilities.cs | 17 +++ .../Fakes/FakeConsole.cs | 10 +- .../Widgets/Recorder/Html.Output.verified.txt | 10 +- .../Unit/BarChartTests.cs | 4 +- .../Unit/BoxBorderTests.cs | 12 +- .../Unit/BreakdownChartTests.cs | 16 +-- .../Unit/CalendarTests.cs | 10 +- src/Spectre.Console.Tests/Unit/CanvasTests.cs | 10 +- .../Unit/ColumnsTests.cs | 2 +- src/Spectre.Console.Tests/Unit/FigletTests.cs | 12 +- src/Spectre.Console.Tests/Unit/GridTests.cs | 12 +- src/Spectre.Console.Tests/Unit/MarkupTests.cs | 4 +- src/Spectre.Console.Tests/Unit/PadderTests.cs | 6 +- src/Spectre.Console.Tests/Unit/PanelTests.cs | 34 ++--- .../Unit/Progress/ProgressColumnFixture.cs | 7 +- .../Unit/RecorderTests.cs | 6 +- .../Unit/RenderHookTests.cs | 2 +- src/Spectre.Console.Tests/Unit/RowsTests.cs | 6 +- src/Spectre.Console.Tests/Unit/RuleTests.cs | 18 +-- .../Unit/SegmentTests.cs | 11 +- .../Unit/TableBorderTests.cs | 42 +++---- src/Spectre.Console.Tests/Unit/TableTests.cs | 34 ++--- src/Spectre.Console.Tests/Unit/TextTests.cs | 17 +-- src/Spectre.Console.Tests/Unit/TreeTests.cs | 6 +- src/Spectre.Console/AnsiConsole.Recording.cs | 4 +- src/Spectre.Console/AnsiConsole.Rendering.cs | 8 +- src/Spectre.Console/AnsiConsole.Write.cs | 2 +- src/Spectre.Console/AnsiConsoleFactory.cs | 3 +- src/Spectre.Console/Capabilities.cs | 17 +-- .../Extensions/AnsiConsoleExtensions.cs | 4 +- .../Enrichment/ProfileEnricher.cs | 1 - .../Terminals/WindowsTerminalEnricher.cs | 19 --- .../AnsiConsoleExtensions.Exceptions.cs | 4 +- .../AnsiConsoleExtensions.Markup.cs | 2 +- .../AnsiConsoleExtensions.Rendering.cs | 18 +-- .../Extensions/AnsiConsoleExtensions.cs | 27 +--- .../Extensions/RecorderExtensions.cs | 1 + .../Extensions/RenderableExtensions.cs | 47 +++++++ .../Extensions/StringExtensions.cs | 10 +- src/Spectre.Console/IAnsiConsole.cs | 7 +- src/Spectre.Console/IReadOnlyCapabilities.cs | 48 +++++++ src/Spectre.Console/Internal/Aligner.cs | 6 +- .../Backends/Ansi/AnsiConsoleBackend.cs | 19 ++- .../Backends/Ansi/AnsiConsoleCursor.cs | 15 ++- .../Internal/Backends/AnsiConsoleFacade.cs | 10 +- .../Internal/Backends/IAnsiConsoleBackend.cs | 7 +- .../Backends/Legacy/LegacyConsoleBackend.cs | 17 ++- src/Spectre.Console/Internal/Cell.cs | 18 +-- .../Internal/Text/Encoding/HtmlEncoder.cs | 65 +++++----- .../Internal/Text/Encoding/TextEncoder.cs | 31 +++-- src/Spectre.Console/Profile.cs | 14 +-- src/Spectre.Console/Recorder.cs | 33 ++--- .../Rendering/IAnsiConsoleEncoder.cs | 9 +- .../Rendering/LiveRenderable.cs | 2 +- .../Rendering/RenderContext.cs | 34 ++--- src/Spectre.Console/Rendering/Segment.cs | 119 ++++-------------- src/Spectre.Console/Rendering/SegmentLine.cs | 10 +- src/Spectre.Console/Rendering/SegmentShape.cs | 4 +- .../Widgets/Figlet/FigletText.cs | 2 +- src/Spectre.Console/Widgets/Padder.cs | 4 +- src/Spectre.Console/Widgets/Panel.cs | 6 +- src/Spectre.Console/Widgets/Paragraph.cs | 18 +-- .../Widgets/Progress/Columns/SpinnerColumn.cs | 6 +- .../Widgets/Progress/ProgressContext.cs | 2 +- .../Renderers/DefaultProgressRenderer.cs | 4 +- src/Spectre.Console/Widgets/ProgressBar.cs | 2 +- .../Prompt}/ConfirmationPrompt.cs | 0 .../Prompt/Rendering/RenderableList.cs | 4 +- src/Spectre.Console/Widgets/Rule.cs | 16 +-- .../Widgets/Table/TableRenderer.cs | 16 +-- .../Widgets/Table/TableRendererContext.cs | 2 +- src/Spectre.Console/Widgets/Tree.cs | 4 +- 75 files changed, 492 insertions(+), 553 deletions(-) create mode 100644 src/Spectre.Console.Testing/Fakes/FakeCapabilities.cs delete mode 100644 src/Spectre.Console/Enrichment/Terminals/WindowsTerminalEnricher.cs create mode 100644 src/Spectre.Console/Extensions/RenderableExtensions.cs create mode 100644 src/Spectre.Console/IReadOnlyCapabilities.cs rename src/Spectre.Console/{ => Widgets/Prompt}/ConfirmationPrompt.cs (100%) diff --git a/examples/Console/Info/Program.cs b/examples/Console/Info/Program.cs index d06d6ab..3cb5f82 100644 --- a/examples/Console/Info/Program.cs +++ b/examples/Console/Info/Program.cs @@ -11,6 +11,7 @@ namespace InfoExample .AddColumn() .AddRow("[b]Enrichers[/]", string.Join(", ", AnsiConsole.Profile.Enrichers)) .AddRow("[b]Color system[/]", $"{AnsiConsole.Profile.ColorSystem}") + .AddRow("[b]Unicode?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Unicode)}") .AddRow("[b]Supports ansi?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Ansi)}") .AddRow("[b]Supports links?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Links)}") .AddRow("[b]Legacy console?[/]", $"{YesNo(AnsiConsole.Profile.Capabilities.Legacy)}") diff --git a/examples/Console/Tables/Program.cs b/examples/Console/Tables/Program.cs index 31fc3ae..ce7b6cf 100644 --- a/examples/Console/Tables/Program.cs +++ b/examples/Console/Tables/Program.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using Spectre.Console; namespace TableExample diff --git a/src/Spectre.Console.Testing/Fakes/FakeAnsiConsole.cs b/src/Spectre.Console.Testing/Fakes/FakeAnsiConsole.cs index 1f3cab0..a9b09c1 100644 --- a/src/Spectre.Console.Testing/Fakes/FakeAnsiConsole.cs +++ b/src/Spectre.Console.Testing/Fakes/FakeAnsiConsole.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using Spectre.Console.Rendering; @@ -42,6 +41,7 @@ namespace Spectre.Console.Testing }); _console.Profile.Width = width; + _console.Profile.Capabilities.Unicode = true; Input = new FakeConsoleInput(); } @@ -56,17 +56,9 @@ namespace Spectre.Console.Testing _console.Clear(home); } - public void Write(IEnumerable segments) + public void Write(IRenderable renderable) { - if (segments is null) - { - return; - } - - foreach (var segment in segments) - { - _console.Write(segment); - } + _console.Write(renderable); } } } diff --git a/src/Spectre.Console.Testing/Fakes/FakeCapabilities.cs b/src/Spectre.Console.Testing/Fakes/FakeCapabilities.cs new file mode 100644 index 0000000..85547e1 --- /dev/null +++ b/src/Spectre.Console.Testing/Fakes/FakeCapabilities.cs @@ -0,0 +1,17 @@ +namespace Spectre.Console.Testing +{ + public sealed class FakeCapabilities : IReadOnlyCapabilities + { + public bool Ansi { get; set; } + + public bool Links { get; set; } + + public bool Legacy { get; set; } + + public bool Tty { get; set; } + + public bool Interactive { get; set; } + + public bool Unicode { get; set; } + } +} diff --git a/src/Spectre.Console.Testing/Fakes/FakeConsole.cs b/src/Spectre.Console.Testing/Fakes/FakeConsole.cs index 0bd53cc..8474fe9 100644 --- a/src/Spectre.Console.Testing/Fakes/FakeConsole.cs +++ b/src/Spectre.Console.Testing/Fakes/FakeConsole.cs @@ -36,6 +36,7 @@ namespace Spectre.Console.Testing Profile.Capabilities.Legacy = legacyConsole; Profile.Capabilities.Interactive = interactive; Profile.Capabilities.Links = true; + Profile.Capabilities.Unicode = true; } public void Dispose() @@ -47,14 +48,9 @@ namespace Spectre.Console.Testing { } - public void Write(IEnumerable segments) + public void Write(IRenderable renderable) { - if (segments is null) - { - return; - } - - foreach (var segment in segments) + foreach (var segment in renderable.GetSegments(this)) { Profile.Out.Write(segment.Text); } diff --git a/src/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt b/src/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt index 5e20bc3..84a882e 100644 --- a/src/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt +++ b/src/Spectre.Console.Tests/Expectations/Widgets/Recorder/Html.Output.verified.txt @@ -1,10 +1,10 @@
 ┌─────────────────┬───────┬─────┐
-FooBarQux
+ Foo              Bar    Qux 
 ├─────────────────┼───────┼─────┤
-CorgiWaldoZap
-╭─────────────╮ │       │     │
- Hello World  │       │     │
-╰─────────────╯ │       │     │
+ Corgi            Waldo  Zap 
+ ─────────────             
+  Hello World              
+ ─────────────             
 └─────────────────┴───────┴─────┘
 
\ No newline at end of file diff --git a/src/Spectre.Console.Tests/Unit/BarChartTests.cs b/src/Spectre.Console.Tests/Unit/BarChartTests.cs index 988f96a..34319e7 100644 --- a/src/Spectre.Console.Tests/Unit/BarChartTests.cs +++ b/src/Spectre.Console.Tests/Unit/BarChartTests.cs @@ -18,7 +18,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new BarChart() + console.Write(new BarChart() .Width(60) .Label("Number of fruits") .AddItem("Apple", 12) @@ -37,7 +37,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new BarChart() + console.Write(new BarChart() .Width(60) .Label("Number of fruits") .AddItem("Apple", 0) diff --git a/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs b/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs index efb0ff4..e41ff59 100644 --- a/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs +++ b/src/Spectre.Console.Tests/Unit/BoxBorderTests.cs @@ -37,7 +37,7 @@ namespace Spectre.Console.Tests.Unit var panel = Fixture.GetPanel().NoBorder(); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); @@ -69,7 +69,7 @@ namespace Spectre.Console.Tests.Unit var panel = Fixture.GetPanel().AsciiBorder(); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); @@ -101,7 +101,7 @@ namespace Spectre.Console.Tests.Unit var panel = Fixture.GetPanel().DoubleBorder(); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); @@ -133,7 +133,7 @@ namespace Spectre.Console.Tests.Unit var panel = Fixture.GetPanel().HeavyBorder(); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); @@ -162,7 +162,7 @@ namespace Spectre.Console.Tests.Unit var panel = Fixture.GetPanel().RoundedBorder(); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); @@ -191,7 +191,7 @@ namespace Spectre.Console.Tests.Unit var panel = Fixture.GetPanel().SquareBorder(); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs b/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs index b16991b..1ff4352 100644 --- a/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs +++ b/src/Spectre.Console.Tests/Unit/BreakdownChartTests.cs @@ -19,7 +19,7 @@ namespace Spectre.Console.Tests.Unit var chart = Fixture.GetChart(); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); @@ -34,7 +34,7 @@ namespace Spectre.Console.Tests.Unit var chart = Fixture.GetChart().Width(60); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); @@ -52,7 +52,7 @@ namespace Spectre.Console.Tests.Unit .UseValueFormatter((v, c) => string.Format(c, "{0}%", v)); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); @@ -67,7 +67,7 @@ namespace Spectre.Console.Tests.Unit var chart = Fixture.GetChart().Width(60).HideTags(); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); @@ -82,7 +82,7 @@ namespace Spectre.Console.Tests.Unit var chart = Fixture.GetChart().Width(60).HideTagValues(); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); @@ -97,7 +97,7 @@ namespace Spectre.Console.Tests.Unit var chart = Fixture.GetChart().Width(60).Culture("sv-SE"); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); @@ -112,7 +112,7 @@ namespace Spectre.Console.Tests.Unit var chart = Fixture.GetChart().Width(60).FullSize(); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); @@ -127,7 +127,7 @@ namespace Spectre.Console.Tests.Unit var chart = Fixture.GetChart().Width(60).FullSize(); // When - console.Render(chart); + console.Write(chart); // Then await Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/CalendarTests.cs b/src/Spectre.Console.Tests/Unit/CalendarTests.cs index 453fbbd..af8228e 100644 --- a/src/Spectre.Console.Tests/Unit/CalendarTests.cs +++ b/src/Spectre.Console.Tests/Unit/CalendarTests.cs @@ -23,7 +23,7 @@ namespace Spectre.Console.Tests.Unit .AddCalendarEvent(new DateTime(2020, 10, 12)); // When - console.Render(calendar); + console.Write(calendar); // Then return Verifier.Verify(console.Output); @@ -42,7 +42,7 @@ namespace Spectre.Console.Tests.Unit .AddCalendarEvent(new DateTime(2020, 10, 12)); // When - console.Render(calendar); + console.Write(calendar); // Then return Verifier.Verify(console.Output); @@ -61,7 +61,7 @@ namespace Spectre.Console.Tests.Unit .AddCalendarEvent(new DateTime(2020, 10, 12)); // When - console.Render(calendar); + console.Write(calendar); // Then return Verifier.Verify(console.Output); @@ -80,7 +80,7 @@ namespace Spectre.Console.Tests.Unit .AddCalendarEvent(new DateTime(2020, 10, 12)); // When - console.Render(calendar); + console.Write(calendar); // Then return Verifier.Verify(console.Output); @@ -99,7 +99,7 @@ namespace Spectre.Console.Tests.Unit .AddCalendarEvent(new DateTime(2020, 10, 12)); // When - console.Render(calendar); + console.Write(calendar); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/CanvasTests.cs b/src/Spectre.Console.Tests/Unit/CanvasTests.cs index 8cf4667..89537cb 100644 --- a/src/Spectre.Console.Tests/Unit/CanvasTests.cs +++ b/src/Spectre.Console.Tests/Unit/CanvasTests.cs @@ -50,7 +50,7 @@ namespace Spectre.Console.Tests.Unit canvas.SetPixel(4, 4, Color.Yellow); // When - console.Render(canvas); + console.Write(canvas); // Then await Verifier.Verify(console.Output); @@ -67,7 +67,7 @@ namespace Spectre.Console.Tests.Unit .SetPixel(1, 1, Color.Grey)); // When - console.Render(panel); + console.Write(panel); // Then await Verifier.Verify(console.Output); @@ -84,7 +84,7 @@ namespace Spectre.Console.Tests.Unit canvas.SetPixel(19, 9, Color.Grey); // When - console.Render(canvas); + console.Write(canvas); // Then await Verifier.Verify(console.Output); @@ -101,7 +101,7 @@ namespace Spectre.Console.Tests.Unit canvas.SetPixel(19, 9, Color.Aqua); // When - console.Render(canvas); + console.Write(canvas); // Then await Verifier.Verify(console.Output); @@ -117,7 +117,7 @@ namespace Spectre.Console.Tests.Unit canvas.SetPixel(19, 1, Color.Grey); // When - console.Render(canvas); + console.Write(canvas); // Then console.Output.ShouldBeEmpty(); diff --git a/src/Spectre.Console.Tests/Unit/ColumnsTests.cs b/src/Spectre.Console.Tests/Unit/ColumnsTests.cs index 81ff3b2..40c0bca 100644 --- a/src/Spectre.Console.Tests/Unit/ColumnsTests.cs +++ b/src/Spectre.Console.Tests/Unit/ColumnsTests.cs @@ -39,7 +39,7 @@ namespace Spectre.Console.Tests.Unit } // When - console.Render(new Columns(cards)); + console.Write(new Columns(cards)); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/FigletTests.cs b/src/Spectre.Console.Tests/Unit/FigletTests.cs index 043274d..7b0f016 100644 --- a/src/Spectre.Console.Tests/Unit/FigletTests.cs +++ b/src/Spectre.Console.Tests/Unit/FigletTests.cs @@ -20,7 +20,7 @@ namespace Spectre.Console.Tests.Unit var text = new FigletText(font, "Patrik was here"); // When - console.Render(text); + console.Write(text); // Then await Verifier.Verify(console.Output); @@ -35,7 +35,7 @@ namespace Spectre.Console.Tests.Unit var text = new FigletText(FigletFont.Default, "Patrik was here"); // When - console.Render(text); + console.Write(text); // Then await Verifier.Verify(console.Output); @@ -50,7 +50,7 @@ namespace Spectre.Console.Tests.Unit var text = new FigletText(FigletFont.Default, "Spectre.Console"); // When - console.Render(text); + console.Write(text); // Then await Verifier.Verify(console.Output); @@ -66,7 +66,7 @@ namespace Spectre.Console.Tests.Unit .Alignment(Justify.Left); // When - console.Render(text); + console.Write(text); // Then await Verifier.Verify(console.Output); @@ -82,7 +82,7 @@ namespace Spectre.Console.Tests.Unit .Alignment(Justify.Center); // When - console.Render(text); + console.Write(text); // Then await Verifier.Verify(console.Output); @@ -98,7 +98,7 @@ namespace Spectre.Console.Tests.Unit .Alignment(Justify.Right); // When - console.Render(text); + console.Write(text); // Then await Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/GridTests.cs b/src/Spectre.Console.Tests/Unit/GridTests.cs index 9704c13..8b2ea51 100644 --- a/src/Spectre.Console.Tests/Unit/GridTests.cs +++ b/src/Spectre.Console.Tests/Unit/GridTests.cs @@ -96,7 +96,7 @@ namespace Spectre.Console.Tests.Unit grid.AddEmptyRow(); // When - console.Render(grid); + console.Write(grid); // Then return Verifier.Verify(console.Output); @@ -117,7 +117,7 @@ namespace Spectre.Console.Tests.Unit grid.AddRow("Grault", "Garply", "Fred"); // When - console.Render(grid); + console.Write(grid); // Then return Verifier.Verify(console.Output); @@ -136,7 +136,7 @@ namespace Spectre.Console.Tests.Unit grid.AddRow(" [blue]-c[/], [blue]--configuration[/]", "The configuration to run for.\nThe default for most projects is [green]Debug[/]."); // When - console.Render(grid); + console.Write(grid); // Then return Verifier.Verify(console.Output); @@ -157,7 +157,7 @@ namespace Spectre.Console.Tests.Unit grid.AddRow("Grault", "Garply", "Fred"); // When - console.Render(grid); + console.Write(grid); // Then return Verifier.Verify(console.Output); @@ -176,7 +176,7 @@ namespace Spectre.Console.Tests.Unit grid.AddRow("Grault", "Garply", "Fred"); // When - console.Render(grid); + console.Write(grid); // Then return Verifier.Verify(console.Output); @@ -197,7 +197,7 @@ namespace Spectre.Console.Tests.Unit grid.AddRow("Grault", "Garply", "Fred"); // When - console.Render(grid); + console.Write(grid); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/MarkupTests.cs b/src/Spectre.Console.Tests/Unit/MarkupTests.cs index f679827..99bbc4f 100644 --- a/src/Spectre.Console.Tests/Unit/MarkupTests.cs +++ b/src/Spectre.Console.Tests/Unit/MarkupTests.cs @@ -66,7 +66,7 @@ namespace Spectre.Console.Tests.Unit var markup = new Markup("Hello [[ World ]] !"); // When - console.Render(markup); + console.Write(markup); // Then console.Output.ShouldBe("Hello [ World ] !"); @@ -82,7 +82,7 @@ namespace Spectre.Console.Tests.Unit var markup = new Markup(input); // When - console.Render(markup); + console.Write(markup); // Then console.Output.ShouldBe(output); diff --git a/src/Spectre.Console.Tests/Unit/PadderTests.cs b/src/Spectre.Console.Tests/Unit/PadderTests.cs index 006e495..ba09355 100644 --- a/src/Spectre.Console.Tests/Unit/PadderTests.cs +++ b/src/Spectre.Console.Tests/Unit/PadderTests.cs @@ -23,7 +23,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Corgi", "Waldo"); // When - console.Render(new Padder(table).Padding(1, 2, 3, 4)); + console.Write(new Padder(table).Padding(1, 2, 3, 4)); // Then return Verifier.Verify(console.Output); @@ -42,7 +42,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Corgi", "Waldo"); // When - console.Render(new Padder(table) + console.Write(new Padder(table) .Padding(1, 2, 3, 4) .Expand()); @@ -64,7 +64,7 @@ namespace Spectre.Console.Tests.Unit .Padding(2, 1)); // When - console.Render(new Padder(table) + console.Write(new Padder(table) .Padding(1, 2, 3, 4) .Expand()); diff --git a/src/Spectre.Console.Tests/Unit/PanelTests.cs b/src/Spectre.Console.Tests/Unit/PanelTests.cs index cbd9957..17ebf70 100644 --- a/src/Spectre.Console.Tests/Unit/PanelTests.cs +++ b/src/Spectre.Console.Tests/Unit/PanelTests.cs @@ -20,7 +20,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel(new Text("Hello World"))); + console.Write(new Panel(new Text("Hello World"))); // Then return Verifier.Verify(console.Output); @@ -34,7 +34,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel(new Text("Hello World")) + console.Write(new Panel(new Text("Hello World")) { Padding = new Padding(0, 0, 0, 0), }); @@ -51,7 +51,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel(new Text("Hello World")) + console.Write(new Panel(new Text("Hello World")) { Padding = new Padding(3, 1, 5, 2), }); @@ -68,7 +68,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel("Hello World") + console.Write(new Panel("Hello World") { Header = new PanelHeader("Greeting"), Expand = true, @@ -87,7 +87,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel("Hello World") + console.Write(new Panel("Hello World") { Header = new PanelHeader("Greeting").LeftAligned(), Expand = true, @@ -105,7 +105,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel("Hello World") + console.Write(new Panel("Hello World") { Header = new PanelHeader("Greeting").Centered(), Expand = true, @@ -123,7 +123,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel("Hello World") + console.Write(new Panel("Hello World") { Header = new PanelHeader("Greeting").RightAligned(), Expand = true, @@ -141,7 +141,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 10); // When - console.Render(new Panel("Hello World") + console.Write(new Panel("Hello World") { Header = new PanelHeader("Greeting"), Expand = true, @@ -159,7 +159,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel(new Text(" \n💩\n "))); + console.Write(new Panel(new Text(" \n💩\n "))); // Then return Verifier.Verify(console.Output); @@ -173,7 +173,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel(new Text("Hello World\nFoo Bar"))); + console.Write(new Panel(new Text("Hello World\nFoo Bar"))); // Then return Verifier.Verify(console.Output); @@ -189,7 +189,7 @@ namespace Spectre.Console.Tests.Unit new Markup("I heard [underline on blue]you[/] like 📦\n\n\n\nSo I put a 📦 in a 📦")); // When - console.Render(text); + console.Write(text); // Then return Verifier.Verify(console.Output); @@ -203,7 +203,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel(new Text("Hello World")) + console.Write(new Panel(new Text("Hello World")) { Expand = true, }); @@ -220,7 +220,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 25); // When - console.Render( + console.Write( new Panel(new Text("Hello World").RightAligned()) { Expand = true, @@ -238,7 +238,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 25); // When - console.Render( + console.Write( new Panel(new Text("Hello World").Centered()) { Expand = true, @@ -256,7 +256,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Panel(new Panel(new Text("Hello World")))); + console.Write(new Panel(new Panel(new Text("Hello World")))); // Then return Verifier.Verify(console.Output); @@ -281,7 +281,7 @@ namespace Spectre.Console.Tests.Unit .Header("[grey]Short paths[/]"); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); @@ -300,7 +300,7 @@ namespace Spectre.Console.Tests.Unit var panel = new Panel(table); // When - console.Render(panel); + console.Write(panel); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs b/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs index 5609628..9d2550c 100644 --- a/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs +++ b/src/Spectre.Console.Tests/Unit/Progress/ProgressColumnFixture.cs @@ -1,5 +1,4 @@ -using System; -using System.Text; +using System; using Spectre.Console.Rendering; using Spectre.Console.Testing; @@ -21,8 +20,8 @@ namespace Spectre.Console.Tests.Unit public string Render() { var console = new FakeConsole(); - var context = new RenderContext(Encoding.UTF8, false); - console.Render(Column.Render(context, Task, TimeSpan.Zero)); + var context = new RenderContext(console.Profile.Capabilities); + console.Write(Column.Render(context, Task, TimeSpan.Zero)); return console.Output; } } diff --git a/src/Spectre.Console.Tests/Unit/RecorderTests.cs b/src/Spectre.Console.Tests/Unit/RecorderTests.cs index cc46225..3ee9282 100644 --- a/src/Spectre.Console.Tests/Unit/RecorderTests.cs +++ b/src/Spectre.Console.Tests/Unit/RecorderTests.cs @@ -18,7 +18,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(); var recorder = new Recorder(console); - recorder.Render(new Table() + recorder.Write(new Table() .AddColumns("Foo", "Bar", "Qux") .AddRow("Corgi", "Waldo", "Zap") .AddRow(new Panel("Hello World").RoundedBorder())); @@ -32,13 +32,13 @@ namespace Spectre.Console.Tests.Unit [Fact] [Expectation("Html")] - public Task Should_Export_Html_As_Expected() + public Task Should_Export_Html_Text_As_Expected() { // Given var console = new FakeConsole(); var recorder = new Recorder(console); - recorder.Render(new Table() + recorder.Write(new Table() .AddColumns("[red on black]Foo[/]", "[green bold]Bar[/]", "[blue italic]Qux[/]") .AddRow("[invert underline]Corgi[/]", "[bold strikethrough]Waldo[/]", "[dim]Zap[/]") .AddRow(new Panel("[blue]Hello World[/]") diff --git a/src/Spectre.Console.Tests/Unit/RenderHookTests.cs b/src/Spectre.Console.Tests/Unit/RenderHookTests.cs index 5f6879d..7bba3cc 100644 --- a/src/Spectre.Console.Tests/Unit/RenderHookTests.cs +++ b/src/Spectre.Console.Tests/Unit/RenderHookTests.cs @@ -25,7 +25,7 @@ namespace Spectre.Console.Tests.Unit console.Pipeline.Attach(new HelloRenderHook()); // When - console.Render(new Text("World")); + console.Write(new Text("World")); // Then console.Lines[0].ShouldBe("Hello"); diff --git a/src/Spectre.Console.Tests/Unit/RowsTests.cs b/src/Spectre.Console.Tests/Unit/RowsTests.cs index a75dc6c..3e43116 100644 --- a/src/Spectre.Console.Tests/Unit/RowsTests.cs +++ b/src/Spectre.Console.Tests/Unit/RowsTests.cs @@ -28,7 +28,7 @@ namespace Spectre.Console.Tests.Unit }); // When - console.Render(rows); + console.Write(rows); // Then return Verifier.Verify(console.Output); @@ -51,7 +51,7 @@ namespace Spectre.Console.Tests.Unit }), new Text("Qux")); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -74,7 +74,7 @@ namespace Spectre.Console.Tests.Unit }).Expand(), new Text("Qux")); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/RuleTests.cs b/src/Spectre.Console.Tests/Unit/RuleTests.cs index da04659..71a8358 100644 --- a/src/Spectre.Console.Tests/Unit/RuleTests.cs +++ b/src/Spectre.Console.Tests/Unit/RuleTests.cs @@ -19,7 +19,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule()); + console.Write(new Rule()); // Then return Verifier.Verify(console.Output); @@ -33,7 +33,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule().DoubleBorder()); + console.Write(new Rule().DoubleBorder()); // Then return Verifier.Verify(console.Output); @@ -47,7 +47,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule("Hello World").DoubleBorder()); + console.Write(new Rule("Hello World").DoubleBorder()); // Then return Verifier.Verify(console.Output); @@ -61,7 +61,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule("Hello World")); + console.Write(new Rule("Hello World")); // Then return Verifier.Verify(console.Output); @@ -75,7 +75,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule("Hello World") + console.Write(new Rule("Hello World") { Alignment = Justify.Left, }); @@ -92,7 +92,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule("Hello World") + console.Write(new Rule("Hello World") { Alignment = Justify.Right, }); @@ -109,7 +109,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule("Hello\nWorld\r\n!")); + console.Write(new Rule("Hello\nWorld\r\n!")); // Then return Verifier.Verify(console.Output); @@ -123,7 +123,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 40); // When - console.Render(new Rule(" Hello World ")); + console.Write(new Rule(" Hello World ")); // Then return Verifier.Verify(console.Output); @@ -149,7 +149,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width); // When - console.Render(new Rule(input)); + console.Write(new Rule(input)); // Then console.Lines.Count.ShouldBe(1); diff --git a/src/Spectre.Console.Tests/Unit/SegmentTests.cs b/src/Spectre.Console.Tests/Unit/SegmentTests.cs index 573ff33..cc66575 100644 --- a/src/Spectre.Console.Tests/Unit/SegmentTests.cs +++ b/src/Spectre.Console.Tests/Unit/SegmentTests.cs @@ -1,4 +1,3 @@ -using System.Text; using System.Threading.Tasks; using Shouldly; using Spectre.Console.Rendering; @@ -39,11 +38,10 @@ namespace Spectre.Console.Tests.Unit { // Given var style = new Style(Color.Red, Color.Green, Decoration.Bold); - var context = new RenderContext(Encoding.UTF8, false); var segment = new Segment(text, style); // When - var (first, second) = segment.Split(context, offset); + var (first, second) = segment.Split(offset); // Then first.Text.ShouldBe(expectedFirst); @@ -60,10 +58,8 @@ namespace Spectre.Console.Tests.Unit [Expectation("Segment", "Split")] public Task Should_Split_Segment() { - var context = new RenderContext(Encoding.UTF8, false); - + // Given, When var lines = Segment.SplitLines( - context, new[] { new Segment("Foo"), @@ -95,9 +91,8 @@ namespace Spectre.Console.Tests.Unit [Expectation("Segment", "Split_Linebreak")] public Task Should_Split_Segments_With_Linebreak_In_Text() { - var context = new RenderContext(Encoding.UTF8, false); + // Given, Given var lines = Segment.SplitLines( - context, new[] { new Segment("Foo\n"), diff --git a/src/Spectre.Console.Tests/Unit/TableBorderTests.cs b/src/Spectre.Console.Tests/Unit/TableBorderTests.cs index b0eaca1..e3d7dff 100644 --- a/src/Spectre.Console.Tests/Unit/TableBorderTests.cs +++ b/src/Spectre.Console.Tests/Unit/TableBorderTests.cs @@ -47,7 +47,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().NoBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -89,7 +89,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().AsciiBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -131,7 +131,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().Ascii2Border(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -173,7 +173,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().AsciiDoubleHeadBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -215,7 +215,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().SquareBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -257,7 +257,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().RoundedBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -299,7 +299,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().MinimalBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -341,7 +341,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().MinimalHeavyHeadBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -383,7 +383,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().MinimalDoubleHeadBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -425,7 +425,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().SimpleBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -467,7 +467,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().HorizontalBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -509,7 +509,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().SimpleHeavyBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -551,7 +551,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().HeavyBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -593,7 +593,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().HeavyEdgeBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -635,7 +635,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().HeavyHeadBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -677,7 +677,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().DoubleBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -719,7 +719,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().DoubleEdgeBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -761,7 +761,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable().MarkdownBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -776,7 +776,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable(header2: Justify.Left).MarkdownBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -791,7 +791,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable(header2: Justify.Center).MarkdownBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -806,7 +806,7 @@ namespace Spectre.Console.Tests.Unit var table = Fixture.GetTable(header2: Justify.Right).MarkdownBorder(); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/TableTests.cs b/src/Spectre.Console.Tests/Unit/TableTests.cs index 2b5f5a6..b781674 100644 --- a/src/Spectre.Console.Tests/Unit/TableTests.cs +++ b/src/Spectre.Console.Tests/Unit/TableTests.cs @@ -139,7 +139,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -158,7 +158,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -178,7 +178,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -197,7 +197,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -216,7 +216,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -235,7 +235,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -255,7 +255,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // Render a table in some panels. - console.Render(new Panel(new Panel(table) + console.Write(new Panel(new Panel(table) { Border = BoxBorder.Ascii, })); @@ -278,7 +278,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Lorem ipsum dolor sit amet"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -296,7 +296,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -314,7 +314,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -333,7 +333,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -350,7 +350,7 @@ namespace Spectre.Console.Tests.Unit table.AddColumn(new TableColumn("Baz") { Padding = new Padding(3, 0, 2, 0) }); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -388,7 +388,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow(new Markup("[blue]Hej[/]"), new Markup("[yellow]Världen[/]"), Text.Empty); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -408,7 +408,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -429,7 +429,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -450,7 +450,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); @@ -471,7 +471,7 @@ namespace Spectre.Console.Tests.Unit table.AddRow("Grault", "Garply", "Fred"); // When - console.Render(table); + console.Write(table); // Then return Verifier.Verify(console.Output); diff --git a/src/Spectre.Console.Tests/Unit/TextTests.cs b/src/Spectre.Console.Tests/Unit/TextTests.cs index 220eb01..6504779 100644 --- a/src/Spectre.Console.Tests/Unit/TextTests.cs +++ b/src/Spectre.Console.Tests/Unit/TextTests.cs @@ -1,4 +1,3 @@ -using System.Text; using Shouldly; using Spectre.Console.Rendering; using Spectre.Console.Testing; @@ -12,10 +11,11 @@ namespace Spectre.Console.Tests.Unit public void Should_Consider_The_Longest_Word_As_Minimum_Width() { // Given + var caps = new FakeCapabilities { Unicode = true }; var text = new Text("Foo Bar Baz\nQux\nLol mobile"); // When - var result = ((IRenderable)text).Measure(new RenderContext(Encoding.Unicode, false), 80); + var result = ((IRenderable)text).Measure(new RenderContext(caps), 80); // Then result.Min.ShouldBe(6); @@ -25,10 +25,11 @@ namespace Spectre.Console.Tests.Unit public void Should_Consider_The_Longest_Line_As_Maximum_Width() { // Given + var caps = new FakeCapabilities { Unicode = true }; var text = new Text("Foo Bar Baz\nQux\nLol mobile"); // When - var result = ((IRenderable)text).Measure(new RenderContext(Encoding.Unicode, false), 80); + var result = ((IRenderable)text).Measure(new RenderContext(caps), 80); // Then result.Max.ShouldBe(11); @@ -42,7 +43,7 @@ namespace Spectre.Console.Tests.Unit var text = new Text("Hello World"); // When - console.Render(text); + console.Write(text); // Then console.Output.ShouldBe("Hello World"); @@ -58,7 +59,7 @@ namespace Spectre.Console.Tests.Unit var text = new Text(input); // When - console.Render(text); + console.Write(text); // Then console.Output.ShouldBe("Hello\n\nWorld\n\n"); @@ -71,7 +72,7 @@ namespace Spectre.Console.Tests.Unit var console = new FakeConsole(width: 80); // When - console.Render(new Markup("[b]Hello World[/]\n[yellow]Hello World[/]")); + console.Write(new Markup("[b]Hello World[/]\n[yellow]Hello World[/]")); // Then console.Lines.Count.ShouldBe(2); @@ -90,7 +91,7 @@ namespace Spectre.Console.Tests.Unit var text = new Text(input); // When - console.Render(text); + console.Write(text); // Then console.Output @@ -110,7 +111,7 @@ namespace Spectre.Console.Tests.Unit .Overflow(overflow); // When - console.Render(text); + console.Write(text); // Then console.Output diff --git a/src/Spectre.Console.Tests/Unit/TreeTests.cs b/src/Spectre.Console.Tests/Unit/TreeTests.cs index 87bf400..c99f95f 100644 --- a/src/Spectre.Console.Tests/Unit/TreeTests.cs +++ b/src/Spectre.Console.Tests/Unit/TreeTests.cs @@ -37,7 +37,7 @@ namespace Spectre.Console.Tests.Unit tree.AddNode("child4"); // When - console.Render(tree); + console.Write(tree); // Then return Verifier.Verify(console.Output); @@ -52,7 +52,7 @@ namespace Spectre.Console.Tests.Unit var tree = new Tree(new Text("Root node")); // When - console.Render(tree); + console.Write(tree); // Then return Verifier.Verify(console.Output); @@ -76,7 +76,7 @@ namespace Spectre.Console.Tests.Unit tree.AddNodes(root); // When - var result = Record.Exception(() => console.Render(tree)); + var result = Record.Exception(() => console.Write(tree)); // Then result.ShouldBeOfType(); diff --git a/src/Spectre.Console/AnsiConsole.Recording.cs b/src/Spectre.Console/AnsiConsole.Recording.cs index 78c11cf..401acd8 100644 --- a/src/Spectre.Console/AnsiConsole.Recording.cs +++ b/src/Spectre.Console/AnsiConsole.Recording.cs @@ -34,9 +34,9 @@ namespace Spectre.Console } /// - /// Exports all recorded console output as HTML. + /// Exports all recorded console output as HTML text. /// - /// The recorded output as HTML. + /// The recorded output as HTML text. public static string ExportHtml() { if (_recorder == null) diff --git a/src/Spectre.Console/AnsiConsole.Rendering.cs b/src/Spectre.Console/AnsiConsole.Rendering.cs index e0e9103..dd139a2 100644 --- a/src/Spectre.Console/AnsiConsole.Rendering.cs +++ b/src/Spectre.Console/AnsiConsole.Rendering.cs @@ -1,3 +1,4 @@ +using System; using Spectre.Console.Rendering; namespace Spectre.Console @@ -13,7 +14,12 @@ namespace Spectre.Console /// The object to render. public static void Render(IRenderable renderable) { - Console.Render(renderable); + if (renderable is null) + { + throw new ArgumentNullException(nameof(renderable)); + } + + Console.Write(renderable); } } } diff --git a/src/Spectre.Console/AnsiConsole.Write.cs b/src/Spectre.Console/AnsiConsole.Write.cs index f974cb5..62b9083 100644 --- a/src/Spectre.Console/AnsiConsole.Write.cs +++ b/src/Spectre.Console/AnsiConsole.Write.cs @@ -14,7 +14,7 @@ namespace Spectre.Console /// The value to write. public static void Write(string value) { - Console.Write(value, CurrentStyle); + Write(value, CurrentStyle); } /// diff --git a/src/Spectre.Console/AnsiConsoleFactory.cs b/src/Spectre.Console/AnsiConsoleFactory.cs index 451fd1f..e2612f5 100644 --- a/src/Spectre.Console/AnsiConsoleFactory.cs +++ b/src/Spectre.Console/AnsiConsoleFactory.cs @@ -52,6 +52,7 @@ namespace Spectre.Console profile.Capabilities.Links = supportsAnsi && !legacyConsole; profile.Capabilities.Legacy = legacyConsole; profile.Capabilities.Interactive = interactive; + profile.Capabilities.Unicode = encoding.EncodingName.ContainsExact("Unicode"); // Enrich the profile ProfileEnricher.Enrich( @@ -95,7 +96,7 @@ namespace Spectre.Console } else { - // Try detecting whether or not this + // Try detecting whether or not this is a legacy console (_, legacyConsole) = AnsiDetector.Detect(buffer.IsStandardError(), false); } } diff --git a/src/Spectre.Console/Capabilities.cs b/src/Spectre.Console/Capabilities.cs index b227474..98effac 100644 --- a/src/Spectre.Console/Capabilities.cs +++ b/src/Spectre.Console/Capabilities.cs @@ -5,7 +5,7 @@ namespace Spectre.Console /// /// Represents console capabilities. /// - public sealed class Capabilities + public sealed class Capabilities : IReadOnlyCapabilities { private readonly Profile _profile; @@ -19,11 +19,6 @@ namespace Spectre.Console /// Gets or sets a value indicating whether or not /// the console support links. /// - /// - /// There is probably a lot of room for improvement here - /// once we have more information about the terminal - /// we're running inside. - /// public bool Links { get; set; } /// @@ -37,8 +32,8 @@ namespace Spectre.Console public bool Legacy { get; set; } /// - /// Gets a value indicating whether console output - /// has been redirected. + /// Gets a value indicating whether or not + /// console output has been redirected. /// public bool Tty { @@ -65,6 +60,12 @@ namespace Spectre.Console /// public bool Interactive { get; set; } + /// + /// Gets or sets a value indicating whether + /// or not the console supports Unicode. + /// + public bool Unicode { get; set; } + /// /// Initializes a new instance of the class. /// diff --git a/src/Spectre.Console/Cli/Internal/Extensions/AnsiConsoleExtensions.cs b/src/Spectre.Console/Cli/Internal/Extensions/AnsiConsoleExtensions.cs index 82c5ac4..2d96925 100644 --- a/src/Spectre.Console/Cli/Internal/Extensions/AnsiConsoleExtensions.cs +++ b/src/Spectre.Console/Cli/Internal/Extensions/AnsiConsoleExtensions.cs @@ -23,7 +23,7 @@ namespace Spectre.Console.Cli if (renderable != null) { console ??= _console.Value; - console.Render(renderable); + console.Write(renderable); } } @@ -34,7 +34,7 @@ namespace Spectre.Console.Cli { if (renderable != null) { - console.Render(renderable); + console.Write(renderable); } } } diff --git a/src/Spectre.Console/Enrichment/ProfileEnricher.cs b/src/Spectre.Console/Enrichment/ProfileEnricher.cs index 2987786..4b7b592 100644 --- a/src/Spectre.Console/Enrichment/ProfileEnricher.cs +++ b/src/Spectre.Console/Enrichment/ProfileEnricher.cs @@ -8,7 +8,6 @@ namespace Spectre.Console.Enrichment { private static readonly List _defaultEnrichers = new List { - new WindowsTerminalEnricher(), new AppVeyorEnricher(), new BambooEnricher(), new BitbucketEnricher(), diff --git a/src/Spectre.Console/Enrichment/Terminals/WindowsTerminalEnricher.cs b/src/Spectre.Console/Enrichment/Terminals/WindowsTerminalEnricher.cs deleted file mode 100644 index 392d43d..0000000 --- a/src/Spectre.Console/Enrichment/Terminals/WindowsTerminalEnricher.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; - -namespace Spectre.Console.Enrichment -{ - internal sealed class WindowsTerminalEnricher : IProfileEnricher - { - public string Name => "Windows Terminal"; - - public bool Enabled(IDictionary environmentVariables) - { - return environmentVariables.ContainsKey("WT_SESSION"); - } - - public void Enrich(Profile profile) - { - profile.Capabilities.Links = true; - } - } -} diff --git a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs index 6319a5c..fa6bdc7 100644 --- a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs +++ b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs @@ -15,7 +15,7 @@ namespace Spectre.Console /// The exception format options. public static void WriteException(this IAnsiConsole console, Exception exception, ExceptionFormats format = ExceptionFormats.Default) { - Render(console, exception.GetRenderable(format)); + console.Write(exception.GetRenderable(format)); } /// @@ -26,7 +26,7 @@ namespace Spectre.Console /// The exception settings. public static void WriteException(this IAnsiConsole console, Exception exception, ExceptionSettings settings) { - Render(console, exception.GetRenderable(settings)); + console.Write(exception.GetRenderable(settings)); } } } diff --git a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs index 528dc06..1f2f8a9 100644 --- a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs +++ b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs @@ -38,7 +38,7 @@ namespace Spectre.Console /// The value to write. public static void Markup(this IAnsiConsole console, string value) { - console.Render(MarkupParser.Parse(value)); + console.Write(MarkupParser.Parse(value)); } /// diff --git a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs index 9849aab..020f101 100644 --- a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs +++ b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Spectre.Console.Rendering; namespace Spectre.Console @@ -14,6 +13,7 @@ namespace Spectre.Console /// /// The console to render to. /// The object to render. + [Obsolete("Consider using IAnsiConsole.Write instead.")] public static void Render(this IAnsiConsole console, IRenderable renderable) { if (console is null) @@ -26,21 +26,7 @@ namespace Spectre.Console throw new ArgumentNullException(nameof(renderable)); } - var context = new RenderContext(console.Profile.Encoding, console.Profile.Capabilities.Legacy); - var renderables = console.Pipeline.Process(context, new[] { renderable }); - - Render(console, context, renderables); - } - - private static void Render(IAnsiConsole console, RenderContext options, IEnumerable renderables) - { - var result = new List(); - foreach (var renderable in renderables) - { - result.AddRange(renderable.Render(options, console.Profile.Width)); - } - - console.Write(Segment.Merge(result)); + console.Write(renderable); } } } diff --git a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.cs b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.cs index acbf72f..ca06c6d 100644 --- a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.cs +++ b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.cs @@ -1,5 +1,4 @@ using System; -using Spectre.Console.Rendering; namespace Spectre.Console { @@ -18,26 +17,6 @@ namespace Spectre.Console return new Recorder(console); } - /// - /// Writes the specified string value to the console. - /// - /// The console to write to. - /// The segment to write. - public static void Write(this IAnsiConsole console, Segment segment) - { - if (console is null) - { - throw new ArgumentNullException(nameof(console)); - } - - if (segment is null) - { - throw new ArgumentNullException(nameof(segment)); - } - - console.Write(new[] { segment }); - } - /// /// Writes the specified string value to the console. /// @@ -45,7 +24,7 @@ namespace Spectre.Console /// The text to write. public static void Write(this IAnsiConsole console, string text) { - Render(console, new Text(text, Style.Plain)); + console.Write(new Text(text, Style.Plain)); } /// @@ -56,7 +35,7 @@ namespace Spectre.Console /// The text style. public static void Write(this IAnsiConsole console, string text, Style style) { - Render(console, new Text(text, style)); + console.Write(new Text(text, style)); } /// @@ -70,7 +49,7 @@ namespace Spectre.Console throw new ArgumentNullException(nameof(console)); } - Render(console, new Text(Environment.NewLine, Style.Plain)); + console.Write(new Text(Environment.NewLine, Style.Plain)); } /// diff --git a/src/Spectre.Console/Extensions/RecorderExtensions.cs b/src/Spectre.Console/Extensions/RecorderExtensions.cs index ca2228a..4b432a5 100644 --- a/src/Spectre.Console/Extensions/RecorderExtensions.cs +++ b/src/Spectre.Console/Extensions/RecorderExtensions.cs @@ -1,4 +1,5 @@ using System; +using Spectre.Console.Internal; namespace Spectre.Console { diff --git a/src/Spectre.Console/Extensions/RenderableExtensions.cs b/src/Spectre.Console/Extensions/RenderableExtensions.cs new file mode 100644 index 0000000..acc2fa5 --- /dev/null +++ b/src/Spectre.Console/Extensions/RenderableExtensions.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using Spectre.Console.Rendering; + +namespace Spectre.Console +{ + /// + /// Contains extension methods for . + /// + public static class RenderableExtensions + { + /// + /// Gets the segments for a renderable using the specified console. + /// + /// The renderable. + /// The console. + /// An enumerable containing segments representing the specified . + public static IEnumerable 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 GetSegments(IAnsiConsole console, RenderContext options, IEnumerable renderables) + { + var result = new List(); + foreach (var renderable in renderables) + { + result.AddRange(renderable.Render(options, console.Profile.Width)); + } + + return Segment.Merge(result); + } + } +} diff --git a/src/Spectre.Console/Extensions/StringExtensions.cs b/src/Spectre.Console/Extensions/StringExtensions.cs index 991b10f..d7db267 100644 --- a/src/Spectre.Console/Extensions/StringExtensions.cs +++ b/src/Spectre.Console/Extensions/StringExtensions.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; -using Spectre.Console.Rendering; namespace Spectre.Console { @@ -60,14 +59,9 @@ namespace Spectre.Console return result.ToString(); } - internal static int CellLength(this string text, RenderContext context) + internal static int CellLength(this string text) { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - - return Cell.GetCellLength(context, text); + return Cell.GetCellLength(text); } internal static string CapitalizeFirstLetter(this string? text, CultureInfo? culture = null) diff --git a/src/Spectre.Console/IAnsiConsole.cs b/src/Spectre.Console/IAnsiConsole.cs index 8e3e7ed..5da4acc 100644 --- a/src/Spectre.Console/IAnsiConsole.cs +++ b/src/Spectre.Console/IAnsiConsole.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using Spectre.Console.Rendering; namespace Spectre.Console @@ -40,9 +39,9 @@ namespace Spectre.Console void Clear(bool home); /// - /// Writes multiple segments to the console. + /// Writes a to the console. /// - /// The segments to write. - void Write(IEnumerable segments); + /// The to write. + void Write(IRenderable renderable); } } diff --git a/src/Spectre.Console/IReadOnlyCapabilities.cs b/src/Spectre.Console/IReadOnlyCapabilities.cs new file mode 100644 index 0000000..e624a01 --- /dev/null +++ b/src/Spectre.Console/IReadOnlyCapabilities.cs @@ -0,0 +1,48 @@ +namespace Spectre.Console +{ + /// + /// Represents (read-only) console capabilities. + /// + public interface IReadOnlyCapabilities + { + /// + /// Gets a value indicating whether or not + /// the console supports Ansi. + /// + bool Ansi { get; } + + /// + /// Gets a value indicating whether or not + /// the console support links. + /// + bool Links { get; } + + /// + /// Gets a value indicating whether or not + /// this is a legacy console (cmd.exe) on an OS + /// prior to Windows 10. + /// + /// + /// Only relevant when running on Microsoft Windows. + /// + bool Legacy { get; } + + /// + /// Gets a value indicating whether or not + /// console output has been redirected. + /// + bool Tty { get; } + + /// + /// Gets a value indicating whether + /// or not the console supports interaction. + /// + bool Interactive { get; } + + /// + /// Gets a value indicating whether + /// or not the console supports Unicode. + /// + bool Unicode { get; } + } +} diff --git a/src/Spectre.Console/Internal/Aligner.cs b/src/Spectre.Console/Internal/Aligner.cs index 34df9c9..6cc7443 100644 --- a/src/Spectre.Console/Internal/Aligner.cs +++ b/src/Spectre.Console/Internal/Aligner.cs @@ -6,14 +6,14 @@ namespace Spectre.Console { internal static class Aligner { - public static string Align(RenderContext context, string text, Justify? alignment, int maxWidth) + public static string Align(string text, Justify? alignment, int maxWidth) { if (alignment == null || alignment == Justify.Left) { return text; } - var width = Cell.GetCellLength(context, text); + var width = Cell.GetCellLength(text); if (width >= maxWidth) { return text; @@ -57,7 +57,7 @@ namespace Spectre.Console return; } - var width = Segment.CellCount(context, segments); + var width = Segment.CellCount(segments); if (width >= maxWidth) { return; diff --git a/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleBackend.cs b/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleBackend.cs index 5821f6f..b077bb2 100644 --- a/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleBackend.cs +++ b/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleBackend.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Text; using Spectre.Console.Rendering; @@ -8,21 +7,21 @@ namespace Spectre.Console internal sealed class AnsiConsoleBackend : IAnsiConsoleBackend { private readonly AnsiBuilder _builder; - private readonly Profile _profile; + private readonly IAnsiConsole _console; public IAnsiConsoleCursor Cursor { get; } - public AnsiConsoleBackend(Profile profile) + public AnsiConsoleBackend(IAnsiConsole console) { - _profile = profile ?? throw new ArgumentNullException(nameof(profile)); - _builder = new AnsiBuilder(profile); + _console = console ?? throw new ArgumentNullException(nameof(console)); + _builder = new AnsiBuilder(_console.Profile); Cursor = new AnsiConsoleCursor(this); } public void Clear(bool home) { - Render(new[] { Segment.Control("\u001b[2J") }); + Write(new ControlSequence("\u001b[2J")); if (home) { @@ -30,10 +29,10 @@ namespace Spectre.Console } } - public void Render(IEnumerable segments) + public void Write(IRenderable renderable) { var builder = new StringBuilder(); - foreach (var segment in segments) + foreach (var segment in renderable.GetSegments(_console)) { if (segment.IsControlCode) { @@ -58,8 +57,8 @@ namespace Spectre.Console if (builder.Length > 0) { - _profile.Out.Write(builder.ToString()); - _profile.Out.Flush(); + _console.Profile.Out.Write(builder.ToString()); + _console.Profile.Out.Flush(); } } } diff --git a/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleCursor.cs b/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleCursor.cs index cd33af9..d0f110f 100644 --- a/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleCursor.cs +++ b/src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleCursor.cs @@ -1,5 +1,4 @@ using System; -using Spectre.Console.Rendering; namespace Spectre.Console { @@ -16,11 +15,11 @@ namespace Spectre.Console { if (show) { - _backend.Render(new[] { Segment.Control("\u001b[?25h") }); + _backend.Write(new ControlSequence("\u001b[?25h")); } else { - _backend.Render(new[] { Segment.Control("\u001b[?25l") }); + _backend.Write(new ControlSequence("\u001b[?25l")); } } @@ -34,23 +33,23 @@ namespace Spectre.Console switch (direction) { case CursorDirection.Up: - _backend.Render(new[] { Segment.Control($"\u001b[{steps}A") }); + _backend.Write(new ControlSequence($"\u001b[{steps}A")); break; case CursorDirection.Down: - _backend.Render(new[] { Segment.Control($"\u001b[{steps}B") }); + _backend.Write(new ControlSequence($"\u001b[{steps}B")); break; case CursorDirection.Right: - _backend.Render(new[] { Segment.Control($"\u001b[{steps}C") }); + _backend.Write(new ControlSequence($"\u001b[{steps}C")); break; case CursorDirection.Left: - _backend.Render(new[] { Segment.Control($"\u001b[{steps}D") }); + _backend.Write(new ControlSequence($"\u001b[{steps}D")); break; } } public void SetPosition(int column, int line) { - _backend.Render(new[] { Segment.Control($"\u001b[{line};{column}H") }); + _backend.Write(new ControlSequence($"\u001b[{line};{column}H")); } } } diff --git a/src/Spectre.Console/Internal/Backends/AnsiConsoleFacade.cs b/src/Spectre.Console/Internal/Backends/AnsiConsoleFacade.cs index 7e41b13..e06ab53 100644 --- a/src/Spectre.Console/Internal/Backends/AnsiConsoleFacade.cs +++ b/src/Spectre.Console/Internal/Backends/AnsiConsoleFacade.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Spectre.Console.Rendering; namespace Spectre.Console @@ -19,13 +18,14 @@ namespace Spectre.Console public AnsiConsoleFacade(Profile profile, IExclusivityMode exclusivityMode) { _renderLock = new object(); - _ansiBackend = new AnsiConsoleBackend(profile); - _legacyBackend = new LegacyConsoleBackend(profile); Profile = profile ?? throw new ArgumentNullException(nameof(profile)); Input = new DefaultInput(Profile); ExclusivityMode = exclusivityMode ?? throw new ArgumentNullException(nameof(exclusivityMode)); Pipeline = new RenderPipeline(); + + _ansiBackend = new AnsiConsoleBackend(this); + _legacyBackend = new LegacyConsoleBackend(this); } public void Clear(bool home) @@ -36,11 +36,11 @@ namespace Spectre.Console } } - public void Write(IEnumerable segments) + public void Write(IRenderable renderable) { lock (_renderLock) { - GetBackend().Render(segments); + GetBackend().Write(renderable); } } diff --git a/src/Spectre.Console/Internal/Backends/IAnsiConsoleBackend.cs b/src/Spectre.Console/Internal/Backends/IAnsiConsoleBackend.cs index 2ec0c9b..8899280 100644 --- a/src/Spectre.Console/Internal/Backends/IAnsiConsoleBackend.cs +++ b/src/Spectre.Console/Internal/Backends/IAnsiConsoleBackend.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using Spectre.Console.Rendering; namespace Spectre.Console @@ -20,9 +19,9 @@ namespace Spectre.Console void Clear(bool home); /// - /// Renders segments to the console. + /// Writes a to the console backend. /// - /// The segments to render. - void Render(IEnumerable segments); + /// The to write. + void Write(IRenderable renderable); } } diff --git a/src/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleBackend.cs b/src/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleBackend.cs index 913bb59..94de396 100644 --- a/src/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleBackend.cs +++ b/src/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleBackend.cs @@ -1,18 +1,17 @@ -using System.Collections.Generic; using Spectre.Console.Rendering; namespace Spectre.Console { internal sealed class LegacyConsoleBackend : IAnsiConsoleBackend { - private readonly Profile _profile; + private readonly IAnsiConsole _console; private Style _lastStyle; public IAnsiConsoleCursor Cursor { get; } - public LegacyConsoleBackend(Profile profile) + public LegacyConsoleBackend(IAnsiConsole console) { - _profile = profile ?? throw new System.ArgumentNullException(nameof(profile)); + _console = console ?? throw new System.ArgumentNullException(nameof(console)); _lastStyle = Style.Plain; Cursor = new LegacyConsoleCursor(); @@ -31,9 +30,9 @@ namespace Spectre.Console } } - public void Render(IEnumerable segments) + public void Write(IRenderable renderable) { - foreach (var segment in segments) + foreach (var segment in renderable.GetSegments(_console)) { if (segment.IsControlCode) { @@ -45,7 +44,7 @@ namespace Spectre.Console SetStyle(segment.Style); } - _profile.Out.Write(segment.Text.NormalizeNewLines(native: true)); + _console.Profile.Out.Write(segment.Text.NormalizeNewLines(native: true)); } } @@ -56,13 +55,13 @@ namespace Spectre.Console System.Console.ResetColor(); var background = Color.ToConsoleColor(style.Background); - if (_profile.ColorSystem != ColorSystem.NoColors && (int)background != -1) + if (_console.Profile.ColorSystem != ColorSystem.NoColors && (int)background != -1) { System.Console.BackgroundColor = background; } var foreground = Color.ToConsoleColor(style.Foreground); - if (_profile.ColorSystem != ColorSystem.NoColors && (int)foreground != -1) + if (_console.Profile.ColorSystem != ColorSystem.NoColors && (int)foreground != -1) { System.Console.ForegroundColor = foreground; } diff --git a/src/Spectre.Console/Internal/Cell.cs b/src/Spectre.Console/Internal/Cell.cs index 5d0905c..e30fe2a 100644 --- a/src/Spectre.Console/Internal/Cell.cs +++ b/src/Spectre.Console/Internal/Cell.cs @@ -1,34 +1,22 @@ -using Spectre.Console.Rendering; using Wcwidth; namespace Spectre.Console { internal static class Cell { - public static int GetCellLength(RenderContext context, string text) + public static int GetCellLength(string text) { var sum = 0; foreach (var rune in text) { - sum += GetCellLength(context, rune); + sum += GetCellLength(rune); } return sum; } - public static int GetCellLength(RenderContext context, char rune) + public static int GetCellLength(char rune) { - if (context.LegacyConsole) - { - // Is it represented by a single byte? - // In that case we don't have to calculate the - // actual cell width. - if (context.Encoding.GetByteCount(new[] { rune }) == 1) - { - return 1; - } - } - // TODO: We need to figure out why Segment.SplitLines fails // if we let wcwidth (which returns -1 instead of 1) // calculate the size for new line characters. diff --git a/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs b/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs index 48e5046..226bd54 100644 --- a/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs +++ b/src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs @@ -3,52 +3,57 @@ using System.Collections.Generic; using System.Text; using Spectre.Console.Rendering; -namespace Spectre.Console +namespace Spectre.Console.Internal { internal sealed class HtmlEncoder : IAnsiConsoleEncoder { - public string Encode(IEnumerable segments) + public string Encode(IAnsiConsole console, IEnumerable renderables) { + var context = new RenderContext(EncoderCapabilities.Default); var builder = new StringBuilder(); builder.Append("
\n");
 
-            foreach (var (_, first, _, segment) in segments.Enumerate())
+            foreach (var renderable in renderables)
             {
-                if (segment.IsControlCode)
+                var segments = renderable.Render(context, console.Profile.Width);
+                foreach (var (_, first, _, segment) in segments.Enumerate())
                 {
-                    continue;
-                }
-
-                if (segment.Text == "\n" && !first)
-                {
-                    builder.Append('\n');
-                    continue;
-                }
-
-                var parts = segment.Text.Split(new[] { '\n' }, StringSplitOptions.None);
-                foreach (var (_, _, last, line) in parts.Enumerate())
-                {
-                    if (string.IsNullOrEmpty(line))
+                    if (segment.IsControlCode)
                     {
                         continue;
                     }
 
-                    builder.Append("');
-                    builder.Append(line);
-                    builder.Append("");
-
-                    if (parts.Length > 1 && !last)
+                    if (segment.Text == "\n" && !first)
                     {
                         builder.Append('\n');
+                        continue;
+                    }
+
+                    var parts = segment.Text.Split(new[] { '\n' }, StringSplitOptions.None);
+                    foreach (var (_, _, last, line) in parts.Enumerate())
+                    {
+                        if (string.IsNullOrEmpty(line))
+                        {
+                            continue;
+                        }
+
+                        builder.Append("');
+                        builder.Append(line);
+                        builder.Append("");
+
+                        if (parts.Length > 1 && !last)
+                        {
+                            builder.Append('\n');
+                        }
                     }
                 }
             }
diff --git a/src/Spectre.Console/Internal/Text/Encoding/TextEncoder.cs b/src/Spectre.Console/Internal/Text/Encoding/TextEncoder.cs
index ce641d2..4b3e294 100644
--- a/src/Spectre.Console/Internal/Text/Encoding/TextEncoder.cs
+++ b/src/Spectre.Console/Internal/Text/Encoding/TextEncoder.cs
@@ -2,22 +2,39 @@ using System.Collections.Generic;
 using System.Text;
 using Spectre.Console.Rendering;
 
-namespace Spectre.Console
+namespace Spectre.Console.Internal
 {
+    internal sealed class EncoderCapabilities : IReadOnlyCapabilities
+    {
+        public bool Ansi => false;
+        public bool Links => false;
+        public bool Legacy => false;
+        public bool Tty => false;
+        public bool Interactive => false;
+        public bool Unicode => true;
+
+        public static EncoderCapabilities Default { get; } = new EncoderCapabilities();
+    }
+
     internal sealed class TextEncoder : IAnsiConsoleEncoder
     {
-        public string Encode(IEnumerable segments)
+        public string Encode(IAnsiConsole console, IEnumerable renderables)
         {
+            var context = new RenderContext(EncoderCapabilities.Default);
             var builder = new StringBuilder();
 
-            foreach (var segment in Segment.Merge(segments))
+            foreach (var renderable in renderables)
             {
-                if (segment.IsControlCode)
+                var segments = renderable.Render(context, console.Profile.Width);
+                foreach (var segment in Segment.Merge(segments))
                 {
-                    continue;
-                }
+                    if (segment.IsControlCode)
+                    {
+                        continue;
+                    }
 
-                builder.Append(segment.Text);
+                    builder.Append(segment.Text);
+                }
             }
 
             return builder.ToString().TrimEnd('\n');
diff --git a/src/Spectre.Console/Profile.cs b/src/Spectre.Console/Profile.cs
index 57229fb..0ef06ca 100644
--- a/src/Spectre.Console/Profile.cs
+++ b/src/Spectre.Console/Profile.cs
@@ -43,12 +43,7 @@ namespace Spectre.Console
             get => _out;
             set
             {
-                if (value == null)
-                {
-                    throw new InvalidOperationException("Output buffer cannot be null");
-                }
-
-                _out = value;
+                _out = value ?? throw new InvalidOperationException("Output buffer cannot be null");
 
                 // Reset the width and height if not a TTY.
                 if (!Capabilities.Tty)
@@ -129,12 +124,7 @@ namespace Spectre.Console
             get => _capabilities;
             set
             {
-                if (value == null)
-                {
-                    throw new InvalidOperationException("Profile capabilities cannot be null");
-                }
-
-                _capabilities = value;
+                _capabilities = value ?? throw new InvalidOperationException("Profile capabilities cannot be null");
             }
         }
 
diff --git a/src/Spectre.Console/Recorder.cs b/src/Spectre.Console/Recorder.cs
index 4ffca3c..8ae3dc8 100644
--- a/src/Spectre.Console/Recorder.cs
+++ b/src/Spectre.Console/Recorder.cs
@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
-using System.Linq;
 using Spectre.Console.Rendering;
 
 namespace Spectre.Console
@@ -12,7 +11,7 @@ namespace Spectre.Console
     public class Recorder : IAnsiConsole, IDisposable
     {
         private readonly IAnsiConsole _console;
-        private readonly List _recorded;
+        private readonly List _recorded;
 
         /// 
         public Profile Profile => _console.Profile;
@@ -29,11 +28,6 @@ namespace Spectre.Console
         /// 
         public RenderPipeline Pipeline => _console.Pipeline;
 
-        /// 
-        /// Gets a list containing all recorded segments.
-        /// 
-        protected List Recorded => _recorded;
-
         /// 
         /// Initializes a new instance of the  class.
         /// 
@@ -41,7 +35,7 @@ namespace Spectre.Console
         public Recorder(IAnsiConsole console)
         {
             _console = console ?? throw new ArgumentNullException(nameof(console));
-            _recorded = new List();
+            _recorded = new List();
         }
 
         /// 
@@ -58,34 +52,25 @@ namespace Spectre.Console
         }
 
         /// 
-        public void Write(IEnumerable segments)
+        public void Write(IRenderable renderable)
         {
-            if (segments is null)
+            if (renderable is null)
             {
-                throw new ArgumentNullException(nameof(segments));
+                throw new ArgumentNullException(nameof(renderable));
             }
 
-            Record(segments);
+            _recorded.Add(renderable);
 
-            _console.Write(segments);
+            _console.Write(renderable);
         }
 
         internal Recorder Clone(IAnsiConsole console)
         {
             var recorder = new Recorder(console);
-            recorder.Recorded.AddRange(Recorded);
+            recorder._recorded.AddRange(_recorded);
             return recorder;
         }
 
-        /// 
-        /// Records the specified segments.
-        /// 
-        /// The segments to be recorded.
-        protected virtual void Record(IEnumerable segments)
-        {
-            Recorded.AddRange(segments.Where(s => !s.IsControlCode));
-        }
-
         /// 
         /// Exports the recorded data.
         /// 
@@ -98,7 +83,7 @@ namespace Spectre.Console
                 throw new ArgumentNullException(nameof(encoder));
             }
 
-            return encoder.Encode(_recorded);
+            return encoder.Encode(_console, _recorded);
         }
     }
 }
diff --git a/src/Spectre.Console/Rendering/IAnsiConsoleEncoder.cs b/src/Spectre.Console/Rendering/IAnsiConsoleEncoder.cs
index e23c194..97fa742 100644
--- a/src/Spectre.Console/Rendering/IAnsiConsoleEncoder.cs
+++ b/src/Spectre.Console/Rendering/IAnsiConsoleEncoder.cs
@@ -9,10 +9,11 @@ namespace Spectre.Console.Rendering
     public interface IAnsiConsoleEncoder
     {
         /// 
-        /// Encodes the specified segments.
+        /// Encodes the specified  enumerator.
         /// 
-        /// The segments to encode.
-        /// The encoded string.
-        string Encode(IEnumerable segments);
+        /// The console to use when encoding.
+        /// The renderable objects to encode.
+        /// A string representing the encoded result.
+        string Encode(IAnsiConsole console, IEnumerable renderable);
     }
 }
diff --git a/src/Spectre.Console/Rendering/LiveRenderable.cs b/src/Spectre.Console/Rendering/LiveRenderable.cs
index 5c88d0c..86a0895 100644
--- a/src/Spectre.Console/Rendering/LiveRenderable.cs
+++ b/src/Spectre.Console/Rendering/LiveRenderable.cs
@@ -51,7 +51,7 @@ namespace Spectre.Console.Rendering
                 if (_renderable != null)
                 {
                     var segments = _renderable.Render(context, maxWidth);
-                    var lines = Segment.SplitLines(context, segments);
+                    var lines = Segment.SplitLines(segments);
 
                     var shape = SegmentShape.Calculate(context, lines);
                     _shape = _shape == null ? shape : _shape.Value.Inflate(shape);
diff --git a/src/Spectre.Console/Rendering/RenderContext.cs b/src/Spectre.Console/Rendering/RenderContext.cs
index c50ca6c..88f719e 100644
--- a/src/Spectre.Console/Rendering/RenderContext.cs
+++ b/src/Spectre.Console/Rendering/RenderContext.cs
@@ -1,4 +1,4 @@
-using System.Text;
+using System;
 
 namespace Spectre.Console.Rendering
 {
@@ -7,20 +7,12 @@ namespace Spectre.Console.Rendering
     /// 
public sealed class RenderContext { - /// - /// Gets the console's output encoding. - /// - public Encoding Encoding { get; } - - /// - /// Gets a value indicating whether or not this a legacy console (i.e. cmd.exe). - /// - public bool LegacyConsole { get; } + private readonly IReadOnlyCapabilities _capabilities; /// /// Gets a value indicating whether or not unicode is supported. /// - public bool Unicode { get; } + public bool Unicode => _capabilities.Unicode; /// /// Gets the current justification. @@ -36,20 +28,18 @@ namespace Spectre.Console.Rendering /// /// Initializes a new instance of the class. /// - /// The console's output encoding. - /// A value indicating whether or not this a legacy console (i.e. cmd.exe). - /// The justification to use when rendering. - public RenderContext(Encoding encoding, bool legacyConsole, Justify? justification = null) - : this(encoding, legacyConsole, justification, false) + /// The capabilities. + /// The justification. + public RenderContext(IReadOnlyCapabilities capabilities, Justify? justification = null) + : this(capabilities, justification, false) { } - private RenderContext(Encoding encoding, bool legacyConsole, Justify? justification = null, bool singleLine = false) + private RenderContext(IReadOnlyCapabilities capabilities, Justify? justification = null, bool singleLine = false) { - Encoding = encoding ?? throw new System.ArgumentNullException(nameof(encoding)); - LegacyConsole = legacyConsole; + _capabilities = capabilities ?? throw new ArgumentNullException(nameof(capabilities)); + Justification = justification; - Unicode = Encoding.EncodingName.ContainsExact("Unicode"); SingleLine = singleLine; } @@ -60,7 +50,7 @@ namespace Spectre.Console.Rendering /// A new instance. public RenderContext WithJustification(Justify? justification) { - return new RenderContext(Encoding, LegacyConsole, justification); + return new RenderContext(_capabilities, justification, SingleLine); } /// @@ -75,7 +65,7 @@ namespace Spectre.Console.Rendering /// A new instance. internal RenderContext WithSingleLine() { - return new RenderContext(Encoding, LegacyConsole, Justification, true); + return new RenderContext(_capabilities, Justification, true); } } } diff --git a/src/Spectre.Console/Rendering/Segment.cs b/src/Spectre.Console/Rendering/Segment.cs index ba6f5ff..ad2fb63 100644 --- a/src/Spectre.Console/Rendering/Segment.cs +++ b/src/Spectre.Console/Rendering/Segment.cs @@ -100,36 +100,24 @@ namespace Spectre.Console.Rendering /// Gets the number of cells that this segment /// occupies in the console. /// - /// The render context. /// The number of cells that this segment occupies in the console. - public int CellCount(RenderContext context) + public int CellCount() { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - if (IsControlCode) { return 0; } - return Text.CellLength(context); + return Cell.GetCellLength(Text); } /// /// Gets the number of cells that the segments occupies in the console. /// - /// The render context. /// The segments to measure. /// The number of cells that the segments occupies in the console. - public static int CellCount(RenderContext context, IEnumerable segments) + public static int CellCount(IEnumerable segments) { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - if (segments is null) { throw new ArgumentNullException(nameof(segments)); @@ -138,7 +126,7 @@ namespace Spectre.Console.Rendering var sum = 0; foreach (var segment in segments) { - sum += segment.CellCount(context); + sum += segment.CellCount(); } return sum; @@ -158,7 +146,6 @@ namespace Spectre.Console.Rendering /// /// The offset where to split the segment. /// One or two new segments representing the split. - [Obsolete("Use Split(RenderContext, Int32) instead")] public (Segment First, Segment? Second) Split(int offset) { if (offset < 0) @@ -166,30 +153,7 @@ namespace Spectre.Console.Rendering return (this, null); } - if (offset >= Text.Length) - { - return (this, null); - } - - return ( - new Segment(Text.Substring(0, offset), Style), - new Segment(Text.Substring(offset, Text.Length - offset), Style)); - } - - /// - /// Splits the segment at the offset. - /// - /// The render context. - /// The offset where to split the segment. - /// One or two new segments representing the split. - public (Segment First, Segment? Second) Split(RenderContext context, int offset) - { - if (offset < 0) - { - return (this, null); - } - - if (offset >= CellCount(context)) + if (offset >= CellCount()) { return (this, null); } @@ -201,7 +165,7 @@ namespace Spectre.Console.Rendering foreach (var character in Text) { index++; - accumulated += Cell.GetCellLength(context, character); + accumulated += Cell.GetCellLength(character); if (accumulated >= offset) { break; @@ -226,38 +190,26 @@ namespace Spectre.Console.Rendering /// /// Splits the provided segments into lines. /// - /// The render context. /// The segments to split. /// A collection of lines. - public static List SplitLines(RenderContext context, IEnumerable segments) + public static List SplitLines(IEnumerable segments) { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - if (segments is null) { throw new ArgumentNullException(nameof(segments)); } - return SplitLines(context, segments, int.MaxValue); + return SplitLines(segments, int.MaxValue); } /// /// Splits the provided segments into lines with a maximum width. /// - /// The render context. /// The segments to split into lines. /// The maximum width. /// A list of lines. - public static List SplitLines(RenderContext context, IEnumerable segments, int maxWidth) + public static List SplitLines(IEnumerable segments, int maxWidth) { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - if (segments is null) { throw new ArgumentNullException(nameof(segments)); @@ -271,16 +223,16 @@ namespace Spectre.Console.Rendering while (stack.Count > 0) { var segment = stack.Pop(); - var segmentLength = segment.CellCount(context); + var segmentLength = segment.CellCount(); // Does this segment make the line exceed the max width? - var lineLength = line.CellCount(context); + var lineLength = line.CellCount(); if (lineLength + segmentLength > maxWidth) { var diff = -(maxWidth - (lineLength + segmentLength)); var offset = segment.Text.Length - diff; - var (first, second) = segment.Split(context, offset); + var (first, second) = segment.Split(offset); line.Add(first); lines.Add(line); @@ -356,22 +308,16 @@ namespace Spectre.Console.Rendering ///
/// The segment to split. /// The overflow strategy to use. - /// The render context. /// The maximum width. /// A list of segments that has been split. - public static List SplitOverflow(Segment segment, Overflow? overflow, RenderContext context, int maxWidth) + public static List SplitOverflow(Segment segment, Overflow? overflow, int maxWidth) { if (segment is null) { throw new ArgumentNullException(nameof(segment)); } - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - - if (segment.CellCount(context) <= maxWidth) + if (segment.CellCount() <= maxWidth) { return new List(1) { segment }; } @@ -383,7 +329,7 @@ namespace Spectre.Console.Rendering if (overflow == Overflow.Fold) { - var totalLength = segment.Text.CellLength(context); + var totalLength = segment.Text.CellLength(); var lengthLeft = totalLength; while (lengthLeft > 0) { @@ -431,17 +377,11 @@ namespace Spectre.Console.Rendering /// /// Truncates the segments to the specified width. /// - /// The render context. /// The segments to truncate. /// The maximum width that the segments may occupy. /// A list of segments that has been truncated. - public static List Truncate(RenderContext context, IEnumerable segments, int maxWidth) + public static List Truncate(IEnumerable segments, int maxWidth) { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - if (segments is null) { throw new ArgumentNullException(nameof(segments)); @@ -452,7 +392,7 @@ namespace Spectre.Console.Rendering var totalWidth = 0; foreach (var segment in segments) { - var segmentCellWidth = segment.CellCount(context); + var segmentCellWidth = segment.CellCount(); if (totalWidth + segmentCellWidth > maxWidth) { break; @@ -464,7 +404,7 @@ namespace Spectre.Console.Rendering if (result.Count == 0 && segments.Any()) { - var segment = Truncate(context, segments.First(), maxWidth); + var segment = Truncate(segments.First(), maxWidth); if (segment != null) { result.Add(segment); @@ -477,23 +417,17 @@ namespace Spectre.Console.Rendering /// /// Truncates the segment to the specified width. /// - /// The render context. /// The segment to truncate. /// The maximum width that the segment may occupy. /// A new truncated segment, or null. - public static Segment? Truncate(RenderContext context, Segment? segment, int maxWidth) + public static Segment? Truncate(Segment? segment, int maxWidth) { - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - if (segment is null) { return null; } - if (segment.CellCount(context) <= maxWidth) + if (segment.CellCount() <= maxWidth) { return segment; } @@ -501,7 +435,7 @@ namespace Spectre.Console.Rendering var builder = new StringBuilder(); foreach (var character in segment.Text) { - var accumulatedCellWidth = builder.ToString().CellLength(context); + var accumulatedCellWidth = builder.ToString().CellLength(); if (accumulatedCellWidth >= maxWidth) { break; @@ -562,24 +496,19 @@ namespace Spectre.Console.Rendering return result; } - internal static List TruncateWithEllipsis(IEnumerable segments, RenderContext context, int maxWidth) + internal static List TruncateWithEllipsis(IEnumerable segments, int maxWidth) { if (segments is null) { throw new ArgumentNullException(nameof(segments)); } - if (context is null) - { - throw new ArgumentNullException(nameof(context)); - } - - if (CellCount(context, segments) <= maxWidth) + if (CellCount(segments) <= maxWidth) { return new List(segments); } - segments = TrimEnd(Truncate(context, segments, maxWidth - 1)); + segments = TrimEnd(Truncate(segments, maxWidth - 1)); if (!segments.Any()) { return new List(1); diff --git a/src/Spectre.Console/Rendering/SegmentLine.cs b/src/Spectre.Console/Rendering/SegmentLine.cs index 6978eb6..8c23aad 100644 --- a/src/Spectre.Console/Rendering/SegmentLine.cs +++ b/src/Spectre.Console/Rendering/SegmentLine.cs @@ -16,16 +16,10 @@ namespace Spectre.Console.Rendering /// /// Gets the number of cells the segment line occupies. /// - /// The render context. /// The cell width of the segment line. - public int CellCount(RenderContext context) + public int CellCount() { - if (context is null) - { - throw new System.ArgumentNullException(nameof(context)); - } - - return Segment.CellCount(context, this); + return Segment.CellCount(this); } /// diff --git a/src/Spectre.Console/Rendering/SegmentShape.cs b/src/Spectre.Console/Rendering/SegmentShape.cs index c3bef68..d6c389f 100644 --- a/src/Spectre.Console/Rendering/SegmentShape.cs +++ b/src/Spectre.Console/Rendering/SegmentShape.cs @@ -28,7 +28,7 @@ namespace Spectre.Console.Rendering } var height = lines.Count; - var width = lines.Max(l => Segment.CellCount(context, l)); + var width = lines.Max(l => Segment.CellCount(l)); return new SegmentShape(width, height); } @@ -44,7 +44,7 @@ namespace Spectre.Console.Rendering { foreach (var line in lines) { - var length = Segment.CellCount(context, line); + var length = Segment.CellCount(line); var missing = Width - length; if (missing > 0) { diff --git a/src/Spectre.Console/Widgets/Figlet/FigletText.cs b/src/Spectre.Console/Widgets/Figlet/FigletText.cs index d34ce3a..a72c3b0 100644 --- a/src/Spectre.Console/Widgets/Figlet/FigletText.cs +++ b/src/Spectre.Console/Widgets/Figlet/FigletText.cs @@ -53,7 +53,7 @@ namespace Spectre.Console { var line = new Segment(string.Concat(row.Select(x => x.Lines[index])), style); - var lineWidth = line.CellCount(context); + var lineWidth = line.CellCount(); if (alignment == Justify.Left) { yield return line; diff --git a/src/Spectre.Console/Widgets/Padder.cs b/src/Spectre.Console/Widgets/Padder.cs index c04d96d..e3121ca 100644 --- a/src/Spectre.Console/Widgets/Padder.cs +++ b/src/Spectre.Console/Widgets/Padder.cs @@ -70,7 +70,7 @@ namespace Spectre.Console } var child = _child.Render(context, maxWidth - paddingWidth); - foreach (var (_, _, _, line) in Segment.SplitLines(context, child).Enumerate()) + foreach (var line in Segment.SplitLines(child)) { // Left padding if (Padding.GetLeftSafe() != 0) @@ -87,7 +87,7 @@ namespace Spectre.Console } // Missing space on right side? - var lineWidth = line.CellCount(context); + var lineWidth = line.CellCount(); var diff = width - lineWidth - Padding.GetLeftSafe() - Padding.GetRightSafe(); if (diff > 0) { diff --git a/src/Spectre.Console/Widgets/Panel.cs b/src/Spectre.Console/Widgets/Panel.cs index d490bf7..38a51f6 100644 --- a/src/Spectre.Console/Widgets/Panel.cs +++ b/src/Spectre.Console/Widgets/Panel.cs @@ -78,7 +78,7 @@ namespace Spectre.Console { var edgeWidth = EdgeWidth; - var border = BoxExtensions.GetSafeBorder(Border, (context.LegacyConsole || !context.Unicode) && UseSafeBorder); + var border = BoxExtensions.GetSafeBorder(Border, !context.Unicode && UseSafeBorder); var borderStyle = BorderStyle ?? Style.Plain; var showBorder = true; @@ -110,7 +110,7 @@ namespace Spectre.Console // Split the child segments into lines. var childSegments = ((IRenderable)child).Render(context, childWidth); - foreach (var (_, _, last, line) in Segment.SplitLines(context, childSegments, childWidth).Enumerate()) + foreach (var (_, _, last, line) in Segment.SplitLines(childSegments, childWidth).Enumerate()) { if (line.Count == 1 && line[0].IsWhiteSpace) { @@ -128,7 +128,7 @@ namespace Spectre.Console content.AddRange(line); // Do we need to pad the panel? - var length = line.Sum(segment => segment.CellCount(context)); + var length = line.Sum(segment => segment.CellCount()); if (length < childWidth) { var diff = childWidth - length; diff --git a/src/Spectre.Console/Widgets/Paragraph.cs b/src/Spectre.Console/Widgets/Paragraph.cs index 818a9d8..c6a2abf 100644 --- a/src/Spectre.Console/Widgets/Paragraph.cs +++ b/src/Spectre.Console/Widgets/Paragraph.cs @@ -118,8 +118,8 @@ namespace Spectre.Console return new Measurement(0, 0); } - var min = _lines.Max(line => line.Max(segment => segment.CellCount(context))); - var max = _lines.Max(x => x.CellCount(context)); + var min = _lines.Max(line => line.Max(segment => segment.CellCount())); + var max = _lines.Max(x => x.CellCount()); return new Measurement(min, Math.Min(max, maxWidth)); } @@ -139,7 +139,7 @@ namespace Spectre.Console var lines = context.SingleLine ? new List(_lines) - : SplitLines(context, maxWidth); + : SplitLines(maxWidth); // Justify lines var justification = context.Justification ?? Alignment ?? Justify.Left; @@ -178,7 +178,7 @@ namespace Spectre.Console return result; } - private List SplitLines(RenderContext context, int maxWidth) + private List SplitLines(int maxWidth) { if (maxWidth <= 0) { @@ -186,7 +186,7 @@ namespace Spectre.Console return new List(); } - if (_lines.Max(x => x.CellCount(context)) <= maxWidth) + if (_lines.Max(x => x.CellCount()) <= maxWidth) { return Clone(); } @@ -230,15 +230,15 @@ namespace Spectre.Console continue; } - var length = current.CellCount(context); + var length = current.CellCount(); if (length > maxWidth) { // The current segment is longer than the width of the console, // so we will need to crop it up, into new segments. - var segments = Segment.SplitOverflow(current, Overflow, context, maxWidth); + var segments = Segment.SplitOverflow(current, Overflow, maxWidth); if (segments.Count > 0) { - if (line.CellCount(context) + segments[0].CellCount(context) > maxWidth) + if (line.CellCount() + segments[0].CellCount() > maxWidth) { lines.Add(line); line = new SegmentLine(); @@ -258,7 +258,7 @@ namespace Spectre.Console } else { - if (line.CellCount(context) + length > maxWidth) + if (line.CellCount() + length > maxWidth) { line.Add(Segment.Empty); lines.Add(line); diff --git a/src/Spectre.Console/Widgets/Progress/Columns/SpinnerColumn.cs b/src/Spectre.Console/Widgets/Progress/Columns/SpinnerColumn.cs index deb9809..613b204 100644 --- a/src/Spectre.Console/Widgets/Progress/Columns/SpinnerColumn.cs +++ b/src/Spectre.Console/Widgets/Progress/Columns/SpinnerColumn.cs @@ -101,7 +101,7 @@ namespace Spectre.Console /// public override IRenderable Render(RenderContext context, ProgressTask task, TimeSpan deltaTime) { - var useAscii = (context.LegacyConsole || !context.Unicode) && _spinner.IsUnicode; + var useAscii = !context.Unicode && _spinner.IsUnicode; var spinner = useAscii ? Spinner.Known.Ascii : _spinner ?? Spinner.Known.Default; if (!task.IsStarted) @@ -138,14 +138,14 @@ namespace Spectre.Console { if (_maxWidth == null) { - var useAscii = (context.LegacyConsole || !context.Unicode) && _spinner.IsUnicode; + var useAscii = !context.Unicode && _spinner.IsUnicode; var spinner = useAscii ? Spinner.Known.Ascii : _spinner ?? Spinner.Known.Default; _maxWidth = Math.Max( Math.Max( ((IRenderable)new Markup(PendingText ?? " ")).Measure(context, int.MaxValue).Max, ((IRenderable)new Markup(CompletedText ?? " ")).Measure(context, int.MaxValue).Max), - spinner.Frames.Max(frame => Cell.GetCellLength(context, frame))); + spinner.Frames.Max(frame => Cell.GetCellLength(frame))); } return _maxWidth.Value; diff --git a/src/Spectre.Console/Widgets/Progress/ProgressContext.cs b/src/Spectre.Console/Widgets/Progress/ProgressContext.cs index fefd71f..5faae50 100644 --- a/src/Spectre.Console/Widgets/Progress/ProgressContext.cs +++ b/src/Spectre.Console/Widgets/Progress/ProgressContext.cs @@ -52,7 +52,7 @@ namespace Spectre.Console public void Refresh() { _renderer.Update(this); - _console.Render(new ControlSequence(string.Empty)); + _console.Write(new ControlSequence(string.Empty)); } internal IReadOnlyList GetTasks() diff --git a/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs b/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs index 25db5f0..c764531 100644 --- a/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs +++ b/src/Spectre.Console/Widgets/Progress/Renderers/DefaultProgressRenderer.cs @@ -42,7 +42,7 @@ namespace Spectre.Console { if (clear) { - _console.Render(_live.RestoreCursor()); + _console.Write(_live.RestoreCursor()); } else { @@ -62,7 +62,7 @@ namespace Spectre.Console _stopwatch.Start(); } - var renderContext = new RenderContext(_console.Profile.Encoding, _console.Profile.Capabilities.Legacy); + var renderContext = new RenderContext(_console.Profile.Capabilities); var delta = _stopwatch.Elapsed - _lastUpdate; _lastUpdate = _stopwatch.Elapsed; diff --git a/src/Spectre.Console/Widgets/ProgressBar.cs b/src/Spectre.Console/Widgets/ProgressBar.cs index 0021b1b..385f578 100644 --- a/src/Spectre.Console/Widgets/ProgressBar.cs +++ b/src/Spectre.Console/Widgets/ProgressBar.cs @@ -32,7 +32,7 @@ namespace Spectre.Console var width = Math.Min(Width ?? maxWidth, maxWidth); var completed = Math.Min(MaxValue, Math.Max(0, Value)); - var token = !context.Unicode || context.LegacyConsole ? AsciiBar : UnicodeBar; + var token = !context.Unicode ? AsciiBar : UnicodeBar; var style = completed >= MaxValue ? FinishedStyle : CompletedStyle; var bars = Math.Max(0, (int)(width * (completed / MaxValue))); diff --git a/src/Spectre.Console/ConfirmationPrompt.cs b/src/Spectre.Console/Widgets/Prompt/ConfirmationPrompt.cs similarity index 100% rename from src/Spectre.Console/ConfirmationPrompt.cs rename to src/Spectre.Console/Widgets/Prompt/ConfirmationPrompt.cs diff --git a/src/Spectre.Console/Widgets/Prompt/Rendering/RenderableList.cs b/src/Spectre.Console/Widgets/Prompt/Rendering/RenderableList.cs index e90be4c..93cd7f2 100644 --- a/src/Spectre.Console/Widgets/Prompt/Rendering/RenderableList.cs +++ b/src/Spectre.Console/Widgets/Prompt/Rendering/RenderableList.cs @@ -33,12 +33,12 @@ namespace Spectre.Console public void Clear() { - _console.Render(_live.RestoreCursor()); + _console.Write(_live.RestoreCursor()); } public void Redraw() { - _console.Render(new ControlSequence(string.Empty)); + _console.Write(new ControlSequence(string.Empty)); } public bool Update(ConsoleKey key) diff --git a/src/Spectre.Console/Widgets/Rule.cs b/src/Spectre.Console/Widgets/Rule.cs index 1078e2e..8a48025 100644 --- a/src/Spectre.Console/Widgets/Rule.cs +++ b/src/Spectre.Console/Widgets/Rule.cs @@ -59,10 +59,10 @@ namespace Spectre.Console // Get the title and make sure it fits. var title = GetTitleSegments(context, Title, maxWidth - extraLength); - if (Segment.CellCount(context, title) > maxWidth - extraLength) + if (Segment.CellCount(title) > maxWidth - extraLength) { // Truncate the title - title = Segment.TruncateWithEllipsis(title, context, maxWidth - extraLength); + title = Segment.TruncateWithEllipsis(title, maxWidth - extraLength); if (!title.Any()) { // We couldn't fit the title at all. @@ -83,7 +83,7 @@ namespace Spectre.Console private IEnumerable GetLineWithoutTitle(RenderContext context, int maxWidth) { - var border = Border.GetSafeBorder(context.LegacyConsole || !context.Unicode); + var border = Border.GetSafeBorder(safe: !context.Unicode); var text = border.GetPart(BoxBorderPart.Top).Repeat(maxWidth); return new[] @@ -102,9 +102,9 @@ namespace Spectre.Console private (Segment Left, Segment Right) GetLineSegments(RenderContext context, int width, IEnumerable title) { - var titleLength = Segment.CellCount(context, title); + var titleLength = Segment.CellCount(title); - var border = Border.GetSafeBorder(context.LegacyConsole || !context.Unicode); + var border = Border.GetSafeBorder(safe: !context.Unicode); var borderPart = border.GetPart(BoxBorderPart.Top); var alignment = Alignment ?? Justify.Center; @@ -112,7 +112,7 @@ namespace Spectre.Console { var left = new Segment(borderPart.Repeat(TitlePadding) + new string(' ', TitleSpacing), Style ?? Style.Plain); - var rightLength = width - titleLength - left.CellCount(context) - TitleSpacing; + var rightLength = width - titleLength - left.CellCount() - TitleSpacing; var right = new Segment(new string(' ', TitleSpacing) + borderPart.Repeat(rightLength), Style ?? Style.Plain); return (left, right); @@ -122,7 +122,7 @@ namespace Spectre.Console var leftLength = ((width - titleLength) / 2) - TitleSpacing; var left = new Segment(borderPart.Repeat(leftLength) + new string(' ', TitleSpacing), Style ?? Style.Plain); - var rightLength = width - titleLength - left.CellCount(context) - TitleSpacing; + var rightLength = width - titleLength - left.CellCount() - TitleSpacing; var right = new Segment(new string(' ', TitleSpacing) + borderPart.Repeat(rightLength), Style ?? Style.Plain); return (left, right); @@ -131,7 +131,7 @@ namespace Spectre.Console { var right = new Segment(new string(' ', TitleSpacing) + borderPart.Repeat(TitlePadding), Style ?? Style.Plain); - var leftLength = width - titleLength - right.CellCount(context) - TitleSpacing; + var leftLength = width - titleLength - right.CellCount() - TitleSpacing; var left = new Segment(borderPart.Repeat(leftLength) + new string(' ', TitleSpacing), Style ?? Style.Plain); return (left, right); diff --git a/src/Spectre.Console/Widgets/Table/TableRenderer.cs b/src/Spectre.Console/Widgets/Table/TableRenderer.cs index 32d8c7e..a1622c0 100644 --- a/src/Spectre.Console/Widgets/Table/TableRenderer.cs +++ b/src/Spectre.Console/Widgets/Table/TableRenderer.cs @@ -33,7 +33,7 @@ namespace Spectre.Console var justification = context.Columns[columnIndex].Alignment; var childContext = context.Options.WithJustification(justification); - var lines = Segment.SplitLines(context.Options, cell.Render(childContext, rowWidth)); + var lines = Segment.SplitLines(cell.Render(childContext, rowWidth)); cellHeight = Math.Max(cellHeight, lines.Count); cells.Add(lines); } @@ -41,7 +41,7 @@ namespace Spectre.Console // Show top of header? if (isFirstRow && context.ShowBorder) { - var separator = Aligner.Align(context.Options, context.Border.GetColumnRow(TablePart.Top, columnWidths, context.Columns), context.Alignment, context.MaxWidth); + var separator = Aligner.Align(context.Border.GetColumnRow(TablePart.Top, columnWidths, context.Columns), context.Alignment, context.MaxWidth); result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } @@ -52,7 +52,7 @@ namespace Spectre.Console var textBorder = context.Border.GetColumnRow(TablePart.FooterSeparator, columnWidths, context.Columns); if (!string.IsNullOrEmpty(textBorder)) { - var separator = Aligner.Align(context.Options, textBorder, context.Alignment, context.MaxWidth); + var separator = Aligner.Align(textBorder, context.Alignment, context.MaxWidth); result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } @@ -89,7 +89,7 @@ namespace Spectre.Console rowResult.AddRange(cell[cellRowIndex]); // Pad cell content right - var length = cell[cellRowIndex].Sum(segment => segment.CellCount(context.Options)); + var length = cell[cellRowIndex].Sum(segment => segment.CellCount()); if (length < columnWidths[cellIndex]) { rowResult.Add(new Segment(new string(' ', columnWidths[cellIndex] - length))); @@ -123,9 +123,9 @@ namespace Spectre.Console Aligner.Align(context.Options, rowResult, context.Alignment, context.MaxWidth); // Is the row larger than the allowed max width? - if (Segment.CellCount(context.Options, rowResult) > context.MaxWidth) + if (Segment.CellCount(rowResult) > context.MaxWidth) { - result.AddRange(Segment.Truncate(context.Options, rowResult, context.MaxWidth)); + result.AddRange(Segment.Truncate(rowResult, context.MaxWidth)); } else { @@ -138,7 +138,7 @@ namespace Spectre.Console // Show header separator? if (isFirstRow && context.ShowBorder && context.ShowHeaders && context.HasRows) { - var separator = Aligner.Align(context.Options, context.Border.GetColumnRow(TablePart.HeaderSeparator, columnWidths, context.Columns), context.Alignment, context.MaxWidth); + var separator = Aligner.Align(context.Border.GetColumnRow(TablePart.HeaderSeparator, columnWidths, context.Columns), context.Alignment, context.MaxWidth); result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } @@ -146,7 +146,7 @@ namespace Spectre.Console // Show bottom of footer? if (isLastRow && context.ShowBorder) { - var separator = Aligner.Align(context.Options, context.Border.GetColumnRow(TablePart.Bottom, columnWidths, context.Columns), context.Alignment, context.MaxWidth); + var separator = Aligner.Align(context.Border.GetColumnRow(TablePart.Bottom, columnWidths, context.Columns), context.Alignment, context.MaxWidth); result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } diff --git a/src/Spectre.Console/Widgets/Table/TableRendererContext.cs b/src/Spectre.Console/Widgets/Table/TableRendererContext.cs index 0ba486d..24021a1 100644 --- a/src/Spectre.Console/Widgets/Table/TableRendererContext.cs +++ b/src/Spectre.Console/Widgets/Table/TableRendererContext.cs @@ -47,7 +47,7 @@ namespace Spectre.Console ShowBorder = _table.Border.Visible; HasRows = Rows.Any(row => !row.IsHeader && !row.IsFooter); HasFooters = Rows.Any(column => column.IsFooter); - Border = table.Border.GetSafeBorder((options.LegacyConsole || !options.Unicode) && table.UseSafeBorder); + Border = table.Border.GetSafeBorder(!options.Unicode && table.UseSafeBorder); BorderStyle = table.BorderStyle ?? Style.Plain; TableWidth = tableWidth; diff --git a/src/Spectre.Console/Widgets/Tree.cs b/src/Spectre.Console/Widgets/Tree.cs index 5638e34..88b1c0d 100644 --- a/src/Spectre.Console/Widgets/Tree.cs +++ b/src/Spectre.Console/Widgets/Tree.cs @@ -91,7 +91,7 @@ namespace Spectre.Console } var prefix = levels.Skip(1).ToList(); - var renderableLines = Segment.SplitLines(context, current.Renderable.Render(context, maxWidth - Segment.CellCount(context, prefix))); + var renderableLines = Segment.SplitLines(current.Renderable.Render(context, maxWidth - Segment.CellCount(prefix))); foreach (var (_, isFirstLine, _, line) in renderableLines.Enumerate()) { @@ -124,7 +124,7 @@ namespace Spectre.Console private Segment GetGuide(RenderContext context, TreeGuidePart part) { - var guide = Guide.GetSafeTreeGuide(context.LegacyConsole || !context.Unicode); + var guide = Guide.GetSafeTreeGuide(safe: !context.Unicode); return new Segment(guide.GetPart(part), Style ?? Style.Plain); } }