假设我有大量的模板和子模板,那么我如何根据管道中需要的那些来解析子模板呢?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) \"([^() ]*)\" ?.* ?-?}}`)
当您遇到更复杂的情况时,哪里partial
只是您使用的示例。您可以删除它或自行添加更多关键字。
其他部分,比如CollectFiles
我认为不是那么重要,如果有人需要参考下面
然后只需要过滤模板,找出当前文件使用的模板。
最后,无论何时添加模板,代码都不会更新。(除非您想更新站点上下文)
我在Github上写了一个可以运行的简单例子,这样人们就可以知道我想做什么。
子模板的嵌套。
如果你想处理这个。尝试使用这个功能
现在这将起作用
如果渲染:index.gohtml
不仅base.gohtml
包含而且还包含 { head.gohtml
, navbar.gohtml
, footer.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"}}
- 1 回答
- 0 关注
- 61 浏览
添加回答
举报
0/150
提交
取消