【问题标题】:What's the easiest way to define a custom HTML-stringification?定义自定义 HTML 字符串化的最简单方法是什么?
【发布时间】:2021-05-01 08:18:01
【问题描述】:

有没有办法让我定义,当我在 Go html 模板中输出一个值时,格式化完成的方式而不是打印字符串表示,而无需调用函数来显式转换它?

例如,假设我有一个类型 Person 并且我有一个只有 {{.}} 的模板我希望它自动创建指向该人页面的链接,但如果我使用相同的模板并传递一个值不同的类型会生成一些其他的 HTML。

我不想写{{.HTML}}{{. | html}} 之类的东西。我已经知道这些是可能的,但我的问题是关于如何避免这些。

我曾想过Person.String() 以某种方式返回 HTML 代码而没有被转义,但除了没有让它工作之外,它似乎也是一个丑陋的解决方案。

我考虑过的另一个解决方案是将所有内容作为 HTML 传递到模板中,但随后我无法再访问属性(例如 {{.name}} 仅输出名称),我还必须转换所有内容以防万一它在模板中使用。

【问题讨论】:

  • 最简单的方法,大概是在Person上定义一个方法。即func (p *Person) HTML() template.HTML

标签: go go-templates go-html-template


【解决方案1】:

创建一个返回template.HTML 类型的方法。即:

func (p *Person) HTML() template.HTML {
    return fmt.Sprintf(`<a href="/person/%v">%s</a>`, p.id, template.HTMLEscapeString(p.name))
}

然后在你的模板中:

{{ .HTML }}

【讨论】:

  • 应该澄清我正在寻找的模板中只有{{.}}toHTML 必须实现每种类型的问题实际上并不是问题
  • 然后{{ .HTML }}
  • 但我不希望有一个 HTML 附加,它应该变成 HTML 只 {{.}}
  • 这不是一个选项,除非. 代表一个 HTML 字符串,但它不是。在您的示例中,它是一个结构实例。
  • 可能不是{{. | html}},而是{{. | pretty}},在模板中注册为pretty函数的特定实现会做不同的事情:也就是说,有一个用于HTML,另一个(或更多) ) 用于纯文本模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 2015-12-11
  • 1970-01-01
相关资源
最近更新 更多