feat: allow markdown in callout titles
This commit is contained in:
parent
01031057e0
commit
35a82a9663
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user