/* Based on ttntm's code to add a button to copy code snippets: https://ttntm.me/blog/adding-a-copy-button-to-code-blocks/ */ function createCopyBtn(blockIndex) { return `
`; } async function copyCode(block) { const code = document.querySelector(`[data-block-id="${block}"]`); const doCopy = async() => await navigator.clipboard.writeText(code?.innerText ?? ''); if (!navigator.userAgent.includes('Firefox')) { const result = await navigator.permissions.query({ name: 'clipboard-write' }); if (result.state === 'granted' || result.state === 'prompt') { doCopy(); } } else { doCopy(); } } async function handleCopyBtnClick(event) { const btn = event?.target; const btnTarget = btn?.getAttribute('data-target'); if (btn && btnTarget) { const originalText = btn.innerHTML; await copyCode(btnTarget); btn.innerHTML = ' Copied!'; setTimeout(() => { btn.innerHTML = originalText; }, 1500); } } document.addEventListener('DOMContentLoaded', () => { const allCodeBlocks = Array.from(document.querySelectorAll('pre[class^="language-"]')); allCodeBlocks.forEach((b, i) => { const code = b.childNodes[0]; const codeBlockIndex = `cb-${i}`; b.insertAdjacentHTML('afterend', createCopyBtn(codeBlockIndex)); code.setAttribute('data-block-id', codeBlockIndex); }) const allCopyBtns = Array.from(document.querySelectorAll('.cc-btn')); allCopyBtns.forEach((btn) => { btn.addEventListener('click', handleCopyBtnClick); }) })