Render YouTube links as embedded media

This commit is contained in:
Robert Marshall 2021-05-27 09:05:15 +01:00
parent bdd7bc314e
commit e34427ae1f
2 changed files with 18 additions and 1 deletions

View file

@ -3,9 +3,11 @@ using Markdig.Renderers;
using Markdig.Renderers.Html;
using Markdig.Renderers.Html.Inlines;
using Markdig.Syntax.Inlines;
using System.Text.RegularExpressions;
namespace Website.Markdig.Extensions {
public class BlogLinkAndImageRenderer : HtmlObjectRenderer<LinkInline> {
private static readonly Regex YoutubeLink = new Regex(@"https://w{0,3}\.?youtu\.?be(?:\.com)?/(?:watch\?v=)?(.*)", RegexOptions.Compiled);
private readonly LinkInlineRenderer _baseRenderer;
public BlogLinkAndImageRenderer(LinkInlineRenderer baseRenderer) {
@ -34,6 +36,16 @@ namespace Website.Markdig.Extensions {
renderer.Write(@"</div>");
}
private bool RenderEmbed(HtmlRenderer renderer, LinkInline link) {
if (YoutubeLink.IsMatch(link.Url)) {
var youtubeMatch = YoutubeLink.Match(link.Url);
renderer.Write($"<iframe src=\"https://www.youtube.com/embed/{youtubeMatch.Groups[1].Value}\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>");
return true;
}
return false;
}
private void RenderLink(HtmlRenderer renderer, LinkInline link) {
if (link.Url.StartsWith("http") || link.Url.StartsWith("//")) {
var htmlAttributes = link.GetAttributes();
@ -49,7 +61,7 @@ namespace Website.Markdig.Extensions {
if (link.IsImage)
RenderImage(renderer, link);
else
else if (!RenderEmbed(renderer, link))
RenderLink(renderer, link);
}
}

View file

@ -168,4 +168,9 @@
.CodeMirror *{
transition: none; // Fix weird scroll issue as a result of site-wide transition.
}
}
iframe[src^="https://www.youtube.com/embed/"] {
width: 944px;
height: 531px;
}