func setupPages(app *App) { app.Page.Navi("/", "記事一覧"). AssetPath("/blogapp/index.js"). Templates("./blogapp/list.html", "./blogapp/post_part.html"). Handler( func(res *wcg.Response, req *wcg.Request, p *lib.Page) { result, err := queryPosts(res, req, 20) if err != nil { panic(err) } p.Ogp("type", "blog") res.SetLocal("Posts", result.Posts) res.SetLocal("Next", result.Next) res.SetLocal("Previous", result.Previous) }, ) app.Page.Navi("/admin/editor.html", "記事管理"). RequireAuth(lib.Admin). Templates("./blogapp/admin/editor.html"). AssetPath("/blogapp/admin/editor.js") app.Page.Page("/posts/:id.html", ""). Templates("./blogapp/show.html", "./blogapp/post_part.html"). AssetPath("/blogapp/posts/show.js"). Handler( func(res *wcg.Response, req *wcg.Request, p *lib.Page) { var post blog.Post driver := NewPostDriver(lib.NewAppContextFromRequest(req)) key := driver.NewKey(req.Param("id"), 0, nil) err := driver.Get(key, &post) if err != nil { lib.Error(res, req, err) return } p.Title = post.Title p.Canonical = wcg.AbsoluteUrl(req, app.Page.Path(fmt.Sprintf("/posts/%s.html", post.Id))) p.Ogp("title", fmt.Sprintf("%s: %s", p.App.Title, p.Title)) p.Ogp("url", p.Canonical) p.Ogp("type", "article") p.Ogp("description", post.Summary()) imageUrl := post.ExtractFirstImageUrl() if imageUrl != "" { p.Ogp("image", imageUrl) } res.SetLocal("Post", post) }) }