package caddyhugo import ( "bytes" "fmt" "io" "net/http" "net/url" "path" "github.com/PuerkitoBio/goquery" "github.com/gohugoio/hugo/resources/page" "git.stephensearles.com/stephen/caddy-hugo2/media" ) func (ch *CaddyHugo) ReferencedMedia() map[string]map[page.Page]struct{} { found := map[string]map[page.Page]struct{}{} for _, pg := range ch.HugoSites.Pages() { renderOutput, err := pg.Render() if err != nil { continue } r := bytes.NewBufferString(string(renderOutput)) doc, err := goquery.NewDocumentFromReader(r) if err != nil { continue } doc.Find("img,video").Map(func(i int, s *goquery.Selection) string { u, ok := s.Attr("src") if ok { u = path.Base(u) if ud, err := url.QueryUnescape(u); err == nil { u = ud } if m := found[u]; m == nil { found[u] = make(map[page.Page]struct{}) } found[u][pg] = struct{}{} } return "" }) } return found } func (ch *CaddyHugo) uploadMedia(w http.ResponseWriter, r *http.Request) error { if ch.Media == nil { http.NotFound(w, r) return nil } mr, err := r.MultipartReader() if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return nil } for { part, err := mr.NextPart() if err == io.EOF { break } if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return err } name := part.FileName() if name != "" { err = ch.Media.ReceiveNewMedia(name, part) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return nil } } } return nil } func (ch *CaddyHugo) serveMediaPage(w http.ResponseWriter, r *http.Request) error { if ch.Media == nil { http.NotFound(w, r) return nil } referenced := ch.ReferencedMedia() io.WriteString(w, `