package main import ( "bytes" "fmt" "gopkg.in/russross/blackfriday.v2" "html/template" "io" "io/ioutil" "net/http" "os" ) func main() { if len(os.Args) != 2 { fmt.Printf("usage: %s ", os.Args[0]) os.Exit(1) } tpl, err := template.New("dummy").Parse(` Example {{.}} `) if err != nil { fmt.Println(err) os.Exit(1) } http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { f, err := os.Open(os.Args[1]) if err != nil { panic(err) } b, err := ioutil.ReadAll(f) if err != nil { panic(err) } unsafe := blackfriday.Run(b, blackfriday.WithRenderer(NewMyRenderer())) if err := tpl.Execute(w, template.HTML(unsafe)); err != nil { panic(err) } })) fmt.Println("listening on :19000") http.ListenAndServe(":19000", nil) } type MyRenderer struct { html *blackfriday.HTMLRenderer } func NewMyRenderer() *MyRenderer { return &MyRenderer{ html: blackfriday.NewHTMLRenderer(blackfriday.HTMLRendererParameters{ Flags: blackfriday.CommonHTMLFlags, }), } } func (r *MyRenderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus { if node.Type == blackfriday.Code { if bytes.HasPrefix(node.Literal, []byte("\\(")) && bytes.HasSuffix(node.Literal, []byte("\\)")) { w.Write(node.Literal) return blackfriday.GoToNext } } else if node.Type == blackfriday.CodeBlock && string(node.CodeBlockData.Info) == "katex" { w.Write([]byte("\n

")) w.Write(node.Literal) w.Write([]byte("

")) return blackfriday.GoToNext } return r.html.RenderNode(w, node, entering) } func (r *MyRenderer) RenderHeader(w io.Writer, ast *blackfriday.Node) { r.html.RenderHeader(w, ast) } func (r *MyRenderer) RenderFooter(w io.Writer, ast *blackfriday.Node) { r.html.RenderHeader(w, ast) }