Exemplo n.º 1
0
    public static Task VerifySnippets(
        this VerifyBase verifyBase,
        string markdownContent,
        List <Snippet> availableSnippets,
        List <string> snippetSourceFiles,
        IReadOnlyList <Include>?includes = null)
    {
        if (includes == null)
        {
            includes = Array.Empty <Include>();
        }

        var markdownProcessor = new MarkdownProcessor(
            snippets: availableSnippets.ToDictionary(),
            appendSnippetGroup: SimpleSnippetMarkdownHandling.AppendGroup,
            snippetSourceFiles: snippetSourceFiles,
            tocLevel: 2,
            writeHeader: true,
            includes: includes,
            rootDirectory: "c:/root");
        var stringBuilder = new StringBuilder();

        using var reader = new StringReader(markdownContent);
        using var writer = new StringWriter(stringBuilder);
        var processResult = markdownProcessor.Apply(reader, writer, "sourceFile");
        var output        = new
        {
            processResult.MissingSnippets,
            processResult.UsedSnippets,
            content = stringBuilder.ToString()
        };

        return(verifyBase.Verify(output));
    }
Exemplo n.º 2
0
    public async Task Run()
    {
        var root = GitRepoDirectoryFinder.FindForFilePath();

        var finder             = new FileFinder();
        var addinPath          = Path.Combine(root, "BasicFodyAddin");
        var snippetSourceFiles = finder.FindFiles(
            Path.Combine(root, "src/Docs"),
            addinPath);
        var snippets = FileSnippetExtractor.Read(snippetSourceFiles).ToList();

        await snippets.AppendUrlsAsSnippets(
            "https://raw.githubusercontent.com/Fody/Fody/master/FodyPackaging/Weaver.props",
            "https://raw.githubusercontent.com/Fody/Fody/master/FodyPackaging/build/FodyPackaging.props",
            "https://raw.githubusercontent.com/Fody/Fody/master/FodyPackaging/build/FodyPackaging.targets");


        var handling      = new GitHubSnippetMarkdownHandling(root);
        var processor     = new MarkdownProcessor(snippets, handling.AppendGroup, snippetSourceFiles);
        var sourceMdFiles = Directory.EnumerateFiles(Path.Combine(root, "pages/source"), "*.md");
        var pagesDir      = Path.Combine(root, "pages");

        PurgeDirectory(pagesDir);
        foreach (var sourceFile in sourceMdFiles)
        {
            ProcessFile(sourceFile, processor, pagesDir);
        }
    }
Exemplo n.º 3
0
 internal InvokePipeline(PipelineContext context, Source[] source)
     : base(context, source)
 {
     _Runspace  = new RunspaceContext(Context);
     _Builder   = HostHelper.GetDocumentBuilder(_Runspace, Source);
     _Processor = new MarkdownProcessor();
 }
Exemplo n.º 4
0
    void Basic()
    {
        #region markdownProcessing

        // setup version convention and extract snippets from files
        var snippetExtractor = new DirectorySnippetExtractor(
            directoryFilter: x => true,
            fileFilter: s => s.EndsWith(".vm") || s.EndsWith(".cs"));
        var snippets = snippetExtractor.ReadSnippets(@"C:\path");

        // Merge with some markdown text
        var markdownProcessor = new MarkdownProcessor(snippets, SimpleSnippetMarkdownHandling.AppendGroup);

        using (var reader = File.OpenText(@"C:\path\inputMarkdownFile.md"))
            using (var writer = File.CreateText(@"C:\path\outputMarkdownFile.md"))
            {
                var result = markdownProcessor.Apply(reader, writer);

                // snippets that the markdown file expected but did not exist in the input snippets
                var missingSnippets = result.MissingSnippets;

                // snippets that the markdown file used
                var usedSnippets = result.UsedSnippets;
            }

        #endregion
    }
