protected override void OnRefreshDocumentOutline() { base.OnRefreshDocumentOutline(); // Show document headings var parser = new WikitextParser(); var documentText = TextBox.Text; Heading[] headings = null; if (!string.IsNullOrWhiteSpace(documentText)) { var root = parser.Parse(documentText); headings = root.EnumDescendants().OfType <Heading>().ToArray(); } Dispatcher.AutoInvoke(() => { DocumentOutline.Clear(); if (headings == null) { return; } var levelStack = new Stack <Tuple <Heading, DocumentOutlineItem> >(); foreach (var h in headings) { var outline = new DocumentOutlineItem { Text = string.Join(null, h.Inlines).Trim(), OutlineContext = h }; outline.DoubleClick += OutlineItem_DoubleClick; while (levelStack.Count > 0) { var lastLevel = levelStack.Peek().Item1.Level; if (lastLevel < h.Level) { // Append as child item. levelStack.Peek().Item2.Children.Add(outline); goto NEXT; } // Sibling or upper levels. levelStack.Pop(); } // levelStack.Count == 0 DocumentOutline.Add(outline); levelStack.Push(Tuple.Create(h, outline)); NEXT: ; } }); }
/// <summary> /// Parses a DocumentOutline element. /// </summary> DocumentOutline ParseDocumentOutline() { Debug.Assert(reader.Name == "DocumentOutline"); bool isEmptyElement = reader.IsEmptyElement; DocumentOutline documentOutline = new DocumentOutline(); while (MoveToNextAttribute()) { switch (reader.Name) { case "xml:lang": documentOutline.lang = reader.Value; break; default: UnexpectedAttribute(reader.Name); break; } } MoveToNextElement(); return(documentOutline); }