求大佬 帮忙写一个 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})
});
}
}
Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。
VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。
开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。
发布对别人有帮助的原创内容是最好的 SEO 方式。
jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。
flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。
TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。
小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。
安全永远都不是一个小问题。
Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。
有点意思就行了
Logseq 是一个隐私优先、开源的知识库工具。
Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.
腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。
提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。
TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。
WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。
Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。
iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。
百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。
Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。
ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。
BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。
笔记整理交给我,一心只读圣贤书。
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。
确认过眼神后的灵魂连接,站在链在!
房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。