void WriteEscapedBuffer (char [] text, int index, int length,
bool isAttribute)
{
int start = index;
int end = index + length;
for (int i = start; i < end; i++) {
switch (text [i]) {
default:
continue;
case '&':
case '<':
case '>':
if (start < i)
WriteCheckedBuffer (text, start, i - start);
writer.Write ('&');
switch (text [i]) {
case '&': writer.Write ("amp;"); break;
case '<': writer.Write ("lt;"); break;
case '>': writer.Write ("gt;"); break;
case '\'': writer.Write ("apos;"); break;
case '"': writer.Write ("quot;"); break;
}
break;
case '"':
case '\'':
if (isAttribute && text [i] == quote_char)
goto case '&';
continue;
case '\r':
if (i + 1 < end && text [i] == '\n')
i++; // CRLF
goto case '\n';
case '\n':
if (start < i)
WriteCheckedBuffer (text, start, i - start);
if (isAttribute) {
writer.Write (text [i] == '\r' ?
"
" : "
");
break;
}
switch (newline_handling) {
case NewLineHandling.Entitize:
writer.Write (text [i] == '\r' ?
"
" : "
");
break;
case NewLineHandling.Replace:
writer.Write (newline);
break;
default:
writer.Write (text [i]);
break;
}
break;
}
start = i + 1;
}
if (start < end)
WriteCheckedBuffer (text, start, end - start);
}