// only here if th or td in scope internal override bool Process(Token t, HtmlTreeBuilder tb) { switch (t.type) { case TokenType.Character: { Token.Character c = t.AsCharacter(); if (c.GetData().Equals(HtmlTreeBuilderState.nullString)) { tb.Error(this); return false; } else { tb.Insert(c); } break; } case TokenType.Comment: { tb.Insert(t.AsComment()); break; } case TokenType.Doctype: { tb.Error(this); return false; } case TokenType.StartTag: { Token.StartTag start = t.AsStartTag(); string name = start.Name(); if (name.Equals("html")) { return tb.Process(start, HtmlTreeBuilderState.InBody); } else if (name.Equals("option")) { tb.Process(new Token.EndTag("option")); tb.Insert(start); } else if (name.Equals("optgroup")) { if (tb.CurrentElement().NodeName.Equals("option")) { tb.Process(new Token.EndTag("option")); } else if (tb.CurrentElement().NodeName.Equals("optgroup")) { tb.Process(new Token.EndTag("optgroup")); } tb.Insert(start); } else if (name.Equals("select")) { tb.Error(this); return tb.Process(new Token.EndTag("select")); } else if (StringUtil.In(name, "input", "keygen", "textarea")) { tb.Error(this); if (!tb.InSelectScope("select")) { return false; } // frag tb.Process(new Token.EndTag("select")); return tb.Process(start); } else if (name.Equals("script")) { return tb.Process(t, HtmlTreeBuilderState.InHead); } else { return this.AnythingElse(t, tb); } break; } case TokenType.EndTag: { Token.EndTag end = t.AsEndTag(); string name = end.Name(); if (name.Equals("optgroup")) { if (tb.CurrentElement().NodeName.Equals("option") && tb.AboveOnStack(tb.CurrentElement()) != null && tb.AboveOnStack(tb.CurrentElement()).NodeName.Equals("optgroup")) { tb.Process(new Token.EndTag("option")); } if (tb.CurrentElement().NodeName.Equals("optgroup")) { tb.Pop(); } else { tb.Error(this); } } else if (name.Equals("option")) { if (tb.CurrentElement().NodeName.Equals("option")) { tb.Pop(); } else { tb.Error(this); } } else if (name.Equals("select")) { if (!tb.InSelectScope(name)) { tb.Error(this); return false; } else { tb.PopStackToClose(name); tb.ResetInsertionMode(); } } else { return this.AnythingElse(t, tb); } break; } case TokenType.EOF: { if (!tb.CurrentElement().NodeName.Equals("html")) { tb.Error(this); } break; } default: { return this.AnythingElse(t, tb); } } return true; }