mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 07:00:12 +01:00
🎨 块引用与所引用的内容块进行交换 https://github.com/siyuan-note/siyuan/issues/4981
This commit is contained in:
parent
8b8859bc54
commit
875ffca004
3 changed files with 75 additions and 0 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,58 @@ 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)
|
||||||
|
refParentType := refNode.Parent.Type
|
||||||
|
defTree, err := loadTreeByBlockID(defID)
|
||||||
|
if nil != err {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defNode := treenode.GetNodeInTree(defTree, defID)
|
||||||
|
|
||||||
|
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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue