// Copy button for code blocks document.addEventListener('DOMContentLoaded', function () { const getCopyIcon = () => { const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.innerHTML = ` `; svg.setAttribute('fill', 'none'); svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('stroke', 'currentColor'); svg.setAttribute('stroke-width', '2'); return svg; } const getSuccessIcon = () => { const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.innerHTML = ` `; svg.setAttribute('fill', 'none'); svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('stroke', 'currentColor'); svg.setAttribute('stroke-width', '2'); return svg; } document.querySelectorAll('.hextra-code-copy-btn').forEach(function (button) { // Add copy and success icons button.querySelector('.copy-icon')?.appendChild(getCopyIcon()); button.querySelector('.success-icon')?.appendChild(getSuccessIcon()); // Add click event listener for copy button button.addEventListener('click', function (e) { e.preventDefault(); // Get the code target const target = button.parentElement.previousElementSibling; let codeElement; if (target.tagName === 'CODE') { codeElement = target; } else { // Select the last code element in case line numbers are present const codeElements = target.querySelectorAll('code'); codeElement = codeElements[codeElements.length - 1]; } if (codeElement) { let code = codeElement.innerText; // Replace double newlines with single newlines in the innerText // as each line inside has trailing newline '\n' if ("lang" in codeElement.dataset) { code = code.replace(/\n\n/g, '\n'); } navigator.clipboard.writeText(code).then(function () { button.classList.add('copied'); setTimeout(function () { button.classList.remove('copied'); }, 1000); }).catch(function (err) { console.error('Failed to copy text: ', err); }); } else { console.error('Target element not found'); } }); }); });