فهرست منبع

:art: 支持引用转移 https://github.com/siyuan-note/siyuan/issues/4025

Liang Ding 2 سال پیش
والد
کامیت
4bdc3536a3
3فایلهای تغییر یافته به همراه58 افزوده شده و 0 حذف شده
  1. 20 0
      kernel/api/block.go
  2. 1 0
      kernel/api/router.go
  3. 37 0
      kernel/model/block.go

+ 20 - 0
kernel/api/block.go

@@ -30,6 +30,26 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func transferBlockRef(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	fromID := arg["fromID"].(string)
+	toID := arg["toID"].(string)
+	err := model.TransferBlockRef(fromID, toID)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		ret.Data = map[string]interface{}{"closeTimeout": 7000}
+		return
+	}
+}
+
 func swapBlockRef(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)

+ 1 - 0
kernel/api/router.go

@@ -170,6 +170,7 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/block/getHeadingChildrenIDs", model.CheckAuth, getHeadingChildrenIDs)
 	ginServer.Handle("POST", "/api/block/getHeadingChildrenDOM", model.CheckAuth, getHeadingChildrenDOM)
 	ginServer.Handle("POST", "/api/block/swapBlockRef", model.CheckAuth, swapBlockRef)
+	ginServer.Handle("POST", "/api/block/transferBlockRef", model.CheckAuth, transferBlockRef)
 
 	ginServer.Handle("POST", "/api/file/getFile", model.CheckAuth, getFile)
 	ginServer.Handle("POST", "/api/file/putFile", model.CheckAuth, putFile)

+ 37 - 0
kernel/model/block.go

@@ -115,6 +115,43 @@ func RecentUpdatedBlocks() (ret []*Block) {
 	return
 }
 
+func TransferBlockRef(fromID, toID string) (err error) {
+	toTree, _ := loadTreeByBlockID(toID)
+	if nil == toTree {
+		err = ErrBlockNotFound
+		return
+	}
+	toNode := treenode.GetNodeInTree(toTree, toID)
+	if nil == toNode {
+		err = ErrBlockNotFound
+		return
+	}
+	toRefText := getNodeRefText(toNode)
+
+	refIDs, _ := sql.QueryRefIDsByDefID(fromID, false)
+	for _, refID := range refIDs {
+		tree, _ := loadTreeByBlockID(refID)
+		if nil == tree {
+			continue
+		}
+		node := treenode.GetNodeInTree(tree, refID)
+		textMarks := node.ChildrenByType(ast.NodeTextMark)
+		for _, textMark := range textMarks {
+			if textMark.IsTextMarkType("block-ref") && textMark.TextMarkBlockRefID == fromID {
+				textMark.TextMarkBlockRefID = toID
+				if "s" == textMark.TextMarkBlockRefSubtype {
+					textMark.TextMarkTextContent = toRefText
+				}
+			}
+		}
+
+		if err = indexWriteJSONQueue(tree); nil != err {
+			return
+		}
+	}
+	return
+}
+
 func SwapBlockRef(refID, defID string, includeChildren bool) (err error) {
 	refTree, err := loadTreeByBlockID(refID)
 	if nil != err {