英文:
Go template post processing: is it possible?
问题
在我的模板中,我使用了一个生成输出片段的子模板。
但是模板输出必须进行偏移(因为输出是YAML格式)。
有没有可能对模板输出进行后处理?
{{ template "subtemplate" | indent 10 }}
这里的 indent 10
是虚构的,只是为了解释我需要的内容。
可以(如@icza建议的那样)将输出保存到一个变量中,然后再处理它,
但也许有更好、更优雅的方法?
{{$var := execTempl "subtemplate"}}
{{$var}}
英文:
In my template, I use a sub-template that generates a piece of output.
The template output must be shifted though (because the output is in YAML format).
Is there any possibility to post-process template output?
{{ template "subtemplate" | indent 10 }}
This indent 10
is fictional, just to explain what I need.
It is possible (as @icza suggested) to save the output
into a variable and then work with it,
but maybe there is a better, more elegant approach?
{{$var := execTempl "subtemplate"}}
{{$var}}
答案1
得分: 1
你可以通过定义一个函数来实现与 {{ template "subtemplate" | indent 10 }}
最接近的效果,该函数解析并执行 subtemplate
,并将结果输出为字符串。
var externalTemplates = map[string]*template.Template{
"subtemplate": template.Must(template.New("subtemplate").Parse(sub_template)),
}
// 执行外部模板,必须在主模板中使用 FuncMap 进行注册。
func xtemplate(name string) (string, error) {
var b bytes.Buffer
if err := externalTemplates[name].ExecuteTemplate(&b, name, nil); err != nil {
return "", err
}
return b.String(), nil
}
t := template.Must(template.New("t").Funcs(template.FuncMap{
"xtemplate": xtemplate, // 注册函数
}).Parse(main_template))
在主模板中,你可以像这样使用该函数:
{{ xtemplate "subtemplate" | indent 10 }}
https://play.golang.org/p/brolOLFT4xL
英文:
The closest you can get to {{ template "subtemplate" | indent 10 }}
is to define a function that parses and executes the subtemplate
and outputs the result as string.
var externalTemplates = map[string]*template.Template{
"subtemplate": template.Must(template.New("subtemplate").Parse(sub_template)),
}
// Executes external template, must be registered with FuncMap in the main template.
func xtemplate(name string) (string, error) {
var b bytes.Buffer
if err := externalTemplates[name].ExecuteTemplate(&b, name, nil); err != nil {
return "", err
}
return b.String(), nil
}
t := template.Must(template.New("t").Funcs(template.FuncMap{
"xtemplate": xtemplate, // register func
}).Parse(main_template))
In the main template you can then use the function like this:
{{ xtemplate "subtemplate" | indent 10 }}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论