12.8 脚本插件 源码阅读器

    文件,本文件.html+任意源码.js

    功能,查看本html和.js的源码

    一  场景 src 静态路由,在不需要服务器的情况下就可以高亮查看,

     二  拓展  例如你想做一个游戏,能直接内部查看自己的源码 

    或者你想阅读Python源码,可以脚本把他转成js,后续加功能AI一体化等等

    可以把这个页面做成一个插件,博主时间有限,没有时间优化自己的语言,还请见谅

    源码  ,博主之前源码阅读还有

     1. 离线语法高亮   2.任意语言,语法高亮。 是复制进去查看那种,不是直接查看已有的。

    3. 本文,查看已有的源码。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>源码高亮查看器</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" id="prism-theme">
    <style>
        /* 1. 根元素CSS变量定义 */
        :root {
            --primary-color: #00b4d8;
            --secondary-color: #0077b6;
            --accent-color: #90e0ef;
            --code-bg: #0a0e27;
            --text-color: #e0f2fe;
            --border-color: #1e3a5f;
            --card-bg: rgba(255, 255, 255, 0.05);
            --base-font-size: 1rem;
            --header-height: 3.125rem; /* 50px */
        }

        /* 2. 全局重置样式 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        /* 3. HTML根元素设置 */
        html {
            font-size: 16px; /* 基准字体大小,1rem = 16px */
        }

        /* 4. 页面主体样式 */
        body {
            font-family: 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', monospace;
            background: linear-gradient(135deg, #0a0e27 0%, #1e3a5f 40%, #0077b6 100%);
            min-height: 100vh;
            color: var(--text-color);
            position: relative;
            overflow-x: hidden;
        }

        /* 5. 动态背景伪元素 */
        body::before {
            content: '';
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: 
                radial-gradient(circle at 25% 35%, rgba(0, 180, 216, 0.15) 0%, transparent 50%),
                radial-gradient(circle at 75% 65%, rgba(144, 224, 239, 0.1) 0%, transparent 50%),
                radial-gradient(circle at 50% 50%, rgba(0, 119, 182, 0.08) 0%, transparent 50%);
            background-size: 5rem 5rem, 3.75rem 3.75rem, 4.375rem 4.375rem;
            animation: backgroundFloat 30s linear infinite;
            z-index: 0;
        }

        /* 6. 背景动画关键帧 */
        @keyframes backgroundFloat {
            0% { transform: translate(0, 0) rotate(0deg); }
            100% { transform: translate(-2.5rem, -2.5rem) rotate(-360deg); }
        }

        /* 7. 主容器样式 */
        .container {
            position: relative;
            z-index: 1;
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            padding: 0;
        }

        /* 8. 页面头部样式 */
        .header {
            background: rgba(10, 14, 39, 0.95);
            backdrop-filter: blur(20px);
            padding: 0.5rem 0.625rem;
            border-bottom: 0.0625rem solid var(--border-color);
            display: flex;
            justify-content: space-between;
            align-items: center;
            position: sticky;
            top: 0;
            z-index: 100;
            box-shadow: 0 0.125rem 0.625rem rgba(0, 0, 0, 0.3);
            height: var(--header-height);
        }

        /* 9. 头部内容区域 */
        .header-content {
            display: flex;
            flex-direction: column;
            align-items: flex-start;
        }

        /* 10. 头部标题样式 */
        .header h1 {
            font-size: 1rem;
            font-weight: 700;
            background: linear-gradient(135deg, var(--primary-color), var(--accent-color), var(--secondary-color));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
            letter-spacing: 0.03125rem;
            line-height: 1.2;
        }

        /* 11. 方向提示文字 */
        .orientation-hint {
            font-size: 0.625rem;
            color: var(--accent-color);
            opacity: 0.8;
            margin-top: 0.125rem;
        }

        /* 12. 控制按钮容器 */
        .code-controls {
            display: flex;
            gap: 0.375rem;
            flex-wrap: wrap;
        }

        /* 13. 控制按钮基础样式 */
        .control-btn {
            background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
            color: white;
            border: none;
            padding: 0.375rem 0.5rem;
            border-radius: 0.5rem;
            cursor: pointer;
            font-size: 0.5625rem;
            font-weight: 500;
            transition: all 0.3s ease;
            display: flex;
            align-items: center;
            gap: 0.1875rem;
            white-space: nowrap;
            box-shadow: 0 0.125rem 0.5rem rgba(0, 180, 216, 0.3);
        }

        /* 14. 控制按钮悬停效果 */
        .control-btn:hover {
            transform: translateY(-0.125rem);
            box-shadow: 0 0.25rem 0.75rem rgba(0, 180, 216, 0.5);
        }

        /* 15. 控制按钮激活效果 */
        .control-btn:active {
            transform: translateY(-0.0625rem);
        }

        /* 16. 控制按钮选中状态 */
        .control-btn.active {
            background: linear-gradient(135deg, var(--accent-color), var(--primary-color));
            box-shadow: 0 0 0.9375rem rgba(144, 224, 239, 0.6);
        }

        /* 17. 主内容容器 */
        .main-container {
            flex: 1;
            display: flex;
            flex-direction: column;
            padding: 0;
            max-width: 100%;
        }

        /* 18. 代码展示区域 */
        .code-view {
            display: flex;
            flex: 1;
            flex-direction: column;
        }

        /* 19. 代码容器样式 */
        .code-container {
            flex: 1;
            background: var(--code-bg);
            overflow: auto;
            height: calc(100vh - var(--header-height));
            border: none;
            padding: 0.9375rem;
            width: 100%;
        }

        /* 20. 代码块样式 */
        pre[class*="language-"] {
            font-size: var(--base-font-size);
            transition: font-size 0.3s ease;
            margin: 0;
            padding: 0.9375rem;
            border-radius: 0;
        }

        /* 21. 加载提示样式 */
        .loading {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 12.5rem;
            color: #94a3b8;
            font-size: 1.125rem;
        }

        /* 22. Toast提示框样式 */
        .toast {
            position: fixed;
            bottom: 1.25rem;
            left: 50%;
            transform: translateX(-50%);
            background: rgba(0, 0, 0, 0.9);
            color: white;
            padding: 0.625rem 1.25rem;
            border-radius: 1.25rem;
            font-size: 0.75rem;
            z-index: 1000;
            opacity: 0;
            transition: opacity 0.3s ease;
            box-shadow: 0 0.1875rem 0.9375rem rgba(0, 0, 0, 0.4);
        }

        /* 23. Toast显示状态 */
        .toast.show {
            opacity: 1;
        }

        /* 24. 手机端适配 */
        @media (max-width: 768px) {
            html {
                font-size: 14px; /* 移动端基准字体大小 */
            }
            
            .header {
                padding: 0.375rem 0.5rem;
                height: 2.8125rem; /* 45px */
            }
            
            .header h1 {
                font-size: 0.875rem;
            }
            
            .orientation-hint {
                font-size: 0.5625rem;
            }
            
            .control-btn {
                padding: 0.3125rem 0.375rem;
                font-size: 0.5rem;
            }
            
            .code-container {
                padding: 0.625rem;
                height: calc(100vh - 2.8125rem);
            }
            
            pre[class*="language-"] {
                font-size: var(--base-font-size);
                padding: 0.625rem;
            }
        }

        /* 25. 超小屏幕适配 */
        @media (max-width: 480px) {
            html {
                font-size: 12px; /* 更小屏幕基准字体大小 */
            }
            
            .header {
                height: 2.5rem; /* 40px */
            }
            
            .code-container {
                height: calc(100vh - 2.5rem);
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <div class="header-content">
                <h1>「源码查看器」</h1>
                <div class="orientation-hint">请横屏阅读</div>
            </div>
            <div class="code-controls">
                <button class="control-btn" id="externalCodeBtn" onclick="showExternalCode()">📄外部代码</button>
                <button class="control-btn" id="pageSourceBtn" onclick="showPageSource()">🌐页面源码</button>
                <button class="control-btn" onclick="adjustZoom(-2)">🔍-</button>
                <button class="control-btn" onclick="adjustZoom(2)">🔍+</button>
                <button class="control-btn" onclick="resetZoom()">🔄</button>
                <button class="control-btn" onclick="cycleTheme()">🎨</button>
                <button class="control-btn" onclick="copyCode()">📋复制</button>
            </div>
        </div>
        <div class="main-container">
            <!-- 代码查看区域 -->
            <div class="code-view" id="codeView">
                <div class="code-container" id="codeContainer">
                    <div class="loading">正在加载代码...</div>
                </div>
            </div>
        </div>
    </div>
    
    <!-- Toast 提示 -->
    <div class="toast" id="toast"></div>
    
    <script>
        // 全局变量
        let currentFontSize = 1; // 1rem
        let currentCode = '';
        let externalCode = '';
        let pageSourceCode = '';
        let prismLoaded = false;
        let currentThemeIndex = 0;
        let currentViewMode = 'external'; // 'external' 或 'page'
        
        // 高亮主题配置
        const themes = [
            { name: 'Tomorrow Night', url: 'prism-tomorrow.min.css' },
            { name: 'Dark', url: 'prism-dark.min.css' },
            { name: 'Okaidia', url: 'prism-okaidia.min.css' },
            { name: 'VSC Dark Plus', url: 'prism-vsc-dark-plus.min.css' },
            { name: 'Atom Dark', url: 'prism-atom-dark.min.css' },
            { name: 'Synthwave 84', url: 'prism-synthwave84.min.css' },
            { name: 'Dracula', url: 'prism-dracula.min.css' },
            { name: 'Material Dark', url: 'prism-material-dark.min.css' }
        ];
        
        /* 1. 页面加载完成后执行的初始化函数 */
        window.onload = async function () {
            try {
                // 加载外部代码
                const response = await fetch('/A.数据库/2.相关插件/A_插件工具/3.插件_字体缩放.js');
                if (!response.ok) {
                    throw new Error('无法加载配置文件');
                }
                externalCode = await response.text();
                currentCode = externalCode;
                
                // 获取页面源代码
                pageSourceCode = await getPageSource();
                
                // 加载Prism.js
                if (!prismLoaded) {
                    await loadPrism();
                    prismLoaded = true;
                }
                
                // 显示代码
                displayCode();
                
                // 设置默认激活状态
                document.getElementById('externalCodeBtn').classList.add('active');
                
                showToast('代码加载完成');
            } catch (error) {
                console.error('初始化失败:', error);
                showToast('初始化失败,请刷新页面重试');
            }
        };
        
        /* 2. 初始化应用的主函数 */
        async function initApp() {
            try {
                // 加载外部代码
                const response = await fetch('1_五子棋config.js');
                if (!response.ok) {
                    throw new Error('无法加载配置文件');
                }
                externalCode = await response.text();
                currentCode = externalCode;
                
                // 获取页面源代码
                pageSourceCode = await getPageSource();
                
                // 加载Prism.js
                if (!prismLoaded) {
                    await loadPrism();
                    prismLoaded = true;
                }
                
                // 显示代码
                displayCode();
                
                // 设置默认激活状态
                document.getElementById('externalCodeBtn').classList.add('active');
                
                showToast('代码加载完成');
            } catch (error) {
                console.error('初始化失败:', error);
                showToast('初始化失败,请刷新页面重试');
            }
        }
        
        /* 3. 获取页面源代码的函数 */
        async function getPageSource() {
            // 获取当前页面的完整HTML源代码
            let pageSource = document.documentElement.outerHTML;
            
            // 格式化HTML(简单的缩进处理)
            pageSource = formatHTML(pageSource);
            
            return pageSource;
        }
        
        /* 4. 格式化HTML的函数 */
        function formatHTML(html) {
            let formatted = '';
            let indent = 0;
            const tab = '  '; // 2个空格作为缩进
            
            html.split(/>\s*</).forEach(function(element) {
                if (element.match(/^\/\w/)) {
                    // 闭合标签
                    indent--;
                }
                
                formatted += tab.repeat(Math.max(0, indent)) + '<' + element + '>\n';
                
                if (element.match(/^<?\w[^>]*[^\/]$/) && !element.startsWith("!--")) {
                    // 开始标签
                    indent++;
                }
            });
            
            return formatted.trim();
        }
        
        /* 5. 显示外部代码的函数 */
        function showExternalCode() {
            currentViewMode = 'external';
            currentCode = externalCode;
            displayCode();
            
            // 更新按钮状态
            document.getElementById('externalCodeBtn').classList.add('active');
            document.getElementById('pageSourceBtn').classList.remove('active');
            
            showToast('已切换到外部代码');
        }
        
        /* 6. 显示页面源代码的函数 */
        function showPageSource() {
            currentViewMode = 'page';
            currentCode = pageSourceCode;
            displayCode();
            
            // 更新按钮状态
            document.getElementById('pageSourceBtn').classList.add('active');
            document.getElementById('externalCodeBtn').classList.remove('active');
            
            showToast('已切换到页面源码');
        }
        
        /* 7. 加载Prism.js的函数 */
        async function loadPrism() {
            // 加载核心库
            await loadScript('https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js');
            // 加载自动加载器
            await loadScript('https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js');
        }
        
        /* 8. 动态加载脚本的函数 */
        function loadScript(url) {
            return new Promise((resolve, reject) => {
                const script = document.createElement('script');
                script.src = url;
                script.onload = resolve;
                script.onerror = reject;
                document.head.appendChild(script);
            });
        }
        
        /* 9. 显示代码高亮的函数 */
        function displayCode() {
            const container = document.getElementById('codeContainer');
            const language = detectLanguage(currentCode);
            let codeHtml = `<pre><code class="language-${language}">${escapeHtml(currentCode)}</code></pre>`;
            container.innerHTML = codeHtml;
            
            // 应用高亮
            if (window.Prism) {
                Prism.highlightAll();
            }
            
            // 应用当前字体大小
            applyFontSize();
        }
        
        /* 10. 检测代码语言的函数 */
        function detectLanguage(code) {
            if (currentViewMode === 'page') {
                // 页面源码使用HTML高亮
                return 'html';
            }
            
            // 检测JavaScript
            if (code.includes('const ') || code.includes('let ') || code.includes('function')) {
                return 'javascript';
            }
            // 检测JSON
            if ((code.startsWith('{') && code.endsWith('}')) || 
                (code.startsWith('[') && code.endsWith(']'))) {
                return 'json';
            }
            // 默认为JavaScript
            return 'javascript';
        }
        
        /* 11. 切换高亮主题的函数 */
        async function cycleTheme() {
            currentThemeIndex = (currentThemeIndex + 1) % themes.length;
            await applyTheme(currentThemeIndex);
            showToast(`已切换到: ${themes[currentThemeIndex].name}`);
            
            // 重新应用高亮
            if (window.Prism && currentCode) {
                displayCode();
            }
        }
        
        /* 12. 应用主题的函数 */
        async function applyTheme(index) {
            const theme = themes[index];
            const themeLink = document.getElementById('prism-theme');
            themeLink.href = `https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/${theme.url}`;
        }
        
        /* 13. 调整字体大小的函数 */
        function adjustZoom(delta) {
            // 将delta转换为rem单位(假设基准为16px,delta为px值)
            const deltaInRem = delta / 16;
            currentFontSize = Math.max(0.75, Math.min(1.625, currentFontSize + deltaInRem));
            applyFontSize();
            showToast(`字体大小: ${(currentFontSize * 16).toFixed(0)}px`);
        }
        
        /* 14. 应用字体大小的函数 */
        function applyFontSize() {
            document.documentElement.style.setProperty('--base-font-size', currentFontSize + 'rem');
            const codeElements = document.querySelectorAll('pre[class*="language-"]');
            codeElements.forEach(element => {
                element.style.fontSize = currentFontSize + 'rem';
            });
        }
        
        /* 15. 重置字体大小的函数 */
        function resetZoom() {
            currentFontSize = 1; // 1rem
            applyFontSize();
            showToast('字体大小已重置');
        }
        
        /* 16. 复制代码的函数 */
        function copyCode() {
            if (currentCode) {
                navigator.clipboard.writeText(currentCode).then(() => {
                    showToast('代码已复制到剪贴板');
                }).catch(() => {
                    showToast('复制失败,请手动选择复制');
                });
            }
        }
        
        /* 17. HTML转义的函数 */
        function escapeHtml(text) {
            const map = {
                '&': '&amp;',
                '<': '&lt;',
                '>': '&gt;',
                '"': '&quot;',
                "'": '&#039;'
            };
            return text.replace(/[&<>"']/g, m => map[m]);
        }
        
        /* 18. 显示提示消息的函数 */
        function showToast(message) {
            const toast = document.getElementById('toast');
            toast.textContent = message;
            toast.classList.add('show');
            setTimeout(() => {
                toast.classList.remove('show');
            }, 3000);
        }
        
        /* 19. 键盘事件监听函数 */
        document.addEventListener('keydown', function (e) {
            // Ctrl+Plus/Minus 调整字体大小
            if (e.ctrlKey || e.metaKey) {
                if (e.key === '+' || e.key === '=') {
                    e.preventDefault();
                    adjustZoom(2);
                } else if (e.key === '-' || e.key === '_') {
                    e.preventDefault();
                    adjustZoom(-2);
                } else if (e.key === '0') {
                    e.preventDefault();
                    resetZoom();
                } else if (e.key === 't' || e.key === 'T') {
                    e.preventDefault();
                    cycleTheme();
                } else if (e.key === '1') {
                    e.preventDefault();
                    showExternalCode();
                } else if (e.key === '2') {
                    e.preventDefault();
                    showPageSource();
                }
            }
        });
    </script>
</body>
</html>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值