diff --git a/src/Microsoft.AspNetCore.Mvc.Localization/LocalizedHtmlString.cs b/src/Microsoft.AspNetCore.Mvc.Localization/LocalizedHtmlString.cs index a16d52405a..f9c19bfb22 100644 --- a/src/Microsoft.AspNetCore.Mvc.Localization/LocalizedHtmlString.cs +++ b/src/Microsoft.AspNetCore.Mvc.Localization/LocalizedHtmlString.cs @@ -100,117 +100,8 @@ namespace Microsoft.AspNetCore.Mvc.Localization throw new ArgumentNullException(nameof(encoder)); } - FormatValue(writer, encoder, Value, _arguments); - } - - private static void FormatValue( - TextWriter writer, - HtmlEncoder encoder, - string resourceString, - object[] arguments) - { - var position = 0; - var length = resourceString.Length; - StringBuilder tokenBuffer = null; - var isToken = false; - - while (position < length) - { - var currentCharacter = resourceString[position]; - position++; - - if (currentCharacter == '}') - { - if (position < length && resourceString[position] == '}') - { - // Escaped curly brace: "}}". - AppendCurlyBrace(isToken, currentCharacter, tokenBuffer, writer); - position++; - } - else - { - // End of a token. - Append(isToken, '}', tokenBuffer, writer); - if (position == length) - { - break; - } - - AppendToOutput(tokenBuffer, arguments, writer, encoder); - - isToken = false; - tokenBuffer = null; - } - } - else if (currentCharacter == '{') - { - if (position < length && resourceString[position] == '{') - { - // Escaped curly brace: "{{". - AppendCurlyBrace(isToken, currentCharacter, tokenBuffer, writer); - position++; - } - else - { - // Start of a new token. - tokenBuffer = new StringBuilder(); - tokenBuffer.Append('{'); - isToken = true; - } - } - else - { - Append(isToken, currentCharacter, tokenBuffer, writer); - } - } - - AppendToOutput(tokenBuffer, arguments, writer, encoder); - } - - private static void Append( - bool isToken, - char value, - StringBuilder tokenBuffer, - TextWriter writer) - { - if (isToken) - { - tokenBuffer.Append(value); - } - else - { - writer.Write(value); - } - } - - private static void AppendCurlyBrace( - bool isToken, - char curlyBrace, - StringBuilder tokenBuffer, - TextWriter writer) - { - if (isToken) - { - tokenBuffer - .Append(curlyBrace) - .Append(curlyBrace); - } - else - { - writer.Write(curlyBrace); - } - } - - private static void AppendToOutput( - StringBuilder tokenBuffer, - object[] arguments, - TextWriter writer, - HtmlEncoder encoder) - { - if (tokenBuffer != null && tokenBuffer.Length > 0) - { - encoder.Encode(writer, string.Format(tokenBuffer.ToString(), arguments)); - } + var formattableString = new HtmlFormattableString(Value, _arguments); + formattableString.WriteTo(writer, encoder); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Mvc.Localization.Test/HtmlLocalizerTest.cs b/test/Microsoft.AspNetCore.Mvc.Localization.Test/HtmlLocalizerTest.cs index ff368777fb..af908bc111 100644 --- a/test/Microsoft.AspNetCore.Mvc.Localization.Test/HtmlLocalizerTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Localization.Test/HtmlLocalizerTest.cs @@ -76,10 +76,15 @@ namespace Microsoft.AspNetCore.Mvc.Localization.Test new object[] { 10, new DateTime(2015, 10, 10) }, "Bonjour {HtmlEncode[[x}]] Bienvenue {1:yyyy}" }; - yield return new object[] { + yield return new object[] { // padding happens after encoding "Bonjour {0,6} Bienvenue {{1:yyyy}}", new object[] { 10, new DateTime(2015, 10, 10) }, - "Bonjour HtmlEncode[[ 10]] Bienvenue {1:yyyy}" + "Bonjour HtmlEncode[[10]] Bienvenue {1:yyyy}" + }; + yield return new object[] { // padding happens after encoding + "Bonjour {0,20} Bienvenue {{1:yyyy}}", + new object[] { 10, new DateTime(2015, 10, 10) }, + "Bonjour HtmlEncode[[10]] Bienvenue {1:yyyy}" }; if (!TestPlatformHelper.IsMono) {