コード例 #1
0
 private static void HandleRawtext(Token.StartTag startTag, HtmlTreeBuilder tb)
 {
     tb.Insert(startTag);
     tb.tokeniser.Transition(TokeniserState.Rawtext);
     tb.MarkInsertionMode();
     tb.Transition(Text);
 }
コード例 #2
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (t.IsComment)
                {
                    tb.Insert(t.AsComment());
                }
                else if (t.IsDoctype || IsWhitespace(t) ||
                         (t.IsStartTag && t.AsStartTag().Name.Equals("html")))
                {
                    return(tb.Process(t, InBody));
                }
                else if (t.IsEOF)
                {
                    // nice work chuck
                }
                else if (t.IsStartTag && t.AsStartTag().Name.Equals("noframes"))
                {
                    return(tb.Process(t, InHead));
                }
                else
                {
                    tb.Error(this);
                    return(false);
                }

                return(true);
            }
コード例 #3
0
            bool AnyOtherEndTag(Token t, HtmlTreeBuilder tb)
            {
                string name = t.AsEndTag().Name;
                DescendableLinkedList <DomContainer> stack = tb.Stack;
                var it = stack.GetDescendingEnumerator();

                while (it.MoveNext())
                {
                    var node = it.Current;
                    if (node.NodeName.Equals(name))
                    {
                        tb.GenerateImpliedEndTags(name);
                        if (!name.Equals(tb.CurrentElement.NodeName))
                        {
                            tb.Error(this);
                        }
                        tb.PopStackToClose(name);
                        break;
                    }
                    else
                    {
                        if (tb.IsSpecial(node))
                        {
                            tb.Error(this);
                            return(false);
                        }
                    }
                }

                return(true);
            }
コード例 #4
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                switch (t.Type)
                {
                case TokenType.Character:

                    Token.Character c = t.AsCharacter();
                    if (c.Data.Equals(NullString))
                    {
                        // TODO: confirm that check
                        tb.Error(this);
                        return(false);
                    }
                    else if (IsWhitespace(c))
                    {
                        tb.ReconstructFormattingElements();
                        tb.Insert(c);
                    }
                    else
                    {
                        tb.ReconstructFormattingElements();
                        tb.Insert(c);
                        tb.FramesetOK = false;
                    }
                    break;

                case TokenType.Comment:
                    tb.Insert(t.AsComment());
                    break;

                case TokenType.Doctype:
                    tb.Error(this);
                    return(false);

                case TokenType.StartTag:
                    bool?result = HandleStartTag(t, tb);
                    if (result.HasValue)
                    {
                        return(result.Value);
                    }

                    break;

                case TokenType.EndTag:
                    result = HandleEndTag(t, tb);
                    if (result.HasValue)
                    {
                        return(result.Value);
                    }

                    break;

                case TokenType.EOF:
                    // TODO: error if stack contains something not dd, dt, li, p, tbody, td, tfoot, th, thead, tr, body, html
                    // stop parsing
                    break;
                }

                return(true);
            }
コード例 #5
0
 public override bool Process(Token t, HtmlTreeBuilder tb)
 {
     if (t.IsStartTag && StringSet.Create("caption table tbody tfoot thead tr td th").Contains(t.AsStartTag().Name))
     {
         tb.Error(this);
         tb.Process(new Token.EndTag("select"));
         return(tb.Process(t));
     }
     else if (t.IsEndTag && StringSet.Create("caption table tbody tfoot thead tr td th").Contains(t.AsEndTag().Name))
     {
         tb.Error(this);
         if (tb.InTableScope(t.AsEndTag().Name))
         {
             tb.Process(new Token.EndTag("select"));
             return(tb.Process(t));
         }
         else
         {
             return(false);
         }
     }
     else
     {
         return(tb.Process(t, InSelect));
     }
 }
コード例 #6
0
 private void CloseCell(HtmlTreeBuilder tb)
 {
     if (tb.InTableScope("td"))
     {
         tb.Process(new Token.EndTag("td"));
     }
     else
     {
         tb.Process(new Token.EndTag("th")); // only here if th or td in scope
     }
 }
