feat: allow markdown in callout titles

This commit is contained in:
Oliver Booth 2024-05-04 00:27:17 +01:00
parent 01031057e0
commit 35a82a9663
Signed by: oliverbooth
GPG Key ID: E60B570D1B7557B5
2 changed files with 30 additions and 7 deletions

View File

@ -26,7 +26,7 @@ internal sealed class CalloutExtension : IMarkdownExtension
var blockRenderer = renderer.ObjectRenderers.FindExact<CalloutRenderer>(); var blockRenderer = renderer.ObjectRenderers.FindExact<CalloutRenderer>();
if (blockRenderer is null) if (blockRenderer is null)
{ {
renderer.ObjectRenderers.InsertBefore<QuoteBlockRenderer>(new CalloutRenderer()); renderer.ObjectRenderers.InsertBefore<QuoteBlockRenderer>(new CalloutRenderer(pipeline));
} }
} }
} }

View File

@ -1,4 +1,6 @@
using HtmlAgilityPack;
using Humanizer; using Humanizer;
using Markdig;
using Markdig.Renderers; using Markdig.Renderers;
using Markdig.Renderers.Html; using Markdig.Renderers.Html;
@ -9,6 +11,8 @@ namespace OliverBooth.Markdown.Callout;
/// </summary> /// </summary>
internal sealed class CalloutRenderer : HtmlObjectRenderer<CalloutBlock> internal sealed class CalloutRenderer : HtmlObjectRenderer<CalloutBlock>
{ {
private readonly MarkdownPipeline _pipeline;
private static readonly Dictionary<string, string> CalloutTypes = new() private static readonly Dictionary<string, string> CalloutTypes = new()
{ {
["NOTE"] = "pencil", ["NOTE"] = "pencil",
@ -27,13 +31,18 @@ internal sealed class CalloutRenderer : HtmlObjectRenderer<CalloutBlock>
["UPDATE"] = "calendar-check", ["UPDATE"] = "calendar-check",
}; };
public CalloutRenderer(MarkdownPipeline pipeline)
{
_pipeline = pipeline;
}
/// <inheritdoc /> /// <inheritdoc />
protected override void Write(HtmlRenderer renderer, CalloutBlock block) protected override void Write(HtmlRenderer renderer, CalloutBlock block)
{ {
renderer.EnsureLine(); renderer.EnsureLine();
if (renderer.EnableHtmlForBlock) if (renderer.EnableHtmlForBlock)
{ {
RenderAsHtml(renderer, block); RenderAsHtml(renderer, block, _pipeline);
} }
else else
{ {
@ -43,7 +52,7 @@ internal sealed class CalloutRenderer : HtmlObjectRenderer<CalloutBlock>
renderer.EnsureLine(); 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; string title = block.Title.Text;
ReadOnlySpan<char> type = block.Type.AsSpan(); ReadOnlySpan<char> type = block.Type.AsSpan();
@ -62,15 +71,29 @@ internal sealed class CalloutRenderer : HtmlObjectRenderer<CalloutBlock>
renderer.Write(lucideClass); renderer.Write(lucideClass);
renderer.Write("\"></i> "); renderer.Write("\"></i> ");
renderer.Write(title.Length == 0 ? typeString.Humanize(LetterCasing.Sentence) : title); string calloutTitle = title.Length == 0 ? typeString.Humanize(LetterCasing.Sentence) : title;
WriteTitle(renderer, pipeline, calloutTitle);
renderer.WriteLine("</div>"); renderer.WriteLine("</div>");
renderer.WriteChildren(block); renderer.WriteChildren(block);
renderer.WriteLine("</div>"); renderer.WriteLine("</div>");
renderer.EnsureLine(); 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 <p> tag generated by Markdig
document.DocumentNode.InnerHtml = child.InnerHtml;
}
document.Save(renderer.Writer);
}
private static void RenderAsText(HtmlRenderer renderer, CalloutBlock block) private static void RenderAsText(HtmlRenderer renderer, CalloutBlock block)
{ {
string title = block.Title.Text; string title = block.Title.Text;