Browse Source

Merge remote-tracking branch 'origin/dev' into dev

Vanessa 2 năm trước cách đây
mục cha
commit
a28683861b
3 tập tin đã thay đổi với 81 bổ sung0 xóa
  1. 20 0
      kernel/api/block.go
  2. 1 0
      kernel/api/router.go
  3. 60 0
      kernel/model/block.go

+ 20 - 0
kernel/api/block.go

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

+ 1 - 0
kernel/api/router.go

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

+ 60 - 0
kernel/model/block.go

@@ -22,8 +22,10 @@ import (
 
 
 	"github.com/88250/lute"
 	"github.com/88250/lute"
 	"github.com/88250/lute/ast"
 	"github.com/88250/lute/ast"
+	"github.com/88250/lute/parse"
 	"github.com/siyuan-note/siyuan/kernel/sql"
 	"github.com/siyuan-note/siyuan/kernel/sql"
 	"github.com/siyuan-note/siyuan/kernel/treenode"
 	"github.com/siyuan-note/siyuan/kernel/treenode"
+	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
 
 
 // Block 描述了内容块。
 // Block 描述了内容块。
@@ -88,6 +90,64 @@ func RecentUpdatedBlocks() (ret []*Block) {
 	return
 	return
 }
 }
 
 
+func SwapBlockRef(refID, defID string) (err error) {
+	refTree, err := loadTreeByBlockID(refID)
+	if nil != err {
+		return
+	}
+	refNode := treenode.GetNodeInTree(refTree, refID)
+	if nil == refNode {
+		return
+	}
+	refParentType := refNode.Parent.Type
+	defTree, err := loadTreeByBlockID(defID)
+	if nil != err {
+		return
+	}
+	defNode := treenode.GetNodeInTree(defTree, defID)
+	if nil == defNode {
+		return
+	}
+
+	refPivot := parse.NewParagraph()
+	refNode.InsertBefore(refPivot)
+
+	if ast.NodeListItem == defNode.Type {
+		if ast.NodeListItem != refParentType {
+			newID := ast.NewNodeID()
+			li := &ast.Node{ID: newID, Type: ast.NodeListItem, ListData: &ast.ListData{Typ: defNode.Parent.ListData.Typ}}
+			li.SetIALAttr("id", newID)
+			li.SetIALAttr("updated", newID[:14])
+			li.AppendChild(refNode)
+			defNode.InsertAfter(li)
+
+			newID = ast.NewNodeID()
+			list := &ast.Node{ID: newID, Type: ast.NodeList, ListData: &ast.ListData{Typ: defNode.Parent.ListData.Typ}}
+			list.SetIALAttr("id", newID)
+			list.SetIALAttr("updated", newID[:14])
+			list.AppendChild(defNode)
+			refPivot.InsertAfter(list)
+		} else {
+			defNode.InsertAfter(refNode)
+			refPivot.InsertAfter(defNode)
+		}
+	} else {
+		defNode.InsertAfter(refNode)
+		refPivot.InsertAfter(defNode)
+	}
+	refPivot.Unlink()
+
+	if err = writeJSONQueue(refTree); nil != err {
+		return
+	}
+	if err = writeJSONQueue(defTree); nil != err {
+		return
+	}
+	WaitForWritingFiles()
+	util.ReloadUI()
+	return
+}
+
 func GetHeadingChildrenDOM(id string) (ret string) {
 func GetHeadingChildrenDOM(id string) (ret string) {
 	tree, err := loadTreeByBlockID(id)
 	tree, err := loadTreeByBlockID(id)
 	if nil != err {
 	if nil != err {