From b1b88fc0a3464e0b58a36f6dc54d002f515d6b7c Mon Sep 17 00:00:00 2001 From: zack4485-MSFT <72422659+zack4485@users.noreply.github.com> Date: Thu, 31 Oct 2024 02:41:23 -0400 Subject: [PATCH] Update MarkdownPagesBase.cs Enabling anchor links --- MyApp/MarkdownPagesBase.cs | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/MyApp/MarkdownPagesBase.cs b/MyApp/MarkdownPagesBase.cs index b2926a4..ae0d4c6 100644 --- a/MyApp/MarkdownPagesBase.cs +++ b/MyApp/MarkdownPagesBase.cs @@ -113,12 +113,12 @@ public abstract class MarkdownPagesBase(ILogger log, IWebHostEnvironment env, public abstract string Id { get; } public IVirtualFiles VirtualFiles => fs; - public virtual MarkdownPipeline CreatePipeline() + public virtual MarkdownPipeline CreatePipeline(string path) { var builder = new MarkdownPipelineBuilder() .UseYamlFrontMatter() .UseAdvancedExtensions() - .UseAutoLinkHeadings() + .UseAutoLinkHeadings(this, path) .UseHeadingsMap() .UseCustomContainers(MarkdigConfig.Instance.ConfigureContainers); MarkdigConfig.Instance.ConfigurePipeline?.Invoke(builder); @@ -149,9 +149,9 @@ public virtual List Fresh(List docs) return doc; } - public virtual T CreateMarkdownFile(string content, TextWriter writer, MarkdownPipeline? pipeline = null) + public virtual T CreateMarkdownFile(string path, string content, TextWriter writer, MarkdownPipeline? pipeline = null) { - pipeline ??= CreatePipeline(); + pipeline ??= CreatePipeline(path); var renderer = new Markdig.Renderers.HtmlRenderer(writer); pipeline.Setup(renderer); @@ -190,7 +190,7 @@ public virtual T CreateMarkdownFile(string content, TextWriter writer, MarkdownP var writer = new StringWriter(); - var doc = CreateMarkdownFile(content, writer, pipeline); + var doc = CreateMarkdownFile(string.Empty, content, writer, pipeline); doc.Title ??= file.Name; doc.Path = file.VirtualPath; @@ -278,7 +278,7 @@ public void LoadFrom(string fromDirectory) .ToList(); log.LogInformation("Found {Count} includes", files.Count); - var pipeline = CreatePipeline(); + var pipeline = CreatePipeline(string.Empty); foreach (var file in files) { @@ -322,6 +322,8 @@ public struct HeadingInfo(int level, string id, string content) /// public class AutoLinkHeadingRenderer : HtmlObjectRenderer { + private string _relativeHtmlPath; + private static readonly string[] HeadingTexts = [ "h1", "h2", @@ -330,6 +332,11 @@ public class AutoLinkHeadingRenderer : HtmlObjectRenderer "h5", "h6" ]; + + public AutoLinkHeadingRenderer(string relativeHtmlPath) + { + this._relativeHtmlPath = relativeHtmlPath; + } public event Action? OnHeading; @@ -942,9 +949,22 @@ public static class MarkdigExtensions /// /// Uses the auto-identifier extension. /// - public static MarkdownPipelineBuilder UseAutoLinkHeadings(this MarkdownPipelineBuilder pipeline) + public static MarkdownPipelineBuilder UseAutoLinkHeadings(this MarkdownPipelineBuilder pipeline, object input, string path) { - pipeline.Extensions.AddIfNotAlready(new AutoLinkHeadingsExtension()); + var relativeHtmlPath = string.Empty; + + if(input.GetType() == typeof(MarkdownBlog)) + { + var post = ((MarkdownBlog)input).VisiblePosts.FirstOrDefault(x => path.Contains(x.FileName)); + + if(post != null) + { + relativeHtmlPath = $"/posts/{post.Slug}"; + } + } + + pipeline.Extensions.AddIfNotAlready(new AutoLinkHeadingsExtension(relativeHtmlPath)); + return pipeline; } @@ -981,4 +1001,4 @@ public class MarkdownMenuItem { public string Text { get; set; } public string Link { get; set; } -} \ No newline at end of file +}