From b69e8d335726fb64e35b4d80b844e4e30e5d6344 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 1 Oct 2023 10:58:46 +0800 Subject: [PATCH] :art: Add template type column to Attribute View https://github.com/siyuan-note/siyuan/issues/8766 --- kernel/av/av.go | 4 ++++ kernel/model/attribute_view.go | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/kernel/av/av.go b/kernel/av/av.go index a8794f382f0..385692a8aa0 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -354,6 +354,10 @@ type ValueTemplate struct { RenderedContent string `json:"renderedContent"` } +func (t *ValueTemplate) Render(blockID string, r func(blockID string) string) { + t.RenderedContent = r(blockID) +} + // View 描述了视图的结构。 type View struct { ID string `json:"id"` // 视图 ID diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 9278b84584a..e25cb123dbb 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -17,12 +17,15 @@ package model import ( + "bytes" "sort" "strings" + "text/template" "github.com/88250/gulu" "github.com/88250/lute/ast" "github.com/88250/lute/parse" + "github.com/Masterminds/sprig/v3" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/av" "github.com/siyuan-note/siyuan/kernel/treenode" @@ -227,6 +230,27 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a tableCell.Value.Number.FormatNumber() } + // 渲染模板列 + if av.KeyTypeTemplate == tableCell.ValueType && nil != tableCell.Value && nil != tableCell.Value.Template { + render := func(blockID string) string { + funcMap := sprig.TxtFuncMap() + goTpl := template.New("").Delims(".action{", "}") + tpl, tplErr := goTpl.Funcs(funcMap).Parse(tableCell.Value.Template.Content) + if nil != tplErr { + logging.LogWarnf("parse template [%s] failed: %s", tableCell.Value.Template.Content, err) + } + + buf := &bytes.Buffer{} + ial := GetBlockAttrs(blockID) + if err = tpl.Execute(buf, ial); nil != err { + logging.LogWarnf("execute template [%s] failed: %s", tableCell.Value.Template.Content, err) + } + return buf.String() + } + + tableCell.Value.Template.Render(tableCell.Value.BlockID, render) + } + tableRow.Cells = append(tableRow.Cells, tableCell) } ret.Rows = append(ret.Rows, &tableRow)