【问题标题】:Indentation and text formatting with go templates使用 go 模板的缩进和文本格式
【发布时间】:2023-01-03 16:18:42
【问题描述】:

给定以下模板:

{{ range $item := . }}
    {{ if $item.IsA}}
        Ok
    {{ else }}
        Fine
     {{ end }}
{{ end }}
Done!

当我使用以下方式渲染它时:

 t := template.New("test").Parse(_types)
 text, err := t.Execute(&buffer, strct)

输出类似于:

!empty line
!empty line
       Ok
!empty line
!empty line
Done! 

这意味着如果我想正确地格式化文本,我必须将它重写为

{{ range $item := .}}{{ if $item.IsA }}OK{{ else }}{{ end }}{{ end }}
Done!

然后我得到类似的东西:

Ok
Done!

这是所需的输出。

以第二种方式编写模板非常难读且混乱。有什么方法可以让我们用适当的缩进编写模板,但以某种方式配置渲染,使模板占位符不会转换为新行,或者它们的缩进将被忽略(以便生成所需的输出)?

编辑:使用{- ""} 甚至会使整个事情变得更糟!为什么?请考虑以下事项:

{{- range $item := . }}
    {{- if $item.IsA }}
        {{- "How many spaces??" -}}OK 
...

那么让我换一种说法,golang 中是否有任何内置的后处理器可用于模板?

【问题讨论】:

  • 使用{{- 和`-}}`来控制空格。阅读模板包文档。
  • @BurakSerdar:这甚至使标记变得更糟,更难以阅读!
  • @BurakSerdar:我认为你没有正确理解我的问题。
  • 使用相同的模板缩进,但使用 -}} 并查看结果。
  • @BurakSerdar:你是认真的吗?你明白我正在努力让模板更readable和干净吗?或者你想成为聪明的布拉克?

标签: go go-templates


【解决方案1】:

在使用模板一段时间后,我遇到了这个解决方案。为了使模板更干净,我们可以做一个技巧。模板确实接受自定义函数,诀窍是定义一个 indentation 函数:

const _indent = "___START___"
_funcs = template.FuncMap {
    "Indent": func(indent int) string {
        str := bytes.NewBufferString(_indent)
        for i := 0; i < indent; i++ {
            str.WriteString(" ")
        }
        return str.String()
     },
 }

我们也可以包含一个字符作为缩进,但在这里我只需要空格。然后我们需要一个后处理器:

func PostProcess(strBuffer bytes.Buffer) bytes.Buffer {
    buffer := bytes.NewBufferString("")
    lines := strings.Split(strBuffer.String(), "
")
    for _, line := range lines {
        tmp := strings.TrimPrefix(line, " ")
        tmp = strings.TrimPrefix(tmp, _indent)
        buffer.WriteString(tmp)
    }
    return *buffer
}

现在我们可以将标记写为:

{{ range $i :=  . }}
    {{ if $i.IsOk }}
        {{ 4 | Indent }}OK
...

我们可以在呈现的文本上运行 PostProcess 函数。我的PostProcess 函数不会消除空行,但我们也可以轻松添加它。

这比 {{- " " -}} 语法更具可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2010-09-09
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多