Kaynağa Gözat

:art: Repeated references to the same block within a block only count as one reference Fix https://github.com/siyuan-note/siyuan/issues/9670

Daniel 1 yıl önce
ebeveyn
işleme
6bb89ed2e5
2 değiştirilmiş dosya ile 23 ekleme ve 4 silme
  1. 2 2
      kernel/model/index_fix.go
  2. 21 2
      kernel/sql/database.go

+ 2 - 2
kernel/model/index_fix.go

@@ -73,8 +73,8 @@ func removeDuplicateDatabaseRefs() {
 		refreshRefsByDefID(rootID)
 	}
 
-	if 0 < len(duplicatedRootIDs) {
-		logging.LogWarnf("exist more than one ref duplicated [%d], reindex it", len(duplicatedRootIDs))
+	for _, rootID := range duplicatedRootIDs {
+		logging.LogWarnf("exist more than one ref duplicated [%s], reindex it", rootID)
 	}
 }
 

+ 21 - 2
kernel/sql/database.go

@@ -354,7 +354,9 @@ func refsFromTree(tree *parse.Tree) (refs []*Ref, fileAnnotationRefs []*FileAnno
 
 		if treenode.IsBlockRef(n) {
 			ref := buildRef(tree, n)
-			refs = append(refs, ref)
+			if !isRepeatedRef(refs, ref) {
+				refs = append(refs, ref)
+			}
 		} else if treenode.IsFileAnnotationRef(n) {
 			pathID := n.TextMarkFileAnnotationRefID
 			idx := strings.LastIndex(pathID, "/")
@@ -385,15 +387,32 @@ func refsFromTree(tree *parse.Tree) (refs []*Ref, fileAnnotationRefs []*FileAnno
 			fileAnnotationRefs = append(fileAnnotationRefs, ref)
 		} else if treenode.IsEmbedBlockRef(n) {
 			ref := buildEmbedRef(tree, n)
-			refs = append(refs, ref)
+			if !isRepeatedRef(refs, ref) {
+				refs = append(refs, ref)
+			}
 		}
 		return ast.WalkContinue
 	})
 	return
 }
 
+func isRepeatedRef(refs []*Ref, ref *Ref) bool {
+	// Repeated references to the same block within a block only count as one reference https://github.com/siyuan-note/siyuan/issues/9670
+	for _, r := range refs {
+		if r.DefBlockID == ref.DefBlockID && r.BlockID == ref.BlockID {
+			return true
+		}
+	}
+	return false
+}
+
 func buildRef(tree *parse.Tree, refNode *ast.Node) *Ref {
+	// 多个类型可能会导致渲染的 Markdown 不正确,所以这里只保留 block-ref 类型
+	tmpTyp := refNode.TextMarkType
+	refNode.TextMarkType = "block-ref"
 	markdown := treenode.ExportNodeStdMd(refNode, luteEngine)
+	refNode.TextMarkType = tmpTyp
+
 	defBlockID, text, _ := treenode.GetBlockRef(refNode)
 	var defBlockParentID, defBlockRootID, defBlockPath string
 	defBlock := treenode.GetBlockTree(defBlockID)