WordPress のコードブロックにコピーボタン、やっぱりほしい。
ということで、Cocoon に Copy button を追加してみた。
実装は、JavaScript で <pre> タグの中に <code> を含むものを探して、コピーボタンを配置するという方針に。
実装した JavaScript コード:
document.addEventListener("DOMContentLoaded", () => {
// Get all <pre> elements
const preElements = document.querySelectorAll("pre");
preElements.forEach(pre => {
const code = pre.querySelector("code");
if (code) {
// Create a copy button
const copyButton = document.createElement("button");
copyButton.textContent = "Copy";
copyButton.style.position = "absolute";
copyButton.style.top = "5px";
copyButton.style.right = "5px";
copyButton.style.padding = "5px 10px";
copyButton.style.fontSize = "12px";
copyButton.style.cursor = "pointer";
// Add click action
copyButton.addEventListener("click", () => {
const codeText = code.textContent;
navigator.clipboard.writeText(codeText).then(() => {
copyButton.textContent = "Copied!";
setTimeout(() => {
copyButton.textContent = "Copy";
}, 2000);
}).catch(err => {
console.error("Failed to copy", err);
});
});
// To maintain the position of the copy button, wrap the <pre> element in a div element
const container = document.createElement("div");
container.style.position = "relative";
container.style.width = "100%";
pre.parentNode.insertBefore(container, pre);
container.appendChild(pre);
container.appendChild(copyButton);
}
});
});
JavaScript は、「外観」→「テーマファイルエディター」→「javascript.js」から追加

JavaScript 導入後のコードブロック表示:

コードブロックのテキストがコピー可能になり、理想に一歩近づいた。
参考にさせていただいたサイト:
https://lovagelab.com/posts/3406/