Last active
May 15, 2017 15:03
-
-
Save takatoshiono/ebec6959ceaf0e8c2678455fc2128e4b to your computer and use it in GitHub Desktop.
This file contains hidden or 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 hidden or 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 hidden or 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) | |
| } |
Author
Author
Using net/http to serve wiki pagesまでやった。
Author
The html/template packageまでやった
Author
Validationまでやった
Author
全部終わった
Author
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の要素なし