在 Golang 的 text/template 中避免 `{{- ... }}` Trim 额外的前导空格?
Avoid `{{- ... }}` Trim Extra Leading Whitespace in text/template of Golang?
我尝试用Go的text/template
包渲染markdown列表,如果值为空,需要省略列表项。
例如:
完整列表渲染结果:
# Debug Template 1
- Item A: Apple
- Item B: Bosch
- Item C: Cocola
- Item D: Delta
- Item E: Ellie
当 B 和 D 为空时的预期结果:
# Debug Template 1
- Item A: Apple
- Item C: Cocola
- Item E: Ellie
所以基于我的完整模板:
# Debug Template 1
- Item A: {{ .ItemA }}
- Item B: {{ .ItemB }}
- Item C: {{ .ItemC }}
- Item D: {{ .ItemD }}
- Item E: {{ .ItemE }}
我尝试使用{{- ...}}
语法来避免换行,但是它被修剪了太多,{{- if ...}}
之前的换行也被修剪了。
即对于模板(故意用两个换行符来演示):
# Debug Template 2
{{- if .ItemA }}- Item A: {{ .ItemA }}
{{ end }}
{{- if .ItemB }}- Item B: {{ .ItemB }}
{{ end }}
{{- if .ItemC }}- Item C: {{ .ItemC }}
{{ end }}
{{- if .ItemD }}- Item D: {{ .ItemD }}
{{ end }}
{{- if .ItemE }}- Item E: {{ .ItemE }}
{{ end }}
结果:
# Debug Template 2- Item A: Apple
- Item B: Bosch
- Item C: Cocola
- Item D: Delta
- Item E: Ellie
这是代码片段:
package main
import (
"os"
"text/template"
)
func DemoRenderIssue() error {
data := struct {
ItemA string
ItemB string
ItemC string
ItemD string
ItemE string
}{
ItemA: "Apple",
// ItemB: "Bosch",
ItemC: "Cocola",
// ItemD: "Delta",
ItemE: "Ellie",
}
tmplStr := `
# Debug Template 1
- Item A: {{ .ItemA }}
- Item B: {{ .ItemB }}
- Item C: {{ .ItemC }}
- Item D: {{ .ItemD }}
- Item E: {{ .ItemE }}
# Debug Template 2
{{- if .ItemA }}- Item A: {{ .ItemA }}
{{ end }}
{{- if .ItemB }}- Item B: {{ .ItemB }}
{{ end }}
{{- if .ItemC }}- Item C: {{ .ItemC }}
{{ end }}
{{- if .ItemD }}- Item D: {{ .ItemD }}
{{ end }}
{{- if .ItemE }}- Item E: {{ .ItemE }}
{{ end }}
`
tmpl, err := template.New("demo").Parse(tmplStr)
if err != nil {
return err
}
return tmpl.Execute(os.Stdout, &data)
}
能否请教一下如何修改模板或其他技巧才能得到预期的结果?
只需确保保留第一个换行符:
# Debug Template 2
{{ if .ItemA }}- Item A: {{ .ItemA }}
{{ end }}
...
如文档所述,{{-
将清除所有前面的空格。在您的情况下,使用 {{- if .ItemA...
将清除字符串末尾的所有空格 Template 2
(换行符是空格)。只需将列表中的第一项保留为 {{if .ItemA}}
即可保留该点之前的所有空格。
我尝试用Go的text/template
包渲染markdown列表,如果值为空,需要省略列表项。
例如:
完整列表渲染结果:
# Debug Template 1
- Item A: Apple
- Item B: Bosch
- Item C: Cocola
- Item D: Delta
- Item E: Ellie
当 B 和 D 为空时的预期结果:
# Debug Template 1
- Item A: Apple
- Item C: Cocola
- Item E: Ellie
所以基于我的完整模板:
# Debug Template 1
- Item A: {{ .ItemA }}
- Item B: {{ .ItemB }}
- Item C: {{ .ItemC }}
- Item D: {{ .ItemD }}
- Item E: {{ .ItemE }}
我尝试使用{{- ...}}
语法来避免换行,但是它被修剪了太多,{{- if ...}}
之前的换行也被修剪了。
即对于模板(故意用两个换行符来演示):
# Debug Template 2
{{- if .ItemA }}- Item A: {{ .ItemA }}
{{ end }}
{{- if .ItemB }}- Item B: {{ .ItemB }}
{{ end }}
{{- if .ItemC }}- Item C: {{ .ItemC }}
{{ end }}
{{- if .ItemD }}- Item D: {{ .ItemD }}
{{ end }}
{{- if .ItemE }}- Item E: {{ .ItemE }}
{{ end }}
结果:
# Debug Template 2- Item A: Apple
- Item B: Bosch
- Item C: Cocola
- Item D: Delta
- Item E: Ellie
这是代码片段:
package main
import (
"os"
"text/template"
)
func DemoRenderIssue() error {
data := struct {
ItemA string
ItemB string
ItemC string
ItemD string
ItemE string
}{
ItemA: "Apple",
// ItemB: "Bosch",
ItemC: "Cocola",
// ItemD: "Delta",
ItemE: "Ellie",
}
tmplStr := `
# Debug Template 1
- Item A: {{ .ItemA }}
- Item B: {{ .ItemB }}
- Item C: {{ .ItemC }}
- Item D: {{ .ItemD }}
- Item E: {{ .ItemE }}
# Debug Template 2
{{- if .ItemA }}- Item A: {{ .ItemA }}
{{ end }}
{{- if .ItemB }}- Item B: {{ .ItemB }}
{{ end }}
{{- if .ItemC }}- Item C: {{ .ItemC }}
{{ end }}
{{- if .ItemD }}- Item D: {{ .ItemD }}
{{ end }}
{{- if .ItemE }}- Item E: {{ .ItemE }}
{{ end }}
`
tmpl, err := template.New("demo").Parse(tmplStr)
if err != nil {
return err
}
return tmpl.Execute(os.Stdout, &data)
}
能否请教一下如何修改模板或其他技巧才能得到预期的结果?
只需确保保留第一个换行符:
# Debug Template 2
{{ if .ItemA }}- Item A: {{ .ItemA }}
{{ end }}
...
如文档所述,{{-
将清除所有前面的空格。在您的情况下,使用 {{- if .ItemA...
将清除字符串末尾的所有空格 Template 2
(换行符是空格)。只需将列表中的第一项保留为 {{if .ItemA}}
即可保留该点之前的所有空格。