From e3a6bb22519b8e0d176b68271a7580e4e3688a3f Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 4 Nov 2022 21:37:10 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=96=87=E6=A1=A3=E6=A0=91=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20`Ctrl+Click`=20=E5=92=8C=20`Shift+=E2=86=91/?= =?UTF-8?q?=E2=86=93`=20=E8=BF=9B=E8=A1=8C=E5=A4=9A=E9=80=89=20https://git?= =?UTF-8?q?hub.com/siyuan-note/siyuan/issues/1359?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/api/filetree.go | 23 +++++++++++++++++++++++ kernel/api/router.go | 1 + kernel/model/file.go | 19 +++++++++++++++++++ kernel/treenode/blocktree.go | 12 ++++++++++++ 4 files changed, 55 insertions(+) diff --git a/kernel/api/filetree.go b/kernel/api/filetree.go index 522969ee4..6607a43a2 100644 --- a/kernel/api/filetree.go +++ b/kernel/api/filetree.go @@ -193,6 +193,29 @@ func getHPathByPath(c *gin.Context) { ret.Data = hPath } +func getHPathsByPaths(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + pathsArg := arg["paths"].([]interface{}) + var paths []string + for _, p := range pathsArg { + paths = append(paths, p.(string)) + } + hPath, err := model.GetHPathsByPaths(paths) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + return + } + ret.Data = hPath +} + func getHPathByID(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index 436ee25f9..db19690a8 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -92,6 +92,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/filetree/moveDocs", model.CheckAuth, model.CheckReadonly, moveDocs) ginServer.Handle("POST", "/api/filetree/duplicateDoc", model.CheckAuth, model.CheckReadonly, duplicateDoc) ginServer.Handle("POST", "/api/filetree/getHPathByPath", model.CheckAuth, getHPathByPath) + ginServer.Handle("POST", "/api/filetree/getHPathsByPaths", model.CheckAuth, getHPathsByPaths) ginServer.Handle("POST", "/api/filetree/getHPathByID", model.CheckAuth, getHPathByID) ginServer.Handle("POST", "/api/filetree/getFullHPathByID", model.CheckAuth, getFullHPathByID) ginServer.Handle("POST", "/api/filetree/doc2Heading", model.CheckAuth, model.CheckReadonly, doc2Heading) diff --git a/kernel/model/file.go b/kernel/model/file.go index 679bcc284..0e2aeefe7 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -962,6 +962,25 @@ func GetHPathByPath(boxID, p string) (hPath string, err error) { return } +func GetHPathsByPaths(paths []string) (hPaths []string, err error) { + pathsBoxes := getBoxesByPaths(paths) + for p, box := range pathsBoxes { + if nil == box { + logging.LogWarnf("box not found by path [%s]", p) + continue + } + + bt := treenode.GetBlockTreeByPath(p) + if nil == bt { + logging.LogWarnf("block tree not found by path [%s]", p) + continue + } + + hPaths = append(hPaths, box.Name+bt.HPath) + } + return +} + func GetHPathByID(id string) (hPath string, err error) { tree, err := loadTreeByBlockID(id) if nil != err { diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index 2ed87ba9c..173823dd9 100644 --- a/kernel/treenode/blocktree.go +++ b/kernel/treenode/blocktree.go @@ -46,6 +46,18 @@ type BlockTree struct { HPath string // 文档逻辑路径 } +func GetBlockTreeByPath(path string) *BlockTree { + blockTreesLock.Lock() + defer blockTreesLock.Unlock() + + for _, b := range blockTrees { + if b.Path == path { + return b + } + } + return nil +} + func CountTrees() (ret int) { roots := map[string]bool{} for _, b := range blockTrees {