From 09b23754dbc4cbaaba3f293807f6afd953f03fcb Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Fri, 8 Mar 2024 22:51:28 +0800
Subject: [PATCH] :art: Display the database title on the block superscript
https://github.com/siyuan-note/siyuan/issues/10545
---
kernel/model/attribute_view.go | 70 +++++++++++++++++++++++++++++++++-
kernel/model/file.go | 3 +-
2 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go
index c48d4a99a..22856d95a 100644
--- a/kernel/model/attribute_view.go
+++ b/kernel/model/attribute_view.go
@@ -1681,14 +1681,82 @@ func (tx *Transaction) doSetAttrViewName(operation *Operation) (ret *TxErr) {
return
}
+const attrAvNameTpl = `${avName}`
+
func setAttributeViewName(operation *Operation) (err error) {
- attrView, err := av.ParseAttributeView(operation.ID)
+ avID := operation.ID
+ attrView, err := av.ParseAttributeView(avID)
if nil != err {
return
}
attrView.Name = strings.TrimSpace(operation.Data.(string))
err = av.SaveAttributeView(attrView)
+
+ nodes := getAttrViewBoundNodes(attrView)
+ for _, node := range nodes {
+ oldAttrs := parse.IAL2Map(node.KramdownIAL)
+ nodeAvIDsVal := oldAttrs[av.NodeAttrNameAvs]
+ if "" == nodeAvIDsVal {
+ continue
+ }
+
+ avNames := bytes.Buffer{}
+ nodeAvIDs := strings.Split(nodeAvIDsVal, ",")
+ for _, nodeAvID := range nodeAvIDs {
+ var nodeAvName string
+ var getErr error
+ if nodeAvID == avID {
+ nodeAvName = attrView.Name
+ } else {
+ nodeAvName, getErr = av.GetAttributeViewName(nodeAvID)
+ if nil != getErr {
+ continue
+ }
+ }
+ if "" == nodeAvName {
+ nodeAvName = "Untitled"
+ }
+
+ tpl := strings.ReplaceAll(attrAvNameTpl, "${avID}", nodeAvID)
+ tpl = strings.ReplaceAll(tpl, "${avName}", nodeAvName)
+ avNames.WriteString(tpl)
+ avNames.WriteString(" ")
+ }
+ if 0 < avNames.Len() {
+ avNames.Truncate(avNames.Len() - 6)
+ node.SetIALAttr("av-names", avNames.String())
+ pushBroadcastAttrTransactions(oldAttrs, node)
+ }
+ }
+ return
+}
+
+func getAttrViewBoundNodes(attrView *av.AttributeView) (ret []*ast.Node) {
+ blockKeyValues := attrView.GetBlockKeyValues()
+ treeMap := map[string]*parse.Tree{}
+ for _, blockKeyValue := range blockKeyValues.Values {
+ if blockKeyValue.IsDetached {
+ continue
+ }
+
+ var tree *parse.Tree
+ tree = treeMap[blockKeyValue.BlockID]
+ if nil == tree {
+ tree, _ = loadTreeByBlockID(blockKeyValue.BlockID)
+ }
+ if nil == tree {
+ continue
+ }
+ treeMap[blockKeyValue.BlockID] = tree
+
+ node := treenode.GetNodeInTree(tree, blockKeyValue.BlockID)
+ if nil == node {
+ continue
+ }
+
+ ret = append(ret, node)
+ }
return
}
diff --git a/kernel/model/file.go b/kernel/model/file.go
index ef7a235a4..b401a3500 100644
--- a/kernel/model/file.go
+++ b/kernel/model/file.go
@@ -747,8 +747,7 @@ func GetDoc(startID, endID, id string, index int, query string, queryTypes map[s
avName = "Untitled"
}
- tpl := `${avName}`
- tpl = strings.ReplaceAll(tpl, "${avID}", avID)
+ tpl := strings.ReplaceAll(attrAvNameTpl, "${avID}", avID)
tpl = strings.ReplaceAll(tpl, "${avName}", avName)
avNames.WriteString(tpl)
avNames.WriteString(" ")