Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I render markdown to a golang template(html or tmpl) with blackfriday?

I use the Martini framework,I have some markdown file and I want render it as HTML in tmpl/html template.

The markdown file like this:

title: A Test Demo
---
##ABC
> 123

And the template file like this:

<head>
  <title>{{name}}</title>
</head>

<body>
  <h2>{{abc}}</h2>
  <blockquote>
    <p>{{xyz}}</p>
  </blockquote>
</body>

I use the blackfriday parse the markdown and return []byte type,next step I wanna render the markdown file to this template and make each block to the right place,so how can I do this right way? Or use any way to do this better?

like image 476
AriesDevil Avatar asked Apr 17 '14 03:04

AriesDevil


People also ask

How do you render a markdown in HTML?

To convert Markdown to HTML using Typora, click File —> Export —> HTML. Then save the file in your preferred location. The image below shows that the HTML output looks exactly as how the Markdown is displayed inside Typora.

Can you put markdown in HTML?

Markdown supports HTML, so if you need any special attributes on elements, you can just use HTML.

How do I create a template in Golang?

Go template Parse This is the data type used in the template; the fields must be exported, that is capitalized. A new template is created. We parse the template string with Parse . Using the dot operator, we access the fields that are passed to the template engine.

What is HTML template in Golang?

HTML/template is a Golang (Go) package that implements data-driven templates for generating HTML outputs that are safe against code injection. A key benefit of using HTML/template is that it produces safe, escaped HTML output using contextual auto-escaping.


1 Answers

One way to achieve this is to use the Funcs method to add a custom function to the template function map. See the Functions section of the template package docs for more info.

Given a template file page.html, some writer w (probably an http.ResponseWriter), and some struct p with a field Body containing data to be put into a template field, you can do something like:

Define a function:

func markDowner(args ...interface{}) template.HTML {
    s := blackfriday.MarkdownCommon([]byte(fmt.Sprintf("%s", args...)))
    return template.HTML(s)
}

Add it to the template function map:

tmpl := template.Must(template.New("page.html").Funcs(template.FuncMap{"markDown": markDowner}).ParseFiles("page.html"))

Execute the template:

err := tmpl.ExecuteTemplate(w, "page.html", p)
if err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
}

Then, in your template file, you can put something like:

{{.Body | markDown}}

And it will pass the Body through your markDowner function.

Playground

like image 92
Intermernet Avatar answered Oct 13 '22 01:10

Intermernet