aboutsummaryrefslogtreecommitdiff
path: root/static/js/codecopy.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/js/codecopy.js')
-rw-r--r--static/js/codecopy.js34
1 files changed, 34 insertions, 0 deletions
diff --git a/static/js/codecopy.js b/static/js/codecopy.js
new file mode 100644
index 0000000..9e00c79
--- /dev/null
+++ b/static/js/codecopy.js
@@ -0,0 +1,34 @@
+const changeIcon = (copyDiv, className) => {
+ copyDiv.classList.add(className);
+ setTimeout(() => copyDiv.classList.remove(className), 2500);
+};
+
+const copyCodeAndChangeIcon = async (copyDiv, block) => {
+ const code = block.querySelector('table') ? getTableCode(block) : getNonTableCode(block);
+ try {
+ await navigator.clipboard.writeText(code);
+ changeIcon(copyDiv, "yes");
+ } catch (error) {
+ changeIcon(copyDiv, "err");
+ }
+};
+
+const getNonTableCode = (block) => {
+ return [...block.querySelectorAll('code')]
+ .map(code => code.textContent)
+ .join('');
+};
+
+const getTableCode = (block) => {
+ return [...block.querySelectorAll('tr')]
+ .map(row => row.querySelector('td:last-child')?.innerText ?? '')
+ .join('');
+};
+
+document.querySelectorAll("pre").forEach((block) => {
+ const copyDiv = document.createElement("div");
+ copyDiv.className = "cc svgs svgh copy";
+ copyDiv.innerHTML = " ";
+ block.prepend(copyDiv);
+ copyDiv.addEventListener("click", () => copyCodeAndChangeIcon(copyDiv, block));;
+});