当前位置: 首页 > article >正文

网页版修改本地数据器:重新布局,引入 highlight.js高亮显示代码

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>修改数据器</title>
    <!-- 引入 highlight.js 的 CSS 文件 -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/styles/default.min.css">
</head>
<style>
    /* 修改数据器按钮 */
    #readFolder {
        color: #67c23a;
        text-shadow: 1px 1px 1px #070707;
        cursor: pointer;
    }

    /* 修改数据器样式  开始*/
    #addReadFolderArea {
        margin-left: 10px;

        #addReadFolder {
            display: flex;

            /* 保存按钮 */
            #fileSave {
                color: #e6a23c;
            }

            /* 关闭按钮 */
            .cancel-button {
                color: #f56c6c;
            }
        }

        /* 修改内容区 */
        #fileContent {
            white-space: pre-wrap;
            border: 1px solid #ccc;
            padding: 5px;
            height: 865px;
            overflow: auto;
            /* 添加此行 */
        }
    }

    /* 修改数据器样式  结束*/
</style>

<body>
    <!-- 修改数据器按钮 -->
    <button type="button" id="readFolder" onclick="addReadFolderArea.show()">修改数据器</button>
    <!-- 修改内容区 -->
    <dialog id="addReadFolderArea"></dialog>
    <script>
        function initializeFileEditor() {
            // 初始化对话框内容
            document.getElementById('addReadFolderArea').innerHTML = `
            <div id="addReadFolder">
                <form id="buttonContainer">
                    <div id="fileTree"></div>
                    <button type="button" id="fileSave">保存</button>
                    <button type="submit"  class="cancel-button">关闭</button>                
                </form>
                <div id="fileContent" contenteditable="true" name="textarea1"></div>
            </div>
            `;
            // 简陋的编辑器功能
            let currentFileHandle = null; // 变量用于存储当前文件句柄
            document.getElementById('readFolder').addEventListener('click', async () => {
                try {
                    const directoryHandle = await window.showDirectoryPicker();
                    const fileTree = document.getElementById('fileTree');
                    const fileContent = document.getElementById('fileContent');
                    fileTree.innerHTML = ''; // 清空文件树内容
                    fileContent.innerHTML = ''; // 清空文件内容区域
                    async function readDirectory(directoryHandle, parentElement) {
                        const ul = document.createElement('ul');
                        parentElement.appendChild(ul);
                        for await (const entry of directoryHandle.values()) {
                            const li = document.createElement('li');
                            const entryName = document.createElement('span');
                            entryName.textContent = entry.name;
                            li.appendChild(entryName);
                            ul.appendChild(li);
                            if (entry.kind === 'directory') {
                                entryName.textContent = `[文件夹] ${entry.name}`;
                                li.addEventListener('click', async (e) => {
                                    e.stopPropagation();
                                    if (li.classList.contains('open')) {
                                        li.classList.remove('open');
                                        li.querySelector('ul').remove();
                                    } else {
                                        li.classList.add('open');
                                        await readDirectory(entry, li);
                                    }
                                });
                            } else if (entry.kind === 'file') {
                                li.addEventListener('click', async (e) => {
                                    e.stopPropagation();
                                    currentFileHandle = entry;
                                    const file = await entry.getFile();
                                    fileContent.style.display = 'block';
                                    fileContent.textContent = await file.text();
                                    // 使用 highlight.js 高亮显示代码
                                    hljs.highlightElement(fileContent);
                                });
                                const deleteButton = document.createElement('button');
                                deleteButton.textContent = '删除';
                                deleteButton.classList.add('delete-button');
                                deleteButton.addEventListener('click', async (e) => {
                                    e.stopPropagation();
                                    if (confirm(`确定删除 ${entry.name}?`)) {
                                        await directoryHandle.removeEntry(entry.name);
                                        li.remove();
                                        fileContent.innerHTML = '';
                                        alert('文件删除成功!');
                                    }
                                });
                                entryName.appendChild(deleteButton);
                            }
                        }
                    }
                    await readDirectory(directoryHandle, fileTree);
                } catch (error) {
                    console.error('操作失败:', error);
                    alert('操作失败,请重试。');
                }
            });
            // 同时按下Ctrl键和's'键保存
            document.addEventListener('keydown', async (event) => {
                if (event.ctrlKey && event.key === 's') {
                    event.preventDefault();
                    try {
                        if (currentFileHandle) {
                            const writable = await currentFileHandle.createWritable();
                            await writable.write(document.getElementById('fileContent').textContent);
                            await writable.close();
                            alert('文件保存成功!');
                        }
                    } catch (error) {
                        console.error('保存失败:', error);
                        alert('保存失败,请重试。');
                    }
                }
            });
            // 为id="fileSave"的保存按钮添加保存功能
            document.getElementById('fileSave').addEventListener('click', async () => {
                try {
                    if (currentFileHandle) {
                        const writable = await currentFileHandle.createWritable();
                        await writable.write(document.getElementById('fileContent').textContent);
                        await writable.close();
                        alert('文件保存成功!');
                    } else {
                        alert('请先选择一个文件进行编辑。');
                    }
                } catch (error) {
                    console.error('保存失败:', error);
                    alert('保存失败,请重试。');
                }
            });
        }
        // 初始化文件编辑器
        initializeFileEditor();
    </script>
    <!-- 引入 highlight.js 的 JavaScript 文件 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min.js"></script>
    <script>hljs.initHighlightingOnLoad();</script>
</body>

</html>


http://www.kler.cn/a/290647.html

相关文章:

  • Python的Web请求:requests库入门与应用
  • C++笔记---异常
  • LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
  • c/c++--struct对比
  • [vulnhub] DarkHole: 1
  • Redis集群模式之Redis Sentinel vs. Redis Cluster
  • 鸿蒙Next-拉起支付宝的三种方式——教程
  • 【Linux】理解Linux中的软链接与硬链接
  • 传统CV算法——背景建模算法介绍
  • 架构基础 -- 打点系统之FastAPI、python、grafana、prometheus实现
  • Unity数据持久化 之 文件操作(增删查改)
  • 【赵渝强老师】大数据生态圈中的组件
  • 8 自研rgbd相机基于rk3566之sensor图像解析与AWB算法原理
  • SQL语言的规则和规范
  • 盘点成都产业园前十,寻找你的理想创业地!
  • Pencils Protocol生态新进展,即将上线 Vault 产品
  • Python的list和numpy的array有什么区别?
  • 2024自动化测试面试真题(附答案)!
  • 基于FPGA的OV5640摄像头图像采集
  • centOS如何查看并放行防火墙3306端口
  • 无人机喊话器详解!!!
  • flannel,etcd,docker
  • Jmeter(十四)Jmeter分布式部署测试
  • LeetCode - 10 正则表达式匹配
  • C#文件的输入和输出
  • MATLAB生成COE文件