/// <summary> /// Parses the ListXmlCodeElement in to its correct FlowDocument representation. /// </summary> /// <param name="assembly"></param> /// <param name="element"></param> /// <returns></returns> private static Block ParseList(AssemblyDef assembly, ListXmlCodeElement element) { Block parsedBlock = null; switch (element.ListType) { case Reflection.Comments.ListTypes.Bullet: case Reflection.Comments.ListTypes.Number: List list = new List(); if (element.ListType == Reflection.Comments.ListTypes.Number) { list.InternalList.MarkerStyle = System.Windows.TextMarkerStyle.Decimal; } else { list.InternalList.MarkerStyle = System.Windows.TextMarkerStyle.Disc; } // only use list items, headers, even if defined, are not used in normal lists foreach (ListItemXmlCodeElement listItem in element.Elements.FindAll(e => e is ListItemXmlCodeElement)) { ListItem item = new ListItem(); item.Blocks.AddRange(Parser.Parse(assembly, listItem)); list.InternalList.ListItems.Add(item); } parsedBlock = list; break; case Reflection.Comments.ListTypes.Table: SummaryTable table; // find the header item and use the titles or use defaults ListHeaderXmlCodeElement headerElement = (ListHeaderXmlCodeElement)element.Elements.Find(e => e is ListHeaderXmlCodeElement); if (headerElement != null && headerElement.Elements.Count == 2) { TermXmlCodeElement termElement = (TermXmlCodeElement)headerElement.Elements.Find(e => e is TermXmlCodeElement); DescriptionXmlCodeElement descriptionElement = (DescriptionXmlCodeElement)headerElement.Elements.Find(e => e is DescriptionXmlCodeElement); Section term = new Section(); Section description = new Section(); term.Blocks.AddRange(Parser.Parse(assembly, termElement)); description.Blocks.AddRange(Parser.Parse(assembly, descriptionElement)); table = new SummaryTable(term, description, false); } else { table = new SummaryTable("Term", "Description", false); } foreach (ListItemXmlCodeElement listItem in element.Elements.FindAll(e => e is ListItemXmlCodeElement)) { TermXmlCodeElement termElement = (TermXmlCodeElement)listItem.Elements.Find(e => e is TermXmlCodeElement); DescriptionXmlCodeElement descriptionElement = (DescriptionXmlCodeElement)listItem.Elements.Find(e => e is DescriptionXmlCodeElement); Section term = new Section(); Section description = new Section(); if (termElement != null) { term.Blocks.AddRange(Parser.Parse(assembly, termElement)); } else if (element.Elements != null && element.Elements.Count > 0) { term.Blocks.Add(new Paragraph(new Run(element.Elements[0].Text))); } if (descriptionElement != null) { description.Blocks.AddRange(Parser.Parse(assembly, descriptionElement)); } else if (element.Elements != null && element.Elements.Count > 1) { term.Blocks.Add(new Paragraph(new Run(element.Elements[1].Text))); } table.AddItem(term, description); } parsedBlock = table; break; } return(parsedBlock); }
private void RenderTable(System.Xml.XmlWriter writer) { writer.WriteStartElement("table"); // create the table header ListHeaderXmlCodeElement header = (ListHeaderXmlCodeElement)_element.Elements.Find( e => e.Element == XmlCodeElements.ListHeader); writer.WriteStartElement("header"); if (header != null) { XmlContainerCodeElement description = (XmlContainerCodeElement)_element.Elements.Find( e => e.Element == XmlCodeElements.Description); XmlContainerCodeElement term = (XmlContainerCodeElement)_element.Elements.Find( e => e.Element == XmlCodeElements.Term); writer.WriteStartElement("cell"); if (term != null) { foreach (XmlCodeElement child in term.Elements) { // miss out the listitem and just focus on children this.Serialize(child, writer); } } else { writer.WriteElementString("text", "Term"); } writer.WriteEndElement(); // column writer.WriteStartElement("cell"); if (description != null) { foreach (XmlCodeElement child in description.Elements) { // miss out the listitem and just focus on children Serialize(child, writer); } } else { writer.WriteElementString("text", "Description"); } writer.WriteEndElement(); // column } else { writer.WriteStartElement("cell"); writer.WriteElementString("text", "Term"); writer.WriteEndElement(); // column writer.WriteStartElement("cell"); writer.WriteElementString("text", "Description"); writer.WriteEndElement(); // column } writer.WriteEndElement(); // header // rows List <XmlCodeElement> items = _element.Elements.FindAll(e => e.Element == XmlCodeElements.ListItem); foreach (ListItemXmlCodeElement currentItem in items) { if (currentItem.Elements.Count == 2) { writer.WriteStartElement("row"); XmlContainerCodeElement description = (XmlContainerCodeElement)currentItem.Elements.Find( e => e.Element == XmlCodeElements.Description); XmlContainerCodeElement term = (XmlContainerCodeElement)currentItem.Elements.Find( e => e.Element == XmlCodeElements.Term); writer.WriteStartElement("cell"); if (term != null) { foreach (XmlCodeElement child in term.Elements) { // miss out the listitem and just focus on children Serialize(child, writer); } } writer.WriteEndElement(); writer.WriteStartElement("cell"); if (description != null) { foreach (XmlCodeElement child in description.Elements) { // miss out the listitem and just focus on children Serialize(child, writer); } } writer.WriteEndElement(); writer.WriteEndElement(); // row } } writer.WriteEndElement(); // table }