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;
using Markdig.Renderers; using Markdig.Renderers;
using Markdig.Renderers.Html;
using Markdig.Renderers.Html.Inlines; using Markdig.Renderers.Html.Inlines;
namespace Website.Markdig.Extensions { 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) { public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer) {
var htmlRenderer = renderer as HtmlRenderer; var htmlRenderer = renderer as HtmlRenderer;
var originalRenderer = htmlRenderer.ObjectRenderers.FindExact<LinkInlineRenderer>(); ReplaceImageRenderer(htmlRenderer);
if (originalRenderer != null) ReplaceHeadingRenderer(htmlRenderer);
htmlRenderer.ObjectRenderers.Remove(originalRenderer);
var blogRenderer = new BlogLinkAndImageRenderer(originalRenderer);
htmlRenderer.ObjectRenderers.AddIfNotAlready(blogRenderer);
} }
} }
} }

View file

@ -4,8 +4,8 @@
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="markdig" Version="0.18.3" /> <PackageReference Include="markdig" Version="0.24.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

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