func (g *goemon) livereload() error { g.lrs = livereload.New("goemon") defer g.lrs.Close() addr := g.conf.LiveReload if addr == "" { addr = os.Getenv("GOEMON_LIVERELOAD_ADDR") } if addr == "" { addr = ":35730" } var err error g.lrc, err = net.Listen("tcp", addr) if err != nil { return err } defer g.lrc.Close() mux := http.NewServeMux() mux.HandleFunc("/livereload.js", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/javascript") _, err := w.Write([]byte(liveReloadScript)) if err != nil { g.lrc.Close() } }) mux.Handle("/livereload", g.lrs) return http.Serve(g.lrc, mux) }
func main() { runtime.GOMAXPROCS(runtime.NumCPU()) flag.Parse() cwd, _ := os.Getwd() lrs := livereload.New("mkup") defer lrs.Close() go func() { mux := http.NewServeMux() mux.HandleFunc("/livereload.js", func(w http.ResponseWriter, r *http.Request) { b, err := Asset("_assets/livereload.js") if err != nil { http.Error(w, "404 page not found", 404) return } w.Header().Set("Content-Type", "application/javascript") w.Write(b) return }) mux.Handle("/", lrs) log.Fatal(http.ListenAndServe(":35729", mux)) }() fsw, err := fsnotify.NewWatcher() if err != nil { panic(err) } go func() { fsw.Add(cwd) err = filepath.Walk(cwd, func(path string, info os.FileInfo, err error) error { if info == nil { return err } if !info.IsDir() { return nil } fsw.Add(path) return nil }) for { select { case event := <-fsw.Events: if path, err := filepath.Rel(cwd, event.Name); err == nil { path = "/" + filepath.ToSlash(path) log.Println("reload", path) lrs.Reload(path, true) } case err := <-fsw.Errors: if err != nil { log.Println(err) } } } }() fs := http.FileServer(http.Dir(cwd)) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { name := r.URL.Path if strings.HasPrefix(name, "/_assets/") { b, err := Asset(name[1:]) if err != nil { http.Error(w, "404 page not found", 404) return } w.Header().Set("Content-Type", mime.TypeByExtension(filepath.Ext(name))) w.Write(b) return } ext := filepath.Ext(name) if ext != ".md" && ext != ".mkd" && ext != ".markdown" { fs.ServeHTTP(w, r) return } b, err := ioutil.ReadFile(filepath.Join(cwd, name)) if err != nil { if os.IsNotExist(err) { http.Error(w, "404 page not found", 404) return } http.Error(w, err.Error(), 500) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") renderer := blackfriday.HtmlRenderer(0, "", "") b = blackfriday.Markdown(b, renderer, extensions) w.Write([]byte(fmt.Sprintf(template, name, string(b)))) }) server := &http.Server{ Addr: *addr, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("%s %s %s", r.RemoteAddr, r.Method, r.URL.RequestURI()) http.DefaultServeMux.ServeHTTP(w, r) }), } fmt.Fprintln(os.Stderr, "Lisning at "+*addr) log.Fatal(server.ListenAndServe()) }