mirror of https://github.com/perkeep/perkeep.git
website: allow serving godoc for any valid package
Fixes #1010 Change-Id: I15575227eb881a0c83ab2e60af0d344fedaf1850
This commit is contained in:
parent
101ce48bdc
commit
9787462d49
|
@ -316,6 +316,13 @@ func mainHandler(rw http.ResponseWriter, req *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try to serve godoc if requested path exists
|
||||||
|
if req.URL.Path != "/" {
|
||||||
|
if err := serveGodoc(rw, req); err == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
findAndServeFile(rw, req, filepath.Join(*root, "content"))
|
findAndServeFile(rw, req, filepath.Join(*root, "content"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -871,9 +878,6 @@ func main() {
|
||||||
mux.Handle("/robots.txt", http.FileServer(http.Dir(filepath.Join(*root, "static"))))
|
mux.Handle("/robots.txt", http.FileServer(http.Dir(filepath.Join(*root, "static"))))
|
||||||
mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(filepath.Join(*root, "static")))))
|
mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(filepath.Join(*root, "static")))))
|
||||||
mux.Handle("/talks/", http.StripPrefix("/talks/", http.FileServer(http.Dir(filepath.Join(*root, "talks")))))
|
mux.Handle("/talks/", http.StripPrefix("/talks/", http.FileServer(http.Dir(filepath.Join(*root, "talks")))))
|
||||||
mux.Handle(pkgPattern, godocHandler{})
|
|
||||||
mux.Handle(cmdPattern, godocHandler{})
|
|
||||||
mux.Handle(appPattern, godocHandler{})
|
|
||||||
mux.HandleFunc(errPattern, errHandler)
|
mux.HandleFunc(errPattern, errHandler)
|
||||||
|
|
||||||
// Google Webmaster Tools ownership proof:
|
// Google Webmaster Tools ownership proof:
|
||||||
|
|
|
@ -42,9 +42,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
pkgPattern = "/pkg/"
|
|
||||||
cmdPattern = "/cmd/"
|
cmdPattern = "/cmd/"
|
||||||
appPattern = "/app/"
|
|
||||||
fileembedPattern = "fileembed.go"
|
fileembedPattern = "fileembed.go"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -244,13 +242,6 @@ func (pi *PageInfo) populateDirs(diskPath string, depth int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPageInfo(pkgName, diskPath string) (pi PageInfo, err error) {
|
func getPageInfo(pkgName, diskPath string) (pi PageInfo, err error) {
|
||||||
if pkgName == pathpkg.Join(domainName, pkgPattern) ||
|
|
||||||
pkgName == pathpkg.Join(domainName, cmdPattern) ||
|
|
||||||
pkgName == pathpkg.Join(domainName, appPattern) {
|
|
||||||
pi.Dirname = diskPath
|
|
||||||
pi.populateDirs(diskPath, -1)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
bpkg, err := build.ImportDir(diskPath, 0)
|
bpkg, err := build.ImportDir(diskPath, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if _, ok := err.(*build.NoGoError); ok {
|
if _, ok := err.(*build.NoGoError); ok {
|
||||||
|
@ -289,7 +280,7 @@ func getPageInfo(pkgName, diskPath string) (pi PageInfo, err error) {
|
||||||
|
|
||||||
pi.Dirname = diskPath
|
pi.Dirname = diskPath
|
||||||
pi.PDoc = doc.New(aPkg, pkgName, 0)
|
pi.PDoc = doc.New(aPkg, pkgName, 0)
|
||||||
pi.IsPkg = strings.Contains(pkgName, domainName+pkgPattern)
|
pi.IsPkg = pi.PDoc.Name != "main"
|
||||||
|
|
||||||
// get directory information
|
// get directory information
|
||||||
pi.populateDirs(diskPath, -1)
|
pi.populateDirs(diskPath, -1)
|
||||||
|
@ -407,33 +398,30 @@ func serveTextFile(w http.ResponseWriter, r *http.Request, abspath, relpath, tit
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type godocHandler struct{}
|
func serveGodoc(w http.ResponseWriter, r *http.Request) error {
|
||||||
|
suffix := r.URL.Path
|
||||||
func (godocHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
||||||
m := docRx.FindStringSubmatch(r.URL.Path)
|
|
||||||
suffix := ""
|
|
||||||
if m == nil {
|
|
||||||
if r.URL.Path != pkgPattern && r.URL.Path != cmdPattern && r.URL.Path != appPattern {
|
|
||||||
http.NotFound(w, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
suffix = r.URL.Path
|
|
||||||
} else {
|
|
||||||
suffix = m[1]
|
|
||||||
}
|
|
||||||
diskPath := filepath.Join(*root, "..", suffix)
|
diskPath := filepath.Join(*root, "..", suffix)
|
||||||
|
|
||||||
switch pathpkg.Ext(suffix) {
|
fi, err := os.Stat(diskPath)
|
||||||
case ".go":
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case isGoFile(fi):
|
||||||
serveTextFile(w, r, diskPath, suffix, "Source file")
|
serveTextFile(w, r, diskPath, suffix, "Source file")
|
||||||
return
|
return nil
|
||||||
|
case isPkgDir(fi):
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
return os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
pkgName := pathpkg.Join(domainName, suffix)
|
pkgName := pathpkg.Join(domainName, suffix)
|
||||||
pi, err := getPageInfo(pkgName, diskPath)
|
pi, err := getPageInfo(pkgName, diskPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
subtitle := pathpkg.Base(diskPath)
|
subtitle := pathpkg.Base(diskPath)
|
||||||
|
@ -443,4 +431,5 @@ func (godocHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
subtitle: subtitle,
|
subtitle: subtitle,
|
||||||
content: applyTextTemplate(packageHTML, "packageHTML", pi),
|
content: applyTextTemplate(packageHTML, "packageHTML", pi),
|
||||||
})
|
})
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue