Files
triliumnotes-branding/data/custom/share-theme/custom-share-copy.js
Patrick Asmus 4bdc7ef496 Initial
2026-06-05 16:28:13 +02:00

90 lines
2.4 KiB
JavaScript

(function () {
"use strict";
const copiedLabel = "Kopiert";
const copyLabel = "Kopieren";
const resetDelayMs = 1600;
function getCodeText(codeElement) {
return codeElement.textContent.replace(/\n$/, "");
}
async function copyText(text) {
if (navigator.clipboard && window.isSecureContext) {
await navigator.clipboard.writeText(text);
return;
}
const textArea = document.createElement("textarea");
textArea.value = text;
textArea.setAttribute("readonly", "");
textArea.style.position = "fixed";
textArea.style.top = "-1000px";
textArea.style.opacity = "0";
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand("copy");
} finally {
textArea.remove();
}
}
function setButtonState(button, label, copied) {
button.textContent = label;
button.setAttribute("aria-label", label);
button.classList.toggle("is-copied", copied);
}
function enhanceCodeBlock(preElement) {
if (preElement.closest(".mtp-code-block")) {
return;
}
const codeElement = preElement.querySelector("code");
if (!codeElement || !getCodeText(codeElement).trim()) {
return;
}
const wrapper = document.createElement("div");
wrapper.className = "mtp-code-block";
preElement.parentNode.insertBefore(wrapper, preElement);
wrapper.appendChild(preElement);
const button = document.createElement("button");
button.type = "button";
button.className = "mtp-copy-code-button";
setButtonState(button, copyLabel, false);
button.addEventListener("click", async () => {
const originalLabel = button.textContent;
button.disabled = true;
try {
await copyText(getCodeText(codeElement));
setButtonState(button, copiedLabel, true);
window.setTimeout(() => {
button.disabled = false;
setButtonState(button, copyLabel, false);
}, resetDelayMs);
} catch (error) {
button.disabled = false;
setButtonState(button, originalLabel || copyLabel, false);
}
});
wrapper.appendChild(button);
}
function initCopyButtons() {
document.querySelectorAll("#content pre").forEach(enhanceCodeBlock);
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initCopyButtons, { once: true });
} else {
initCopyButtons();
}
})();