资讯动态

MooTool Electron 剪贴板格式转换:富文本转 Markdown、表格转 JSON 与安全保存实战指南

发布时间:2026/10/17 2:36:35 来源:尧图企业网站定制
桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载本文以 MooToolElectron 桌面版代码位于next/的命令面板剪贴板动作实现为线索系统讲解四类剪贴板转换动作富文本转 Markdown、表格转 JSON、剪贴板纯文本、剪贴板 HTML 源码以及配套的预览、复制、保存与内联参数模式。读完本文你将掌握这些动作的搜索命令、转换规则、边界限制与底层实现原理并知道如何通过仓库自带的测试命令验证行为是否符合预期。剪贴板动作一览四个动作四条搜索命令打开命令面板应用内搜索或全局快捷键后输入下表左侧的搜索命令即可定位对应动作。动作标题同时支持中英文搜索markdown、table json等别名与富文本转 Markdown、表格转 JSON等译名均可命中。执行后面板进入「结果预览」状态此时尚未改写剪贴板只有点击「复制结果」按钮剪贴板才会被写入转换后的文本。动作搜索命令默认保存格式富文本转 Markdownmarkdown/富文本转 Markdown.md表格转 JSONtable json/表格转 JSON.json剪贴板纯文本clipboard text/剪贴板文本.txt剪贴板 HTML 源码clipboard html/剪贴板 HTML.html这些动作可以设为「常用」固定/取消固定也会出现在「最近执行」列表中固定动作还会同步到系统托盘菜单的快捷入口。从源码看动作 ID 的固定pinnedActionIds与最近记录recentActionIds最多 5 条只以动作 ID 形式持久化见 next/src/shared/contracts/commandPalette.ts不保存任何剪贴板内容、转换结果或导出路径这是该功能默认的隐私边界。托盘入口也直接复用固定动作 ID 列表固定动作非空时取固定项否则回退到uuid、json-format、base64-decode三个默认动作trayCommandActions见 next/electron/main/index.ts 的updateTray实现。打开面板或仅输入关键词搜索不会读取剪贴板只有真正执行动作时才会触发读取。这一点在源码层面有明确约束四个剪贴板动作在 next/src/app/actionRegistry.ts 中登记其中clipboard-text、clipboard-html的输入类型分别为text与htmlhtml-markdown、table-json为rich-text——只有这四类动作在无内联参数时才会调用剪贴板读取回调其他动作如 UUID、JSON、Base64、URL、去重、时间戳都不触碰剪贴板。动作执行链路从命令面板到主进程剪贴板快照一次完整的剪贴板转换在 MooTool 内部经历以下链路渲染进程在命令面板中执行动作调用预加载脚本暴露的window.mootool.readCommandClipboard()见 next/electron/preload/index.ts该调用经 IPC 到达主进程的command-palette:read-clipboard处理器见 next/electron/main/index.ts主进程用 Electronclipboard.readText()读取纯文本仅当剪贴板availableFormats()中存在text/html时才读取clipboard.readHTML()同时立即校验两者长度任一超过 100,000 字符即抛错快照以{ text, html }结构返回渲染进程交由 next/src/features/search/CommandPalette.tsx 中的executeAction分发到具体转换函数转换完成后渲染进程把结果放进只读编辑器预览区此时用户可「复制结果」或「保存为文件」。值得注意的并发安全设计命令面板用递增的request序号做请求失效标记见 CommandPalette.tsx。当一次「富文本转 Markdown」动作的剪贴板读取尚未返回时若用户又执行了新的快速动作如uuid旧的剪贴板快照即使稍后才返回也会被直接丢弃不会覆盖新动作的预览结果——对应的端到端测试明确覆盖了这一「过期读取忽略」场景。富文本转 Markdown惰性模板片段与白名单转换执行「富文本转 Markdown」时应用从剪贴板读取一次文本/HTML 快照剪贴板有 HTML 格式时按 HTML 转换只有纯文本时原样保留文本此时等同复制一份纯文本。支持的标记包括常见段落、标题h1–h6、加粗、斜体、删除线、引用、有序/无序列表、链接、行内代码、代码块和普通表格其中表格首行作为 Markdown 表头输出。底层转换实现在 next/src/features/search/clipboardTransforms.ts 的clipboardHtmlToMarkdown。它的安全与保真策略值得展开惰性模板片段绝不插入活动页面。剪贴板中的 HTML 先被放入document.createElement(template)的template.innerHTML模板内容天然处于惰性状态脚本不会被解析执行也不会触发远程资源请求script、style、noscript、template、iframe、object、embed、form、input、button、svg、math等元素在转换前被直接移除不参与转换。图片只保留说明文字。img只输出alt属性文本不下载、不嵌入任何图片资源。端到端测试用一个本地 HTTP 服务伪造图片地址并统计请求数断言执行转换后请求数为 0。链接白名单。只有https:、http:、mailto:协议的链接才输出为 Markdown 链接且目标 URL 中的尖括号、空格、反斜杠会按需编码以避免破坏链接语法例如https://example.com/a(b)会输出为链接)javascript:等协议的链接只保留可见文字测试对此有专门断言。样式不保留。字号、颜色、布局等样式信息在转换中被丢弃这是有意的行为边界——该动作定位为「富文本内容到 Markdown 结构」的转换器不是完整的富文本排版转换器。代码块保真。pre内的换行与空白被原样保留代码围栏长度按代码内容中最长连续反引号动态扩展longestTicks逻辑避免围栏与内容冲突行内code则把换行折叠为空格。结构与规模上限Markdown 转换限制嵌套深度 100 层HTML 元素总数最多 5000 个超限分别以「HTML 结构过于复杂」类错误终止不会静默截断。「剪贴板 HTML 源码」动作则完全不同它原样预览并保存剪贴板中的 HTML 文本包括原有标签应用不会渲染或执行它。若剪贴板没有 HTML 格式readHTML()结果为空动作会直接报错「剪贴板没有 HTML 内容」绝不会把纯文本伪装成 HTML 输出executeAction中对html输入类型有noHtml与emptyInput双重校验。表格转 JSONTSV/CSV 自动识别与严格校验「表格转 JSON」优先转换 HTML 快照中的第一张表格HTML 中没有表格时回退解析剪贴板纯文本。纯文本解析覆盖两类常见来源TSV制表符分隔电子表格软件复制单元格时的默认格式CSV逗号分隔常用于复制导出结果。识别策略见parseClipboardTable应用扫描首行引号外的分隔符制表符数量大于 0 或逗号为 0 时按制表符解析否则按逗号单列表格按换行解析。这样可避免 CSV 引号内包含逗号时被误判列数。CSV/TSV 的引号规则遵循常规约定双引号包裹的字段可以包含换行与分隔符字段内两个连续双引号表示一个字面双引号解析时把引号内换行规范化为\n。对应单元测试见 next/src/features/search/clipboardTransforms.test.ts。转换与校验规则tableRowsToJson首行作为列名生成 JSON 对象键列名先去除首尾空白列名不能为空、不能重复含去空白后撞名如a与a否则报「列名不能为空或重复」每行列数必须与表头一致行数不足、列数多余、引号不配对、引号后紧邻普通字符等结构都会报错不会静默丢弃单元格数据不做类型推断001、true、false、空单元格均原样保留为字符串不会变成数字或布尔值HTML 表格中的单元格先去除首尾空白br标签转换为换行符htmlTableRows实现合并单元格colSpan/rowSpan非 1与嵌套表格直接报错要求先展开为普通表格。规模上限最多 200 列、5000 行数据动作输入上限 100,000 字符且 HTML 与文本快照分别检查此限制HTML 元素总数最多 5000 个。上述限制在parseClipboardTable列/行计数器与tableRowsToJson表头与数据行长度中双重强制并在 next/src/features/search/clipboardTransforms.test.ts 中有对应边界断言201 列表格、5002 行数据分别触发tableLimit。从实现细节看最终输出通过Object.fromEntries构建对象并JSON.stringify(rows, null, 2)美化输出测试还特别验证了__proto__、constructor这类特殊属性名不会污染对象原型。保存预览UTF-8 写入、JSON 校验与失败恢复所有文本动作的结果——包括既有的 UUID、JSON 格式化、Base64、URL、去重等命令动作——都可以在预览区选择.txt、.md、.json、.html四种格式后点击「保存为文件」。完整流程为保存对话框由主进程的原生dialog.showSaveDialog负责用户选择路径并确认是否覆盖默认文件名形如clipboard.md、clipboard.json扩展名与所选格式联动见 next/electron/main/index.ts 的files:save-text处理器应用以UTF-8编码把当前预览快照写入所选文件保存本身不改写剪贴板改变剪贴板内容也不影响已经显示在预览区的结果选择不同扩展名不重新转换内容只是换一种文件格式写出。值得注意的校验与错误处理选择.json格式时保存前先做一次JSON.parse语法检查不合法则不打开保存对话框并提示「当前预览不是有效 JSON」请用户换格式或先执行 JSON 转换取消保存对话框不写文件也不显示任何成功提示写入失败如目标目录不存在会提示「保存失败请重试或复制结果后手动保存」预览内容保留供用户重试或点击「复制结果」整个流程不模拟按键、不向其他应用粘贴、不监视剪贴板历史。端到端测试见 next/tests/electron/clipboard-actions.spec.ts对保存功能覆盖了真实 HTML/文本剪贴板、mockSave拦截原生对话框验证默认文件名与取消行为、readFile回读文件断言 UTF-8 内容与预览一致、保存失败后预览不回退以及紧凑窗口尺寸下保存控件不溢出面板。内联参数模式命令后带文本跳过剪贴板四个剪贴板动作都支持「命令后直接带文本参数」的内联模式。此时直接处理该参数不再读取剪贴板例如在面板输入markdown 你好 *世界*markdown动作原样保留纯文本不会尝试 HTML 转换table json 姓名\t编号\n张三\t001table json按 TSV/CSV 规则解析参数文本clipboard html p你好/pclipboard html原样保留显式传入的 HTML 字符串。该行为由 next/src/app/actionRegistry.ts 的searchActions与executeAction协同保证搜索时先做别名精确匹配再按「最长别名前缀 空格」匹配带参数的命令保证json minify {...}不会被json吞掉参数原文含首尾空白原样传给动作执行时只有argument undefined才读取剪贴板快照。单元测试 next/src/app/actionRegistry.test.ts 验证了「带参数时剪贴板读取回调完全不被调用」以及时间戳、Base64、URL、去重等其余动作的内联行为。隐私与安全设计要点只持久化动作 ID常用/最近记录、托盘同步均基于pinnedActionIds/recentActionIds剪贴板文本、HTML、转换结果、导出路径一律不入库读取发生在执行时而非搜索时打开面板、输入关键词只做动作匹配不会触碰剪贴板惰性 HTML富文本转换全程在template惰性片段中进行脚本、外部资源、表单控件被移除或隔离测试断言转换过程中 0 次外部请求、0 次脚本执行边界清晰纯文本不会伪装成 HTMLHTML 不会被执行javascript:链接降级为可见文字超限输入在读取阶段即被拒绝。验证与测试如何跑通这些行为仓库提供了两级验证手段静态与单元级执行npm run check该命令完成类型检查、单元测试与生产构建其中剪贴板解析与转换的单元测试集中在 next/src/features/search/clipboardTransforms.test.ts动作注册与分发逻辑的测试在 next/src/app/actionRegistry.test.ts。Electron 端到端级npx playwright test tests/electron/clipboard-actions.spec.ts tests/electron/command-palette.spec.ts tests/electron/command-preferences.spec.ts该命令在真实 Electron 环境中覆盖真实 HTML/文本剪贴板的读写、Markdown 常见结构标题/加粗/斜体/列表/链接/代码块/表格、代码块换行与围栏转义、脚本与远程资源隔离零请求断言、HTML 表格转 JSON、UTF-8 文件内容回读、JSON 保存前校验、取消与写入失败分支、过期读取快照的丢弃、常用/最近记录的持久化、紧凑布局下控件不溢出、浅色与深色主题渲染以及命令面板停靠在原生工具窗口上方的行为。平台适用前提根据 next/doc/clipboard-actions.md 的说明桌面端到端测试运行于 macOS测试产物输出均位于临时目录Windows/Linux 平台尚未实机验收。转换逻辑本身是平台无关的纯函数但剪贴板富文本格式的可用性在不同平台上可能有所差异。赞分享桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载相关推荐Clipboard剪贴板内容格式转换终极指南文本、图片、文件的无缝转换技巧Clipboard剪贴板内容格式转换终极指南文本、图片、文件的无缝转换技巧 Clipboard剪贴板管理器 是一款功能强大的命令行剪贴板工具能够智能处CLI开发工具Lexical Markdown支持无缝转换Markdown与富文本格式Lexical Markdown支持无缝转换Markdown与富文本格式 还在为富文本编辑器与Markdown格式之间的转换而烦恼吗Lexical框架提供了前端富文本Summernote粘贴格式化处理保留样式与纯文本转换Summernote粘贴格式化处理保留样式与纯文本转换 痛点解析剪贴板内容的格式混乱难题 在富文本编辑器Rich Text Editor富文本编辑器使前端富文本UI组件上一篇Zeron 架构全解Rust 引擎 gpui 界面 Cloudflare Durable Objects 三层拓扑下一篇x64dbg-MCP Server的71个MCP工具能力地图从断点到内存转储一网打尽创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