|
|
@ -3,6 +3,7 @@ package caddyhugo |
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"encoding/base64" |
|
|
|
"encoding/base64" |
|
|
|
"fmt" |
|
|
|
"fmt" |
|
|
|
|
|
|
|
"io" |
|
|
|
"net" |
|
|
|
"net" |
|
|
|
"net/http" |
|
|
|
"net/http" |
|
|
|
"os" |
|
|
|
"os" |
|
|
@ -88,6 +89,10 @@ func (ch *CaddyHugo) ServeHTTPWithNext(next httpserver.Handler, w http.ResponseW |
|
|
|
if strings.HasPrefix(r.URL.Path, "/media/") { |
|
|
|
if strings.HasPrefix(r.URL.Path, "/media/") { |
|
|
|
return ch.serveMedia(w, r) |
|
|
|
return ch.serveMedia(w, r) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if strings.HasPrefix(r.URL.Path, "/hugo/fs/") { |
|
|
|
|
|
|
|
printTree(afero.NewOsFs(), w, ch.Dir) |
|
|
|
|
|
|
|
return 200, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return next.ServeHTTP(w, r) |
|
|
|
return next.ServeHTTP(w, r) |
|
|
|
} |
|
|
|
} |
|
|
@ -244,6 +249,70 @@ func (ch *CaddyHugo) serveDraft(w http.ResponseWriter, r *http.Request) (int, er |
|
|
|
return 200, nil |
|
|
|
return 200, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func printTree(fs afero.Fs, w io.Writer, dir string) { |
|
|
|
|
|
|
|
const ( |
|
|
|
|
|
|
|
Line = " │ " |
|
|
|
|
|
|
|
Tab = " " |
|
|
|
|
|
|
|
Elbow = " └─" |
|
|
|
|
|
|
|
Tee = " ├─" |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wd, _ := os.Getwd() |
|
|
|
|
|
|
|
fmt.Fprintln(w, wd) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dir == "" { |
|
|
|
|
|
|
|
dir = "/" |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
openDirs := map[string]bool{} |
|
|
|
|
|
|
|
lastFiles := map[string]string{} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
afero.Walk(fs, dir, filepath.WalkFunc(func(p string, info os.FileInfo, err error) error { |
|
|
|
|
|
|
|
if strings.HasPrefix(p, "./") { |
|
|
|
|
|
|
|
p = p[2:] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
openDirs[filepath.Dir(p)] = true |
|
|
|
|
|
|
|
lastFiles[filepath.Dir(p)] = filepath.Base(p) |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
})) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
afero.Walk(fs, dir, filepath.WalkFunc(func(p string, info os.FileInfo, err error) error { |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if strings.HasPrefix(p, "./") { |
|
|
|
|
|
|
|
p = p[2:] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if filepath.Base(p)[0] == '.' && info.IsDir() { |
|
|
|
|
|
|
|
return filepath.SkipDir |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
entry := Tee |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if lastFiles[filepath.Dir(p)] == filepath.Base(p) { |
|
|
|
|
|
|
|
openDirs[filepath.Dir(p)] = false |
|
|
|
|
|
|
|
entry = Elbow |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
indent := "" |
|
|
|
|
|
|
|
dirs := strings.Split(p, string(filepath.Separator)) |
|
|
|
|
|
|
|
dirs = dirs[:len(dirs)-1] |
|
|
|
|
|
|
|
for i := range dirs { |
|
|
|
|
|
|
|
if openDirs[filepath.Join(dirs[:i]...)] { |
|
|
|
|
|
|
|
indent += Line |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
indent += Tab |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fmt.Fprintf(w, "%s%s %s (%s)\n", indent, entry, filepath.Base(p), p) |
|
|
|
|
|
|
|
return nil |
|
|
|
|
|
|
|
})) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type aferoHTTP struct { |
|
|
|
type aferoHTTP struct { |
|
|
|
afero.Fs |
|
|
|
afero.Fs |
|
|
|
} |
|
|
|
} |
|
|
|