コード例 #7
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                switch (t.Type)
                {
                case TokenType.Character:
                    Token.Character c = t.AsCharacter();
                    if (c.Data.Equals(NullString))
                    {
                        tb.Error(this);
                        return(false);
                    }
                    else
                    {
                        tb.GetPendingTableCharacters().Add(c);
                    }
                    break;

                default:
                    if (tb.GetPendingTableCharacters().Count > 0)
                    {
                        foreach (Token.Character char2 in tb.GetPendingTableCharacters())
                        {
                            if (!IsWhitespace(char2))
                            {
                                // InTable anything else section:
                                tb.Error(this);

                                if (StringUtil.In(tb.CurrentElement.NodeName, "table", "tbody", "tfoot", "thead", "tr"))
                                {
                                    tb.SetFosterInserts(true);
                                    tb.Process(char2, InBody);
                                    tb.SetFosterInserts(false);
                                }
                                else
                                {
                                    tb.Process(char2, InBody);
                                }
                            }
                            else
                            {
                                tb.Insert(char2);
                            }
                        }
                        tb.NewPendingTableCharacters();
                    }
                    tb.Transition(tb.OriginalState);
                    return(tb.Process(t));
                }

                return(true);
            }
コード例 #8
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (t.IsEndTag && t.AsEndTag().Name.Equals("caption"))
                {
                    Token.EndTag endTag = t.AsEndTag();
                    string       name   = endTag.Name;

                    if (!tb.InTableScope(name))
                    {
                        tb.Error(this);
                        return(false);
                    }
                    else
                    {
                        tb.GenerateImpliedEndTags();
                        if (!tb.CurrentElement.NodeName.Equals("caption"))
                        {
                            tb.Error(this);
                        }

                        tb.PopStackToClose("caption");
                        tb.ClearFormattingElementsToLastMarker();
                        tb.Transition(InTable);
                    }
                }
                else if ((t.IsStartTag &&
                          StringSet.Create("caption col colgroup tbody td tfoot th thead tr").Contains(t.AsStartTag().Name) ||
                          t.IsEndTag && t.AsEndTag().Name.Equals("table"))
                         )
                {
                    tb.Error(this);
                    bool processed = tb.Process(new Token.EndTag("caption"));
                    if (processed)
                    {
                        return(tb.Process(t));
                    }
                }
                else if (t.IsEndTag && StringSet.Create("body col colgroup html tbody td tfoot th thead tr").Contains(t.AsEndTag().Name))
                {
                    tb.Error(this);
                    return(false);
                }
                else
                {
                    return(tb.Process(t, InBody));
                }

                return(true);
            }
コード例 #9
0
            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));
            }
コード例 #10
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (IsWhitespace(t))
                {
                    return(tb.Process(t, InBody));
                }
                else if (t.IsComment)
                {
                    tb.Insert(t.AsComment()); // into html node
                }
                else if (t.IsDoctype)
                {
                    tb.Error(this);
                    return(false);
                }
                else if (t.IsStartTag && t.AsStartTag().Name.Equals("html"))
                {
                    return(tb.Process(t, InBody));
                }
                else if (t.IsEndTag && t.AsEndTag().Name.Equals("html"))
                {
                    if (tb.IsFragmentParsing())
                    {
                        tb.Error(this);
                        return(false);
                    }
                    else
                    {
                        tb.Transition(AfterAfterBody);
                    }
                }
                else if (t.IsEOF)
                {
                    // chillax! we're done
                }
                else
                {
                    tb.Error(this);
                    tb.Transition(InBody);
                    return(tb.Process(t));
                }

                return(true);
            }
