Skip to content

Instantly share code, notes, and snippets.

@TerribleDev
Created January 22, 2019 00:15
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TerribleDev/6278f98da75e7e96d467c6c72ba61e7a to your computer and use it in GitHub Desktop.
Save TerribleDev/6278f98da75e7e96d467c6c72ba61e7a to your computer and use it in GitHub Desktop.
A markdig extension so add target blank to absolute urls
public class TargetLinkExtension : IMarkdownExtension
{
public void Setup(MarkdownPipelineBuilder pipeline)
{
}
public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
{
var htmlRenderer = renderer as HtmlRenderer;
if (htmlRenderer != null)
{
var inlineRenderer = htmlRenderer.ObjectRenderers.FindExact<LinkInlineRenderer>();
if (inlineRenderer != null)
{
inlineRenderer.TryWriters.Remove(TryLinkInlineRenderer);
inlineRenderer.TryWriters.Add(TryLinkInlineRenderer);
}
}
}
private bool TryLinkInlineRenderer(HtmlRenderer renderer, LinkInline linkInline)
{
if (linkInline.Url == null)
{
return false;
}
Uri uri;
// Only process absolute Uri
if (!Uri.TryCreate(linkInline.Url, UriKind.RelativeOrAbsolute, out uri) || !uri.IsAbsoluteUri)
{
return false;
}
RenderTargetAttribute(uri, renderer, linkInline);
return false;
}
private void RenderTargetAttribute(Uri uri, HtmlRenderer renderer, LinkInline linkInline)
{
linkInline.SetAttributes(new HtmlAttributes() { Properties = new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("target", "_blank") } });
}
}
@drozdik-m
Copy link

drozdik-m commented Oct 28, 2022

Add this for easy builder usage:

public static class MarkdownPipelineBuilderExtensions
    {
        public static MarkdownPipelineBuilder UseTargetLinkExtension(this MarkdownPipelineBuilder pipeline)
        {
            OrderedList<IMarkdownExtension> extensions;

            extensions = pipeline.Extensions;

            if (!extensions.Contains<TargetLinkExtension>())
            {
                extensions.Add(new TargetLinkExtension());
            }

            return pipeline;
        }
    }
new MarkdownPipelineBuilder()
            //...
            .UseTargetLinkExtension()
            .Build();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment