示例#1
0
        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;
        }