blob: 0c3c1cee7ec6a436c211f76cecacc046ea15255c (
plain) (
blame)
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
|
class CopyButtonPlugin {
constructor(options = {}) {
self.hook = options.hook;
self.callback = options.callback
}
"after:highlightElement"({
el,
text
}) {
let button = Object.assign(document.createElement("button"), {
innerHTML: "Copy",
className: "hljs-copy-button"
});
button.dataset.copied = false;
el.parentElement.classList.add("hljs-copy-wrapper");
el.parentElement.appendChild(button);
el.parentElement.style.setProperty("--hljs-theme-background", window.getComputedStyle(el).backgroundColor);
button.onclick = async () => {
if (!navigator.clipboard) {
console.error("navigator.clipboard: Clipboard API unavailable.")
return;
}
let newText = text;
if (hook && typeof hook === "function") {
newText = hook(text, el) || text
}
try {
await navigator.clipboard.writeText(newText);
} catch (e) {
console.error(e);
console.error("Clipboard API writeText() failed! Fallback to document.exec(\"copy\")...");
fallback_clipboard(newText);
}
button.innerHTML = "Copied!";
button.dataset.copied = true;
let alert = Object.assign(document.createElement("div"), {
role: "status",
className: "hljs-copy-alert",
innerHTML: "Copied to clipboard"
});
el.parentElement.appendChild(alert);
setTimeout(() => {
button.innerHTML = "Copy";
button.dataset.copied = false;
el.parentElement.removeChild(alert);
alert = null
}, 2e3)
}
if (typeof callback === "function") return callback(newText, el);
}
}
|