public TypeDocumentation(Assembly assembly, Type type, XmlDocumentation documentation, TypeDocumentationOptions options = null) { Guard.Argument(assembly, nameof(assembly)).NotNull(); Guard.Argument(type, nameof(type)).NotNull(); Guard.Argument(documentation, nameof(documentation)).NotNull(); this.assembly = assembly; this.type = type; this.documentation = documentation; this.options = options ?? new TypeDocumentationOptions(); }
static int Main(string[] args) { var app = new CommandLineApplication { Name = "xmldoc2md" }; app.VersionOption("-v|--version", () => { return(string.Format( "Version {0}", Assembly.GetEntryAssembly() .GetCustomAttribute <AssemblyInformationalVersionAttribute>() .InformationalVersion .ToString())); }); app.HelpOption("-?|-h|--help"); CommandArgument srcArg = app.Argument("src", "DLL source path"); CommandArgument outArg = app.Argument("out", "Output directory"); CommandOption indexPageNameOption = app.Option( "--index-page-name", "Name of the index page (default: \"index\")", CommandOptionType.SingleValue); CommandOption examplesPathOption = app.Option( "--examples-path", "Path to the code examples to insert in the documentation", CommandOptionType.SingleValue); CommandOption gitHubPagesOption = app.Option( "--github-pages", "Remove '.md' extension from links for GitHub Pages", CommandOptionType.NoValue); CommandOption backButtonOption = app.Option( "--back-button", "Add a back button on each page", CommandOptionType.NoValue); app.OnExecute(() => { string src = srcArg.Value; string @out = outArg.Value; string indexPageName = indexPageNameOption.Value() ?? "index"; var options = new TypeDocumentationOptions() { ExamplesDirectory = examplesPathOption.Value(), GitHubPages = gitHubPagesOption.HasValue(), BackButton = backButtonOption.HasValue() }; int succeeded = 0; int failed = 0; if (!Directory.Exists(@out)) { Directory.CreateDirectory(@out); } Assembly assembly = new AssemblyLoadContext(src) .LoadFromAssemblyName(new AssemblyName(Path.GetFileNameWithoutExtension(src))); string assemblyName = assembly.GetName().Name; var documentation = new XmlDocumentation(src); Logger.Info($"Generation started: Assembly: {assemblyName}"); IMarkdownDocument indexPage = new MarkdownDocument().AppendHeader(assemblyName, 1); IEnumerable <Type> types = assembly.GetTypes().Where(type => type.IsPublic); IEnumerable <IGrouping <string, Type> > typesByNamespace = types.GroupBy(type => type.Namespace).OrderBy(g => g.Key); foreach (IGrouping <string, Type> namespaceTypes in typesByNamespace) { indexPage.AppendHeader(namespaceTypes.Key, 2); foreach (Type type in namespaceTypes.OrderBy(x => x.Name)) { // exclude delegates if (typeof(Delegate).IsAssignableFrom(type)) { continue; } string fileName = type.GetDocsFileName(); Logger.Info($" {fileName}.md"); indexPage.AppendParagraph(type.GetDocsLink(assembly, noExtension: options.GitHubPages)); try { File.WriteAllText( Path.Combine(@out, $"{fileName}.md"), new TypeDocumentation(assembly, type, documentation, options).ToString() ); succeeded++; } catch (Exception exception) { Logger.Error(exception.Message); failed++; } } } File.WriteAllText(Path.Combine(@out, $"{indexPageName}.md"), indexPage.ToString()); Logger.Info($"Generation: {succeeded} succeeded, {failed} failed"); return(0); }); try { return(app.Execute(args)); } catch (CommandParsingException ex) { Logger.Error(ex.Message); } catch (Exception ex) { Logger.Error("Unable to generate documentation:"); Logger.Error(ex.Message); } return(1); }
static void Main(string[] args) { var app = new CommandLineApplication(); app.Name = "xmldoc2md"; app.VersionOption("-v|--version", () => { return(string.Format( "Version {0}", Assembly.GetEntryAssembly() .GetCustomAttribute <AssemblyInformationalVersionAttribute>() .InformationalVersion .ToString())); }); app.HelpOption("-?|-h|--help"); CommandArgument srcArg = app.Argument("src", "DLL source path"); CommandArgument outArg = app.Argument("out", "Output directory"); CommandOption namespaceMatchOption = app.Option( "--namespace-match <regex>", "Regex pattern to select namespaces", CommandOptionType.SingleValue); CommandOption indexPageNameOption = app.Option( "--index-page-name <regex>", "Name of the index page (default: \"index\")", CommandOptionType.SingleValue); app.OnExecute(() => { string src = srcArg.Value; string @out = outArg.Value; string namespaceMatch = namespaceMatchOption.Value(); string indexPageName = indexPageNameOption.HasValue() ? indexPageNameOption.Value() : "index"; var xmlDocumentation = new XmlDocumentation(src, namespaceMatch); if (!Directory.Exists(@out)) { Directory.CreateDirectory(@out); } var indexBuilder = new MarkdownBuilder(); indexBuilder.Header(1, xmlDocumentation.AssemblyName); foreach (var g in xmlDocumentation.Types.GroupBy(x => x.Namespace).OrderBy(x => x.Key)) { string subDir = Path.Combine(@out, g.Key); if (!Directory.Exists(subDir)) { Directory.CreateDirectory(subDir); } indexBuilder.AppendLine(); indexBuilder.HeaderWithCode(2, g.Key); indexBuilder.AppendLine(); foreach (var item in g.OrderBy(x => x.Name)) { string typeName = item.BeautifyName.Replace("<", "{").Replace(">", "}").Replace(",", "").Replace(" ", "-"); var sb = new StringBuilder(); indexBuilder.ListLink(MarkdownBuilder.MarkdownCodeQuote(item.BeautifyName), g.Key + "/" + typeName); sb.Append(item.ToString()); File.WriteAllText(Path.Combine(@out, g.Key, $"{typeName}.md"), sb.ToString()); } } File.WriteAllText(Path.Combine(@out, $"{indexPageName}.md"), indexBuilder.ToString()); return(0); }); try { app.Execute(args); } catch (CommandParsingException ex) { Console.WriteLine(ex.Message); } catch (Exception ex) { Console.WriteLine("Unable to execute application: {0}", ex.Message); } }