From 6fca143b647e0b44809b8484120db24bac4e487a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Thu, 27 Feb 2025 15:41:02 +0100 Subject: [PATCH] XmlSyntax element name matching --- .../src/Parsing/XmlSyntaxAnalyser.cs | 33 ++++++++++++++----- .../CEXmlPlugin/src/Parsing/XmlSyntaxNodes.cs | 3 +- 2 files changed, 27 insertions(+), 9 deletions(-) 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) { } -- 2.47.3