コード例 #11
0
 public override bool Process(Token t, HtmlTreeBuilder tb)
 {
     if (IsWhitespace(t))
     {
         return(true);
     }
     else if (t.IsComment)
     {
         tb.Insert(t.AsComment());
     }
     else if (t.IsDoctype)
     {
         tb.Error(this);
         return(false);
     }
     else if (t.IsStartTag &&
              t.AsStartTag().Name.Equals("html"))
     {
         return(InBody.Process(t, tb)); // does not transition
     }
     else if (t.IsStartTag &&
              t.AsStartTag().Name.Equals("head"))
     {
         HtmlElement head = tb.Insert(t.AsStartTag());
         tb.HeadElement = head;
         tb.Transition(InHead);
     }
     else if (t.IsEndTag && (StringUtil.In(t.AsEndTag().Name, "head", "body", "html", "br")))
     {
         tb.Process(new Token.StartTag("head"));
         return(tb.Process(t));
     }
     else if (t.IsEndTag)
     {
         tb.Error(this);
         return(false);
     }
     else
     {
         tb.Process(new Token.StartTag("head"));
         return(tb.Process(t));
     }
     return(true);
 }
コード例 #12
0
            private bool AnythingElse(Token t, HtmlTreeBuilder tb)
            {
                tb.Error(this);
                bool processed = true;

                if (StringUtil.In(tb.CurrentElement.NodeName,
                                  "table", "tbody", "tfoot", "thead", "tr"))
                {
                    tb.SetFosterInserts(true);
                    processed = tb.Process(t, InBody);
                    tb.SetFosterInserts(false);
                }
                else
                {
                    processed = tb.Process(t, InBody);
                }

                return(processed);
            }
コード例 #13
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (IsWhitespace(t))
                {
                    return(true); // ignore whitespace
                }
                else if (t.IsComment)
                {
                    tb.Insert(t.AsComment());
                }
                else if (t.IsDoctype)
                {
                    // TODO: parse error check on expected doctypes
                    // TODO: quirk state check on doctype ids
                    Token.Doctype d = t.AsDoctype();

                    var doctype = tb.Document.CreateDocumentType(
                        d.Name,
                        d.PublicIdentifier,
                        d.SystemIdentifier
                        );
                    doctype.BaseUri = tb.BaseUri;

                    tb.Document.Append(doctype);
                    if (d.ForceQuirks)
                    {
                        tb.Document.QuirksMode = QuirksMode.Quirks;
                    }

                    tb.Transition(BeforeHtml);
                }
                else
                {
                    // TODO: check not iframe srcdoc
                    tb.Transition(BeforeHtml);
                    return(tb.Process(t)); // re-process token
                }

                return(true);
            }
コード例 #14
0
 // in script, style etc. normally treated as data tags
 public override bool Process(Token t, HtmlTreeBuilder tb)
 {
     if (t.IsCharacter)
     {
         tb.Insert(t.AsCharacter());
     }
     else if (t.IsEOF)
     {
         tb.Error(this);
         // if current node is script: already started
         tb.Pop();
         tb.Transition(tb.OriginalState);
         return(tb.Process(t));
     }
     else if (t.IsEndTag)
     {
         // if: An end tag whose tag name is "script" -- scripting nesting level, if evaluating scripts
         tb.Pop();
         tb.Transition(tb.OriginalState);
     }
     return(true);
 }
コード例 #15
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (t.IsDoctype)
                {
                    tb.Error(this);
                }
                else if (t.IsStartTag && t.AsStartTag().Name.Equals("html"))
                {
                    return(tb.Process(t, InBody));
                }
                else if (t.IsEndTag && t.AsEndTag().Name.Equals("noscript"))
                {
                    tb.Pop();
                    tb.Transition(InHead);
                }
                else if (IsWhitespace(t) ||
                         t.IsComment ||
                         (t.IsStartTag && StringSet.Create("basefont bgsound link meta noframes style").Contains(t.AsStartTag().Name)))
                {
                    return(tb.Process(t, InHead));
                }
                else if (t.IsEndTag && t.AsEndTag().Name.Equals("br"))
                {
                    return(anythingElse(t, tb));
                }
                else if ((t.IsStartTag && StringUtil.In(t.AsStartTag().Name, "head", "noscript")) || t.IsEndTag)
                {
                    tb.Error(this);
                    return(false);
                }
                else
                {
                    return(anythingElse(t, tb));
                }

                return(true);
            }