Exemplo n.º 5
0
        public void ContributorsAreAppendedForAWellFormedContributorsTemplate()
        {
            var inputLines = new[] {
                "# Awesome App",
                "",
                "This app is lovingly crafted by lots of awesome folks!",
                "",
                "## Contributors",
                "",
                "[//]: # (ThankYouBlockStart)",
                "[//]: # \"ThankYouTemplate:- @name)",
                "- gandalf",
                "[//]: # (ThankYouBlockEnd)"
            };
            var contributors = new[] { new Contributor("boromir", "twitch") };


            var outputLines = MarkdownProcessor.AddContributorsToMarkdownFile(inputLines, contributors).ToArray();

            var expectedOutputLines = new[] {
                "# Awesome App",
                "",
                "This app is lovingly crafted by lots of awesome folks!",
                "",
                "## Contributors",
                "",
                "[//]: # (ThankYouBlockStart)",
                "[//]: # \"ThankYouTemplate:- @name)",
                "- gandalf",
                "- boromir",
                "[//]: # (ThankYouBlockEnd)"
            };

            AssertCollectionsAreEqual(expectedOutputLines, outputLines);
        }
Exemplo n.º 6
0
 public TimelinePostController(ITimelineService timelineService, ITimelinePostService timelinePostService, IGenericMapper mapper, MarkdownProcessor markdownProcessor)
 {
     _timelineService   = timelineService;
     _postService       = timelinePostService;
     _mapper            = mapper;
     _markdownProcessor = markdownProcessor;
 }
Exemplo n.º 7
0
        public void Convert_GivenMarkdown_OutputsHtml()
        {
            var processor = new MarkdownProcessor("pandoc");

            var result = processor.Convert("# Hello World", Settings.Default);

            AssertHelper.AreEqualIgnoringNewLines("<h1 id=\"hello-world\">Hello World</h1>\r\n", result);
        }
Exemplo n.º 8
0
        public void RemoveSlashes_on_text_with_slashes_and_tokens_should_remove_slashes_before_tokens()
        {
            var processor = new MarkdownProcessor(new HtmlFormatter());
            string data = @"\A\_\b\\\`\C";

            var result = processor.RemoveSlashes(data);
            Assert.AreEqual(@"\A_\b\\`\C", result);
        }
        public void FixParagraph_on_unclosed_backtick_and_text_inside_underscore_should_give_text_inside_em_tag()
        {
            var data = "A`B_C_";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("A`B<em>C</em>", result);
        }
        public void FixParagraph_on_text_with_paired_underscore_and_paired_double_underscores_should_give_text_with_em_and_strong_tags()
        {
            var data = "_A__B__C_";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "<em>A<strong>B</strong>C</em>");
        }
Exemplo n.º 11
0
        public void GetParagraphs_on_string_with_4_enters_and_text_should_give_2_paragraphs()
        {
            string data = "Paragraph1\r\n \r\n \r\n \r\nParagraph2";
            var processor = new MarkdownProcessor(new HtmlFormatter());
            var expectedResult = new List<string>() { "Paragraph1", "Paragraph2" };

            var result = processor.GetParagraphs(data);
            CollectionAssert.AreEqual(expectedResult, result);
        }
        public void FixParagraph_on_text_with_one_backtick_should_give_the_same_text()
        {
            string data = "`A";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("`A", result);
        }
Exemplo n.º 13
0
        public void GetParagraphs_on_text_with_one_enter_should_give_one_paragraph()
        {
            string data = "A\r\n B";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.GetParagraphs(data);

            Assert.AreEqual(1, result.Length);
        }
        public void FixParagraph_on_digits_inside_underscores_should_give_same_text()
        {
            var data = "__1__ __222__";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "__1__ __222__");
        }
Exemplo n.º 15
0
        public void Convert_BulletedList_OutputsCorrectHtml()
        {
            var markdown = new MarkdownProcessor();
            var result   = markdown.Convert("- I'm a list item.\n- I'm another one.", Settings.Default);

            AssertHelper.AreEqualIgnoringNewLines(
                "<ul>\r\n<li>I’m a list item.</li>\r\n<li>I’m another one.</li>\r\n</ul>\r\n",
                result);
        }
        public void FixParagraph_on_text_with_not_closed_backtick_and_double_underscore_should_give()
        {
            var data = "A`B__C__";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("A`B<strong>C</strong>", result);
        }
        public void FixParagraph_on_text_around_double_unbderscore_should_give_text_inside_strong_tags()
        {
            var data = "__A__";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "<strong>A</strong>");
        }
        public void FixParagraph_on_digits_with_letters_inside_underscores_should_give_text_inside_em_tags()
        {
            string data = "_123ABC_";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("<em>123ABC</em>", result);
        }
        public void FixParagraph_on_text_inside_screened_underscores_give_text_inside_underscores()
        {
            var data = "\\_A\\_";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "_A_");
        }
