diff options
| author | Jieiku | 2023-05-22 23:24:44 -0700 |
|---|---|---|
| committer | Jieiku | 2023-05-22 23:24:44 -0700 |
| commit | 3af6d9131f6dfc138856d718ec96626344095ec8 (patch) | |
| tree | 1a8d75cf494d5333da2cb02506e04c9e0f576f6d /static/js/codecopy.js | |
| parent | 3ca36cc469e838cee7d3fdcdc6ff39b35313a293 (diff) | |
| download | abridge-3af6d9131f6dfc138856d718ec96626344095ec8.tar.gz abridge-3af6d9131f6dfc138856d718ec96626344095ec8.tar.bz2 abridge-3af6d9131f6dfc138856d718ec96626344095ec8.zip | |
Optimizations and Fixes
Diffstat (limited to 'static/js/codecopy.js')
| -rw-r--r-- | static/js/codecopy.js | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/static/js/codecopy.js b/static/js/codecopy.js new file mode 100644 index 0000000..c1f3a75 --- /dev/null +++ b/static/js/codecopy.js @@ -0,0 +1,76 @@ +// https://aaronluna.dev/blog/add-copy-button-to-code-blocks-hugo-chroma/ +// Further modified for Zola by Jieiku: https://github.com/Jieiku +(function() { + // create copy button + function ccb(highlightDiv) { + const button = document.createElement("button"); + button.className = "cc "; + button.type = "button"; + button.innerHTML = "Copy"; + button.addEventListener("click", () => + ccc(button, highlightDiv) + ); + + // addCopyButtonToDom + const wrapper = document.createElement("div"); + wrapper.className = "ccw"; + wrapper.appendChild(button); + highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); + wrapper.appendChild(highlightDiv); + } + + // copy code clipboard + async function ccc(button, highlightDiv) { + //look for table, if so do it different + const { length } = highlightDiv.querySelectorAll("table"); + let codeToCopy = ""; + if (length > 0) { + const items = highlightDiv.querySelectorAll(":last-child > tr > td:last-child"); + items.forEach(item => { + codeToCopy = codeToCopy + item.innerText; + //console.log(codeToCopy); + }); + } else { + codeToCopy = highlightDiv.querySelector(":last-child > code").innerText; + } + try { + result = await navigator.permissions.query({ name: "clipboard-write" }); + if (result.state == "granted" || result.state == "prompt") { + await navigator.clipboard.writeText(codeToCopy); + } else { + cce(codeToCopy, highlightDiv);//copyCodeBlockExecCommand + } + } catch (_) { + cce(codeToCopy, highlightDiv);//copyCodeBlockExecCommand + } finally { + //codeWasCopied + //button.blur(); + button.innerHTML = "Copied"; + setTimeout(function () { + button.innerHTML = "Copy"; + }, 2000); + } + } + + //copyCodeBlockExecCommand + function cce(codeToCopy, highlightDiv) { + const textArea = document.createElement("textArea"); + textArea.contentEditable = "true"; + textArea.readOnly = "false"; + textArea.className = "copyable-text-area"; + textArea.value = codeToCopy; + highlightDiv.insertBefore(textArea, highlightDiv.firstChild); + const range = document.createRange(); + range.selectNodeContents(textArea); + const sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + textArea.setSelectionRange(0, 999999); + document.execCommand("copy"); + highlightDiv.removeChild(textArea); + } + + document + .querySelectorAll("pre") + .forEach((highlightDiv) => ccb(highlightDiv)); +})();
\ No newline at end of file |
