54 lines
2 KiB
C#
54 lines
2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|