int NextToken()
{
int c;
sb.Length = 0;
odds.Length = 0;
while ((c = read_char()) != -1)
{
if (verbatim)
{
inTag = false;
sb.Append((char)c);
return(c);
}
if (inTag && expectAttrValue && (c == '"' || c == '\''))
{
return(ReadAttValue(c));
}
if (c == '<')
{
inTag = true;
sb.Append((char)c);
return(c);
}
if (c == '>')
{
inTag = false;
sb.Append((char)c);
return(c);
}
if (current_token == '<' && "%/!".IndexOf((char)c) != -1)
{
sb.Append((char)c);
return(c);
}
if (inTag && current_token == '%' && "@#=".IndexOf((char)c) != -1)
{
sb.Append((char)c);
return(c);
}
if (inTag && c == '-' && sr.Peek() == '-')
{
sb.Append("--");
read_char();
return(Token.DOUBLEDASH);
}
if (!inTag)
{
sb.Append((char)c);
while ((c = sr.Peek()) != -1 && c != '<')
{
sb.Append((char)read_char());
}
return((c != -1 || sb.Length > 0) ? Token.TEXT : Token.EOF);
}
if (inTag && current_token == '=' && !Char.IsWhiteSpace((char)c))
{
return(ReadAttValue(c));
}
if (inTag && is_identifier_start_character((char)c))
{
sb.Append((char)c);
while ((c = sr.Peek()) != -1)
{
if (!is_identifier_part_character((char)c) && c != ':')
{
break;
}
sb.Append((char)read_char());
}
if (current_token == '@' && Directive.IsDirective(sb.ToString()))
{
return(Token.DIRECTIVE);
}
return(Token.IDENTIFIER);
}
if (!Char.IsWhiteSpace((char)c))
{
sb.Append((char)c);
return(c);
}
// keep otherwise discarded characters in case we need.
odds.Append((char)c);
}
return(Token.EOF);
}