static int Main(string[] args) { var parsedArgs = ProgramArgs.Parse(args); if (parsedArgs == null) { return (int)ExitCodes.QuackQuackQuaaack; } if (parsedArgs.HelpRequested) { return (int)ExitCodes.LuckyDuck; } if (!parsedArgs.NoSplash) { new Splash().Print(); } if (parsedArgs.OutputFolder == null) { return Error("output folder is required."); } var outputDirectory = new DirectoryInfo(parsedArgs.OutputFolder); if (!outputDirectory.Exists) { outputDirectory.Create(); Thread.Sleep(100); } if (parsedArgs.DocsSources != null && parsedArgs.DocsSources.Count > 0) { var converter = new StaticPageConverter(); foreach (var docSource in parsedArgs.DocsSources) { var request = new StaticPageConverterRequest { Recursive = true, RelativeDestination = outputDirectory.FullName, Source = docSource }; var result = converter.Convert(request).ToList(); ColorConsole.WriteLine("[Complete]: ".Green(), "batch content file".ToQuantity(result.Count)); } } if (parsedArgs.TargetAssemblies != null && parsedArgs.TargetAssemblies.Count > 0) { var targetAssemblies = parsedArgs.TargetAssemblies .Select(f => Assembly.ReflectionOnlyLoadFrom(new FileInfo(f).FullName)) .ToList(); var xmlFiles = (parsedArgs.XmlDocLocations ?? Enumerable.Empty<string>()) .SelectMany(loc => { var fi = new FileInfo(loc); if (fi.Exists) { return new[] { fi }; } var di = new DirectoryInfo(loc); if (di.Exists) { return di.EnumerateFiles("*.xml"); } return Enumerable.Empty<FileInfo>(); }) .Select(fi => new XmlAssemblyDocument(fi.FullName)) .ToList(); var repository = new ReflectionCodeDocMemberRepository( new ReflectionCRefLookup(targetAssemblies), xmlFiles); var supportRepository = new MsdnCodeDocMemberRepository(); var apiOutputDirectory = new DirectoryInfo(Path.Combine(parsedArgs.OutputFolder, "api")); if (!apiOutputDirectory.Exists) { apiOutputDirectory.Create(); Thread.Sleep(100); } var generator = new StaticApiPageGenerator { OutputDirectory = apiOutputDirectory, TemplateDirectory = new DirectoryInfo(parsedArgs.TemplatesDirectory ?? "./"), TargetRepository = repository, SupportingRepository = supportRepository }; var results = generator.GenerateForAllTargets().ToList(); ColorConsole.WriteLine("[Complete]: ".Green(), "api doc file".ToQuantity(results.Count)); } return (int)ExitCodes.LuckyDuck; }
public IEnumerable<StaticPageBuilderResponse> Convert(StaticPageConverterRequest request) { if (request == null) throw new ArgumentNullException("request"); Contract.EndContractBlock(); DirectoryInfo requestSourceRoot; IEnumerable<FileInfo> sourceFiles; var requestSourceFile = new FileInfo(request.Source); if (requestSourceFile.Exists) { requestSourceRoot = requestSourceFile.Directory; sourceFiles = new[] { requestSourceFile }; } else { requestSourceRoot = new DirectoryInfo(request.Source); if (requestSourceRoot.Exists) { var directories = request.Recursive ? SearchAllDirectories(requestSourceRoot) : new[] { requestSourceRoot }; sourceFiles = directories.SelectMany(d => d.EnumerateFiles("*.md")); } else { sourceFiles = Enumerable.Empty<FileInfo>(); } } var templateFile = requestSourceRoot.EnumerateFiles("_template.cshtml").FirstOrDefault(); string razorTemplateCacheKey = null; if (templateFile != null && templateFile.Exists) { razorTemplateCacheKey = templateFile.FullName; Razor.Compile(File.ReadAllText(templateFile.FullName), typeof(TemplateModel), razorTemplateCacheKey); } CommonMarkSettings settings = null; var sourceRootUri = new Uri(requestSourceRoot.FullName + Path.DirectorySeparatorChar); var results = new List<StaticPageBuilderResponse>(); foreach (var sourceFile in sourceFiles) { var localFileUri = new Uri(sourceFile.FullName); var relativeSourceFilePath = sourceRootUri.MakeRelative(localFileUri); if (Path.DirectorySeparatorChar != '/') { relativeSourceFilePath = relativeSourceFilePath.Replace('/', Path.DirectorySeparatorChar); } var relativeTargetFilePath = Path.ChangeExtension(relativeSourceFilePath, "html"); var targetFile = new FileInfo(Path.Combine(request.RelativeDestination, relativeTargetFilePath)); CommonMark.Syntax.Block parsedDocument; using (var sourceStream = File.Open(sourceFile.FullName, FileMode.Open, FileAccess.Read, FileShare.Read)) using (var reader = new StreamReader(sourceStream)) { parsedDocument = CommonMarkConverter.ProcessStage1(reader, settings); } CommonMarkConverter.ProcessStage2(parsedDocument, settings); if (!targetFile.Directory.Exists) { targetFile.Directory.Create(); } using (var targetStream = File.Open(targetFile.FullName, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) using (var writer = new StreamWriter(targetStream)) { if (razorTemplateCacheKey != null) { var markdownText = new StringBuilder(); using (var markdownWriter = new StringWriter(markdownText)) { CommonMarkConverter.ProcessStage3(parsedDocument, markdownWriter, settings); } var htmlResultText = Razor.Run(razorTemplateCacheKey, new TemplateModel{ ContentHtml = markdownText.ToString() }); writer.Write(htmlResultText); } else { CommonMarkConverter.ProcessStage3(parsedDocument, writer, settings); } } results.Add(new StaticPageBuilderResponse { ResultFile = targetFile }); } return results; }