You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
2.7KB

  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "gopkg.in/russross/blackfriday.v2"
  6. "html/template"
  7. "io"
  8. "io/ioutil"
  9. "net/http"
  10. "os"
  11. )
  12. func main() {
  13. if len(os.Args) != 2 {
  14. fmt.Printf("usage: %s <document>", os.Args[0])
  15. os.Exit(1)
  16. }
  17. tpl, err := template.New("dummy").Parse(`
  18. <!doctype html>
  19. <html lang="en">
  20. <head>
  21. <meta charset="UTF-8">
  22. <title>Example</title>
  23. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  24. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.0/dist/katex.min.css" integrity="sha384-BdGj8xC2eZkQaxoQ8nSLefg4AV4/AwB3Fj+8SUSo7pnKP6Eoy18liIKTPn9oBYNG" crossorigin="anonymous">
  25. <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>
  26. <script defer src="https://cdn.jsdelivr.net/npm/katex@0.11.0/dist/contrib/auto-render.min.js" integrity="sha384-kWPLUVMOks5AQFrykwIup5lo0m3iMkkHrD0uJ4H5cjeGihAutqP0yW0J6dpFiVkI" crossorigin="anonymous"
  27. onload="renderMathInElement(document.body);"></script>
  28. <style>
  29. .katex { font-size: 1em; }
  30. </style>
  31. </head>
  32. <body>
  33. {{.}}
  34. </body>
  35. </html>
  36. `)
  37. if err != nil {
  38. fmt.Println(err)
  39. os.Exit(1)
  40. }
  41. http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  42. f, err := os.Open(os.Args[1])
  43. if err != nil {
  44. panic(err)
  45. }
  46. b, err := ioutil.ReadAll(f)
  47. if err != nil {
  48. panic(err)
  49. }
  50. unsafe := blackfriday.Run(b, blackfriday.WithRenderer(NewMyRenderer()))
  51. if err := tpl.Execute(w, template.HTML(unsafe)); err != nil {
  52. panic(err)
  53. }
  54. }))
  55. fmt.Println("listening on :19000")
  56. http.ListenAndServe(":19000", nil)
  57. }
  58. type MyRenderer struct {
  59. html *blackfriday.HTMLRenderer
  60. }
  61. func NewMyRenderer() *MyRenderer {
  62. return &MyRenderer{
  63. html: blackfriday.NewHTMLRenderer(blackfriday.HTMLRendererParameters{
  64. Flags: blackfriday.CommonHTMLFlags,
  65. }),
  66. }
  67. }
  68. func (r *MyRenderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
  69. if node.Type == blackfriday.Code {
  70. if bytes.HasPrefix(node.Literal, []byte("\\(")) && bytes.HasSuffix(node.Literal, []byte("\\)")) {
  71. w.Write(node.Literal)
  72. return blackfriday.GoToNext
  73. }
  74. } else if node.Type == blackfriday.CodeBlock && string(node.CodeBlockData.Info) == "katex" {
  75. w.Write([]byte("\n<p>"))
  76. w.Write(node.Literal)
  77. w.Write([]byte("</p>"))
  78. return blackfriday.GoToNext
  79. }
  80. return r.html.RenderNode(w, node, entering)
  81. }
  82. func (r *MyRenderer) RenderHeader(w io.Writer, ast *blackfriday.Node) {
  83. r.html.RenderHeader(w, ast)
  84. }
  85. func (r *MyRenderer) RenderFooter(w io.Writer, ast *blackfriday.Node) {
  86. r.html.RenderHeader(w, ast)
  87. }