public static void doc_page_event()
        {
            RazorEngine.Razor.SetTemplateService(new RazorEngine.Templating.TemplateService());
            using (var testFolder = DirectoryLifetimeManager.Create())
            {
                var templateDirectory = testFolder.Directory.CreateSubdirectory("templates");
                var outputDirectory = testFolder.Directory.CreateSubdirectory("out");
                File.WriteAllText(
                    Path.Combine(templateDirectory.FullName, "_event.cshtml"),
                    @"<html><h1>@Model.ShortName</h1></html>");
                var apiPageGen = new StaticApiPageGenerator
                {
                    TemplateDirectory = templateDirectory,
                    OutputDirectory = outputDirectory,
                    TargetRepository = CreateTestLibrary1Repository()
                };

                var result = apiPageGen.GenerateForTarget(new CRefIdentifier("E:TestLibrary1.Class1.DoStuff"));

                result.Should().NotBeNull();
                result.Exists.Should().BeTrue();
                File.ReadAllText(result.FullName).Should().Be(@"<html><h1>DoStuff</h1></html>");
            }
        }
        public static void doc_page_link_to_others()
        {
            RazorEngine.Razor.SetTemplateService(new RazorEngine.Templating.TemplateService());
            using (var testFolder = DirectoryLifetimeManager.Create())
            {
                var templateDirectory = testFolder.Directory.CreateSubdirectory("templates");
                var outputDirectory = testFolder.Directory.CreateSubdirectory("out");
                File.WriteAllText(
                    Path.Combine(templateDirectory.FullName, "_type.cshtml"),
            @"@using DuckyDocs.CodeDoc
            @using DuckyDocs.SiteBuilder
            <html><h1>@Model.ShortName</h1>@foreach(var field in Model.Fields.Cast<CodeDocField>()){
            <div><a href=""@(StaticApiPageGenerator.CreateSlugName(field.CRef)).html"">@field.ShortName</a></div>
            }</html>");
                var apiPageGen = new StaticApiPageGenerator
                {
                    TemplateDirectory = templateDirectory,
                    OutputDirectory = outputDirectory,
                    TargetRepository = CreateTestLibrary1Repository()
                };

                var result = apiPageGen.GenerateForTarget(new CRefIdentifier("T:TestLibrary1.Class1"));
                var resultText = File.ReadAllText(result.FullName);

                result.Should().NotBeNull();
                result.Exists.Should().BeTrue();
                resultText.Should().StartWith(@"<html><h1>Class1</h1>");
                resultText.Should().Contain(@"<a href=""TestLibrary1.Class1.SomeField-F.html"">SomeField</a>");
                resultText.Should().EndWith(@"</html>");
            }
        }
        public static void dump_entire_repository()
        {
            RazorEngine.Razor.SetTemplateService(new RazorEngine.Templating.TemplateService());
            using (var testFolder = DirectoryLifetimeManager.Create())
            {
                var templateDirectory = testFolder.Directory.CreateSubdirectory("templates");
                var outputDirectory = testFolder.Directory.CreateSubdirectory("out");
                File.WriteAllText(
                    Path.Combine(templateDirectory.FullName, "_type.cshtml"),
            @"@using DuckyDocs.CodeDoc
            @using DuckyDocs.SiteBuilder
            <html><h1>@Model.ShortName</h1>@foreach(var field in (Model.Fields ?? Enumerable.Empty<ICodeDocMember>()).Cast<CodeDocField>()){
            <div><a href=""@(StaticApiPageGenerator.CreateSlugName(field.CRef)).html"">@field.ShortName</a></div>
            }</html>");
                File.WriteAllText(
                    Path.Combine(templateDirectory.FullName, "_namespace.cshtml"),
            @"@using DuckyDocs.CodeDoc
            @using DuckyDocs.SiteBuilder
            <html><h1>@Model.ShortName</h1>@foreach(var typeCRef in Model.TypeCRefs){
            var typeModel = ViewBag.GetTargetPreviewModel(typeCRef);
            <div><a href=""@(StaticApiPageGenerator.CreateSlugName(typeModel.CRef)).html"">@typeModel.ShortName</a></div>
            }</html>");
                foreach (var fileName in new[] {
                    "_delegate.cshtml",
                    "_method.cshtml",
                    "_field.cshtml",
                    "_property.cshtml",
                    "_event.cshtml"
                }) {
                    File.WriteAllText(
                        Path.Combine(templateDirectory.FullName, fileName),
                        @"<html><h1>@Model.ShortName</h1></html>");
                }

                var apiPageGen = new StaticApiPageGenerator
                {
                    TemplateDirectory = templateDirectory,
                    OutputDirectory = outputDirectory,
                    TargetRepository = CreateTestLibrary1Repository()
                };

                var results = apiPageGen.GenerateForAllTargets();
                var resultShortNames = results.Select(x => x.Name);

                resultShortNames.Should().Contain("InGlobal.Nope-M.html");
                resultShortNames.Should().Contain("-N.html");
                resultShortNames.Should().Contain("Test.Annotations-N.html");
                resultShortNames.Should().Contain("TestLibrary1.Class1.Inner-T.html");
                resultShortNames.Should().Contain("TestLibrary1.PublicExposedTestClass.ProtectedEvent-E.html");
                resultShortNames.Should().Contain("TestLibrary1.ClassWithContracts.Stuff-P.html");
                resultShortNames.Should().Contain("TestLibrary1.Class1.MyFunc-T.html");

                resultShortNames.Any(x => x.StartsWith("TestLibrary1.Class1.TrySomeOutRefStuff-")).Should().BeTrue();
                resultShortNames.Any(x => x.StartsWith("TestLibrary1.Generic1.AMix-")).Should().BeTrue();

                resultShortNames.Should().NotContain("System.Attribute.GetHashCode-M.html");
                resultShortNames.Should().NotContain("System.Object.ToString-M.html");
            }
        }
예제 #4
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;
        }