private void ExecFileOpen() { // Create OpenFileDialog Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); // Set filter for file extension and default file extension dlg.DefaultExt = ".xaml"; dlg.Filter = "XAML Files (*.xaml)|*.xaml|Any files (*.*)|*.*"; dlg.InitialDirectory = Properties.Settings.Default.LastOpenDirectory; // Display OpenFileDialog by calling ShowDialog method bool?result = dlg.ShowDialog(); // Get the selected file name and display in a TextBox if (result == true) { Properties.Settings.Default.LastOpenDirectory = Path.GetDirectoryName(dlg.FileName); Properties.Settings.Default.Save(); // Open document string fileName = dlg.FileName; XamlParser parser = new XamlParser(new TraceErrorHandler()); XamlMainObjectNode mainObjectNode = parser.Parse(fileName); //Parse01(fileName); //Parse03(fileName); } }
public void TestEmpty() { XamlParser parser = new XamlParser(Errors); XamlMainObjectNode mainNode = parser.ParseFromString(""); Assert.IsNull(mainNode, "It must be no parse result"); }
public void TagClosed(string xamlText, XamlNodeBase.EState tagState) { XamlParser parser = new XamlParser(Errors); XamlMainObjectNode mainNode = parser.ParseFromString(xamlText); Assert.IsNotNull(mainNode, "It must be parse result"); Assert.AreEqual("tag", mainNode.Name, "Wrong tag name"); Assert.AreEqual(tagState, mainNode.State, "Node state"); }
public void NotClosedTag() { XamlParser parser = new XamlParser(Errors); XamlMainObjectNode mainNode = parser.ParseFromString("<tag>"); Assert.IsNotNull(mainNode, "It must be parse result"); Assert.AreEqual("tag", mainNode.Name, "Wrong tag name"); Assert.AreEqual(XamlNodeBase.EState.EndTagPresent, mainNode.State, "Node state"); }
public void CommentInsideMainNode(string xamlText) { XamlParser parser = new XamlParser(Errors); XamlMainObjectNode mainNode = parser.ParseFromString(xamlText); Assert.IsNotNull(mainNode, "It must be parse result"); Assert.AreEqual("tag", mainNode.Name, "Wrong tag name"); Assert.AreEqual(XamlNodeBase.EState.Closed | XamlNodeBase.EState.EndTagPresent, mainNode.State, "Node state"); Assert.AreEqual(1, mainNode.Children.Count, "Wrong children count"); XamlNodeBase node = mainNode.Children[0]; Assert.AreEqual(XamlNodeBase.ENodeType.Comment, node.NodeType, "Wrong node type"); XamlCommentNode comment = node as XamlCommentNode; Assert.AreEqual("Comment 1", comment.Comment, "Comment text"); CheckTextRange("Comment:", 1, 1, 6, 21, comment); }
public void SingleAttribute(string xamlText) { XamlParser parser = new XamlParser(Errors); XamlMainObjectNode mainNode = parser.ParseFromString(xamlText); Assert.IsNotNull(mainNode, "It must be parse result"); Assert.AreEqual("tag", mainNode.Name, "Wrong tag name"); Assert.AreEqual(XamlNodeBase.EState.Closed, mainNode.State, "Node state"); Assert.AreEqual(0, mainNode.Children.Count, "Wrong children count"); Assert.AreEqual(1, mainNode.Attributes.Count, "Wrong attributes count"); XamlNodeBase node = mainNode.Attributes[0]; Assert.AreEqual(XamlNodeBase.ENodeType.Attribute, node.NodeType, "Wrong attribute type"); XamlAttribute attribute = node as XamlAttribute; Assert.AreEqual("a1", attribute.Name, "Wrong attribute name"); Assert.AreEqual("value1", attribute.Value, "Wrong attribute value"); CheckTextRange("Attribute:", 1, 1, 6, 16, node); CheckTextRangeValue("Attribute value:", 1, 1, 9, 16, attribute); }
public void TagWithValue(string xamlText, int endLineTag, int endPosTag, int startLineText, int startPosText, int endLineText, int endPosText) { XamlParser parser = new XamlParser(Errors); // 12345678901234 XamlMainObjectNode mainNode = parser.ParseFromString(xamlText); Assert.IsNotNull(mainNode, "It must be parse result"); Assert.AreEqual( XamlNodeBase.EState.Closed | XamlNodeBase.EState.EndTagPresent | XamlNodeBase.EState.TextNodePresent, mainNode.State, "Node state"); Assert.AreEqual("tag", mainNode.Name, "Wrong tag name"); Assert.AreEqual(0, mainNode.Attributes.Count, "Wrong number of attributes"); Assert.AreEqual(1, mainNode.Children.Count, "Wrong number of children"); CheckTextRange("Tag:", 1, endLineTag, 1, endPosTag, mainNode); XamlTextNode textNode = mainNode.Children[0] as XamlTextNode; Assert.IsNotNull(textNode, "It must be text node as first child"); Assert.AreEqual("123", textNode.Value, "Not expected text value"); CheckTextRange("Text:", startLineText, endLineText, startPosText, endPosText, textNode); }
public XamlMainObjectNode Parse(StreamReader fileStream) { if (fileStream == null) { throw new ArgumentNullException(nameof(fileStream)); } Stack <XamlObjectNode> objStack = new Stack <XamlObjectNode>(); XamlObjectNode currentNode = null; XamlMainObjectNode mainObject = null; SymbolScanner scanner = new SymbolScanner(fileStream); int lineNumberStart = 0; int linePositionStart = 0; //long newLineStreamPosition = fileStream.BaseStream.Position; string ident; //bool tagBracketClosed = false; while (!fileStream.EndOfStream) { scanner.SkipSpaces(); char ch = scanner.GetSymbol(); if (ch == '\0') { break; } if (ch == SymbolScanner.SymbolStartTag) { //tagBracketClosed = false; lineNumberStart = scanner.LineNumber; //open tag symbol must be start not the next symbol linePositionStart = scanner.CharPosition - 1; char chNext = scanner.NextSymbol; if (chNext == SymbolScanner.SymbolCloseTag) { scanner.SkipSymbol(); ident = scanner.GetName(); if (DoEndTag(ident, scanner)) { CloseTag(ident, scanner, objStack); } } else if (chNext == SymbolScanner.SymbolStartComment) { string comment = scanner.ReadComment(); Trace.WriteLine($"{lineNumberStart + 1}:{linePositionStart + 1} Comment:{comment}"); XamlCommentNode commentNode = new XamlCommentNode { LineNumberStart = lineNumberStart + 1, LinePositionStart = linePositionStart + 1, Comment = comment }; commentNode.LineNumberEnd = scanner.LineNumber + 1; //end position is outside comment tag commentNode.LinePositionEnd = scanner.CharPosition; objStack.Push(commentNode); } else { char breakSymbol; ident = scanner.GetName(); breakSymbol = scanner.NextSymbol; //ident = GetIdent(fileStream, out breakSymbol); Trace.WriteLine($"{lineNumberStart + 1}:{linePositionStart + 1} Start Tag:{ident}"); if (mainObject == null) { mainObject = new XamlMainObjectNode { LineNumberStart = lineNumberStart + 1, LinePositionStart = linePositionStart + 1 }; mainObject.Name = ident; currentNode = mainObject; //root.MainObject = mainObject; objStack.Push(mainObject); } else { currentNode = new XamlObjectNode { LineNumberStart = lineNumberStart + 1, LinePositionStart = linePositionStart + 1 }; currentNode.Name = ident; objStack.Push(currentNode); } if (breakSymbol != SymbolScanner.SymbolEndTag) { scanner.SkipSpaces(); breakSymbol = scanner.NextSymbol; } if (breakSymbol == SymbolScanner.SymbolCloseTag) { //end of tag if (DoEndTag(ident, scanner)) { CloseTag(ident, scanner, objStack); } } else if (breakSymbol != SymbolScanner.SymbolEndTag) { XamlObjectNode objectNode = null; if (objStack.Count > 0) { objectNode = objStack.Peek(); } bool isClosed = ReadAttributes(objectNode, scanner, breakSymbol); if (isClosed) { //tagBracketClosed = true; if (objectNode != null) { objectNode.SetState(XamlNodeBase.EState.EndTagPresent); //objectNode.IsTagBracketClosed = true; } Trace.WriteLine("Tag end symbol for:" + ident); } if (scanner.NextSymbol == SymbolScanner.SymbolCloseTag) { //end of tag if (DoEndTag(ident, scanner)) { CloseTag(ident, scanner, objStack); } } } else { // skip '>' scanner.SkipSymbol(); XamlObjectNode objectNode = objStack.Peek(); objectNode.SetState(XamlNodeBase.EState.EndTagPresent); Trace.WriteLine("Tag end symbol for:" + ident); } //chNext = scanner.NextSymbol; } } else { if (objStack.Count > 0) { XamlObjectNode objectNode = objStack.Peek(); if (objectNode.IsState(XamlNodeBase.EState.EndTagPresent)) { lineNumberStart = scanner.LineNumber; //text symbol must be current not the next symbol linePositionStart = scanner.CharPosition - 1; string text = scanner.ReadText(ch); Trace.WriteLine("Text node:" + text); XamlTextNode textNode = new XamlTextNode(text) { LineNumberStart = lineNumberStart + 1, LinePositionStart = linePositionStart + 1 }; textNode.LineNumberEnd = scanner.LastTextLineNumberEnd + 1; // it must be the next symbol textNode.LinePositionEnd = scanner.LastTextCharPositionEnd; objectNode.SetState(XamlNodeBase.EState.TextNodePresent); objectNode.AddChild(textNode); } else { //Trace.Write(ch); _errorHandler?.Error($"Not expected symbol :'{ch}'", scanner); } } else { //Trace.Write(ch); _errorHandler?.Error($"Not expected symbol, no tag found :'{ch}'", scanner); } } char chNext1 = scanner.CheckEndOfLine(scanner.NextSymbol); } if (objStack.Count > 0) { //ignore exception by non closed main state. Temporary if (mainObject != null && objStack.Count == 1) { if (!mainObject.IsState(XamlNodeBase.EState.Closed)) { return(mainObject); } } _errorHandler?.Error($"unused {objStack.Count} nodes", scanner); } return(mainObject); }