使用自定义代码进行复制、粘贴和更新操作,以块为单位进行操作,目前包含以下组件:
- 自定义块粘贴:将剪贴板内 html 粘贴至思源笔记,支持自定义规则,针对表格做了优化。
- 自定义块复制:复制块时将把块内容按指定方法处理后再写入剪贴板。
- 自定义块更新:使用自定义代码处理块内容并更新。
表格插入助手:将 html 类型的表格块转换为思源内置表格块。(已移除)粘贴为 Html 块:将剪贴板中内容粘贴为 Html 块。(已移除)流程图生成器:将块引用形式的流程转换为 Mermaid 流程图。(已移除)
将剪贴板内 html 粘贴至思源笔记,与普通粘贴的不同在于,针对表格做了优化,另外,使用mixmark-io/turndown: 🛏 An HTML to Markdown converter written in JavaScript (github.com)而不是 Lute 作为 html 转 markdown 工具。
- 在插件设置中设置 js 代码所在文档。
- 在上述文档中编写 js 代码。
- 点击粘贴位置处块的块标->插件->自定义粘贴
js 代码应该具有如下形式,关于 filter 和 replacement 的详细描述,参见turndown 文档。
{
filter: function (node, options) {
const fontSize = node.style.fontSize;
const fontSizeNum = parseInt(fontSize);
return fontSizeNum >= 22;
},
replacement: function (content, node, options) {
return "# " + content;
},
};
在思源中编写 js 代码,复制块时将把块内容按指定方法处理后再写入剪贴板。
❗ 函数内容可访问全局变量,请注意风险。
- 在插件设置中设置 js 代码所在文档。
- 在上述文档中编写 js 代码。
- 必须要有 return 语句
- 必须使用代码块,并明确表示是 js 代码
- 可以给块设置‘命名’以方便区分
- 支持直接使用的字段:
- id: 块 Id
- title:块所在文档名
- name:块命名
- markdown:块 markdow 文本
- content:块文本,去除了 markdown 标记
- input:整个 block 信息,详见思源笔记用户指南/请从这里开始/搜索进阶/数据库表
- index: 复制多个块时,块索引,内部使用
result += func(input, i);
对内容进行拼接(func(input, i)
为本步骤中编写的 js 代码) - inputArray(v0.2.4 新增): 复制多个块时,包含所有块
input
的列表
- 刷新界面(控制台运行
location.reload()
,即不支持热更新)- v0.2.4 以上版本:如果是已有脚本,则支持热更新,不用再刷新界面,但块标菜单显示不会更新
- 点击要复制的块的块标->插件->自定义复制
- v0.2.6 以上版本:支持设置自定义快捷键
- 函数内
Lute
与window.Lute
不同,为编辑器内使用的 Lute 实例(而非 Lute 类,不需要调用 Lute.New())
//block js 代码所在块
const func = new Function(
"input",
"index",
"inputArray",
`
let { title, name, content, markdown,id } = input;
${block.content}
`
);
以下代码将试图返回一个((20230402121202-gofgg1n '《民诉解释》第374条'))
形式的文本并写入剪贴板。
const matchGroup = content.match(/(第)(.*?)(条)/);
let realTitle = input.hpath.match(/《.*?》/);
if (!realTitle) {
realTitle = title;
}
let result = "";
if (matchGroup) {
result = `((${id} '${realTitle}${matchGroup[1]}${chineseToNum(
matchGroup[2]
)}${matchGroup[3]}'))`;
} else {
result = `((${id} '${realTitle}${content.substring(0, 5)}'))`;
}
return result;
function chineseToNum(chnStr) {
//该函数内容省略
}
在思源中编写 js 代码,使用该代码处理块内容并更新。
❗ 无论如何,使用脚本更新块都有一定的风险,请使用多个块测试没有问题后再使用该工具进行更新,并推荐对待更新内容进行备份。
❗ 函数内容可访问全局变量,请注意风险。
基本同自定义块复制,注意,返回值格式如下:
{
markdown?: string;
attrs?: { [key: string]: string };
isDelete?: boolean;
};
- markdown 表示更新后的块内容
- attr 表示更新后的属性
- 返回
isDelete
为 true,则会删除该块- 注意,由于
markdown
有内容才会对块进行处理,所以,若要删除该块,需要返回markdown
不为空 - 所选块的第一个块不能被删除
- 注意,由于
⚠️ 注意事项:
- 可以将一个块更新为多个块,但只有第一个块会继承或更新属性
- v0.2.4 以上版本:新增
inputArray
变量(详见 自定义块复制 部分),可以利用其将多个块更新为一个块,但是如果任何块返回markdown
内容为空,为保证数据安全,不会主动将其清空- v0.2.6 以上版本:支持
Ctrl+Z
撤销(🚀 实验性)
以下代码将把文本块按一定规则转化为列表块,并清除原有的别名和命名。
const list = markdown.split("\n");
let result = "";
let i = 0;
for (const text of list) {
let textResult = i ? text : text.replace(/(第.{1,6}条)/, "**$1** ");
textResult = "- " + textResult;
if (text.startsWith("(") || text.startsWith("(")) {
textResult = " " + textResult;
}
result += "\r\n" + textResult;
i++;
}
result = result + "\r\n---\r\n";
return { markdown: result, attrs: { name: "", alias: "" } };
以下代码生成一个嵌入块,该嵌入块将汇总其父级块的所有反向链接。
return {
markdown: `{{SELECT * FROM blocks WHERE id IN(SELECT block_id FROM refs WHERE def_block_id='${input.parent_id}')}}`,
};