...
1
2
3
4
5 package main
6
7 import (
8 "html/template"
9 "io/ioutil"
10 "log"
11 "net/http"
12 )
13
14 type Page struct {
15 Title string
16 Body []byte
17 }
18
19 func (p *Page) save() error {
20 filename := p.Title + ".txt"
21 return ioutil.WriteFile(filename, p.Body, 0600)
22 }
23
24 func loadPage(title string) (*Page, error) {
25 filename := title + ".txt"
26 body, err := ioutil.ReadFile(filename)
27 if err != nil {
28 return nil, err
29 }
30 return &Page{Title: title, Body: body}, nil
31 }
32
33 func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) {
34 t, _ := template.ParseFiles(tmpl + ".html")
35 t.Execute(w, p)
36 }
37
38 func viewHandler(w http.ResponseWriter, r *http.Request) {
39 title := r.URL.Path[len("/view/"):]
40 p, _ := loadPage(title)
41 renderTemplate(w, "view", p)
42 }
43
44 func editHandler(w http.ResponseWriter, r *http.Request) {
45 title := r.URL.Path[len("/edit/"):]
46 p, err := loadPage(title)
47 if err != nil {
48 p = &Page{Title: title}
49 }
50 renderTemplate(w, "edit", p)
51 }
52
53 func main() {
54 http.HandleFunc("/view/", viewHandler)
55 http.HandleFunc("/edit/", editHandler)
56
57 log.Fatal(http.ListenAndServe(":8080", nil))
58 }
59
View as plain text