From 39041c8e9401ac4088f739aa271653c4d59774ec Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 19 Aug 2022 12:12:39 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E9=87=8D=E5=A4=8D=EF=BC=88=E5=85=8B?= =?UTF-8?q?=E9=9A=86=EF=BC=89=E6=96=87=E6=A1=A3=E5=90=8E=E8=87=AA=E8=BA=AB?= =?UTF-8?q?=E5=86=85=E9=83=A8=E5=9D=97=E5=BC=95=E4=B8=8D=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E6=8C=87=E5=90=91=E5=8E=9F=E6=96=87=E6=A1=A3=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=9D=97=20https://github.com/siyuan-note/siyuan/issues/5673?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/file.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/kernel/model/file.go b/kernel/model/file.go index 55768d75b..194ccd4ac 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -944,17 +944,45 @@ func DuplicateDoc(rootID string) (err error) { p := path.Join(path.Dir(tree.Path), tree.ID) + ".sy" tree.Path = p tree.HPath = tree.HPath + " " + titleSuffix + + // 收集所有引用 + refIDs := map[string]string{} + ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { + if !entering || ast.NodeBlockRefID != n.Type { + return ast.WalkContinue + } + refIDs[n.TokensStr()] = "1" + return ast.WalkContinue + }) + + // 重置块 ID ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering || ast.NodeDocument == n.Type { return ast.WalkContinue } if n.IsBlock() && "" != n.ID { - n.ID = ast.NewNodeID() + newID := ast.NewNodeID() + if "1" == refIDs[n.ID] { + // 如果是文档自身的内部引用 + refIDs[n.ID] = newID + } + n.ID = newID n.SetIALAttr("id", n.ID) } return ast.WalkContinue }) + // 重置内部引用 + ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { + if !entering || ast.NodeBlockRefID != n.Type { + return ast.WalkContinue + } + if "1" != refIDs[n.TokensStr()] { + n.Tokens = []byte(refIDs[n.TokensStr()]) + } + return ast.WalkContinue + }) + transaction := &Transaction{DoOperations: []*Operation{{Action: "create", Data: tree}}} err = PerformTransactions(&[]*Transaction{transaction}) if nil != err {