public MarkdownType BuildType(MarkdownType type, MarkdownNamespace namespaceItem, IEnumerable <XmlDocumentComment> comments)
        {
            Constants.Logger?.LogTrace("Building Markdown Item for Type {typeName}", type.Name);
            MarkdownRepo.TryAdd(type);

            type.NamespaceItem = namespaceItem;

            type.Summary = comments.FirstOrDefault(x => x.MemberName == type.Name ||
                                                   x.MemberName.StartsWith(type.Name))?.Summary ?? "";

            Constants.Logger?.LogTrace("Getting Markdown Fields for Type {typeName}", type.Name);
            BuildFields(type, comments, type.GetFields().Together(type.GetStaticFields()).ToArray());

            Constants.Logger?.LogTrace("Getting Markdown Properties for Type {typeName}", type.Name);
            BuildProperties(type, comments, type.GetProperties().Together(type.GetStaticProperties()).ToArray());

            Constants.Logger?.LogTrace("Getting Markdown Methods for Type {typeName}", type.Name);
            BuildMethods(type, comments, type.GetMethods().Together(type.GetStaticMethods()).ToArray());

            Constants.Logger?.LogTrace("Getting Markdown Events for Type {typeName}", type.Name);
            BuildEvents(type, comments, type.GetEvents().Together(type.GetStaticEvents()).ToArray());

            Constants.Logger?.LogTrace("Getting Markdown Constructors for Type {typeName}", type.Name);
            BuildConstructors(type, comments, type.GetConstructors().Together(type.GetStaticConstructors()).ToArray());

            Constants.Logger?.LogTrace("Completed Building Markdown Type {typeName}", type.Name);
            return(type);
        }
        /// <summary>
        /// Builds the page of a MarkdownType and return the rendered markdown
        /// </summary>
        /// <param name="item">The markdown item to be rendered</param>
        /// <returns>The markdown text</returns>
        public string BuildPage(MarkdownType item)
        {
            DefaultTheme.ThemeLogger?.LogDebug("Building Type Page");
            var mb = new MarkdownBuilder();

            mb.HeaderWithCode(1, Cleaner.CreateFullTypeWithLinks(item, item.InternalType, false, false));

            mb.AppendLine();

            item.BuildNamespaceLinks(item.Namespace, mb);

            if (_options.ShowAssembly)
            {
                mb.Append("Assembly: ").AppendLine(item.InternalType.Module.Name).AppendLine();
            }


            bool firstInterface = true;

            foreach (var interfaceItem in item.InternalType.GetInterfaces())
            {
                if (firstInterface)
                {
                    firstInterface = false;
                    mb.Append("Implements ");
                }
                else
                {
                    mb.Append(", ");
                }

                var link = Cleaner.CreateFullTypeWithLinks(item, interfaceItem, false, false);
                if (string.IsNullOrEmpty(link))
                {
                    mb.Link(Cleaner.CleanName(interfaceItem.Name, false, false), "");
                }
                else
                {
                    mb.Append(link);
                }
            }

            if (!firstInterface)
            {
                mb.AppendLine().AppendLine();
            }

            if (!string.IsNullOrEmpty(item.Summary))
            {
                mb.Header(2, "Summary");
                mb.AppendLine(item.Summary);
            }


            mb.AppendLine();
            var typeZeroHeaders = new[] { "Name", "Summary" };
            var typeOneHeaders  = new[] { "Type", "Name", "Summary" };
            var typeTwoHeaders  = new[] { "Return", "Name", "Summary" };

            BuildTable(mb, "Static Constructors", item.GetConstructors(true), typeZeroHeaders, item);
            BuildTable(mb, "Constructors", item.GetConstructors(false), typeZeroHeaders, item);

            BuildTable(mb, "Fields", item.GetFields(false), typeZeroHeaders, item);
            BuildTable(mb, "Properties", item.GetProperties(false), typeZeroHeaders, item);
            BuildTable(mb, "Methods", item.GetMethods(false), typeZeroHeaders, item);
            BuildTable(mb, "Events", item.GetEvents(false), typeZeroHeaders, item);

            BuildTable(mb, "Static Fields", item.GetFields(true), typeZeroHeaders, item);
            BuildTable(mb, "Static Properties", item.GetProperties(true), typeZeroHeaders, item);
            BuildTable(mb, "Static Methods", item.GetMethods(true), typeZeroHeaders, item);
            BuildTable(mb, "Static Events", item.GetEvents(true), typeZeroHeaders, item);

            return(mb.ToString());
        }