Exemplo n.º 20
0
        public void GetParagraphs_on_text_with_2_enters_and_spaces_should_give_2_paragraphs()
        {
            string data = "A\r\n    \r\nB";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.GetParagraphs(data);

            Assert.AreEqual(result.Length, 2);
        }
        public void FixParagraph_on_digits_inside_underscores_should_give_the_same_text()
        {
            string data = "_123_";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("_123_", result);
        }
        public void FixParagraph_on_text_inside_underscores_inside_backtick_should_give_text_inside_underscores_and_code()
        {
            var data = "`A_B_C`";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "<code>A_B_C</code>");
        }
        public void FixParagraph_on_text_with_more_sign_should_give_text_with_amp_gt()
        {
            string data = @"A\>B";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("A&gt;B", result);
        }
        public void FixParagraph_on_text_inside_underscores_should_give_text_inside()
        {
            var data = "_A_";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "<em>A</em>");
        }
Exemplo n.º 25
0
 internal InvokePipeline(PipelineContext context, Source[] source)
     : base(context, source)
 {
     _Runspace = new RunspaceContext(Context);
     HostHelper.ImportResource(Source, _Runspace);
     _Builder   = HostHelper.GetDocumentBuilder(_Runspace, Source);
     _Processor = new MarkdownProcessor();
     _Completed = new List <IDocumentResult>();
 }
        public void FixParagraph_on_text_around_double_unbderscore_with_inside_backticks_should_not_give_text_inside_code_tags_without_strong_tags()
        {
            var data = "`A__B__C`";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "<code>A__B__C</code>");
        }
        public void FixParagraph_on_text_with_screening_tokens_should_give_same_text()
        {
            var data = "\\_\\_A\\_\\_";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "__A__");
        }
        public void FixParagraph_on_text_inside_screened_backticks_should_give_text_inside_backticks()
        {
            var data = "\\`A\\`";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual(result, "`A`");
        }
        public void FixParagraph_on_text_with_unpaired_backticks_and_paired_underscores_and_double_underscores_should_give_text_with_em_and_strong_tags()
        {
            var data = "A`B_C_D__E__F";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("A`B<em>C</em>D<strong>E</strong>F", result);
        }
Exemplo n.º 30
0
        public void GetParagraps_on_text_with_2_enters_and_spaces_should_give_right_text()
        {
            string data = "A\r\n    \r\nB";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.GetParagraphs(data);

            Assert.AreEqual(result[0], "A");
            Assert.AreEqual(result[1], "B");
        }
Exemplo n.º 31
0
        public void GetTokens_on_text_with_tokens_should_give_right_tokens()
        {
            string data = "a_b__c\\d`e";
            var expectedResult = new[] {"a", "_", "b", "__", "c", "\\", "d", "`", "e"};
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.GetTokens(data);

            CollectionAssert.AreEqual(expectedResult, result);
        }
Exemplo n.º 32
0
        public void Convert_ExecutableNotFound_ThrowsNiceError()
        {
            string executable = Guid.NewGuid().ToString();
            var    processor  = new MarkdownProcessor(executable);

            var ex = Assert.ThrowsException <ErrorMessageException>(() =>
                                                                    processor.Convert("# Hello World", Settings.Default)
                                                                    );

            StringAssert.Contains(ex.Message, $"Could not find {executable} on the path. Is it installed?");
        }
Exemplo n.º 33
0
        public void FilesWithNoTemplateAreNotChanged()
        {
            var inputLines = new[] {
                "# Secret App",
                "",
                "This is a secret app with no contributors."
            };
            var contributors = new[] { new Contributor("new", "twitch") };

            var outputLines = MarkdownProcessor.AddContributorsToMarkdownFile(inputLines, contributors).ToArray();

            AssertCollectionsAreEqual(inputLines, outputLines);
        }
Exemplo n.º 34
0
        public void FormatToken_ReturnStrongFormattedToken_WhenTokenContainsOneStrongTag()
        {
            var mark          = new StrongMark();
            var expectedToken = new TokenMd("\\<strong>12345\\</strong>", mark);
            var tags          = new Dictionary <Mark, IMarkProcessor>();
            var tokens        = new List <TokenMd>();

            tokens.Add(new TokenMd("__12345__", mark));
            var processor = new MarkdownProcessor(tags);

            var formattedTokens = processor.FormatTokens(tokens);

            formattedTokens.First().Token.Should().BeEquivalentTo(expectedToken.Token);
        }
