mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-10-31 17:15:28 +08:00 
			
		
		
		
	Fix line break regression
In commit d1d94cd, we accidentally introduced a regression
since conhost requires all line breaks to be `\r\n`.
			
			
This commit is contained in:
		 Patrik Svensson
					Patrik Svensson
				
			
				
					committed by
					
						 Phil Scott
						Phil Scott
					
				
			
			
				
	
			
			
			 Phil Scott
						Phil Scott
					
				
			
						parent
						
							1dfc6bdadc
						
					
				
				
					commit
					6549436356
				
			| @@ -1,5 +1,4 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| namespace Spectre.Console.Testing | ||||
| { | ||||
| @@ -21,7 +20,7 @@ namespace Spectre.Console.Testing | ||||
|             } | ||||
|  | ||||
|             var result = new List<string>(); | ||||
|             foreach (var line in value.Split(new[] { '\n' })) | ||||
|             foreach (var line in value.NormalizeLineEndings().Split(new[] { '\n' })) | ||||
|             { | ||||
|                 result.Add(line.TrimEnd()); | ||||
|             } | ||||
|   | ||||
| @@ -1,43 +0,0 @@ | ||||
| [ | ||||
|   [ | ||||
|     { | ||||
|       Text: Foo, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       Text: Bar, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   [ | ||||
|     { | ||||
|       Text: Baz, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       Text: Qux, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   [ | ||||
|     { | ||||
|       Text: Corgi, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| ] | ||||
| @@ -1,45 +0,0 @@ | ||||
| [ | ||||
|   [ | ||||
|     { | ||||
|       Text: Foo, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   [ | ||||
|     { | ||||
|       Text: Bar, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   [ | ||||
|     { | ||||
|       Text: Baz, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       Text: Qux, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   [ | ||||
|     { | ||||
|       Text: Corgi, | ||||
|       Style: { | ||||
|         Foreground: {}, | ||||
|         Background: {} | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| ] | ||||
| @@ -55,8 +55,7 @@ namespace Spectre.Console.Tests.Unit | ||||
|         public sealed class TheSplitLinesMethod | ||||
|         { | ||||
|             [Fact] | ||||
|             [Expectation("Segment", "Split")] | ||||
|             public Task Should_Split_Segment() | ||||
|             public void Should_Split_Segment() | ||||
|             { | ||||
|                 // Given, When | ||||
|                 var lines = Segment.SplitLines( | ||||
| @@ -84,12 +83,41 @@ namespace Spectre.Console.Tests.Unit | ||||
|  | ||||
|                 lines[2].Count.ShouldBe(1); | ||||
|                 lines[2][0].Text.ShouldBe("Corgi"); | ||||
|                 return Verifier.Verify(lines); | ||||
|             } | ||||
|  | ||||
|             [Fact] | ||||
|             [Expectation("Segment", "Split_Linebreak")] | ||||
|             public Task Should_Split_Segments_With_Linebreak_In_Text() | ||||
|             public void Should_Split_Segment_With_Windows_LineBreak() | ||||
|             { | ||||
|                 // Given, When | ||||
|                 var lines = Segment.SplitLines( | ||||
|                     new[] | ||||
|                     { | ||||
|                         new Segment("Foo"), | ||||
|                         new Segment("Bar"), | ||||
|                         new Segment("\r\n"), | ||||
|                         new Segment("Baz"), | ||||
|                         new Segment("Qux"), | ||||
|                         new Segment("\r\n"), | ||||
|                         new Segment("Corgi"), | ||||
|                     }); | ||||
|  | ||||
|                 // Then | ||||
|                 lines.Count.ShouldBe(3); | ||||
|  | ||||
|                 lines[0].Count.ShouldBe(2); | ||||
|                 lines[0][0].Text.ShouldBe("Foo"); | ||||
|                 lines[0][1].Text.ShouldBe("Bar"); | ||||
|  | ||||
|                 lines[1].Count.ShouldBe(2); | ||||
|                 lines[1][0].Text.ShouldBe("Baz"); | ||||
|                 lines[1][1].Text.ShouldBe("Qux"); | ||||
|  | ||||
|                 lines[2].Count.ShouldBe(1); | ||||
|                 lines[2][0].Text.ShouldBe("Corgi"); | ||||
|             } | ||||
|  | ||||
|             [Fact] | ||||
|             public void Should_Split_Segments_With_Linebreak_In_Text() | ||||
|             { | ||||
|                 // Given, Given | ||||
|                 var lines = Segment.SplitLines( | ||||
| @@ -103,7 +131,20 @@ namespace Spectre.Console.Tests.Unit | ||||
|                     }); | ||||
|  | ||||
|                 // Then | ||||
|                 return Verifier.Verify(lines); | ||||
|                 lines.Count.ShouldBe(4); | ||||
|  | ||||
|                 lines[0].Count.ShouldBe(1); | ||||
|                 lines[0][0].Text.ShouldBe("Foo"); | ||||
|  | ||||
|                 lines[1].Count.ShouldBe(1); | ||||
|                 lines[1][0].Text.ShouldBe("Bar"); | ||||
|  | ||||
|                 lines[2].Count.ShouldBe(2); | ||||
|                 lines[2][0].Text.ShouldBe("Baz"); | ||||
|                 lines[2][1].Text.ShouldBe("Qux"); | ||||
|  | ||||
|                 lines[3].Count.ShouldBe(1); | ||||
|                 lines[3][0].Text.ShouldBe("Corgi"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -71,7 +71,7 @@ namespace Spectre.Console.Cli | ||||
|         { | ||||
|             for (var i = 0; i < count; i++) | ||||
|             { | ||||
|                 _content.Append('\n'); | ||||
|                 _content.Append(Environment.NewLine); | ||||
|             } | ||||
|  | ||||
|             return this; | ||||
|   | ||||
| @@ -230,9 +230,9 @@ namespace Spectre.Console.Cli | ||||
|  | ||||
|             var result = new List<IRenderable> | ||||
|             { | ||||
|                 new Markup("\n"), | ||||
|                 new Markup(Environment.NewLine), | ||||
|                 new Markup("[yellow]ARGUMENTS:[/]"), | ||||
|                 new Markup("\n"), | ||||
|                 new Markup(Environment.NewLine), | ||||
|             }; | ||||
|  | ||||
|             var grid = new Grid(); | ||||
| @@ -269,9 +269,9 @@ namespace Spectre.Console.Cli | ||||
|  | ||||
|             var result = new List<IRenderable> | ||||
|             { | ||||
|                 new Markup("\n"), | ||||
|                 new Markup(Environment.NewLine), | ||||
|                 new Markup("[yellow]OPTIONS:[/]"), | ||||
|                 new Markup("\n"), | ||||
|                 new Markup(Environment.NewLine), | ||||
|             }; | ||||
|  | ||||
|             var grid = new Grid(); | ||||
| @@ -346,9 +346,9 @@ namespace Spectre.Console.Cli | ||||
|  | ||||
|             var result = new List<IRenderable> | ||||
|             { | ||||
|                 new Markup("\n"), | ||||
|                 new Markup(Environment.NewLine), | ||||
|                 new Markup("[yellow]COMMANDS:[/]"), | ||||
|                 new Markup("\n"), | ||||
|                 new Markup(Environment.NewLine), | ||||
|             }; | ||||
|  | ||||
|             var grid = new Grid(); | ||||
|   | ||||
| @@ -59,7 +59,7 @@ namespace Spectre.Console | ||||
|         /// <param name="value">The value to write.</param> | ||||
|         public static void MarkupLine(this IAnsiConsole console, string value) | ||||
|         { | ||||
|             Markup(console, value + "\n"); | ||||
|             Markup(console, value + Environment.NewLine); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
| @@ -71,7 +71,7 @@ namespace Spectre.Console | ||||
|         /// <param name="args">An array of objects to write.</param> | ||||
|         public static void MarkupLine(this IAnsiConsole console, IFormatProvider provider, string format, params object[] args) | ||||
|         { | ||||
|             Markup(console, provider, format + "\n", args); | ||||
|             Markup(console, provider, format + Environment.NewLine, args); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -73,7 +73,7 @@ namespace Spectre.Console | ||||
|                 throw new ArgumentNullException(nameof(console)); | ||||
|             } | ||||
|  | ||||
|             console.Write(new Text("\n", Style.Plain)); | ||||
|             console.Write(new Text(Environment.NewLine, Style.Plain)); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
| @@ -104,7 +104,7 @@ namespace Spectre.Console | ||||
|                 throw new ArgumentNullException(nameof(text)); | ||||
|             } | ||||
|  | ||||
|             console.Write(text + "\n", style); | ||||
|             console.Write(text + Environment.NewLine, style); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -11,6 +11,11 @@ namespace Spectre.Console | ||||
|     /// </summary> | ||||
|     public static class StringExtensions | ||||
|     { | ||||
|         // Cache whether or not internally normalized line endings | ||||
|         // already are normalized. No reason to do yet another replace if it is. | ||||
|         private static readonly bool _alreadyNormalized | ||||
|             = Environment.NewLine.Equals("\n", StringComparison.OrdinalIgnoreCase); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Escapes text so that it won’t be interpreted as markup. | ||||
|         /// </summary> | ||||
| @@ -86,6 +91,12 @@ namespace Spectre.Console | ||||
|         { | ||||
|             text = text?.ReplaceExact("\r\n", "\n"); | ||||
|             text ??= string.Empty; | ||||
|  | ||||
|             if (native && !_alreadyNormalized) | ||||
|             { | ||||
|                 text = text.ReplaceExact("\n", Environment.NewLine); | ||||
|             } | ||||
|  | ||||
|             return text; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -36,7 +36,7 @@ namespace Spectre.Console | ||||
|  | ||||
|                     if (!last) | ||||
|                     { | ||||
|                         builder.Append('\n'); | ||||
|                         builder.Append(Environment.NewLine); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -44,7 +44,7 @@ namespace Spectre.Console.Rendering | ||||
|         /// <summary> | ||||
|         /// Gets a segment representing a line break. | ||||
|         /// </summary> | ||||
|         public static Segment LineBreak { get; } = new Segment("\n", Style.Plain, true, false); | ||||
|         public static Segment LineBreak { get; } = new Segment(Environment.NewLine, Style.Plain, true, false); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets an empty segment. | ||||
|   | ||||
| @@ -29,7 +29,7 @@ namespace Spectre.Console | ||||
|                     if (_lastStatus != task.Description) | ||||
|                     { | ||||
|                         _lastStatus = task.Description; | ||||
|                         _renderable = new Markup(task.Description + "\n"); | ||||
|                         _renderable = new Markup(task.Description + Environment.NewLine); | ||||
|                         return; | ||||
|                     } | ||||
|                 } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user