思源笔记插件开发笔记丨调用 api 操作块支持撤回(使用 Transaction)

思源笔记默认的块操作 api 不支持撤回,需要额外使用 Transaction 来实现撤回操作

只更新一个块 updateTransaction

await updateBlock('dom', updatedDom, blockId); protyle.getInstance().updateTransaction(blockId, updatedDom, originalDom);

操作多个块 transaction

  • 更新块撤回

    await updateBlock('dom', updatedDom, blockId); let doOperations: IOperation[] = []; let undoOperations: IOperation[] = []; doOperations.push({ action: "update", id: blockId, data: updatedDom }); undoOperations.push({ action: "update", id: blockId, data: originalDom }); protyle.getInstance().transaction(doOperations, undoOperations);
  • 删除块撤回

    await deleteBlock(blockData.id); let doOperations: IOperation[] = []; let undoOperations: IOperation[] = []; doOperations.push({ action: "delete", id: blockData.id, data: null }); undoOperations.push({ action: "insert", id: blockData.id, data: blockData.dom, previousID: firstBlockId, parentID: protyle.block.id }); protyle.getInstance().transaction(doOperations, undoOperations);
  • 插入块撤回:

    const newBlock = await insertBlock('markdown', content, null, previousId, null); let doOperations: IOperation[] = []; let undoOperations: IOperation[] = []; doOperations.push({ action: "insert", id: newId, data: newDom, previousID: previousId, parentID: protyle.block.id }); undoOperations.push({ action: "delete", id: newId, data: null }); protyle.getInstance().transaction(doOperations, undoOperations);

插件例子

Achuan-2/siyuan-plugin-text-process

实现了合并块、拆分块、去除上标、去除空格、链接转文本、英文符号转中文符号等块操作的撤回

参考

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25024 引用 • 103112 回帖 • 1 关注
4 操作
Achuan-2 在 2025-01-12 01:52:27 更新了该帖
Achuan-2 在 2025-01-12 01:39:44 更新了该帖
Achuan-2 在 2025-01-12 01:39:08 更新了该帖
Achuan-2 在 2025-01-12 01:37:59 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 川佬经常分享一些干货,感谢!

  • EmptyLight via Android

    既然川佬把我插件的功能已经全覆盖了,感觉可以找时间下架插件了 😂

    不过川佬有考虑过处理英文文本吗,就是全大写全小写行首大写这样的

    1 回复
  • Achuan-2 1 评论 via Android

    我没有这种场景哈哈,插件开发主要是自己需要我才会去开发,不会想着把功能做全,因为也不太能接受插件菜单一堆用不到的选项(虽然可以写一个设置,来关闭菜单选项)

    1 回复
    那好吧,我自己写,就不麻烦川佬了
    EmptyLight
  • cxg318

    protyle.getInstance().updateTransaction(blockId, updatedDom, originalDom);
    不用插件,直接用 javascript 可以吗?如果可以,怎么用