Exemplo n.º 35
0
        public void FormatToken_ReturnItalicFormattedToken_WhenTokenContainsOneItalicTag()
        {
            var MP            = new ItalicProcessor();
            var mark          = new ItalicMark();
            var expectedToken = new TokenMd("\\<em>12345\\</em>", mark);
            var tags          = new Dictionary <Mark, IMarkProcessor>();
            var tokens        = new List <TokenMd>();

            tokens.Add(new TokenMd("_12345_", mark));
            var processor = new MarkdownProcessor(tags);

            var formattedTokens = processor.FormatTokens(tokens);

            formattedTokens.First().Token.Should().BeEquivalentTo(expectedToken.Token);
        }
Exemplo n.º 36
0
    static void ProcessFile(string sourceFile, MarkdownProcessor markdownProcessor, string pagesDir)
    {
        var target = Path.Combine(pagesDir, Path.GetFileName(sourceFile));

        using (var reader = File.OpenText(sourceFile))
            using (var writer = File.CreateText(target))
            {
                var processResult = markdownProcessor.Apply(reader, writer);
                var missing       = processResult.MissingSnippets;
                if (missing.Any())
                {
                    throw new MissingSnippetsException(missing);
                }
            }
    }
Exemplo n.º 37
0
        public void FormatToken_ReturnHeadFormattedToken_WhenTokenContainsOneHeadTag()
        {
            var MP            = new HeadProcessor();
            var mark          = new HeadMark();
            var expectedToken = new TokenMd("\\<h1>12345\\</h1>", mark);
            var tags          = new Dictionary <Mark, IMarkProcessor>();
            //tags.Add(mark, MP);
            var tokens = new List <TokenMd>();

            tokens.Add(new TokenMd("#12345", mark));
            var processor = new MarkdownProcessor(tags);

            var formattedTokens = processor.FormatTokens(tokens);

            formattedTokens.First().Token.Should().BeEquivalentTo(expectedToken.Token);
        }
Exemplo n.º 38
0
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                _Processor = null;
                if (_Builder != null)
                {
                    for (var i = 0; i < _Builder.Length; i++)
                    {
                        _Builder[i].Dispose();
                    }

                    _Builder = null;
                }
                _Runspace.Dispose();
                _Runspace = null;
            }
            base.Dispose(disposing);
        }
        public async Task Compile_Success()
        {
            var processor = new MarkdownProcessor();
            var pipeline  = new Mock <IAssetPipeline>().SetupAllProperties();
            var context   = new Mock <IAssetContext>().SetupAllProperties();

            context.Object.Content = new Dictionary <string, byte[]> {
                { "/file.md", "# foo".AsByteArray() },
            };

            context.Setup(s => s.HttpContext.RequestServices.GetService(typeof(IAssetPipeline)))
            .Returns(pipeline.Object);

            await processor.ExecuteAsync(context.Object);

            var result = context.Object.Content.First().Value;

            Assert.Equal("<h1 id=\"foo\">foo</h1>\n", result.AsString());
        }
Exemplo n.º 40
0
        public void ContributorsThatDifferOnlyInCaseAreConsideredDuplicates()
        {
            var inputLines = new[] {
                "# Awesome App",
                "",
                "This app is lovingly crafted by lots of awesome folks!",
                "",
                "## Contributors",
                "",
                "[//]: # (ThankYouBlockStart)",
                "[//]: # \"ThankYouTemplate:- @name)",
                "- frodo",
                "[//]: # (ThankYouBlockEnd)"
            };
            var contributors = new[] { "Frodo", "froDo" };

            var outputLines = MarkdownProcessor.AddContributorsToMarkdownFile(inputLines, contributors).ToArray();

            AssertCollectionsAreEqual(inputLines, outputLines);
        }
Exemplo n.º 41
0
    public static void Verify(string markdownContent, List <Snippet> availableSnippets)
    {
        var markdownProcessor = new MarkdownProcessor(
            snippets: availableSnippets,
            appendSnippetGroup: SimpleSnippetMarkdownHandling.AppendGroup);
        var stringBuilder = new StringBuilder();

        using (var reader = new StringReader(markdownContent))
            using (var writer = new StringWriter(stringBuilder))
            {
                var processResult = markdownProcessor.Apply(reader, writer);
                var output        = new
                {
                    processResult.MissingSnippets,
                    processResult.UsedSnippets,
                    content = stringBuilder.ToString()
                };
                ObjectApprover.VerifyWithJson(output, s => s.Replace("\\r\\n", "\r\n"));
            }
    }
