|
- 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 <document>", os.Args[0])
- os.Exit(1)
- }
-
- tpl, err := template.New("dummy").Parse(`
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Example</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.0/dist/katex.min.css" integrity="sha384-BdGj8xC2eZkQaxoQ8nSLefg4AV4/AwB3Fj+8SUSo7pnKP6Eoy18liIKTPn9oBYNG" crossorigin="anonymous">
-
- <script defer src="https://cdn.jsdelivr.net/npm/katex@0.11.0/dist/katex.min.js" integrity="sha384-JiKN5O8x9Hhs/UE5cT5AAJqieYlOZbGT3CHws/y97o3ty4R7/O5poG9F3JoiOYw1" crossorigin="anonymous"></script>
- <script defer src="https://cdn.jsdelivr.net/npm/katex@0.11.0/dist/contrib/auto-render.min.js" integrity="sha384-kWPLUVMOks5AQFrykwIup5lo0m3iMkkHrD0uJ4H5cjeGihAutqP0yW0J6dpFiVkI" crossorigin="anonymous"
- onload="renderMathInElement(document.body);"></script>
-
- <style>
- .katex { font-size: 1em; }
- </style>
- </head>
- <body>
- {{.}}
- </body>
- </html>
- `)
- 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<p>"))
- w.Write(node.Literal)
- w.Write([]byte("</p>"))
- 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)
- }
|