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) { 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 void Insert(Token.Character characterToken) { DomNode node; // characters in script and style go in as datanodes, not text nodes if (CurrentElement.NodeName.In("script", "style")) { node = new HtmlText(characterToken.Data, true); } else { node = new HtmlText(characterToken.Data); } CurrentElement.Append(node); // doesn't use insertNode, because we don't foster these; and will always have a stack. }
void Insert(Token.Character characterToken) { var node = new HtmlText(characterToken.Data); InsertNode(node); }
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); }
public void AddFirst(Token.Character c) { AddFirst(c.ToString()); }