Преглед изворни кода

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

Vanessa пре 1 година
родитељ
комит
83dce4f3e6
3 измењених фајлова са 35 додато и 10 уклоњено
  1. 1 1
      kernel/model/blockinfo.go
  2. 2 2
      kernel/model/file.go
  3. 32 7
      kernel/model/path.go

+ 1 - 1
kernel/model/blockinfo.go

@@ -120,7 +120,7 @@ func GetBlockRefText(id string) string {
 func GetDOMText(dom string) (ret string) {
 	luteEngine := NewLute()
 	tree := luteEngine.BlockDOM2Tree(dom)
-	ret = renderBlockText(tree.Root, nil)
+	ret = renderBlockText(tree.Root.FirstChild, nil)
 	return
 }
 

+ 2 - 2
kernel/model/file.go

@@ -1038,7 +1038,7 @@ func CreateWithMarkdown(boxID, hPath, md, parentID, id string) (retID string, er
 	WaitForWritingFiles()
 	luteEngine := util.NewLute()
 	dom := luteEngine.Md2BlockDOM(md, false)
-	retID, _, err = createDocsByHPath(box.ID, hPath, dom, parentID, id)
+	retID, err = createDocsByHPath(box.ID, hPath, dom, parentID, id)
 	return
 }
 
@@ -1442,7 +1442,7 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) {
 		return
 	}
 
-	id, existed, err := createDocsByHPath(box.ID, hPath, "", "", "")
+	id, err := createDocsByHPath(box.ID, hPath, "", "", "")
 	if nil != err {
 		return
 	}

+ 32 - 7
kernel/model/path.go

@@ -33,13 +33,8 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
-func createDocsByHPath(boxID, hPath, content, parentID, id string /* id 参数仅在 parentID 不为空的情况下使用 */) (retID string, existed bool, err error) {
+func createDocsByHPath(boxID, hPath, content, parentID, id string /* id 参数仅在 parentID 不为空的情况下使用 */) (retID string, err error) {
 	hPath = strings.TrimSuffix(hPath, ".sy")
-	pathBuilder := bytes.Buffer{}
-	pathBuilder.WriteString("/")
-	hPathBuilder := bytes.Buffer{}
-	hPathBuilder.WriteString("/")
-
 	if "" != parentID {
 		retID = id
 
@@ -62,11 +57,41 @@ func createDocsByHPath(boxID, hPath, content, parentID, id string /* id 参数
 		}
 	}
 
+	root := treenode.GetBlockTreeRootByPath(boxID, hPath)
+	if nil != root {
+		retID = root.ID
+		return
+	}
+
+	hPathBuilder := bytes.Buffer{}
+	hpathBtMap := map[string]*treenode.BlockTree{}
 	parts := strings.Split(hPath, "/")[1:]
+	// The subdoc creation path is unstable when a parent doc with the same name exists https://github.com/siyuan-note/siyuan/issues/9322
+	// 存在同名父文档时子文档创建路径不稳定,这里需要按照完整的 hpath 映射,不能在下面的循环中边构建 hpath 边构建 path,否则虽然 hpath 相同,但是会导致 path 组装错位
+	for i, part := range parts {
+		if i == len(parts)-1 {
+			break
+		}
+
+		hPathBuilder.WriteString("/")
+		hPathBuilder.WriteString(part)
+		hp := hPathBuilder.String()
+		root = treenode.GetBlockTreeRootByHPath(boxID, hp)
+		if nil == root {
+			break
+		}
+
+		hpathBtMap[hp] = root
+	}
+
+	pathBuilder := bytes.Buffer{}
+	pathBuilder.WriteString("/")
+	hPathBuilder = bytes.Buffer{}
+	hPathBuilder.WriteString("/")
 	for i, part := range parts {
 		hPathBuilder.WriteString(part)
 		hp := hPathBuilder.String()
-		root := treenode.GetBlockTreeRootByHPath(boxID, hp)
+		root = hpathBtMap[hp]
 		isNotLast := i < len(parts)-1
 		if nil == root {
 			retID = ast.NewNodeID()