InkSoul/themes/meme_cdn/assets/js/copy.js

87 lines
3.0 KiB
JavaScript
Raw Normal View History

2023-06-18 23:16:41 +08:00
// Copy Button for Code Blocks
// References
// 1. https://tomspencer.dev/blog/2018/09/14/adding-click-to-copy-buttons-to-a-hugo-powered-blog/
// 2. https://www.dannyguo.com/blog/how-to-add-copy-to-clipboard-buttons-to-code-blocks-in-hugo/
window.addEventListener("DOMContentLoaded", event => {
const copyText = '{{ i18n "copy" }}';
const copiedText = '{{ i18n "copied" }}';
var $cdnCustomized = '{{ .Site.Params.cdnCustomized }}';
var $defaultCDN = 'https://cdn.jsdelivr.net';
document.querySelectorAll('.post-body > pre').forEach((e) => {
let div = document.createElement('div');
e.parentNode.replaceChild(div, e);
div.appendChild(e);
});
function addCopyButtons(clipboard) {
const divs = document.querySelectorAll('table.lntable, .highlight > pre, .post-body > div > pre');
divs.forEach((containerEl) => {
containerEl.parentNode.style.position = 'relative';
const button = document.createElement('button');
button.className = 'copy-button';
button.type = 'button';
button.innerText = copyText;
if (containerEl.classList.contains('lntable')) {
var codeBlock = containerEl.querySelectorAll('.lntd')[1];
} else {
var codeBlock = containerEl.querySelector('code');
}
button.addEventListener('click', () => {
clipboard.writeText(codeBlock.innerText).then(() => {
/* Chrome doesn't seem to blur automatically,
leaving the button in a focused state. */
button.blur();
button.innerText = copiedText;
setTimeout(() => {
button.innerText = copyText;
}, 1000);
}).catch((error) => {
button.innerText = 'Error';
console.error(error);
});
});
containerEl.appendChild(button);
{{ if .Site.Params.enableCopyAutoHide }}
containerEl.parentNode.addEventListener('mouseover', () => {
button.style = 'visibility: visible; opacity: 1';
});
containerEl.parentNode.addEventListener('mouseout', () => {
button.style = 'visibility: hidden; opacity: 0';
});
{{ end }}
});
}
if (navigator && navigator.clipboard) {
addCopyButtons(navigator.clipboard);
} else {
const script = document.createElement('script');
if($cdnCustomized=null){
script.src = $defaultCDN + '/npm/clipboard-polyfill@2.8.6/dist/clipboard-polyfill.min.js';
}else {
script.src = $cdnCustomized + '/npm/clipboard-polyfill@2.8.6/dist/clipboard-polyfill.min.js';
}
script.defer = true;
script.onload = function() {
addCopyButtons(clipboard);
};
document.head.appendChild(script);
}
}, {once: true});