diff --git a/kernel/api/block.go b/kernel/api/block.go index 55d3132a1..826b92f01 100644 --- a/kernel/api/block.go +++ b/kernel/api/block.go @@ -189,6 +189,20 @@ func getHeadingChildrenIDs(c *gin.Context) { ret.Data = ids } +func appendHeadingChildren(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + id := arg["id"].(string) + dom := arg["dom"].(string) + model.AppendHeadingChildren(id, dom) +} + func getHeadingChildrenDOM(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) @@ -199,7 +213,11 @@ func getHeadingChildrenDOM(c *gin.Context) { } id := arg["id"].(string) - dom := model.GetHeadingChildrenDOM(id) + removeFoldAttr := false + if nil != arg["removeFoldAttr"] { + removeFoldAttr = arg["removeFoldAttr"].(bool) + } + dom := model.GetHeadingChildrenDOM(id, removeFoldAttr) ret.Data = dom } diff --git a/kernel/api/router.go b/kernel/api/router.go index e6cbf22f8..8e1f8e0f5 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -222,6 +222,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/block/getBlockRelevantIDs", model.CheckAuth, getBlockRelevantIDs) ginServer.Handle("POST", "/api/block/getBlockTreeInfos", model.CheckAuth, getBlockTreeInfos) ginServer.Handle("POST", "/api/block/checkBlockRef", model.CheckAuth, checkBlockRef) + ginServer.Handle("POST", "/api/block/appendHeadingChildren", model.CheckAuth, appendHeadingChildren) ginServer.Handle("POST", "/api/file/getFile", model.CheckAuth, getFile) ginServer.Handle("POST", "/api/file/putFile", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, putFile) diff --git a/kernel/model/block.go b/kernel/model/block.go index d84780af0..34c1eb694 100644 --- a/kernel/model/block.go +++ b/kernel/model/block.go @@ -20,6 +20,7 @@ import ( "bytes" "errors" "fmt" + "slices" "strings" "time" @@ -629,7 +630,35 @@ func GetHeadingChildrenIDs(id string) (ret []string) { return } -func GetHeadingChildrenDOM(id string) (ret string) { +func AppendHeadingChildren(id, childrenDOM string) { + tree, err := LoadTreeByBlockID(id) + if err != nil { + return + } + + heading := treenode.GetNodeInTree(tree, id) + if nil == heading || ast.NodeHeading != heading.Type { + return + } + + luteEngine := util.NewLute() + subTree := luteEngine.BlockDOM2Tree(childrenDOM) + var nodes []*ast.Node + for n := subTree.Root.FirstChild; nil != n; n = n.Next { + nodes = append(nodes, n) + } + + slices.Reverse(nodes) + for _, n := range nodes { + heading.InsertAfter(n) + } + + if err = indexWriteTreeUpsertQueue(tree); err != nil { + return + } +} + +func GetHeadingChildrenDOM(id string, removeFoldAttr bool) (ret string) { tree, err := LoadTreeByBlockID(id) if err != nil { return @@ -650,13 +679,18 @@ func GetHeadingChildrenDOM(id string) (ret string) { return ast.WalkContinue } - n.RemoveIALAttr("heading-fold") - n.RemoveIALAttr("fold") + if removeFoldAttr { + n.RemoveIALAttr("heading-fold") + n.RemoveIALAttr("fold") + } return ast.WalkContinue }) } - heading.RemoveIALAttr("fold") - heading.RemoveIALAttr("heading-fold") + + if removeFoldAttr { + heading.RemoveIALAttr("fold") + heading.RemoveIALAttr("heading-fold") + } luteEngine := util.NewLute() ret = renderBlockDOMByNodes(nodes, luteEngine)