Enable linking to specific headings in blog
This commit is contained in:
parent
9970250908
commit
a5f2beb55a
4 changed files with 53 additions and 8 deletions
25
src/Website.Markdig.Extensions/BlogHeadingRenderer.cs
Normal file
25
src/Website.Markdig.Extensions/BlogHeadingRenderer.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="markdig" Version="0.18.3" />
|
||||
<PackageReference Include="markdig" Version="0.24.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -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" />
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue