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