public ReaperProject ParseProject(string fileName) { PopulateElements(); var project = new ReaperProject(); var lines = File.ReadAllLines(fileName); lines = lines.Select(l => l.TrimStart()).ToArray(); ReaperElement current = null; foreach (var data in lines) { if (data.StartsWith("<")) // new element and up a level { if (current == null) { current = CreateElement(data, null); } else { var newElement = CreateElement(data, current); current.AddElement(newElement); current = newElement; } } else if (data.StartsWith(">")) // down a level { current.CompleteParse(); if (current.ParentElement != null) { current = current.ParentElement; } } else if (data.StartsWith("WAK")) { // this is a nasty hack as the file format gets weird around // the effects chain current.CompleteParse(); var currentType = current.ElementName; current = current.ParentElement; var newElement = CreateElement(currentType, current); current.AddElement(newElement); current = newElement; } else // current level { var newElement = CreateElement(data, current); current.AddProperty(data); current.AddElement(newElement); } } return((ReaperProject)current); }
// create new element based on type and parse public ReaperElement CreateElement(string data, ReaperElement parent) { var name = GetElementName(data); Type thisType = null; ReaperElement newElement; _elements.TryGetValue(name, out thisType); if (thisType == null) { newElement = new ReaperElement(); } else { newElement = (ReaperElement)Activator.CreateInstance(thisType); } newElement.ParentElement = parent; newElement.Parse(data); return(newElement); }