| // Copyright 2023 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Template is a trivial web server that uses the text/template (and | |
| // html/template) package's "block" feature to implement a kind of template | |
| // inheritance. | |
| // | |
| // It should be executed from the directory in which the source resides, | |
| // as it will look for its template files in the current directory. | |
| package main | |
| import ( | |
| "html/template" | |
| "log" | |
| "net/http" | |
| "strings" | |
| ) | |
| func main() { | |
| http.HandleFunc("/", indexHandler) | |
| http.HandleFunc("/image/", imageHandler) | |
| log.Fatal(http.ListenAndServe("localhost:8080", nil)) | |
| } | |
| // indexTemplate is the main site template. | |
| // The default template includes two template blocks ("sidebar" and "content") | |
| // that may be replaced in templates derived from this one. | |
| var indexTemplate = template.Must(template.ParseFiles("index.tmpl")) | |
| // Index is a data structure used to populate an indexTemplate. | |
| type Index struct { | |
| Title string | |
| Body string | |
| Links []Link | |
| } | |
| type Link struct { | |
| URL, Title string | |
| } | |
| // indexHandler is an HTTP handler that serves the index page. | |
| func indexHandler(w http.ResponseWriter, r *http.Request) { | |
| data := &Index{ | |
| Title: "Image gallery", | |
| Body: "Welcome to the image gallery.", | |
| } | |
| for name, img := range images { | |
| data.Links = append(data.Links, Link{ | |
| URL: "/image/" + name, | |
| Title: img.Title, | |
| }) | |
| } | |
| if err := indexTemplate.Execute(w, data); err != nil { | |
| log.Println(err) | |
| } | |
| } | |
| // imageTemplate is a clone of indexTemplate that provides | |
| // alternate "sidebar" and "content" templates. | |
| var imageTemplate = template.Must(template.Must(indexTemplate.Clone()).ParseFiles("image.tmpl")) | |
| // Image is a data structure used to populate an imageTemplate. | |
| type Image struct { | |
| Title string | |
| URL string | |
| } | |
| // imageHandler is an HTTP handler that serves the image pages. | |
| func imageHandler(w http.ResponseWriter, r *http.Request) { | |
| data, ok := images[strings.TrimPrefix(r.URL.Path, "/image/")] | |
| if !ok { | |
| http.NotFound(w, r) | |
| return | |
| } | |
| if err := imageTemplate.Execute(w, data); err != nil { | |
| log.Println(err) | |
| } | |
| } | |
| // images specifies the site content: a collection of images. | |
| var images = map[string]*Image{ | |
| "go": {"The Go Gopher", "https://golang.org/doc/gopher/frontpage.png"}, | |
| "google": {"The Google Logo", "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}, | |
| } |