From: Jean-Philippe Bruyère Date: Thu, 27 Feb 2025 14:41:02 +0000 (+0100) Subject: XmlSyntax element name matching X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=6fca143b647e0b44809b8484120db24bac4e487a;p=jp%2Fcrowedit.git XmlSyntax element name matching --- diff --git a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs index 4083aa9..a455fed 100644 --- a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs +++ b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxAnalyser.cs @@ -53,12 +53,7 @@ namespace CrowEdit.Xml if (curTok.GetTokenType() == XmlTokenType.ElementOpen) currentNode = currentNode.AddChild (new ElementStartTagSyntax (currentLine, tokIdx)); else if (curTok.GetTokenType() == XmlTokenType.EndElementOpen) { - elt.EndTag = new ElementEndTagSyntax (currentLine, tokIdx); - currentNode = elt.AddChild (elt.EndTag); - /*} else { - finishCurrentNode(-1); - addException ("Unmatching open/closing element name"); - }*/ + currentNode = elt.AddChild (new ElementEndTagSyntax (currentLine, tokIdx)); } } else if (currentNode is AttributeSyntax attrib) { if (curTok.GetTokenType() == XmlTokenType.EqualSign) @@ -83,8 +78,30 @@ namespace CrowEdit.Xml eltEndTag.name = tokIdx - eltEndTag.TokenIndexBase; else if (curTok.GetTokenType() == XmlTokenType.ClosingSign) { eltEndTag.close = tokIdx - eltEndTag.TokenIndexBase; - //go up 2 times - finishCurrentNode (); finishCurrentNode (); + ElementSyntax es = eltEndTag.Parent as ElementSyntax; + string eltEndTagName = eltEndTag.Name; + if (string.Equals(es.StartTag.Name, eltEndTagName, StringComparison.Ordinal)) { + es.EndTag = eltEndTag; + //go up 2 times + finishCurrentNode (); finishCurrentNode (); + } else { + addException ("Open/Close element name mismatch"); + finishCurrentNode (1);//finish eltEndTag->curNode is parent elt + currentNode.RemoveChild(eltEndTag); + finishCurrentNode (-eltEndTag.TokenCount.Value); //dont credit parent element with those tokens from the non matching end tag + //curNode should be parent element of previous element + while(currentNode is ElementSyntax esp) { + //eltEndTag is out of tree, so Name get threw exception + if (string.Equals(esp.StartTag.Name, eltEndTagName, StringComparison.Ordinal)) { + esp.EndTag = eltEndTag; + esp.AddChild (eltEndTag); + finishCurrentNode (); + break; + } else { + finishCurrentNode (-eltEndTag.TokenCount.Value); + } + } + } } else { addException ("Unexpected Token"); finishCurrentNode (-1); diff --git a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs index 928b722..dca4c1d 100644 --- a/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs +++ b/plugins/CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs @@ -23,7 +23,8 @@ namespace CrowEdit.Xml public abstract class ElementTagSyntax : SyntaxNode { public int? name, close; public override bool IsComplete => base.IsComplete & name.HasValue & close.HasValue; - public string Name => Root.GetTokenStringByIndex (TokenIndexBase + name.Value); + public string Name => name.HasValue ? + Root.GetTokenStringByIndex (TokenIndexBase + name.Value) : null; protected ElementTagSyntax (int startLine, int tokenBase) : base (startLine, tokenBase) { }