package main import ( "fmt" "html/template" "io/ioutil" "log" "net/http" "os" "strings" ) type Page struct { Title string Body []byte } func loadPage(title string) (*Page, error) { body, err := os.ReadFile(title + ".txt") if err != nil { return nil, err } return &Page{Title: title, Body: body}, nil } func (p *Page) savePage() error { filename := p.Title + ".txt" return os.WriteFile(filename, p.Body, 0600) } func viewHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/view/"):] page, err := loadPage(title) if err != nil { fmt.Fprintf(w, "
%s not found!
", title) } else { fmt.Fprintf(w, "%s
", page.Title, string(page.Body)) } } func saveHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/save/"):] p := &Page{Title: title, Body: []byte(r.FormValue("body"))} p.savePage() http.Redirect(w, r, "/view/"+title, http.StatusFound) } func editHandler(w http.ResponseWriter, r *http.Request) { title := r.URL.Path[len("/edit/"):] page, err := loadPage(title) if err != nil { page = &Page{Title: title} } t, _ := template.ParseFiles("edit.html") t.Execute(w, page) } func indexHandler(w http.ResponseWriter, r *http.Request) { title := "index" //template, err := template.New("index").ParseFiles("templates/index.html") template, err := template.New("index").Parse("%s not found!
", title) } else { files, err := ioutil.ReadDir(".") if err != nil { log.Fatal(err) } else { var pages []Page for _, file := range files { if strings.Contains(file.Name(), ".txt") { page, _ := loadPage(strings.Split(file.Name(), ".")[0]) pages = append(pages, *page) } } err = template.Execute(w, pages) if err != nil { log.Fatal(err) } } } } func main() { http.HandleFunc("/view/", viewHandler) http.HandleFunc("/save/", saveHandler) http.HandleFunc("/edit/", editHandler) http.HandleFunc("/", indexHandler) log.Fatal(http.ListenAndServe(":8080", nil)) }