diff --git a/src/Spectre.Console.Tests/Unit/MarkupTests.cs b/src/Spectre.Console.Tests/Unit/MarkupTests.cs index 51ff09b..72f6c51 100644 --- a/src/Spectre.Console.Tests/Unit/MarkupTests.cs +++ b/src/Spectre.Console.Tests/Unit/MarkupTests.cs @@ -6,6 +6,24 @@ namespace Spectre.Console.Tests.Unit { public sealed class MarkupTests { + public sealed class TheEscapeMethod + { + [Theory] + [InlineData("Hello World", "Hello World")] + [InlineData("Hello World [", "Hello World [[")] + [InlineData("Hello World ]", "Hello World ]]")] + [InlineData("Hello [World]", "Hello [[World]]")] + [InlineData("Hello [[World]]", "Hello [[[[World]]]]")] + public void Should_Escape_Markup_As_Expected(string input, string expected) + { + // Given, When + var result = Markup.Escape(input); + + // Then + result.ShouldBe(expected); + } + } + [Theory] [InlineData("Hello [[ World ]")] [InlineData("Hello [[ World ] !")] diff --git a/src/Spectre.Console/Extensions/StringExtensions.cs b/src/Spectre.Console/Extensions/StringExtensions.cs index 50e6efa..e1fe689 100644 --- a/src/Spectre.Console/Extensions/StringExtensions.cs +++ b/src/Spectre.Console/Extensions/StringExtensions.cs @@ -1,3 +1,5 @@ +using System; + namespace Spectre.Console { /// @@ -6,12 +8,11 @@ namespace Spectre.Console public static class StringExtensions { /// - /// Converts the string to something that is safe to - /// use in a markup string. + /// Escapes text so that it won’t be interpreted as markup. /// - /// The text to convert. - /// A string that is safe to use in a markup string. - public static string SafeMarkup(this string text) + /// The text to escape. + /// A string that is safe to use in markup. + public static string EscapeMarkup(this string text) { if (text == null) { @@ -22,5 +23,16 @@ namespace Spectre.Console .Replace("[", "[[") .Replace("]", "]]"); } + + /// + /// Escapes text so that it won’t be interpreted as markup. + /// + /// The text to escape. + /// A string that is safe to use in markup. + [Obsolete("Use EscapeMarkup extension instead.", false)] + public static string SafeMarkup(this string text) + { + return EscapeMarkup(text); + } } } diff --git a/src/Spectre.Console/Internal/ExceptionFormatter.cs b/src/Spectre.Console/Internal/ExceptionFormatter.cs index 8e3ecde..2f5c67a 100644 --- a/src/Spectre.Console/Internal/ExceptionFormatter.cs +++ b/src/Spectre.Console/Internal/ExceptionFormatter.cs @@ -42,7 +42,7 @@ namespace Spectre.Console { var shortenTypes = (settings.Format & ExceptionFormats.ShortenTypes) != 0; var type = Emphasize(ex.Type, new[] { '.' }, settings.Style.Exception, shortenTypes, settings); - var message = $"[{settings.Style.Message.ToMarkup()}]{ex.Message.SafeMarkup()}[/]"; + var message = $"[{settings.Style.Message.ToMarkup()}]{ex.Message.EscapeMarkup()}[/]"; return new Markup(string.Concat(type, ": ", message)); } @@ -99,7 +99,7 @@ namespace Spectre.Console { var typeColor = settings.Style.ParameterType.ToMarkup(); var nameColor = settings.Style.ParameterName.ToMarkup(); - var parameters = frame.Parameters.Select(x => $"[{typeColor}]{x.Type.SafeMarkup()}[/] [{nameColor}]{x.Name}[/]"); + var parameters = frame.Parameters.Select(x => $"[{typeColor}]{x.Type.EscapeMarkup()}[/] [{nameColor}]{x.Name}[/]"); builder.Append(string.Join(", ", parameters)); } diff --git a/src/Spectre.Console/Widgets/Calendar.cs b/src/Spectre.Console/Widgets/Calendar.cs index 9750aac..13bcd76 100644 --- a/src/Spectre.Console/Widgets/Calendar.cs +++ b/src/Spectre.Console/Widgets/Calendar.cs @@ -199,7 +199,7 @@ namespace Spectre.Console if (ShowHeader) { - var heading = new DateTime(Year, Month, Day).ToString("Y", culture).SafeMarkup(); + var heading = new DateTime(Year, Month, Day).ToString("Y", culture).EscapeMarkup(); table.Heading = new Title(heading, HeaderStyle); } diff --git a/src/Spectre.Console/Widgets/Markup.cs b/src/Spectre.Console/Widgets/Markup.cs index c798016..836812e 100644 --- a/src/Spectre.Console/Widgets/Markup.cs +++ b/src/Spectre.Console/Widgets/Markup.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using Spectre.Console.Internal; using Spectre.Console.Rendering; @@ -46,5 +47,20 @@ namespace Spectre.Console { return ((IRenderable)_paragraph).Render(context, maxWidth); } + + /// + /// Escapes text so that it won’t be interpreted as markup. + /// + /// The text to escape. + /// A string that is safe to use in markup. + public static string Escape(string text) + { + if (text is null) + { + throw new ArgumentNullException(nameof(text)); + } + + return text.EscapeMarkup(); + } } }