diff --git a/OliverBooth/Markdown/Callout/CalloutExtension.cs b/OliverBooth/Markdown/Callout/CalloutExtension.cs index 59f85a0..c9731a2 100644 --- a/OliverBooth/Markdown/Callout/CalloutExtension.cs +++ b/OliverBooth/Markdown/Callout/CalloutExtension.cs @@ -26,7 +26,7 @@ internal sealed class CalloutExtension : IMarkdownExtension var blockRenderer = renderer.ObjectRenderers.FindExact(); if (blockRenderer is null) { - renderer.ObjectRenderers.InsertBefore(new CalloutRenderer()); + renderer.ObjectRenderers.InsertBefore(new CalloutRenderer(pipeline)); } } } diff --git a/OliverBooth/Markdown/Callout/CalloutRenderer.cs b/OliverBooth/Markdown/Callout/CalloutRenderer.cs index ee10336..3502df8 100644 --- a/OliverBooth/Markdown/Callout/CalloutRenderer.cs +++ b/OliverBooth/Markdown/Callout/CalloutRenderer.cs @@ -1,4 +1,6 @@ +using HtmlAgilityPack; using Humanizer; +using Markdig; using Markdig.Renderers; using Markdig.Renderers.Html; @@ -9,6 +11,8 @@ namespace OliverBooth.Markdown.Callout; /// internal sealed class CalloutRenderer : HtmlObjectRenderer { + private readonly MarkdownPipeline _pipeline; + private static readonly Dictionary CalloutTypes = new() { ["NOTE"] = "pencil", @@ -27,13 +31,18 @@ internal sealed class CalloutRenderer : HtmlObjectRenderer ["UPDATE"] = "calendar-check", }; + public CalloutRenderer(MarkdownPipeline pipeline) + { + _pipeline = pipeline; + } + /// protected override void Write(HtmlRenderer renderer, CalloutBlock block) { renderer.EnsureLine(); if (renderer.EnableHtmlForBlock) { - RenderAsHtml(renderer, block); + RenderAsHtml(renderer, block, _pipeline); } else { @@ -43,7 +52,7 @@ internal sealed class CalloutRenderer : HtmlObjectRenderer renderer.EnsureLine(); } - private static void RenderAsHtml(HtmlRenderer renderer, CalloutBlock block) + private static void RenderAsHtml(HtmlRenderer renderer, CalloutBlock block, MarkdownPipeline pipeline) { string title = block.Title.Text; ReadOnlySpan type = block.Type.AsSpan(); @@ -62,15 +71,29 @@ internal sealed class CalloutRenderer : HtmlObjectRenderer renderer.Write(lucideClass); renderer.Write("\"> "); - renderer.Write(title.Length == 0 ? typeString.Humanize(LetterCasing.Sentence) : title); - renderer.WriteLine(""); - - renderer.WriteChildren(block); + string calloutTitle = title.Length == 0 ? typeString.Humanize(LetterCasing.Sentence) : title; + WriteTitle(renderer, pipeline, calloutTitle); + renderer.WriteLine(""); + renderer.WriteChildren(block); renderer.WriteLine(""); renderer.EnsureLine(); } + private static void WriteTitle(TextRendererBase renderer, MarkdownPipeline pipeline, string calloutTitle) + { + string html = Markdig.Markdown.ToHtml(calloutTitle, pipeline); + var document = new HtmlDocument(); + document.LoadHtml(html); + if (document.DocumentNode.FirstChild is { Name: "p" } child) + { + // ugly hack to remove

tag generated by Markdig + document.DocumentNode.InnerHtml = child.InnerHtml; + } + + document.Save(renderer.Writer); + } + private static void RenderAsText(HtmlRenderer renderer, CalloutBlock block) { string title = block.Title.Text;