Exemplo n.º 42
0
        public void DuplicateContributorsAreNotAdded()
        {
            var inputLines = new[] {
                "# Awesome App",
                "",
                "This app is lovingly crafted by lots of awesome folks!",
                "",
                "## Contributors",
                "",
                "[//]: # (ThankYouBlockStart)",
                "[//]: # \"ThankYouTemplate:- @name)",
                "- frodo",
                "[//]: # (ThankYouBlockEnd)"
            };
            var contributors = new[] { new Contributor("frodo", "twitch") };


            var outputLines = MarkdownProcessor.AddContributorsToMarkdownFile(inputLines, contributors).ToArray();

            AssertCollectionsAreEqual(inputLines, outputLines);
        }
Exemplo n.º 43
0
    void Basic()
    {
        #region markdownProcessingSimple

        var directory = @"C:\path";

        // extract snippets from files
        var snippetExtractor = new DirectorySnippetExtractor();
        var snippets         = snippetExtractor.ReadSnippets(directory);

        // extract includes from files
        var includeFinder = new IncludeFinder();
        var includes      = includeFinder.ReadIncludes(directory);

        // Merge with some markdown text
        var markdownProcessor = new MarkdownProcessor(
            convention: DocumentConvention.SourceTransform,
            snippets: snippets.Lookup,
            includes: includes,
            appendSnippets: SimpleSnippetMarkdownHandling.Append,
            snippetSourceFiles: new List <string>(),
            tocLevel: 2,
            writeHeader: true,
            rootDirectory: directory,
            validateContent: true);

        var path = @"C:\path\inputMarkdownFile.md";
        using var reader = File.OpenText(path);
        using var writer = File.CreateText(@"C:\path\outputMarkdownFile.md");
        var result = markdownProcessor.Apply(reader, writer, path);
        // snippets that the markdown file expected but did not exist in the input snippets
        var missingSnippets = result.MissingSnippets;

        // snippets that the markdown file used
        var usedSnippets = result.UsedSnippets;

        #endregion
    }
Exemplo n.º 44
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient <IRecipePresenter, RecipePresenter>();
            services.AddTransient <IMetadataPresenter, MetadataPresenter>();
            services.AddTransient <IParser, Parser>();
            services.AddTransient <IDomainSelectorProvider, DomainSelectorProvider>();
            var markdownGenerator = new MarkdownGenerator(new TemplateProvider("handlebars-templates/recipe-template.handlebars"));
            var markdownProcessor = new MarkdownProcessor();

            services.AddControllers((options) =>
            {
                options.RespectBrowserAcceptHeader = true;
                options.ReturnHttpNotAcceptable    = true;

                options.OutputFormatters.Insert(0, new MarkdownOutputFormatter(markdownGenerator, markdownProcessor));
            });

            services.AddOpenApiDocument();

            services.AddHealthChecks();
            // In production, the React files will be served from this directory
            // services.AddSpaStaticFiles(configuration => configuration.RootPath = "ClientApp/build");
        }
 public void ShouldTransformMarkdownToHtml(string input, string expectedOutput)
 {
     var proc = new MarkdownProcessor();
       Assert.That(proc.Process(input).StripReturn(), Is.EqualTo(expectedOutput.StripReturn()));
 }
Exemplo n.º 46
0
 private void Prepare()
 {
     _Runspace  = new RunspaceContext(Context, Source);
     _Builder   = HostHelper.GetDocumentBuilder(_Runspace, Source);
     _Processor = new MarkdownProcessor();
 }
Exemplo n.º 47
0
        public void ReverseStackToToken_on_stack_with_token_and_two_texts_should_give_list_of_tokens_in_right_order()
        {
            var stack = new Stack<string>();
            stack.Push("__");
            stack.Push("text1");
            stack.Push("text2");
            var expectedTokens = new List<string>() { "__", "text1", "text2", "__" };

            var processor = new MarkdownProcessor(new HtmlFormatter());
            var result = processor.ReverseStackToToken(ref stack, "__");

            CollectionAssert.AreEqual(expectedTokens, result);
        }
