diff --git a/kernel/api/block.go b/kernel/api/block.go index 5111d2a5f..ca079e9a2 100644 --- a/kernel/api/block.go +++ b/kernel/api/block.go @@ -31,6 +31,26 @@ import ( "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) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index 1475ac87b..08032d446 100644 --- a/kernel/api/router.go +++ b/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/getHeadingLevelTransaction", model.CheckAuth, getHeadingLevelTransaction) 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/putFile", model.CheckAuth, putFile) diff --git a/kernel/model/block.go b/kernel/model/block.go index ce5e50e1f..70adde70f 100644 --- a/kernel/model/block.go +++ b/kernel/model/block.go @@ -22,8 +22,10 @@ import ( "github.com/88250/lute" "github.com/88250/lute/ast" + "github.com/88250/lute/parse" "github.com/siyuan-note/siyuan/kernel/sql" "github.com/siyuan-note/siyuan/kernel/treenode" + "github.com/siyuan-note/siyuan/kernel/util" ) // Block 描述了内容块。 @@ -88,6 +90,64 @@ func RecentUpdatedBlocks() (ret []*Block) { 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) { tree, err := loadTreeByBlockID(id) if nil != err {