我在控制空格方面遇到问题,仍然以可读的方式格式化html/template
模板。我的模板看起来像这样:
layout.tmpl
{{define "layout"}}
<!DOCTYPE html>
<html>
<head>
<title>{{.title}}</title>
</head>
<body>
{{ template "body" . }}
</body>
</html>
{{end}}
body.tmpl
{{define "body"}}
{{ range .items }}
{{.count}} items are made of {{.material}}
{{end}}
{{end}}
码
package main
import (
"os"
"text/template"
)
type View struct {
layout string
body string
}
type Smap map[string]string
func (self View) Render(data map[string]interface{}) {
layout := self.layout + ".tmpl"
body := self.body + ".tmpl"
tmpl := template.Must(template.New("layout").ParseFiles(layout, body))
tmpl.ExecuteTemplate(os.Stdout, "layout", data)
}
func main() {
view := View{ "layout", "body" }
view.Render(map[string]interface{}{
"title": "stock",
"items": []Smap{
Smap{
"count": "2",
"material": "angora",
},
Smap{
"count": "3",
"material": "wool",
},
},
})
}
但是这会产生(注意:doctype上面有一行):
<!DOCTYPE html>
<html>
<head>
<title>stock</title>
</head>
<body>
2 items are made of angora
3 items are made of wool
</body>
</html>
我想要的是:
<!DOCTYPE html>
<html>
<head>
<title>stock</title>
</head>
<body>
2 items are made of angora
3 items are made of wool
</body>
</html>
在其他模板语言中,我可以说像
这样的东西[[- value -]]
并删除了操作之前和之后的空格,但我在html/template
中看不到类似的内容。这是否真的意味着我必须让我的模板不可读,如下所示?
layout.tmpl
{{define "layout"}}<!DOCTYPE html>
<html>
<head>
<title>.title</title>
</head>
<body>
{{ template "body" . }} </body>
</html>
{{end}}
body.tmpl
{{define "body"}}{{ range .items }}{{.count}} items are made of {{.material}}
{{end}}{{end}}
答案 0 :(得分:7)
您可以使用空格控制器
{{range .foos -}} // eats trailing whitespace
<tr><td>do something</td></tr>
{{- end}} // eats leading whitespace (\n from previous line)
答案 1 :(得分:2)
Whitespace对用户浏览器的渲染输出没有任何影响,因此控制它对于美学来说没什么意义。
换句话说,可以使用格式良好的模板(我更喜欢)或部分格式良好的HTML(无嵌套缩进)。使用任何现有的格式化程序选择一个或后处理HTML。
答案 2 :(得分:1)
是的,空格和线条按字面翻译。如果您的行只有{{define}}或其他任何不产生输出的行,那么您在解析的文件中将有一个空行。
理想情况下,因为您使用的是模板,所以您不需要查看或编辑已分析的输出。作为参考,使用JSP / JSF并查看它给你的丑陋输出。查看大多数在线页面的来源,它们也很难看。
祝你好运!