public override void AppendAnythingElse(TreeConstruction tree, Token token)
 {
     AppendStartTagToken(tree, new FakeStartTagToken(){Name = "body"});
     tree.Parser.FramesetOK = true;
     tree.ReprocessFlag = true;
     return;
 }
Exemple #2
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
 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);
 }
Exemple #6
0
 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);
 }
Exemple #10
0
 // Text Parsing
 protected void GenericRCDATAElementParsingAlgorithm(TreeConstruction tree, Token token)
 {
     tree.InsertElementForToken((TagToken)token);
     tree.Parser.ChangeTokenState<RCDATAState>();
     tree.OriginalInsertionMode = tree.CurrentInsertionMode;
     tree.ChangeInsertionMode<TextInsertionMode>();
 }
Exemple #11
0
        public static NodeList ParseFragment(string input)
        {
            TreeConstruction treeParser = new TreeConstruction();

            treeParser.doc.HtmlSource = input;
            return(treeParser.ParseFragment(input));
        }
Exemple #12
0
 public override void AppendAnythingElse(TreeConstruction tree, Token token)
 {
     OnMessageRaised(new UnexpectedTokenAfterHtmlError(token.Name));
     tree.ChangeInsertionMode<InBodyInsertionMode>();
     tree.ReprocessFlag = true;
     return;
 }
Exemple #13
0
 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;
 }
Exemple #15
0
 public override void AppendAnythingElse(TreeConstruction tree, Token token)
 {
     OnMessageRaised(new FosterParentedTokenError(token.Name));
     tree.FosterParentMode = true;
     tree.AppendToken<InBodyInsertionMode>(token);
     tree.FosterParentMode = false;
     return;
 }
Exemple #16
0
 public override void AppendCharacterToken(TreeConstruction tree, CharacterToken token)
 {
     if(token.IsSpaceCharacter){
         tree.InsertCharacter((CharacterToken)token);
         return;
     }
     AppendAnythingElse(tree, token);
 }
Exemple #17
0
        public static Document CreateDom(string htmlText)
        {
            TreeConstruction treeParser = new TreeConstruction();
            Document         doc        = treeParser.Parse(htmlText);

            doc.HtmlSource = htmlText;
            return(doc);
        }
Exemple #18
0
 public override void AppendAnythingElse(TreeConstruction tree, Token token)
 {
     // 文書型宣言以外が出現
     OnMessageRaised(new NoDoctypeError());
     tree.Document.DocumentMode = DocumentMode.Quirks;
     tree.ChangeInsertionMode<BeforeHtmlInsertionMode>();
     tree.ReprocessFlag = true;
 }
Exemple #19
0
 public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token)
 {
     switch(token.Name){
     case "html":
         tree.ChangeInsertionMode<AfterAfterBodyInsertionMode>();
         return;
     }
 }
Exemple #20
0
 public override void AppendCharacterToken(TreeConstruction tree, CharacterToken token)
 {
     if(token.IsSpaceCharacter){
         tree.AppendToken<InBodyInsertionMode>(token);
         return;
     }
     AppendAnythingElse(tree, token);
 }
Exemple #21
0
 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);
        }
Exemple #23
0
 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);
 }
Exemple #24
0
 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);
 }
Exemple #26
0
        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());
        }
Exemple #27
0
 public override void AppendEndTagToken(TreeConstruction tree, EndTagToken token)
 {
     if(token.IsEndTag("body", "html", "br")){
         AppendAnythingElse(tree, token);
         return;
     }
     OnMessageRaised(new UnexpectedEndTagError(token.Name));
     return;
 }
Exemple #28
0
 public override void AppendStartTagToken(TreeConstruction tree, StartTagToken token)
 {
     switch(token.Name){
     case "html":
         tree.AppendToken<InBodyInsertionMode>(token);
         return;
     }
     AppendAnythingElse(tree, token);
 }
Exemple #29
0
 // 補える終了タグを補う処理
 // 例外を指定
 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;
 }
Exemple #30
0
 private void CloseTheCell(TreeConstruction tree)
 {
     FakeEndTagToken cellEndTag = new FakeEndTagToken();
     if(tree.StackOfOpenElements.HaveElementInTableScope("td")){
         cellEndTag.Name = "td";
     } else {
         cellEndTag.Name = "th";
     }
     AppendEndTagToken(tree, cellEndTag);
 }
Exemple #31
0
 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);
 }
Exemple #33
0
        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);
 }
Exemple #36
0
        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;
 }