diff --git a/client/js/highlightjs-copy.min.js b/client/js/highlightjs-copy.min.js index ac11d33e..e752ca16 100644 --- a/client/js/highlightjs-copy.min.js +++ b/client/js/highlightjs-copy.min.js @@ -1 +1,58 @@ -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=function(){if(!navigator.clipboard)return;let newText=text;if(hook&&typeof hook==="function"){newText=hook(text,el)||text}navigator.clipboard.writeText(newText).then(function(){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)}).then(function(){if(typeof callback==="function")return callback(newText,el)})}}} \ No newline at end of file +class CopyButtonPlugin{ + constructor(options={}){ + this.hook=options.hook; + this.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=() => { + let newText=text; + if(this.hook && typeof this.hook==="function"){ + newText=this.hook(text,el)||text + } + this.copyToClipboard(newText).then(() => { + 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) + }).then(()=>{ + if(typeof this.callback==="function") return this.callback(newText,el) + }) + } + } + + copyToClipboard(text) { + return new Promise((resolve, reject) => { + let textarea = document.createElement('textarea'); + textarea.textContent = text; + document.body.appendChild(textarea); + + textarea.select(); + try { + document.execCommand('copy'); + resolve(); + } catch (ex) { + reject(ex); + } finally { + document.body.removeChild(textarea); + } + }); + } +}