From 20cd2ac69629ce582eb82438a610dc79d66fd0ac Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 4 Jan 2024 22:04:29 +0800 Subject: [PATCH] :art: The database template column supports `queryBlocks` function https://github.com/siyuan-note/siyuan/issues/10077 --- kernel/model/template.go | 28 +--------------------------- kernel/treenode/node.go | 2 +- kernel/util/template.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/kernel/model/template.go b/kernel/model/template.go index 43fa5190f..f68ec071b 100644 --- a/kernel/model/template.go +++ b/kernel/model/template.go @@ -26,13 +26,11 @@ import ( "sort" "strings" "text/template" - "time" "github.com/88250/gulu" "github.com/88250/lute/ast" "github.com/88250/lute/parse" "github.com/88250/lute/render" - "github.com/araddon/dateparse" "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/av" @@ -217,32 +215,8 @@ func renderTemplate(p, id string, preview bool) (string, error) { dataModel["alias"] = block.Alias } - funcMap := util.BuiltInTemplateFuncs() - funcMap["queryBlocks"] = func(stmt string, args ...string) (ret []*sql.Block) { - for _, arg := range args { - stmt = strings.Replace(stmt, "?", arg, 1) - } - ret = sql.SelectBlocksRawStmt(stmt, 1, Conf.Search.Limit) - return - } - funcMap["querySpans"] = func(stmt string, args ...string) (ret []*sql.Span) { - for _, arg := range args { - stmt = strings.Replace(stmt, "?", arg, 1) - } - ret = sql.SelectSpansRawStmt(stmt, Conf.Search.Limit) - return - } - funcMap["parseTime"] = func(dateStr string) time.Time { - now := time.Now() - ret, err := dateparse.ParseIn(dateStr, now.Location()) - if nil != err { - logging.LogWarnf("parse date [%s] failed [%s], return current time instead", dateStr, err) - return now - } - return ret - } - goTpl := template.New("").Delims(".action{", "}") + funcMap := util.BuiltInTemplateFuncs() tpl, err := goTpl.Funcs(funcMap).Parse(gulu.Str.FromBytes(md)) if nil != err { return "", errors.New(fmt.Sprintf(Conf.Language(44), err.Error())) diff --git a/kernel/treenode/node.go b/kernel/treenode/node.go index 0853c513b..c752dbb12 100644 --- a/kernel/treenode/node.go +++ b/kernel/treenode/node.go @@ -962,8 +962,8 @@ func renderTemplateCol(ial map[string]string, tplContent string, rowValues []*av ial["updated"] = time.UnixMilli(block.Block.Updated).Format("20060102150405") } - funcMap := util.BuiltInTemplateFuncs() goTpl := template.New("").Delims(".action{", "}") + funcMap := util.BuiltInTemplateFuncs() tpl, tplErr := goTpl.Funcs(funcMap).Parse(tplContent) if nil != tplErr { logging.LogWarnf("parse template [%s] failed: %s", tplContent, tplErr) diff --git a/kernel/util/template.go b/kernel/util/template.go index 053790ade..b5fc612b2 100644 --- a/kernel/util/template.go +++ b/kernel/util/template.go @@ -18,9 +18,14 @@ package util import ( "math" + "strings" "text/template" + "time" "github.com/Masterminds/sprig/v3" + "github.com/araddon/dateparse" + "github.com/siyuan-note/logging" + "github.com/siyuan-note/siyuan/kernel/sql" "github.com/spf13/cast" ) @@ -34,6 +39,30 @@ func BuiltInTemplateFuncs() (ret template.FuncMap) { ret["powf"] = powf ret["log"] = log ret["logf"] = logf + + ret["queryBlocks"] = func(stmt string, args ...string) (retBlocks []*sql.Block) { + for _, arg := range args { + stmt = strings.Replace(stmt, "?", arg, 1) + } + retBlocks = sql.SelectBlocksRawStmt(stmt, 1, 512) + return + } + ret["querySpans"] = func(stmt string, args ...string) (retSpans []*sql.Span) { + for _, arg := range args { + stmt = strings.Replace(stmt, "?", arg, 1) + } + retSpans = sql.SelectSpansRawStmt(stmt, 512) + return + } + ret["parseTime"] = func(dateStr string) time.Time { + now := time.Now() + retTime, err := dateparse.ParseIn(dateStr, now.Location()) + if nil != err { + logging.LogWarnf("parse date [%s] failed [%s], return current time instead", dateStr, err) + return now + } + return retTime + } return }