HtmlToken ReadMarkupDeclarationOpen ()
{
int count = 0, nc;
char c = '\0';
while (count < 2) {
if ((nc = Peek ()) == -1) {
TokenizerState = HtmlTokenizerState.EndOfFile;
return EmitDataToken (false);
}
if ((c = (char) nc) != '-')
break;
// Note: we save the data in case we hit a parse error and have to emit a data token
data.Append (c);
Read ();
count++;
}
if (count == 2) {
TokenizerState = HtmlTokenizerState.CommentStart;
name.Length = 0;
return null;
}
if (count == 1) {
// parse error
TokenizerState = HtmlTokenizerState.BogusComment;
return null;
}
if (c == 'D' || c == 'd') {
// Note: we save the data in case we hit a parse error and have to emit a data token
data.Append (c);
name.Append (c);
count = 1;
Read ();
while (count < 7) {
if ((nc = Read ()) == -1) {
TokenizerState = HtmlTokenizerState.EndOfFile;
return EmitDataToken (false);
}
if (ToLower ((c = (char) nc)) != DocType[count])
break;
// Note: we save the data in case we hit a parse error and have to emit a data token
data.Append (c);
name.Append (c);
count++;
}
if (count == 7) {
doctype = CreateDocTypeToken (name.ToString ());
TokenizerState = HtmlTokenizerState.DocType;
name.Length = 0;
return null;
}
name.Length = 0;
} else if (c == '[') {
// Note: we save the data in case we hit a parse error and have to emit a data token
data.Append (c);
count = 1;
Read ();
while (count < 7) {
if ((nc = Read ()) == -1) {
TokenizerState = HtmlTokenizerState.EndOfFile;
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);
if (c != CData[count])
break;
count++;
}
if (count == 7) {
TokenizerState = HtmlTokenizerState.CDataSection;
data.Length = 0;
return null;
}
}
// parse error
TokenizerState = HtmlTokenizerState.BogusComment;
return null;
}