From a16fde8ae7b5c4391a579c925cca5f6b9a523984 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 14 Dec 2023 22:54:27 +0800 Subject: [PATCH] :art: Add internal kernel API `/api/block/getTailChildBlocks` https://github.com/siyuan-note/siyuan/issues/9884 --- kernel/api/block.go | 26 +++++++++++++++++++++ kernel/api/router.go | 1 + kernel/model/block.go | 54 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/kernel/api/block.go b/kernel/api/block.go index 4ef021bd1..e6d32b2a3 100644 --- a/kernel/api/block.go +++ b/kernel/api/block.go @@ -533,3 +533,29 @@ func getChildBlocks(c *gin.Context) { ret.Data = model.GetChildBlocks(id) } + +func getTailChildBlocks(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) + if util.InvalidIDPattern(id, ret) { + return + } + + var n int + nArg := arg["n"] + if nil != nArg { + n = int(nArg.(float64)) + } + if 1 > n { + n = 7 + } + + ret.Data = model.GetTailChildBlocks(id, n) +} diff --git a/kernel/api/router.go b/kernel/api/router.go index 4367e4f43..571f78f01 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -160,6 +160,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/block/getBlockDOM", model.CheckAuth, getBlockDOM) ginServer.Handle("POST", "/api/block/getBlockKramdown", model.CheckAuth, getBlockKramdown) ginServer.Handle("POST", "/api/block/getChildBlocks", model.CheckAuth, getChildBlocks) + ginServer.Handle("POST", "/api/block/getTailChildBlocks", model.CheckAuth, getTailChildBlocks) ginServer.Handle("POST", "/api/block/getBlockBreadcrumb", model.CheckAuth, getBlockBreadcrumb) ginServer.Handle("POST", "/api/block/getBlockIndex", model.CheckAuth, getBlockIndex) ginServer.Handle("POST", "/api/block/getRefIDs", model.CheckAuth, getRefIDs) diff --git a/kernel/model/block.go b/kernel/model/block.go index 3309d1e74..9d9a88063 100644 --- a/kernel/model/block.go +++ b/kernel/model/block.go @@ -546,6 +546,60 @@ func GetChildBlocks(id string) (ret []*ChildBlock) { return } +func GetTailChildBlocks(id string, n int) (ret []*ChildBlock) { + ret = []*ChildBlock{} + if "" == id { + return + } + + tree, err := loadTreeByBlockID(id) + if nil != err { + return + } + + node := treenode.GetNodeInTree(tree, id) + if nil == node { + return + } + + if ast.NodeHeading == node.Type { + children := treenode.HeadingChildren(node) + for i := len(children) - 1; 0 <= i; i-- { + c := children[i] + ret = append(ret, &ChildBlock{ + ID: c.ID, + Type: treenode.TypeAbbr(c.Type.String()), + SubType: treenode.SubTypeAbbr(c), + }) + if n == len(ret) { + return + } + } + return + } + + if !node.IsContainerBlock() { + return + } + + for c := node.LastChild; nil != c; c = c.Previous { + if !c.IsBlock() { + continue + } + + ret = append(ret, &ChildBlock{ + ID: c.ID, + Type: treenode.TypeAbbr(c.Type.String()), + SubType: treenode.SubTypeAbbr(c), + }) + + if n == len(ret) { + return + } + } + return +} + func GetBlock(id string, tree *parse.Tree) (ret *Block, err error) { ret, err = getBlock(id, tree) return