From 5e91b9b763c628f9ac00bb14abbce9a77c1d98fe Mon Sep 17 00:00:00 2001 From: Michael Naumov Date: Tue, 17 May 2022 16:46:24 -0600 Subject: [PATCH] Add YamlFrontMatterRoundtripRenderer --- .../TestYamlFrontMatterBlock.cs | 25 +++++++++++++++++ src/Markdig.Tests/TestRoundtrip.cs | 2 ++ .../Yaml/YamlFrontMatterExtension.cs | 8 +++--- ...erer.cs => YamlFrontMatterHtmlRenderer.cs} | 2 +- .../Yaml/YamlFrontMatterRoundtripRenderer.cs | 27 +++++++++++++++++++ 5 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 src/Markdig.Tests/RoundtripSpecs/TestYamlFrontMatterBlock.cs rename src/Markdig/Extensions/Yaml/{YamlFrontMatterRenderer.cs => YamlFrontMatterHtmlRenderer.cs} (86%) create mode 100644 src/Markdig/Extensions/Yaml/YamlFrontMatterRoundtripRenderer.cs diff --git a/src/Markdig.Tests/RoundtripSpecs/TestYamlFrontMatterBlock.cs b/src/Markdig.Tests/RoundtripSpecs/TestYamlFrontMatterBlock.cs new file mode 100644 index 000000000..de769c4d8 --- /dev/null +++ b/src/Markdig.Tests/RoundtripSpecs/TestYamlFrontMatterBlock.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Markdig.Renderers.Roundtrip; +using Markdig.Syntax; +using NUnit.Framework; +using static Markdig.Tests.TestRoundtrip; + +namespace Markdig.Tests.RoundtripSpecs +{ + [TestFixture] + public class TestYamlFrontMatterBlock + { + [TestCase("---\nkey1: value1\nkey2: value2\n---\n\nContent\n")] + [TestCase("No front matter")] + [TestCase("Looks like front matter but actually is not\n---\nkey1: value1\nkey2: value2\n---")] + public void FrontMatterBlockIsPreserved(string value) + { + RoundTrip(value); + } + } +} diff --git a/src/Markdig.Tests/TestRoundtrip.cs b/src/Markdig.Tests/TestRoundtrip.cs index 5851e139b..8347eae1c 100644 --- a/src/Markdig.Tests/TestRoundtrip.cs +++ b/src/Markdig.Tests/TestRoundtrip.cs @@ -16,10 +16,12 @@ internal static void RoundTrip(string markdown, string context = null) { var pipelineBuilder = new MarkdownPipelineBuilder(); pipelineBuilder.EnableTrackTrivia(); + pipelineBuilder.UseYamlFrontMatter(); MarkdownPipeline pipeline = pipelineBuilder.Build(); MarkdownDocument markdownDocument = Markdown.Parse(markdown, pipeline); var sw = new StringWriter(); var nr = new RoundtripRenderer(sw); + pipeline.Setup(nr); nr.Write(markdownDocument); diff --git a/src/Markdig/Extensions/Yaml/YamlFrontMatterExtension.cs b/src/Markdig/Extensions/Yaml/YamlFrontMatterExtension.cs index 9cb50a21e..f8144f5e8 100644 --- a/src/Markdig/Extensions/Yaml/YamlFrontMatterExtension.cs +++ b/src/Markdig/Extensions/Yaml/YamlFrontMatterExtension.cs @@ -1,10 +1,9 @@ -// Copyright (c) Alexandre Mutel. All rights reserved. +// Copyright (c) Alexandre Mutel. All rights reserved. // This file is licensed under the BSD-Clause 2 license. // See the license.txt file in the project root for more information. using Markdig.Parsers; using Markdig.Renderers; -using Markdig.Renderers.Html; namespace Markdig.Extensions.Yaml { @@ -24,9 +23,10 @@ public void Setup(MarkdownPipelineBuilder pipeline) public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer) { - if (!renderer.ObjectRenderers.Contains()) + if (!renderer.ObjectRenderers.Contains()) { - renderer.ObjectRenderers.InsertBefore(new YamlFrontMatterRenderer()); + renderer.ObjectRenderers.InsertBefore (new YamlFrontMatterHtmlRenderer()); + renderer.ObjectRenderers.InsertBefore(new YamlFrontMatterRoundtripRenderer()); } } } diff --git a/src/Markdig/Extensions/Yaml/YamlFrontMatterRenderer.cs b/src/Markdig/Extensions/Yaml/YamlFrontMatterHtmlRenderer.cs similarity index 86% rename from src/Markdig/Extensions/Yaml/YamlFrontMatterRenderer.cs rename to src/Markdig/Extensions/Yaml/YamlFrontMatterHtmlRenderer.cs index 1b56042b6..c06493163 100644 --- a/src/Markdig/Extensions/Yaml/YamlFrontMatterRenderer.cs +++ b/src/Markdig/Extensions/Yaml/YamlFrontMatterHtmlRenderer.cs @@ -11,7 +11,7 @@ namespace Markdig.Extensions.Yaml /// Empty renderer for a /// /// - public class YamlFrontMatterRenderer : HtmlObjectRenderer + public class YamlFrontMatterHtmlRenderer : HtmlObjectRenderer { protected override void Write(HtmlRenderer renderer, YamlFrontMatterBlock obj) { diff --git a/src/Markdig/Extensions/Yaml/YamlFrontMatterRoundtripRenderer.cs b/src/Markdig/Extensions/Yaml/YamlFrontMatterRoundtripRenderer.cs new file mode 100644 index 000000000..ed542fc62 --- /dev/null +++ b/src/Markdig/Extensions/Yaml/YamlFrontMatterRoundtripRenderer.cs @@ -0,0 +1,27 @@ +// Copyright (c) Alexandre Mutel. All rights reserved. +// This file is licensed under the BSD-Clause 2 license. +// See the license.txt file in the project root for more information. + +using System; +using Markdig.Renderers; +using Markdig.Renderers.Roundtrip; + +namespace Markdig.Extensions.Yaml +{ + public class YamlFrontMatterRoundtripRenderer : MarkdownObjectRenderer + { + private readonly CodeBlockRenderer _codeBlockRenderer; + + public YamlFrontMatterRoundtripRenderer() + { + _codeBlockRenderer = new CodeBlockRenderer(); + } + + protected override void Write(RoundtripRenderer renderer, YamlFrontMatterBlock obj) + { + renderer.Writer.WriteLine("---"); + _codeBlockRenderer.Write(renderer, obj); + renderer.Writer.WriteLine("---"); + } + } +} \ No newline at end of file