[英]Go HTML templates: Can I stop the templates package inserting quotes around strings in scripts?
我的所有模板都有一个变量,指示其关联图像的根 url。 我想在模板正文中的图像文件名之前输出该根目录,但是当我这样做时,模板包会尝试在其周围加上引号。 这是显示我的问题的一小段代码。 IMG_ROOT 是本例中用来更好模拟真实代码的接口。 脚本类型为 text/template,因为其内容将用于 underscore.js 模板。 不过,类型似乎与其输出方式无关。
package main
import (
"html/template"
"os"
)
type Data struct {
IMG_ROOT interface{}
}
const tmpl = `
<body>
<script type="text/template">
<img src="{{.IMG_ROOT}}/file_name.jpg"></img>
</script>
</body>
`
func main() {
t, _ := template.New("").Parse(tmpl)
t.Execute( os.Stdout, &Data{ template.JSStr( "/path/to/file" ) } )
}
http://play.golang.org/p/wg9JK2w2lt
如果我写<img src="{{.IMG_ROOT}}/file_name.jpg"></img>
,我会得到无效的"\\/path\\/to\\/file/file_name.jpg"
。
如果我写<img src={{.IMG_ROOT}}/file_name.jpg></img>
,我得到"/path/to/file/"file_name.jpg
这也不起作用。
有解决方法吗? 我已经尝试将模板包中的每个“安全”类型用于 IMG_ROOT 类型,但没有任何运气。 我可以编写一个连接并返回根和文件的函数,但似乎应该有一个更简单的解决方案。
有任何想法吗?
谢谢!
您可以使用printf
内置函数:
<img src={{printf "%s/file_name.jpg" .IMG_ROOT}}></img>
http://play.golang.org/p/2v8Q6wHu0r
但相反,我建议创建一个自定义的辅助函数并使用它来创建这样的路径:
const ImageRoot = "path/to/files/"
func StaticFile(filename string) string {
return ImageRoot + filename
}
func main() {
t, _ := template.New("").Funcs(template.FuncMap{"staticFile": StaticFile}).Parse(tmpl)
t.Execute(os.Stdout, nil)
}
然后在你的模板中你可以做
<img src="{{staticFile "image.jpg"}}"></img>
这是因为html/template
转义以防止攻击等。我遇到了类似的问题。 切换到text/template
使我的模板按预期运行。 也就是说,我将使用另一种方法来获取我需要的输出并继续使用html/template
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.