From a8c8b5bc4fc20e729574652788f3409442f82a96 Mon Sep 17 00:00:00 2001 From: ItsDrike Date: Mon, 25 Jul 2022 01:06:13 +0200 Subject: [PATCH] Use navigator.clipboard instead of deprecated document.execCommand('copy') --- static/src/js/code-copy.js | 60 ++++++++++++-------------------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/static/src/js/code-copy.js b/static/src/js/code-copy.js index 71e51f1..cb319ed 100644 --- a/static/src/js/code-copy.js +++ b/static/src/js/code-copy.js @@ -1,57 +1,35 @@ (() => { "use strict"; - if (!document.queryCommandSupported("copy")) { - return; - } - function flashCopyMessage(el, msg) { el.textContent = msg; - setTimeout(() => { - el.textContent = "Copy"; - }, 1000); + setTimeout(() => { el.textContent = "Copy"; }, 1000); } - function selectText(node) { - let selection = window.getSelection(); - let range = document.createRange(); - if (node.childElementCount === 2) { - // Skip the title. - range.selectNodeContents(node.children[1]); - } else { - // ignore linenumbers - let _ln = node.getElementsByClassName("chroma"); - let _node = node.getElementsByTagName("pre")[1] - if (_ln.length >= 1) { - range.selectNodeContents(_node); - } else { - range.selectNodeContents(node); - } - } - selection.removeAllRanges(); - selection.addRange(range); - return selection; + function handleClick(containerEl, copyBtn) { + // Find the pre element containing the source code. + // If this is a regular codeblock, there should only be 1 pre element + // If this is a hugo highlight block with linenumers, there will be 2 elements, + // where, the first will contain line numbers, and second will contain the code + let preElements = containerEl.getElementsByTagName("pre"); + let preEl = preElements[preElements.length - 1] + + let codeEl = preEl.firstElementChild; + let text = codeEl.textContent; + + navigator.clipboard.writeText(text) + .then(() => { flashCopyMessage(copyBtn, "Copied!"); }) + .catch((error) => { + console && console.log(error); + flashCopyMessage(copyBtn, "Failed :'("); + }) } function addCopyButton(containerEl) { let copyBtn = document.createElement("button"); copyBtn.className = "copy-button"; copyBtn.textContent = "Copy"; - - let codeEl = containerEl.firstElementChild; - copyBtn.addEventListener("click", () => { - try { - let selection = selectText(codeEl); - document.execCommand("copy"); - selection.removeAllRanges(); - - flashCopyMessage(copyBtn, "Copied!"); - } catch (e) { - console && console.log(e); - flashCopyMessage(copyBtn, "Failed :'("); - } - }); - + copyBtn.addEventListener("click", () => handleClick(containerEl, copyBtn)); containerEl.appendChild(copyBtn); }