如何在html / template中执行操作后控制空格?

时间:2013-07-06 12:18:31

标签: templates go whitespace go-html-template

我在控制空格方面遇到问题,仍然以可读的方式格式化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}}

3 个答案:

答案 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并查看它给你的丑陋输出。查看大多数在线页面的来源,它们也很难看。

祝你好运!