in impl/src/main/java/org/apache/myfaces/renderkit/html/util/HTMLEncoder.java [248:349]
public static void encode(Writer writer, String string,
boolean encodeNewline,
boolean encodeSubsequentBlanksToNbsp,
boolean encodeNonLatin) throws IOException
{
if (string == null)
{
return;
}
int start = 0;
String app;
char c = ' ';
char prevC;
int length = string.length();
for (int i = 0; i < length; ++i)
{
app = null;
prevC = c;
c = string.charAt(i);
// All characters before letters
if ((int)c < 0x41)
{
switch (c)
{
case '"': app = """; break; //"
case '&': app = "&"; break; //&
case '<': app = "<"; break; //<
case '>': app = ">"; break; //>
case ' ':
if (encodeSubsequentBlanksToNbsp &&
prevC == ' ')
{
//Space at beginning or after another space
app = " ";
}
break;
case '\n':
if (encodeNewline)
{
app = "<br/>";
}
break;
default:
break;
}
// http://www.w3.org/MarkUp/html3/specialchars.html
// From C0 extension U+0000-U+001F only U+0009, U+000A and
// U+000D are valid control characters
if (c <= 0x1F && c != 0x09 && c != 0x0A && c != 0x0D)
{
// Ignore escape character
app = "";
}
}
else if (encodeNonLatin && (int)c > 0x80)
{
switch(c)
{
//german umlauts
case '\u00E4' : app = "ä"; break;
case '\u00C4' : app = "Ä"; break;
case '\u00F6' : app = "ö"; break;
case '\u00D6' : app = "Ö"; break;
case '\u00FC' : app = "ü"; break;
case '\u00DC' : app = "Ü"; break;
case '\u00DF' : app = "ß"; break;
//misc
//case 0x80: app = "€"; break; sometimes euro symbol is ascii 128, should we support it?
case '\u20AC': app = "€"; break;
case '\u00AB': app = "«"; break;
case '\u00BB': app = "»"; break;
case '\u00A0': app = " "; break;
default :
//encode all non basic latin characters
app = "&#" + ((int)c) + ';';
break;
}
}
if (app != null)
{
if (start < i)
{
writer.write(string, start, i-start);
}
start = i+1;
writer.write(app);
}
}
if (start == 0)
{
writer.write(string);
}
else if (start < length)
{
writer.write(string,start,length-start);
}
}