padArchiver/webServer/main.go
webServer/main.goRaw
1package main
2
3import (
4 "html/template"
5 "log"
6 "net/http"
7 "os"
8 "path/filepath"
9 "strings"
10
11 padArchiver ".."
12 "github.com/gorilla/mux"
13)
14
15type ItemModel struct {
16 Name string
17 Path string
18 IsDir bool
19 Content template.HTML
20}
21type MenuModel struct {
22 PageTitle string
23 Items []ItemModel
24}
25
26func main() {
27
28 router := mux.NewRouter()
29 router.HandleFunc("/", getDir).Methods("GET")
30 router.HandleFunc("/dir/{path}", getDir).Methods("GET")
31 router.HandleFunc("/page/{path}", getPage).Methods("GET")
32
33 log.Println("padArchiver web server running")
34 log.Print("port: 8080")
35 log.Fatal(http.ListenAndServe(":8080", router))
36}
37
38func generateMenu(dirpath string) MenuModel {
39 var menuPage MenuModel
40 menuPage.PageTitle = "padArchiver - Menu"
41 _ = filepath.Walk(padArchiver.Storage+dirpath, func(path string, f os.FileInfo, err error) error {
42 if path != padArchiver.Storage {
43 path = strings.Replace(path, padArchiver.Storage, "", -1)
44 var item ItemModel
45 item.Name = path
46 path = strings.Replace(path, "/", "%", -1)
47 if f.IsDir() {
48 item.Path = "/dir/" + path
49 } else {
50 item.Path = "/page/" + path
51 }
52 item.IsDir = f.IsDir()
53 menuPage.Items = append(menuPage.Items, item)
54 }
55 return nil
56 })
57 return menuPage
58}
59func getDir(w http.ResponseWriter, r *http.Request) {
60 vars := mux.Vars(r)
61 var dirpath string
62 if _, ok := vars["path"]; ok {
63 dirpath = vars["path"]
64 dirpath = strings.Replace(dirpath, "%", "/", -1)
65 }
66
67 menuPage := generateMenu(dirpath)
68
69 tmpl := template.Must(template.ParseFiles("templates/menuTemplate.html"))
70 tmpl.Execute(w, menuPage)
71}
72
73func getPage(w http.ResponseWriter, r *http.Request) {
74 vars := mux.Vars(r)
75 path := vars["path"]
76 path = strings.Replace(path, "%", "/", -1)
77 path = padArchiver.Storage + path
78
79 content, err := fileToHTML(path)
80 check(err)
81
82 var item ItemModel
83 item.Name = path
84 item.Content = template.HTML(content)
85
86 tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html"))
87 tmpl.Execute(w, item)
88}