首先实现一个函数, 用来把文档转换成目标文档的一个标题
import 自定义菜单 from 'siyuan-noob@1.3.33/customMenu/index.js' import 核心api from "siyuan-noob@1.3.33/utilKernel/kernelApi.js" import {Dialog} from "siyuan-noob@1.3.33/customDialog/index.js"
首先实现一下菜单:
自定义菜单.编辑器菜单.注册自定义菜单项({ id:"转换子文档为标题", 文字:"转换所有子文档为标题(前置)", 点击回调函数:async(e)=>{ let 当前块id=自定义菜单.编辑器菜单.菜单状态.当前块id 显示遮罩() await 转换所有子文档为标题(当前块id) 隐藏遮罩() window.location.reload() } }) 自定义菜单.编辑器菜单.注册自定义菜单项({ id:"转换子文档为标题后置", 文字:"转换所有子文档为标题(后置)", 点击回调函数:async(e)=>{ let 当前块id=自定义菜单.编辑器菜单.菜单状态.当前块id 显示遮罩() await 转换所有子文档为标题(当前块id,true) 隐藏遮罩() window.location.reload() } }) 自定义菜单.文档树菜单.注册自定义菜单项({ id:"转换子文档为标题", 文字:"转换所有子文档为标题(前置)", 点击回调函数:async(e)=>{ let 当前块id=自定义菜单.文档树菜单.菜单状态.当前文档id 显示遮罩() await 转换所有子文档为标题(当前块id) 隐藏遮罩() window.location.reload() } }) 自定义菜单.文档树菜单.注册自定义菜单项({ id:"转换子文档为标题后置", 文字:"转换所有子文档为标题(后置)", 点击回调函数:async(e)=>{ let 当前块id=自定义菜单.文档树菜单.菜单状态.当前文档id 显示遮罩() await 转换所有子文档为标题(当前块id,true) 隐藏遮罩() window.location.reload() } })
搞个遮罩防止编辑,因为转换过程还是要一会儿嘛
let dialog function 显示遮罩(){ dialog=new Dialog({ title: "正在执行操作", content: '<div id="custom-dialogContent"></div>', width: "90vw", destroyCallback: async () => { }, disableClose:true }); dialog.initElement(); dialog.show() dialog.appendMsg=(content)=>{ dialog.element.querySelector('.b3-dialog__form').innerHTML+=content } } function 隐藏遮罩(){ dialog.destroy() }
首先实现一个转换函数:
export async function 转换文档为目标文档标题(文档id, 目标文档id,后置,插入位置) { let 目标文档内容 = await 核心api.getDoc({ id: 目标文档id, size: 102400, }); let div = document.createElement("div"); div.innerHTML = 目标文档内容.content; let 目标块id = div .querySelector("[data-node-id]") .getAttribute("data-node-id"); if(后置){ 目标块id =Array.from(div .querySelectorAll("[data-node-id]:not(div[data-node-id] div[data-node-id])") ).pop() .getAttribute("data-node-id"); } let data = await 核心api.doc2Heading({ srcID: 文档id, after: 后置?true:false, targetID: 目标块id, }); dialog.appendMsg(` <label class="b3-label fn__flex"> <div class="fn__flex-1"> <div class="b3-label__text"> 转换文档${文档id}到${目标文档id}内标题完成 </div> </div> <div class="fn__space"></div> `) }
然后我们来批处理一下
export async function 批量转换文档为标题(文档组,文档id,后置){ //这里为啥要倒一下 for await(let 文档属性 of !后置?文档组.reverse():文档组){ if(文档属性.subFileCount){ await 转换所有子文档为标题(文档属性.id,后置) } await 转换文档为目标文档标题(文档属性.id,文档id,后置) } }
export async function 转换所有子文档为标题(文档id,后置){ let 文档属性 = await 核心api.sql({stmt:`select * from blocks where id = '${文档id}'`}) let 子文档列表 = await 核心api.listDocsByPath( { notebook:文档属性[0].box, path: 文档属性[0].path, sort: window.siyuan.config.fileTree.sort } ) await 批量转换文档为标题(子文档列表.files,文档id,后置) }
使用方法
还是一样,你可以剪藏这篇笔记,通过:
思源笔记折腾记录 - 运行你的笔记 - 链滴 (ld246.com)
里面的代码片段来直接运行笔记内容就可以了.
水完收工,如果这玩意对你有用可以去爱发电给我买杯咖啡哒
leolee9086 正在创作一些简单的技术教程和小工具,以及设计方面内容 | 爱发电 (afdian.net)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于