调用 api 操作块支持撤回(使用 Transaction)

调用 api 操作块支持撤回(使用 Transaction)

see https://ld246.com/article/1736616348929

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

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

参考

image.png

留下你的脚步
推荐阅读