private static void HandleRawtext(Token.StartTag startTag, HtmlTreeBuilder tb) { tb.Insert(startTag); tb.tokeniser.Transition(TokeniserState.Rawtext); tb.MarkInsertionMode(); tb.Transition(Text); }
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); }
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); }
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); }
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)); } }
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 } }
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); }
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); }
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)); }
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); }
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); }
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); }
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); }
// 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); }
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); }
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); }
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); }
private bool AnythingElse(Token t, HtmlTreeBuilder tb) { tb.Error(this); return(false); }
private bool AnythingElse(Token t, HtmlTreeBuilder tb) { tb.Insert("html"); tb.Transition(BeforeHead); return(tb.Process(t)); }
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); }
public abstract bool Process(Token t, HtmlTreeBuilder tb);
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); }
private bool AnythingElse(Token t, HtmlTreeBuilder tb) { return(tb.Process(t, InTable)); }
public static HtmlDocument Parse(String html, Uri baseUri) { TreeBuilder treeBuilder = new HtmlTreeBuilder(); return(treeBuilder.Parse(html, baseUri, HtmlParseErrorCollection.NoTracking())); }
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); }
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)); }
public static IList <DomNode> ParseFragment(String fragmentHtml, HtmlElement context, Uri baseUri) { HtmlTreeBuilder treeBuilder = new HtmlTreeBuilder(); return(treeBuilder.ParseFragment(fragmentHtml, context, baseUri, HtmlParseErrorCollection.NoTracking())); }
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); }
private bool anythingElse(Token t, HtmlTreeBuilder tb) { tb.Error(this); tb.Process(new Token.EndTag("noscript")); return(tb.Process(t)); }
public override bool Process(Token t, HtmlTreeBuilder tb) { return(true); // TODO: implement. Also; how do we get here? }