Last active
May 15, 2017 15:03
-
-
Save takatoshiono/ebec6959ceaf0e8c2678455fc2128e4b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<h1>Editing {{.Title}}</h1> | |
<form action="/save/{{.Title}}" method="POST"> | |
<div><textarea name="body" rows="20" cols="80">{{printf "%s" .Body}}</textarea></div> | |
<div><input type="submit" value="Save"></div> | |
</form> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<h1>{{.Title}}</h1> | |
<p>[<a href="/edit/{{.Title}}">edit</a>]</p> | |
<div>{{printf "%s" .Body}}</div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"errors" | |
"html/template" | |
"io/ioutil" | |
"net/http" | |
"regexp" | |
) | |
type Page struct { | |
Title string | |
Body []byte | |
} | |
var templates = template.Must(template.ParseFiles("edit.html", "view.html")) | |
var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$") | |
func (p *Page) save() error { | |
filename := p.Title + ".txt" | |
return ioutil.WriteFile(filename, p.Body, 0600) | |
} | |
func getTitle(w http.ResponseWriter, r *http.Request) (string, error) { | |
m := validPath.FindStringSubmatch(r.URL.Path) | |
if m == nil { | |
http.NotFound(w, r) | |
return "", errors.New("Invalid Page Title") | |
} | |
return m[2], nil | |
} | |
func loadPage(title string) (*Page, error) { | |
filename := title + ".txt" | |
body, err := ioutil.ReadFile(filename) | |
if err != nil { | |
return nil, err | |
} | |
return &Page{Title: title, Body: body}, nil | |
} | |
func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { | |
err := templates.ExecuteTemplate(w, tmpl+".html", p) | |
if err != nil { | |
http.Error(w, err.Error(), http.StatusInternalServerError) | |
} | |
} | |
func viewHandler(w http.ResponseWriter, r *http.Request) { | |
title, err := getTitle(w, r) | |
if err != nil { | |
return | |
} | |
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, err := getTitle(w, r) | |
if err != nil { | |
return | |
} | |
p, err := loadPage(title) | |
if err != nil { | |
p = &Page{Title: title} | |
} | |
renderTemplate(w, "edit", p) | |
} | |
func saveHandler(w http.ResponseWriter, r *http.Request) { | |
title, err := getTitle(w, r) | |
if err != nil { | |
return | |
} | |
body := r.FormValue("body") | |
p := &Page{Title: title, Body: []byte(body)} | |
err = p.save() | |
if err != nil { | |
http.Error(w, err.Error(), http.StatusInternalServerError) | |
return | |
} | |
http.Redirect(w, r, "/view/"+title, http.StatusFound) | |
} | |
func main() { | |
http.HandleFunc("/view/", viewHandler) | |
http.HandleFunc("/edit/", editHandler) | |
http.HandleFunc("/save/", saveHandler) | |
http.ListenAndServe(":8080", nil) | |
} |
Using net/http to serve wiki pagesまでやった。
The html/template packageまでやった
Validationまでやった
全部終わった
Other tasksの一つ目でディレクトリ追加したのでgistにpushできなくなった
続きはこちら https://github.com/takatoshiono/gowiki-tutorial
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Data Structuresまでやった。今の所Webの要素なし