在Golang的text/template中,如何避免`{{- … }}`导致额外的前导空格被删除?

huangapple go评论86阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2021年9月30日 12:15:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/69386061.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定