Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2025-08-13 16:32:41 +08:00
commit c64214e754
5 changed files with 89 additions and 19 deletions

View file

@ -741,20 +741,6 @@ func (av *AttributeView) Clone() (ret *AttributeView) {
return
}
func (av *AttributeView) GetTemplateKeyRelevantKeys(templateKey *Key) (ret []*Key) {
ret = []*Key{}
if nil == templateKey || "" == templateKey.Template {
return
}
for _, kValues := range av.KeyValues {
if strings.Contains(templateKey.Template, "."+kValues.Key.Name) {
ret = append(ret, kValues.Key)
}
}
return
}
func GetAttributeViewDataPath(avID string) (ret string) {
av := filepath.Join(util.DataDir, "storage", "av")
ret = filepath.Join(av, avID+".json")

View file

@ -91,7 +91,7 @@ func getAttrViewAddingBlockDefaultValues(attrView *av.AttributeView, view, group
templateRelevantKeys, rollupRelevantKeys := map[string][]*av.Key{}, map[string]*av.Key{}
for _, keyValues := range attrView.KeyValues {
if av.KeyTypeTemplate == keyValues.Key.Type {
if tplRelevantKeys := attrView.GetTemplateKeyRelevantKeys(keyValues.Key); 0 < len(tplRelevantKeys) {
if tplRelevantKeys := sql.GetTemplateKeyRelevantKeys(attrView, keyValues.Key); 0 < len(tplRelevantKeys) {
for _, k := range tplRelevantKeys {
templateRelevantKeys[keyValues.Key.ID] = append(templateRelevantKeys[keyValues.Key.ID], k)
}

View file

@ -22,8 +22,10 @@ import (
"sort"
"strings"
"text/template"
"text/template/parse"
"time"
"github.com/88250/gulu"
"github.com/88250/lute/ast"
"github.com/jinzhu/copier"
"github.com/siyuan-note/logging"
@ -746,3 +748,85 @@ func manualSort(view *av.View, collection av.Collection) {
})
collection.SetItems(items)
}
func GetTemplateKeyRelevantKeys(attrView *av.AttributeView, templateKey *av.Key) (ret []*av.Key) {
ret = []*av.Key{}
if nil == templateKey || "" == templateKey.Template {
return
}
vars, err := getTemplateVars(templateKey.Template)
if nil != err {
return
}
for _, kValues := range attrView.KeyValues {
if gulu.Str.Contains(kValues.Key.Name, vars) {
ret = append(ret, kValues.Key)
}
}
if 1 > len(ret) {
// 没有相关字段情况下直接尝试解析模板,如果能解析成功则返回模板字段本身 https://github.com/siyuan-note/siyuan/issues/15560#issuecomment-3182691193
goTpl := template.New("").Delims(".action{", "}")
tplFuncMap := filesys.BuiltInTemplateFuncs()
SQLTemplateFuncs(&tplFuncMap)
goTpl = goTpl.Funcs(tplFuncMap)
_, parseErr := goTpl.Funcs(tplFuncMap).Parse(templateKey.Template)
if nil != parseErr {
return
}
ret = append(ret, templateKey)
}
return
}
func getTemplateVars(tplContent string) ([]string, error) {
goTpl := template.New("").Delims(".action{", "}")
tplFuncMap := filesys.BuiltInTemplateFuncs()
SQLTemplateFuncs(&tplFuncMap)
goTpl = goTpl.Funcs(tplFuncMap)
tpl, parseErr := goTpl.Funcs(tplFuncMap).Parse(tplContent)
if parseErr != nil {
return nil, parseErr
}
vars := make(map[string]struct{})
collectVars(tpl.Tree.Root, vars)
var result []string
for v := range vars {
result = append(result, v)
}
return result, nil
}
func collectVars(node parse.Node, vars map[string]struct{}) {
switch n := node.(type) {
case *parse.ListNode:
for _, child := range n.Nodes {
collectVars(child, vars)
}
case *parse.ActionNode:
collectVars(n.Pipe, vars)
case *parse.PipeNode:
for _, cmd := range n.Cmds {
collectVars(cmd, vars)
}
case *parse.CommandNode:
for _, arg := range n.Args {
collectVars(arg, vars)
}
if 3 <= len(n.Args) && n.Args[0].Type() == parse.NodeIdentifier && n.Args[1].Type() == parse.NodeDot && n.Args[2].Type() == parse.NodeString {
vars[n.Args[2].(*parse.StringNode).Text] = struct{}{}
}
case *parse.FieldNode:
if len(n.Ident) > 0 {
vars[n.Ident[0]] = struct{}{}
}
case *parse.VariableNode:
if len(n.Ident) > 0 {
vars[n.Ident[0]] = struct{}{}
}
}
}

View file

@ -113,10 +113,10 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query
// 批量获取块属性以提升性能
ials := BatchGetBlockAttrsWitTrees(ialIDs, boundTrees)
// 渲染自动生成的字段值,比如关联字段、汇总字段、创建时间字段和更新时间字段
// 渲染自动生成的字段值,比如关联、汇总、创建时间和更新时间
fillAttributeViewAutoGeneratedValues(attrView, ret, ials, cardsValues, depth)
// 最后单独渲染模板字段,这样模板字段就可以使用汇总、关联、创建时间和更新时间字段的值了
// 最后单独渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了
renderTemplateErr := fillAttributeViewTemplateValues(attrView, ret, ials, cardsValues)
if nil != renderTemplateErr {
util.PushErrMsg(fmt.Sprintf(util.Langs[util.Lang][44], util.EscapeHTML(renderTemplateErr.Error())), 30000)

View file

@ -106,10 +106,10 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
}
ials := BatchGetBlockAttrs(ialIDs)
// 渲染自动生成的列值,比如关联列、汇总列、创建时间列和更新时间列
// 渲染自动生成的字段值,比如关联、汇总、创建时间和更新时间
fillAttributeViewAutoGeneratedValues(attrView, ret, ials, rowsValues, depth)
// 最后单独渲染模板列,这样模板列就可以使用汇总、关联、创建时间和更新时间的值了
// 最后单独渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了
renderTemplateErr := fillAttributeViewTemplateValues(attrView, ret, ials, rowsValues)
if nil != renderTemplateErr {
util.PushErrMsg(fmt.Sprintf(util.Langs[util.Lang][44], util.EscapeHTML(renderTemplateErr.Error())), 30000)