package main import ( "flag" "fmt" "io/ioutil" "log" "net/http" "os" "os/signal" "path" "strings" "github.com/gomarkdown/markdown" "github.com/miekg/mmark" "gopkg.in/russross/blackfriday.v2" ) const ( GOMARKDOWN = "gomarkdown" RUSSROSS = "russross" MIEKG = "miekg" ) func envOrDefault(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def } func main() { port := flag.String("p", envOrDefault("PORT", ":41913"), "port to run on") root := flag.String("root", envOrDefault("ROOT", "."), "root dir to serve") render := flag.String("render", envOrDefault("RENDER", GOMARKDOWN), "renderer to use") flag.Parse() if !strings.HasPrefix(*port, ":") { *port = ":" + *port } go func() { log.Printf("Serving %q on %q", *root, *port) if err := http.ListenAndServe(*port, handler(*render, *root)); err != nil { panic(err) } }() // catch stop stop := make(chan os.Signal) signal.Notify(stop, os.Interrupt) <-stop } func handler(code, root string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { path := path.Join(root, path.Clean(r.URL.Path)) content, err := ioutil.ReadFile(path) if err != nil { http.NotFound(w, r) return } fmt.Fprintln(w, ``) fmt.Fprintln(w, ``) fmt.Fprintln(w, ` `) fmt.Fprintln(w, ``) fmt.Fprintln(w, ``) w.Write(render(code, content)) fmt.Fprintln(w, ``) fmt.Fprintln(w, ``) }) } func render(code string, content []byte) []byte { switch code { case GOMARKDOWN: return markdown.ToHTML(content, nil, nil) case RUSSROSS: return blackfriday.Run(content) //, blackfriday.WithExtensions(blackfriday.Extensions(blackfriday.TOC))) case MIEKG: return mmark.Parse(content, mmark.HtmlRenderer(0, ``, ``), mmark.EXTENSION_TABLES|int(blackfriday.TOC)).Bytes() } return nil }