private void WriteText(DocWriter writer, AItem item) { string summary = string.Empty; void WriteNodes(IEnumerable <XNode> nodes) { foreach (XNode node in nodes) { switch (node) { case XText text: summary += string.Join(" \n", text.Value.Split('\n')); break; case XElement element: switch (element.Name.LocalName) { case "see": case "seealso": string referenceName = element.GetReferenceName(); summary += _items.TryGetValue(referenceName, out AMemberItem reference) ? (reference is NamespaceItem ? reference.AsLinkWithTarget(_mainName) : reference.AsLink()) : referenceName.Substring(2).AsDotNetApiLink(); break; case "typeparamref": AMemberItem parent = item as AMemberItem ?? item.Parent; GenericItem generic = null; while (parent != null && generic == null) { if (parent is AGenericDocItem genericItem) { generic = Array.Find(genericItem.Generics, i => i.Name == element.GetName()); } parent = parent.Parent; } if (generic == null) { summary += element.GetName(); } else { summary += writer.IsForThis(generic.Parent) ? generic.AsPageLink() : generic.AsLinkWithTarget(); } break; case "paramref": IParameterDocItem parameterItem = (item as IParameterDocItem) ?? (item.Parent as IParameterDocItem); ParameterItem parameter = parameterItem.Parameters.First(i => i.Name == element.GetName()); summary += parameter.AsPageLink(); break; case "c": summary += $"`{element.Value}`"; break; case "code": summary += $"```{element.Value}```\n"; break; case "para": summary += "\n\n"; WriteNodes(element.Nodes()); summary += "\n\n"; break; default: summary += element.ToString(); break; } break; default: throw new Exception($"unhandled node type in summary {node.NodeType}"); } } } WriteNodes(item.Summary.Nodes()); string[] lines = summary.Split('\n'); int startIndex = 0; int firstLine = 0; foreach (string line in lines) { if (!string.IsNullOrWhiteSpace(line)) { startIndex = line.Length - line.TrimStart().Length; break; } ++firstLine; } summary = string.Join(Environment.NewLine, lines.Skip(firstLine).Select(l => l.StartsWith(" ") ? l.Substring(startIndex) : l)); while (summary.EndsWith(Environment.NewLine)) { summary = summary.Substring(0, summary.Length - Environment.NewLine.Length); } writer.WriteLine($"{summary.TrimEnd()}"); }