• 首页
  • 归档
  • 链接
  • 动态
  • 微语
  • 关于
  • 搜索
  • 夜间模式
    ©2026  冬山闲记 Theme by OneBlog

    冬山闲记博客

    搜索
    标签
    # 主题 # 电影 # 政府工作报告 # 惊蛰 # 体验 # 飞驰人生3 # 电影院 # Markdown # 软件 # 编辑器
  • 首页>
  • 编程>
  • 正文
  • javascript代码块

    2026年02月28日 82 阅读 0 评论 4272 字

    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();
        }
    })();
    本文著作权归作者 [ 老段同学 ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    首页归档链接动态微语关于
    Copyright©2026  All Rights Reserved.  Load:0.015 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。