90 lines
2.4 KiB
JavaScript
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();
|
|
}
|
|
})();
|