arnaucube
arnaucube/padArchiverPublic Self-hosted repository
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}