79 lines
2.8 KiB
JavaScript
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);
|
|
}
|
|
});
|
|
});
|