HtmlToken ReadBeforeAttributeValue ()
{
do {
int nc = Read ();
char c;
if (nc == -1) {
TokenizerState = HtmlTokenizerState.EndOfFile;
tag = null;
return EmitDataToken (false);
}
c = (char) nc;
// Note: we save the data in case we hit a parse error and have to emit a data token
data.Append (c);
switch (c) {
case '\t': case '\r': case '\n': case '\f': case ' ':
break;
case '"': case '\'':
TokenizerState = HtmlTokenizerState.AttributeValueQuoted;
quote = c;
return null;
case '&':
TokenizerState = HtmlTokenizerState.AttributeValueUnquoted;
return null;
case '/':
TokenizerState = HtmlTokenizerState.SelfClosingStartTag;
return null;
case '>':
return EmitTagToken ();
case '<': case '=': case '`':
// parse error
goto default;
default:
TokenizerState = HtmlTokenizerState.AttributeValueUnquoted;
name.Append (c == '\0' ? '\uFFFD' : c);
return null;
}
} while (true);
}