根据主模板实际需要动态解析子模板
Dynamically parse sub-templates based on those actually required by the main template
假设我有大量带有子模板的模板,那么如何根据template
管道中需要的那些来解析sub-templates?
我的想法是读取当前要渲染的模板,找出它使用了哪些模板,但我不知道该怎么做,也许用正则表达式?
PS:答案不必考虑子模板的多级嵌套。
示例
package main
import (
"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
作为子模板。我怎样才能检测到它只需要这两个?
我不想每次添加或调整新模板时都更改程序。
您可以通过这种方式找到模板中的所有关键字。
regexp.MustCompile(`{{-? ?(template|partial) \"([^() ]*)\" ?.* ?-?}}`)
其中 partial
只是一个示例,供您在遇到更复杂的情况时使用。您可以自行删除或添加更多关键字。
其他部分,比如CollectFiles
我觉得不是那么重要,如果有人需要参考下面
然后只需要filter个模板就可以知道当前文件使用的是什么模板。
最后,code 无需在添加模板时进行更新。 (除非您想更新站点上下文)
我在Github上写了一个简单的example,可以运行让人们知道我想做什么。
sub-template 的嵌套。
如果你想处理这个。尝试使用这个 function
现在可以了
如果渲染: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"}}
假设我有大量带有子模板的模板,那么如何根据template
管道中需要的那些来解析sub-templates?
我的想法是读取当前要渲染的模板,找出它使用了哪些模板,但我不知道该怎么做,也许用正则表达式?
PS:答案不必考虑子模板的多级嵌套。
示例
package main
import (
"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
作为子模板。我怎样才能检测到它只需要这两个?
我不想每次添加或调整新模板时都更改程序。
您可以通过这种方式找到模板中的所有关键字。
regexp.MustCompile(`{{-? ?(template|partial) \"([^() ]*)\" ?.* ?-?}}`)
其中 partial
只是一个示例,供您在遇到更复杂的情况时使用。您可以自行删除或添加更多关键字。
其他部分,比如CollectFiles
我觉得不是那么重要,如果有人需要参考下面
然后只需要filter个模板就可以知道当前文件使用的是什么模板。
最后,code 无需在添加模板时进行更新。 (除非您想更新站点上下文)
我在Github上写了一个简单的example,可以运行让人们知道我想做什么。
sub-template 的嵌套。
如果你想处理这个。尝试使用这个 function
现在可以了
如果渲染: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"}}