コード例 #16
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (t.IsDoctype)
                {
                    tb.Error(this);
                    return(false);
                }
                else if (t.IsComment)
                {
                    tb.Insert(t.AsComment());
                }
                else if (IsWhitespace(t))
                {
                    return(true); // ignore whitespace
                }
                else if (t.IsStartTag && t.AsStartTag().Name.Equals("html"))
                {
                    tb.Insert(t.AsStartTag());
                    tb.Transition(BeforeHead);
                }
                else if (t.IsEndTag && (StringUtil.In(t.AsEndTag().Name, "head", "body", "html", "br")))
                {
                    return(AnythingElse(t, tb));
                }
                else if (t.IsEndTag)
                {
                    tb.Error(this);
                    return(false);
                }
                else
                {
                    return(AnythingElse(t, tb));
                }

                return(true);
            }
コード例 #17
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                switch (t.Type)
                {
                case TokenType.Character:
                    Token.Character c = t.AsCharacter();
                    if (c.Data.Equals(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, 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, InHead));
                    }
                    else
                    {
                        return(AnythingElse(t, tb));
                    }
                    break;

                case TokenType.EndTag:
                    Token.EndTag end = t.AsEndTag();
                    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(AnythingElse(t, tb));
                    }
                    break;

                case TokenType.EOF:
                    if (!tb.CurrentElement.NodeName.Equals("html"))
                    {
                        tb.Error(this);
                    }
                    break;

                default:
                    return(AnythingElse(t, tb));
                }

                return(true);
            }
コード例 #18
0
 private bool AnythingElse(Token t, HtmlTreeBuilder tb)
 {
     tb.Error(this);
     return(false);
 }
コード例 #19
0
 private bool AnythingElse(Token t, HtmlTreeBuilder tb)
 {
     tb.Insert("html");
     tb.Transition(BeforeHead);
     return(tb.Process(t));
 }
コード例 #20
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (IsWhitespace(t))
                {
                    tb.Insert(t.AsCharacter());
                }
                else if (t.IsComment)
                {
                    tb.Insert(t.AsComment());
                }
                else if (t.IsDoctype)
                {
                    tb.Error(this);
                    return(false);
                }
                else if (t.IsStartTag)
                {
                    Token.StartTag start = t.AsStartTag();
                    switch (start.Name)
                    {
                    case "html":
                        return(tb.Process(start, InBody));

                    case "frameset":
                        tb.Insert(start);
                        break;

                    case "frame":
                        tb.InsertEmpty(start);
                        break;

                    case "noframes":
                        return(tb.Process(start, InHead));

                    default:
                        tb.Error(this);
                        return(false);
                    }
                }
                else if (t.IsEndTag && t.AsEndTag().Name.Equals("frameset"))
                {
                    if (tb.CurrentElement.NodeName.Equals("html"))   // frag
                    {
                        tb.Error(this);
                        return(false);
                    }
                    else
                    {
                        tb.Pop();
                        if (!tb.IsFragmentParsing() && !tb.CurrentElement.NodeName.Equals("frameset"))
                        {
                            tb.Transition(AfterFrameset);
                        }
                    }
                }
                else if (t.IsEOF)
                {
                    if (!tb.CurrentElement.NodeName.Equals("html"))
                    {
                        tb.Error(this);
                        return(true);
                    }
                }
                else
                {
                    tb.Error(this);
                    return(false);
                }

                return(true);
            }
コード例 #21
0
 public abstract bool Process(Token t, HtmlTreeBuilder tb);
