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)); }
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); } }
internal InvokePipeline(PipelineContext context, Source[] source) : base(context, source) { _Runspace = new RunspaceContext(Context); _Builder = HostHelper.GetDocumentBuilder(_Runspace, Source); _Processor = new MarkdownProcessor(); }
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 }
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); }
public TimelinePostController(ITimelineService timelineService, ITimelinePostService timelinePostService, IGenericMapper mapper, MarkdownProcessor markdownProcessor) { _timelineService = timelineService; _postService = timelinePostService; _mapper = mapper; _markdownProcessor = markdownProcessor; }
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); }
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>"); }
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); }
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__"); }
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_"); }
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>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>"); }
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); }
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"); }
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); }
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?"); }
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); }
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); }
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); }
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); } } }
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); }
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()); }
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); }
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")); } }
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); }
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 }
// 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())); }
private void Prepare() { _Runspace = new RunspaceContext(Context, Source); _Builder = HostHelper.GetDocumentBuilder(_Runspace, Source); _Processor = new MarkdownProcessor(); }
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); }
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); }
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); }
/// <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" }); }); }