如何在Go中使用Blackfriday渲染markh到html?

时间:2014-04-21 13:47:03

标签: templates go markdown

我有这样的结构:

type Page struct {
    Content  string
}

然后我读了一个降价文件并分配给一个变量:

data, err := ioutil.ReadFile("a.md")
lines = string(data)
page.Content = markdownRender([]byte(lines))

markdown文件是这样的:

##Hello World

###Holo Go

然后我把它放入markdown渲染函数并返回一个字符串值:

func markdownRender(content []byte) string {
  htmlFlags := 0
  htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS
  htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS

  renderer := blackfriday.HtmlRenderer(htmlFlags, "", "")

  extensions := 0
  extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS
  extensions |= blackfriday.EXTENSION_TABLES
  extensions |= blackfriday.EXTENSION_FENCED_CODE
  extensions |= blackfriday.EXTENSION_AUTOLINK
  extensions |= blackfriday.EXTENSION_STRIKETHROUGH
  extensions |= blackfriday.EXTENSION_SPACE_HEADERS

  return string(blackfriday.Markdown(content, renderer, extensions))
}

最后我在html模板中调用page.Content并生成静态html:

{{.Content}}

但在生成的html中,它在浏览器中显示(我在chrome和safari中尝试过)就像这样(不是源代码,它只是在页面中显示):

<p>##Hello World ###Holo Go </p>

但我希望它像这样

Hello World

Holo Go

那么,我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

首先,你的降价输入不太正确 - 标题应该有空格将#与文本分开。您可以使用blackfriday-tool验证这一点:

$ echo ##Hello | blackfriday-tool
<p>##Hello</p>

$ echo ## Hello | blackfriday-tool
<h2>Hello</h2>

其次,如果您将blackfriday的HTML输出提供给html/template,则会自动转义以确保安全。

如果您信任markdown输入和blackfriday的HTML输出,那么您可以通过将内容包装在html/template HTML值中来告诉模板系统信任该内容:

type Page struct {
    Content template.HTML
}

err = t.ExecuteTemplate(w, "page", Page{Content: template.HTML(s)})

有关示例,请参阅http://play.golang.org/p/eO7KDJMlb8