void GetTag (out TagType tagtype, out string id, out TagAttributes attributes)
{
int token = tokenizer.get_token ();
tagtype = TagType.ServerComment;
id = null;
attributes = null;
switch (token){
case '%':
GetServerTag (out tagtype, out id, out attributes);
break;
case '/':
if (!Eat (Token.IDENTIFIER))
OnError ("expecting TAGNAME");
id = tokenizer.Value;
if (!Eat ('>'))
OnError ("expecting '>'. Got '" + id + "'");
tagtype = TagType.Close;
break;
case '!':
bool double_dash = Eat (Token.DOUBLEDASH);
if (double_dash)
tokenizer.put_back ();
tokenizer.Verbatim = true;
string end = double_dash ? "-->" : ">";
string comment = GetVerbatim (tokenizer.get_token (), end);
tokenizer.Verbatim = false;
if (comment == null)
OnError ("Unfinished HTML comment/DTD");
string pathType, filename;
if (double_dash && GetInclude (comment, out pathType, out filename)) {
tagtype = TagType.Include;
attributes = new TagAttributes ();
attributes.Add (pathType, filename);
} else {
tagtype = TagType.Text;
id = "<!" + comment + end;
}
break;
case Token.IDENTIFIER:
if (this.filename == "@@inner_string@@") {
// Actually not tag but "xxx < yyy" stuff in inner_string!
tagtype = TagType.Text;
tokenizer.InTag = false;
id = "<" + tokenizer.Odds + tokenizer.Value;
} else {
id = tokenizer.Value;
try {
attributes = GetAttributes ();
} catch (Exception e) {
OnError (e.Message);
break;
}
tagtype = TagType.Tag;
if (Eat ('/') && Eat ('>')) {
tagtype = TagType.SelfClosing;
} else if (!Eat ('>')) {
if (attributes.IsRunAtServer ()) {
OnError ("The server tag is not well formed.");
break;
}
tokenizer.Verbatim = true;
attributes.Add (String.Empty, GetVerbatim (tokenizer.get_token (), ">") + ">");
tokenizer.Verbatim = false;
}
}
break;
default:
string idvalue = null;
// This is to handle code like:
//
// <asp:ListItem runat="server"> < </asp:ListItem>
//
if ((char)token == '<') {
string odds = tokenizer.Odds;
if (odds != null && odds.Length > 0 && Char.IsWhiteSpace (odds [0])) {
tokenizer.put_back ();
idvalue = odds;
} else
idvalue = tokenizer.Value;
} else
idvalue = tokenizer.Value;
tagtype = TagType.Text;
tokenizer.InTag = false;
id = "<" + idvalue;
break;
}
}