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

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")
    }
}

假设主模板只需要tmplAtmplB作为子模板。我怎样才能检测到它只需要这两个?

我不想每次添加或调整新模板时都更改程序。

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

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

regex101

其中 partial 只是一个示例,供您在遇到更复杂的情况时使用。您可以自行删除或添加更多关键字。

go-playground


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


然后只需要filter个模板就可以知道当前文件使用的是什么模板。


最后,code 无需在添加模板时进行更新。 (除非您想更新站点上下文)


我在Github上写了一个简单的example,可以运行让人们知道我想做什么。

sub-template 的嵌套。

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

现在可以了

如果渲染: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"}}

The final version