Fix for #3659 - handle IHtmlContent in localization

This change corrects handling of IHtmlContent instances in
LocalizedHtmlString by making using of FormattableHtmlString.
This commit is contained in:
Ryan Nowak 2016-04-07 15:11:21 -07:00
parent 2bf79a874d
commit a55544681d
2 changed files with 9 additions and 113 deletions

View File

@ -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);
}
}
}

View File

@ -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)
{