首先实现一个函数, 用来把文档转换成目标文档的一个标题
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)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于