Enable linking to specific headings in blog

This commit is contained in:
Robert Marshall 2021-04-24 08:24:46 +01:00
parent 9970250908
commit a5f2beb55a
4 changed files with 53 additions and 8 deletions

View file

@ -0,0 +1,25 @@
using Markdig.Renderers;
using Markdig.Renderers.Html;
using Markdig.Syntax;
using Markdig.Syntax.Inlines;
using System.Collections.Generic;
namespace Website.Markdig.Extensions
{
public class BlogHeadingRenderer : HtmlObjectRenderer<HeadingBlock> {
private readonly HeadingRenderer _baseRenderer;
public BlogHeadingRenderer(HeadingRenderer baseRenderer) {
_baseRenderer = baseRenderer;
}
protected override void Write(HtmlRenderer renderer, HeadingBlock heading) {
var htmlAttributes = heading.GetAttributes();
if (htmlAttributes.Properties == null)
htmlAttributes.Properties = new List<KeyValuePair<string, string>>();
var id = (heading.Inline.FirstChild as LiteralInline).Content.ToString().ToLower().Replace(" ", "-");
htmlAttributes.Properties.Add(new KeyValuePair<string, string>("id", id));
_baseRenderer.Write(renderer, heading);
}
}
}

View file

@ -1,5 +1,6 @@
using Markdig;
using Markdig.Renderers;
using Markdig.Renderers.Html;
using Markdig.Renderers.Html.Inlines;
namespace Website.Markdig.Extensions {
@ -8,13 +9,32 @@ namespace Website.Markdig.Extensions {
}
private static bool TryRemoveRenderer<T>(HtmlRenderer htmlRenderer, out T originalRenderer) where T : IMarkdownObjectRenderer {
originalRenderer = htmlRenderer.ObjectRenderers.FindExact<T>();
if (originalRenderer == null)
return false;
htmlRenderer.ObjectRenderers.Remove(originalRenderer);
return true;
}
private static void ReplaceImageRenderer(HtmlRenderer htmlRenderer) {
if (TryRemoveRenderer<LinkInlineRenderer>(htmlRenderer, out var originalRenderer)) {
var blogRenderer = new BlogLinkAndImageRenderer(originalRenderer);
htmlRenderer.ObjectRenderers.AddIfNotAlready(blogRenderer);
}
}
private void ReplaceHeadingRenderer(HtmlRenderer htmlRenderer) {
if (TryRemoveRenderer<HeadingRenderer>(htmlRenderer, out var originalRenderer)) {
var blogRenderer = new BlogHeadingRenderer(originalRenderer);
htmlRenderer.ObjectRenderers.AddIfNotAlready(blogRenderer);
}
}
public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer) {
var htmlRenderer = renderer as HtmlRenderer;
var originalRenderer = htmlRenderer.ObjectRenderers.FindExact<LinkInlineRenderer>();
if (originalRenderer != null)
htmlRenderer.ObjectRenderers.Remove(originalRenderer);
var blogRenderer = new BlogLinkAndImageRenderer(originalRenderer);
htmlRenderer.ObjectRenderers.AddIfNotAlready(blogRenderer);
ReplaceImageRenderer(htmlRenderer);
ReplaceHeadingRenderer(htmlRenderer);
}
}
}

View file

@ -5,7 +5,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="markdig" Version="0.18.3" />
<PackageReference Include="markdig" Version="0.24.0" />
</ItemGroup>
</Project>

View file

@ -8,7 +8,7 @@
<ItemGroup>
<PackageReference Include="BuildBundlerMinifier" Version="3.2.435" />
<PackageReference Include="markdig" Version="0.18.3" />
<PackageReference Include="markdig" Version="0.24.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Pek.Markdig.HighlightJs" Version="0.5.1" />