Files
website/themes/hugo-theme-monochrome/assets/js/builtin-copy.js
Simon Gardling 032679b34a setup
2023-10-11 17:38:05 -04:00

79 lines
2.8 KiB
JavaScript

function registerHoverEvent(wrapper, button) {
wrapper.addEventListener('mouseenter', function () {
button.classList.remove("hidden");
});
wrapper.addEventListener('mouseleave', function () {
button.classList.add("hidden");
});
}
function registerTouchedEvent(pre, button) {
pre.addEventListener("touchend", function () {
if (button.classList.contains("hidden")) {
button.classList.remove("hidden");
} else {
button.classList.add("hidden");
}
});
}
function registerClipboard(button, code_block) {
button.addEventListener('click', async function () {
try {
await navigator.clipboard.writeText(code_block.innerText);
button.blur();
button.innerText = 'Copied!';
setTimeout(function () {
button.innerText = 'Copy';
}, 2000);
} catch (e) {
button.innerText = 'Error';
}
});
}
window.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll('pre:not(.emgithub-pre) > code').forEach((code_block) => {
var button = document.createElement('span');
button.className = 'copy-code-button hidden';
button.type = 'button';
button.innerText = 'Copy';
var pre = code_block.parentNode;
if (pre.parentNode.classList.contains('highlight')) {
var highlight = pre.parentNode;
highlight.appendChild(button);
registerHoverEvent(highlight, button);
registerTouchedEvent(pre, button);
registerClipboard(button, code_block);
} else if (pre.parentNode.tagName === "TD") {
// check is line no
var td = pre.parentNode;
var tr = td.parentNode;
if (td === tr.firstChild) {
return;
}
// get highlight block
var highlight = pre.parentNode;
while (!highlight.classList.contains('highlight') && highlight.tagName !== 'BODY') {
highlight = highlight.parentNode;
}
if (highlight.tagName !== 'BODY') {
highlight.appendChild(button);
registerHoverEvent(highlight, button);
registerTouchedEvent(pre, button);
registerClipboard(button, code_block);
}
} else {
var wrapper = document.createElement('div');
wrapper.style = "position: relative;"
pre.parentNode.insertBefore(wrapper, pre);
wrapper.appendChild(pre);
wrapper.appendChild(button);
registerHoverEvent(wrapper, button);
registerTouchedEvent(pre, button);
registerClipboard(button, code_block);
}
});
});