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:
parent
2bf79a874d
commit
a55544681d
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue