求大佬 帮忙写一个 JS 代码,功能为为思源的导出 markdown 格式 添加快捷键。或者告知写代码方法也行,我是小白。
或者能把这下方这个 "Markdown 批量转换" 插件设置一个快捷键,能呼出转换面板 就更好啦~
求大佬 帮忙写一个 JS 代码,功能为为思源的导出 markdown 格式 添加快捷键。或者告知写代码方法也行,我是小白。
或者能把这下方这个 "Markdown 批量转换" 插件设置一个快捷键,能呼出转换面板 就更好啦~
确实用 zip 解压的方式较复杂,不过还有更简单方法,比如,直接读取文档 Markdown 源码,然后把内容直接写入到文件,这样只需要两步即可。
代码如下
// alt+d 导出markdown文档(docId为空导出当前文档) // see https://ld246.com/article/1743689632996 { // 导出文档的id(docId为空导出当前文档) const docId = ''; // 写入markdown文件路径 // 需填写绝对路径 // windows路径需要用\转义,比如 c:\\ const toPath = '/your/path/Downloads/'; // alt+d事件 document.addEventListener('keydown', async function(event) { // 检查是否按下了 Alt 键和 D 键,并确保没有按下其他修饰键 if ( event.altKey && // Alt 键被按下 event.code === 'KeyD' && // D 键被按下 !event.shiftKey && // Shift 键未被按下 !event.ctrlKey && // Ctrl 键未被按下 !event.metaKey // Cmd 键(Meta 键)未被按下 ) { event.preventDefault(); // 阻止默认行为(可选) if(!isElectron()) { showMessage('仅在Electron客户端有效', true); return; } // 获取Markdown文本 const doc = await fetchSyncPost("/api/lute/copyStdMarkdown", {id: docId || getCurrentDocId()}); if(!doc || doc.code !== 0) { showMessage(doc.msg || '获取文档失败', true); return; } const markdown = doc.data || ''; // 写入文本到文件 const fs = require('fs'); if (!fs.existsSync(toPath)) { showMessage('保存路径不存在', true); return; } let title = '未命名文档'; if(docId) { const docInfo = fetchSyncPost('/api/block/getDocInfo',{id:docId}); if(docInfo && docInfo.data && docInfo.data.name){ title = docInfo.data.name; } } else { title = getCurrentDocTitle() || title; } const path = require('path'); fs.appendFileSync(path.join(toPath, title + '.md'), markdown, 'utf8'); showMessage('已导出成功', false, 3000); } }, true); // 获取当前文档id function getCurrentDocId() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title')?.dataset?.nodeId; } function getCurrentDocTitle() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title__input')?.textContent; } // api请求 async function fetchSyncPost(url, data, method = 'POST') { return await (await fetch(url, {method: method, body: JSON.stringify(data||{})})).json(); } function isElectron() { return navigator.userAgent.includes('Electron'); } // 发送消息 function showMessage(message, isError = false, delay = 7000) { return fetch('/api/notification/' + (isError ? 'pushErrMsg' : 'pushMsg'), { "method": "POST", "body": JSON.stringify({"msg": message, "timeout": delay}) }); } }
试试这个 alt+d 导出 markdown 文档(docId 为空导出当前文档)
// alt+d 导出markdown文档(docId为空导出当前文档) // see https://ld246.com/article/1743689632996 { // 导出文档的id(docId为空导出当前文档) const docId = ''; // alt+d事件 document.addEventListener('keydown', async function(event) { // 检查是否按下了 Alt 键和 D 键,并确保没有按下其他修饰键 if ( event.altKey && // Alt 键被按下 event.code === 'KeyD' && // D 键被按下 !event.shiftKey && // Shift 键未被按下 !event.ctrlKey && // Ctrl 键未被按下 !event.metaKey // Cmd 键(Meta 键)未被按下 ) { event.preventDefault(); // 阻止默认行为(可选) const result = await fetchSyncPost('/api/export/exportMd', {id:docId||getCurrentDocId()}); window.open(result.data.zip); } }, true); // 获取当前文档id function getCurrentDocId() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title')?.dataset?.nodeId; } // api请求 async function fetchSyncPost(url, data, method = 'POST') { return await (await fetch(url, {method: method, body: JSON.stringify(data||{})})).json(); } }
感谢感谢~,我按照您的代码一次成功。导出的文件是 zip 文件夹,然后我在这个基础上用 ai 修改了一下,按 alt+d 之后,直接导出 markdown 文件,不经过浏览器下载。
但是遇到一个问题,每个文件导出时都会弹出一个“存储为”的窗口,让我选择 文件保存路径并填写文件名,文件名的位置 默认显示"未命名文档.md",每次都要修改,这就很麻烦。如果能够把这一步绕过去,直接存储,并以思源内的原始文件名进行保存,就太好了。如果绕不过去的话,能不能在每次都弹出这个窗口时,让文件名默认显示为 我导出文档的文件名呢, 这样我每次导出只需要按一个回车。具体代码如下:
确实用 zip 解压的方式较复杂,不过还有更简单方法,比如,直接读取文档 Markdown 源码,然后把内容直接写入到文件,这样只需要两步即可。
代码如下
// alt+d 导出markdown文档(docId为空导出当前文档) // see https://ld246.com/article/1743689632996 { // 导出文档的id(docId为空导出当前文档) const docId = ''; // 写入markdown文件路径 // 需填写绝对路径 // windows路径需要用\转义,比如 c:\\ const toPath = '/your/path/Downloads/'; // alt+d事件 document.addEventListener('keydown', async function(event) { // 检查是否按下了 Alt 键和 D 键,并确保没有按下其他修饰键 if ( event.altKey && // Alt 键被按下 event.code === 'KeyD' && // D 键被按下 !event.shiftKey && // Shift 键未被按下 !event.ctrlKey && // Ctrl 键未被按下 !event.metaKey // Cmd 键(Meta 键)未被按下 ) { event.preventDefault(); // 阻止默认行为(可选) if(!isElectron()) { showMessage('仅在Electron客户端有效', true); return; } // 获取Markdown文本 const doc = await fetchSyncPost("/api/lute/copyStdMarkdown", {id: docId || getCurrentDocId()}); if(!doc || doc.code !== 0) { showMessage(doc.msg || '获取文档失败', true); return; } const markdown = doc.data || ''; // 写入文本到文件 const fs = require('fs'); if (!fs.existsSync(toPath)) { showMessage('保存路径不存在', true); return; } let title = '未命名文档'; if(docId) { const docInfo = fetchSyncPost('/api/block/getDocInfo',{id:docId}); if(docInfo && docInfo.data && docInfo.data.name){ title = docInfo.data.name; } } else { title = getCurrentDocTitle() || title; } const path = require('path'); fs.appendFileSync(path.join(toPath, title + '.md'), markdown, 'utf8'); showMessage('已导出成功', false, 3000); } }, true); // 获取当前文档id function getCurrentDocId() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title')?.dataset?.nodeId; } function getCurrentDocTitle() { return (document.querySelector('[data-type="wnd"].layout__wnd--active .protyle:not(.fn__none)')||document.querySelector('[data-type="wnd"] .protyle:not(.fn__none)'))?.querySelector('.protyle-title__input')?.textContent; } // api请求 async function fetchSyncPost(url, data, method = 'POST') { return await (await fetch(url, {method: method, body: JSON.stringify(data||{})})).json(); } function isElectron() { return navigator.userAgent.includes('Electron'); } // 发送消息 function showMessage(message, isError = false, delay = 7000) { return fetch('/api/notification/' + (isError ? 'pushErrMsg' : 'pushMsg'), { "method": "POST", "body": JSON.stringify({"msg": message, "timeout": delay}) }); } }
Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。
DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。
gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。
GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。
Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。
单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。
应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。
人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。
有点意思就行了
安全永远都不是一个小问题。
ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。
网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。
InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。
上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。
Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。
Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。
欢迎访问我们运维的实例: https://wide.b3log.org
深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。