public override void AppendAnythingElse(TreeConstruction tree, Token token) { AppendStartTagToken(tree, new FakeStartTagToken(){Name = "body"}); tree.Parser.FramesetOK = true; tree.ReprocessFlag = true; return; }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "optgroup": if(tree.StackOfOpenElements.IsCurrentNameMatch("option")){ XmlElement immediatelyBeforeNode = tree.StackOfOpenElements.GetImmediatelyBeforeCurrentNode(); if(immediatelyBeforeNode.Name == "optgroup"){ AppendEndTagToken(tree, new FakeEndTagToken(){Name = "option"}); } } if(tree.StackOfOpenElements.IsCurrentNameMatch("optgroup")){ tree.PopFromStack(); } else { OnMessageRaised(new LonlyEndTagError(token.Name)); return; } return; case "option": if(tree.StackOfOpenElements.IsCurrentNameMatch("option")){ tree.PopFromStack(); } else { OnMessageRaised(new LonlyEndTagError(token.Name)); return; } return; case "select": tree.StackOfOpenElements.PopUntilSameTagName("select"); tree.ResetInsertionModeAppropriately(); return; } AppendAnythingElse(tree, token); }
public override void AppendStartTagToken(TreeConstruction tree, StartTagToken token) { if(token.IsStartTag("html")){ tree.AppendToken<InBodyInsertionMode>(token); return; } if(token.IsStartTag("body")){ tree.InsertElementForToken(token); tree.Parser.FramesetOK = false; tree.ChangeInsertionMode<InBodyInsertionMode>(); return; } if(token.IsStartTag("frameset")){ tree.InsertElementForToken(token); tree.ChangeInsertionMode<InFramesetInsertionMode>(); return; } if(token.IsStartTag("base", "basefont", "bgsound", "link", "meta", "noframes", "script", "style", "title")){ OnMessageRaised(new UnexpectedInHeadElementError(token.Name)); tree.PutToStack(tree.HeadElementPointer); tree.AppendToken<InHeadInsertionMode>(token); tree.PopFromStack(); return; } if(token.IsStartTag("head")){ OnMessageRaised(new MultipleHeadElementError()); return; } AppendAnythingElse(tree, token); }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "script": XmlElement currentNode = tree.CurrentNode as XmlElement; if(ElementInfo.IsSVGNameSpace(currentNode) && currentNode.Name == "script"){ tree.PopFromStack(); return; } break; } // Any Other End Tag XmlElement node = tree.CurrentNode as XmlElement; if(!token.IsEndTag(node.Name)){ OnMessageRaised(new LonlyEndTagError(token.Name)); } while(node != null){ if(token.IsEndTag(node.Name.ToLower())){ tree.StackOfOpenElements.PopUntilSameElement(node); break; } node = tree.StackOfOpenElements.GetAncestor(node); if(ElementInfo.IsHtmlNameSpace(node)) break; } tree.AppendToken(token); }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "table": if(!tree.StackOfOpenElements.HaveElementInTableScope(token.Name)){ OnMessageRaised(new LonlyEndTagError(token.Name)); return; } tree.StackOfOpenElements.PopUntilSameTagName(token.Name); tree.ResetInsertionModeAppropriately(); return; case "body": case "caption": case "col": case "colgroup": case "html": case "tbody": case "td": case "tfoot": case "th": case "thead": case "tr": OnMessageRaised(new UnexpectedEndTagError(token.Name)); return; } AppendAnythingElse(tree, token); }
public override void AppendCharacterToken(TreeConstruction tree, CharacterToken token) { tree.ClearPendingTableCharacterTokens(); tree.OriginalInsertionMode = tree.CurrentInsertionMode; tree.ChangeInsertionMode<InTableTextInsertionMode>(); tree.ReprocessFlag = true; }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "tbody": case "tfoot": case "thead": if(!tree.StackOfOpenElements.HaveElementInTableScope(token.Name)){ OnMessageRaised(new LonlyEndTagError(token.Name)); return; } tree.StackOfOpenElements.ClearBackToTableBody(); tree.PopFromStack(); tree.ChangeInsertionMode<InTableInsertionMode>(); return; case "table": tree.StackOfOpenElements.ClearBackToTableBody(); AppendEndTagToken(tree, new FakeEndTagToken(){Name = tree.CurrentNode.Name}); tree.ReprocessFlag = true; return; case "body": case "caption": case "col": case "colgroup": case "html": case "td": case "th": case "tr": OnMessageRaised(new LonlyEndTagError(token.Name)); return; } AppendAnythingElse(tree, token); }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "caption": GenerateImpliedEndTags(tree, token); if(!tree.StackOfOpenElements.IsCurrentNameMatch(token.Name)){ OnMessageRaised(new LonlyEndTagError(token.Name)); } tree.StackOfOpenElements.PopUntilSameTagName(token.Name); tree.ListOfActiveFormatElements.ClearUpToTheLastMarker(); tree.ChangeInsertionMode<InTableInsertionMode>(); return; case "table": OnMessageRaised(new UnexpectedEndTagError(token.Name)); AppendEndTagToken(tree, new FakeEndTagToken(){Name = "caption"}); tree.ReprocessFlag = true; return; case "body": case "col": case "colgroup": case "html": case "tbody": case "td": case "tfoot": case "th": case "thead": case "tr": OnMessageRaised(new UnexpectedEndTagError(token.Name)); return; } AppendAnythingElse(tree, token); }
public override void AppendStartTagToken(TreeConstruction tree, StartTagToken token) { switch(token.Name){ case "tr": tree.StackOfOpenElements.ClearBackToTableBody(); tree.InsertElementForToken(token); tree.ChangeInsertionMode<InRowInsertionMode>(); return; case "th": case "td": OnMessageRaised(new CellWithoutTableRowError(token.Name)); AppendStartTagToken(tree, new FakeStartTagToken(){Name = "tr"}); tree.ReprocessFlag = true; return; case "caption": case "col": case "colgroup": case "tbody": case "tfoot": case "thead": tree.StackOfOpenElements.ClearBackToTableBody(); AppendEndTagToken(tree, new FakeEndTagToken(){Name = tree.CurrentNode.Name}); tree.ReprocessFlag = true; return; } AppendAnythingElse(tree, token); }
// Text Parsing protected void GenericRCDATAElementParsingAlgorithm(TreeConstruction tree, Token token) { tree.InsertElementForToken((TagToken)token); tree.Parser.ChangeTokenState<RCDATAState>(); tree.OriginalInsertionMode = tree.CurrentInsertionMode; tree.ChangeInsertionMode<TextInsertionMode>(); }
public static NodeList ParseFragment(string input) { TreeConstruction treeParser = new TreeConstruction(); treeParser.doc.HtmlSource = input; return(treeParser.ParseFragment(input)); }
public override void AppendAnythingElse(TreeConstruction tree, Token token) { OnMessageRaised(new UnexpectedTokenAfterHtmlError(token.Name)); tree.ChangeInsertionMode<InBodyInsertionMode>(); tree.ReprocessFlag = true; return; }
public override void AppendEndOfFileToken(TreeConstruction tree, EndOfFileToken token) { // If the current node is not the root html element, then this is a parse error. // Note: It can only be the current node in the fragment case. OnMessageRaised(new SuddenlyEndAtElementError(token.Name)); tree.Parser.Stop(); return; }
public override void AppendAnythingElse(TreeConstruction tree, Token token) { XmlElement defaultHtmlElement = tree.Document.CreateHtmlElement("html"); tree.AppendChild(defaultHtmlElement); tree.PutToStack(defaultHtmlElement); tree.ChangeInsertionMode<BeforeHeadInsertionMode>(); tree.ReprocessFlag = true; }
public override void AppendAnythingElse(TreeConstruction tree, Token token) { OnMessageRaised(new FosterParentedTokenError(token.Name)); tree.FosterParentMode = true; tree.AppendToken<InBodyInsertionMode>(token); tree.FosterParentMode = false; return; }
public override void AppendCharacterToken(TreeConstruction tree, CharacterToken token) { if(token.IsSpaceCharacter){ tree.InsertCharacter((CharacterToken)token); return; } AppendAnythingElse(tree, token); }
public static Document CreateDom(string htmlText) { TreeConstruction treeParser = new TreeConstruction(); Document doc = treeParser.Parse(htmlText); doc.HtmlSource = htmlText; return(doc); }
public override void AppendAnythingElse(TreeConstruction tree, Token token) { // 文書型宣言以外が出現 OnMessageRaised(new NoDoctypeError()); tree.Document.DocumentMode = DocumentMode.Quirks; tree.ChangeInsertionMode<BeforeHtmlInsertionMode>(); tree.ReprocessFlag = true; }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "html": tree.ChangeInsertionMode<AfterAfterBodyInsertionMode>(); return; } }
public override void AppendCharacterToken(TreeConstruction tree, CharacterToken token) { if(token.IsSpaceCharacter){ tree.AppendToken<InBodyInsertionMode>(token); return; } AppendAnythingElse(tree, token); }
public override void AppendCharacterToken(TreeConstruction tree, CharacterToken token) { if(token.IsNULL){ OnMessageRaised(new NullInDataError()); return; } tree.InsertCharacter(token); }
public void PositiveIntuitive1() { var tree1 = new TreeConstruction().GetFromLevelOrderTraverse(new int[] { 2, 1, 4 }); var tree2 = new TreeConstruction().GetFromLevelOrderTraverse(new int[] { 1, 0, 3 }); var actual = allElementsTwoBST.GetAllElementsIntuitive(tree1, tree2); Assert.Equal(new int[] { 0, 1, 1, 2, 3, 4 }, actual); }
public override void AppendStartTagToken(TreeConstruction tree, StartTagToken token) { switch(token.Name){ case "caption": tree.StackOfOpenElements.ClearBackToTable(); tree.ListOfActiveFormatElements.InsertMarker(); tree.InsertElementForToken(token); tree.ChangeInsertionMode<InCaptionInsertionMode>(); return; case "colgroup": tree.StackOfOpenElements.ClearBackToTable(); tree.InsertElementForToken(token); tree.ChangeInsertionMode<InColumnGroupInsertionMode>(); return; case "col": AppendStartTagToken(tree, new FakeStartTagToken(){Name = "colgroup"}); tree.ReprocessFlag = true; return; case "tbody": case "tfoot": case "thead": tree.StackOfOpenElements.ClearBackToTable(); tree.InsertElementForToken(token); tree.ChangeInsertionMode<InTableBodyInsertionMode>(); return; case "td": case "th": case "tr": AppendStartTagToken(tree, new FakeStartTagToken(){Name = "tbody"}); tree.ReprocessFlag = true; return; case "table": OnMessageRaised(new DoubleTableError()); AppendEndTagToken(tree, new FakeEndTagToken(){Name = "table"}); // このパーサーは fragment case を実装しない // then, if that token wasn't ignored, reprocess the current token. // Note: The fake end tag token here can only be ignored in the fragment case. tree.ReprocessFlag = true; return; case "input": if(!token.IsHiddenType()){ AppendAnythingElse(tree, token); return; } OnMessageRaised(new HiddenInputInTableError()); tree.InsertElementForToken(token); tree.PopFromStack(); return; case "form": OnMessageRaised(new FormInTableError()); if(tree.FormElementPointer != null) return; XmlElement form = tree.InsertElementForToken(token); tree.FormElementPointer = form; tree.PopFromStack(); return; } AppendAnythingElse(tree, token); }
public override void AppendEndOfFileToken(TreeConstruction tree, EndOfFileToken token) { string invalidOpenTag = tree.StackOfOpenElements.NotEither(myEndOfFilePermitOpenTags); if(invalidOpenTag != null){ OnMessageRaised(new SuddenlyEndAtElementError(invalidOpenTag)); } tree.Parser.Stop(); return; }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "html": tree.ChangeInsertionMode<AfterAfterFramesetInsertionMode>(); return; } AppendAnythingElse(tree, token); }
public static string RemoveHtml(string html) { html = System.Net.WebUtility.HtmlDecode(html); TreeConstruction tree = new TreeConstruction(); var tokenizer = new Tokenizer(html, tree); var token = tokenizer.ReadNextToken(); StringBuilder sb = new StringBuilder(); bool lastIsSpace = false; while (token != null && token.type != enumHtmlTokenType.EOF) { if (token.type == enumHtmlTokenType.Character) { var data = Lib.Helper.StringHelper.TrimSpace(token.data); if (string.IsNullOrEmpty(data)) { if (!lastIsSpace) { sb.Append(" "); lastIsSpace = true; } } else { sb.Append(data); if (lastIsSpace) { lastIsSpace = false; } } } else if (token.type == enumHtmlTokenType.StartTag || token.type == enumHtmlTokenType.EndTag) { if (!lastIsSpace) { sb.Append(" "); lastIsSpace = true; } } if (tree.stop) { break; } if (tree._nexttoken != null) { token = tree._nexttoken; tree._nexttoken = null; } else { token = tokenizer.ReadNextToken(); } } return(sb.ToString()); }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { if(token.IsEndTag("body", "html", "br")){ AppendAnythingElse(tree, token); return; } OnMessageRaised(new UnexpectedEndTagError(token.Name)); return; }
public override void AppendStartTagToken(TreeConstruction tree, StartTagToken token) { switch(token.Name){ case "html": tree.AppendToken<InBodyInsertionMode>(token); return; } AppendAnythingElse(tree, token); }
// 補える終了タグを補う処理 // 例外を指定 protected void GenerateImpliedEndTags(TreeConstruction tree, Token token, params string[] except) { while(tree.StackOfOpenElements.IsImpliedEndTagElement()){ if(tree.StackOfOpenElements.IsCurrentNameMatch(except)) break; XmlElement e = tree.StackOfOpenElements.Pop(); OnMessageRaised(new ImpliedEndTagInsertedWarning(e, token)); } return; }
private void CloseTheCell(TreeConstruction tree) { FakeEndTagToken cellEndTag = new FakeEndTagToken(); if(tree.StackOfOpenElements.HaveElementInTableScope("td")){ cellEndTag.Name = "td"; } else { cellEndTag.Name = "th"; } AppendEndTagToken(tree, cellEndTag); }
public override void AppendEndOfFileToken(TreeConstruction tree, EndOfFileToken token) { OnMessageRaised(new SuddenlyEndAtElementError(tree.CurrentNode.Name)); // Ignore?: // If the current node is a script element, mark the script element as "already started". tree.PopFromStack(); tree.SwitchToOriginalInsertionMode(); tree.ReprocessFlag = true; return; }
public override void AppendStartTagToken(TreeConstruction tree, StartTagToken token) { if(token.IsStartTag("html")){ XmlElement htmlElement = tree.CreateElementForToken((TagToken)token); tree.AppendChild(htmlElement); tree.PutToStack(htmlElement); tree.ChangeInsertionMode<BeforeHeadInsertionMode>(); return; } AppendAnythingElse(tree, token); }
public static Document CreateDom(string htmlText, List <string> ParserErrors) { TreeConstruction treeParser = new TreeConstruction(); treeParser.EnableErrorLogging = true; Document doc = treeParser.Parse(htmlText); doc.HtmlSource = htmlText; ParserErrors.AddRange(_getErrors(treeParser.Errors, htmlText)); return(doc); }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "frameset": tree.PopFromStack(); if(!tree.StackOfOpenElements.IsCurrentNameMatch("frameset")){ tree.ChangeInsertionMode<AfterFramesetInsertionMode>(); } return; } AppendAnythingElse(tree, token); }
public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token) { switch(token.Name){ case "colgroup": tree.PopFromStack(); tree.ChangeInsertionMode<InTableInsertionMode>(); return; case "col": OnMessageRaised(new ColEndTagError()); return; } AppendAnythingElse(tree, token); }
public static NodeList ParseFragment(string input, Element context) { TreeConstruction treeParser = new TreeConstruction(); return(treeParser.ParseFragment(input, context)); }
public StackOpenElements(TreeConstruction treeconstruction) { this.TreeConstruction = treeconstruction; }
public ActiveFormattingElementList(TreeConstruction tree) { _treeConstruction = tree; }