go - 如何转义模板的输出?

标签 go escaping go-templates

如何转义由模板生成的 HTML 片段?就像在这个例子中:

package main

import (
    "fmt"
    "html/template"
    "os"
)

// I want to escape a html snippet which is then stored as a 
// javascript variable. how can I do that? the second output 
// is the one i would like to generate with a template.

var tmpl = `{{define "main"}}<script>var xx = "{{template "html-snippet" .}}";</script>{{end}}{{define "html-snippet"}}<div>
    <img src="{{.}}">
</div>{{end}}`

func main() {
    t, err := template.New("fo").Parse(tmpl)
    if err != nil {
        fmt.Println(err)
        return
    }
    t.ExecuteTemplate(os.Stdout, "main", "some.jpg")
    fmt.Println("")
    fmt.Println(template.JSEscapeString(`<div>
        <img src="some.jpg">
    </div`))
}

https://play.golang.org/p/TBJxYqokkU

html/template 不会在我的情况下自动执行。 JSEscapeString 通过 func 映射也不起作用(或者我不知道如何),因为我不能这样调用它 {{jsescape (template "html-snippet".)}} ,因为这不是字符串。

非常感谢

最佳答案

您可以注册一个函数来执行可包含的模板并将结果作为 string 返回。然后可以将该 string 插入到另一个模板中,自动应用适当的上下文敏感转义:

var tmpl = `{{define "main"}}<script>var xx = {{exect "html-snippet" .}};</script>{{end}}{{define "html-snippet"}}<div>
    <img src="{{.}}">
</div>{{end}}`

var t *template.Template

func exect(name string, data interface{}) string {
    buf := &bytes.Buffer{}
    if err := t.ExecuteTemplate(buf, name, data); err != nil {
        fmt.Println("Error:", err)
    }
    return buf.String()
}

func main() {
    t = template.Must(template.New("fo").Funcs(template.FuncMap{
        "exect": exect,
    }).Parse(tmpl))
    if err := t.ExecuteTemplate(os.Stdout, "main", "some.jpg"); err != nil {
        fmt.Println(err)
    }
}

输出(在 Go Playground 上尝试):

<script>var xx = "\u003cdiv\u003e\n\t\u003cimg src=\"some.jpg\"\u003e\n\u003c/div\u003e";</script>

甚至更好:模板引擎允许您注册返回 2 个值的函数(第二个值必须是错误),因此我们的 exec() 函数可能如下所示:

func exect(name string, data interface{}) (string, error) {
    buf := &bytes.Buffer{}
    err := t.ExecuteTemplate(buf, name, data)
    return buf.String(), err
}

输出是一样的。在 Go Playground 上试试这个.

关于go - 如何转义模板的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41233066/

相关文章:

go - Go 中令人困惑的并发和性能问题

macos - 如何在 Mac 上为 Ubuntu 交叉编译 Go 程序?

go - 是否可以将 Go 程序编译为 LLVM IR?

xpath - 转义 XPATH 中的特殊字符

go - 如何使用 Go Templates (Helm) 应用递归格式?

go - 雨果没有按修改日期排序帖子

database - GAE Go 数据存储的大小

javascript - 如何处理 AngularJS 在我的 URL 中格式化正斜杠以转义代码 %2F

javascript - Json.Parse 转义换行符

html - 在 golang HTML 模板中切换或 if/elseif/else