🎨 Creating a dailynote template supports doc attributes https://github.com/siyuan-note/siyuan/issues/10698

This commit is contained in:
Daniel 2024-03-22 19:46:48 +08:00
parent 45df03aede
commit 8b7e6661f5
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
3 changed files with 28 additions and 20 deletions

View file

@ -85,7 +85,7 @@ func renderTemplate(c *gin.Context) {
preview = previewArg.(bool) preview = previewArg.(bool)
} }
content, err := model.RenderTemplate(p, id, preview) _, content, err := model.RenderTemplate(p, id, preview)
if nil != err { if nil != err {
ret.Code = -1 ret.Code = -1
ret.Msg = util.EscapeHTML(err.Error()) ret.Msg = util.EscapeHTML(err.Error())

View file

@ -1096,26 +1096,28 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) {
return return
} }
var dom string var templateTree *parse.Tree
var templateDom string
if "" != boxConf.DailyNoteTemplatePath { if "" != boxConf.DailyNoteTemplatePath {
tplPath := filepath.Join(util.DataDir, "templates", boxConf.DailyNoteTemplatePath) tplPath := filepath.Join(util.DataDir, "templates", boxConf.DailyNoteTemplatePath)
if !filelock.IsExist(tplPath) { if !filelock.IsExist(tplPath) {
logging.LogWarnf("not found daily note template [%s]", tplPath) logging.LogWarnf("not found daily note template [%s]", tplPath)
} else { } else {
dom, err = renderTemplate(tplPath, id, false) var renderErr error
if nil != err { templateTree, templateDom, renderErr = RenderTemplate(tplPath, id, false)
if nil != renderErr {
logging.LogWarnf("render daily note template [%s] failed: %s", boxConf.DailyNoteTemplatePath, err) logging.LogWarnf("render daily note template [%s] failed: %s", boxConf.DailyNoteTemplatePath, err)
} }
} }
} }
if "" != dom { if "" != templateDom {
var tree *parse.Tree var tree *parse.Tree
tree, err = LoadTreeByBlockID(id) tree, err = LoadTreeByBlockID(id)
if nil == err { if nil == err {
tree.Root.FirstChild.Unlink() tree.Root.FirstChild.Unlink()
luteEngine := util.NewLute() luteEngine := util.NewLute()
newTree := luteEngine.BlockDOM2Tree(dom) newTree := luteEngine.BlockDOM2Tree(templateDom)
var children []*ast.Node var children []*ast.Node
for c := newTree.Root.FirstChild; nil != c; c = c.Next { for c := newTree.Root.FirstChild; nil != c; c = c.Next {
children = append(children, c) children = append(children, c)
@ -1123,6 +1125,12 @@ func CreateDailyNote(boxID string) (p string, existed bool, err error) {
for _, c := range children { for _, c := range children {
tree.Root.AppendChild(c) tree.Root.AppendChild(c)
} }
templateIALs := parse.IAL2Map(templateTree.Root.KramdownIAL)
for k, v := range templateIALs {
if "name" == k || "alias" == k || "bookmark" == k || "memo" == k || "title" == k || strings.HasPrefix(k, "custom-") {
tree.Root.SetIALAttr(k, v)
}
}
tree.Root.SetIALAttr("updated", util.CurrentTimeSecondsStr()) tree.Root.SetIALAttr("updated", util.CurrentTimeSecondsStr())
if err = indexWriteJSONQueue(tree); nil != err { if err = indexWriteJSONQueue(tree); nil != err {
return return

View file

@ -183,24 +183,21 @@ func DocSaveAsTemplate(id, name string, overwrite bool) (code int, err error) {
return return
} }
func RenderTemplate(p, id string, preview bool) (string, error) { func RenderTemplate(p, id string, preview bool) (tree *parse.Tree, dom string, err error) {
return renderTemplate(p, id, preview) tree, err = LoadTreeByBlockID(id)
}
func renderTemplate(p, id string, preview bool) (string, error) {
tree, err := LoadTreeByBlockID(id)
if nil != err { if nil != err {
return "", err return
} }
node := treenode.GetNodeInTree(tree, id) node := treenode.GetNodeInTree(tree, id)
if nil == node { if nil == node {
return "", ErrBlockNotFound err = ErrBlockNotFound
return
} }
block := sql.BuildBlockFromNode(node, tree) block := sql.BuildBlockFromNode(node, tree)
md, err := os.ReadFile(p) md, err := os.ReadFile(p)
if nil != err { if nil != err {
return "", err return
} }
dataModel := map[string]string{} dataModel := map[string]string{}
@ -222,20 +219,23 @@ func renderTemplate(p, id string, preview bool) (string, error) {
goTpl = goTpl.Funcs(tplFuncMap) goTpl = goTpl.Funcs(tplFuncMap)
tpl, err := goTpl.Funcs(tplFuncMap).Parse(gulu.Str.FromBytes(md)) tpl, err := goTpl.Funcs(tplFuncMap).Parse(gulu.Str.FromBytes(md))
if nil != err { if nil != err {
return "", errors.New(fmt.Sprintf(Conf.Language(44), err.Error())) err = errors.New(fmt.Sprintf(Conf.Language(44), err.Error()))
return
} }
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
buf.Grow(4096) buf.Grow(4096)
if err = tpl.Execute(buf, dataModel); nil != err { if err = tpl.Execute(buf, dataModel); nil != err {
return "", errors.New(fmt.Sprintf(Conf.Language(44), err.Error())) err = errors.New(fmt.Sprintf(Conf.Language(44), err.Error()))
return
} }
md = buf.Bytes() md = buf.Bytes()
tree = parseKTree(md) tree = parseKTree(md)
if nil == tree { if nil == tree {
msg := fmt.Sprintf("parse tree [%s] failed", p) msg := fmt.Sprintf("parse tree [%s] failed", p)
logging.LogErrorf(msg) logging.LogErrorf(msg)
return "", errors.New(msg) err = errors.New(msg)
return
} }
var nodesNeedAppendChild, unlinks []*ast.Node var nodesNeedAppendChild, unlinks []*ast.Node
@ -357,8 +357,8 @@ func renderTemplate(p, id string, preview bool) (string, error) {
}) })
luteEngine := NewLute() luteEngine := NewLute()
dom := luteEngine.Tree2BlockDOM(tree, luteEngine.RenderOptions) dom = luteEngine.Tree2BlockDOM(tree, luteEngine.RenderOptions)
return dom, nil return
} }
func addBlockIALNodes(tree *parse.Tree, removeUpdated bool) { func addBlockIALNodes(tree *parse.Tree, removeUpdated bool) {