コード例 #1
0
ファイル: HtmlTreeBuilderState.cs プロジェクト: bkzhn/dcsoup
 private bool ExitTableBody(Token t, HtmlTreeBuilder tb)
 {
     if (!(tb.InTableScope("tbody") || tb.InTableScope("thead") || tb.InScope("tfoot")
         ))
     {
         // frag case
         tb.Error(this);
         return false;
     }
     tb.ClearStackToTableBodyContext();
     tb.Process(new Token.EndTag(tb.CurrentElement().NodeName));
     // tbody, tfoot, thead
     return tb.Process(t);
 }
コード例 #2
0
ファイル: HtmlTreeBuilderState.cs プロジェクト: bkzhn/dcsoup
            internal override bool Process(Token t, HtmlTreeBuilder tb)
            {
                switch (t.type)
                {
                    case TokenType.StartTag:
                    {
                        Token.StartTag startTag = t.AsStartTag();
                        string name = startTag.Name();
                        if (name.Equals("tr"))
                        {
                            tb.ClearStackToTableBodyContext();
                            tb.Insert(startTag);
                            tb.Transition(HtmlTreeBuilderState.InRow);
                        }
                        else if (StringUtil.In(name, "th", "td"))
                        {
                            tb.Error(this);
                            tb.Process(new Token.StartTag("tr"));
                            return tb.Process(startTag);
                        }
                        else if (StringUtil.In(name, "caption", "col", "colgroup", "tbody", "tfoot", "thead"))
                        {
                            return this.ExitTableBody(t, tb);
                        }
                        else
                        {
                            return this.AnythingElse(t, tb);
                        }
                        break;
                    }

                    case TokenType.EndTag:
                    {
                        Token.EndTag endTag = t.AsEndTag();
                        string name = endTag.Name();
                        if (StringUtil.In(name, "tbody", "tfoot", "thead"))
                        {
                            if (!tb.InTableScope(name))
                            {
                                tb.Error(this);
                                return false;
                            }
                            else
                            {
                                tb.ClearStackToTableBodyContext();
                                tb.Pop();
                                tb.Transition(HtmlTreeBuilderState.InTable);
                            }
                        }
                        else
                        {
                            if (name.Equals("table"))
                            {
                                return this.ExitTableBody(t, tb);
                            }
                            else if (StringUtil.In(name, "body", "caption", "col", "colgroup", "html", "td", "th", "tr"))
                            {
                                tb.Error(this);
                                return false;
                            }
                            else
                            {
                                return this.AnythingElse(t, tb);
                            }
                        }
                        break;
                    }

                    default:
                    {
                        return this.AnythingElse(t, tb);
                    }
                }
                return true;
            }