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

假设我有大量的模板和子模板,那么我如何根据管道中需要的那些来解析子模板呢?template


我的想法是读取当前要渲染的模板并找出它使用了哪些模板,但我不知道该怎么做,也许用正则表达式?


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作为子模板。我怎样才能检测到它只需要这两个?


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



沧海一幻觉
浏览 62回答 1
1回答

Smart猫小萌

您可以通过这种方式找到模板中的所有关键字。regexp.MustCompile(`{{-?&nbsp;?(template|partial)&nbsp;\"([^()&nbsp;]*)\"&nbsp;?.*&nbsp;?-?}}`)正则表达式101当您遇到更复杂的情况时,哪里partial只是您使用的示例。您可以删除它或自行添加更多关键字。go-playground其他部分,比如CollectFiles我认为不是那么重要,如果有人需要参考下面嵌入的解决方案文件系统解决方案然后只需要过滤模板,找出当前文件使用的模板。最后,无论何时添加模板,代码都不会更新。(除非您想更新站点上下文)我在Github上写了一个可以运行的简单例子,这样人们就可以知道我想做什么。子模板的嵌套。如果你想处理这个。尝试使用这个功能现在这将起作用如果渲染:index.gohtml不仅base.gohtml包含而且还包含 {&nbsp;head.gohtml,&nbsp;navbar.gohtml,&nbsp;footer.gohtml}<!-- index.gohtml -->&nbsp;{{- template "base.gohtml" . -}} <!-- 👈 -->&nbsp;{{define "head"}}&nbsp; <style>h2 {background-color: yellow;}&nbsp; </style>{{end}}{{define "body"}}<h2>Welcome to XXX</h2>{{end}}在哪里base.gohtml{{template "head.gohtml" . -}}{{template "navbar.gohtml"}}{{- block "body" . -}}{{- end -}}{{template "footer.gohtml"}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go