解析go template时如何检查模板节点是否有连字符?

问题描述 投票:0回答:1
{{- if .Tools }}
{{- end }}

{{ if .Tools }}
{{ end }}
import (
    "text/template"
    "text/template/parse"
)

t, err := template.New("dummy").Parse(string(templateText))

for _, tt := range t.Templates() {
    for _, n := range tt.Root.Nodes {
        switch n := n.(type) {
        case *parse.IfNode:
            fmt.Println(n.String())
        }
    }
}

这对于两个 if 条件打印相同

{{if .Tools}}
{{end}}

是否可以找出第一个

if
及其
end
有连字符/破折号?

go go-templates
1个回答
0
投票

修剪发生在词法分析期间,解析器甚至看不到它。根据文档:

修剪空间。 如果操作以“{{-”而不是“{{”开始,则所有空格/制表符/换行符 动作之前被修剪;相反,如果它以“-}}”结尾 前导空格被修剪。这完全是在词法分析器中完成的;这 解析器永远不会看到它发生。

所以答案是否定的,你无法通过查看解析树来检测输入是否是修剪。

您可以查看

Node.Pos
,查看输入文本中的原始位置并尝试自己解析它。

© www.soinside.com 2019 - 2024. All rights reserved.