mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 10:40:57 +00:00 
			
		
		
		
	It's already in old/template; make that build. Update a couple of references to point to the old template. They can be updated later. Update goplay to use exp/template. R=golang-dev, dsymonds CC=golang-dev https://golang.org/cl/4902046
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"http"
 | 
						|
	"io/ioutil"
 | 
						|
	"old/template"
 | 
						|
	"os"
 | 
						|
	"regexp"
 | 
						|
)
 | 
						|
 | 
						|
type Page struct {
 | 
						|
	Title string
 | 
						|
	Body  []byte
 | 
						|
}
 | 
						|
 | 
						|
func (p *Page) save() os.Error {
 | 
						|
	filename := p.Title + ".txt"
 | 
						|
	return ioutil.WriteFile(filename, p.Body, 0600)
 | 
						|
}
 | 
						|
 | 
						|
func loadPage(title string) (*Page, os.Error) {
 | 
						|
	filename := title + ".txt"
 | 
						|
	body, err := ioutil.ReadFile(filename)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	return &Page{Title: title, Body: body}, nil
 | 
						|
}
 | 
						|
 | 
						|
func viewHandler(w http.ResponseWriter, r *http.Request, title string) {
 | 
						|
	p, err := loadPage(title)
 | 
						|
	if err != nil {
 | 
						|
		http.Redirect(w, r, "/edit/"+title, http.StatusFound)
 | 
						|
		return
 | 
						|
	}
 | 
						|
	renderTemplate(w, "view", p)
 | 
						|
}
 | 
						|
 | 
						|
func editHandler(w http.ResponseWriter, r *http.Request, title string) {
 | 
						|
	p, err := loadPage(title)
 | 
						|
	if err != nil {
 | 
						|
		p = &Page{Title: title}
 | 
						|
	}
 | 
						|
	renderTemplate(w, "edit", p)
 | 
						|
}
 | 
						|
 | 
						|
func saveHandler(w http.ResponseWriter, r *http.Request, title string) {
 | 
						|
	body := r.FormValue("body")
 | 
						|
	p := &Page{Title: title, Body: []byte(body)}
 | 
						|
	err := p.save()
 | 
						|
	if err != nil {
 | 
						|
		http.Error(w, err.String(), http.StatusInternalServerError)
 | 
						|
		return
 | 
						|
	}
 | 
						|
	http.Redirect(w, r, "/view/"+title, http.StatusFound)
 | 
						|
}
 | 
						|
 | 
						|
var templates = make(map[string]*template.Template)
 | 
						|
 | 
						|
func init() {
 | 
						|
	for _, tmpl := range []string{"edit", "view"} {
 | 
						|
		templates[tmpl] = template.MustParseFile(tmpl+".html", nil)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) {
 | 
						|
	err := templates[tmpl].Execute(w, p)
 | 
						|
	if err != nil {
 | 
						|
		http.Error(w, err.String(), http.StatusInternalServerError)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
const lenPath = len("/view/")
 | 
						|
 | 
						|
var titleValidator = regexp.MustCompile("^[a-zA-Z0-9]+$")
 | 
						|
 | 
						|
func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
 | 
						|
	return func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		title := r.URL.Path[lenPath:]
 | 
						|
		if !titleValidator.MatchString(title) {
 | 
						|
			http.NotFound(w, r)
 | 
						|
			return
 | 
						|
		}
 | 
						|
		fn(w, r, title)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func main() {
 | 
						|
	http.HandleFunc("/view/", makeHandler(viewHandler))
 | 
						|
	http.HandleFunc("/edit/", makeHandler(editHandler))
 | 
						|
	http.HandleFunc("/save/", makeHandler(saveHandler))
 | 
						|
	http.ListenAndServe(":8080", nil)
 | 
						|
}
 |