Open blog external links in new tab

This commit is contained in:
Robert Marshall 2020-04-05 13:08:47 +01:00
parent 3eca70a102
commit 39a3af8c04
5 changed files with 60 additions and 45 deletions

View file

@ -0,0 +1,54 @@
using System.Collections.Generic;
using Markdig.Renderers;
using Markdig.Renderers.Html;
using Markdig.Renderers.Html.Inlines;
using Markdig.Syntax.Inlines;
namespace Website.Markdig.Extensions {
public class BlogLinkAndImageRenderer : HtmlObjectRenderer<LinkInline> {
private readonly LinkInlineRenderer _baseRenderer;
public BlogLinkAndImageRenderer(LinkInlineRenderer baseRenderer) {
_baseRenderer = baseRenderer;
}
private static void RenderChildren(HtmlRenderer renderer, LinkInline link) {
var wasEnableHtmlForInline = renderer.EnableHtmlForInline;
renderer.EnableHtmlForInline = false;
renderer.WriteChildren(link);
renderer.EnableHtmlForInline = wasEnableHtmlForInline;
}
private static void RenderImage(HtmlRenderer renderer, LinkInline link) {
renderer.Write(@"<div class=""blog-post__image-container--container"">");
renderer.Write(@"<div class=""blog-post__image-container"">");
renderer.Write($@"<img src=""{link.Url}"" alt=""");
RenderChildren(renderer, link);
renderer.Write(@""" class=""blog-post__image-container--image"">");
renderer.Write(@"<span class=""blog-post__image-container--tagline"">");
RenderChildren(renderer, link);
renderer.Write(@"</span>");
renderer.Write(@"</div>");
renderer.Write(@"</div>");
}
private void RenderLink(HtmlRenderer renderer, LinkInline link) {
if (link.Url.StartsWith("http") || link.Url.StartsWith("//")) {
var htmlAttributes = link.GetAttributes();
if (htmlAttributes.Properties == null)
htmlAttributes.Properties = new List<KeyValuePair<string, string>>();
htmlAttributes.Properties.Add(new KeyValuePair<string, string>("target", "_blank"));
}
_baseRenderer.Write(renderer, link);
}
protected override void Write(HtmlRenderer renderer, LinkInline link) {
link.Url = link.GetDynamicUrl != null ? link.GetDynamicUrl() ?? link.Url : link.Url;
if (link.IsImage)
RenderImage(renderer, link);
else
RenderLink(renderer, link);
}
}
}