diff --git a/src/Website.Markdig.Extensions/BlogHeadingRenderer.cs b/src/Website.Markdig.Extensions/BlogHeadingRenderer.cs new file mode 100644 index 0000000..444771a --- /dev/null +++ b/src/Website.Markdig.Extensions/BlogHeadingRenderer.cs @@ -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 { + 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>(); + var id = (heading.Inline.FirstChild as LiteralInline).Content.ToString().ToLower().Replace(" ", "-"); + htmlAttributes.Properties.Add(new KeyValuePair("id", id)); + _baseRenderer.Write(renderer, heading); + } + } +} \ No newline at end of file diff --git a/src/Website.Markdig.Extensions/BlogImageRendererExtension.cs b/src/Website.Markdig.Extensions/BlogImageRendererExtension.cs index 4f3455c..8d72a15 100644 --- a/src/Website.Markdig.Extensions/BlogImageRendererExtension.cs +++ b/src/Website.Markdig.Extensions/BlogImageRendererExtension.cs @@ -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(HtmlRenderer htmlRenderer, out T originalRenderer) where T : IMarkdownObjectRenderer { + originalRenderer = htmlRenderer.ObjectRenderers.FindExact(); + if (originalRenderer == null) + return false; + htmlRenderer.ObjectRenderers.Remove(originalRenderer); + return true; + } + + private static void ReplaceImageRenderer(HtmlRenderer htmlRenderer) { + if (TryRemoveRenderer(htmlRenderer, out var originalRenderer)) { + var blogRenderer = new BlogLinkAndImageRenderer(originalRenderer); + htmlRenderer.ObjectRenderers.AddIfNotAlready(blogRenderer); + } + } + + private void ReplaceHeadingRenderer(HtmlRenderer htmlRenderer) { + if (TryRemoveRenderer(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(); - if (originalRenderer != null) - htmlRenderer.ObjectRenderers.Remove(originalRenderer); - var blogRenderer = new BlogLinkAndImageRenderer(originalRenderer); - htmlRenderer.ObjectRenderers.AddIfNotAlready(blogRenderer); + ReplaceImageRenderer(htmlRenderer); + ReplaceHeadingRenderer(htmlRenderer); } } } diff --git a/src/Website.Markdig.Extensions/Website.Markdig.Extensions.csproj b/src/Website.Markdig.Extensions/Website.Markdig.Extensions.csproj index 6177e6e..871e57b 100644 --- a/src/Website.Markdig.Extensions/Website.Markdig.Extensions.csproj +++ b/src/Website.Markdig.Extensions/Website.Markdig.Extensions.csproj @@ -4,8 +4,8 @@ netstandard2.0 - - + + diff --git a/src/Website/Website.csproj b/src/Website/Website.csproj index d34bf2d..e4f2c18 100644 --- a/src/Website/Website.csproj +++ b/src/Website/Website.csproj @@ -8,7 +8,7 @@ - +