예제 #1
0
            // 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;
            }