1 | // Copyright 2010 The Go Authors. All rights reserved. |
---|---|
2 | // Use of this source code is governed by a BSD-style |
3 | // license that can be found in the LICENSE file. |
4 | |
5 | package main |
6 | |
7 | import ( |
8 | "encoding/json" |
9 | "go/format" |
10 | "log" |
11 | "net/http" |
12 | "text/template" |
13 | |
14 | "golang.org/x/tools/godoc" |
15 | "golang.org/x/tools/godoc/redirect" |
16 | "golang.org/x/tools/godoc/vfs" |
17 | |
18 | _ "golang.org/x/tools/playground" // register "/compile" playground redirect |
19 | ) |
20 | |
21 | var ( |
22 | pres *godoc.Presentation |
23 | fs = vfs.NameSpace{} |
24 | ) |
25 | |
26 | func registerHandlers(pres *godoc.Presentation) { |
27 | if pres == nil { |
28 | panic("nil Presentation") |
29 | } |
30 | mux := http.NewServeMux() |
31 | mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { |
32 | if req.URL.Path == "/" { |
33 | http.Redirect(w, req, "/pkg/", http.StatusFound) |
34 | return |
35 | } |
36 | pres.ServeHTTP(w, req) |
37 | }) |
38 | mux.Handle("/pkg/C/", redirect.Handler("/cmd/cgo/")) |
39 | mux.HandleFunc("/fmt", fmtHandler) |
40 | redirect.Register(mux) |
41 | |
42 | http.Handle("/", mux) |
43 | } |
44 | |
45 | func readTemplate(name string) *template.Template { |
46 | if pres == nil { |
47 | panic("no global Presentation set yet") |
48 | } |
49 | path := "lib/godoc/" + name |
50 | |
51 | // use underlying file system fs to read the template file |
52 | // (cannot use template ParseFile functions directly) |
53 | data, err := vfs.ReadFile(fs, path) |
54 | if err != nil { |
55 | log.Fatal("readTemplate: ", err) |
56 | } |
57 | // be explicit with errors (for app engine use) |
58 | t, err := template.New(name).Funcs(pres.FuncMap()).Parse(string(data)) |
59 | if err != nil { |
60 | log.Fatal("readTemplate: ", err) |
61 | } |
62 | return t |
63 | } |
64 | |
65 | func readTemplates(p *godoc.Presentation) { |
66 | p.CallGraphHTML = readTemplate("callgraph.html") |
67 | p.DirlistHTML = readTemplate("dirlist.html") |
68 | p.ErrorHTML = readTemplate("error.html") |
69 | p.ExampleHTML = readTemplate("example.html") |
70 | p.GodocHTML = readTemplate("godoc.html") |
71 | p.ImplementsHTML = readTemplate("implements.html") |
72 | p.MethodSetHTML = readTemplate("methodset.html") |
73 | p.PackageHTML = readTemplate("package.html") |
74 | p.PackageRootHTML = readTemplate("packageroot.html") |
75 | p.SearchHTML = readTemplate("search.html") |
76 | p.SearchDocHTML = readTemplate("searchdoc.html") |
77 | p.SearchCodeHTML = readTemplate("searchcode.html") |
78 | p.SearchTxtHTML = readTemplate("searchtxt.html") |
79 | } |
80 | |
81 | type fmtResponse struct { |
82 | Body string |
83 | Error string |
84 | } |
85 | |
86 | // fmtHandler takes a Go program in its "body" form value, formats it with |
87 | // standard gofmt formatting, and writes a fmtResponse as a JSON object. |
88 | func fmtHandler(w http.ResponseWriter, r *http.Request) { |
89 | resp := new(fmtResponse) |
90 | body, err := format.Source([]byte(r.FormValue("body"))) |
91 | if err != nil { |
92 | resp.Error = err.Error() |
93 | } else { |
94 | resp.Body = string(body) |
95 | } |
96 | w.Header().Set("Content-type", "application/json; charset=utf-8") |
97 | json.NewEncoder(w).Encode(resp) |
98 | } |
99 |
Members