HtmlToken ReadCharacterReferenceInAttributeValue ()
{
char additionalAllowedCharacter = quote == '\0' ? '>' : quote;
int nc = Peek ();
bool consume;
char c;
if (nc == -1) {
TokenizerState = HtmlTokenizerState.EndOfFile;
data.Append ('&');
name.Length = 0;
return EmitDataToken (false);
}
c = (char) nc;
switch (c) {
case '\t': case '\r': case '\n': case '\f': case ' ': case '<': case '&':
// no character is consumed, emit '&'
data.Append ('&');
name.Append ('&');
consume = false;
break;
default:
if (c == additionalAllowedCharacter) {
// this is not a character reference, nothing is consumed
data.Append ('&');
name.Append ('&');
consume = false;
break;
}
entity.Push ('&');
while (entity.Push (c)) {
Read ();
if ((nc = Peek ()) == -1) {
TokenizerState = HtmlTokenizerState.EndOfFile;
data.Append (entity.GetPushedInput ());
entity.Reset ();
return EmitDataToken (false);
}
c = (char) nc;
}
var pushed = entity.GetPushedInput ();
string value;
if (c == '=' || IsAlphaNumeric (c))
value = pushed;
else
value = entity.GetValue ();
data.Append (pushed);
name.Append (value);
consume = c == ';';
entity.Reset ();
break;
}
if (quote == '\0')
TokenizerState = HtmlTokenizerState.AttributeValueUnquoted;
else
TokenizerState = HtmlTokenizerState.AttributeValueQuoted;
if (consume)
Read ();
return null;
}