public string Write(KONNode node, int currentDepth = 0) { //It feels wrong to do it like this but this way it's nice and neatly indented string indent = ""; for (int i = 0; i < currentDepth; i++) { indent += " "; } string indent2 = indent + " "; string output = $"{indent}{GetCase(node.Name, NodeNameWriteMode)}\n{indent}{{"; foreach (KeyValuePair <string, string> pair in node.Values) { output += $"\n{indent2}{GetCase(pair.Key, KeyWriteMode)} = {GetCase(FormatValue(pair.Value), ValueWriteMode)}"; } for (int i = 0; i < node.Children.Count; i++) { output += $"\n{Write(node.Children[i], currentDepth + 1)}"; } for (int i = 0; i < node.Arrays.Count; i++) { KONArray currentArray = node.Arrays[i]; output += $"\n{WriteArray(currentArray, currentDepth + 1)}"; } output += $"\n{indent}}}"; return(output); }
public KONNode(string name, KONNode parent) { Name = name; Parent = parent; Values = new Dictionary <string, string>(); Children = new List <KONNode>(); Arrays = new List <KONArray>(); }
public KONArray(string name, KONNode parent) { Name = name; Parent = parent; Items = new List <string>(); }
public KONArray(string name) { Name = name; Items = new List <string>(); Parent = null; }
public bool TryParse(string contents, out KONNode output) { try { string[] lines = contents.Split('\n'); string previousLine = ""; string line = lines[0]; int currentIndex = 0; //Skip any preceding comments before using a line as the name while (line.StartsWith("//")) { currentIndex++; line = lines[currentIndex]; } //Create the KONNode object and find its name based on the current line output = new KONNode(GetCase(line.Trim(), NodeNameReadMode)); KONNode currentNode = output; bool arrayReadMode = false; KONArray currentArray = null; for (int i = currentIndex; i < lines.Length; i++) { previousLine = line; line = lines[i].Trim(); //Ignore any line that starts with // if (line.StartsWith("//")) { line = previousLine; continue; } if (line.Contains("=") && !arrayReadMode) { currentNode.Values.Add(GetCase(line.Split('=')[0].Trim(), KeyReadMode), GetCase(FormatValue(line.Split('=')[1].Trim()), ValueReadMode)); } if (line.Contains("{") && !previousLine.Contains("{") && previousLine != output.Name && !arrayReadMode) { KONNode newNode = new KONNode(GetCase(Regex.Replace(previousLine, @"[^\w\-]", "", RegexOptions.None, TimeSpan.FromSeconds(1)), NodeNameReadMode), currentNode); currentNode.AddChild(newNode); currentNode = newNode; } if (line.Contains("[") && !previousLine.Contains("[") && !arrayReadMode) { currentArray = new KONArray(GetCase(Regex.Replace(previousLine, @"[^\w\-]", "", RegexOptions.None, TimeSpan.FromSeconds(1)), NodeNameReadMode), currentNode); currentNode.AddArray(currentArray); arrayReadMode = true; } if (arrayReadMode && !line.Contains("]") && !line.Contains("[")) { currentArray.Items.Add(GetCase(FormatValue(line), ValueReadMode)); } if (line.Contains("]") && arrayReadMode) { arrayReadMode = false; } if (line.Contains("}")) { currentNode = currentNode.Parent; } } return(true); } catch { output = null; return(false); } }
/// <summary> /// Adds the given node to this node's children. /// </summary> /// <param name="node"></param> public void AddChild(KONNode node) { node.Parent = this; node.Depth = Depth + 1; Children.Add(node); }