internal IMindMapRoot ParsePageData(XDocument doc) { var styles = doc.Root.Elements(OneNoteElements.QuickStyleDef) .ToDictionary(x => x.Attribute(OneNoteAttributes.Index)?.Value, x => x.Attribute(OneNoteAttributes.Name)?.Value); var headingStyles = styles.Where(x => x.Value.StartsWith("h")) .ToDictionary(x => x.Key, x => int.Parse(x.Value.Substring(1))); bool isHeading(XElement x) { var styleIndex = x.Attribute(OneNoteAttributes.QuickStyleIndex)?.Value ?? ""; return(!headingStyles.ContainsKey(styleIndex)); } var titleElement = doc.Root.Descendants(OneNoteElements.Title).FirstOrDefault(); var title = GetTextContents(titleElement.Descendants(OneNoteElements.T).FirstOrDefault()); var outline = doc.Root.Elements(OneNoteElements.Outline).FirstOrDefault(); if (outline == null) { return(new MindMapRoot(title, Enumerable.Empty <XElement>())); } var children = outline.Elements(OneNoteElements.OeChildren).First().Elements().ToList(); var rootContents = children.TakeWhile(isHeading); var root = new MindMapRoot(title, rootContents); var nodeData = ParseOutlineChildren(children.SkipWhile(x => !isHeading(x)), headingStyles); IMindMapData parent = root; var ancestors = new Stack <IMindMapData>(); ancestors.Push(root); foreach (var(objectId, depth, nodeTitle, contents) in nodeData) { while (ancestors.Peek().Depth >= depth) { parent = ancestors.Pop(); } parent = ancestors.Peek(); var element = new MindMapElement(nodeTitle, parent, new ReactiveList <XElement>(contents), depth, objectId); ancestors.Push(element); } return(root); }
public IMindMapRoot Load() { var(pageId, doc) = GetCurrentPageData(); IMindMapRoot result; if (doc != null) { result = ParsePageData(doc); result.PageId = pageId; } else { result = new MindMapRoot("", Enumerable.Empty <XElement>()); } return(result); }