summaryrefslogtreecommitdiffstats
path: root/g4f/gui/client/static/js/highlightjs-copy.min.js
blob: cd8ae9573b2b39e237f0f6405800cf655b3f4d02 (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
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 () => {
            let newText = text;
            if (hook && typeof hook === "function") {
                newText = hook(text, el) || text
            }
            try {            
                if (!navigator.clipboard) {
                    throw new Error("navigator.clipboard: Clipboard API unavailable.");
                }
                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);
            
        }
    
}