func MemFromDir(dir string) VFS { fs, err := vfs.FS(dir) if err != nil { panic(err) } mem := vfs.Memory() if err := vfs.Clone(mem, fs); err != nil { panic(err) } return mem }
func ArticleHandler(ctx *app.Context) { slug := ctx.IndexValue(0) var art *article.Article articles := getArticles(ctx) for _, v := range articles { if v.Slug() == slug { art = v break } } if art == nil { for _, v := range articles { for _, s := range v.AllSlugs() { if s == slug { ctx.MustRedirectReverse(true, ctx.HandlerName(), s) return } } } ctx.NotFound("article not found") return } fs := vfs.Memory() filename := path.Base(art.Filename) if filename == "" { filename = "article.html" } if err := vfs.WriteFile(fs, filename, art.Text, 0644); err != nil { panic(err) } log.Debugf("loading article %s", articleId(art)) tmpl, err := app.LoadTemplate(ctx.App(), fs, nil, filename) if err != nil { panic(err) } var buf bytes.Buffer if err := tmpl.ExecuteTo(&buf, ctx, nil); err != nil { panic(err) } body := buf.String() data := map[string]interface{}{ "Article": art, "Title": art.Title(), "Body": template.HTML(body), } ctx.MustExecute("article.html", data) }
// Bake writes the data for a VFS generated from dir to the given // io.Writer. The extensions argument can be used to limit the // files included in the VFS by their extension. If empty, all // files are included. func Bake(w io.Writer, dir string, extensions []string) error { fs, err := vfs.FS(dir) if err != nil { return err } if len(extensions) > 0 { // Clone the fs and remove files not matching the extension exts := make(map[string]bool) for _, v := range extensions { if v == "" { continue } if v[0] != '.' { v = "." + v } exts[strings.ToLower(v)] = true } mem := vfs.Memory() if err := vfs.Clone(mem, fs); err != nil { return err } err := vfs.Walk(mem, "/", func(fs vfs.VFS, p string, info os.FileInfo, err error) error { if err != nil || info.IsDir() { return err } if !exts[strings.ToLower(path.Ext(p))] { if err := fs.Remove(p); err != nil { return err } } return nil }) if err != nil { return err } fs = mem } vfs.Walk(fs, "/", func(_ vfs.VFS, p string, info os.FileInfo, err error) error { if !info.IsDir() { log.Debugf("baking %s", p) } return nil }) return vfs.WriteTarGzip(w, fs) }
// NewMemoryCache returns an ephemeral cache in memory func NewMemoryCache() Cache { return NewVFSCache(vfs.Memory()) }