You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

115 lines
2.8 KiB

package main
import (
"bytes"
"html/template"
"log"
"net/http"
"os"
"path/filepath"
"strings"
padArchiver ".."
"github.com/gorilla/mux"
)
//ItemModel is the model for each one of the files and directories in the directory of the pads
type ItemModel struct {
Name string
Path string
IsDir bool
}
//MenuModel is the struct for all the menu, containing Items
type MenuModel struct {
PageTitle string
Items []ItemModel
}
//PageModel is the data model used in the html templates
type PageModel struct {
Title string
MenuContent template.HTML
Content template.HTML
}
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 generateMenuItems(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 generateMenuHTML(dirpath string) template.HTML {
menuItems := generateMenuItems(dirpath)
tmplMenu := template.Must(template.ParseFiles("templates/menuTemplate.html"))
var tpl bytes.Buffer
err := tmplMenu.Execute(&tpl, menuItems)
check(err)
return template.HTML(tpl.String())
}
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)
}
var page PageModel
page.Title = dirpath
if dirpath == "" {
page.Title = "padArchiver"
}
page.MenuContent = generateMenuHTML(dirpath)
content, err := fileToHTML("templates/wellcome.md")
check(err)
page.Content = template.HTML(content)
tmpl := template.Must(template.ParseFiles("templates/pageTemplate.html"))
tmpl.Execute(w, page)
}
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 page PageModel
page.Title = strings.Replace(path, padArchiver.Storage, "", -1)
page.Content = template.HTML(content)
page.MenuContent = generateMenuHTML("")
tmplPage := template.Must(template.ParseFiles("templates/pageTemplate.html"))
tmplPage.Execute(w, page)
}