previewmd

Simple Markdown preview
git clone https://www.brianlane.com/git/previewmd
Log | Files | Refs | README

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 }