🎨 Shallow clone the corresponding database when the template contains database blocks https://github.com/siyuan-note/siyuan/issues/9494

This commit is contained in:
Daniel 2023-10-24 09:33:59 +08:00
parent d8bb02fb20
commit 7145460c18
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
2 changed files with 57 additions and 0 deletions

View file

@ -46,6 +46,45 @@ type AttributeView struct {
Views []*View `json:"views"` // 视图
}
func CloneAttributeView(av *AttributeView) (ret *AttributeView) {
ret = &AttributeView{}
data, err := gulu.JSON.MarshalJSON(av)
if nil != err {
logging.LogErrorf("marshal attribute view [%s] failed: %s", av.ID, err)
return nil
}
if err = gulu.JSON.UnmarshalJSON(data, ret); nil != err {
logging.LogErrorf("unmarshal attribute view [%s] failed: %s", av.ID, err)
return nil
}
ret.ID = ast.NewNodeID()
view, err := ret.GetView()
if nil == err {
view.ID = ast.NewNodeID()
ret.ViewID = view.ID
} else {
view = NewView()
ret.ViewID = view.ID
ret.Views = append(ret.Views, view)
}
keyIDMap := map[string]string{}
for _, kv := range ret.KeyValues {
newID := ast.NewNodeID()
keyIDMap[kv.Key.ID] = newID
kv.Key.ID = newID
kv.Values = []*Value{}
}
view.Table.ID = ast.NewNodeID()
for _, column := range view.Table.Columns {
column.ID = keyIDMap[column.ID]
}
view.Table.RowIDs = []string{}
return
}
// KeyValues 描述了属性视图属性列值的结构。
type KeyValues struct {
Key *Key `json:"key"` // 属性视图属性列

View file

@ -20,6 +20,7 @@ import (
"bytes"
"errors"
"fmt"
"github.com/siyuan-note/siyuan/kernel/av"
"io/fs"
"os"
"path/filepath"
@ -277,6 +278,23 @@ func renderTemplate(p, id string) (string, error) {
n.TextMarkInlineMathContent = strings.ReplaceAll(n.TextMarkInlineMathContent, "|", "|")
}
}
if ast.NodeAttributeView == n.Type {
// 重新生成数据库视图
attrView, parseErr := av.ParseAttributeView(n.AttributeViewID)
if nil != parseErr {
logging.LogErrorf("parse attribute view [%s] failed: %s", n.AttributeViewID, parseErr)
} else {
cloned := av.CloneAttributeView(attrView)
if nil != cloned {
n.AttributeViewID = cloned.ID
if saveErr := av.SaveAttributeView(cloned); nil != saveErr {
logging.LogErrorf("save attribute view [%s] failed: %s", cloned.ID, saveErr)
}
}
}
}
return ast.WalkContinue
})
for _, n := range nodesNeedAppendChild {