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

本贴最后更新于 344 天前,其中的信息可能已经东海扬尘

思源笔记默认的块操作 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

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

参考

  • 思源笔记

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

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

    28446 引用 • 119783 回帖
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 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • Achuan-2 1 评论

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

    1 回复
    那好吧,我自己写,就不麻烦川佬了
    EmptyLight
  • 其他回帖
  • Achuan-2 1 1 评论

    https://github.com/Achuan-2/siyuan-plugin-text-process

    可以看我的插件实现,可以改完之后,代码再在前端改动,就不用手动刷新了

    或者 api 和这个一起上,虽然麻烦,但能达成目的

    👍 明白了,学习到了,感谢大佬!
    wilsons
  • cxg318

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

  • 川佬经常分享一些干货,感谢!

  • 查看全部回帖
Achuan-2
公众号:https://mp.weixin.qq.com/s/_NrGwjJnEta0oT5a6EKdiA 知乎:https://www.zhihu.com/column/c_1922583788405359964 上海