コード例 #22
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (t.IsEndTag)
                {
                    Token.EndTag endTag = t.AsEndTag();
                    string       name   = endTag.Name;

                    if (name.In("td", "th"))
                    {
                        if (!tb.InTableScope(name))
                        {
                            tb.Error(this);
                            tb.Transition(InRow); // might not be in scope if empty: <td /> and processing fake end tag
                            return(false);
                        }

                        tb.GenerateImpliedEndTags();
                        if (!tb.CurrentElement.NodeName.Equals(name))
                        {
                            tb.Error(this);
                        }

                        tb.PopStackToClose(name);
                        tb.ClearFormattingElementsToLastMarker();
                        tb.Transition(InRow);
                    }
                    else if (StringUtil.In(name, "body", "caption", "col", "colgroup", "html"))
                    {
                        tb.Error(this);
                        return(false);
                    }
                    else if (StringUtil.In(name, "table", "tbody", "tfoot", "thead", "tr"))
                    {
                        if (!tb.InTableScope(name))
                        {
                            tb.Error(this);
                            return(false);
                        }

                        CloseCell(tb);
                        return(tb.Process(t));
                    }
                    else
                    {
                        return(AnythingElse(t, tb));
                    }
                }
                else if (t.IsStartTag &&
                         StringSet.Create("caption col colgroup tbody td tfoot th thead tr").Contains(t.AsStartTag().Name))
                {
                    if (!(tb.InTableScope("td") || tb.InTableScope("th")))
                    {
                        tb.Error(this);
                        return(false);
                    }
                    CloseCell(tb);
                    return(tb.Process(t));
                }
                else
                {
                    return(AnythingElse(t, tb));
                }

                return(true);
            }
コード例 #23
0
 private bool AnythingElse(Token t, HtmlTreeBuilder tb)
 {
     return(tb.Process(t, InTable));
 }
コード例 #24
0
ファイル: Parser.cs プロジェクト: Carbonfrost/f-html
        public static HtmlDocument Parse(String html, Uri baseUri)
        {
            TreeBuilder treeBuilder = new HtmlTreeBuilder();

            return(treeBuilder.Parse(html, baseUri, HtmlParseErrorCollection.NoTracking()));
        }
コード例 #25
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (IsWhitespace(t))
                {
                    tb.Insert(t.AsCharacter());
                    return(true);
                }

                switch (t.Type)
                {
                case TokenType.Comment:
                    tb.Insert(t.AsComment());
                    break;

                case TokenType.Doctype:
                    tb.Error(this);
                    break;

                case TokenType.StartTag:
                    Token.StartTag startTag = t.AsStartTag();
                    string         name     = startTag.Name;

                    if (name.Equals("html"))
                    {
                        return(tb.Process(t, InBody));
                    }

                    else if (name.Equals("col"))
                    {
                        tb.InsertEmpty(startTag);
                    }

                    else
                    {
                        return(AnythingElse(t, tb));
                    }
                    break;

                case TokenType.EndTag:
                    Token.EndTag endTag = t.AsEndTag();
                    name = endTag.Name;

                    if (name.Equals("colgroup"))
                    {
                        if (tb.CurrentElement.NodeName.Equals("html"))       // frag case
                        {
                            tb.Error(this);
                            return(false);
                        }
                        else
                        {
                            tb.Pop();
                            tb.Transition(InTable);
                        }
                    }
                    else
                    {
                        return(AnythingElse(t, tb));
                    }
                    break;

                case TokenType.EOF:
                    if (tb.CurrentElement.NodeName.Equals("html"))
                    {
                        return(true);    // stop parsing; frag case
                    }
                    else
                    {
                        return(AnythingElse(t, tb));
                    }

                default:
                    return(AnythingElse(t, tb));
                }

                return(true);
            }
