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)
|
|
}
|