JavaScript代码块
(function() {
// 语言映射表,用于生成下载文件的扩展名
const langMap = {
'javascript': 'js',
'js': 'js',
'python': 'py',
'py': 'py',
'html': 'html',
'css': 'css',
'php': 'php',
'java': 'java',
'cpp': 'cpp',
'c': 'c',
'ruby': 'rb',
'go': 'go',
'rust': 'rs',
'swift': 'swift',
'kotlin': 'kt',
'typescript': 'ts',
'ts': 'ts',
'json': 'json',
'xml': 'xml',
'yaml': 'yml',
'markdown': 'md',
'md': 'md',
'bash': 'sh',
'sh': 'sh',
'shell': 'sh',
'sql': 'sql',
};
// 获取语言对应的文件扩展名
function getFileExtension(language) {
const lang = language.toLowerCase();
return langMap[lang] || 'txt';
}
// 处理所有代码块
function enhanceCodeBlocks() {
// 查找所有 pre > code 结构(典型的 Markdown 渲染结果)
document.querySelectorAll('pre code').forEach((codeBlock) => {
const pre = codeBlock.parentNode;
// 避免重复处理
if (pre.classList.contains('code-block-enhanced')) return;
pre.classList.add('code-block-enhanced');
// 获取语言类名(如 language-python)
let language = 'text';
const classList = codeBlock.classList;
for (let cls of classList) {
if (cls.startsWith('language-')) {
language = cls.replace('language-', '');
break;
}
}
// 获取代码内容
const codeText = codeBlock.innerText;
// 创建包裹容器
const wrapper = document.createElement('div');
wrapper.className = 'code-block-wrapper';
// 创建工具栏
const toolbar = document.createElement('div');
toolbar.className = 'code-toolbar';
const langSpan = document.createElement('span');
langSpan.className = 'code-language';
langSpan.textContent = language;
const actionsDiv = document.createElement('div');
actionsDiv.className = 'code-actions';
// 复制按钮
const copyBtn = document.createElement('button');
copyBtn.innerHTML = '📋 复制';
copyBtn.title = '复制代码';
copyBtn.addEventListener('click', (e) => {
e.stopPropagation();
navigator.clipboard.writeText(codeText).then(() => {
copyBtn.innerHTML = '✅ 已复制';
setTimeout(() => {
copyBtn.innerHTML = '📋 复制';
}, 2000);
}).catch(() => {
alert('复制失败,请手动复制');
});
});
// 下载按钮
const downloadBtn = document.createElement('button');
downloadBtn.innerHTML = '⬇️ 下载';
downloadBtn.title = '下载代码文件';
downloadBtn.addEventListener('click', (e) => {
e.stopPropagation();
const ext = getFileExtension(language);
const filename = `code.${ext}`;
const blob = new Blob([codeText], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
});
actionsDiv.appendChild(copyBtn);
actionsDiv.appendChild(downloadBtn);
toolbar.appendChild(langSpan);
toolbar.appendChild(actionsDiv);
// 将 pre 移动到 wrapper 中
pre.parentNode.insertBefore(wrapper, pre);
wrapper.appendChild(toolbar);
wrapper.appendChild(pre);
});
}
// 页面加载完成后执行
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', enhanceCodeBlocks);
} else {
enhanceCodeBlocks();
}
})();
本文著作权归作者 [ 老段同学 ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。