英文:
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)
}
请问你能告诉我如何修复模板或其他技巧以获得期望的结果吗?
英文:
I attempt to render markdown list with text/template
package of Go, and need to omit list items if the value is empty.
For example:
Full list rendering result:
# Debug Template 1
- Item A: Apple
- Item B: Bosch
- Item C: Cocola
- Item D: Delta
- Item E: Ellie
Expected result when B and D is empty:
# Debug Template 1
- Item A: Apple
- Item C: Cocola
- Item E: Ellie
So based on my full template:
# Debug Template 1
- Item A: {{ .ItemA }}
- Item B: {{ .ItemB }}
- Item C: {{ .ItemC }}
- Item D: {{ .ItemD }}
- Item E: {{ .ItemE }}
I tried to use {{- ...}}
syntax to avoid newline, but it trimmed too much, and the newlines before the {{- if ...}}
is also trimmed.
i.e. for the template (intentionally two newlines to demo this):
# 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 }}
Result:
# Debug Template 2- Item A: Apple
- Item B: Bosch
- Item C: Cocola
- Item D: Delta
- Item E: Ellie
Here's the code snippet:
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)
}
Can you please tell me how to fix the template or other skills to get the expected result?
答案1
得分: 4
只需确保保留第一个换行符:
# 调试模板 2
{{ if .ItemA }}- 项目 A:{{ .ItemA }}
{{ end }}
...
正如文档所述,{{-
将清除所有前面的空格。在你的情况下,使用 {{- if .ItemA...
将清除所有空格,直到字符串 Template 2
的末尾(换行符是一个空格)。只需将列表中的第一项保留为 {{if .ItemA}}
,就可以保留到该点的所有空格。
英文:
Just make sure to keep the first newline:
# Debug Template 2
{{ if .ItemA }}- Item A: {{ .ItemA }}
{{ end }}
...
As the documentation states, {{-
will clear all preceding whitespaces. In your case, using {{- if .ItemA...
will clear all whitespaces up to the end of the string Template 2
(newline is a whitespace). Simply keeping the first item in the list as {{if .ItemA}}
preserves all whitespaces up to that point.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论