-
-
Notifications
You must be signed in to change notification settings - Fork 93
Expand file tree
/
Copy pathCopyCodeBlockToClipboardExtension.cs
More file actions
56 lines (49 loc) · 1.76 KB
/
Copy pathCopyCodeBlockToClipboardExtension.cs
File metadata and controls
56 lines (49 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using Markdig;
using Markdig.Renderers;
using Markdig.Renderers.Html;
using Markdig.Syntax;
namespace LinkDotNet.Blog.Web.Features;
internal static class MarkdownPipelineBuilderExtensions
{
public static MarkdownPipelineBuilder UseCopyCodeBlock(this MarkdownPipelineBuilder pipeline)
{
pipeline.Extensions.Add(new CopyCodeBlockToClipboardExtension());
return pipeline;
}
}
internal sealed class CopyCodeBlockToClipboardExtension : IMarkdownExtension
{
public void Setup(MarkdownPipelineBuilder pipeline)
{
}
public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
{
if (renderer is not HtmlRenderer htmlRenderer)
{
return;
}
var originalCodeBlockRenderer = htmlRenderer.ObjectRenderers.FindExact<CodeBlockRenderer>();
if (originalCodeBlockRenderer is null)
{
return;
}
htmlRenderer.ObjectRenderers.Remove(originalCodeBlockRenderer);
htmlRenderer.ObjectRenderers.Add(new CustomCodeBlockRenderer());
}
}
internal sealed class CustomCodeBlockRenderer : CodeBlockRenderer
{
protected override void Write(HtmlRenderer renderer, CodeBlock obj)
{
renderer.Write("""<div class="position-relative">""");
renderer.Write("""
<button class="btn btn-sm position-absolute top-0 end-0 m-2 border border-primary text-primary copy-btn"
type="button"
onclick="navigator.clipboard.writeText(this.parentElement.querySelector('pre code').textContent)">
<i class="copy"></i>
</button>
""");
base.Write(renderer, obj);
renderer.Write("</div>");
}
}