diff --git a/kernel/api/filetree.go b/kernel/api/filetree.go index c130ccbb3..8fbca97c7 100644 --- a/kernel/api/filetree.go +++ b/kernel/api/filetree.go @@ -475,6 +475,12 @@ func createDocWithMd(c *gin.Context) { return } + var parentID string + parentIDArg := arg["parentID"] + if nil != parentIDArg { + parentID = parentIDArg.(string) + } + hPath := arg["path"].(string) markdown := arg["markdown"].(string) @@ -490,7 +496,7 @@ func createDocWithMd(c *gin.Context) { hPath = "/" + hPath } - id, err := model.CreateWithMarkdown(notebook, hPath, markdown) + id, err := model.CreateWithMarkdown(notebook, hPath, markdown, parentID) if nil != err { ret.Code = -1 ret.Msg = err.Error() diff --git a/kernel/model/file.go b/kernel/model/file.go index ac116f995..a8d0dad7d 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -967,7 +967,7 @@ func CreateDocByMd(boxID, p, title, md string, sorts []string) (tree *parse.Tree return } -func CreateWithMarkdown(boxID, hPath, md string) (id string, err error) { +func CreateWithMarkdown(boxID, hPath, md, parentID string) (id string, err error) { box := Conf.Box(boxID) if nil == box { err = errors.New(Conf.Language(0)) @@ -977,7 +977,7 @@ func CreateWithMarkdown(boxID, hPath, md string) (id string, err error) { WaitForWritingFiles() luteEngine := util.NewLute() dom := luteEngine.Md2BlockDOM(md, false) - id, _, err = createDocsByHPath(box.ID, hPath, dom) + id, _, err = createDocsByHPath(box.ID, hPath, dom, parentID) return } @@ -1380,7 +1380,7 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) { return } - id, existed, err := createDocsByHPath(box.ID, hPath, "") + id, existed, err := createDocsByHPath(box.ID, hPath, "", "") if nil != err { return } diff --git a/kernel/model/path.go b/kernel/model/path.go index d775e706a..91731ff3b 100644 --- a/kernel/model/path.go +++ b/kernel/model/path.go @@ -32,13 +32,30 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) -func createDocsByHPath(boxID, hPath, content string) (id string, existed bool, err error) { +func createDocsByHPath(boxID, hPath, content, parentID string) (id string, existed bool, err error) { hPath = strings.TrimSuffix(hPath, ".sy") pathBuilder := bytes.Buffer{} pathBuilder.WriteString("/") hPathBuilder := bytes.Buffer{} hPathBuilder.WriteString("/") + if "" != parentID { + // The save path is incorrect when creating a sub-doc by ref in a doc with the same name https://github.com/siyuan-note/siyuan/issues/8138 + + // 在指定父文档 ID 的情况下优先查找父文档 + parentHPath, name := path.Split(hPath) + parentHPath = strings.TrimSuffix(parentHPath, "/") + preferredParent := treenode.GetBlockTreeRootByHPathPreferredParentID(boxID, parentHPath, parentID) + if nil != preferredParent && preferredParent.ID == parentID { + // 如果父文档存在且 ID 一致,则直接在父文档下创建 + id = ast.NewNodeID() + p := strings.TrimSuffix(preferredParent.Path, ".sy") + "/" + id + ".sy" + if _, err = createDoc(boxID, p, name, content); nil != err { + return + } + } + } + parts := strings.Split(hPath, "/")[1:] for i, part := range parts { hPathBuilder.WriteString(part) diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index ff0a0bc0e..045a7f35c 100644 --- a/kernel/treenode/blocktree.go +++ b/kernel/treenode/blocktree.go @@ -130,6 +130,38 @@ func GetBlockTreeRootByHPath(boxID, hPath string) (ret *BlockTree) { return } +func GetBlockTreeRootByHPathPreferredParentID(boxID, hPath, preferredParentID string) (ret *BlockTree) { + var roots []*BlockTree + blockTrees.Range(func(key, value interface{}) bool { + slice := value.(*btSlice) + slice.m.Lock() + for _, b := range slice.data { + if b.BoxID == boxID && b.HPath == hPath && b.RootID == b.ID { + if "" == preferredParentID { + ret = b + break + } + + roots = append(roots, b) + } + } + slice.m.Unlock() + return nil == ret + }) + if 1 > len(roots) { + return + } + + for _, root := range roots { + if root.ID == preferredParentID { + ret = root + return + } + } + ret = roots[0] + return +} + func GetBlockTree(id string) (ret *BlockTree) { if "" == id { return