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