コード例 #26
0
            public override bool Process(Token t, HtmlTreeBuilder tb)
            {
                if (t.IsCharacter)
                {
                    tb.NewPendingTableCharacters();
                    tb.MarkInsertionMode();
                    tb.Transition(InTableText);
                    return(tb.Process(t));
                }
                else if (t.IsComment)
                {
                    tb.Insert(t.AsComment());
                    return(true);
                }
                else if (t.IsDoctype)
                {
                    tb.Error(this);
                    return(false);
                }
                else if (t.IsStartTag)
                {
                    Token.StartTag startTag = t.AsStartTag();
                    string         name     = startTag.Name;

                    switch (name)
                    {
                    case "caption":
                        tb.ClearStackToTableContext();
                        tb.InsertMarkerToFormattingElements();
                        tb.Insert(startTag);
                        tb.Transition(InCaption);
                        break;

                    case "colgroup":
                        tb.ClearStackToTableContext();
                        tb.Insert(startTag);
                        tb.Transition(InColumnGroup);
                        break;

                    case "col":
                        tb.Process(new Token.StartTag("colgroup"));
                        return(tb.Process(t));

                    case "table":
                        tb.Error(this);
                        bool processed = tb.Process(new Token.EndTag("table"));
                        if (processed)     // only ignored if in fragment
                        {
                            return(tb.Process(t));
                        }
                        break;

                    case "tbody":
                    case "tfoot":
                    case "thead":
                        tb.ClearStackToTableContext();
                        tb.Insert(startTag);
                        tb.Transition(InTableBody);
                        break;

                    case "td":
                    case "th":
                    case "tr":
                        tb.Process(new Token.StartTag("tbody"));
                        return(tb.Process(t));

                    case "style":
                    case "script":
                        return(tb.Process(t, InHead));

                    case "input":
                        if (!startTag.Attributes["type"]
                            .Equals("hidden", StringComparison.OrdinalIgnoreCase))
                        {
                            return(AnythingElse(t, tb));
                        }
                        else
                        {
                            tb.InsertEmpty(startTag);
                        }
                        break;

                    case "form":
                        tb.Error(this);
                        if (tb.FormElement != null)
                        {
                            return(false);
                        }

                        else
                        {
                            HtmlElement form = tb.InsertEmpty(startTag);
                            tb.FormElement = form;
                        }
                        break;

                    default:
                        return(AnythingElse(t, tb));
                    }
                }
                else if (t.IsEndTag)
                {
                    Token.EndTag endTag = t.AsEndTag();
                    string       name   = endTag.Name;

                    switch (name)
                    {
                    case "table":
                        if (!tb.InTableScope(name))
                        {
                            tb.Error(this);
                            return(false);
                        }
                        else
                        {
                            tb.PopStackToClose("table");
                        }
                        tb.ResetInsertionMode();
                        break;

                    case "body":
                    case "caption":
                    case "col":
                    case "colgroup":
                    case "html":
                    case "tbody":
                    case "td":
                    case "tfoot":
                    case "th":
                    case "thead":
                    case "tr":
                        tb.Error(this);
                        return(false);

                    default:
                        return(AnythingElse(t, tb));
                    }
                }
                else if (t.IsEOF)
                {
                    if (tb.CurrentElement.NodeName.Equals("html"))
                    {
                        tb.Error(this);
                    }

                    return(true); // stops parsing
                }

                return(AnythingElse(t, tb));
            }
コード例 #27
0
ファイル: Parser.cs プロジェクト: Carbonfrost/f-html
        public static IList <DomNode> ParseFragment(String fragmentHtml, HtmlElement context, Uri baseUri)
        {
            HtmlTreeBuilder treeBuilder = new HtmlTreeBuilder();

            return(treeBuilder.ParseFragment(fragmentHtml, context, baseUri, HtmlParseErrorCollection.NoTracking()));
        }
コード例 #28
0
            public 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(InRow);
                    }
                    else if (StringUtil.In(name, "th", "td"))
                    {
                        tb.Error(this);
                        tb.Process(new Token.StartTag("tr"));
                        return(tb.Process(startTag));
                    }
                    else if (StringSet.Create("caption col colgroup tbody tfoot thead").Contains(name))
                    {
                        return(ExitTableBody(t, tb));
                    }
                    else
                    {
                        return(AnythingElse(t, tb));
                    }

                    break;

                case TokenType.EndTag:
                    Token.EndTag endTag = t.AsEndTag();
                    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(InTable);
                        }
                    }
                    else if (name.Equals("table"))
                    {
                        return(ExitTableBody(t, tb));
                    }
                    else if (StringSet.Create("body caption col colgroup html td th tr").Contains(name))
                    {
                        tb.Error(this);
                        return(false);
                    }
                    else
                    {
                        return(AnythingElse(t, tb));
                    }

                    break;

                default:
                    return(AnythingElse(t, tb));
                }
                return(true);
            }
コード例 #29
0
 private bool anythingElse(Token t, HtmlTreeBuilder tb)
 {
     tb.Error(this);
     tb.Process(new Token.EndTag("noscript"));
     return(tb.Process(t));
 }
コード例 #30
0
 public override bool Process(Token t, HtmlTreeBuilder tb)
 {
     return(true);
     // TODO: implement. Also; how do we get here?
 }