package main import ( "html/template" "log" "net/http" "os" "path/filepath" "strings" padArchiver ".." "github.com/gorilla/mux" ) type ItemModel struct { Name string Path string IsDir bool Content template.HTML } type MenuModel struct { PageTitle string Items []ItemModel } func main() { router := mux.NewRouter() router.HandleFunc("/", getDir).Methods("GET") router.HandleFunc("/dir/{path}", getDir).Methods("GET") router.HandleFunc("/page/{path}", getPage).Methods("GET") log.Println("padArchiver web server running") log.Print("port: 8080") log.Fatal(http.ListenAndServe(":8080", router)) } func generateMenu(dirpath string) MenuModel { var menuPage MenuModel menuPage.PageTitle = "padArchiver - Menu" _ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error { if path != padArchiver.Storage { path = strings.Replace(path, padArchiver.Storage, "", -1) var item ItemModel item.Name = path path = strings.Replace(path, "/", "%", -1) if f.IsDir() { item.Path = "/dir/" + path } else { item.Path = "/page/" + path } item.IsDir = f.IsDir() menuPage.Items = append(menuPage.Items, item) } return nil }) return menuPage } func getDir(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) var dirpath string if _, ok := vars["path"]; ok { dirpath = vars["path"] dirpath = strings.Replace(dirpath, "%", "/", -1) } menuPage := generateMenu(dirpath) tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html")) tmpl.Execute(w, menuPage) } func getPage(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) path := vars["path"] path = strings.Replace(path, "%", "/", -1) path = padArchiver.Storage + path content, err := fileToHTML(path) check(err) var item ItemModel item.Name = path item.Content = template.HTML(content) tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html")) tmpl.Execute(w, item) }