为了账号安全,请及时绑定邮箱和手机立即绑定

根据主模板实际需要动态解析子模板

根据主模板实际需要动态解析子模板

Go
沧海一幻觉 2022-12-19 10:35:44
假设我有大量的模板和子模板,那么我如何根据管道中需要的那些来解析子模板呢?template我的想法是读取当前要渲染的模板并找出它使用了哪些模板,但我不知道该怎么做,也许用正则表达式?PS:答案不必考虑子模板的多层嵌套。例子package mainimport (    "html/template"    "path/filepath")func CollectFiles(dir string, excludeList []string) (fileList []string, err error) {    // ...    return}func main() {    filePathList, _ := CollectFiles("dir/src", []string{".md"})    for _, curFile := range filePathList {        _, _ = template.New(filepath.Base(curFile)).            ParseFiles(curFile, "tmplA", "tmplB", "...", "tmplN")    }}假设主模板只需要 tmplA和tmplB作为子模板。我怎样才能检测到它只需要这两个?我不想每次添加或调整新模板时都更改程序。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您可以通过这种方式找到模板中的所有关键字。

regexp.MustCompile(`{{-? ?(template|partial) \"([^() ]*)\" ?.* ?-?}}`)

正则表达式101

当您遇到更复杂的情况时,哪里partial只是您使用的示例。您可以删除它或自行添加更多关键字。

go-playground


其他部分,比如CollectFiles我认为不是那么重要,如果有人需要参考下面


然后只需要过滤模板,找出当前文件使用的模板。


最后,无论何时添加模板,代码都不会更新。(除非您想更新站点上下文)


我在Github上写了一个可以运行的简单例子,这样人们就可以知道我想做什么。

子模板的嵌套。

如果你想处理这个。尝试使用这个功能

现在这将起作用

如果渲染:index.gohtml不仅base.gohtml包含而且还包含 { head.gohtmlnavbar.gohtmlfooter.gohtml}

<!-- index.gohtml --> 

{{- template "base.gohtml" . -}} <!-- 👈 --> 

{{define "head"}}

  <style>h2 {background-color: yellow;}

  </style>

{{end}}

{{define "body"}}

<h2>Welcome to XXX</h2>

{{end}}

在哪里base.gohtml


{{template "head.gohtml" . -}}

{{template "navbar.gohtml"}}

{{- block "body" . -}}

{{- end -}}

{{template "footer.gohtml"}}


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 61 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信