Пример #1
0
        /// <summary>
        /// Mains the specified arguments.
        /// </summary>
        /// <param name="args">The arguments.</param>
        static int Main(string[] args)
        {
            if (AppDomain.CurrentDomain.IsDefaultAppDomain())
            {
                return(RunInSecondAppDomain());
            }

            System.Console.WriteLine("Sprint v.1.0 - Static Site Generator for Razor and markdown");
            System.Console.WriteLine("Created by Pedro Fernandes @ Patreo");
            System.Console.WriteLine("-----------------------------------------------------------");
            System.Console.WriteLine("");
            System.Console.WriteLine("Command line parameters:");
            System.Console.WriteLine("  -o | -out: Output folder");
            System.Console.WriteLine("  -t | -templates: Template folder where contains razor and assets files");
            System.Console.WriteLine("");

            CommandLineArgs _args = new CommandLineArgs(args);

            if (_args.TryGetValue("out", out string outputDir))
            {
                OutputFolder = outputDir;
            }
            else
            {
                OutputFolder = Consts.OutputFolder;
            }

            if (_args.TryGetValue("template", out string templateDir))
            {
                TemplateFolder = templateDir;
            }
            else
            {
                TemplateFolder = Consts.TemplateFolder;
            }

            ModulePresenter presenter = new ModulePresenter();

            presenter.Initialize();

            // Create output folder
            System.Console.Write("Creating output folder... ");
            Directories.CreateDirectory(OutputFolder);
            System.Console.WriteLine(Files.GetFileInfo(OutputFolder).FullName);

            // Copy all assets to output folder
            System.Console.Write("Copying assets folder to output folder... ");
            AssetsCopier copier = new AssetsCopier(Path.Combine(TemplateFolder, Consts.AssetsFolder));

            foreach (IModuleInfo module in presenter.GetModulesByType(ModuleType.AssetsFolder))
            {
                try
                {
                    module.Execute(new ModuleParameter
                    {
                        Folder = copier.AssetsFolder
                    });
                }
                catch (Exception)
                {
                    System.Console.WriteLine("");
                    System.Console.WriteLine($"Failed at {module.GetType().FullName} running { copier.AssetsFolder}");
                    System.Console.WriteLine("");
                }
            }

            copier.CopyTo(Path.Combine(OutputFolder, Consts.AssetsFolder));

            foreach (var fileInfo in Directories.FileList(Path.Combine(OutputFolder, Consts.AssetsFolder)))
            {
                foreach (IModuleInfo module in presenter.GetModulesByType(ModuleType.AssetsFile))
                {
                    try
                    {
                        module.Execute(new ModuleParameter
                        {
                            Folder   = fileInfo.Directory.FullName,
                            Filename = fileInfo.FullName
                        });
                    }
                    catch (Exception)
                    {
                        System.Console.WriteLine("");
                        System.Console.WriteLine($"Failed at {module.GetType().FullName} running {fileInfo.FullName}");
                        System.Console.WriteLine("");
                    }
                }
            }

            System.Console.WriteLine(System.IO.Path.Combine(Files.GetFileInfo(OutputFolder).FullName, Consts.AssetsFolder));

            // Initialize render
            System.Console.WriteLine("Starting rendering content...");
            IGenerator generator = new RazorGenerator(new DelegateTemplateManager(name =>
            {
                return(Files.ReadAllText(Path.Combine(TemplateFolder, name)));
            }));

            // Generate pages and posts
            foreach (IModuleInfo module in presenter.GetModulesByType(ModuleType.ProcessingStarted))
            {
                try
                {
                    module.Execute(new ModuleParameter
                    {
                        Folder = OutputFolder
                    });
                }
                catch (Exception)
                {
                    System.Console.WriteLine("");
                    System.Console.WriteLine($"Failed at {module.GetType().FullName} running {OutputFolder}");
                    System.Console.WriteLine("");
                }
            }

            GenerateOutput(presenter, generator, new GenericRepository());
            GenerateOutput(presenter, generator, new PageRepository());
            GenerateOutput(presenter, generator, new PostRepository());

            foreach (IModuleInfo module in presenter.GetModulesByType(ModuleType.ProcessingEnded))
            {
                try
                {
                    module.Execute(new ModuleParameter
                    {
                        Folder = OutputFolder
                    });
                }
                catch (Exception)
                {
                    System.Console.WriteLine("");
                    System.Console.WriteLine($"Failed at {module.GetType().FullName} running {OutputFolder}");
                    System.Console.WriteLine("");
                }
            }

            System.Console.WriteLine("");
            System.Console.WriteLine("Done.");
            System.Console.WriteLine("Thanks for your patience.");

            return(0);
        }