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(" ")