예제 #1
0
 public PrinceController(ManualSectionStore manualSectionStore,
                         IMarkdownRenderer markdownRenderer,
                         CoversheetConfig coversheetConfig)
 {
     _manualSectionStore = manualSectionStore;
     _markdownRenderer   = markdownRenderer;
     _coversheetConfig   = coversheetConfig;
 }
예제 #2
0
        public async Task <IManualWeb> BuildManual()
        {
            var webBuilder = _serviceProvider.GetRequiredService <IWebBuilder>();

            var resourcesDirectory = Path.Combine(_options.ContentDirectory, "resources");

            if (await Task.Run(() => Directory.Exists(resourcesDirectory)))
            {
                webBuilder.RegisterDirectory("/resources", resourcesDirectory);
            }

            webBuilder.RegisterMvc("/", new
            {
                controller = "Home",
                action     = "Index"
            });

            var languages = await _manualTranslations.GetLanguages();

            foreach (var language in languages)
            {
                webBuilder.RegisterMvc($"/prince/{language}/template", new
                {
                    controller = "Prince",
                    action     = "Template",
                    language
                });

                webBuilder.RegisterMvc($"/prince/{language}/output.pdf", new
                {
                    controller = "Prince",
                    action     = "Pdf",
                    language
                });
            }

            // Register our static files.
            webBuilder.RegisterDirectory("/Users/pknopf/git/docgen/src/DocGen.Web.Manual/Internal/Resources/wwwroot");

            CoversheetConfig coversheet = null;
            var sections = new ManualSectionStore();

            foreach (var markdownFile in await Task.Run(() => Directory.GetFiles(_options.ContentDirectory, "*.md")))
            {
                var content = await Task.Run(() => File.ReadAllText(markdownFile));

                var yaml = _yamlParser.ParseYaml(content);
                if (yaml.Yaml == null)
                {
                    yaml = new YamlParseResult(JsonConvert.DeserializeObject("{}"), yaml.Markdown);
                }

                var type = "Content";
                if (!string.IsNullOrEmpty((string)yaml.Yaml.Type))
                {
                    type = yaml.Yaml.Type;
                }

                switch (type)
                {
                case "Coversheet":
                    if (coversheet != null)
                    {
                        throw new DocGenException("Multiple coversheets detected");
                    }
                    coversheet = new CoversheetConfig();
                    coversheet.ProductImage = yaml.Yaml.ProductImage;
                    coversheet.ProductLogo  = yaml.Yaml.ProductLogo;
                    coversheet.Model        = yaml.Yaml.Model;
                    coversheet.Text         = yaml.Yaml.Text;
                    break;

                case "Content":
                    var order = (int?)yaml.Yaml.Order;
                    var title = (string)yaml.Yaml.Title;
                    if (string.IsNullOrEmpty(title))
                    {
                        throw new DocGenException($"The file {markdownFile} needs a title.");
                    }
                    foreach (var language in languages)
                    {
                        sections.AddMarkdown(language,
                                             _translator.Translate(language, title)
                                             , order ?? 0,
                                             _markdownTransformer.TransformMarkdown(
                                                 yaml.Markdown,
                                                 DocgenDefaults.GetDefaultPipeline(),
                                                 x => _translator.Translate(language, x)),
                                             markdownFile);
                    }
                    break;

                default:
                    throw new DocGenException("Unknown contente type");
                }
            }

            if (coversheet == null)
            {
                throw new DocGenException("You must provide a coversheet");
            }

            webBuilder.RegisterServices(services => {
                services.AddMvc();
                services.Configure <RazorViewEngineOptions>(options =>
                {
                    options.FileProviders.Add(new PhysicalFileProvider("/Users/pknopf/git/docgen/src/DocGen.Web.Manual/Internal/Resources"));
                    var templateDirectory = Path.Combine(_options.ContentDirectory, "templates");
                    if (Directory.Exists(templateDirectory))
                    {
                        options.FileProviders.Add(new PhysicalFileProvider(templateDirectory));
                    }
                });
                services.AddSingleton(_translator);
                services.AddSingleton(_manualTranslations);
                services.AddSingleton(sections);
                services.AddSingleton(coversheet);
                services.AddSingleton(_symbolGlossaryStore);
                // These regitrations are so that our controllers can inject core DocGen services.
                DocGen.Core.Services.Register(services);
            });

            return(new ManualWeb(webBuilder));
        }