diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index b9ff07c46..ba6c87140 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -886,11 +886,19 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { if "" == strings.TrimSpace(n.TextMarkInlineMathContent) { unlinks = append(unlinks, n) } + } else if n.IsTextMarkType("block-ref") { + sql.CacheRef(subTree, n) + + if "d" == n.TextMarkBlockRefSubtype { + // 偶发编辑文档标题后引用处的动态锚文本不更新 https://github.com/siyuan-note/siyuan/issues/5891 + // 使用缓存的动态锚文本强制覆盖当前块中的引用节点动态锚文本 + if dRefText, ok := treenode.DynamicRefTexts.Load(n.TextMarkBlockRefID); ok && "" != dRefText { + n.TextMarkTextContent = dRefText.(string) + } + } } } else if ast.NodeBlockRef == n.Type { sql.CacheRef(subTree, n) - } else if ast.NodeTextMark == n.Type && n.IsTextMarkType("block-ref") { - sql.CacheRef(subTree, n) } return ast.WalkContinue }) diff --git a/kernel/sql/cache.go b/kernel/sql/cache.go index d0793c612..f9ecaddfd 100644 --- a/kernel/sql/cache.go +++ b/kernel/sql/cache.go @@ -93,6 +93,8 @@ func ClearVirtualRefKeywords() { memCache.Del("virtual_ref") } +var defIDRefsCache = gcache.New(30*time.Minute, 5*time.Minute) // [defBlockID]map[refBlockID]*Ref + func GetRefsCacheByDefID(defID string) (ret []*Ref) { for defBlockID, refs := range defIDRefsCache.Items() { if defBlockID == defID { @@ -110,8 +112,6 @@ func GetRefsCacheByDefID(defID string) (ret []*Ref) { return } -var defIDRefsCache = gcache.New(30*time.Minute, 5*time.Minute) // [defBlockID]map[refBlockID]*Ref - func CacheRef(tree *parse.Tree, refNode *ast.Node) { ref := buildRef(tree, refNode) putRefCache(ref) diff --git a/kernel/treenode/node.go b/kernel/treenode/node.go index fc5f6ee5e..29a2238b6 100644 --- a/kernel/treenode/node.go +++ b/kernel/treenode/node.go @@ -19,6 +19,7 @@ package treenode import ( "bytes" "strings" + "sync" "github.com/88250/lute" "github.com/88250/lute/ast" @@ -358,6 +359,8 @@ func GetLegacyDynamicBlockRefDefIDs(node *ast.Node) (ret []string) { return } +var DynamicRefTexts = sync.Map{} + func SetDynamicBlockRefText(blockRef *ast.Node, refText string) { if !IsBlockRef(blockRef) { return @@ -384,6 +387,9 @@ func SetDynamicBlockRefText(blockRef *ast.Node, refText string) { blockRef.TextMarkBlockRefSubtype = "d" blockRef.TextMarkTextContent = refText + + // 偶发编辑文档标题后引用处的动态锚文本不更新 https://github.com/siyuan-note/siyuan/issues/5891 + DynamicRefTexts.Store(blockRef.TextMarkBlockRefID, refText) } func GetDynamicBlockRefText(blockRef *ast.Node) string {