一、实现方式
首先引入依赖,惯例还是 esm.sh,没啥特殊需要就不要修改版本号了(siyuan-noob 我更新比较频繁,直接拉最新版容易有 bug)。
import 自定义菜单 from 'siyuan-noob@1.3.33/customMenu/index.js' import 核心api from "siyuan-noob@1.3.33/utilKernel/kernelApi.js"
然后注册一个菜单项,这里就先不弄多语言啥的了,判定函数的意思是只有当块类型为嵌入块而且只有一个实例在显示的时候才会有这个菜单项:
自定义菜单.块标菜单.注册自定义菜单项({ id:"嵌入块批量删除", 文字:"批量删除所在文档", 判定函数:()=>{ return 自定义菜单.块标菜单.菜单状态.当前块类型=='NodeBlockQueryEmbed' && !document.querySelectorAll( `div[data-node-id="${自定义菜单.块标菜单.菜单状态.当前块id}"]` )[1] }, 点击回调函数:(e)=>{ let 当前块元素 = document.querySelector(`[data-node-id="${自定义菜单.块标菜单.菜单状态.当前块id}"]`) 移除嵌入块所有文档(当前块元素) } })
来实现一下那个移除嵌入块所有文档的函数
export async function 移除嵌入块所有文档(嵌入块元素){ let 嵌入块内部元素id数组 = [] 嵌入块元素.querySelectorAll('div[data-node-id]:not([data-type="NodeBlockQueryEmbed"])').forEach( el=>嵌入块内部元素id数组.push(el.dataset.nodeId) ) await 批量移除所在文档(嵌入块内部元素id数组) 嵌入块元素.querySelector( '.protyle-action__reload' ).click() }
然后我们把这个数组里面所有没有子文档的文档全都删掉
export async function 批量移除所在文档(id数组){ let sql=`select path from blocks where false ` id数组.forEach( id=>{ sql =sql+`or id='${id}'` } ) let 文档路径数组=[]; (await 核心api.sql({stmt:sql})).forEach( item=>{文档路径数组.push(item.path)} ) 文档路径数组=await 去除非空文件夹(文档路径数组) let confirmed =Iconfirm(`确认删除${文档路径数组.length}个文档?`) if(confirmed ){ await 核心api.removeDocs({paths:文档路径数组}) } }
上面弄了个去除非空文件夹,避免把有子文档的也给删了,这个去除非空文件夹是这么实现的:
export async function 去除非空文件夹(文档路径数组){ let 过滤后数组=[] 文档路径数组=Array.from(new Set(文档路径数组)) for await(let item of 文档路径数组){ let sql = `select path from blocks where not path = '${item }' and path like '${item.replace('.sy','')}%' and type ='d'` let res = await 核心api.sql({stmt:sql}) if(!res[0]){ 过滤后数组.push(item) } } return 过滤后数组 }
上面为了避免 electron 自己的确认框会造成窗口失去焦点,我们弄一个自己的确认框。
export function Iconfirm(str){ let _confirm let userAgent = navigator.userAgent.toLowerCase(); if (window.require){ const { dialog } = require('@electron/remote');//修改默认对话框,修复electron弹出默认对话 框后页面失去焦点的bug _confirm = function(str){ var options = { type: 'warning', buttons: ["确认删除","取消删除"], defaultId: 0, cancelId:1, detail:'', message: str } var flag = dialog.showMessageBoxSync(null,options); if(flag==0){ return true; }else{ return false; } } }else{ _confirm=window.confirm } return _confirm(str) } //感谢: //版权声明:本文为CSDN博主「modernk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 //原文链接:https://blog.csdn.net/modernk/article/details/128131919
二、使用方法
直接把这篇文档弄到你本地(注意代码块是不是 js 嗷)使用之前我发的这个代码片段就可以了,就那个运行到代码片段。
思源笔记折腾记录 - 运行你的笔记 - 链滴 (ld246.com)
水完收工,如果这玩意对你有用可以去爱发电给我买杯咖啡哒
leolee9086 正在创作一些简单的技术教程和小工具,以及设计方面内容 | 爱发电 (afdian.net)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于