求大佬 帮忙写一个 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})
});
}
}
ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。
HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。
H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。
OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。
Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。
IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。
NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。
CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。
Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。
星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网
找到自己的位置,萌新烦恼少。
宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。
RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。
有什么新发现就分享给大家吧!
如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。
Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。
ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。
智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。
Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。
用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖。
用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/
我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。
深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。
代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。
用户在该标签下分享代码片段时需在帖子标题前添加 [css]
或 [js]
用于区分代码片段类型。
WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。
Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。