Exemplo n.º 48
0
 public void ShouldReturnEmptyString()
 {
     var proc = new MarkdownProcessor();
       Assert.That(proc.Process(null), Is.EqualTo(string.Empty));
 }
        public void FixParagraph_on_text_with_underscore_and_double_underscore_on_different_sides_should_give_the_same_text()
        {
            string data = "_A__";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("_A__", result);
        }
Exemplo n.º 50
0
 public FileGenerator(TemplateProcessor templater, MarkdownProcessor markdown)
 {
     this.templater = templater;
     this.markdown  = markdown;
 }
        public void FixParagraph_on_text_with_one_underscore_should_not_give_em_tag()
        {
            string data = "_ABC";
            var processor = new MarkdownProcessor(new HtmlFormatter());

            var result = processor.FixParagraph(data);

            Assert.AreEqual("_ABC", result);
        }
Exemplo n.º 52
0
        /// <summary>
        /// Configuration for services.
        /// </summary>
        /// <param name="services">The services collection.</param>
        public void ConfigureServices(IServiceCollection services)
        {
            var constr       = this.Configuration.GetConnectionString("default");
            var imageSection = this.Configuration.GetSection("image");

            var authDataLayer = CatiDataLayerFactory.CreateAuthDataLayer(constr);
            var catiData      = CatiDataLayerFactory.CreateDataLayer(constr);
            var imageData     = CatiDataLayerFactory.CreateImageDataLayer(constr);

            var storageConnection = this.Configuration.GetConnectionString("images");

            var imageWidths   = imageSection.GetSection("widths").Get <int[]>();
            var imageUploader = ImageUploaderFactory.Create(imageData, storageConnection, imageWidths);

            var trace = new WebAppTrace(this.loggerFactory);

            trace.TraceInfo("Logger has been initialized.");


            var contentTransformer = new MarkdownProcessor();
            var postTranslator     = PostTranslatorFactory.Create(authDataLayer, contentTransformer, imageData, imageUploader);

            // Add the data layers.
            services.AddSingleton <IProgramTrace>(trace);
            services.AddSingleton <ICatiDataLayer>(catiData);
            services.AddSingleton <ICatiAuthDataLayer>(authDataLayer);
            services.AddSingleton <IPostTranslator>(postTranslator);
            services.AddSingleton <ICatiImageDataLayer>(imageData);
            services.AddSingleton <IContentTransformer>(contentTransformer);
            services.AddSingleton <IImageUploader>(imageUploader);
            services.AddSingleton <IAuthorizationHandler, DefaultAuthorizationHandler>().AddAuthorization(
                options =>
            {
                options.AddPolicy("default", policy => policy.Requirements.Add(new DefaultAuthorizationRequirement()));
            });

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(
                config =>
            {
                config.Cookie.HttpOnly = true;
                //config.Cookie.Domain = "caticake.azurewebsites.net";
                config.Cookie.Name              = "CatiCookie";
                config.Cookie.SameSite          = SameSiteMode.None;
                config.Cookie.SecurePolicy      = CookieSecurePolicy.Always;
                config.Cookie.Path              = "";
                config.Events.OnRedirectToLogin = options =>
                {
                    options.Response.StatusCode = 401;
                    return(Task.CompletedTask);
                };
                config.Events.OnRedirectToAccessDenied = options =>
                {
                    options.Response.StatusCode = 401;
                    return(Task.CompletedTask);
                };
                config.Events.OnRedirectToReturnUrl = options =>
                {
                    options.Response.StatusCode = 401;
                    return(Task.CompletedTask);
                };
            });

            services.AddCors(
                options =>
            {
                options.AddPolicy(
                    "default",
                    policy =>
                {
                    policy.AllowAnyHeader();
                    policy.AllowAnyMethod();
                    policy.AllowCredentials();
                    policy.AllowAnyOrigin();
                });
            });

            services.AddMvc(
                config =>
            {
                // config.Filters.Add(new AuthorizationFilter(authDataLayer));
                config.Filters.Add(new CatiExceptionFilter());
                config.Filters.Add(new ValidationFilter());
            });

            // Add the documentation
            services.AddSwaggerGen(
                config =>
            {
                config.SwaggerDoc("v1", new Info {
                    Title = "Cati Lyfe Api", Version = "0.0.0.0.0.0.1"
                });
            });
        }