mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-10-31 09:09:25 +08:00 
			
		
		
		
	Add link identity generator
This commit is contained in:
		| @@ -1,32 +0,0 @@ | ||||
| using System; | ||||
| using System.IO; | ||||
|  | ||||
| namespace Spectre.Console.Tests | ||||
| { | ||||
|     public sealed class AnsiConsoleFixture : IDisposable | ||||
|     { | ||||
|         private readonly StringWriter _writer; | ||||
|  | ||||
|         public IAnsiConsole Console { get; } | ||||
|  | ||||
|         public string Output => _writer.ToString(); | ||||
|  | ||||
|         public AnsiConsoleFixture(ColorSystem system, AnsiSupport ansi = AnsiSupport.Yes, int width = 80) | ||||
|         { | ||||
|             _writer = new StringWriter(); | ||||
|  | ||||
|             Console = new ConsoleWithWidth( | ||||
|                 AnsiConsole.Create(new AnsiConsoleSettings | ||||
|                 { | ||||
|                     Ansi = ansi, | ||||
|                     ColorSystem = (ColorSystemSupport)system, | ||||
|                     Out = _writer, | ||||
|                 }), width); | ||||
|         } | ||||
|  | ||||
|         public void Dispose() | ||||
|         { | ||||
|             _writer?.Dispose(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,27 +0,0 @@ | ||||
| using System.Text; | ||||
|  | ||||
| namespace Spectre.Console.Tests | ||||
| { | ||||
|     public sealed class ConsoleWithWidth : IAnsiConsole | ||||
|     { | ||||
|         private readonly IAnsiConsole _console; | ||||
|  | ||||
|         public Capabilities Capabilities => _console.Capabilities; | ||||
|  | ||||
|         public int Width { get; } | ||||
|         public int Height => _console.Height; | ||||
|  | ||||
|         public Encoding Encoding => _console.Encoding; | ||||
|  | ||||
|         public ConsoleWithWidth(IAnsiConsole console, int width) | ||||
|         { | ||||
|             _console = console; | ||||
|             Width = width; | ||||
|         } | ||||
|  | ||||
|         public void Write(string text, Style style) | ||||
|         { | ||||
|             _console.Write(text, style); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										44
									
								
								src/Spectre.Console.Tests/Tools/AnsiConsoleFixture.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/Spectre.Console.Tests/Tools/AnsiConsoleFixture.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| using System; | ||||
| using System.IO; | ||||
| using System.Text; | ||||
| using Spectre.Console.Tests.Tools; | ||||
|  | ||||
| namespace Spectre.Console.Tests | ||||
| { | ||||
|     public sealed class TestableAnsiConsole : IDisposable, IAnsiConsole | ||||
|     { | ||||
|         private readonly StringWriter _writer; | ||||
|         private readonly IAnsiConsole _console; | ||||
|  | ||||
|         public string Output => _writer.ToString(); | ||||
|  | ||||
|         public Capabilities Capabilities => _console.Capabilities; | ||||
|         public Encoding Encoding => _console.Encoding; | ||||
|         public int Width { get; } | ||||
|         public int Height => _console.Height; | ||||
|  | ||||
|         public TestableAnsiConsole(ColorSystem system, AnsiSupport ansi = AnsiSupport.Yes, int width = 80) | ||||
|         { | ||||
|             _writer = new StringWriter(); | ||||
|             _console = AnsiConsole.Create(new AnsiConsoleSettings | ||||
|             { | ||||
|                 Ansi = ansi, | ||||
|                 ColorSystem = (ColorSystemSupport)system, | ||||
|                 Out = _writer, | ||||
|                 LinkIdentityGenerator = new TestLinkIdentityGenerator(), | ||||
|             }); | ||||
|  | ||||
|             Width = width; | ||||
|         } | ||||
|  | ||||
|         public void Dispose() | ||||
|         { | ||||
|             _writer?.Dispose(); | ||||
|         } | ||||
|  | ||||
|         public void Write(string text, Style style) | ||||
|         { | ||||
|             _console.Write(text, style); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										10
									
								
								src/Spectre.Console.Tests/Tools/TestLinkIdentityGenerator.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/Spectre.Console.Tests/Tools/TestLinkIdentityGenerator.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| namespace Spectre.Console.Tests.Tools | ||||
| { | ||||
|     public sealed class TestLinkIdentityGenerator : ILinkIdentityGenerator | ||||
|     { | ||||
|         public int GenerateId(string link, string text) | ||||
|         { | ||||
|             return 1024; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -13,13 +13,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Return_Correct_Code(bool foreground, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.TrueColor); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.TrueColor); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(new Color(128, 0, 128), foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(new Color(128, 0, 128), foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -28,13 +28,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Return_Eight_Bit_Ansi_Code_For_Known_Colors(bool foreground, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.TrueColor); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.TrueColor); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(Color.Purple, foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(Color.Purple, foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -46,13 +46,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Return_Correct_Code_For_Known_Color(bool foreground, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.EightBit); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.EightBit); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -61,13 +61,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Map_TrueColor_To_Nearest_Eight_Bit_Color_If_Possible(bool foreground, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.EightBit); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.EightBit); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(new Color(128, 128, 0), foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(new Color(128, 128, 0), foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -76,13 +76,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Estimate_TrueColor_To_Nearest_Eight_Bit_Color(bool foreground, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.EightBit); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.EightBit); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(new Color(126, 127, 0), foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(new Color(126, 127, 0), foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -94,13 +94,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Return_Correct_Code_For_Known_Color(bool foreground, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -114,13 +114,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|                 string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -134,13 +134,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|                 string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -152,13 +152,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Return_Correct_Code_For_Known_Color(bool foreground, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Legacy); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Legacy); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(Color.Olive, foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -172,13 +172,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|                 string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Legacy); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Legacy); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -192,13 +192,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|                 string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Legacy); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Legacy); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|                 console.Write("Hello", new Style().SetColor(new Color(r, g, b), foreground)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -13,18 +13,18 @@ namespace Spectre.Console.Tests.Unit | ||||
|             [Theory] | ||||
|             [InlineData("[yellow]Hello[/]", "[93mHello[0m")] | ||||
|             [InlineData("[yellow]Hello [italic]World[/]![/]", "[93mHello [0m[3;93mWorld[0m[93m![0m")] | ||||
|             [InlineData("[link=https://patriksvensson.se]Click to visit my blog[/]", "]8;id=2026695893;https://patriksvensson.se\\Click to visit my blog]8;;\\")] | ||||
|             [InlineData("[link]https://patriksvensson.se[/]", "]8;id=2026695893;https://patriksvensson.se\\https://patriksvensson.se]8;;\\")] | ||||
|             [InlineData("[link=https://patriksvensson.se]Click to visit my blog[/]", "]8;id=1024;https://patriksvensson.se\\Click to visit my blog]8;;\\")] | ||||
|             [InlineData("[link]https://patriksvensson.se[/]", "]8;id=1024;https://patriksvensson.se\\https://patriksvensson.se]8;;\\")] | ||||
|             public void Should_Output_Expected_Ansi_For_Markup(string markup, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Markup(markup); | ||||
|                 console.Markup(markup); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -32,13 +32,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Be_Able_To_Escape_Tags(string markup, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.Markup(markup); | ||||
|                 console.Markup(markup); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.ShouldBe(expected); | ||||
|                 console.Output.ShouldBe(expected); | ||||
|             } | ||||
|  | ||||
|             [Theory] | ||||
| @@ -49,10 +49,10 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Throw_If_Encounters_Malformed_Tag(string markup, string expected) | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|  | ||||
|                 // When | ||||
|                 var result = Record.Exception(() => fixture.Console.Markup(markup)); | ||||
|                 var result = Record.Exception(() => console.Markup(markup)); | ||||
|  | ||||
|                 // Then | ||||
|                 result.ShouldBeOfType<InvalidOperationException>() | ||||
| @@ -63,10 +63,10 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Throw_If_Tags_Are_Unbalanced() | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|  | ||||
|                 // When | ||||
|                 var result = Record.Exception(() => fixture.Console.Markup("[yellow][blue]Hello[/]")); | ||||
|                 var result = Record.Exception(() => console.Markup("[yellow][blue]Hello[/]")); | ||||
|  | ||||
|                 // Then | ||||
|                 result.ShouldBeOfType<InvalidOperationException>() | ||||
| @@ -77,10 +77,10 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Throw_If_Encounters_Closing_Tag() | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|  | ||||
|                 // When | ||||
|                 var result = Record.Exception(() => fixture.Console.Markup("Hello[/]World")); | ||||
|                 var result = Record.Exception(() => console.Markup("Hello[/]World")); | ||||
|  | ||||
|                 // Then | ||||
|                 result.ShouldBeOfType<InvalidOperationException>() | ||||
|   | ||||
| @@ -18,13 +18,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Write_Decorated_Text_Correctly(Decoration decoration, string expected) | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new AnsiConsoleFixture(ColorSystem.TrueColor); | ||||
|             var console = new TestableAnsiConsole(ColorSystem.TrueColor); | ||||
|  | ||||
|             // When | ||||
|             fixture.Console.Write("Hello World", Style.WithDecoration(decoration)); | ||||
|             console.Write("Hello World", Style.WithDecoration(decoration)); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output.ShouldBe(expected); | ||||
|             console.Output.ShouldBe(expected); | ||||
|         } | ||||
|  | ||||
|         [Theory] | ||||
| @@ -33,13 +33,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Write_Text_With_Multiple_Decorations_Correctly(Decoration decoration, string expected) | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new AnsiConsoleFixture(ColorSystem.TrueColor); | ||||
|             var console = new TestableAnsiConsole(ColorSystem.TrueColor); | ||||
|  | ||||
|             // When | ||||
|             fixture.Console.Write("Hello World", Style.WithDecoration(decoration)); | ||||
|             console.Write("Hello World", Style.WithDecoration(decoration)); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output.ShouldBe(expected); | ||||
|             console.Output.ShouldBe(expected); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -10,68 +10,68 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Combine_Decoration_And_Colors() | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new AnsiConsoleFixture(ColorSystem.Standard); | ||||
|             var console = new TestableAnsiConsole(ColorSystem.Standard); | ||||
|  | ||||
|             // When | ||||
|             fixture.Console.Write( | ||||
|             console.Write( | ||||
|                 "Hello", | ||||
|                 Style.WithForeground(Color.RoyalBlue1) | ||||
|                      .WithBackground(Color.NavajoWhite1) | ||||
|                      .WithDecoration(Decoration.Italic)); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output.ShouldBe("\u001b[3;90;47mHello\u001b[0m"); | ||||
|             console.Output.ShouldBe("\u001b[3;90;47mHello\u001b[0m"); | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void Should_Not_Include_Foreground_If_Set_To_Default_Color() | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new AnsiConsoleFixture(ColorSystem.Standard); | ||||
|             var console = new TestableAnsiConsole(ColorSystem.Standard); | ||||
|  | ||||
|             // When | ||||
|             fixture.Console.Write( | ||||
|             console.Write( | ||||
|                 "Hello", | ||||
|                 Style.WithForeground(Color.Default) | ||||
|                      .WithBackground(Color.NavajoWhite1) | ||||
|                      .WithDecoration(Decoration.Italic)); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output.ShouldBe("\u001b[3;47mHello\u001b[0m"); | ||||
|             console.Output.ShouldBe("\u001b[3;47mHello\u001b[0m"); | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void Should_Not_Include_Background_If_Set_To_Default_Color() | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new AnsiConsoleFixture(ColorSystem.Standard); | ||||
|             var console = new TestableAnsiConsole(ColorSystem.Standard); | ||||
|  | ||||
|             // When | ||||
|             fixture.Console.Write( | ||||
|             console.Write( | ||||
|                 "Hello", | ||||
|                 Style.WithForeground(Color.RoyalBlue1) | ||||
|                      .WithBackground(Color.Default) | ||||
|                      .WithDecoration(Decoration.Italic)); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output.ShouldBe("\u001b[3;90mHello\u001b[0m"); | ||||
|             console.Output.ShouldBe("\u001b[3;90mHello\u001b[0m"); | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void Should_Not_Include_Decoration_If_Set_To_None() | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new AnsiConsoleFixture(ColorSystem.Standard); | ||||
|             var console = new TestableAnsiConsole(ColorSystem.Standard); | ||||
|  | ||||
|             // When | ||||
|             fixture.Console.Write( | ||||
|             console.Write( | ||||
|                 "Hello", | ||||
|                 Style.WithForeground(Color.RoyalBlue1) | ||||
|                      .WithBackground(Color.NavajoWhite1) | ||||
|                      .WithDecoration(Decoration.None)); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output.ShouldBe("\u001b[90;47mHello\u001b[0m"); | ||||
|             console.Output.ShouldBe("\u001b[90;47mHello\u001b[0m"); | ||||
|         } | ||||
|  | ||||
|         public sealed class WriteLine | ||||
| @@ -80,14 +80,14 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Reset_Colors_Correctly_After_Line_Break() | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.WriteLine("Hello", Style.WithBackground(ConsoleColor.Red)); | ||||
|                 fixture.Console.WriteLine("World", Style.WithBackground(ConsoleColor.Green)); | ||||
|                 console.WriteLine("Hello", Style.WithBackground(ConsoleColor.Red)); | ||||
|                 console.WriteLine("World", Style.WithBackground(ConsoleColor.Green)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.NormalizeLineEndings() | ||||
|                 console.Output.NormalizeLineEndings() | ||||
|                     .ShouldBe("[101mHello[0m\n[102mWorld[0m\n"); | ||||
|             } | ||||
|  | ||||
| @@ -95,13 +95,13 @@ namespace Spectre.Console.Tests.Unit | ||||
|             public void Should_Reset_Colors_Correctly_After_Line_Break_In_Text() | ||||
|             { | ||||
|                 // Given | ||||
|                 var fixture = new AnsiConsoleFixture(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|                 var console = new TestableAnsiConsole(ColorSystem.Standard, AnsiSupport.Yes); | ||||
|  | ||||
|                 // When | ||||
|                 fixture.Console.WriteLine("Hello\nWorld", Style.WithBackground(ConsoleColor.Red)); | ||||
|                 console.WriteLine("Hello\nWorld", Style.WithBackground(ConsoleColor.Red)); | ||||
|  | ||||
|                 // Then | ||||
|                 fixture.Output.NormalizeLineEndings() | ||||
|                 console.Output.NormalizeLineEndings() | ||||
|                     .ShouldBe("[101mHello[0m\n[101mWorld[0m\n"); | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -12,7 +12,7 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Throw_If_Closing_Tag_Is_Not_Properly_Escaped(string input) | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new PlainConsole(); | ||||
|             var console = new PlainConsole(); | ||||
|  | ||||
|             // When | ||||
|             var result = Record.Exception(() => new Markup(input)); | ||||
| @@ -27,14 +27,14 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Escape_Markup_Blocks_As_Expected() | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new PlainConsole(); | ||||
|             var console = new PlainConsole(); | ||||
|             var markup = new Markup("Hello [[ World ]] !"); | ||||
|  | ||||
|             // When | ||||
|             fixture.Render(markup); | ||||
|             console.Render(markup); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output.ShouldBe("Hello [ World ] !"); | ||||
|             console.Output.ShouldBe("Hello [ World ] !"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -37,14 +37,14 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Render_Unstyled_Text_As_Expected() | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new PlainConsole(width: 80); | ||||
|             var console = new PlainConsole(width: 80); | ||||
|             var text = new Text("Hello World"); | ||||
|  | ||||
|             // When | ||||
|             fixture.Render(text); | ||||
|             console.Render(text); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output | ||||
|             console.Output | ||||
|                 .NormalizeLineEndings() | ||||
|                 .ShouldBe("Hello World"); | ||||
|         } | ||||
| @@ -55,14 +55,14 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Write_Line_Breaks(string input) | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new PlainConsole(width: 5); | ||||
|             var console = new PlainConsole(width: 5); | ||||
|             var text = new Text(input); | ||||
|  | ||||
|             // When | ||||
|             fixture.Render(text); | ||||
|             console.Render(text); | ||||
|  | ||||
|             // Then | ||||
|             fixture.RawOutput.ShouldBe("Hello\n\nWorld\n\n"); | ||||
|             console.RawOutput.ShouldBe("Hello\n\nWorld\n\n"); | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -87,14 +87,14 @@ namespace Spectre.Console.Tests.Unit | ||||
|             int width, string input, string expected) | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new PlainConsole(width); | ||||
|             var console = new PlainConsole(width); | ||||
|             var text = new Text(input); | ||||
|  | ||||
|             // When | ||||
|             fixture.Render(text); | ||||
|             console.Render(text); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output | ||||
|             console.Output | ||||
|                 .NormalizeLineEndings() | ||||
|                 .ShouldBe(expected); | ||||
|         } | ||||
| @@ -106,15 +106,15 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public void Should_Overflow_Text_Correctly(Overflow overflow, string expected) | ||||
|         { | ||||
|             // Given | ||||
|             var fixture = new PlainConsole(14); | ||||
|             var console = new PlainConsole(14); | ||||
|             var text = new Text("foo pneumonoultramicroscopicsilicovolcanoconiosis bar qux") | ||||
|                 .SetOverflow(overflow); | ||||
|  | ||||
|             // When | ||||
|             fixture.Render(text); | ||||
|             console.Render(text); | ||||
|  | ||||
|             // Then | ||||
|             fixture.Output | ||||
|             console.Output | ||||
|                 .NormalizeLineEndings() | ||||
|                 .ShouldBe(expected); | ||||
|         } | ||||
|   | ||||
| @@ -55,7 +55,7 @@ namespace Spectre.Console | ||||
|         /// <returns>An <see cref="IAnsiConsole"/> instance.</returns> | ||||
|         public static IAnsiConsole Create(AnsiConsoleSettings settings) | ||||
|         { | ||||
|             return ConsoleBuilder.Build(settings); | ||||
|             return AnsiConsoleBuilder.Build(settings); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -18,6 +18,11 @@ namespace Spectre.Console | ||||
|         /// </summary> | ||||
|         public ColorSystemSupport ColorSystem { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the link identity generator. | ||||
|         /// </summary> | ||||
|         public ILinkIdentityGenerator? LinkIdentityGenerator { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets the out buffer. | ||||
|         /// </summary> | ||||
|   | ||||
| @@ -12,6 +12,11 @@ namespace Spectre.Console | ||||
|         /// </summary> | ||||
|         Capabilities Capabilities { get; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets the console output encoding. | ||||
|         /// </summary> | ||||
|         Encoding Encoding { get; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets the buffer width of the console. | ||||
|         /// </summary> | ||||
| @@ -22,11 +27,6 @@ namespace Spectre.Console | ||||
|         /// </summary> | ||||
|         int Height { get; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets the console output encoding. | ||||
|         /// </summary> | ||||
|         Encoding Encoding { get; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Writes a string followed by a line terminator to the console. | ||||
|         /// </summary> | ||||
|   | ||||
							
								
								
									
										16
									
								
								src/Spectre.Console/ILinkIdentityGenerator.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/Spectre.Console/ILinkIdentityGenerator.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| namespace Spectre.Console | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Represents a link identity generator. | ||||
|     /// </summary> | ||||
|     public interface ILinkIdentityGenerator | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Generates an ID for the given link. | ||||
|         /// </summary> | ||||
|         /// <param name="link">The link.</param> | ||||
|         /// <param name="text">The link text.</param> | ||||
|         /// <returns>A unique ID for the link.</returns> | ||||
|         public int GenerateId(string link, string text); | ||||
|     } | ||||
| } | ||||
| @@ -3,12 +3,18 @@ using System.Linq; | ||||
|  | ||||
| namespace Spectre.Console.Internal | ||||
| { | ||||
|     internal static class AnsiBuilder | ||||
|     internal sealed class AnsiBuilder | ||||
|     { | ||||
|         public static string GetAnsi( | ||||
|             Capabilities capabilities, | ||||
|             string text, | ||||
|             Style style) | ||||
|         private readonly Capabilities _capabilities; | ||||
|         private readonly ILinkIdentityGenerator _linkHasher; | ||||
|  | ||||
|         public AnsiBuilder(Capabilities capabilities, ILinkIdentityGenerator? linkHasher) | ||||
|         { | ||||
|             _capabilities = capabilities ?? throw new ArgumentNullException(nameof(capabilities)); | ||||
|             _linkHasher = linkHasher ?? new LinkIdentityGenerator(); | ||||
|         } | ||||
|  | ||||
|         public string GetAnsi(string text, Style style) | ||||
|         { | ||||
|             if (style is null) | ||||
|             { | ||||
| @@ -22,7 +28,7 @@ namespace Spectre.Console.Internal | ||||
|             { | ||||
|                 codes = codes.Concat( | ||||
|                     AnsiColorBuilder.GetAnsiCodes( | ||||
|                         capabilities.ColorSystem, | ||||
|                         _capabilities.ColorSystem, | ||||
|                         style.Foreground, | ||||
|                         true)); | ||||
|             } | ||||
| @@ -32,7 +38,7 @@ namespace Spectre.Console.Internal | ||||
|             { | ||||
|                 codes = codes.Concat( | ||||
|                     AnsiColorBuilder.GetAnsiCodes( | ||||
|                         capabilities.ColorSystem, | ||||
|                         _capabilities.ColorSystem, | ||||
|                         style.Background, | ||||
|                         false)); | ||||
|             } | ||||
| @@ -48,7 +54,7 @@ namespace Spectre.Console.Internal | ||||
|                 ? $"\u001b[{ansiCodes}m{text}\u001b[0m" | ||||
|                 : text; | ||||
|  | ||||
|             if (style.Link != null && !capabilities.LegacyConsole) | ||||
|             if (style.Link != null && !_capabilities.LegacyConsole) | ||||
|             { | ||||
|                 var link = style.Link; | ||||
|  | ||||
| @@ -58,7 +64,7 @@ namespace Spectre.Console.Internal | ||||
|                     link = text; | ||||
|                 } | ||||
|  | ||||
|                 var linkId = Math.Abs(link.GetDeterministicHashCode()); | ||||
|                 var linkId = _linkHasher.GenerateId(link, text); | ||||
|                 ansi = $"\u001b]8;id={linkId};{link}\u001b\\{ansi}\u001b]8;;\u001b\\"; | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ using System.Runtime.InteropServices; | ||||
| 
 | ||||
| namespace Spectre.Console.Internal | ||||
| { | ||||
|     internal static class ConsoleBuilder | ||||
|     internal static class AnsiConsoleBuilder | ||||
|     { | ||||
|         public static IAnsiConsole Build(AnsiConsoleSettings settings) | ||||
|         { | ||||
| @@ -54,12 +54,18 @@ namespace Spectre.Console.Internal | ||||
|                 ? ColorSystemDetector.Detect(supportsAnsi) | ||||
|                 : (ColorSystem)settings.ColorSystem; | ||||
| 
 | ||||
|             // Get the capabilities | ||||
|             var capabilities = new Capabilities(supportsAnsi, colorSystem, legacyConsole); | ||||
| 
 | ||||
|             // Create the renderer | ||||
|             if (supportsAnsi) | ||||
|             { | ||||
|                 return new AnsiConsoleRenderer(buffer, colorSystem, legacyConsole); | ||||
|                 return new AnsiConsoleRenderer(buffer, capabilities, settings.LinkIdentityGenerator); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return new FallbackConsoleRenderer(buffer, capabilities); | ||||
|             } | ||||
| 
 | ||||
|             return new FallbackConsoleRenderer(buffer, colorSystem, legacyConsole); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -7,6 +7,7 @@ namespace Spectre.Console.Internal | ||||
|     internal sealed class AnsiConsoleRenderer : IAnsiConsole | ||||
|     { | ||||
|         private readonly TextWriter _out; | ||||
|         private readonly AnsiBuilder _ansiBuilder; | ||||
|  | ||||
|         public Capabilities Capabilities { get; } | ||||
|         public Encoding Encoding { get; } | ||||
| @@ -37,12 +38,14 @@ namespace Spectre.Console.Internal | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public AnsiConsoleRenderer(TextWriter @out, ColorSystem system, bool legacyConsole) | ||||
|         public AnsiConsoleRenderer(TextWriter @out, Capabilities capabilities, ILinkIdentityGenerator? linkHasher) | ||||
|         { | ||||
|             _out = @out ?? throw new ArgumentNullException(nameof(@out)); | ||||
|  | ||||
|             Capabilities = new Capabilities(true, system, legacyConsole); | ||||
|             Encoding = @out.IsStandardOut() ? System.Console.OutputEncoding : Encoding.UTF8; | ||||
|             Capabilities = capabilities ?? throw new ArgumentNullException(nameof(capabilities)); | ||||
|             Encoding = _out.IsStandardOut() ? System.Console.OutputEncoding : Encoding.UTF8; | ||||
|  | ||||
|             _ansiBuilder = new AnsiBuilder(Capabilities, linkHasher); | ||||
|         } | ||||
|  | ||||
|         public void Write(string text, Style style) | ||||
| @@ -59,7 +62,7 @@ namespace Spectre.Console.Internal | ||||
|             { | ||||
|                 if (!string.IsNullOrEmpty(part)) | ||||
|                 { | ||||
|                     _out.Write(AnsiBuilder.GetAnsi(Capabilities, part, style)); | ||||
|                     _out.Write(_ansiBuilder.GetAnsi(part, style)); | ||||
|                 } | ||||
|  | ||||
|                 if (!last) | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| using System; | ||||
| using System.IO; | ||||
| using System.Text; | ||||
|  | ||||
| @@ -38,10 +39,15 @@ namespace Spectre.Console.Internal | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public FallbackConsoleRenderer(TextWriter @out, ColorSystem system, bool legacyConsole) | ||||
|         public FallbackConsoleRenderer(TextWriter @out, Capabilities capabilities) | ||||
|         { | ||||
|             _out = @out; | ||||
|             _system = system; | ||||
|             if (capabilities == null) | ||||
|             { | ||||
|                 throw new ArgumentNullException(nameof(capabilities)); | ||||
|             } | ||||
|  | ||||
|             _out = @out ?? throw new ArgumentNullException(nameof(@out)); | ||||
|             _system = capabilities.ColorSystem; | ||||
|  | ||||
|             if (_out.IsStandardOut()) | ||||
|             { | ||||
| @@ -52,7 +58,7 @@ namespace Spectre.Console.Internal | ||||
|                 Encoding = Encoding.UTF8; | ||||
|             } | ||||
|  | ||||
|             Capabilities = new Capabilities(false, _system, legacyConsole); | ||||
|             Capabilities = capabilities; | ||||
|         } | ||||
|  | ||||
|         public void Write(string text, Style style) | ||||
|   | ||||
							
								
								
									
										31
									
								
								src/Spectre.Console/Internal/LinkIdentityGenerator.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/Spectre.Console/Internal/LinkIdentityGenerator.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| using System; | ||||
|  | ||||
| namespace Spectre.Console.Internal | ||||
| { | ||||
|     internal sealed class LinkIdentityGenerator : ILinkIdentityGenerator | ||||
|     { | ||||
|         private readonly Random _random; | ||||
|  | ||||
|         public LinkIdentityGenerator() | ||||
|         { | ||||
|             _random = new Random(DateTime.Now.Millisecond); | ||||
|         } | ||||
|  | ||||
|         public int GenerateId(string link, string text) | ||||
|         { | ||||
|             if (link is null) | ||||
|             { | ||||
|                 throw new ArgumentNullException(nameof(link)); | ||||
|             } | ||||
|  | ||||
|             link += text ?? string.Empty; | ||||
|  | ||||
|             unchecked | ||||
|             { | ||||
|                 return Math.Abs( | ||||
|                     link.GetHashCode() + | ||||
|                     _random.Next(0, int.MaxValue)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Patrik Svensson
					Patrik Svensson