diff options
-rw-r--r-- | config/setup/markdown.go | 4 | ||||
-rw-r--r-- | middleware/markdown/generator.go | 8 | ||||
-rw-r--r-- | middleware/markdown/markdown.go | 24 | ||||
-rw-r--r-- | middleware/markdown/page.go | 82 | ||||
-rw-r--r-- | middleware/markdown/process.go | 2 |
5 files changed, 61 insertions, 59 deletions
diff --git a/config/setup/markdown.go b/config/setup/markdown.go index f16558ec4..dc433f65b 100644 --- a/config/setup/markdown.go +++ b/config/setup/markdown.go @@ -25,12 +25,12 @@ func Markdown(c *Controller) (middleware.Middleware, error) { IndexFiles: []string{"index.md"}, } - // For any configs that enabled static site gen, sweep the whole path at startup + // Sweep the whole path at startup to at least generate link index, maybe generate static site c.Startup = append(c.Startup, func() error { for i := range mdconfigs { cfg := &mdconfigs[i] - // Generate static files. + // Generate link index and static files (if enabled) if err := markdown.GenerateStatic(md, cfg); err != nil { return err } diff --git a/middleware/markdown/generator.go b/middleware/markdown/generator.go index 685a210e1..53e0815d6 100644 --- a/middleware/markdown/generator.go +++ b/middleware/markdown/generator.go @@ -1,7 +1,7 @@ package markdown import ( - "crypto/sha1" + "crypto/md5" "encoding/hex" "fmt" "io/ioutil" @@ -13,7 +13,9 @@ import ( "github.com/mholt/caddy/middleware" ) -// GenerateStatic generate static files from markdowns. +// GenerateStatic generate static files and link index from markdowns. +// It only generates static files if it is enabled (cfg.StaticDir +// must be set). func GenerateStatic(md Markdown, cfg *Config) error { generated, err := generateLinks(md, cfg) if err != nil { @@ -130,6 +132,6 @@ func computeDirHash(md Markdown, c Config) (string, error) { return "", err } - sum := sha1.Sum([]byte(hashString)) + sum := md5.Sum([]byte(hashString)) return hex.EncodeToString(sum[:]), nil } diff --git a/middleware/markdown/markdown.go b/middleware/markdown/markdown.go index 80ca45b12..486a17287 100644 --- a/middleware/markdown/markdown.go +++ b/middleware/markdown/markdown.go @@ -94,9 +94,8 @@ func (c Config) IsValidExt(ext string) bool { // ServeHTTP implements the http.Handler interface. func (md Markdown) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { - for i := range md.Configs { - m := &md.Configs[i] - if !middleware.Path(r.URL.Path).Matches(m.PathScope) { + for _, cfg := range md.Configs { + if !middleware.Path(r.URL.Path).Matches(cfg.PathScope) { continue } @@ -105,7 +104,7 @@ func (md Markdown) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error fpath = idx } - for _, ext := range m.Extensions { + for _, ext := range cfg.Extensions { if strings.HasSuffix(fpath, ext) { f, err := md.FileSys.Open(fpath) if err != nil { @@ -121,19 +120,18 @@ func (md Markdown) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error } // if development is set, scan directory for file changes for links. - if m.Development { - if err := GenerateStatic(md, m); err != nil { - log.Println(err) + if cfg.Development { + if err := GenerateStatic(md, &cfg); err != nil { + log.Println("On-demand generation error (markdown):", err) } } // if static site is generated, attempt to use it - if filepath, ok := m.StaticFiles[fpath]; ok { + if filepath, ok := cfg.StaticFiles[fpath]; ok { if fs1, err := os.Stat(filepath); err == nil { - // if markdown has not been modified - // since static page generation, - // serve the static page - if fs.ModTime().UnixNano() < fs1.ModTime().UnixNano() { + // if markdown has not been modified since static page + // generation, serve the static page + if fs.ModTime().Before(fs1.ModTime()) { if html, err := ioutil.ReadFile(filepath); err == nil { w.Write(html) return http.StatusOK, nil @@ -156,7 +154,7 @@ func (md Markdown) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error Req: r, URL: r.URL, } - html, err := md.Process(*m, fpath, body, ctx) + html, err := md.Process(cfg, fpath, body, ctx) if err != nil { return http.StatusInternalServerError, err } diff --git a/middleware/markdown/page.go b/middleware/markdown/page.go index 21503d0fc..279d5ef8e 100644 --- a/middleware/markdown/page.go +++ b/middleware/markdown/page.go @@ -92,7 +92,7 @@ func (l *linkGen) generateLinks(md Markdown, cfg *Config) bool { l.Unlock() return false } else if err != nil { - log.Println("Error:", err) + log.Println("Hash error (markdown):", err) } cfg.Links = []PageLink{} @@ -100,53 +100,55 @@ func (l *linkGen) generateLinks(md Markdown, cfg *Config) bool { cfg.Lock() l.lastErr = filepath.Walk(fp, func(path string, info os.FileInfo, err error) error { for _, ext := range cfg.Extensions { - if !info.IsDir() && strings.HasSuffix(info.Name(), ext) { - // Load the file - body, err := ioutil.ReadFile(path) - if err != nil { - return err - } + if info.IsDir() || !strings.HasSuffix(info.Name(), ext) { + continue + } - // Get the relative path as if it were a HTTP request, - // then prepend with "/" (like a real HTTP request) - reqPath, err := filepath.Rel(md.Root, path) - if err != nil { - return err - } - reqPath = "/" + reqPath + // Load the file + body, err := ioutil.ReadFile(path) + if err != nil { + return err + } - parser := findParser(body) - if parser == nil { - // no metadata, ignore. - continue - } - summary, err := parser.Parse(body) - if err != nil { - return err - } + // Get the relative path as if it were a HTTP request, + // then prepend with "/" (like a real HTTP request) + reqPath, err := filepath.Rel(md.Root, path) + if err != nil { + return err + } + reqPath = "/" + reqPath + + parser := findParser(body) + if parser == nil { + // no metadata, ignore. + continue + } + summary, err := parser.Parse(body) + if err != nil { + return err + } - // truncate summary to maximum length - if len(summary) > summaryLen { - summary = summary[:summaryLen] + // truncate summary to maximum length + if len(summary) > summaryLen { + summary = summary[:summaryLen] - // trim to nearest word - lastSpace := bytes.LastIndex(summary, []byte(" ")) - if lastSpace != -1 { - summary = summary[:lastSpace] - } + // trim to nearest word + lastSpace := bytes.LastIndex(summary, []byte(" ")) + if lastSpace != -1 { + summary = summary[:lastSpace] } + } - metadata := parser.Metadata() + metadata := parser.Metadata() - cfg.Links = append(cfg.Links, PageLink{ - Title: metadata.Title, - URL: reqPath, - Date: metadata.Date, - Summary: string(blackfriday.Markdown(summary, SummaryRenderer{}, 0)), - }) + cfg.Links = append(cfg.Links, PageLink{ + Title: metadata.Title, + URL: reqPath, + Date: metadata.Date, + Summary: string(blackfriday.Markdown(summary, SummaryRenderer{}, 0)), + }) - break // don't try other file extensions - } + break // don't try other file extensions } return nil diff --git a/middleware/markdown/process.go b/middleware/markdown/process.go index 8afd92b7b..7d884449d 100644 --- a/middleware/markdown/process.go +++ b/middleware/markdown/process.go @@ -114,7 +114,7 @@ func (md Markdown) processTemplate(c Config, requestPath string, tmpl []byte, me // if static page generation fails, // nothing fatal, only log the error. // TODO: Report this non-fatal error, but don't log it here - log.Println(err) + log.Println("Rendering error (markdown):", err) } return b.Bytes(), nil |