コード例 #1
0
        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()}");
        }