Initial
This commit is contained in:
89
data/custom/share-theme/custom-share-copy.js
Normal file
89
data/custom/share-theme/custom-share-copy.js
Normal file
@@ -0,0 +1,89 @@
|
||||
(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();
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user