/** * 代码块 copy 按钮。 * * 为 pre>code 注入一个 .copy-code 按钮,点击复制代码文本并回显 copied!。 * 2 秒后还原文案。样式见 input.css 的 .copy-code 规则(全局 Tailwind 构建)。 */ function initCopyButtons(root: Element): void { const blocks = root.querySelectorAll('pre > code'); blocks.forEach((code) => { const pre = code.parentElement; if (!pre) return; if (pre.querySelector('.copy-code')) return; // mermaid 代码块由 mermaid.ts 渲染成 SVG,不注入 copy 按钮(图无需复制源码)。 if (code.classList.contains('language-mermaid')) return; const btn = document.createElement('button'); btn.className = 'copy-code'; btn.textContent = 'copy'; btn.setAttribute('aria-label', 'Copy code'); const codeText = code.textContent || ''; btn.addEventListener('click', () => { if (navigator.clipboard?.writeText) { navigator.clipboard.writeText(codeText); } else { const ta = document.createElement('textarea'); ta.value = codeText; ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); } btn.textContent = 'copied!'; setTimeout(() => { btn.textContent = 'copy'; }, 2000); }); pre.appendChild(btn); }); } export function initPostContent(selector: string): void { const root = document.querySelector(selector); if (!root) return; initCopyButtons(root); }