main.go (1336B)
1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "net/http" 9 "os" 10 11 "github.com/russross/blackfriday/v2" 12 ) 13 14 type cmdlineArgs struct { 15 Debug bool // Extra debug output 16 Port int 17 } 18 19 var cfg = cmdlineArgs{ 20 Debug: false, 21 Port: 8080, 22 } 23 24 func init() { 25 flag.BoolVar(&cfg.Debug, "debug", cfg.Debug, "Extra debug output") 26 flag.IntVar(&cfg.Port, "port", cfg.Port, "Port to serve preview from") 27 28 flag.Parse() 29 } 30 31 func main() { 32 if flag.NArg() == 0 { 33 flag.Usage() 34 os.Exit(1) 35 } 36 filename := flag.Arg(0) 37 _, err := os.Stat(filename) 38 if err != nil { 39 log.Fatal(err) 40 } 41 fmt.Printf("Previewing %s on port %d\n", filename, cfg.Port) 42 43 preview := func(w http.ResponseWriter, _ *http.Request) { 44 f, err := os.Open(filename) 45 if err != nil { 46 fmt.Printf("Error opening %s: %s\n", filename, err) 47 return 48 } 49 50 // XXX Is this right inside a loop? 51 defer f.Close() 52 markdown, err := ioutil.ReadAll(f) 53 if err != nil { 54 fmt.Printf("Error reading %s: %s\n", filename, err) 55 return 56 } 57 58 // Render html from markdown 59 output := blackfriday.Run(markdown) 60 w.Write([]byte(fmt.Sprintf("<html><head><title>%s</title></head><body>\n", filename))) 61 w.Write(output) 62 w.Write([]byte("</body></html>\n")) 63 } 64 65 http.HandleFunc("/", preview) 66 67 listen := fmt.Sprintf(":%d", cfg.Port) 68 log.Fatal(http.ListenAndServe(listen, nil)) 69 }